diff --git a/.eslintrc.js b/.eslintrc.js index 0c3c994d6f07..954b6299b3c4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,8 @@ module.exports = { extends: ['@deriv/eslint-config-deriv'], + rules: { + 'global-require': 'off', + }, overrides: [ { files: ['*.ts', '*.tsx'], diff --git a/.lintstagedrc.json b/.lintstagedrc.json index 22127938375e..28e394e87000 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,5 +1,5 @@ { "*.{js,jsx,ts,tsx,md,html,css,scss}": "prettier --write", - "*.{js,jsx,ts,tsx}": "eslint --fix --config .eslintrc.js", + "*.{js,jsx,ts,tsx}": "eslint --fix --config .eslintrc.js --rule 'simple-import-sort/imports: 0'", "*.{css,scss}": "npx stylelint --fix" } diff --git a/__mocks__/globals.js b/__mocks__/globals.js index 3085bcf192cf..c87fa63be2b6 100644 --- a/__mocks__/globals.js +++ b/__mocks__/globals.js @@ -2,3 +2,9 @@ jest.mock('copy-anything', () => ({ copy: jest.fn(), })); + +const mock_onfido = { + init: jest.fn().mockResolvedValue({}), +}; + +window.Onfido = mock_onfido; diff --git a/package-lock.json b/package-lock.json index fd94a06889b6..62851c73e1af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@datadog/browser-logs": "^4.36.0", "@datadog/browser-rum": "^4.37.0", "@deriv/api-types": "^1.0.118", - "@deriv/deriv-api": "^1.0.11", - "@deriv/deriv-charts": "1.3.6", + "@deriv/deriv-api": "^1.0.13", + "@deriv/deriv-charts": "1.4.0", "@deriv/js-interpreter": "^3.0.0", "@deriv/ui": "^0.6.0", "@livechat/customer-sdk": "^2.0.4", @@ -39,7 +39,9 @@ "@types/jsdom": "^20.0.0", "@types/loadjs": "^4.0.1", "@types/lodash.debounce": "^4.0.7", + "@types/lodash.groupby": "^4.6.7", "@types/lodash.merge": "^4.6.7", + "@types/lodash.pickby": "^4.6.7", "@types/lodash.throttle": "^4.1.7", "@types/object.fromentries": "^2.0.0", "@types/qrcode.react": "^1.0.2", @@ -79,6 +81,7 @@ "eslint-formatter-pretty": "^4.0.0", "eslint-import-resolver-webpack": "^0.13.0", "eslint-plugin-import": "^2.23.4", + "eslint-plugin-local-rules": "2.0.0", "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-react": "^7.22.0", "eslint-plugin-react-hooks": "^4.2.0", @@ -109,7 +112,9 @@ "loadjs": "^4.2.0", "localforage": "^1.9.0", "lodash.debounce": "^4.0.8", + "lodash.groupby": "^4.6.0", "lodash.merge": "^4.6.2", + "lodash.pickby": "^4.6.0", "lodash.throttle": "^4.1.1", "lz-string": "^1.4.4", "mini-css-extract-plugin": "^1.3.4", @@ -122,7 +127,6 @@ "moment": "^2.29.2", "null-loader": "^4.0.1", "object.fromentries": "^2.0.0", - "onfido-sdk-ui": "^11.0.0", "pako": "^1.0.11", "postcss-loader": "^6.2.1", "postcss-preset-env": "^7.4.3", @@ -2898,9 +2902,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@deriv/deriv-charts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@deriv/deriv-charts/-/deriv-charts-1.3.6.tgz", - "integrity": "sha512-hxEgCIPPx87OO2NVn8cxbmUc4kVUPhjTzM8MGyviJkCWpl+mdBKizGKq+LQr9oNQwKfxw2dszFDBaVsoAFTXYQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@deriv/deriv-charts/-/deriv-charts-1.4.0.tgz", + "integrity": "sha512-JWhDkE/c+CouMQ6FNsiKwg9EWFq3jgUu7dxK2Z4wNeDSDrcNe37VK13UagL40dmqJe/W3LJ2wUolFGYqAe3DIw==", "dependencies": { "@welldone-software/why-did-you-render": "^3.3.8", "classnames": "^2.3.1", @@ -2910,9 +2914,9 @@ "mobx-react-lite": "^3.4.0", "moment": "^2.24.0", "prop-types": "^15.7.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-tabs": "^3.0.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-tabs": "^4.3.0", "react-transition-group": "^4.4.1", "robust-websocket": "^1.0.0", "sinon-chai": "^3.7.0", @@ -2923,33 +2927,6 @@ "npm": ">=9.0.0" } }, - "node_modules/@deriv/deriv-charts/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@deriv/deriv-charts/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, "node_modules/@deriv/eslint-config-deriv": { "version": "1.0.0-beta.3", "resolved": "https://registry.npmjs.org/@deriv/eslint-config-deriv/-/eslint-config-deriv-1.0.0-beta.3.tgz", @@ -6311,16 +6288,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@mediapipe/face_detection": { - "version": "0.4.1646425229", - "resolved": "https://registry.npmjs.org/@mediapipe/face_detection/-/face_detection-0.4.1646425229.tgz", - "integrity": "sha512-aeCN+fRAojv9ch3NXorP6r5tcGVLR3/gC1HmtqB0WEZBRXrdP6/3W/sGR0dHr1iT6ueiK95G9PVjbzFosf/hrg==" - }, - "node_modules/@mediapipe/face_mesh": { - "version": "0.4.1633559619", - "resolved": "https://registry.npmjs.org/@mediapipe/face_mesh/-/face_mesh-0.4.1633559619.tgz", - "integrity": "sha512-Vc8cdjxS5+O2gnjWH9KncYpUCVXT0h714KlWAsyqJvJbIgUJBqpppbIx8yWcAzBDxm/5cYSuBI5p5ySIPxzcEg==" - }, "node_modules/@motionone/animation": { "version": "10.16.3", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz", @@ -7112,157 +7079,6 @@ "@octokit/openapi-types": "^14.0.0" } }, - "node_modules/@onfido/active-video-capture": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@onfido/active-video-capture/-/active-video-capture-0.22.2.tgz", - "integrity": "sha512-wM7PJUdB0rwCpIdKoOczynqALW9zXXr/x43RGDpaGBFMdY5imbXpQtI/JaaZjQsWK6cH8FKAkKLvrxRNYCsMmQ==", - "hasInstallScript": true, - "dependencies": { - "@mediapipe/face_detection": "^0.4.1646425229", - "@mediapipe/face_mesh": "^0.4.1633559619", - "@onfido/castor": "^2.2.2", - "@onfido/castor-icons": "^2.12.0", - "@tensorflow-models/face-detection": "^1.0.1", - "@tensorflow-models/face-landmarks-detection": "^1.0.2", - "@tensorflow/tfjs-backend-wasm": "^3.20.0", - "@tensorflow/tfjs-backend-webgl": "^3.20.0", - "@tensorflow/tfjs-converter": "^3.20.0", - "@tensorflow/tfjs-core": "^3.20.0", - "@typescript/lib-dom": "npm:@types/web", - "patch-package": "^6.4.7", - "postinstall-postinstall": "^2.1.0", - "preact": "^10.10.6", - "react-webcam": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow-models/face-landmarks-detection": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tensorflow-models/face-landmarks-detection/-/face-landmarks-detection-1.0.5.tgz", - "integrity": "sha512-54XJPi8g29/MknJ33ZBrLsEzr9kw/dJtrJMMD3xrCrnRlfFQPIKQ5PI2Wml55Fz2p4U2hemzBB0/H+S94JddIQ==", - "dependencies": { - "rimraf": "^3.0.2" - }, - "peerDependencies": { - "@mediapipe/face_mesh": "~0.4.0", - "@tensorflow-models/face-detection": "~1.0.0", - "@tensorflow/tfjs-backend-webgl": "^3.12.0", - "@tensorflow/tfjs-converter": "^3.12.0", - "@tensorflow/tfjs-core": "^3.12.0" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.21.0.tgz", - "integrity": "sha512-88S21UAdzyK0CsLUrH17GPTD+26E85OP9CqmLZslaWjWUmBkeTQ5Zqyp6iK+gELnLxPx6q7JsNEeFuPv4254lQ==", - "dependencies": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "3.21.0" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow/tfjs-backend-wasm": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-wasm/-/tfjs-backend-wasm-3.21.0.tgz", - "integrity": "sha512-TVkJWrqukdxvIaQn9jZvtXR+7fmT7sti6NQH5OKVcBmFYIW7I3RiRRE66inVrHjEEvIVTUuW9yo9Ialn31EFIw==", - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "3.21.0", - "@types/emscripten": "~0.0.34" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "3.21.0" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow/tfjs-backend-webgl": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-3.21.0.tgz", - "integrity": "sha512-N4zitIAT9IX8B8oe489qM3f3VcESxGZIZvHmVP8varOQakTvTX859aaPo1s8hK1qCy4BjSGbweooZe4U8D4kTQ==", - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "3.21.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "@types/webgl-ext": "0.0.30", - "@types/webgl2": "0.0.6", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "3.21.0" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow/tfjs-converter": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.21.0.tgz", - "integrity": "sha512-12Y4zVDq3yW+wSjSDpSv4HnpL2sDZrNiGSg8XNiDE4HQBdjdA+a+Q3sZF/8NV9y2yoBhL5L7V4mMLDdbZBd9/Q==", - "peerDependencies": { - "@tensorflow/tfjs-core": "3.21.0" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@tensorflow/tfjs-core": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.21.0.tgz", - "integrity": "sha512-YSfsswOqWfd+M4bXIhT3hwtAb+IV8+ODwIxwdFR/7jTAPZP1wMVnSlpKnXHAN64HFOiP+Tm3HmKusEZ0+09A0w==", - "dependencies": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "@types/webgl-ext": "0.0.30", - "@webgpu/types": "0.1.16", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - } - }, - "node_modules/@onfido/active-video-capture/node_modules/@webgpu/types": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.16.tgz", - "integrity": "sha512-9E61voMP4+Rze02jlTXud++Htpjyyk8vw5Hyw9FGRrmhHQg2GqbuOfwf5Klrb8vTxc2XWI3EfO7RUHMpxTj26A==" - }, - "node_modules/@onfido/castor": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@onfido/castor/-/castor-2.2.5.tgz", - "integrity": "sha512-Io3FTazT06FDFJGjHWNF9g0fsIKHw38L2apL//zp/vveyEV1Zce/U0fLzC8LcE5TuoMnoAYaRi6Jwogd8EN5TA==", - "dependencies": { - "@onfido/castor-tokens": "^1.0.0-beta.6", - "csstype": "^3.1.1" - }, - "peerDependencies": { - "@onfido/castor-icons": ">=1.0.0" - } - }, - "node_modules/@onfido/castor-icons": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@onfido/castor-icons/-/castor-icons-2.22.0.tgz", - "integrity": "sha512-7OnCvu5xqVWcBLqovZyb99NP0oHw7sjkVYXZhi438i0U6Pgecrhu/14Gc/IN/kvgDxWj9qmiYdd0qdjNaVckrQ==", - "peerDependencies": { - "react": ">=17 || ^16.14 || ^15.7 || ^0.14.10" - } - }, - "node_modules/@onfido/castor-tokens": { - "version": "1.0.0-beta.6", - "resolved": "https://registry.npmjs.org/@onfido/castor-tokens/-/castor-tokens-1.0.0-beta.6.tgz", - "integrity": "sha512-MfwuSlNdM0Ay0cI3LLyqZGsHW0e1Y1R/0IdQKVU575PdWQx1Q/538aOZMo/a3/oSW0pMEgfOm+mNqPx057cvWA==" - }, - "node_modules/@onfido/opencv": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@onfido/opencv/-/opencv-1.0.2.tgz", - "integrity": "sha512-dgUj7NJ3tohlqU6WdYiey5NBTTjI0VYp2yyL8dz1g8c/nX5tM5toOgEgyaNz7fX2tlpJO877G/CT/n5yYSb+gg==", - "dependencies": { - "mirada": "^0.0.15" - } - }, "node_modules/@parcel/watcher": { "version": "2.0.4", "dev": true, @@ -8261,82 +8077,6 @@ } } }, - "node_modules/@sentry-internal/tracing": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.70.0.tgz", - "integrity": "sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==", - "dependencies": { - "@sentry/core": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/browser": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.70.0.tgz", - "integrity": "sha512-PB+IP49/TLcnDHCj9eJ5tcHE0pzXg23wBakmF3KGMSd5nxEbUvmOsaFPZcgUUlL9JlU3v1Y40We7HdPStrY6oA==", - "dependencies": { - "@sentry-internal/tracing": "7.70.0", - "@sentry/core": "7.70.0", - "@sentry/replay": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.70.0.tgz", - "integrity": "sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==", - "dependencies": { - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/replay": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.70.0.tgz", - "integrity": "sha512-XjnyE6ORREz9kBWWHdXaIjS9P2Wo7uEw+y23vfLQwzV0Nx3xJ+FG4dwf8onyIoeCZDKbz7cqQIbugU1gkgUtZw==", - "dependencies": { - "@sentry/core": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sentry/types": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.70.0.tgz", - "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.70.0.tgz", - "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", - "dependencies": { - "@sentry/types": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.6", "dev": true, @@ -8379,11 +8119,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "peer": true }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, "node_modules/@stitches/react": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", @@ -15577,93 +15312,6 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@tensorflow-models/face-detection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.2.tgz", - "integrity": "sha512-anjSxy3MnZdTiVluOEQZeaFWM30IPswFM+SltX6wseXKja/AbrHYqamGNZKUylAs2JAyudq+xqTRPS+nA2ourg==", - "dependencies": { - "rimraf": "^3.0.2", - "tslib": "2.4.0" - }, - "peerDependencies": { - "@mediapipe/face_detection": "~0.4.0", - "@tensorflow/tfjs-backend-webgl": "^4.4.0", - "@tensorflow/tfjs-converter": "^4.4.0", - "@tensorflow/tfjs-core": "^4.4.0" - } - }, - "node_modules/@tensorflow-models/face-detection/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.11.0.tgz", - "integrity": "sha512-2zmGX9MuR8AwscSGOybz4fBOFgQDnj+ZCWGkLxDzbKecy9GxuilukT46xB2zU0kSq7Mf3ncfE/9eUEy6a7ZDqQ==", - "peer": true, - "dependencies": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.11.0" - } - }, - "node_modules/@tensorflow/tfjs-backend-webgl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.11.0.tgz", - "integrity": "sha512-sM/B65u+1T3U+Ctiq1fn5j6VmiLEZW7BpuSa3ZXDXtIS07MoZ2FTuO8BMudxEY4xGpTyoOzqTOGT9BaGO3qrWg==", - "peer": true, - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.11.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.11.0" - } - }, - "node_modules/@tensorflow/tfjs-converter": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.11.0.tgz", - "integrity": "sha512-j2JEVwkqh+pyin+sxUiNUG7QOIU2S0+5SzN8LFXHlR90/bPvC2qiaaSPYdGG/BYidFc27QCHD3obBXrb1EE/ow==", - "peer": true, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.11.0" - } - }, - "node_modules/@tensorflow/tfjs-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.11.0.tgz", - "integrity": "sha512-t0mCNIco8wg6aZdHWT1d6ZuKtbbdY5y871ELWLSUA1+grXDvvaroHYh5eeJexJYXeg+EQ0/hzB0G8nLsLjlyVQ==", - "peer": true, - "dependencies": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.7.0", - "@types/seedrandom": "^2.4.28", - "@webgpu/types": "0.1.30", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - } - }, - "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { - "version": "2019.7.1", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", - "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==", - "peer": true - }, "node_modules/@testing-library/dom": { "version": "8.19.0", "license": "MIT", @@ -15998,11 +15646,6 @@ "classnames": "*" } }, - "node_modules/@types/emscripten": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-0.0.34.tgz", - "integrity": "sha512-QSb9ojDincskc+uKMI0KXp8e1NALFINCrMlp8VGKGcTSxeEyRTTKyjWw75NYrCZHUsVEEEpr1tYHpbtaC++/sQ==" - }, "node_modules/@types/eslint": { "version": "7.29.0", "license": "MIT", @@ -16139,6 +15782,14 @@ "@types/lodash": "*" } }, + "node_modules/@types/lodash.groupby": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.groupby/-/lodash.groupby-4.6.7.tgz", + "integrity": "sha512-dFUR1pqdMgjIBbgPJ/8axJX6M1C7zsL+HF4qdYMQeJ7XOp0Qbf37I3zh9gpXr/ks6tgEYPDRqyZRAnFYvewYHQ==", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/lodash.merge": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.7.tgz", @@ -16147,6 +15798,14 @@ "@types/lodash": "*" } }, + "node_modules/@types/lodash.pickby": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.pickby/-/lodash.pickby-4.6.7.tgz", + "integrity": "sha512-4ebXRusuLflfscbD0PUX4eVknDHD9Yf+uMtBIvA/hrnTqeAzbuHuDjvnYriLjUrI9YrhCPVKUf4wkRSXJQ6gig==", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/lodash.throttle": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/lodash.throttle/-/lodash.throttle-4.1.7.tgz", @@ -16155,11 +15814,6 @@ "@types/lodash": "*" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mdast": { "version": "3.0.10", "license": "MIT", @@ -16216,11 +15870,6 @@ "resolved": "https://registry.npmjs.org/@types/object.fromentries/-/object.fromentries-2.0.2.tgz", "integrity": "sha512-yUrBe89bzuR2AT0XJU26cmMylc15AOTeZzrnzbYcaMCd8fobYPsre+BJku5JJq5iauUdZkdkrujjzEz0l3MrLg==" }, - "node_modules/@types/offscreencanvas": { - "version": "2019.3.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" - }, "node_modules/@types/parse-json": { "version": "4.0.0", "license": "MIT" @@ -16378,11 +16027,6 @@ "version": "0.16.2", "license": "MIT" }, - "node_modules/@types/seedrandom": { - "version": "2.4.30", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.30.tgz", - "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" - }, "node_modules/@types/semver": { "version": "7.3.13", "license": "MIT" @@ -16437,16 +16081,6 @@ "version": "2.0.6", "license": "MIT" }, - "node_modules/@types/webgl-ext": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", - "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" - }, - "node_modules/@types/webgl2": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", - "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==" - }, "node_modules/@types/webpack": { "version": "4.41.33", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", @@ -16874,12 +16508,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@typescript/lib-dom": { - "name": "@types/web", - "version": "0.0.115", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.115.tgz", - "integrity": "sha512-IBtUgtxnITC7WTCg4tv6kCnSP0T+fM+3PzQPIzLzJY1DDlhBFKM/9+uMURw14YweWPDiFNIZ94Gc1bJtwow97g==" - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", @@ -17110,12 +16738,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webgpu/types": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.30.tgz", - "integrity": "sha512-9AXJSmL3MzY8ZL//JjudA//q+2kBRGhLBFpkdGksWIuxrMy81nFrCzj2Am+mbh8WoU6rXmv7cY5E3rdlyru2Qg==", - "peer": true - }, "node_modules/@webpack-cli/configtest": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", @@ -17180,6 +16802,7 @@ }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { @@ -19304,11 +18927,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "node_modules/blueimp-load-image": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-2.29.0.tgz", - "integrity": "sha512-psm81GlZ0ffKxVT0QN9dvhpzXMv1KxgXSg8ars0XGAcEGsTwFT2IPo59HDXlw4Lo2oImdPzwrwkliZSiLLUpIw==" - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -19691,6 +19309,7 @@ }, "node_modules/buffer": { "version": "5.7.1", + "dev": true, "funding": [ { "type": "github", @@ -22068,14 +21687,6 @@ "which": "bin/which" } }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "license": "MIT", @@ -23759,11 +23370,6 @@ "domelementtype": "1" } }, - "node_modules/dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" - }, "node_modules/domready": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", @@ -24075,46 +23681,6 @@ "objectorarray": "^1.0.5" } }, - "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/enhanced-resolve": { "version": "0.9.1", "dependencies": { @@ -24140,11 +23706,6 @@ "version": "1.1.2", "license": "BSD-2-Clause" }, - "node_modules/enumerate-devices": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enumerate-devices/-/enumerate-devices-1.1.1.tgz", - "integrity": "sha512-8zDbrc7ocusTL1ZGmvgy0cTwdyCaM7sGZoYLRmnWJalLQzmftDtce+uDU91gafOTo9MCtgjSIxyMv/F4+Hcchw==" - }, "node_modules/env-paths": { "version": "2.2.1", "dev": true, @@ -25232,6 +24793,11 @@ "eslint-plugin-playwright": "^0.9.0" } }, + "node_modules/eslint-plugin-local-rules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-local-rules/-/eslint-plugin-local-rules-2.0.0.tgz", + "integrity": "sha512-sWueme0kUcP0JC1+6OBDQ9edBDVFJR92WJHSRbhiRExlenMEuUisdaVBPR+ItFBFXo2Pdw6FD2UfGZWkz8e93g==" + }, "node_modules/eslint-plugin-playwright": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.9.0.tgz", @@ -25957,11 +25523,6 @@ "resolved": "https://registry.npmjs.org/event-emitter-es6/-/event-emitter-es6-1.1.5.tgz", "integrity": "sha512-/n7qzkJBySdbe1W9/FBDdO7gzDIaewgj+Rj6Ayc2BdvVcaGP+p40DyViOFudCgV47UU8+cUFmcD3tJgjwY65qQ==" }, - "node_modules/eventemitter2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-2.2.2.tgz", - "integrity": "sha512-AmQ734LWUB9Iyk+2WIU3Z8iRhdL1XQihEE0iF/QC5Xp11zST0Z5tn5jRHa/PgIld2QIPSCys3CREqOQLUhNvkw==" - }, "node_modules/eventemitter3": { "version": "4.0.7", "license": "MIT" @@ -26719,14 +26280,6 @@ "ramda": "^0.28.0" } }, - "node_modules/file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "engines": { - "node": ">=8" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -26956,14 +26509,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flat": { "version": "5.0.2", "dev": true, @@ -33762,14 +33307,6 @@ "node": ">=0.10.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, "node_modules/kleur": { "version": "3.0.3", "license": "MIT", @@ -34371,6 +33908,11 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "peer": true }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, "node_modules/lodash.invokemap": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", @@ -34414,6 +33956,11 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==" + }, "node_modules/lodash.pullall": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", @@ -34617,11 +34164,6 @@ "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/longest-streak": { "version": "2.0.4", "dev": true, @@ -35394,22 +34936,6 @@ "node": ">= 8" } }, - "node_modules/mirada": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/mirada/-/mirada-0.0.15.tgz", - "integrity": "sha512-mbm4c+wjBVcmUzHRLv/TfOAq+iy03D24KwGxx8H+NSXkD5EOZV9zFWbVxTvZCc9XwR0FIUhryU/kQm12SMSQ3g==", - "dependencies": { - "buffer": "^5.4.3", - "cross-fetch": "^3.0.4", - "file-type": "^12.3.0", - "misc-utils-of-mine-generic": "^0.2.31" - } - }, - "node_modules/misc-utils-of-mine-generic": { - "version": "0.2.45", - "resolved": "https://registry.npmjs.org/misc-utils-of-mine-generic/-/misc-utils-of-mine-generic-0.2.45.tgz", - "integrity": "sha512-WsG2zYiui2cdEbHF2pXmJfnjHb4zL+cy+PaYcLgIpMju98hwX89VbjlvGIfamCfEodbQ0qjCEvD3ocgkCXfMOQ==" - }, "node_modules/mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -37213,80 +36739,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/onfido-sdk-ui": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/onfido-sdk-ui/-/onfido-sdk-ui-11.0.1.tgz", - "integrity": "sha512-S61h4njiuWQD3KNLRZaoobiaSjTvt1FjBOwqnsJmnkN7TD/knu8c1IyNlgztRe0Fg2CSE70rwEiO8tdlM3pqsg==", - "dependencies": { - "@onfido/active-video-capture": "^0.22.1", - "@onfido/opencv": "^1.0.0", - "@sentry/browser": "^7.2.0", - "blueimp-load-image": "~2.29.0", - "classnames": "~2.2.5", - "core-js": "^3.21.1", - "deepmerge": "^4.2.2", - "dompurify": "^2.2.6", - "enumerate-devices": "^1.1.1", - "eventemitter2": "~2.2.2", - "history": "~4.5.1", - "hoist-non-react-statics": "^3.3.2", - "js-cookie": "^3.0.1", - "pdfobject": "^2.2.7", - "preact": "^10.5.13", - "redux": "^4.0.5", - "socket.io-client": "^4.2.0", - "supports-webp": "~1.0.3", - "uuid": "^8.3.2", - "visibilityjs": "~1.2.4", - "xstate": "^4.33.6" - }, - "bin": { - "migrate_locales": "scripts/migrate_locales.js" - } - }, - "node_modules/onfido-sdk-ui/node_modules/classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "node_modules/onfido-sdk-ui/node_modules/core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/onfido-sdk-ui/node_modules/history": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.5.1.tgz", - "integrity": "sha512-gfHeJeYeMzFtos61gdA1AloO0hGXPF2Yum+2FRdJvlylYQOz51OnT1zuwg9UYst1BRrONhcAh3Nmsg9iblgl6g==", - "dependencies": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.0.0", - "value-equal": "^0.2.0", - "warning": "^3.0.0" - } - }, - "node_modules/onfido-sdk-ui/node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "engines": { - "node": ">=14" - } - }, - "node_modules/onfido-sdk-ui/node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/open": { "version": "8.4.0", "license": "MIT", @@ -37921,207 +37373,6 @@ "node": ">=0.10.0" } }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=10", - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/patch-package/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/patch-package/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/patch-package/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/patch-package/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/patch-package/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/patch-package/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -38198,11 +37449,6 @@ "node": ">=0.12" } }, - "node_modules/pdfobject": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/pdfobject/-/pdfobject-2.2.12.tgz", - "integrity": "sha512-D0oyD/sj8j82AMaJhoyMaY1aD5TkbpU3FbJC6w9/cpJlZRpYHqAkutXw1Ca/FKjYPZmTAu58uGIfgOEaDlbY8A==" - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -39824,21 +39070,6 @@ "posthtml-render": "^1.0.6" } }, - "node_modules/postinstall-postinstall": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", - "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", - "hasInstallScript": true - }, - "node_modules/preact": { - "version": "10.17.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", - "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/preload-webpack-plugin": { "version": "3.0.0-beta.4", "resolved": "https://registry.npmjs.org/preload-webpack-plugin/-/preload-webpack-plugin-3.0.0-beta.4.tgz", @@ -41332,15 +40563,15 @@ } }, "node_modules/react-tabs": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", - "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-4.3.0.tgz", + "integrity": "sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q==", "dependencies": { "clsx": "^1.1.0", "prop-types": "^15.5.0" }, "peerDependencies": { - "react": "^16.3.0 || ^17.0.0-0" + "react": "^16.8.0 || ^17.0.0-0 || ^18.0.0" } }, "node_modules/react-tiny-popover": { @@ -41385,15 +40616,6 @@ "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-webcam": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.1.1.tgz", - "integrity": "sha512-2W5WN8wmEv8ZlxvyAlOxVuw6new8Bi7+KSPqoq5oa7z1KSKZ72ucaKqCFRtHSuFjZ5sh5ioS9lp4BGwnaZ6lDg==", - "peerDependencies": { - "react": ">=16.2.0", - "react-dom": ">=16.2.0" - } - }, "node_modules/react-window": { "version": "1.8.9", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", @@ -42551,11 +41773,6 @@ "node": ">=8" } }, - "node_modules/resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, "node_modules/resolve-url": { "version": "0.2.1", "license": "MIT" @@ -43445,11 +42662,6 @@ "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==" }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, "node_modules/select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -44147,32 +43359,6 @@ "node": ">=0.10.0" } }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -45603,11 +44789,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-webp": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/supports-webp/-/supports-webp-1.0.7.tgz", - "integrity": "sha512-ZlqT+sCgZKcykOLrk8DYR4t3Em+nyVSHpiV3q7uzOutLwKIYU23n88KibCLw3FzM4NCQeRorvZ55AV/77lQyOQ==" - }, "node_modules/svg-baker": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", @@ -46343,6 +45524,7 @@ }, "node_modules/tmp": { "version": "0.0.33", + "dev": true, "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -47582,11 +46764,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/value-equal": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", - "integrity": "sha512-yRL36Xb2K/HmFT5Fe3M86S7mu4+a12/3l7uytUh6eNPPjP77ldPBvsAvmnWff39sXn55naRMZN8LZWRO8PWaeQ==" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -47664,11 +46841,6 @@ "node": ">=0.10.0" } }, - "node_modules/visibilityjs": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/visibilityjs/-/visibilityjs-1.2.8.tgz", - "integrity": "sha512-Y+aL3OUX88b+/VSmkmC2ApuLbf0grzbNLpCfIDSw3BzTU6PqcPsdgIOaw8b+eZoy+DdQqnVN3y/Evow9vQq9Ig==" - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -49915,23 +49087,6 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xstate": { - "version": "4.38.2", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.38.2.tgz", - "integrity": "sha512-Fba/DwEPDLneHT3tbJ9F3zafbQXszOlyCJyQqqdzmtlY/cwE2th462KK48yaANf98jHlP6lJvxfNtN0LFKXPQg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/xstate" - } - }, "node_modules/xtend": { "version": "4.0.2", "license": "MIT", @@ -51612,9 +50767,9 @@ } }, "@deriv/deriv-charts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@deriv/deriv-charts/-/deriv-charts-1.3.6.tgz", - "integrity": "sha512-hxEgCIPPx87OO2NVn8cxbmUc4kVUPhjTzM8MGyviJkCWpl+mdBKizGKq+LQr9oNQwKfxw2dszFDBaVsoAFTXYQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@deriv/deriv-charts/-/deriv-charts-1.4.0.tgz", + "integrity": "sha512-JWhDkE/c+CouMQ6FNsiKwg9EWFq3jgUu7dxK2Z4wNeDSDrcNe37VK13UagL40dmqJe/W3LJ2wUolFGYqAe3DIw==", "requires": { "@welldone-software/why-did-you-render": "^3.3.8", "classnames": "^2.3.1", @@ -51624,36 +50779,13 @@ "mobx-react-lite": "^3.4.0", "moment": "^2.24.0", "prop-types": "^15.7.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "react-tabs": "^3.0.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-tabs": "^4.3.0", "react-transition-group": "^4.4.1", "robust-websocket": "^1.0.0", "sinon-chai": "^3.7.0", "url-search-params-polyfill": "^7.0.0" - }, - "dependencies": { - "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - } } }, "@deriv/eslint-config-deriv": { @@ -54117,16 +53249,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, - "@mediapipe/face_detection": { - "version": "0.4.1646425229", - "resolved": "https://registry.npmjs.org/@mediapipe/face_detection/-/face_detection-0.4.1646425229.tgz", - "integrity": "sha512-aeCN+fRAojv9ch3NXorP6r5tcGVLR3/gC1HmtqB0WEZBRXrdP6/3W/sGR0dHr1iT6ueiK95G9PVjbzFosf/hrg==" - }, - "@mediapipe/face_mesh": { - "version": "0.4.1633559619", - "resolved": "https://registry.npmjs.org/@mediapipe/face_mesh/-/face_mesh-0.4.1633559619.tgz", - "integrity": "sha512-Vc8cdjxS5+O2gnjWH9KncYpUCVXT0h714KlWAsyqJvJbIgUJBqpppbIx8yWcAzBDxm/5cYSuBI5p5ySIPxzcEg==" - }, "@motionone/animation": { "version": "10.16.3", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz", @@ -54705,123 +53827,6 @@ "@octokit/openapi-types": "^14.0.0" } }, - "@onfido/active-video-capture": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@onfido/active-video-capture/-/active-video-capture-0.22.2.tgz", - "integrity": "sha512-wM7PJUdB0rwCpIdKoOczynqALW9zXXr/x43RGDpaGBFMdY5imbXpQtI/JaaZjQsWK6cH8FKAkKLvrxRNYCsMmQ==", - "requires": { - "@mediapipe/face_detection": "^0.4.1646425229", - "@mediapipe/face_mesh": "^0.4.1633559619", - "@onfido/castor": "^2.2.2", - "@onfido/castor-icons": "^2.12.0", - "@tensorflow-models/face-detection": "^1.0.1", - "@tensorflow-models/face-landmarks-detection": "^1.0.2", - "@tensorflow/tfjs-backend-wasm": "^3.20.0", - "@tensorflow/tfjs-backend-webgl": "^3.20.0", - "@tensorflow/tfjs-converter": "^3.20.0", - "@tensorflow/tfjs-core": "^3.20.0", - "@typescript/lib-dom": "npm:@types/web", - "patch-package": "^6.4.7", - "postinstall-postinstall": "^2.1.0", - "preact": "^10.10.6", - "react-webcam": "^7.0.0" - }, - "dependencies": { - "@tensorflow-models/face-landmarks-detection": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tensorflow-models/face-landmarks-detection/-/face-landmarks-detection-1.0.5.tgz", - "integrity": "sha512-54XJPi8g29/MknJ33ZBrLsEzr9kw/dJtrJMMD3xrCrnRlfFQPIKQ5PI2Wml55Fz2p4U2hemzBB0/H+S94JddIQ==", - "requires": { - "rimraf": "^3.0.2" - } - }, - "@tensorflow/tfjs-backend-cpu": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.21.0.tgz", - "integrity": "sha512-88S21UAdzyK0CsLUrH17GPTD+26E85OP9CqmLZslaWjWUmBkeTQ5Zqyp6iK+gELnLxPx6q7JsNEeFuPv4254lQ==", - "requires": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - } - }, - "@tensorflow/tfjs-backend-wasm": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-wasm/-/tfjs-backend-wasm-3.21.0.tgz", - "integrity": "sha512-TVkJWrqukdxvIaQn9jZvtXR+7fmT7sti6NQH5OKVcBmFYIW7I3RiRRE66inVrHjEEvIVTUuW9yo9Ialn31EFIw==", - "requires": { - "@tensorflow/tfjs-backend-cpu": "3.21.0", - "@types/emscripten": "~0.0.34" - } - }, - "@tensorflow/tfjs-backend-webgl": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-3.21.0.tgz", - "integrity": "sha512-N4zitIAT9IX8B8oe489qM3f3VcESxGZIZvHmVP8varOQakTvTX859aaPo1s8hK1qCy4BjSGbweooZe4U8D4kTQ==", - "requires": { - "@tensorflow/tfjs-backend-cpu": "3.21.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "@types/webgl-ext": "0.0.30", - "@types/webgl2": "0.0.6", - "seedrandom": "^3.0.5" - } - }, - "@tensorflow/tfjs-converter": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.21.0.tgz", - "integrity": "sha512-12Y4zVDq3yW+wSjSDpSv4HnpL2sDZrNiGSg8XNiDE4HQBdjdA+a+Q3sZF/8NV9y2yoBhL5L7V4mMLDdbZBd9/Q==", - "requires": {} - }, - "@tensorflow/tfjs-core": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.21.0.tgz", - "integrity": "sha512-YSfsswOqWfd+M4bXIhT3hwtAb+IV8+ODwIxwdFR/7jTAPZP1wMVnSlpKnXHAN64HFOiP+Tm3HmKusEZ0+09A0w==", - "requires": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "@types/webgl-ext": "0.0.30", - "@webgpu/types": "0.1.16", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - } - }, - "@webgpu/types": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.16.tgz", - "integrity": "sha512-9E61voMP4+Rze02jlTXud++Htpjyyk8vw5Hyw9FGRrmhHQg2GqbuOfwf5Klrb8vTxc2XWI3EfO7RUHMpxTj26A==" - } - } - }, - "@onfido/castor": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@onfido/castor/-/castor-2.2.5.tgz", - "integrity": "sha512-Io3FTazT06FDFJGjHWNF9g0fsIKHw38L2apL//zp/vveyEV1Zce/U0fLzC8LcE5TuoMnoAYaRi6Jwogd8EN5TA==", - "requires": { - "@onfido/castor-tokens": "^1.0.0-beta.6", - "csstype": "^3.1.1" - } - }, - "@onfido/castor-icons": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@onfido/castor-icons/-/castor-icons-2.22.0.tgz", - "integrity": "sha512-7OnCvu5xqVWcBLqovZyb99NP0oHw7sjkVYXZhi438i0U6Pgecrhu/14Gc/IN/kvgDxWj9qmiYdd0qdjNaVckrQ==", - "requires": {} - }, - "@onfido/castor-tokens": { - "version": "1.0.0-beta.6", - "resolved": "https://registry.npmjs.org/@onfido/castor-tokens/-/castor-tokens-1.0.0-beta.6.tgz", - "integrity": "sha512-MfwuSlNdM0Ay0cI3LLyqZGsHW0e1Y1R/0IdQKVU575PdWQx1Q/538aOZMo/a3/oSW0pMEgfOm+mNqPx057cvWA==" - }, - "@onfido/opencv": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@onfido/opencv/-/opencv-1.0.2.tgz", - "integrity": "sha512-dgUj7NJ3tohlqU6WdYiey5NBTTjI0VYp2yyL8dz1g8c/nX5tM5toOgEgyaNz7fX2tlpJO877G/CT/n5yYSb+gg==", - "requires": { - "mirada": "^0.0.15" - } - }, "@parcel/watcher": { "version": "2.0.4", "dev": true, @@ -55378,64 +54383,6 @@ "integrity": "sha512-VNipPeJT7B6hD/OBDi6IjcGW+Y8fJHNkVUkvFk0BUkkZLY1eefUmtrv2CWWbJ0hxfGFWe+wRVEjsdWDXqLN/DA==", "requires": {} }, - "@sentry-internal/tracing": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.70.0.tgz", - "integrity": "sha512-SpbE6wZhs6QwG2ORWCt8r28o1T949qkWx/KeRTCdK4Ub95PQ3Y3DgnqD8Wz//3q50Wt6EZDEibmz4t067g6PPg==", - "requires": { - "@sentry/core": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - } - }, - "@sentry/browser": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.70.0.tgz", - "integrity": "sha512-PB+IP49/TLcnDHCj9eJ5tcHE0pzXg23wBakmF3KGMSd5nxEbUvmOsaFPZcgUUlL9JlU3v1Y40We7HdPStrY6oA==", - "requires": { - "@sentry-internal/tracing": "7.70.0", - "@sentry/core": "7.70.0", - "@sentry/replay": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - } - }, - "@sentry/core": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.70.0.tgz", - "integrity": "sha512-voUsGVM+jwRp99AQYFnRvr7sVd2tUhIMj1L6F42LtD3vp7t5ZnKp3NpXagtFW2vWzXESfyJUBhM0qI/bFvn7ZA==", - "requires": { - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - } - }, - "@sentry/replay": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.70.0.tgz", - "integrity": "sha512-XjnyE6ORREz9kBWWHdXaIjS9P2Wo7uEw+y23vfLQwzV0Nx3xJ+FG4dwf8onyIoeCZDKbz7cqQIbugU1gkgUtZw==", - "requires": { - "@sentry/core": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0" - } - }, - "@sentry/types": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.70.0.tgz", - "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==" - }, - "@sentry/utils": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.70.0.tgz", - "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", - "requires": { - "@sentry/types": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - } - }, "@sinonjs/commons": { "version": "1.8.6", "dev": true, @@ -55478,11 +54425,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "peer": true }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, "@stitches/react": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz", @@ -60888,73 +59830,18 @@ "use-sync-external-store": "^1.2.0" } }, - "@tensorflow-models/face-detection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.2.tgz", - "integrity": "sha512-anjSxy3MnZdTiVluOEQZeaFWM30IPswFM+SltX6wseXKja/AbrHYqamGNZKUylAs2JAyudq+xqTRPS+nA2ourg==", - "requires": { - "rimraf": "^3.0.2", - "tslib": "2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - } - } - }, - "@tensorflow/tfjs-backend-cpu": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.11.0.tgz", - "integrity": "sha512-2zmGX9MuR8AwscSGOybz4fBOFgQDnj+ZCWGkLxDzbKecy9GxuilukT46xB2zU0kSq7Mf3ncfE/9eUEy6a7ZDqQ==", - "peer": true, - "requires": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - } - }, - "@tensorflow/tfjs-backend-webgl": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.11.0.tgz", - "integrity": "sha512-sM/B65u+1T3U+Ctiq1fn5j6VmiLEZW7BpuSa3ZXDXtIS07MoZ2FTuO8BMudxEY4xGpTyoOzqTOGT9BaGO3qrWg==", - "peer": true, + "@tanstack/react-table": { + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.3.tgz", + "integrity": "sha512-Qya1cJ+91arAlW7IRDWksRDnYw28O446jJ/ljkRSc663EaftJoBCAU10M+VV1K6MpCBLrXq1BD5IQc1zj/ZEjA==", "requires": { - "@tensorflow/tfjs-backend-cpu": "4.11.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" + "@tanstack/table-core": "8.10.3" } }, - "@tensorflow/tfjs-converter": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.11.0.tgz", - "integrity": "sha512-j2JEVwkqh+pyin+sxUiNUG7QOIU2S0+5SzN8LFXHlR90/bPvC2qiaaSPYdGG/BYidFc27QCHD3obBXrb1EE/ow==", - "peer": true, - "requires": {} - }, - "@tensorflow/tfjs-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.11.0.tgz", - "integrity": "sha512-t0mCNIco8wg6aZdHWT1d6ZuKtbbdY5y871ELWLSUA1+grXDvvaroHYh5eeJexJYXeg+EQ0/hzB0G8nLsLjlyVQ==", - "peer": true, - "requires": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.7.0", - "@types/seedrandom": "^2.4.28", - "@webgpu/types": "0.1.30", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - }, - "dependencies": { - "@types/offscreencanvas": { - "version": "2019.7.1", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", - "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==", - "peer": true - } - } + "@tanstack/table-core": { + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.3.tgz", + "integrity": "sha512-hJ55YfJlWbfzRROfcyA/kC1aZr/shsLA8XNAwN8jXylhYWGLnPmiJJISrUfj4dMMWRiFi0xBlnlC7MLH+zSrcw==" }, "@testing-library/dom": { "version": "8.19.0", @@ -61181,11 +60068,6 @@ "classnames": "*" } }, - "@types/emscripten": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-0.0.34.tgz", - "integrity": "sha512-QSb9ojDincskc+uKMI0KXp8e1NALFINCrMlp8VGKGcTSxeEyRTTKyjWw75NYrCZHUsVEEEpr1tYHpbtaC++/sQ==" - }, "@types/eslint": { "version": "7.29.0", "requires": { @@ -61311,6 +60193,14 @@ "@types/lodash": "*" } }, + "@types/lodash.groupby": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.groupby/-/lodash.groupby-4.6.7.tgz", + "integrity": "sha512-dFUR1pqdMgjIBbgPJ/8axJX6M1C7zsL+HF4qdYMQeJ7XOp0Qbf37I3zh9gpXr/ks6tgEYPDRqyZRAnFYvewYHQ==", + "requires": { + "@types/lodash": "*" + } + }, "@types/lodash.merge": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.7.tgz", @@ -61319,6 +60209,14 @@ "@types/lodash": "*" } }, + "@types/lodash.pickby": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.pickby/-/lodash.pickby-4.6.7.tgz", + "integrity": "sha512-4ebXRusuLflfscbD0PUX4eVknDHD9Yf+uMtBIvA/hrnTqeAzbuHuDjvnYriLjUrI9YrhCPVKUf4wkRSXJQ6gig==", + "requires": { + "@types/lodash": "*" + } + }, "@types/lodash.throttle": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/lodash.throttle/-/lodash.throttle-4.1.7.tgz", @@ -61327,11 +60225,6 @@ "@types/lodash": "*" } }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "@types/mdast": { "version": "3.0.10", "requires": { @@ -61382,11 +60275,6 @@ "resolved": "https://registry.npmjs.org/@types/object.fromentries/-/object.fromentries-2.0.2.tgz", "integrity": "sha512-yUrBe89bzuR2AT0XJU26cmMylc15AOTeZzrnzbYcaMCd8fobYPsre+BJku5JJq5iauUdZkdkrujjzEz0l3MrLg==" }, - "@types/offscreencanvas": { - "version": "2019.3.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" - }, "@types/parse-json": { "version": "4.0.0" }, @@ -61535,11 +60423,6 @@ "@types/scheduler": { "version": "0.16.2" }, - "@types/seedrandom": { - "version": "2.4.30", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.30.tgz", - "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" - }, "@types/semver": { "version": "7.3.13" }, @@ -61590,16 +60473,6 @@ "@types/unist": { "version": "2.0.6" }, - "@types/webgl-ext": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", - "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" - }, - "@types/webgl2": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", - "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==" - }, "@types/webpack": { "version": "4.41.33", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", @@ -61841,11 +60714,6 @@ } } }, - "@typescript/lib-dom": { - "version": "npm:@types/web@0.0.115", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.115.tgz", - "integrity": "sha512-IBtUgtxnITC7WTCg4tv6kCnSP0T+fM+3PzQPIzLzJY1DDlhBFKM/9+uMURw14YweWPDiFNIZ94Gc1bJtwow97g==" - }, "@webassemblyjs/ast": { "version": "1.11.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", @@ -62082,12 +60950,6 @@ "@xtuc/long": "4.2.2" } }, - "@webgpu/types": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.30.tgz", - "integrity": "sha512-9AXJSmL3MzY8ZL//JjudA//q+2kBRGhLBFpkdGksWIuxrMy81nFrCzj2Am+mbh8WoU6rXmv7cY5E3rdlyru2Qg==", - "peer": true - }, "@webpack-cli/configtest": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", @@ -62132,7 +60994,8 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "@yarnpkg/lockfile": { - "version": "1.1.0" + "version": "1.1.0", + "dev": true }, "@yarnpkg/parsers": { "version": "3.0.0-rc.32", @@ -63708,11 +62571,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "blueimp-load-image": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-2.29.0.tgz", - "integrity": "sha512-psm81GlZ0ffKxVT0QN9dvhpzXMv1KxgXSg8ars0XGAcEGsTwFT2IPo59HDXlw4Lo2oImdPzwrwkliZSiLLUpIw==" - }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -64013,6 +62871,7 @@ }, "buffer": { "version": "5.7.1", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -65749,14 +64608,6 @@ } } }, - "cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "requires": { - "node-fetch": "^2.6.12" - } - }, "cross-spawn": { "version": "7.0.3", "requires": { @@ -66969,11 +65820,6 @@ "domelementtype": "1" } }, - "dompurify": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz", - "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ==" - }, "domready": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", @@ -67237,31 +66083,6 @@ "objectorarray": "^1.0.5" } }, - "engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - }, - "dependencies": { - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - } - } - }, - "engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==" - }, "enhanced-resolve": { "version": "0.9.1", "requires": { @@ -67279,11 +66100,6 @@ "entities": { "version": "1.1.2" }, - "enumerate-devices": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enumerate-devices/-/enumerate-devices-1.1.1.tgz", - "integrity": "sha512-8zDbrc7ocusTL1ZGmvgy0cTwdyCaM7sGZoYLRmnWJalLQzmftDtce+uDU91gafOTo9MCtgjSIxyMv/F4+Hcchw==" - }, "env-paths": { "version": "2.2.1", "dev": true @@ -68476,11 +67292,6 @@ "resolved": "https://registry.npmjs.org/event-emitter-es6/-/event-emitter-es6-1.1.5.tgz", "integrity": "sha512-/n7qzkJBySdbe1W9/FBDdO7gzDIaewgj+Rj6Ayc2BdvVcaGP+p40DyViOFudCgV47UU8+cUFmcD3tJgjwY65qQ==" }, - "eventemitter2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-2.2.2.tgz", - "integrity": "sha512-AmQ734LWUB9Iyk+2WIU3Z8iRhdL1XQihEE0iF/QC5Xp11zST0Z5tn5jRHa/PgIld2QIPSCys3CREqOQLUhNvkw==" - }, "eventemitter3": { "version": "4.0.7" }, @@ -69041,11 +67852,6 @@ "ramda": "^0.28.0" } }, - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" - }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -69218,14 +68024,6 @@ "path-exists": "^4.0.0" } }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "requires": { - "micromatch": "^4.0.2" - } - }, "flat": { "version": "5.0.2", "dev": true @@ -73874,14 +72672,6 @@ "kind-of": { "version": "6.0.3" }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "requires": { - "graceful-fs": "^4.1.11" - } - }, "kleur": { "version": "3.0.3" }, @@ -74313,6 +73103,11 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "peer": true }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, "lodash.invokemap": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", @@ -74350,6 +73145,11 @@ "version": "4.6.2", "dev": true }, + "lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==" + }, "lodash.pullall": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", @@ -74481,11 +73281,6 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==" }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "longest-streak": { "version": "2.0.4", "dev": true @@ -75026,22 +73821,6 @@ "yallist": "^4.0.0" } }, - "mirada": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/mirada/-/mirada-0.0.15.tgz", - "integrity": "sha512-mbm4c+wjBVcmUzHRLv/TfOAq+iy03D24KwGxx8H+NSXkD5EOZV9zFWbVxTvZCc9XwR0FIUhryU/kQm12SMSQ3g==", - "requires": { - "buffer": "^5.4.3", - "cross-fetch": "^3.0.4", - "file-type": "^12.3.0", - "misc-utils-of-mine-generic": "^0.2.31" - } - }, - "misc-utils-of-mine-generic": { - "version": "0.2.45", - "resolved": "https://registry.npmjs.org/misc-utils-of-mine-generic/-/misc-utils-of-mine-generic-0.2.45.tgz", - "integrity": "sha512-WsG2zYiui2cdEbHF2pXmJfnjHb4zL+cy+PaYcLgIpMju98hwX89VbjlvGIfamCfEodbQ0qjCEvD3ocgkCXfMOQ==" - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -76330,71 +75109,6 @@ "mimic-fn": "^2.1.0" } }, - "onfido-sdk-ui": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/onfido-sdk-ui/-/onfido-sdk-ui-11.0.1.tgz", - "integrity": "sha512-S61h4njiuWQD3KNLRZaoobiaSjTvt1FjBOwqnsJmnkN7TD/knu8c1IyNlgztRe0Fg2CSE70rwEiO8tdlM3pqsg==", - "requires": { - "@onfido/active-video-capture": "^0.22.1", - "@onfido/opencv": "^1.0.0", - "@sentry/browser": "^7.2.0", - "blueimp-load-image": "~2.29.0", - "classnames": "~2.2.5", - "core-js": "^3.21.1", - "deepmerge": "^4.2.2", - "dompurify": "^2.2.6", - "enumerate-devices": "^1.1.1", - "eventemitter2": "~2.2.2", - "history": "~4.5.1", - "hoist-non-react-statics": "^3.3.2", - "js-cookie": "^3.0.1", - "pdfobject": "^2.2.7", - "preact": "^10.5.13", - "redux": "^4.0.5", - "socket.io-client": "^4.2.0", - "supports-webp": "~1.0.3", - "uuid": "^8.3.2", - "visibilityjs": "~1.2.4", - "xstate": "^4.33.6" - }, - "dependencies": { - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==" - }, - "history": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.5.1.tgz", - "integrity": "sha512-gfHeJeYeMzFtos61gdA1AloO0hGXPF2Yum+2FRdJvlylYQOz51OnT1zuwg9UYst1BRrONhcAh3Nmsg9iblgl6g==", - "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.0.0", - "value-equal": "^0.2.0", - "warning": "^3.0.0" - } - }, - "js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==", - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, "open": { "version": "8.4.0", "requires": { @@ -76827,148 +75541,6 @@ "pascalcase": { "version": "0.1.1" }, - "patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -77022,11 +75594,6 @@ "sha.js": "^2.4.8" } }, - "pdfobject": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/pdfobject/-/pdfobject-2.2.12.tgz", - "integrity": "sha512-D0oyD/sj8j82AMaJhoyMaY1aD5TkbpU3FbJC6w9/cpJlZRpYHqAkutXw1Ca/FKjYPZmTAu58uGIfgOEaDlbY8A==" - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -78001,16 +76568,6 @@ "posthtml-render": "^1.0.6" } }, - "postinstall-postinstall": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", - "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==" - }, - "preact": { - "version": "10.17.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", - "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==" - }, "preload-webpack-plugin": { "version": "3.0.0-beta.4", "resolved": "https://registry.npmjs.org/preload-webpack-plugin/-/preload-webpack-plugin-3.0.0-beta.4.tgz", @@ -79123,9 +77680,9 @@ } }, "react-tabs": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz", - "integrity": "sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-4.3.0.tgz", + "integrity": "sha512-2GfoG+f41kiBIIyd3gF+/GRCCYtamC8/2zlAcD8cqQmqI9Q+YVz7fJLHMmU9pXDVYYHpJeCgUSBJju85vu5q8Q==", "requires": { "clsx": "^1.1.0", "prop-types": "^15.5.0" @@ -79161,12 +77718,6 @@ "react-lifecycles-compat": "^3.0.4" } }, - "react-webcam": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.1.1.tgz", - "integrity": "sha512-2W5WN8wmEv8ZlxvyAlOxVuw6new8Bi7+KSPqoq5oa7z1KSKZ72ucaKqCFRtHSuFjZ5sh5ioS9lp4BGwnaZ6lDg==", - "requires": {} - }, "react-window": { "version": "1.8.9", "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", @@ -79973,11 +78524,6 @@ "global-dirs": "^0.1.1" } }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, "resolve-url": { "version": "0.2.1" }, @@ -80614,11 +79160,6 @@ "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==" }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -81149,26 +79690,6 @@ } } }, - "socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - } - }, - "socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -82168,11 +80689,6 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0" }, - "supports-webp": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/supports-webp/-/supports-webp-1.0.7.tgz", - "integrity": "sha512-ZlqT+sCgZKcykOLrk8DYR4t3Em+nyVSHpiV3q7uzOutLwKIYU23n88KibCLw3FzM4NCQeRorvZ55AV/77lQyOQ==" - }, "svg-baker": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", @@ -82715,6 +81231,7 @@ }, "tmp": { "version": "0.0.33", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -83511,11 +82028,6 @@ "builtins": "^5.0.0" } }, - "value-equal": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", - "integrity": "sha512-yRL36Xb2K/HmFT5Fe3M86S7mu4+a12/3l7uytUh6eNPPjP77ldPBvsAvmnWff39sXn55naRMZN8LZWRO8PWaeQ==" - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -83574,11 +82086,6 @@ } } }, - "visibilityjs": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/visibilityjs/-/visibilityjs-1.2.8.tgz", - "integrity": "sha512-Y+aL3OUX88b+/VSmkmC2ApuLbf0grzbNLpCfIDSw3BzTU6PqcPsdgIOaw8b+eZoy+DdQqnVN3y/Evow9vQq9Ig==" - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -85313,16 +83820,6 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==" - }, - "xstate": { - "version": "4.38.2", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.38.2.tgz", - "integrity": "sha512-Fba/DwEPDLneHT3tbJ9F3zafbQXszOlyCJyQqqdzmtlY/cwE2th462KK48yaANf98jHlP6lJvxfNtN0LFKXPQg==" - }, "xtend": { "version": "4.0.2" }, diff --git a/packages/account/package.json b/packages/account/package.json index c8dc9ccc973e..9d5c57f8320b 100644 --- a/packages/account/package.json +++ b/packages/account/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@binary-com/binary-document-uploader": "^2.4.8", + "@deriv/api": "^1.0.0", "@deriv/api-types": "^1.0.118", "@deriv/components": "^1.0.0", "@deriv/hooks": "^1.0.0", @@ -43,7 +44,6 @@ "js-cookie": "^2.2.1", "mobx": "^6.6.1", "mobx-react": "^7.5.1", - "onfido-sdk-ui": "^11.0.0", "prop-types": "^15.7.2", "qrcode.react": "^1.0.0", "react": "^17.0.2", diff --git a/packages/account/src/App.tsx b/packages/account/src/App.tsx index 6e8a413b434f..4d9ff2d1ebb8 100644 --- a/packages/account/src/App.tsx +++ b/packages/account/src/App.tsx @@ -1,10 +1,9 @@ import React from 'react'; import Routes from './Containers/routes'; import ResetTradingPassword from './Containers/reset-trading-password'; -import { setWebsocket } from '@deriv/shared'; +import { APIProvider } from '@deriv/api'; import { StoreProvider } from '@deriv/stores'; import { TCoreStores } from '@deriv/stores/types'; -import APIProvider from '../../api/src/APIProvider'; // TODO: add correct types for WS after implementing them type TAppProps = { @@ -15,8 +14,7 @@ type TAppProps = { }; const App = ({ passthrough }: TAppProps) => { - const { root_store, WS } = passthrough; - setWebsocket(WS); + const { root_store } = passthrough; const { notification_messages_ui: Notifications } = root_store.ui; diff --git a/packages/account/src/Components/Routes/__tests__/binary-routes.spec.tsx b/packages/account/src/Components/Routes/__tests__/binary-routes.spec.tsx index 2c3df1deceed..ca00b2294287 100644 --- a/packages/account/src/Components/Routes/__tests__/binary-routes.spec.tsx +++ b/packages/account/src/Components/Routes/__tests__/binary-routes.spec.tsx @@ -1,8 +1,10 @@ import React from 'react'; import { Router } from 'react-router-dom'; import { createBrowserHistory } from 'history'; + +import { mockStore, StoreProvider } from '@deriv/stores'; import { render, screen } from '@testing-library/react'; -import { StoreProvider, mockStore } from '@deriv/stores'; + import BinaryRoutes from '../binary-routes'; jest.mock('../route-with-sub-routes', () => jest.fn(() =>
RouteWithSubRoutes
)); diff --git a/packages/account/src/Components/Routes/binary-routes.tsx b/packages/account/src/Components/Routes/binary-routes.tsx index de884830b996..6e361da601f1 100644 --- a/packages/account/src/Components/Routes/binary-routes.tsx +++ b/packages/account/src/Components/Routes/binary-routes.tsx @@ -1,9 +1,12 @@ import React from 'react'; import { Switch } from 'react-router-dom'; -import { Localize } from '@deriv/translations'; + import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; + import getRoutesConfig from '../../Constants/routes-config'; import { TBinaryRoutes, TRoute } from '../../Types'; + import RouteWithSubRoutes from './route-with-sub-routes'; const BinaryRoutes = observer((props: TBinaryRoutes) => { diff --git a/packages/account/src/Components/Routes/helpers.ts b/packages/account/src/Components/Routes/helpers.ts index 6d1798fc14c1..33427159d083 100644 --- a/packages/account/src/Components/Routes/helpers.ts +++ b/packages/account/src/Components/Routes/helpers.ts @@ -10,7 +10,7 @@ export const findRouteByPath = (path: string, routes_config?: TRouteConfig[]): R routes_config?.some(route_info => { let match_path: match | null = null; try { - match_path = matchPath(path, route_info); + match_path = matchPath(path, route_info as RouteProps); } catch (e: unknown) { if (/undefined/.test((e as Error).message)) { return undefined; @@ -18,7 +18,7 @@ export const findRouteByPath = (path: string, routes_config?: TRouteConfig[]): R } if (match_path) { - result = route_info; + result = route_info as RouteProps; return true; } else if (route_info.routes) { result = findRouteByPath(path, route_info.routes); diff --git a/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-form.spec.tsx b/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-form.spec.tsx new file mode 100644 index 000000000000..0b1f9dc9affe --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-form.spec.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { AdditionalKycInfoForm } from '../additional-kyc-info-form'; +import userEvent from '@testing-library/user-event'; +import { useSettings } from '@deriv/api'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useSettings: jest.fn(), +})); + +const mockedUseSettings = useSettings as jest.MockedFunction; + +const mock_settings: ReturnType = { + update: jest.fn(), + mutation: { isLoading: false, isSuccess: false, error: null, isError: false }, + data: { + tax_identification_number: '', + tax_residence: '', + place_of_birth: '', + account_opening_reason: '', + }, +}; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + generateValidationFunction: jest.fn(), +})); + +describe('AdditionalKycInfoForm', () => { + const setError = jest.fn(); + const mock_store = mockStore({}); + + it('should render the form fields', () => { + mockedUseSettings.mockReturnValue(mock_settings); + render( + + + + ); + + expect(screen.getByTestId('dt_place_of_birth')).toBeInTheDocument(); + expect(screen.getByTestId('dt_tax_residence')).toBeInTheDocument(); + expect(screen.getByTestId('dt_tax_identification_number')).toBeInTheDocument(); + expect(screen.getByTestId('dt_account_opening_reason')).toBeInTheDocument(); + }); + + it('should render loading state upon fetching data', () => { + mockedUseSettings.mockReturnValue({ ...mock_settings, isLoading: true }); + render( + + + + ); + + expect(screen.getByTestId('dt_initial_loader')).toBeInTheDocument(); + }); + + it('should submit the form when all fields are valid', async () => { + mockedUseSettings.mockReturnValue(mock_settings); + render( + + + + ); + + const submit_btn = screen.getByRole('button', { name: 'Submit' }); + + userEvent.type(screen.getByTestId('dt_place_of_birth'), 'Ghana'); + userEvent.type(screen.getByTestId('dt_tax_residence'), 'Ghana'); + userEvent.type(screen.getByTestId('dt_tax_identification_number'), 'GHA-000000000-0'); + userEvent.type(screen.getByTestId('dt_account_opening_reason'), 'Speculative'); + + await waitFor(() => { + expect(submit_btn).toBeEnabled(); + }); + userEvent.click(screen.getByRole('button', { name: 'Submit' })); + + expect(mockedUseSettings).toHaveBeenCalled(); + }); + + it('should be able to submit the form without filling optional fields', async () => { + mockedUseSettings.mockReturnValue(mock_settings); + render( + + + + ); + + const submit_btn = screen.getByRole('button', { name: 'Submit' }); + + userEvent.type(screen.getByTestId('dt_place_of_birth'), 'Ghana'); + userEvent.type(screen.getByTestId('dt_account_opening_reason'), 'Speculative'); + + await waitFor(() => { + expect(submit_btn).toBeEnabled(); + }); + userEvent.click(screen.getByRole('button', { name: 'Submit' })); + + expect(mockedUseSettings).toHaveBeenCalled(); + }); + + it('should show an error message if form validation fails', async () => { + mockedUseSettings.mockReturnValue({ + ...mock_settings, + mutation: { + ...mock_settings.mutation, + isError: true, + status: 'error', + error: { + message: 'Invalid TIN format', + }, + }, + }); + render( + + + + ); + + const submit_btn = screen.getByRole('button', { name: 'Submit' }); + + userEvent.type(screen.getByTestId('dt_place_of_birth'), 'Ghana'); + userEvent.type(screen.getByTestId('dt_tax_residence'), 'Ghana'); + userEvent.type(screen.getByTestId('dt_tax_identification_number'), 'GHA-00000000'); + userEvent.type(screen.getByTestId('dt_account_opening_reason'), 'Speculative'); + + userEvent.click(submit_btn); + + expect(mockedUseSettings).toHaveBeenCalled(); + expect(setError).toHaveBeenCalled(); + }); +}); diff --git a/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-modal.spec.tsx b/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-modal.spec.tsx new file mode 100644 index 000000000000..13decd303a3c --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/__test__/additional-kyc-info-modal.spec.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { AdditionalKycInfoModal } from '../additional-kyc-info-modal'; + +jest.mock('../additional-kyc-info-form.tsx', () => jest.fn(() =>
AdditionalKycInfoForm
)); + +describe('AdditionalKycInfoModal', () => { + let modal_root_el: HTMLElement; + const mock_store = mockStore({ + ui: { + is_additional_kyc_info_modal_open: true, + toggleAdditionalKycInfoModal: jest.fn(), + }, + }); + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + afterAll(() => { + document.body.removeChild(modal_root_el); + }); + + it('should render the modal when is_additional_kyc_info_modal_open is true', () => { + render( + + + + ); + expect(screen.getByText(/additional information required/i)).toBeInTheDocument(); + expect(screen.getByText(/AdditionalKycInfoForm/i)).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/additional-kyc-info-modal/__test__/form-config.spec.tsx b/packages/account/src/Components/additional-kyc-info-modal/__test__/form-config.spec.tsx new file mode 100644 index 000000000000..015cb169b86d --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/__test__/form-config.spec.tsx @@ -0,0 +1,67 @@ +import { GetSettings, ResidenceList } from '@deriv/api-types'; +import { getFormFieldsConfig, getFormConfig, TFields } from '../form-config'; + +const mockAccountSettings: GetSettings = { + immutable_fields: ['place_of_birth'], + place_of_birth: 'UK', + tax_residence: 'UK', + tax_identification_number: '12345', + account_opening_reason: 'Hedging', +}; + +const mockResidenceList: ResidenceList = [ + { value: 'UK', text: 'United Kingdom' }, + { value: 'US', text: 'United States' }, +]; + +describe('getFormFieldsConfig', () => { + it('should return the correct form fields configuration', () => { + const requiredFields: TFields[] = ['place_of_birth', 'tax_residence']; + const config = getFormFieldsConfig(mockAccountSettings, mockResidenceList, requiredFields); + + expect(config.place_of_birth.type).toBe('select'); + expect(config.place_of_birth.initial_value).toBe('United Kingdom'); + expect(config.place_of_birth.disabled).toBe(true); + expect(config.place_of_birth.required).toBe(true); + + expect(config.tax_residence.type).toBe('select'); + expect(config.tax_residence.initial_value).toBe('United Kingdom'); + expect(config.tax_residence.disabled).toBe(false); + expect(config.tax_residence.required).toBe(true); + }); +}); + +describe('getFormConfig', () => { + it('should return the correct form configuration', () => { + const requiredFields: TFields[] = ['place_of_birth', 'tax_residence']; + const formConfig = getFormConfig({ + account_settings: mockAccountSettings, + residence_list: mockResidenceList, + required_fields: requiredFields, + }); + + expect(formConfig.fields.place_of_birth.disabled).toBe(true); + expect(formConfig.fields.place_of_birth.required).toBe(true); + + expect(formConfig.fields.tax_residence.disabled).toBe(false); + expect(formConfig.fields.tax_residence.required).toBe(true); + }); + + it('should return the correct form configuration with input types', () => { + const requiredFields: TFields[] = ['place_of_birth', 'tax_residence']; + const formConfig = getFormConfig({ + account_settings: { ...mockAccountSettings, immutable_fields: ['place_of_birth', 'tax_residence'] }, + residence_list: mockResidenceList, + required_fields: requiredFields, + with_input_types: true, + }); + + expect(formConfig.fields.place_of_birth.type).toBe('select'); + expect(formConfig.fields.place_of_birth.disabled).toBe(true); + expect(formConfig.fields.place_of_birth.required).toBe(true); + + expect(formConfig.fields.tax_residence.type).toBe('select'); + expect(formConfig.fields.tax_residence.disabled).toBe(true); + expect(formConfig.fields.tax_residence.required).toBe(true); + }); +}); diff --git a/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-form.tsx b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-form.tsx new file mode 100644 index 000000000000..e0f4eef52830 --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-form.tsx @@ -0,0 +1,161 @@ +import { Button, Loading, Modal, Text } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import classNames from 'classnames'; +import { Form, Formik } from 'formik'; +import React from 'react'; +import { useSettings } from '@deriv/api'; +import { OECD_TIN_FORMAT_URL } from '../../Constants/external-urls'; +import FormFieldInfo from '../form-field-info'; +import { FormInputField } from '../forms/form-fields'; +import FormSelectField from '../forms/form-select-field'; +import { TListItem, getFormConfig } from './form-config'; + +const FormTitle = () => ( + + + +); + +type TAdditionalKycInfoFormProps = { + setError?: React.Dispatch>; +}; + +export const AdditionalKycInfoForm = observer(({ setError }: TAdditionalKycInfoFormProps) => { + const { client, ui, notifications } = useStore(); + const { residence_list, updateAccountStatus } = client; + const { + update, + mutation: { isLoading, error, status }, + data: account_settings, + isLoading: isAccountSettingsLoading, + } = useSettings(); + + const { fields, initialValues, validate } = getFormConfig({ + account_settings, + residence_list, + required_fields: ['place_of_birth', 'account_opening_reason'], + }); + + const onSubmit = (values: typeof initialValues) => { + const place_of_birth = residence_list?.find(item => item.text === values.place_of_birth)?.value; + + const payload: Record = { + place_of_birth, + account_opening_reason: values.account_opening_reason, + }; + + if (values.tax_identification_number) { + payload.tax_identification_number = values.tax_identification_number; + } + + if (values.tax_residence) { + const tax_residence = residence_list?.find(item => item.text === values.tax_residence)?.value; + payload.tax_residence = tax_residence; + } + + update(payload); + }; + + React.useEffect(() => { + if (status === 'success') { + updateAccountStatus(); + notifications.refreshNotifications(); + ui.toggleAdditionalKycInfoModal(); + ui.toggleKycInformationSubmittedModal(); + } else if (status === 'error') { + setError?.(error); + } + }, [error, notifications, setError, status, ui, updateAccountStatus]); + + if (isAccountSettingsLoading) { + return ; + } + + return ( + + {({ isValid, setFieldValue }) => ( +
+ {isLoading ? ( + + ) : ( +
+ +
+ +
+
+ + + } + /> +
+
+ + , +
, + ]} + /> + } + /> +
+
+ { + setFieldValue('account_opening_reason', value, true); + }} + list_height='6rem' + {...fields.account_opening_reason} + /> +
+
+ )} + + + + + )} +
+ ); +}); + +AdditionalKycInfoForm.displayName = 'AdditionalKycInfoForm'; + +export default AdditionalKycInfoForm; diff --git a/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.scss b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.scss new file mode 100644 index 000000000000..873a8703237f --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.scss @@ -0,0 +1,91 @@ +.dc-modal { + &__container { + &_additional-kyc-info { + &-header { + border-bottom: 2px solid var(--general-section-1); + } + + &-footer { + padding: 1.6rem 0 0; + margin: unset; + } + + .inline-message { + margin: 0.8rem 1.6rem; + width: calc(100% - 3.2rem); + justify-content: flex-start; + } + } + } +} + +.additional-kyc-info-modal { + &__portal-header { + padding: 2.5rem 2rem; + } + + &__form { + padding: unset; + height: 100%; + position: relative; + + @include mobile { + width: 100%; + } + + &--header { + margin: 1.6rem 0 2.4rem; + + @include mobile { + padding: 0; + } + } + + .dc-dropdown-list { + margin: 1rem 0; + } + + &-layout { + display: flex; + flex-direction: column; + height: 100%; + + &--fields { + display: flex; + flex-direction: column; + padding: 0 24.4rem; + + @include mobile { + padding: 0 1.6rem; + } + } + } + + &-field { + margin-bottom: 3.2rem; + + &--info { + display: flex; + align-items: baseline; + gap: 0.8rem; + } + } + + &-action { + padding: 1.6rem 2.4rem; + + @include mobile { + position: absolute; + bottom: 0; + width: 100%; + padding: 1.6rem; + } + + .dc-btn { + @include mobile { + width: 100%; + } + } + } + } +} diff --git a/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.tsx b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.tsx new file mode 100644 index 000000000000..5b3f86785759 --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/additional-kyc-info-modal.tsx @@ -0,0 +1,107 @@ +import { + DesktopWrapper, + Div100vhContainer, + InlineMessage, + MobileWrapper, + Modal, + PageOverlay, + Text, + UILoader, +} from '@deriv/components'; +import { getPlatformSettings } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import React from 'react'; +import AdditionalKycInfoForm from './additional-kyc-info-form'; + +type TAdditionalKycInfoFormWithHintBox = { + error?: unknown; + setError?: React.Dispatch>; +}; + +const AdditionalKycInfoFormWithHintBox = ({ error, setError }: TAdditionalKycInfoFormWithHintBox) => { + return ( + + {!!error && ( + + )} + + + ); +}; + +export const AdditionalKycInfoModal = observer(() => { + const { + ui: { is_additional_kyc_info_modal_open: is_open, toggleAdditionalKycInfoModal }, + } = useStore(); + const [error, setError] = React.useState(''); + + const toggleModal = (e?: React.MouseEvent | undefined) => { + // if e.target is anchor tag, don't close modal for link click within modal + const target = e?.target as HTMLElement; + if (target.tagName === 'A') e?.stopPropagation(); + toggleAdditionalKycInfoModal(); + }; + + const mt5_platform_settings = getPlatformSettings('mt5'); + + const ModalTitle = () => ( + + ); + + return ( + }> +
+ + } + toggleModal={toggleModal} + className='additional-kyc-info' + width='90.4rem' + height={error ? '54.4rem' : '49.6rem'} + > + + + + + + + + + + } + onClickClose={toggleAdditionalKycInfoModal} + header_classname='additional-kyc-info-modal__portal-header' + > + + + + + +
+
+ ); +}); + +AdditionalKycInfoModal.displayName = 'AdditionalKycInfoModal'; diff --git a/packages/account/src/Components/additional-kyc-info-modal/form-config.tsx b/packages/account/src/Components/additional-kyc-info-modal/form-config.tsx new file mode 100644 index 000000000000..9b1bcd5a3c3b --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/form-config.tsx @@ -0,0 +1,259 @@ +import React from 'react'; +import { GetSettings, ResidenceList } from '@deriv/api-types'; +import { Localize, localize } from '@deriv/translations'; +import { generateValidationFunction } from '@deriv/shared'; + +// Type for the list of items in a dropdown or select +export type TListItem = { + /** + * The text of the item (e.g. 'United Kingdom', 'Germany', etc.) + */ + text: string; + /** + * The value of the item + */ + value: string; +}; + +export type TFields = 'place_of_birth' | 'tax_residence' | 'tax_identification_number' | 'account_opening_reason'; + +type ReqRule = ['req', React.ReactNode]; + +type LengthRule = ['length', React.ReactNode, { min: number; max: number }]; + +type RegularRule = ['regular', React.ReactNode, { regex: RegExp }]; + +type CustomValidator = ( + value: string, + /** + * The options passed to the validation function + */ + options: Record, + /** + * The values of all fields in the form + */ + values: Record +) => React.ReactNode; + +type CustomRule = [CustomValidator, React.ReactNode]; + +type Rule = ReqRule | LengthRule | RegularRule | CustomRule; + +type TInputConfig = { + label: React.ReactNode; + /** + * The type of the input field (e.g. 'text', 'password', 'select', etc.) + */ + type?: string; + initial_value: string; + required?: boolean; + disabled?: boolean; + placeholder?: string; + /** + * The list of items for the dropdown or select + */ + list_items?: TListItem[]; + /** + * The validation rules for the input field (e.g. 'req', 'length', 'regular', etc.) + */ + rules?: Array; +}; + +export type TGetField = Omit & { name: string }; + +export type TFormFieldsConfig = { + [key in TFields]: TInputConfig; +}; + +/** + * The base config for form fields with validation rules + * every field should have label, type, initial_value, disabled, required, placeholder, list_items, rules + * + * `list_items` is used for dropdowns and select + * @returns TFormFieldsConfig + */ +export const getFormFieldsConfig = ( + account_settings: GetSettings, + residence_list: ResidenceList, + required_fields: TFields[] +) => { + /** + * Check if the field is disabled based on the immutable_fields from API + */ + const isFieldDisabled = (field: string) => account_settings?.immutable_fields?.includes(field); + + /** + * Check if the field is required based on the required_fields array passed + */ + const isFieldRequired = (field: TFields) => required_fields.includes(field); + + const config: TFormFieldsConfig = { + place_of_birth: { + label: ( + + ), + type: 'select', + initial_value: + (account_settings.place_of_birth && + residence_list.find(item => item.value === account_settings.place_of_birth)?.text) ?? + '', + disabled: isFieldDisabled('place_of_birth'), + required: isFieldRequired('place_of_birth'), + list_items: residence_list as TListItem[], + rules: [['req', ]], + }, + tax_residence: { + label: ( + + ), + type: 'select', + initial_value: + (account_settings.tax_residence && + residence_list.find(item => item.value === account_settings.tax_residence)?.text) ?? + '', + disabled: isFieldDisabled('tax_residence'), + required: isFieldRequired('tax_residence'), + list_items: residence_list as TListItem[], + rules: [], + }, + tax_identification_number: { + label: ( + + ), + type: 'text', + initial_value: account_settings.tax_identification_number ?? '', + disabled: isFieldDisabled('tax_identification_number'), + required: isFieldRequired('tax_identification_number'), + rules: [ + [ + 'length', + , + { min: 0, max: 25 }, + ], + [ + // check if the TIN value is available, then perform the regex test + // else return true (to pass the test) + // this is to allow empty string to pass the test in case of optioal TIN field + (value: string) => (value ? RegExp(/^(?!^$|\s+)[A-Za-z0-9./\s-]{0,25}$/).test(value) : true), + localize('Letters, numbers, spaces, periods, hyphens and forward slashes only.'), + ], + [ + (value, options, { tax_residence }) => { + return value ? !!tax_residence : true; + }, + , + ], + [ + (value: string, options, { tax_residence }) => { + const tin_format = residence_list.find( + res => res.text === tax_residence && res.tin_format + )?.tin_format; + return value && tin_format + ? tin_format.some(tax_regex => new RegExp(tax_regex).test(value)) + : true; + }, + , + ], + ], + }, + account_opening_reason: { + label: ( + + ), + type: 'select', + initial_value: account_settings.account_opening_reason ?? '', + disabled: isFieldDisabled('account_opening_reason'), + required: isFieldRequired('account_opening_reason'), + list_items: [ + { + text: localize('Hedging'), + value: 'Hedging', + }, + { + text: localize('Income Earning'), + value: 'Income Earning', + }, + { + text: localize('Speculative'), + value: 'Speculative', + }, + ], + rules: [ + [ + 'req', + , + ], + ], + }, + }; + return config; +}; + +/** + * Generate initial values for form fields + */ +const generateInitialValues = (fields: ReturnType) => { + const initial_values: Record = {} as Record; + (Object.keys(fields) as TFields[]).forEach(field => { + initial_values[field] = fields[field].initial_value; + }); + return initial_values; +}; + +/** + * This function is used to transform form fields config to the format that is used in Formik or Formik Field + */ +const getField = (fields: TFormFieldsConfig, name: TFields, with_input_types: boolean): TGetField => { + const { label, placeholder, required, disabled, type, list_items } = fields[name]; + + return { + name, + label, + required, + disabled, + ...(with_input_types ? { type } : {}), + ...(placeholder ? { placeholder } : {}), + ...(list_items ? { list_items } : {}), + }; +}; + +/** + * Function to transform and return form config that can be used within the component that renders the form + */ +export const getFormConfig = (options: { + account_settings: GetSettings; + residence_list: ResidenceList; + required_fields: TFields[]; + with_input_types?: boolean; +}) => { + const { account_settings, residence_list, required_fields, with_input_types = false } = options; + const fields_config = getFormFieldsConfig(account_settings, residence_list, required_fields); + const inputs: Record = {} as Record; + Object.keys(fields_config).forEach(field_key => { + // @ts-expect-error `field_key` is always a key of `fields_config`, Hence can ignore the TS error. + inputs[field_key] = getField(fields_config, field_key, with_input_types); + }); + return { + fields: inputs, + /** typing fields_config as any as this current config has different structure + * and generateValidationFunction should have generic types + * */ + validate: generateValidationFunction('', fields_config as any), + initialValues: generateInitialValues(fields_config), + }; +}; diff --git a/packages/account/src/Components/additional-kyc-info-modal/index.ts b/packages/account/src/Components/additional-kyc-info-modal/index.ts new file mode 100644 index 000000000000..8d987c7f7f09 --- /dev/null +++ b/packages/account/src/Components/additional-kyc-info-modal/index.ts @@ -0,0 +1,4 @@ +import { AdditionalKycInfoModal } from './additional-kyc-info-modal'; +import './additional-kyc-info-modal.scss'; + +export default AdditionalKycInfoModal; diff --git a/packages/account/src/Components/address-details/__tests__/address-details.spec.tsx b/packages/account/src/Components/address-details/__tests__/address-details.spec.tsx index 96cd85212e52..abdf3767e41a 100644 --- a/packages/account/src/Components/address-details/__tests__/address-details.spec.tsx +++ b/packages/account/src/Components/address-details/__tests__/address-details.spec.tsx @@ -1,8 +1,11 @@ import React from 'react'; -import { FormikProps, FormikValues } from 'formik'; +import { FormikProps } from 'formik'; import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { isDesktop, isMobile, PlatformContext } from '@deriv/shared'; -import AddressDetails from '../address-details'; +import { useStatesList } from '@deriv/hooks'; +import { isDesktop, isMobile } from '@deriv/shared'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import AddressDetails, { TAddressDetailFormProps } from '../address-details'; +import { TStores } from '@deriv/stores/types'; jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), @@ -19,6 +22,11 @@ jest.mock('../../real-account-signup/helpers/utils.ts', () => ({ })), })); +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useStatesList: jest.fn(() => ({ data: [], isFetched: true })), +})); + jest.mock('@deriv/components', () => { const original_module = jest.requireActual('@deriv/components'); @@ -45,19 +53,16 @@ describe('', () => { let modal_root_el: HTMLDivElement; const mock_props: React.ComponentProps = { - fetchStatesList: jest.fn(() => Promise.resolve([])), getCurrentStep: jest.fn(), goToNextStep: jest.fn(), goToPreviousStep: jest.fn(), - has_real_account: false, is_gb_residence: '', - is_svg: true, onCancel: jest.fn(), onSave: jest.fn(), onSubmit: jest.fn(), - onSubmitEnabledChange: jest.fn(), - selected_step_ref: { current: { isSubmitting: false } } as React.RefObject>, - states_list: [], + selected_step_ref: { current: { isSubmitting: false } } as React.RefObject< + FormikProps + >, value: { address_city: '', address_line_1: '', @@ -67,10 +72,12 @@ describe('', () => { }, validate: jest.fn(), disabled_items: [], + has_real_account: false, }; + const store = mockStore({}); + const svgCommonRenderCheck = () => { - expect(mock_props.onSubmitEnabledChange).toHaveBeenCalledTimes(1); expect(screen.getByLabelText(address_line_1_marked)).toBeInTheDocument(); expect(screen.getByLabelText(address_line_2)).toBeInTheDocument(); expect(screen.getByLabelText(address_postcode)).toBeInTheDocument(); @@ -84,6 +91,14 @@ describe('', () => { expect(screen.queryByLabelText(address_town)).not.toBeInTheDocument(); }; + const renderComponent = ({ props = mock_props, store_config = store }) => { + return render( + + + + ); + }; + beforeEach(() => { (isDesktop as jest.Mock).mockReturnValue(true); (isMobile as jest.Mock).mockReturnValue(false); @@ -101,10 +116,15 @@ describe('', () => { }); it('should render AddressDetails component for mobile', async () => { - (isDesktop as jest.Mock).mockReturnValue(false); - (isMobile as jest.Mock).mockReturnValue(true); + const new_store_config: TStores = { + ...store, + ui: { + ...store.ui, + is_mobile: true, + }, + }; - render(); + renderComponent({ store_config: new_store_config }); await waitFor(() => { svgCommonRenderCheck(); @@ -117,33 +137,18 @@ describe('', () => { expect(required_fields).toHaveLength(2); }); - it('should call fetchResidenceList if states list is empty', async () => { - render(); - expect(mock_props.fetchStatesList).toHaveBeenCalled(); - }); - - it('should not call fetchResidenceList if states list is empty', async () => { - render( - - ); - - expect(mock_props.fetchStatesList).not.toHaveBeenCalled(); - expect(screen.queryByText('mockedLoading')).not.toBeInTheDocument(); - }); - it('should show a loader when states list is not fully fetched', async () => { - render(); + (useStatesList as jest.Mock).mockReturnValue({ + data: [], + isFetched: false, + }); + + renderComponent({}); expect(screen.getByText('mockedLoading')).toBeInTheDocument(); }); it('should render AddressDetails component and trigger buttons', async () => { - render(); + renderComponent({}); await waitFor(() => { svgCommonRenderCheck(); @@ -202,80 +207,26 @@ describe('', () => { }); }); - it('should render AddressDetails component not svg', async () => { - mock_props.is_svg = false; - - render(); - - expect(mock_props.onSubmitEnabledChange).toHaveBeenCalledTimes(1); - - const inputs: HTMLTextAreaElement[] = screen.getAllByRole('textbox'); - expect(inputs).toHaveLength(5); - const required_fields = inputs.filter(input => input.required === true); - expect(required_fields).toHaveLength(0); - - await waitFor(() => { - expect(screen.getByLabelText(address_line_1)).toBeInTheDocument(); - expect(screen.getByLabelText(address_line_2)).toBeInTheDocument(); - expect(screen.getByLabelText(address_postcode)).toBeInTheDocument(); - expect(screen.getByLabelText(address_state)).toBeInTheDocument(); - expect(screen.getByLabelText(address_town)).toBeInTheDocument(); - expect(screen.getByText(use_address_info)).toBeInTheDocument(); - }); - - expect(screen.queryByText(address_line_1_marked)).not.toBeInTheDocument(); - expect(screen.queryByText(address_line_2_marked)).not.toBeInTheDocument(); - expect(screen.queryByText(address_postcode_marked)).not.toBeInTheDocument(); - expect(screen.queryByText(address_town_marked)).not.toBeInTheDocument(); - expect(screen.queryByText(verification_info)).not.toBeInTheDocument(); - }); - - it('should render AddressDetails component for appstore', async () => { - render( - - - - ); - - expect(mock_props.onSubmitEnabledChange).toHaveBeenCalledTimes(1); - await waitFor(() => { - expect(screen.getByText(verification_info)).toBeInTheDocument(); - }); - expect(screen.queryByText(use_address_info)).not.toBeInTheDocument(); - - const inputs: HTMLTextAreaElement[] = screen.getAllByRole('textbox'); - expect(inputs).toHaveLength(5); - - const required_fields = inputs.filter(input => input.required === true); - expect(required_fields).toHaveLength(4); - - expect(screen.getByLabelText(address_line_1_marked)).toBeInTheDocument(); - expect(screen.getByLabelText(address_line_2_marked)).toBeInTheDocument(); - expect(screen.getByLabelText(address_postcode_marked)).toBeInTheDocument(); - expect(screen.getByLabelText(address_state)).toBeInTheDocument(); - expect(screen.getByLabelText(address_town_marked)).toBeInTheDocument(); - expect(screen.getByText(verification_info)).toBeInTheDocument(); - - expect(screen.queryByText(address_line_1)).not.toBeInTheDocument(); - expect(screen.queryByText(address_line_2)).not.toBeInTheDocument(); - expect(screen.queryByText(address_postcode)).not.toBeInTheDocument(); - expect(screen.queryByText(address_town)).not.toBeInTheDocument(); - expect(screen.queryByText(use_address_info)).not.toBeInTheDocument(); - }); - it('should render AddressDetails component with states_list for mobile', async () => { (isDesktop as jest.Mock).mockReturnValue(false); (isMobile as jest.Mock).mockReturnValue(true); - - mock_props.states_list = [ - { text: 'State 1', value: 'State 1' }, - { text: 'State 2', value: 'State 2' }, - ]; - - render(); + (useStatesList as jest.Mock).mockReturnValue({ + data: [ + { text: 'State 1', value: 'State 1' }, + { text: 'State 2', value: 'State 2' }, + ], + isFetched: true, + }); + const new_store_config: TStores = { + ...store, + ui: { + ...store.ui, + is_mobile: true, + }, + }; + renderComponent({ store_config: new_store_config }); expect(screen.getByText('Default test state')).toBeInTheDocument(); - const address_state_input: HTMLInputElement = screen.getByRole('combobox'); expect(address_state_input.value).toBe(''); fireEvent.change(address_state_input, { target: { value: 'State 2' } }); @@ -285,12 +236,14 @@ describe('', () => { }); it('should render AddressDetails component with states_list for desktop', async () => { - mock_props.states_list = [ - { text: 'State 1', value: 'State 1' }, - { text: 'State 2', value: 'State 2' }, - ]; - - render(); + (useStatesList as jest.Mock).mockReturnValue({ + data: [ + { text: 'State 1', value: 'State 1' }, + { text: 'State 2', value: 'State 2' }, + ], + isFetched: true, + }); + renderComponent({}); const address_state_input: HTMLTextAreaElement = screen.getByRole('textbox', { name: 'State/Province' }); expect(address_state_input).toHaveValue('Default test state'); @@ -300,18 +253,21 @@ describe('', () => { }); }); - it('should disable the field if it is immuatble from BE', async () => { - mock_props.disabled_items = ['address_line_1', 'address_line_2']; - mock_props.value.address_state = ''; + it('should disable the field if it is immutable from BE', async () => { + const new_props: React.ComponentProps = { + ...mock_props, + disabled_items: ['address_line_1', 'address_line_2'], + value: { ...mock_props.value, address_state: '' }, + }; - render(); + renderComponent({ props: new_props }); - expect(screen.getByLabelText(address_line_1)).toBeDisabled(); + expect(screen.getByLabelText(address_line_1_marked)).toBeDisabled(); expect(screen.getByLabelText(address_line_2)).toBeDisabled(); await waitFor(() => { expect(screen.getByRole('textbox', { name: 'State/Province' })).toBeEnabled(); }); - expect(screen.getByLabelText(address_town)).toBeEnabled(); + expect(screen.getByLabelText(address_town_marked)).toBeEnabled(); expect(screen.getByLabelText(address_postcode)).toBeEnabled(); }); }); diff --git a/packages/account/src/Components/address-details/address-details.tsx b/packages/account/src/Components/address-details/address-details.tsx index 0125c81be508..07a71265283a 100644 --- a/packages/account/src/Components/address-details/address-details.tsx +++ b/packages/account/src/Components/address-details/address-details.tsx @@ -1,58 +1,63 @@ import React from 'react'; -import { Formik, Field, FormikProps, FormikValues } from 'formik'; +import classNames from 'classnames'; +import { + Formik, + Field, + FormikProps, + FormikValues, + FormikErrors, + FormikHelpers, + FormikHandlers, + FormikState, +} from 'formik'; import { StatesList } from '@deriv/api-types'; import { - Modal, Autocomplete, AutoHeightWrapper, DesktopWrapper, Div100vhContainer, FormSubmitButton, - Input, Loading, MobileWrapper, - ThemedScrollbars, + Modal, SelectNative, Text, + ThemedScrollbars, } from '@deriv/components'; +import { useStatesList } from '@deriv/hooks'; +import { getLocation } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import { localize, Localize } from '@deriv/translations'; -import { isDesktop, isMobile, getLocation, makeCancellablePromise, PlatformContext } from '@deriv/shared'; +import { FormInputField } from '../forms/form-fields'; import { splitValidationResultTypes } from '../real-account-signup/helpers/utils'; -import classNames from 'classnames'; + +export type TAddressDetailFormProps = { + address_line_1: string; + address_line_2?: string; + address_city: string; + address_state?: string; + address_postcode?: string; +}; type TAddressDetails = { disabled_items: string[]; states_list: StatesList; getCurrentStep?: () => number; - onSave: (current_step: number, values: FormikValues) => void; + onSave: (current_step: number, values: TAddressDetailFormProps) => void; onCancel: (current_step: number, goToPreviousStep: () => void) => void; goToNextStep: () => void; goToPreviousStep: () => void; - validate: (values: FormikValues) => FormikValues; + validate: (values: TAddressDetailFormProps) => TAddressDetailFormProps; onSubmit: ( current_step: number | null, - values: FormikValues, + values: TAddressDetailFormProps, action: (isSubmitting: boolean) => void, next_step: () => void ) => void; - is_svg: boolean; - is_mf?: boolean; is_gb_residence: boolean | string; + selected_step_ref?: React.RefObject>; + value: TAddressDetailFormProps; has_real_account: boolean; - onSubmitEnabledChange: (is_submit_disabled: boolean) => void; - selected_step_ref?: React.RefObject>; - fetchStatesList: () => Promise; - value: FormikValues; -}; - -type TInputField = { - name: string; - required?: boolean | string; - label: string; - maxLength?: number | string; - placeholder: string; - onChange?: (e: any) => void; - disabled?: string; }; type TAutoComplete = { @@ -60,122 +65,104 @@ type TAutoComplete = { text: string; }; -const InputField = (props: TInputField) => { - return ( - - {({ field, form: { errors, touched } }: FormikValues) => ( - - - - )} - - ); -}; - -const AddressDetails = ({ - states_list, - getCurrentStep, - onSave, - onCancel, - goToNextStep, - goToPreviousStep, - validate, - onSubmit, - is_svg, - is_mf, - is_gb_residence, - onSubmitEnabledChange, - selected_step_ref, - disabled_items, - has_real_account, - ...props -}: TAddressDetails) => { - const { is_appstore } = React.useContext(PlatformContext); - const [has_fetched_states_list, setHasFetchedStatesList] = React.useState(false); - const [address_state_to_display, setAddressStateToDisplay] = React.useState(''); +/** + * Component to display address details form + * @name AddressDetails + * @param getCurrentStep - function to get current step + * @param states_list - array of states for the selected residence country + * @param onSave - function to save form values + * @param onCancel - function to cancel form values + * @param goToNextStep - function to go to next step + * @param goToPreviousStep - function to go to previous step + * @param validate - function to validate form values + * @param onSubmit - function to submit form values + * @param is_gb_residence - is residence Great Britan + * @param selected_step_ref - reference to selected step + * @param value - form values + * @param disabled_items - array of disabled fields + * @param has_real_account - has real account + * @returns react node + */ +const AddressDetails = observer( + ({ + getCurrentStep, + onSave, + onCancel, + goToNextStep, + goToPreviousStep, + validate, + onSubmit, + is_gb_residence, + selected_step_ref, + disabled_items, + has_real_account, + ...props + }: TAddressDetails) => { + const [address_state_to_display, setAddressStateToDisplay] = React.useState(''); - React.useEffect(() => { - let cancelFn: (() => void) | undefined; - if (states_list.length) { - setHasFetchedStatesList(true); - } else { - const { cancel, promise } = makeCancellablePromise(props.fetchStatesList()); - cancelFn = cancel; - promise.then(() => { - setHasFetchedStatesList(true); - if (props.value?.address_state) { - setAddressStateToDisplay(getLocation(states_list, props.value?.address_state, 'text')); - } - }); - } - return () => { - setHasFetchedStatesList(false); - if (cancelFn) { - cancelFn(); - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + const { + ui, + client: { residence }, + } = useStore(); - const is_submit_disabled_ref = React.useRef(true); + const { is_desktop, is_mobile } = ui; + const { data: states_list, isFetched } = useStatesList(residence); - const isSubmitDisabled = (errors?: { [key: string]: string } | FormikValues) => { - return selected_step_ref?.current?.isSubmitting || (errors && Object.keys(errors).length > 0); - }; - - const checkSubmitStatus = (errors?: { [key: string]: string } | FormikValues) => { - const is_submit_disabled = isSubmitDisabled(errors); + const isSubmitDisabled = (errors: FormikErrors = {}): boolean => { + const is_submitting = selected_step_ref?.current?.isSubmitting ?? false; + return is_submitting || Object.keys(errors).length > 0; + }; - if (is_submit_disabled_ref.current !== is_submit_disabled) { - is_submit_disabled_ref.current = is_submit_disabled; - onSubmitEnabledChange?.(!is_submit_disabled); - } - }; + const handleCancel = (values: TAddressDetailFormProps) => { + const current_step = (getCurrentStep?.() || 1) - 1; + onSave(current_step, values); + onCancel(current_step, goToPreviousStep); + }; - const handleCancel = (values: FormikValues) => { - const current_step = (getCurrentStep?.() || 1) - 1; - onSave(current_step, values); - onCancel(current_step, goToPreviousStep); - }; + const handleValidate = (values: TAddressDetailFormProps) => { + const { errors } = splitValidationResultTypes(validate(values)); + return errors; + }; - const handleValidate = (values: FormikValues) => { - const { errors } = splitValidationResultTypes(validate(values)); - checkSubmitStatus(errors); - return errors; - }; + const handleSubmitData = (values: TAddressDetailFormProps, actions: FormikHelpers) => { + if (values.address_state && states_list.length) { + values.address_state = address_state_to_display + ? getLocation(states_list, address_state_to_display, 'value') + : getLocation(states_list, values.address_state, 'value'); + } + onSubmit((getCurrentStep?.() || 1) - 1, values, actions.setSubmitting, goToNextStep); + }; - return ( - { - if (values.address_state && states_list.length) { - values.address_state = address_state_to_display - ? getLocation(states_list, address_state_to_display, 'value') - : getLocation(states_list, values.address_state, 'value'); - } - onSubmit((getCurrentStep?.() || 1) - 1, values, actions.setSubmitting, goToNextStep); - }} - > - {({ handleSubmit, errors, values, setFieldValue, handleChange, setFieldTouched }: FormikValues) => ( - - {({ setRef, height }: { setRef: (instance: HTMLFormElement) => void; height: number | string }) => ( -
- - {!is_appstore && ( + return ( + + {({ + handleSubmit, + errors, + values, + setFieldValue, + handleChange, + setFieldTouched, + }: FormikHandlers & FormikHelpers & FormikState) => ( + + {({ + setRef, + height, + }: { + setRef: (instance: HTMLFormElement) => void; + height: number | string; + }) => ( + + - )} - - {is_appstore && ( -
- - {localize( - 'We need this for verification. If the information you provide is fake or inaccurate, you won’t be able to deposit and withdraw.' - )} - -
- )} -
- - - - {!has_fetched_states_list && ( -
- -
- )} - {states_list?.length > 0 ? ( - - {({ field }: FormikValues) => ( - <> - - { - setFieldValue( - 'address_state', - value ? text : '', - true - ); - setAddressStateToDisplay(''); - }} - list_portal_id={is_appstore ? '' : 'modal_root'} - disabled={ - disabled_items.includes('address_state') || - (props.value?.address_state && has_real_account) - } - /> - - - { - setFieldValue( - 'address_state', - e.target.value, - true - ); - setAddressStateToDisplay(''); - }} - disabled={ - disabled_items.includes('address_state') || - (props.value?.address_state && has_real_account) - } - /> - - - )} - - ) : ( - // Fallback to input field when states list is empty / unavailable for country - +
+ - )} - { - setFieldTouched('address_postcode', true); - handleChange(e); - }} - disabled={ - disabled_items.includes('address_postcode') || - (props.value?.address_postcode && has_real_account) - } - /> -
- - - - handleCancel(values)} - /> - - - )} - - )} - - ); -}; + + + {!isFetched && ( +
+ +
+ )} + {states_list?.length > 0 ? ( + + {({ field }: FormikValues) => ( + + + { + setFieldValue( + 'address_state', + value ? text : '', + true + ); + setAddressStateToDisplay(''); + }} + list_portal_id='modal_root' + disabled={ + disabled_items.includes('address_state') || + (props.value?.address_state && has_real_account) + } + /> + + + { + setFieldValue( + 'address_state', + e.target.value, + true + ); + setAddressStateToDisplay(''); + }} + disabled={ + disabled_items.includes('address_state') || + (props.value?.address_state && has_real_account) + } + /> + + + )} + + ) : ( + // Fallback to input field when states list is empty / unavailable for country + + )} + { + setFieldTouched('address_postcode', true); + handleChange(e); + }} + disabled={ + disabled_items.includes('address_postcode') || + (props.value?.address_postcode && has_real_account) + } + /> +
+
+
+ + handleCancel(values)} + /> + + + )} +
+ )} +
+ ); + } +); export default AddressDetails; diff --git a/packages/account/src/Components/api-token/__tests__/api-token-delete-button.spec.tsx b/packages/account/src/Components/api-token/__tests__/api-token-delete-button.spec.tsx index e793a005c07d..8be4495af5af 100644 --- a/packages/account/src/Components/api-token/__tests__/api-token-delete-button.spec.tsx +++ b/packages/account/src/Components/api-token/__tests__/api-token-delete-button.spec.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { screen, render, waitFor, act } from '@testing-library/react'; +import { screen, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import ApiTokenContext from '../api-token-context'; import ApiTokenDeleteButton from '../api-token-delete-button'; diff --git a/packages/account/src/Components/api-token/api-token-table-row-token-cell.tsx b/packages/account/src/Components/api-token/api-token-table-row-token-cell.tsx index 38d3d3730016..6913a4f5a712 100644 --- a/packages/account/src/Components/api-token/api-token-table-row-token-cell.tsx +++ b/packages/account/src/Components/api-token/api-token-table-row-token-cell.tsx @@ -10,8 +10,8 @@ type TApiTokenTableRowTokenCell = { const HiddenPasswordDots = () => (
- {[...Array(15)].map((el, index) => ( -
+ {Array.from(Array(15).keys()).map(element => ( +
))}
); diff --git a/packages/account/src/Components/currency-selector/__tests__/currency-selector.spec.tsx b/packages/account/src/Components/currency-selector/__tests__/currency-selector.spec.tsx index f5342532bb5f..06153456282c 100644 --- a/packages/account/src/Components/currency-selector/__tests__/currency-selector.spec.tsx +++ b/packages/account/src/Components/currency-selector/__tests__/currency-selector.spec.tsx @@ -1,13 +1,8 @@ import React from 'react'; import { fireEvent, screen, render, waitFor } from '@testing-library/react'; -import { isDesktop, isMobile, PlatformContext } from '@deriv/shared'; -import CurrencySelector, { TCurrencySelector } from '../currency-selector'; - -jest.mock('@deriv/shared', () => ({ - ...jest.requireActual('@deriv/shared'), - isDesktop: jest.fn().mockReturnValue(false), - isMobile: jest.fn().mockReturnValue(false), -})); +import { StoreProvider, mockStore } from '@deriv/stores'; +import CurrencySelector from '../currency-selector'; +import { TStores } from '@deriv/stores/types'; jest.mock('../../real-account-signup/helpers/utils.ts', () => ({ splitValidationResultTypes: jest.fn(() => ({ @@ -17,197 +12,22 @@ jest.mock('../../real-account-signup/helpers/utils.ts', () => ({ })); describe('', () => { - const props: TCurrencySelector = { - accounts: { - VRTC90000010: { - account_type: 'trading', - currency: 'USD', - is_disabled: 0, - is_virtual: 1, - landing_company_shortcode: 'virtual', - trading: {}, - token: '', - email: '', - session_start: 1651059038, - excluded_until: '', - landing_company_name: 'virtual', - residence: 'es', - balance: 10000, - accepted_bch: 0, - }, - }, - legal_allowed_currencies: [ - { - value: 'EUR', - fractional_digits: 2, - is_deposit_suspended: 0, - is_suspended: 0, - is_withdrawal_suspended: 0, - name: 'Euro', - stake_default: 10, - transfer_between_accounts: { - fees: { - AUD: 0, - }, - limits: { - max: 4717.96, - min: 0.94, - }, - limits_dxtrade: { - max: 2358.45, - min: 0.01, - }, - limits_mt5: { - max: 14150.68, - min: 0.01, - }, - }, - type: 'fiat', - }, - { - value: 'USD', - fractional_digits: 2, - is_deposit_suspended: 0, - is_suspended: 0, - is_withdrawal_suspended: 0, - name: 'US Dollar', - stake_default: 10, - transfer_between_accounts: { - fees: { - AUD: 0, - }, - limits: { - max: 5000, - min: 1, - }, - limits_dxtrade: { - max: 2500, - min: 0.01, - }, - limits_mt5: { - max: 15000, - min: 0.01, - }, - }, - type: 'fiat', - }, - { - value: 'USDC', - fractional_digits: 2, - is_deposit_suspended: 0, - is_suspended: 0, - is_withdrawal_suspended: 0, - name: 'USD Coin', - stake_default: 10, - transfer_between_accounts: { - fees: { - AUD: 2, - }, - limits: { - max: 5001.52, - min: 1, - }, - limits_dxtrade: { - max: 2500.76, - min: 0.01, - }, - limits_mt5: { - max: 15004.55, - min: 0.01, - }, - }, - type: 'crypto', - }, - { - value: 'eUSDT', - fractional_digits: 2, - is_deposit_suspended: 0, - is_suspended: 0, - is_withdrawal_suspended: 0, - name: 'Tether ERC20', - stake_default: 10, - transfer_between_accounts: { - fees: { - AUD: 2, - }, - limits: { - max: 5001.78, - min: 1, - }, - limits_dxtrade: { - max: 2500.89, - min: 0.01, - }, - limits_mt5: { - max: 15005.33, - min: 0.01, - }, - }, - type: 'crypto', - }, - ], - has_fiat: true, + const mock_props: React.ComponentProps = { value: { currency: '', }, validate: jest.fn(), is_virtual: true, - available_crypto_currencies: [ - { - value: 'eUSDT', - fractional_digits: 2, - is_deposit_suspended: 0, - is_suspended: 0, - is_withdrawal_suspended: 0, - name: 'Tether ERC20', - stake_default: 10, - transfer_between_accounts: { - fees: { - AUD: 2, - }, - limits: { - max: 5001.78, - min: 1, - }, - limits_dxtrade: { - max: 2500.89, - min: 0.01, - }, - limits_mt5: { - max: 15005.33, - min: 0.01, - }, - }, - type: 'crypto', - }, - ], getCurrentStep: jest.fn(() => 1), onSave: jest.fn(), onCancel: jest.fn(), - real_account_signup: { - active_modal_index: -1, - previous_currency: '', - current_currency: '', - success_message: '', - error_message: '', - error_code: 2, - }, goToNextStep: jest.fn(), goToStep: jest.fn(), - resetRealAccountSignupParams: jest.fn(), onSubmit: jest.fn(), goToPreviousStep: jest.fn(), has_cancel: false, - has_currency: false, - has_real_account: false, has_wallet_account: false, - is_appstore: false, - is_dxtrade_allowed: false, - is_eu: false, - is_mt5_allowed: false, set_currency: false, - onSubmitEnabledChange: jest.fn(), - real_account_signup_target: '', }; const fiat_msg = @@ -221,7 +41,7 @@ describe('', () => { const mt5_non_eu = '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 Deriv MT5 account.'; - const runCommonTests = msg => { + const runCommonTests = (msg: string) => { expect(screen.getByRole('heading', { name: /fiat currencies/i })).toBeInTheDocument(); expect(screen.getByRole('radio', { name: /us dollar \(usd\)/i })).toBeInTheDocument(); expect(screen.getByRole('radio', { name: /euro \(eur\)/i })).toBeInTheDocument(); @@ -241,78 +61,302 @@ describe('', () => { expect(screen.getByText(msg)).toBeInTheDocument(); expect(screen.getByRole('button', { name: /next/i })).toBeEnabled(); }; + const store = mockStore({ + client: { + accounts: { + VRTC90000010: { + account_type: 'trading', + currency: 'USD', + is_disabled: 0, + is_virtual: 1, + landing_company_shortcode: 'virtual', + trading: {}, + token: '', + email: '', + session_start: 1651059038, + landing_company_name: 'virtual', + residence: 'es', + balance: 10000, + accepted_bch: 0, + }, + }, + upgradeable_currencies: [ + { + value: 'EUR', + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'Euro', + stake_default: 10, + transfer_between_accounts: { + fees: { + AUD: 0, + }, + limits: { + max: 4717.96, + min: 0.94, + }, + limits_dxtrade: { + max: 2358.45, + min: 0.01, + }, + limits_mt5: { + max: 14150.68, + min: 0.01, + }, + }, + type: 'fiat', + }, + { + value: 'USD', + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'US Dollar', + stake_default: 10, + transfer_between_accounts: { + fees: { + AUD: 0, + }, + limits: { + max: 5000, + min: 1, + }, + limits_dxtrade: { + max: 2500, + min: 0.01, + }, + limits_mt5: { + max: 15000, + min: 0.01, + }, + }, + type: 'fiat', + }, + { + value: 'USDC', + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'USD Coin', + stake_default: 10, + transfer_between_accounts: { + fees: { + AUD: 2, + }, + limits: { + max: 5001.52, + min: 1, + }, + limits_dxtrade: { + max: 2500.76, + min: 0.01, + }, + limits_mt5: { + max: 15004.55, + min: 0.01, + }, + }, + type: 'crypto', + }, + { + value: 'eUSDT', + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'Tether ERC20', + stake_default: 10, + transfer_between_accounts: { + fees: { + AUD: 2, + }, + limits: { + max: 5001.78, + min: 1, + }, + limits_dxtrade: { + max: 2500.89, + min: 0.01, + }, + limits_mt5: { + max: 15005.33, + min: 0.01, + }, + }, + type: 'crypto', + }, + ], + available_crypto_currencies: [ + { + value: 'eUSDT', + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'Tether ERC20', + stake_default: 10, + transfer_between_accounts: { + fees: { + AUD: 2, + }, + limits: { + max: 5001.78, + min: 1, + }, + limits_dxtrade: { + max: 2500.89, + min: 0.01, + }, + limits_mt5: { + max: 15005.33, + min: 0.01, + }, + }, + type: 'crypto', + }, + ], + }, + ui: { + real_account_signup: { + active_modal_index: -1, + previous_currency: '', + current_currency: '', + success_message: '', + error_message: '', + error_code: '2', + }, + }, + }); + + const renderComponent = ({ props = mock_props, store_config = store }) => { + return render( + + + + ); + }; + + it('should render Currency selector', () => { + renderComponent({}); - it('should render currencyselector', () => { - render(); expect(screen.getByTestId('currency_selector_form')).toBeInTheDocument(); }); it('should render Fiat currencies and submit the form', async () => { - render(); + renderComponent({}); + runCommonTests(fiat_msg); fireEvent.click(screen.getByRole('button', { name: /next/i })); await waitFor(() => { - expect(props.onSubmit).toHaveBeenCalled(); - expect(props.onSubmit).toHaveBeenCalledWith( + expect(mock_props.onSubmit).toHaveBeenCalled(); + expect(mock_props.onSubmit).toHaveBeenCalledWith( 0, { currency: 'USD' }, expect.any(Function), - props.goToNextStep + mock_props.goToNextStep ); }); }); it('should disable fiat if user already have a fiat ', () => { - const new_props = { - ...props, - accounts: { - VRTC90000010: { - account_type: 'trading', - currency: 'USD', - is_disabled: 0, - is_virtual: 1, - landing_company_shortcode: 'svg', - trading: {}, - token: '', - email: '', - session_start: 1651059038, - excluded_until: '', - landing_company_name: 'svg', - residence: 'es', - balance: 10000, - accepted_bch: 0, + const new_store: TStores = { + ...store, + client: { + ...store.client, + accounts: { + VRTC90000010: { + account_type: 'trading', + currency: 'USD', + is_disabled: 0, + is_virtual: 1, + landing_company_shortcode: 'svg', + trading: {}, + token: '', + email: '', + session_start: 1651059038, + excluded_until: '', + landing_company_name: 'svg', + residence: 'es', + balance: 10000, + accepted_bch: 0, + }, }, + has_active_real_account: true, + has_fiat: true, + }, + ui: { + ...store.ui, + real_account_signup_target: 'svg', }, - has_real_account: true, - real_account_signup_target: 'svg', }; - render(); + renderComponent({ store_config: new_store }); expect(screen.getByRole('radio', { name: /us dollar \(usd\)/i })).toBeDisabled(); expect(screen.getByRole('radio', { name: /euro \(eur\)/i })).toBeDisabled(); }); + it('should render Fiat currencies when is_dxtrade_allowed and is_mt5_allowed are true', () => { - render(); + const new_store = { + ...store, + client: { + ...store.client, + is_dxtrade_allowed: true, + is_mt5_allowed: true, + }, + }; + renderComponent({ store_config: new_store }); runCommonTests(dxtrade_non_eu_msg); }); it('should render Fiat currencies when is_dxtrade_allowed,is_eu and is_mt5_allowed are true', () => { - render(); + const new_store: TStores = { + ...store, + client: { + ...store.client, + is_dxtrade_allowed: true, + is_mt5_allowed: true, + is_eu: true, + }, + }; + renderComponent({ store_config: new_store }); runCommonTests(dxtrade_eu_msg); }); it('should render Fiat currencies when is_mt5_allowed and is_eu are true', () => { - render(); + const new_store: TStores = { + ...store, + client: { + ...store.client, + is_mt5_allowed: true, + is_eu: true, + }, + }; + renderComponent({ store_config: new_store }); runCommonTests(mt5_eu); }); it('should render Fiat currencies when is_mt5_allowed is true', () => { - render(); + const new_store: TStores = { + ...store, + client: { + ...store.client, + is_mt5_allowed: true, + }, + }; + renderComponent({ store_config: new_store }); runCommonTests(mt5_non_eu); }); it('should render Cryptocurrencies and submit the form ', async () => { - render(); + const new_props: React.ComponentProps = { + ...mock_props, + set_currency: true, + }; + renderComponent({ props: new_props }); expect(screen.getByRole('heading', { name: /cryptocurrencies/i })).toBeInTheDocument(); expect(screen.getByRole('radio', { name: /tether erc20 \(eusdt\)/i })).toBeInTheDocument(); expect(screen.getByRole('radio', { name: /usd coin \(usdc\)/i })).toBeInTheDocument(); @@ -332,57 +376,54 @@ describe('', () => { fireEvent.click(set_currency_btn); await waitFor(() => { - expect(props.onSubmit).toHaveBeenCalledWith( + expect(mock_props.onSubmit).toHaveBeenCalledWith( 0, { currency: 'eUSDT' }, expect.any(Function), - props.goToNextStep + mock_props.goToNextStep ); }); }); it('should submit the form when getCurrentStep is not passed ', async () => { - const new_props: TCurrencySelector = { ...props }; - render(); + renderComponent({}); runCommonTests(fiat_msg); fireEvent.click(screen.getByRole('button', { name: /next/i })); await waitFor(() => { - expect(props.onSubmit).toHaveBeenCalled(); - }); - }); - - it('should render the selector__container with proper div height when appstore is true', () => { - (isMobile as jest.Mock).mockReturnValue(true); - (isDesktop as jest.Mock).mockReturnValue(false); - Object.defineProperty(window, 'innerHeight', { - writable: true, - configurable: true, - value: 150, + expect(mock_props.onSubmit).toHaveBeenCalled(); }); - render( - - - - ); - - expect(screen.getByTestId('currency_selector_form').childNodes[0]).toHaveStyle('height: calc(150px - 222px);'); }); it('should render the selector__container with proper div height', () => { - (isMobile as jest.Mock).mockReturnValue(true); - (isDesktop as jest.Mock).mockReturnValue(false); Object.defineProperty(window, 'innerHeight', { writable: true, configurable: true, value: 150, }); - render(); + const new_store = { + ...store, + client: { + ...store.client, + has_active_real_account: true, + }, + ui: { + ...store.ui, + is_desktop: false, + is_mobile: true, + }, + }; + renderComponent({ store_config: new_store }); expect(screen.getByTestId('currency_selector_form').childNodes[0]).toHaveStyle('height: calc(150px - 89px);'); }); it('should call handleCancel when previous button is called', () => { - render(); + const new_props: React.ComponentProps = { + ...mock_props, + has_wallet_account: true, + has_cancel: true, + }; + renderComponent({ props: new_props }); const usdc: HTMLInputElement = screen.getByRole('radio', { name: /usd coin \(usdc\)/i }); expect(usdc.checked).toEqual(false); @@ -393,28 +434,39 @@ describe('', () => { const prev_btn = screen.getByRole('button', { name: /previous/i }); expect(prev_btn).toBeInTheDocument(); fireEvent.click(prev_btn); - expect(props.onSave).toHaveBeenCalledWith(0, { currency: 'USDC' }); + expect(mock_props.onSave).toHaveBeenCalledWith(0, { currency: 'USDC' }); }); it('should bypass to next step in case of personal details form error', () => { - const real_account_signup = { - ...props.real_account_signup, - error_details: { first_name: 'numbers not allowed' }, + const new_store: TStores = { + ...store, + ui: { + ...store.ui, + real_account_signup: { + ...store.ui.real_account_signup, + error_details: { first_name: 'numbers not allowed' }, + }, + }, }; + renderComponent({ store_config: new_store }); - render(); - expect(props.goToNextStep).toHaveBeenCalled(); - expect(props.resetRealAccountSignupParams).toHaveBeenCalled(); + expect(mock_props.goToNextStep).toHaveBeenCalled(); + expect(store.ui.resetRealAccountSignupParams).toHaveBeenCalled(); }); it('should bypass to address step in case of address details form error', () => { - const real_account_signup = { - ...props.real_account_signup, - error_details: { address_line_1: 'po box is not allowed' }, + const new_store: TStores = { + ...store, + ui: { + ...store.ui, + real_account_signup: { + ...store.ui.real_account_signup, + error_details: { address_line_1: 'po box is not allowed' }, + }, + }, }; - - render(); - expect(props.goToStep).toHaveBeenCalledWith(3); - expect(props.resetRealAccountSignupParams).toHaveBeenCalled(); + renderComponent({ store_config: new_store }); + expect(mock_props.goToStep).toHaveBeenCalledWith(3); + expect(store.ui.resetRealAccountSignupParams).toHaveBeenCalled(); }); }); diff --git a/packages/account/src/Components/currency-selector/__tests__/ust-popover.spec.tsx b/packages/account/src/Components/currency-selector/__tests__/ust-popover.spec.tsx new file mode 100644 index 000000000000..c19deee7262d --- /dev/null +++ b/packages/account/src/Components/currency-selector/__tests__/ust-popover.spec.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import USTPopover from '../ust-popover'; + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + Popover: jest.fn(props => {props.message}), +})); + +describe('', () => { + it('should render USTPopover with UST info', () => { + render(); + + expect(screen.getByText(/Tether as an Omni token \(USDT\)/i)).toBeInTheDocument(); + }); + + it('should render USTPopover with tUSDT info', () => { + render(); + + expect(screen.getByText(/Tether as a TRC20 token \(tUSDT\)/i)).toBeInTheDocument(); + }); + + it('should render USTPopover with default info', () => { + render(); + + expect(screen.getByText(/Tether as an ERC20 token \(eUSDT\)/i)).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/currency-selector/currency-selector.tsx b/packages/account/src/Components/currency-selector/currency-selector.tsx index 37d9b0b89264..c24a372da174 100644 --- a/packages/account/src/Components/currency-selector/currency-selector.tsx +++ b/packages/account/src/Components/currency-selector/currency-selector.tsx @@ -1,294 +1,313 @@ +import React from 'react'; import classNames from 'classnames'; -import React, { HTMLAttributes, RefObject } from 'react'; -import { Field, Formik, FormikHandlers, FormikProps, FormikState, FormikValues } from 'formik'; +import { Field, Formik, FormikHandlers, FormikProps, FormikState } from 'formik'; +import { WebsiteStatus } from '@deriv/api-types'; import { AutoHeightWrapper, FormSubmitButton, Div100vhContainer, Modal, ThemedScrollbars } from '@deriv/components'; -import { - getPlatformSettings, - isMobile, - isDesktop, - reorderCurrencies, - PlatformContext, - getAddressDetailsFields, -} from '@deriv/shared'; +import { getPlatformSettings, reorderCurrencies, getAddressDetailsFields } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import { localize, Localize } from '@deriv/translations'; -import RadioButtonGroup from './radio-button-group'; import RadioButton from './radio-button'; +import RadioButtonGroup from './radio-button-group'; import { splitValidationResultTypes } from '../real-account-signup/helpers/utils'; -import { TAuthAccountInfo, TCurrencyConfig, TRealAccount, TFormValidation } from 'Types'; export const Hr = () =>
; +const CURRENCY_TYPE: Record = { + CRYPTO: 'crypto', + FIAT: 'fiat', +}; + +export type TCurrencySelectorFormProps = { + currency: string; +}; + type TCurrencySelectorExtend = { - accounts: { [key: string]: TAuthAccountInfo }; - available_crypto_currencies: TCurrencyConfig[]; getCurrentStep: () => number; goToNextStep: () => void; goToStep: (step: number) => void; goToPreviousStep: () => void; has_cancel: boolean; - has_currency: boolean; - has_fiat: boolean; - has_real_account: boolean; has_wallet_account: boolean; - is_appstore: boolean; - is_dxtrade_allowed: boolean; - is_eu: boolean; is_virtual: boolean; - is_mt5_allowed: boolean; - legal_allowed_currencies: TCurrencyConfig[]; onCancel: (current_step: number, goToPreviousStep: () => void) => void; - onSave: (current_step: number, values: FormikValues) => void; + onSave: (current_step: number, values: TCurrencySelectorFormProps) => void; onSubmit: ( current_step: number | null, - values: FormikValues, + values: TCurrencySelectorFormProps, action: (isSubmitting: boolean) => void, next_step: () => void ) => void; - onSubmitEnabledChange: (is_submit_disabled: boolean) => void; - real_account_signup: TRealAccount; - real_account_signup_target: string; - resetRealAccountSignupParams: () => void; - selected_step_ref?: RefObject>; + selected_step_ref?: React.RefObject>; set_currency: boolean; - validate: (values: FormikValues) => FormikValues; - value: FormikValues; + validate: (values: TCurrencySelectorFormProps) => TCurrencySelectorFormProps; + value: TCurrencySelectorFormProps; }; -type TCurrencySelector = HTMLAttributes & TCurrencySelectorExtend; +type TCurrencySelector = React.HTMLAttributes & TCurrencySelectorExtend; -const CurrencySelector = ({ - getCurrentStep, - goToNextStep, - goToStep, - has_currency, - has_real_account, - legal_allowed_currencies, - onSubmit, - onSave, - onCancel, - goToPreviousStep, - real_account_signup, - real_account_signup_target, - resetRealAccountSignupParams, - set_currency, - validate, - has_cancel = false, - selected_step_ref, - onSubmitEnabledChange, - has_wallet_account, - is_dxtrade_allowed, - is_mt5_allowed, - available_crypto_currencies, - has_fiat, - accounts, - is_eu, - ...props -}: TCurrencySelector) => { - const { is_appstore } = React.useContext(PlatformContext); - const crypto = legal_allowed_currencies.filter((currency: TCurrencyConfig) => currency.type === 'crypto'); - const fiat = legal_allowed_currencies.filter((currency: TCurrencyConfig) => currency.type === 'fiat'); - const [is_bypass_step, setIsBypassStep] = React.useState(false); - const is_submit_disabled_ref = React.useRef(true); +/** + * Currency selector component to select the Account currency + * @name CurrencySelector + * @param getCurrentStep - Get the current step + * @param goToNextStep - Go to the next step + * @param goToStep - Go to a specific step + * @param goToPreviousStep - Go to the previous step + * @param has_cancel - Has cancel button + * @param has_wallet_account - Has wallet account + * @param is_virtual - Is virtual account + * @param onCancel - To handle click on cancel button + * @param onSave - To handle click on save button + * @param onSubmit - To handle click on submit button + * @param selected_step_ref - Ref of the selected step + * @param set_currency - Is current set + * @param alidate - To validate the form + * @param alue - Value of the form + * @returns React node + */ +const CurrencySelector = observer( + ({ + getCurrentStep, + goToNextStep, + goToStep, + onSubmit, + onSave, + onCancel, + goToPreviousStep, + set_currency, + validate, + has_cancel = false, + selected_step_ref, + has_wallet_account, + value, + }: TCurrencySelector) => { + const { client, ui } = useStore(); + + const { + currency, + has_active_real_account: has_real_account, + upgradeable_currencies: legal_allowed_currencies, + available_crypto_currencies, + is_dxtrade_allowed, + is_mt5_allowed, + has_fiat, + accounts, + is_eu, + } = client; + + const has_currency = Boolean(currency); + + const { real_account_signup, real_account_signup_target, resetRealAccountSignupParams, is_desktop, is_mobile } = + ui; + + // Wrapped with String() to avoid type mismatch + const crypto = legal_allowed_currencies.filter( + selected_currency => String(selected_currency.type) === CURRENCY_TYPE.CRYPTO + ); - const should_disable_fiat = !!Object.values(accounts).filter( - item => item.landing_company_shortcode === real_account_signup_target - ).length; + // Wrapped with String() to avoid type mismatch + const fiat = legal_allowed_currencies.filter( + selected_currency => String(selected_currency.type) === CURRENCY_TYPE.FIAT + ); + const [is_bypass_step, setIsBypassStep] = React.useState(false); - const isSubmitDisabled = (values: FormikValues) => { - return selected_step_ref?.current?.isSubmitting || !values.currency; - }; + const should_disable_fiat = !!Object.values(accounts).filter( + item => item.landing_company_shortcode === real_account_signup_target + ).length; - const checkSubmitStatus = (values: FormikValues) => { - const is_submit_disabled = isSubmitDisabled(values); + const isSubmitDisabled = (values: TCurrencySelectorFormProps) => { + return selected_step_ref?.current?.isSubmitting || !values.currency; + }; - if (is_submit_disabled_ref.current !== is_submit_disabled) { - is_submit_disabled_ref.current = is_submit_disabled; - onSubmitEnabledChange?.(!is_submit_disabled); - } - }; + const handleCancel = (values: TCurrencySelectorFormProps) => { + const current_step = getCurrentStep() - 1; + onSave(current_step, values); + onCancel(current_step, goToPreviousStep); + }; - const handleCancel = (values: FormikValues) => { - const current_step = getCurrentStep() - 1; - onSave(current_step, values); - onCancel(current_step, goToPreviousStep); - }; + const handleValidate = (values: TCurrencySelectorFormProps) => { + const { errors } = splitValidationResultTypes(validate(values)); + return errors; + }; - const handleValidate = (values: FormikValues) => { - checkSubmitStatus(values); - const { errors }: Partial = splitValidationResultTypes(validate(values)); - return errors; - }; + // In case of form error bypass to update personal data + React.useEffect(() => { + if (real_account_signup?.error_code) { + setIsBypassStep(true); + } + }, [real_account_signup?.error_code]); - // In case of form error bypass to update personal data - React.useEffect(() => { - if (real_account_signup?.error_code) { - setIsBypassStep(true); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + React.useEffect(() => { + if (is_bypass_step && real_account_signup?.error_details) { + const keys = Object.keys(real_account_signup?.error_details); + const route_to_address_details = Object.keys(getAddressDetailsFields()).filter(item => + keys.includes(item) + ); + if (route_to_address_details?.length > 0) { + goToStep(3); + } else { + goToNextStep(); + } + resetRealAccountSignupParams(); + setIsBypassStep(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [is_bypass_step]); - React.useEffect(() => { - if (is_bypass_step && real_account_signup?.error_details) { - const keys = Object.keys(real_account_signup?.error_details); - const route_to_address_details = Object.keys(getAddressDetailsFields()).filter(item => keys.includes(item)); - if (route_to_address_details?.length > 0) goToStep(3); - else { - goToNextStep(); + const getHeightOffset = () => { + if (!has_currency && has_real_account) { + return '89px'; } - resetRealAccountSignupParams(); - setIsBypassStep(false); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [is_bypass_step]); + return '159px'; + }; - const getHeightOffset = () => { - if (is_appstore) { - return '222px'; - } else if (!has_currency && has_real_account) { - return '89px'; - } - return '159px'; - }; + const getSubmitLabel = () => { + if (set_currency) { + return localize('Set currency'); + } else if (has_wallet_account) { + return localize('Finish'); + } + return localize('Next'); + }; - const getSubmitLabel = () => { - if (set_currency) { - return localize('Set currency'); - } else if (has_wallet_account) { - return localize('Finish'); - } - return localize('Next'); - }; + const description = React.useMemo(() => { + const dmt5_label = is_eu ? localize('CFDs') : localize('Deriv MT5'); + const platform_name_dxtrade = getPlatformSettings('dxtrade').name; - const description = React.useMemo(() => { - const dmt5_label = is_eu ? localize('CFDs') : localize('Deriv MT5'); - const platform_name_dxtrade = getPlatformSettings('dxtrade').name; + if (is_dxtrade_allowed && is_mt5_allowed) { + return ( + + ); + } else if (!is_dxtrade_allowed && is_mt5_allowed) { + return ( + + ); + } - if (is_dxtrade_allowed && is_mt5_allowed) { return ( - + ); - } else if (!is_dxtrade_allowed && is_mt5_allowed) { - return ( - - ); - } + }, [is_eu, is_dxtrade_allowed, is_mt5_allowed]); return ( - - ); - }, [is_eu, is_dxtrade_allowed, is_mt5_allowed]); - - return ( - { - onSubmit(getCurrentStep ? getCurrentStep() - 1 : null, values, actions.setSubmitting, goToNextStep); - }} - validate={handleValidate} - > - {({ handleSubmit, values }: FormikState & FormikHandlers) => ( - - {({ setRef, height }: { setRef: (instance: HTMLFormElement | null) => void; height: number }) => ( -
- { + onSubmit(getCurrentStep ? getCurrentStep() - 1 : null, values, actions.setSubmitting, goToNextStep); + }} + validate={handleValidate} + > + {({ handleSubmit, values }: FormikState & FormikHandlers) => ( + + {({ + setRef, + height, + }: { + setRef: (instance: HTMLFormElement | null) => void; + height: number; + }) => ( + - - {!!reorderCurrencies(fiat)?.length && ( - - - {reorderCurrencies(fiat).map((currency: FormikValues) => ( - - ))} - - {!!reorderCurrencies(crypto, 'crypto')?.length &&
} -
- )} - {!!reorderCurrencies(crypto, 'crypto')?.length && ( - - - {reorderCurrencies(crypto, 'crypto').map((currency: FormikValues) => ( - value === currency.value - )?.length === 0 - } - name='currency' - id={currency.value} - label={currency.name} - /> - ))} - - - )} -
-
- - handleCancel(values), - } - : {})} - /> - -
- )} -
- )} -
- ); -}; -export type { TCurrencySelector }; + + + {!!fiat?.length && ( + + + {reorderCurrencies(fiat).map( + (avbl_currency: WebsiteStatus['currencies_config']) => ( + + ) + )} + + {!!reorderCurrencies(crypto, 'crypto')?.length &&
} +
+ )} + {!!reorderCurrencies(crypto, 'crypto')?.length && ( + + + {reorderCurrencies(crypto, 'crypto').map(avbl_currency => ( + + crypto_data.value === avbl_currency.value + )?.length === 0 + } + name='currency' + id={avbl_currency.value} + label={avbl_currency.name} + /> + ))} + + + )} +
+
+ + handleCancel(values), + } + : {})} + /> + + + )} + + )} + + ); + } +); export default CurrencySelector; diff --git a/packages/account/src/Components/currency-selector/index.js b/packages/account/src/Components/currency-selector/index.ts similarity index 100% rename from packages/account/src/Components/currency-selector/index.js rename to packages/account/src/Components/currency-selector/index.ts diff --git a/packages/account/src/Components/currency-selector/radio-button-group.tsx b/packages/account/src/Components/currency-selector/radio-button-group.tsx index 31ae2ab10ead..239c7b4000ad 100644 --- a/packages/account/src/Components/currency-selector/radio-button-group.tsx +++ b/packages/account/src/Components/currency-selector/radio-button-group.tsx @@ -13,10 +13,22 @@ export type TRadioButtonGroup = { has_fiat?: boolean; }; +/** + * Wrapper component for RadioButton + * @name RadioButtonGroup + * @param {string} className - class name for styling + * @param {boolean} is_fiat - is fiat currency + * @param {boolean} is_title_enabled - is title enabled + * @param {number} item_count - number of items + * @param {string} label - label for the radio button + * @param {React.ReactNode} description - description for the radio button + * @param {boolean} has_fiat - has fiat currency + * @returns {React.ReactNode} - returns a React node + */ const RadioButtonGroup = ({ + children, label, className, - children, is_title_enabled = true, is_fiat, item_count, diff --git a/packages/account/src/Components/currency-selector/radio-button.tsx b/packages/account/src/Components/currency-selector/radio-button.tsx index 903646d0dfe4..ccc2fd2110a0 100644 --- a/packages/account/src/Components/currency-selector/radio-button.tsx +++ b/packages/account/src/Components/currency-selector/radio-button.tsx @@ -1,60 +1,32 @@ -import React, { InputHTMLAttributes, AllHTMLAttributes, ReactElement } from 'react'; +import React, { AllHTMLAttributes } from 'react'; import classNames from 'classnames'; -import { Localize } from '@deriv/translations'; -import { Popover, Icon } from '@deriv/components'; +import { Icon } from '@deriv/components'; import { getCurrencyDisplayCode } from '@deriv/shared'; - -export type TUSTPopover = { - id: string; -}; +import USTPopover from './ust-popover'; type TRadioButtonExtend = { - field: InputHTMLAttributes; + field: React.InputHTMLAttributes; icon?: string; second_line_label?: string; + id: string; + label: string; + onClick?: (e: React.MouseEvent) => void; }; export type TRadioButton = AllHTMLAttributes & TRadioButtonExtend; -const USTPopover = ({ id }: TUSTPopover) => { - let popover_message: ReactElement | undefined; - if (/^UST$/i.test(id)) { - popover_message = ( - ]} - /> - ); - } else if (/^tUSDT$/i.test(id)) { - popover_message = ( - - ); - } else { - popover_message = ( - - ); - } - - return ( - - ); -}; +/** + * RadioButton component to select currency + * @name RadioButton + * @param {React.InputHTMLAttributes} field - field props given by Formik + * @param {string} icon - icon name + * @param {string} id - currency id + * @param {string} label - currency name + * @param {string} second_line_label - currency code + * @param {Function} onClick - function to be called on click + * @param {AllHTMLAttributes} props - other props to be passed + * @returns {React.ReactNode} - returns a React node + */ const RadioButton = ({ field: { name, value, onChange, onBlur }, diff --git a/packages/account/src/Components/currency-selector/ust-popover.tsx b/packages/account/src/Components/currency-selector/ust-popover.tsx new file mode 100644 index 000000000000..0a7f2443b676 --- /dev/null +++ b/packages/account/src/Components/currency-selector/ust-popover.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Popover } from '@deriv/components'; +import { Localize } from '@deriv/translations'; + +export type TUSTPopover = { + id: string; +}; + +const USTPopover = ({ id }: TUSTPopover) => { + let popover_message: React.ReactElement; + if (/^UST$/i.test(id)) { + popover_message = ( + ]} + /> + ); + } else if (/^tUSDT$/i.test(id)) { + popover_message = ( + + ); + } else { + popover_message = ( + + ); + } + + return ( + + ); +}; + +export default USTPopover; diff --git a/packages/account/src/Components/financial-details/__tests__/financial-details.spec.tsx b/packages/account/src/Components/financial-details/__tests__/financial-details.spec.tsx index 0096dd892061..b7683eef5b7f 100644 --- a/packages/account/src/Components/financial-details/__tests__/financial-details.spec.tsx +++ b/packages/account/src/Components/financial-details/__tests__/financial-details.spec.tsx @@ -1,8 +1,9 @@ +import { FormikValues } from 'formik'; import React from 'react'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { isDesktop, isMobile } from '@deriv/shared'; -import FinancialDetails, { TFinancialInformationAndTradingExperience, TFinancialDetails } from '../financial-details'; -import { FormikValues } from 'formik'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import FinancialDetails from '../financial-details'; jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), @@ -14,48 +15,8 @@ const modal_root_el = document.createElement('div'); modal_root_el.setAttribute('id', 'modal_root'); document.body.appendChild(modal_root_el); -const fields_enums: TFinancialInformationAndTradingExperience = { - account_turnover_enum: [ - { value: 'account turnover 1', text: 'account turnover 1' }, - { value: 'account turnover 2', text: 'account turnover 2' }, - ], - education_level_enum: [ - { value: 'education level 1', text: 'education level 1' }, - { value: 'education level 2', text: 'education level 2' }, - ], - employment_industry_enum: [ - { value: 'employment industry 1', text: 'employment industry 1' }, - { value: 'employment industry 2', text: 'employment industry 2' }, - ], - estimated_worth_enum: [ - { value: 'estimated worth 1', text: 'estimated worth 1' }, - { value: 'estimated worth 2', text: 'estimated worth 2' }, - ], - income_source_enum: [ - { value: 'income source 1', text: 'income source 1' }, - { value: 'income source 2', text: 'income source 2' }, - ], - net_income_enum: [ - { value: 'net income 1', text: 'net income 1' }, - { value: 'net income 2', text: 'net income 2' }, - ], - occupation_enum: [ - { value: 'occupation 1', text: 'occupation 1' }, - { value: 'occupation 2', text: 'occupation 2' }, - ], - - source_of_wealth_enum: [ - { value: 'source of wealth 1', text: 'source of wealth 1' }, - { value: 'source of wealth 2', text: 'source of wealth 2' }, - ], - employment_status_enum: [ - { value: 'employment status 1', text: 'employment status 1' }, - { value: 'employment status 2', text: 'employment status 2' }, - ], -}; - describe('', () => { - let mock_props: TFinancialDetails & TFinancialInformationAndTradingExperience = { + const mock_props: React.ComponentProps = { getCurrentStep: jest.fn(), goToNextStep: jest.fn(), onCancel: jest.fn(), @@ -64,32 +25,8 @@ describe('', () => { validate: jest.fn(() => ({ errors: {} })), goToPreviousStep: jest.fn(() => ({ errors: {} })), value: {}, - income_source_enum: [{}], - employment_status_enum: [{}], - employment_industry_enum: [{}], - occupation_enum: [{}], - source_of_wealth_enum: [{}], - education_level_enum: [{}], - net_income_enum: [{}], - estimated_worth_enum: [{}], - account_turnover_enum: [{}], - forex_trading_experience_enum: [{}], - forex_trading_frequency_enum: [{}], - binary_options_trading_experience_enum: [{}], - binary_options_trading_frequency_enum: [{}], - cfd_trading_experience_enum: [{}], - cfd_trading_frequency_enum: [{}], - other_instruments_trading_experience_enum: [{}], - other_instruments_trading_frequency_enum: [{}], }; - beforeEach(() => { - mock_props = { - ...mock_props, - ...fields_enums, - }; - }); - const fieldsRenderCheck = () => { expect(screen.getByText('Anticipated annual turnover')).toBeInTheDocument(); expect(screen.getByText('Estimated net worth')).toBeInTheDocument(); @@ -107,7 +44,7 @@ describe('', () => { fieldsRenderCheck(); const inputs = screen.getAllByTestId('dti_dropdown_display'); - expect(inputs.length).toBe(8); + expect(inputs).toHaveLength(8); expect(screen.getByText('Next')).toBeInTheDocument(); expect(screen.getByText('Previous')).toBeInTheDocument(); @@ -122,7 +59,7 @@ describe('', () => { fieldsRenderCheck(); const inputs = screen.getAllByRole('combobox'); - expect(inputs.length).toBe(8); + expect(inputs).toHaveLength(8); expect(screen.getByText('Next')).toBeInTheDocument(); expect(screen.getByText('Previous')).toBeInTheDocument(); @@ -185,4 +122,19 @@ describe('', () => { expect(mock_props.onSubmit).toHaveBeenCalledTimes(1); }); }); + + it('should change the selected value when user changes the value in the dropdown', () => { + (isDesktop as jest.Mock).mockReturnValue(false); + (isMobile as jest.Mock).mockReturnValue(true); + + render(); + + const select_inputs = screen.getAllByRole('combobox'); + + const income_source_select = select_inputs.find((option: FormikValues) => option.name === 'income_source'); + + userEvent.selectOptions(income_source_select as HTMLElement, 'Salaried Employee'); + + expect(screen.getByRole('option', { name: 'Salaried Employee' }).selected).toBe(true); + }); }); diff --git a/packages/account/src/Components/financial-details/financial-details-partials.tsx b/packages/account/src/Components/financial-details/financial-details-partials.tsx index 37bfc4a8e149..1887f19849d0 100644 --- a/packages/account/src/Components/financial-details/financial-details-partials.tsx +++ b/packages/account/src/Components/financial-details/financial-details-partials.tsx @@ -1,966 +1,135 @@ -import { Field, FormikProps, FormikValues } from 'formik'; +import { Field, FormikValues, useFormikContext } from 'formik'; import React from 'react'; import { DesktopWrapper, MobileWrapper, Dropdown, SelectNative } from '@deriv/components'; import { localize } from '@deriv/translations'; - -type TEmploymentStatus = { - employment_status_enum: object[]; -}; - -export const EmploymentStatus = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - employment_status_enum, -}: Partial> & TEmploymentStatus) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('employment_status', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TIncomeSource = { - income_source_enum: object[]; -}; - -export const IncomeSource = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - income_source_enum, -}: Partial> & TIncomeSource) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('income_source', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TEmploymentIndustry = { - employment_industry_enum: object[]; -}; - -export const EmploymentIndustry = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - employment_industry_enum, -}: Partial> & TEmploymentIndustry) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('employment_industry', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TOccupation = { - occupation_enum: object[]; -}; - -export const Occupation = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - occupation_enum, -}: Partial> & TOccupation) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('occupation', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TSourceOfWealth = { - source_of_wealth_enum: object[]; -}; - -export const SourceOfWealth = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - source_of_wealth_enum, -}: Partial> & TSourceOfWealth) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('source_of_wealth', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TEducationLevel = { - education_level_enum: object[]; -}; - -export const EducationLevel = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - education_level_enum, -}: Partial> & TEducationLevel) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('education_level', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TNetIncome = { - net_income_enum: object[]; -}; - -export const NetIncome = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - net_income_enum, -}: Partial> & TNetIncome) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('net_income', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TEstimatedWorth = { - estimated_worth_enum: object[]; -}; - -export const EstimatedWorth = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - estimated_worth_enum, -}: Partial> & TEstimatedWorth) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('estimated_worth', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TAccountTurnover = { - account_turnover_enum: object[]; -}; - -export const AccountTurnover = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - account_turnover_enum, -}: Partial> & TAccountTurnover) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('account_turnover', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TForexTradingExperience = { - forex_trading_experience_enum?: object[]; -}; - -export const ForexTradingExperience = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - forex_trading_experience_enum, -}: Partial> & TForexTradingExperience) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('forex_trading_experience', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TForexTradingFrequency = { - forex_trading_frequency_enum?: object[]; -}; - -export const ForexTradingFrequency = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - forex_trading_frequency_enum, -}: Partial> & TForexTradingFrequency) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('forex_trading_frequency', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TBinaryOptionsTradingExperience = { - binary_options_trading_experience_enum?: object[]; -}; - -export const BinaryOptionsTradingExperience = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - binary_options_trading_experience_enum, -}: Partial> & TBinaryOptionsTradingExperience) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('binary_options_trading_experience', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TBinaryOptionsTradingFrequency = { - binary_options_trading_frequency_enum?: object[]; -}; - -export const BinaryOptionsTradingFrequency = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - binary_options_trading_frequency_enum, -}: Partial> & TBinaryOptionsTradingFrequency) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('binary_options_trading_frequency', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TCFDTradingExperience = { - cfd_trading_experience_enum?: object[]; -}; - -export const CFDTradingExperience = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - cfd_trading_experience_enum, -}: Partial> & TCFDTradingExperience) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('cfd_trading_experience', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TCFDTradingFrequency = { - cfd_trading_frequency_enum?: object[]; -}; - -export const CFDTradingFrequency = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - cfd_trading_frequency_enum, -}: Partial> & TCFDTradingFrequency) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('cfd_trading_frequency', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TOtherInstrumentsTradingExperience = { - other_instruments_trading_experience_enum?: object[]; -}; - -export const OtherInstrumentsTradingExperience = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - other_instruments_trading_experience_enum, -}: Partial> & TOtherInstrumentsTradingExperience) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('other_instruments_trading_experience', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); - -type TOtherInstrumentsTradingFrequency = { - other_instruments_trading_frequency_enum?: object[]; -}; - -export const OtherInstrumentsTradingFrequency = ({ - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - other_instruments_trading_frequency_enum, -}: Partial> & TOtherInstrumentsTradingFrequency) => ( - - {({ field }: FormikValues) => ( - - - - - - ) => { - if (typeof handleChange === 'function') { - handleChange(e); - } - if (typeof setFieldValue === 'function') { - setFieldValue('other_instruments_trading_frequency', e.target.value, true); - } - }} - {...field} - required - /> - - - )} - -); +import { + getAccountTurnoverList, + getEducationLevelList, + getEmploymentIndustryList, + getEstimatedWorthList, + getIncomeSourceList, + getNetIncomeList, + getOccupationList, + getSourceOfWealthList, +} from 'Configs/financial-details-config'; + +type TFinancialDetailsDropdownFieldProps = { + dropdown_list: Array; + field_key: string; + placeholder?: string; + label: string; +}; + +/** + * Dropdown field for financial details form. + * @name FinancialDetailsDropdownField + * @param {Array} dropdown_list - list of dropdown items + * @param {string} field_key - field reference of the field + * @param {string} placeholder - placeholder of the field + * @param {string} label - label of the field + * @returns {JSX.Element} + */ +const FinancialDetailsDropdownField = ({ + dropdown_list, + field_key, + placeholder = localize('Please select'), + label, +}: TFinancialDetailsDropdownFieldProps) => { + const { values, handleChange, handleBlur, touched, errors, setFieldValue } = useFormikContext<{ + [key: string]: string; + }>(); + + return ( + + {({ field }: FormikValues) => ( + + + + + + ) => { + handleChange(e); + setFieldValue('field_key', e.target.value, true); + }} + {...field} + required + /> + + + )} + + ); +}; + +/** + * Wrapper for financial details form fields. + * @name FinancialInformation + * @returns {JSX.Element} + */ +const FinancialInformation = () => { + return ( + + + + + + + + + + + ); +}; + +export default FinancialInformation; diff --git a/packages/account/src/Components/financial-details/financial-details.tsx b/packages/account/src/Components/financial-details/financial-details.tsx index 9eed2b5c395f..54a25059229a 100644 --- a/packages/account/src/Components/financial-details/financial-details.tsx +++ b/packages/account/src/Components/financial-details/financial-details.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import { Formik, FormikValues } from 'formik'; +import { Formik } from 'formik'; import React from 'react'; import { AutoHeightWrapper, @@ -11,88 +11,50 @@ import { } from '@deriv/components'; import { isDesktop, isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; -import { - AccountTurnover, - IncomeSource, - EducationLevel, - EmploymentIndustry, - EstimatedWorth, - NetIncome, - Occupation, - SourceOfWealth, -} from './financial-details-partials'; +import FinancialInformation from './financial-details-partials'; import { splitValidationResultTypes } from '../real-account-signup/helpers/utils'; -export type TFinancialDetails = { +type TFinancialDetailsFormValues = { + income_source: string; + employment_industry: string; + occupation: string; + source_of_wealth: string; + education_level: string; + net_income: string; + estimated_worth: string; + account_turnover: string; +}; + +type TFinancialDetails = { goToPreviousStep: () => void; goToNextStep: () => void; getCurrentStep: () => number; - onSave: (current_step: number, values: FormikValues) => void; + onSave: (current_step: number, values: TFinancialDetailsFormValues) => void; onSubmit: ( current_step: number, - values: FormikValues, + values: TFinancialDetailsFormValues, actions: (isSubmitting: boolean) => void, props: () => void ) => void; onCancel: (current_step: number, props: () => void) => void; - validate: (values: FormikValues) => object; - value: object; -}; - -export type TFinancialInformationAndTradingExperience = { - shared_props?: object; - income_source_enum: object[]; - employment_status_enum: object[]; - employment_industry_enum: object[]; - occupation_enum: object[]; - source_of_wealth_enum: object[]; - education_level_enum: object[]; - net_income_enum: object[]; - estimated_worth_enum: object[]; - account_turnover_enum: object[]; - forex_trading_experience_enum?: object[]; - forex_trading_frequency_enum?: object[]; - binary_options_trading_experience_enum?: object[]; - binary_options_trading_frequency_enum?: object[]; - cfd_trading_experience_enum?: object[]; - cfd_trading_frequency_enum?: object[]; - other_instruments_trading_experience_enum?: object[]; - other_instruments_trading_frequency_enum?: object[]; + validate: (values: TFinancialDetailsFormValues) => object; + value: TFinancialDetailsFormValues; }; -const FinancialInformation = ({ - shared_props, - income_source_enum, - employment_industry_enum, - occupation_enum, - source_of_wealth_enum, - education_level_enum, - net_income_enum, - estimated_worth_enum, - account_turnover_enum, -}: TFinancialInformationAndTradingExperience) => { - return ( - - - - - - - - - - - ); -}; - -const FinancialDetails = (props: TFinancialDetails & TFinancialInformationAndTradingExperience) => { - const handleCancel = (values: FormikValues) => { +/** + * A wrapper for the financial details form. + * @name FinancialDetails + * @param {TFinancialDetails} props - props of the component + * @returns {React.ReactNode} React component that renders FinancialDetails form. + */ +const FinancialDetails = (props: TFinancialDetails) => { + const handleCancel = (values: TFinancialDetailsFormValues) => { const current_step = props.getCurrentStep() - 1; props.onSave(current_step, values); props.onCancel(current_step, props.goToPreviousStep); }; - const handleValidate = (values: FormikValues) => { + const handleValidate = (values: TFinancialDetailsFormValues) => { const { errors } = splitValidationResultTypes(props.validate(values)); return errors; }; @@ -106,16 +68,7 @@ const FinancialDetails = (props: TFinancialDetails & TFinancialInformationAndTra }} validateOnMount > - {({ handleSubmit, isSubmitting, errors, values, setFieldValue, handleChange, handleBlur, touched }) => { - const shared_props = { - values, - handleChange, - handleBlur, - touched, - errors, - setFieldValue, - }; - + {({ handleSubmit, isSubmitting, errors, values }) => { return ( {({ @@ -141,43 +94,13 @@ const FinancialDetails = (props: TFinancialDetails & TFinancialInformationAndTra 'financial-assessment__form' )} > - + 0 - } + is_disabled={isSubmitting || Object.keys(errors).length > 0} is_absolute={isMobile()} label={localize('Next')} has_cancel diff --git a/packages/account/src/Components/financial-details/index.js b/packages/account/src/Components/financial-details/index.ts similarity index 100% rename from packages/account/src/Components/financial-details/index.js rename to packages/account/src/Components/financial-details/index.ts diff --git a/packages/account/src/Components/form-body-section/__tests__/form-body-section.spec.tsx b/packages/account/src/Components/form-body-section/__tests__/form-body-section.spec.tsx index 662843ee5c84..40bcbdcbc9c7 100644 --- a/packages/account/src/Components/form-body-section/__tests__/form-body-section.spec.tsx +++ b/packages/account/src/Components/form-body-section/__tests__/form-body-section.spec.tsx @@ -1,7 +1,9 @@ import React from 'react'; -import { screen, render } from '@testing-library/react'; + +import { mockStore, StoreProvider } from '@deriv/stores'; +import { render, screen } from '@testing-library/react'; + import FormBodySection, { TFormBodySection } from '../form-body-section'; -import { StoreProvider, mockStore } from '@deriv/stores'; const MockFormBodySection = (props: TFormBodySection) => { const mock_store = mockStore({}); diff --git a/packages/account/src/Components/form-body-section/form-body-section.tsx b/packages/account/src/Components/form-body-section/form-body-section.tsx index 7f41228e1d76..5d7b06784184 100644 --- a/packages/account/src/Components/form-body-section/form-body-section.tsx +++ b/packages/account/src/Components/form-body-section/form-body-section.tsx @@ -1,8 +1,9 @@ +import React from 'react'; +import classNames from 'classnames'; + import { Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { Localize } from '@deriv/translations'; -import classNames from 'classnames'; -import React from 'react'; export type TFormBodySection = { /** diff --git a/packages/account/src/Components/form-field-info/__tests__/form-field-info.spec.tsx b/packages/account/src/Components/form-field-info/__tests__/form-field-info.spec.tsx new file mode 100644 index 000000000000..be0e29de1147 --- /dev/null +++ b/packages/account/src/Components/form-field-info/__tests__/form-field-info.spec.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { FormFieldInfo } from '../form-field-info'; +import userEvent from '@testing-library/user-event'; + +describe('FormFieldInfo', () => { + it('should render the component', () => { + render(); + const popover = screen.getByTestId('dt_form-field-info__popover'); + expect(popover).toBeInTheDocument(); + }); + + it('should toggle popover on click', () => { + render(); + expect(screen.queryByText('Info content')).not.toBeInTheDocument(); + userEvent.click(screen.getByTestId('dt_form-field-info__popover')); + expect(screen.getByText('Info content')).toBeInTheDocument(); + }); + + it('should close popover when clicking outside', () => { + render(); + expect(screen.queryByText('Info content')).not.toBeInTheDocument(); + userEvent.click(screen.getByTestId('dt_form-field-info__popover')); + + const content = screen.getByText('Info content'); + expect(content).toBeInTheDocument(); + userEvent.click(document.body); + expect(content).not.toBeVisible(); + }); +}); diff --git a/packages/account/src/Components/form-field-info/form-field-info.tsx b/packages/account/src/Components/form-field-info/form-field-info.tsx new file mode 100644 index 000000000000..10563cefac35 --- /dev/null +++ b/packages/account/src/Components/form-field-info/form-field-info.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { Popover, useOnClickOutside } from '@deriv/components'; +import { TPopoverProps } from '@deriv/components/src/components/types'; +import { isMobile } from '@deriv/shared'; + +/** + * A component that renders a popover with an info icon. + * + * @param {TPopoverProps} props - Props for the popover component. + * @returns React.ReactElement - A React component. + */ +export const FormFieldInfo = (props: Omit) => { + const [is_open, setIsOpen] = React.useState(false); + const ref = React.useRef(null); + const validateClickOutside = (event: MouseEvent) => { + const target = event?.target as HTMLElement; + if (target.tagName === 'A') { + event?.stopPropagation(); + return false; + } + return !ref.current?.contains(target); + }; + + useOnClickOutside(ref, () => setIsOpen(false), validateClickOutside); + return ( +
+ setIsOpen(prev_is_open => !prev_is_open)} + alignment={isMobile() ? 'left' : 'right'} + /> +
+ ); +}; diff --git a/packages/account/src/Components/form-field-info/index.ts b/packages/account/src/Components/form-field-info/index.ts new file mode 100644 index 000000000000..9f25eecaab50 --- /dev/null +++ b/packages/account/src/Components/form-field-info/index.ts @@ -0,0 +1,3 @@ +import { FormFieldInfo } from './form-field-info'; + +export default FormFieldInfo; diff --git a/packages/account/src/Components/forms/__test__/form-select-field.spec.tsx b/packages/account/src/Components/forms/__test__/form-select-field.spec.tsx new file mode 100644 index 000000000000..9e9e732bf950 --- /dev/null +++ b/packages/account/src/Components/forms/__test__/form-select-field.spec.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import FormSelectField from '../form-select-field'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { Formik } from 'formik'; +import userEvent from '@testing-library/user-event'; + +describe('FormSelectField', () => { + const list_items = [ + { value: '1', text: 'Option 1' }, + { value: '2', text: 'Option 2' }, + { value: '3', text: 'Option 3' }, + ]; + const mock_store = mockStore({}); + + it('should render label', () => { + render( + + + + + + ); + expect(screen.getByLabelText('Test Label')).toBeInTheDocument(); + }); + + it('should render and select an option', async () => { + render( + + + + + + ); + + const select_element = screen.getByLabelText('Test Label'); + userEvent.type(select_element, '{arrowdown}{arrowdown}{enter}'); + + // Verify that Option 2 is selected + expect(select_element).toHaveValue('Option 2'); + }); + + it('should render error message for invalid input', async () => { + render( + + + + + + ); + + expect(screen.getByText('This field is required')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/forms/__tests__/personal-details-form.spec.tsx b/packages/account/src/Components/forms/__tests__/personal-details-form.spec.tsx index c0d94f69c46e..cffedda0aa1d 100644 --- a/packages/account/src/Components/forms/__tests__/personal-details-form.spec.tsx +++ b/packages/account/src/Components/forms/__tests__/personal-details-form.spec.tsx @@ -1,7 +1,9 @@ import React from 'react'; import { Formik } from 'formik'; + import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; + import PersonalDetailsForm from '../personal-details-form'; jest.mock('react-router-dom', () => ({ diff --git a/packages/account/src/Components/forms/confirmation-checkbox/__tests__/confirmation-checkbox.spec.tsx b/packages/account/src/Components/forms/confirmation-checkbox/__tests__/confirmation-checkbox.spec.tsx index c9131afc2773..4601c86759be 100644 --- a/packages/account/src/Components/forms/confirmation-checkbox/__tests__/confirmation-checkbox.spec.tsx +++ b/packages/account/src/Components/forms/confirmation-checkbox/__tests__/confirmation-checkbox.spec.tsx @@ -1,7 +1,9 @@ import React from 'react'; +import { Form, Formik } from 'formik'; + import { render, screen } from '@testing-library/react'; + import { ConfirmationCheckbox } from '../confirmation-checkbox'; -import { Formik, Form } from 'formik'; describe('ConfirmationCheckbox', () => { const props: React.ComponentProps = { diff --git a/packages/account/src/Components/forms/confirmation-checkbox/confirmation-checkbox.tsx b/packages/account/src/Components/forms/confirmation-checkbox/confirmation-checkbox.tsx index 24015e6bd133..c67256f7d1ea 100644 --- a/packages/account/src/Components/forms/confirmation-checkbox/confirmation-checkbox.tsx +++ b/packages/account/src/Components/forms/confirmation-checkbox/confirmation-checkbox.tsx @@ -1,7 +1,8 @@ import React from 'react'; +import { useFormikContext } from 'formik'; + import { Checkbox, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; -import { useFormikContext } from 'formik'; /** * Props for the confirmation checkbox component. diff --git a/packages/account/src/Components/forms/form-fields.jsx b/packages/account/src/Components/forms/form-fields.jsx deleted file mode 100644 index d7b7fe337747..000000000000 --- a/packages/account/src/Components/forms/form-fields.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { Field } from 'formik'; -import { DateOfBirthPicker, Input } from '@deriv/components'; -import { toMoment } from '@deriv/shared'; - -export const DateOfBirthField = ({ name, portal_id, ...rest }) => ( - - {({ field: { value }, form: { setFieldValue, errors, touched, setFieldTouched } }) => ( - setFieldTouched(name)} - onChange={({ target }) => - setFieldValue(name, target?.value ? toMoment(target.value).format('YYYY-MM-DD') : '', true) - } - value={value} - portal_id={portal_id} - {...rest} - /> - )} - -); - -export const FormInputField = ({ name, warn, ...rest }) => ( - - {({ field, form: { errors, touched } }) => ( - - )} - -); diff --git a/packages/account/src/Components/forms/form-fields/__tests__/date-of-birth-field.spec.tsx b/packages/account/src/Components/forms/form-fields/__tests__/date-of-birth-field.spec.tsx new file mode 100644 index 000000000000..849b83620276 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/__tests__/date-of-birth-field.spec.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Formik } from 'formik'; +import { render, screen } from '@testing-library/react'; +import DateOfBirthField from '../date-of-birth-field'; + +describe('Tesing component', () => { + it('should render properties', () => { + const props: Partial> = { + name: 'test-name', + portal_id: 'test-portal-id', + }; + render( + + + + ); + + expect(screen.getByRole('textbox')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx b/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx new file mode 100644 index 000000000000..8d961e72fe20 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/__tests__/form-input-field.spec.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Formik } from 'formik'; +import { render, screen } from '@testing-library/react'; +import FormInputField from '../form-input-field'; + +describe('Tesing component', () => { + it('should render properties', () => { + const props: React.ComponentProps = { + name: 'test-name', + required: true, + }; + render( + + + + ); + + expect(screen.getByRole('textbox')).toBeInTheDocument(); + }); + + it('should render Input field with optional status', () => { + const props = { + name: 'test-name', + }; + render( + + + + ); + + expect(screen.getByRole('textbox')).toBeInTheDocument(); + expect(screen.getByRole('textbox')).not.toBeRequired(); + }); +}); diff --git a/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx b/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx new file mode 100644 index 000000000000..b05db31da632 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/date-of-birth-field.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Field, FieldProps } from 'formik'; +import { DateOfBirthPicker } from '@deriv/components'; +import { toMoment } from '@deriv/shared'; + +type TDateOfBirthFieldProps = { + name: string; + portal_id: string; +} & Omit, 'onBlur' | 'onChange' | 'error'>; + +/** + * DateOfBirthField is a wrapper around DateOfBirthPicker that can be used with Formik. + * @name DateOfBirthField + * @param name - Name of the field + * @param portal_id - Portal ID + * @param [props] - Other props to pass to DateOfBirthPicker + * @returns {React.ReactNode} + */ +const DateOfBirthField = ({ name, portal_id, ...rest }: TDateOfBirthFieldProps) => ( + + {({ field, form: { setFieldValue }, meta: { error, touched } }: FieldProps) => ( + + setFieldValue(name, target?.value ? toMoment(target.value).format('YYYY-MM-DD') : '', true) + } + portal_id={portal_id} + /> + )} + +); + +export default DateOfBirthField; diff --git a/packages/account/src/Components/forms/form-fields/form-input-field.tsx b/packages/account/src/Components/forms/form-fields/form-input-field.tsx new file mode 100644 index 000000000000..a6bd0fb498ad --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/form-input-field.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { FieldInputProps, FormikHelpers, FormikState, Field } from 'formik'; +import { Input } from '@deriv/components'; + +type FormInputFieldProps = { + name: string; + optional?: boolean; + warn?: string; +} & React.ComponentProps; + +type TFormInputFieldHelpers = { + field: FieldInputProps; + form: FormikHelpers & FormikState; +}; + +/** + * FormInputField is a wrapper around Input that can be used with Formik. + * @name FormInputField + * @param name - Name of the field + * @param [optional] - Whether the field is optional + * @param [warn] - Display a warning message + * @param [props] - Other props to pass to Input + * @returns ReactNode + */ +const FormInputField = ({ name, warn, ...rest }: FormInputFieldProps) => ( + + {({ field, form: { errors, touched } }: TFormInputFieldHelpers>) => ( + + )} + +); + +export default FormInputField; diff --git a/packages/account/src/Components/forms/form-fields/index.ts b/packages/account/src/Components/forms/form-fields/index.ts new file mode 100644 index 000000000000..8ecb3a2bce22 --- /dev/null +++ b/packages/account/src/Components/forms/form-fields/index.ts @@ -0,0 +1,4 @@ +import FormInputField from './form-input-field'; +import DateOfBirthField from './date-of-birth-field'; + +export { FormInputField, DateOfBirthField }; diff --git a/packages/account/src/Components/forms/form-select-field.tsx b/packages/account/src/Components/forms/form-select-field.tsx new file mode 100644 index 000000000000..ca1da54afa7f --- /dev/null +++ b/packages/account/src/Components/forms/form-select-field.tsx @@ -0,0 +1,79 @@ +import { Autocomplete, SelectNative } from '@deriv/components'; +import { useStore } from '@deriv/stores'; +import { Field, FieldProps, FormikErrors } from 'formik'; +import React from 'react'; +import { TGetField, TListItem } from '../additional-kyc-info-modal/form-config'; + +type TFormSelectField = TGetField & { + onItemSelection?: (item: TListItem) => void; + list_height?: string; +}; + +type TSetFieldValue = ( + field: string, + value: string, + shouldValidate?: boolean +) => Promise>>; + +const FormSelectField: React.FC = ({ + label, + name, + required = false, + disabled = false, + list_items, + onItemSelection, + placeholder, + list_height, +}) => { + const { ui } = useStore(); + const { is_mobile } = ui; + + const onSelect = + (field: string, setFieldValue: TSetFieldValue) => + ({ value, text }: TListItem) => { + setFieldValue(field, value ? text : '', true); + }; + // TODO: remove the following ts-expect-error comments once the issue is fixed within the components + return ( + + {({ field, meta: { touched, error }, form: { setFieldValue } }: FieldProps) => ( + + {is_mobile ? ( + + ) : ( + + )} + + )} + + ); +}; + +export default FormSelectField; diff --git a/packages/account/src/Components/forms/idv-form.tsx b/packages/account/src/Components/forms/idv-form.tsx index f81b083fb5a0..9febec547d50 100644 --- a/packages/account/src/Components/forms/idv-form.tsx +++ b/packages/account/src/Components/forms/idv-form.tsx @@ -3,7 +3,7 @@ import classNames from 'classnames'; import { Field, FieldProps } from 'formik'; import { localize } from '@deriv/translations'; import { formatInput, getIDVNotApplicableOption } from '@deriv/shared'; -import { Autocomplete, DesktopWrapper, Input, MobileWrapper, SelectNative, Text } from '@deriv/components'; +import { Autocomplete, DesktopWrapper, Input, MobileWrapper, SelectNative } from '@deriv/components'; import { getDocumentData, preventEmptyClipboardPaste, @@ -25,17 +25,15 @@ const IDVForm = ({ can_skip_document_verification = false, }: TIDVForm) => { const [document_list, setDocumentList] = React.useState([]); - const [document_image, setDocumentImage] = React.useState(null); const [selected_doc, setSelectedDoc] = React.useState(''); - const { documents_supported: document_data, has_visual_sample } = selected_country?.identity?.services?.idv ?? {}; + const { documents_supported: document_data } = selected_country?.identity?.services?.idv ?? {}; const default_document = { id: '', text: '', value: '', example_format: '', - sample_image: '', }; const IDV_NOT_APPLICABLE_OPTION = React.useMemo(() => getIDVNotApplicableOption(), []); @@ -50,8 +48,10 @@ const IDVForm = ({ const new_document_list = filtered_documents.map(key => { const { display_name, format } = document_data[key]; - const { new_display_name, example_format, sample_image, additional_document_example_format } = - getDocumentData(selected_country.value ?? '', key); + const { new_display_name, example_format, additional_document_example_format } = getDocumentData( + selected_country.value ?? '', + key + ); const needs_additional_document = !!document_data[key].additional; if (needs_additional_document) { @@ -64,7 +64,6 @@ const IDVForm = ({ example_format: additional_document_example_format, }, value: format, - sample_image, example_format, }; } @@ -72,7 +71,6 @@ const IDVForm = ({ id: key, text: display_name ?? new_display_name, // Display document name from API if available, else use the one from the helper function value: format, - sample_image, example_format, }; }); @@ -109,9 +107,6 @@ const IDVForm = ({ setFieldValue('document_number', '', true); setFieldValue('document_additional', '', true); } - if (has_visual_sample) { - setDocumentImage(item.sample_image ?? ''); - } }; return ( @@ -124,11 +119,7 @@ const IDVForm = ({ 'proof-of-identity__container--idv': hide_hint, })} > -
+
@@ -263,20 +254,6 @@ const IDVForm = ({
)}
- {document_image && ( -
- - {localize('Sample:')} - -
- document sample image -
-
- )}
diff --git a/packages/account/src/Components/forms/personal-details-form.jsx b/packages/account/src/Components/forms/personal-details-form.jsx index a709120b8ea6..0d91f6471b58 100644 --- a/packages/account/src/Components/forms/personal-details-form.jsx +++ b/packages/account/src/Components/forms/personal-details-form.jsx @@ -25,7 +25,7 @@ import FormSubHeader from '../form-sub-header'; import InlineNoteWithIcon from '../inline-note-with-icon'; import ConfirmationCheckbox from './confirmation-checkbox'; -import { DateOfBirthField, FormInputField } from './form-fields.jsx'; +import { DateOfBirthField, FormInputField } from './form-fields'; const PersonalDetailsForm = props => { const { diff --git a/packages/account/src/Components/personal-details/personal-details.jsx b/packages/account/src/Components/personal-details/personal-details.jsx index f78c111a7fcb..8bbfd36eb2ab 100644 --- a/packages/account/src/Components/personal-details/personal-details.jsx +++ b/packages/account/src/Components/personal-details/personal-details.jsx @@ -42,7 +42,6 @@ const PersonalDetails = ({ is_virtual, is_fully_authenticated, account_opening_reason_list, - onSubmitEnabledChange, selected_step_ref, closeRealAccountSignup, has_real_account, @@ -50,21 +49,11 @@ const PersonalDetails = ({ }) => { const { account_status, account_settings, residence, real_account_signup_target } = props; const [should_close_tooltip, setShouldCloseTooltip] = React.useState(false); - const is_submit_disabled_ref = React.useRef(true); const isSubmitDisabled = errors => { return selected_step_ref?.current?.isSubmitting || Object.keys(errors).length > 0; }; - const checkSubmitStatus = errors => { - const is_submit_disabled = isSubmitDisabled(errors); - - if (is_submit_disabled_ref.current !== is_submit_disabled) { - is_submit_disabled_ref.current = is_submit_disabled; - onSubmitEnabledChange?.(!is_submit_disabled); - } - }; - const handleCancel = values => { const current_step = getCurrentStep() - 1; onSave(current_step, values); @@ -104,7 +93,6 @@ const PersonalDetails = ({ } const { errors } = splitValidationResultTypes(validate(values)); const error_data = { ...idv_error, ...errors }; - checkSubmitStatus(error_data); return error_data; }; diff --git a/packages/account/src/Components/poi/idv-document-submit/__tests__/idv-document-submit.spec.tsx b/packages/account/src/Components/poi/idv-document-submit/__tests__/idv-document-submit.spec.tsx index 7599e31bd4c7..a4c01889c3fa 100644 --- a/packages/account/src/Components/poi/idv-document-submit/__tests__/idv-document-submit.spec.tsx +++ b/packages/account/src/Components/poi/idv-document-submit/__tests__/idv-document-submit.spec.tsx @@ -20,12 +20,10 @@ jest.mock('Helpers/utils', () => ({ document_1: { new_display_name: '', example_format: '5436454364243', - sample_image: '', }, document_2: { new_display_name: '', example_format: 'A-52431', - sample_image: '', }, }, }; diff --git a/packages/account/src/Components/poi/idv-document-submit/idv-document-submit.tsx b/packages/account/src/Components/poi/idv-document-submit/idv-document-submit.tsx index 461078949cd7..026308a1b066 100644 --- a/packages/account/src/Components/poi/idv-document-submit/idv-document-submit.tsx +++ b/packages/account/src/Components/poi/idv-document-submit/idv-document-submit.tsx @@ -56,7 +56,6 @@ const IdvDocumentSubmit = observer(({ handleBack, handleViewComplete, selected_c text: '', value: '', example_format: '', - sample_image: '', }, document_number: '', ...form_initial_values, diff --git a/packages/account/src/Components/poi/poi-form-on-signup/idv-doc-submit-on-signup/idv-doc-submit-on-signup.tsx b/packages/account/src/Components/poi/poi-form-on-signup/idv-doc-submit-on-signup/idv-doc-submit-on-signup.tsx index 429e32a6f55b..4df0df924f3e 100644 --- a/packages/account/src/Components/poi/poi-form-on-signup/idv-doc-submit-on-signup/idv-doc-submit-on-signup.tsx +++ b/packages/account/src/Components/poi/poi-form-on-signup/idv-doc-submit-on-signup/idv-doc-submit-on-signup.tsx @@ -6,12 +6,12 @@ import { GetSettings, ResidenceList } from '@deriv/api-types'; import { Button } from '@deriv/components'; import { filterObjProperties, toMoment, removeEmptyPropertiesFromObject } from '@deriv/shared'; import { - validate, - validateName, - isDocumentTypeValid, isAdditionalDocumentValid, isDocumentNumberValid, + isDocumentTypeValid, shouldHideHelperImage, + validate, + validateName, } from '../../../../Helpers/utils'; import FormSubHeader from '../../../form-sub-header'; import IDVForm from '../../../forms/idv-form'; @@ -77,7 +77,6 @@ export const IdvDocSubmitOnSignup = ({ text: '', value: '', example_format: '', - sample_image: '', }, document_number: '', ...form_initial_values, diff --git a/packages/account/src/Components/sent-email-modal/sent-email-modal.tsx b/packages/account/src/Components/sent-email-modal/sent-email-modal.tsx index 476a00f910d7..f9ba89987275 100644 --- a/packages/account/src/Components/sent-email-modal/sent-email-modal.tsx +++ b/packages/account/src/Components/sent-email-modal/sent-email-modal.tsx @@ -8,7 +8,7 @@ type TSentEmailModal = { is_modal_when_mobile?: boolean; is_open: boolean; has_live_chat?: boolean; - onClickSendEmail: () => void; + onClickSendEmail: (prop?: string) => void; onClose: () => void; }; diff --git a/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.js b/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.js deleted file mode 100644 index 629854d40ff6..000000000000 --- a/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.js +++ /dev/null @@ -1,187 +0,0 @@ -import React from 'react'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { isDesktop, isMobile, PlatformContext } from '@deriv/shared'; -import TermsOfUse from '../terms-of-use'; - -jest.mock('@deriv/shared', () => ({ - ...jest.requireActual('@deriv/shared'), - isDesktop: jest.fn(() => true), - isMobile: jest.fn(() => false), -})); - -describe('', () => { - const agree_check = /i agree to the/i; - const iom_description = - 'Your account will be opened with Deriv (MX) Ltd, regulated by the UK Gaming Commission (UKGC), and will be subject to the laws of the Isle of Man.'; - const law_title = 'Jurisdiction and choice of law'; - const malta_description = - 'Your account will be opened with Deriv (Europe) Limited, regulated by the Malta Gaming Authority, and will be subject to the laws of Malta.'; - const malta_invest_description = - 'Your account will be opened with Deriv Investments (Europe) Limited, regulated by the Malta Financial Services Authority (MFSA), and will be subject to the laws of Malta.'; - const not_pep_check = 'I am not a PEP, and I have not been a PEP in the last 12 months.'; - const peps_message = - '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.'; - const peps_title = 'Real accounts are not available to politically exposed persons (PEPs).'; - const responsibility_warning_msg = - '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.'; - const risk_warning_title = 'Risk warning'; - const samoa_description = - 'Your account will be opened with Deriv Capital International Ltd and will be subject to the laws of Samoa.'; - const svg_description = - 'Your account will be opened with Deriv (SVG) LLC, and will be subject to the laws of Saint Vincent and the Grenadines.'; - - const mock_props = { - getCurrentStep: jest.fn(), - goToNextStep: jest.fn(), - goToPreviousStep: jest.fn(), - onCancel: jest.fn(), - onSubmit: jest.fn(), - real_account_signup_target: '', - value: { agreed_tos: false, agreed_tnc: false }, - }; - - const commonFieldsCheck = () => { - expect(screen.getByText(agree_check)).toBeInTheDocument(); - expect(screen.getByText(not_pep_check)).toBeInTheDocument(); - expect(screen.getByText(peps_message)).toBeInTheDocument(); - expect(screen.getByText(peps_title)).toBeInTheDocument(); - }; - - it('should render TermsOfUse component for svg accounts', () => { - mock_props.real_account_signup_target = 'svg'; - - render(); - - commonFieldsCheck(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); - expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); - expect(screen.getByText(svg_description)).toBeInTheDocument(); - - expect(screen.queryByText(iom_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_invest_description)).not.toBeInTheDocument(); - expect(screen.queryByText(samoa_description)).not.toBeInTheDocument(); - }); - - it('should render TermsOfUse component for iom accounts', () => { - mock_props.real_account_signup_target = 'iom'; - - render(); - - commonFieldsCheck(); - expect(screen.getByText(iom_description)).toBeInTheDocument(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - - expect(screen.queryByText(malta_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_invest_description)).not.toBeInTheDocument(); - expect(screen.queryByText(responsibility_warning_msg)).not.toBeInTheDocument(); - expect(screen.queryByText(risk_warning_title)).not.toBeInTheDocument(); - expect(screen.queryByText(samoa_description)).not.toBeInTheDocument(); - expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); - }); - - it('should render TermsOfUse component for samoa accounts', () => { - mock_props.real_account_signup_target = 'samoa'; - - render(); - - commonFieldsCheck(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); - expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); - expect(screen.getByText(samoa_description)).toBeInTheDocument(); - - expect(screen.queryByText(iom_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_invest_description)).not.toBeInTheDocument(); - expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); - }); - - it('should render TermsOfUse component for maltainvest accounts and show "Add account" button', () => { - mock_props.real_account_signup_target = 'maltainvest'; - - render(); - - commonFieldsCheck(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - expect(screen.getByText(malta_invest_description)).toBeInTheDocument(); - expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); - expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); - - expect(screen.queryByText(iom_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_description)).not.toBeInTheDocument(); - expect(screen.queryByText(samoa_description)).not.toBeInTheDocument(); - expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); - - const add_btn = screen.getByRole('button', { name: /add account/i }); - expect(add_btn).toBeInTheDocument(); - }); - - it('should render TermsOfUse component for maltainvest accounts and show "Add account" button for mobile', () => { - isMobile.mockReturnValue(true); - isDesktop.mockReturnValue(false); - - mock_props.real_account_signup_target = 'maltainvest'; - - render(); - - commonFieldsCheck(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - expect(screen.getByText(malta_invest_description)).toBeInTheDocument(); - expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); - expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); - - expect(screen.queryByText(iom_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_description)).not.toBeInTheDocument(); - expect(screen.queryByText(samoa_description)).not.toBeInTheDocument(); - expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); - - const add_btn = screen.getByRole('button', { name: /add account/i }); - expect(add_btn).toBeInTheDocument(); - }); - - it('should render TermsOfUse component for malta accounts and trigger buttons', async () => { - mock_props.real_account_signup_target = 'malta'; - - render( - - - - ); - - commonFieldsCheck(); - expect(screen.getByText(law_title)).toBeInTheDocument(); - expect(screen.getByText(malta_description)).toBeInTheDocument(); - - expect(screen.queryByText(iom_description)).not.toBeInTheDocument(); - expect(screen.queryByText(malta_invest_description)).not.toBeInTheDocument(); - expect(screen.queryByText(responsibility_warning_msg)).not.toBeInTheDocument(); - expect(screen.queryByText(risk_warning_title)).not.toBeInTheDocument(); - expect(screen.queryByText(samoa_description)).not.toBeInTheDocument(); - expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); - - const previous_btn = screen.getByRole('button', { name: /previous/i }); - fireEvent.click(previous_btn); - expect(mock_props.getCurrentStep).toHaveBeenCalledTimes(1); - expect(mock_props.onCancel).toHaveBeenCalledTimes(1); - - const agree_checkbox = screen.getByLabelText(agree_check); - const not_pep_checkbox = screen.getByLabelText(not_pep_check); - expect(agree_checkbox.checked).toBeFalsy(); - expect(not_pep_checkbox.checked).toBeFalsy(); - - fireEvent.click(agree_checkbox); - fireEvent.click(not_pep_checkbox); - expect(agree_checkbox.checked).toBeTruthy(); - expect(not_pep_checkbox.checked).toBeTruthy(); - - const finish_btn = screen.getByRole('button', { name: /finish/i }); - - fireEvent.click(finish_btn); - await waitFor(() => { - expect(mock_props.getCurrentStep).toHaveBeenCalledTimes(2); - expect(mock_props.onSubmit).toHaveBeenCalledTimes(1); - }); - }); -}); diff --git a/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.tsx b/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.tsx new file mode 100644 index 000000000000..a8a8ef15dfee --- /dev/null +++ b/packages/account/src/Components/terms-of-use/__tests__/terms-of-use.spec.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { isDesktop, isMobile } from '@deriv/shared'; +import TermsOfUse from '../terms-of-use'; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isDesktop: jest.fn(() => true), + isMobile: jest.fn(() => false), +})); + +describe('', () => { + const agree_check = /i agree to the/i; + const law_title = 'Jurisdiction and choice of law'; + const malta_invest_description = + 'Your account will be opened with Deriv Investments (Europe) Limited, regulated by the Malta Financial Services Authority (MFSA), and will be subject to the laws of Malta.'; + const not_pep_check = 'I am not a PEP, and I have not been a PEP in the last 12 months.'; + const peps_message = + '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.'; + const peps_title = 'Real accounts are not available to politically exposed persons (PEPs).'; + const responsibility_warning_msg = + '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.'; + const risk_warning_title = 'Risk warning'; + const svg_description = + 'Your account will be opened with Deriv (SVG) LLC, and will be subject to the laws of Saint Vincent and the Grenadines.'; + + const mock_props: React.ComponentProps = { + getCurrentStep: jest.fn(), + goToNextStep: jest.fn(), + goToPreviousStep: jest.fn(), + onCancel: jest.fn(), + onSubmit: jest.fn(), + real_account_signup_target: 'svg', + value: { agreed_tos: false, agreed_tnc: false }, + }; + + const commonFieldsCheck = () => { + expect(screen.getByText(agree_check)).toBeInTheDocument(); + expect(screen.getByText(not_pep_check)).toBeInTheDocument(); + expect(screen.getByText(peps_message)).toBeInTheDocument(); + expect(screen.getByText(peps_title)).toBeInTheDocument(); + }; + + it('should render TermsOfUse component for svg accounts', () => { + render(); + + commonFieldsCheck(); + expect(screen.getByText(law_title)).toBeInTheDocument(); + expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); + expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); + expect(screen.getByText(svg_description)).toBeInTheDocument(); + expect(screen.queryByText(malta_invest_description)).not.toBeInTheDocument(); + }); + + it('should render TermsOfUse component for maltainvest accounts and show "Add account" button', () => { + mock_props.real_account_signup_target = 'maltainvest'; + + render(); + + commonFieldsCheck(); + expect(screen.getByText(law_title)).toBeInTheDocument(); + expect(screen.getByText(malta_invest_description)).toBeInTheDocument(); + expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); + expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); + expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); + + const add_btn = screen.getByRole('button', { name: /add account/i }); + expect(add_btn).toBeInTheDocument(); + }); + + it('should render TermsOfUse component for maltainvest accounts and show "Add account" button for mobile', () => { + (isMobile as jest.Mock).mockReturnValue(true); + (isDesktop as jest.Mock).mockReturnValue(false); + + mock_props.real_account_signup_target = 'maltainvest'; + + render(); + + commonFieldsCheck(); + expect(screen.getByText(law_title)).toBeInTheDocument(); + expect(screen.getByText(malta_invest_description)).toBeInTheDocument(); + expect(screen.getByText(responsibility_warning_msg)).toBeInTheDocument(); + expect(screen.getByText(risk_warning_title)).toBeInTheDocument(); + expect(screen.queryByText(svg_description)).not.toBeInTheDocument(); + + const add_btn = screen.getByRole('button', { name: /add account/i }); + expect(add_btn).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/terms-of-use/checkbox-field.jsx b/packages/account/src/Components/terms-of-use/checkbox-field.jsx deleted file mode 100644 index 0c5a8685c587..000000000000 --- a/packages/account/src/Components/terms-of-use/checkbox-field.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; -import { Checkbox } from '@deriv/components'; - -/* - * This component is used with Formik's Field component. - */ -const CheckboxField = ({ field: { name, value, onChange }, id, label, className, ...props }) => { - return ( -
- -
- ); -}; - -export default CheckboxField; diff --git a/packages/account/src/Components/terms-of-use/checkbox-field.tsx b/packages/account/src/Components/terms-of-use/checkbox-field.tsx new file mode 100644 index 000000000000..2d97193fa454 --- /dev/null +++ b/packages/account/src/Components/terms-of-use/checkbox-field.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { FieldInputProps } from 'formik'; +import { Checkbox } from '@deriv/components'; + +type TCheckboxFieldProps = { + field: FieldInputProps; + id: string; + className: string; + label: string; +}; + +/** + * This component is used with Formik's Field component. + * @param {FieldInputProps} field - Formik's field props + * @param {string} id - Checkbox id + * @param {string} className - Class name for styling + * @param {string} label - Checkbox label + * @param {object} props - Other props + * @returns {React.ReactNode} - React node + */ +const CheckboxField = ({ field: { name, value, onChange }, id, label, className, ...props }: TCheckboxFieldProps) => { + return ( +
+ +
+ ); +}; + +export default CheckboxField; diff --git a/packages/account/src/Components/terms-of-use/index.js b/packages/account/src/Components/terms-of-use/index.js deleted file mode 100644 index 5e27f5dc4464..000000000000 --- a/packages/account/src/Components/terms-of-use/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import TermsOfUse from './terms-of-use.jsx'; - -export default TermsOfUse; diff --git a/packages/account/src/Components/terms-of-use/index.ts b/packages/account/src/Components/terms-of-use/index.ts new file mode 100644 index 000000000000..8ae373d500ae --- /dev/null +++ b/packages/account/src/Components/terms-of-use/index.ts @@ -0,0 +1,3 @@ +import TermsOfUse from './terms-of-use'; + +export default TermsOfUse; diff --git a/packages/account/src/Components/terms-of-use/terms-of-use-messages.jsx b/packages/account/src/Components/terms-of-use/terms-of-use-messages.jsx deleted file mode 100644 index 08b0d207aaa8..000000000000 --- a/packages/account/src/Components/terms-of-use/terms-of-use-messages.jsx +++ /dev/null @@ -1,150 +0,0 @@ -import React from 'react'; -import { Localize } from '@deriv/translations'; -import { getLegalEntityName } from '@deriv/shared'; -import { Text } from '@deriv/components'; - -export const Hr = () =>
; - -export const BrokerSpecificMessage = ({ target }) => ( - - {target === 'svg' && } - {target === 'iom' && } - {target === 'malta' && } - {target === 'maltainvest' && } - {target === 'samoa' && } - -); - -export const SVGDescription = () => ( - - - - -

- -

-
- - - -

- -

-
-); - -export const IOMDescription = () => ( - - - - -

- -

-
-); - -export const MaltaDescription = () => ( - - - - -

- -

-
-); - -export const MaltaInvestDescription = () => ( - - - - -

- -

-
- - - -

- -

-
-); - -export const SamoaDescription = () => ( - - - - -

- -

-
- - - -

- -

-
-); - -export const SharedMessage = () => ( - - - - -

- -

-
-); diff --git a/packages/account/src/Components/terms-of-use/terms-of-use-messages.tsx b/packages/account/src/Components/terms-of-use/terms-of-use-messages.tsx new file mode 100644 index 000000000000..1cb8a0a1ea77 --- /dev/null +++ b/packages/account/src/Components/terms-of-use/terms-of-use-messages.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { Text } from '@deriv/components'; +import { getLegalEntityName, Jurisdiction, TBrokerCodes } from '@deriv/shared'; +import { Localize } from '@deriv/translations'; + +/** + * Renders a horizontal line + * @name Hr + * @returns JSX.Element + */ +export const Hr = () =>
; + +/** + * Renders the broker specific message based on the broker code + * @name BrokerSpecificMessage + * @param target - Broker code + * @returns JSX.Element + */ +export const BrokerSpecificMessage = ({ target }: { target: Extract }) => ( + + + + +

+ {target === Jurisdiction.SVG ? ( + + ) : ( + + )} +

+
+ + + +

+ +

+
+); + +/** + * Returns the generic terms of use message + * @name SVGDescription + * @returns JSX.Element + */ +export const SharedMessage = () => ( + + + + +

+ +

+
+); diff --git a/packages/account/src/Components/terms-of-use/terms-of-use.scss b/packages/account/src/Components/terms-of-use/terms-of-use.scss index b821ef2b1276..c3bd52949e20 100644 --- a/packages/account/src/Components/terms-of-use/terms-of-use.scss +++ b/packages/account/src/Components/terms-of-use/terms-of-use.scss @@ -4,6 +4,7 @@ flex-grow: 1; margin: 0 8rem !important; width: 84% !important; + padding-bottom: unset; @include mobile { margin: unset !important; diff --git a/packages/account/src/Components/terms-of-use/terms-of-use.jsx b/packages/account/src/Components/terms-of-use/terms-of-use.tsx similarity index 75% rename from packages/account/src/Components/terms-of-use/terms-of-use.jsx rename to packages/account/src/Components/terms-of-use/terms-of-use.tsx index 64aeb86b3f19..41d378f2f9f5 100644 --- a/packages/account/src/Components/terms-of-use/terms-of-use.jsx +++ b/packages/account/src/Components/terms-of-use/terms-of-use.tsx @@ -1,6 +1,6 @@ -import { Field, Formik } from 'formik'; import React from 'react'; -import cn from 'classnames'; +import { Field, Formik } from 'formik'; +import className from 'classnames'; import { Div100vhContainer, Modal, @@ -9,12 +9,47 @@ import { AutoHeightWrapper, StaticUrl, } from '@deriv/components'; -import { isDesktop, isMobile, PlatformContext } from '@deriv/shared'; +import { isDesktop, isMobile, PlatformContext, TBrokerCodes } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; -import CheckboxField from './checkbox-field.jsx'; -import { SharedMessage, BrokerSpecificMessage, Hr } from './terms-of-use-messages.jsx'; +import CheckboxField from './checkbox-field'; +import { SharedMessage, BrokerSpecificMessage, Hr } from './terms-of-use-messages'; import './terms-of-use.scss'; +type TTermsOfUseFormProps = { + agreed_tos: boolean; + agreed_tnc: boolean; +}; + +type TTermsOfUseProps = { + getCurrentStep: () => number; + onCancel: (current_step: number, goToPreviousStep: () => void) => void; + goToPreviousStep: () => void; + goToNextStep: () => void; + onSubmit: ( + current_step: number | null, + values: TTermsOfUseFormProps, + action: (isSubmitting: boolean) => void, + next_step: () => void + ) => void; + value: TTermsOfUseFormProps; + real_account_signup_target: TBrokerCodes; + form_error?: string; +}; + +/** + * Terms of use component for account signup + * @name TermsOfUse + * @param getCurrentStep - function to get current step + * @param onCancel - function to cancel account signup + * @param goToPreviousStep - function to go to previous step + * @param goToNextStep - function to go to next step + * @param onSubmit - function to submit form + * @param value - form values + * @param real_account_signup_target - broker code + * @param form_error - form error + * @param props - other props + * @returns React node + */ const TermsOfUse = ({ getCurrentStep, onCancel, @@ -24,7 +59,7 @@ const TermsOfUse = ({ value, real_account_signup_target, ...props -}) => { +}: TTermsOfUseProps) => { const { is_appstore } = React.useContext(PlatformContext); const handleCancel = () => { @@ -43,7 +78,7 @@ const TermsOfUse = ({ { - onSubmit(getCurrentStep() - 1, {}, actions.setSubmitting, goToNextStep); + onSubmit(getCurrentStep() - 1, values, actions.setSubmitting, goToNextStep); }} > {({ handleSubmit, values, isSubmitting }) => ( @@ -56,10 +91,7 @@ const TermsOfUse = ({ is_disabled={isDesktop()} > -
+

diff --git a/packages/account/src/Components/unlink-account-modal/__tests__/unlink-account-modal.spec.tsx b/packages/account/src/Components/unlink-account-modal/__tests__/unlink-account-modal.spec.tsx new file mode 100644 index 000000000000..3cea93998ab4 --- /dev/null +++ b/packages/account/src/Components/unlink-account-modal/__tests__/unlink-account-modal.spec.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import UnlinkAccountModal from '../unlink-account-modal'; + +describe('UnlinkAccountModal', () => { + let modal_root_el: HTMLDivElement; + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + afterAll(() => { + document.body.removeChild(modal_root_el); + }); + + const mock_props: React.ComponentProps = { + onClose: jest.fn(), + is_open: true, + identifier_title: 'Google', + onClickSendEmail: jest.fn(), + }; + + it('should render modal body', () => { + render(); + + expect( + screen.getByText( + "To change your email address, you'll first need to unlink your email address from your Google account." + ) + ).toBeInTheDocument(); + }); + + it('should render 2 buttons', () => { + render(); + + expect(screen.getAllByRole('button')).toHaveLength(2); + expect(screen.getByText('Cancel')).toBeInTheDocument(); + expect(screen.getByText('Unlink from Google')).toBeInTheDocument(); + }); + + it('should invoke onClickSendEmail when clicking on Unlink button', () => { + render(); + + userEvent.click(screen.getByText('Unlink from Google')); + expect(mock_props.onClickSendEmail).toHaveBeenCalledTimes(1); + expect(mock_props.onClose).toHaveBeenCalledTimes(1); + }); + + it('should invoke onClose when clicking on Cancel button', () => { + render(); + + userEvent.click(screen.getByText('Cancel')); + expect(mock_props.onClose).toHaveBeenCalled(); + }); +}); diff --git a/packages/account/src/Components/unlink-account-modal/index.js b/packages/account/src/Components/unlink-account-modal/index.js deleted file mode 100644 index c806dfd906cc..000000000000 --- a/packages/account/src/Components/unlink-account-modal/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import UnlinkAccountModal from './unlink-account-modal.jsx'; - -export default UnlinkAccountModal; diff --git a/packages/account/src/Components/unlink-account-modal/index.ts b/packages/account/src/Components/unlink-account-modal/index.ts new file mode 100644 index 000000000000..39493d809a90 --- /dev/null +++ b/packages/account/src/Components/unlink-account-modal/index.ts @@ -0,0 +1,3 @@ +import UnlinkAccountModal from './unlink-account-modal'; + +export default UnlinkAccountModal; diff --git a/packages/account/src/Components/unlink-account-modal/unlink-account-modal.jsx b/packages/account/src/Components/unlink-account-modal/unlink-account-modal.tsx similarity index 74% rename from packages/account/src/Components/unlink-account-modal/unlink-account-modal.jsx rename to packages/account/src/Components/unlink-account-modal/unlink-account-modal.tsx index f39ecf5bf8b7..04c43a505d0c 100644 --- a/packages/account/src/Components/unlink-account-modal/unlink-account-modal.jsx +++ b/packages/account/src/Components/unlink-account-modal/unlink-account-modal.tsx @@ -1,9 +1,24 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Button, Modal, Text, Icon } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -const UnlinkAccountModal = ({ onClose, is_open, identifier_title, onClickSendEmail }) => { +type TUnlinkAccountModalProps = { + onClose: () => void; + is_open: boolean; + identifier_title: string; + onClickSendEmail: () => void; +}; + +/** + * Modal displayed when user clicks on the 'Change email' button in the account settings page. + * @name UnlinkAccountModal + * @param {Function} onClose - function to close the modal + * @param {boolean} is_open - state to toggle the modal + * @param {string} identifier_title - title of the identifier (e.g. Google, Facebook) + * @param {Function} onClickSendEmail - function to send email to user + * @returns {React.ReactNode} - returns jsx component + */ +const UnlinkAccountModal = ({ onClose, is_open, identifier_title, onClickSendEmail }: TUnlinkAccountModalProps) => { const onClickUnlinkButton = () => { onClose(); onClickSendEmail(); @@ -40,11 +55,4 @@ const UnlinkAccountModal = ({ onClose, is_open, identifier_title, onClickSendEma ); }; -UnlinkAccountModal.prototypes = { - onClose: PropTypes.func, - is_open: PropTypes.bool, - identifier_title: PropTypes.string, - onClickSendEmail: PropTypes.func, -}; - export default UnlinkAccountModal; diff --git a/packages/account/src/Configs/__test__/address-details-config.spec.ts b/packages/account/src/Configs/__test__/address-details-config.spec.ts index 16b0cb99945e..a6c0cf07a7b2 100644 --- a/packages/account/src/Configs/__test__/address-details-config.spec.ts +++ b/packages/account/src/Configs/__test__/address-details-config.spec.ts @@ -1,4 +1,4 @@ -import { TSchema, regex_checks } from '@deriv/shared'; +import { regex_checks, TSchema } from '@deriv/shared'; import { transformConfig } from 'Configs/address-details-config'; describe('address-details-config', () => { diff --git a/packages/account/src/Configs/__test__/get-status-badge-config.spec.tsx b/packages/account/src/Configs/__test__/get-status-badge-config.spec.tsx new file mode 100644 index 000000000000..aaa24d33998b --- /dev/null +++ b/packages/account/src/Configs/__test__/get-status-badge-config.spec.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { BrowserRouter } from 'react-router-dom'; +import { fireEvent, render, screen } from '@testing-library/react'; +import getStatusBadgeConfig from 'Configs/get-status-badge-config'; + +describe('getStatusBadgeConfig', () => { + let account_status = ''; + const openFailedVerificationModal = jest.fn(); + const selected_account_type = 'test type'; + + const renderCheck = ( + account_status: Parameters[0], + openFailedVerificationModal: Parameters[1], + selected_account_type: Parameters[2] + ) => { + const badge = getStatusBadgeConfig(account_status, openFailedVerificationModal, selected_account_type); + render( + +
{badge.text}
+
{badge.icon}
+
+ ); + }; + + it('should render pending status', () => { + account_status = 'pending'; + + renderCheck(account_status, openFailedVerificationModal, selected_account_type); + + expect(screen.getByText('Pending verification')).toBeInTheDocument(); + expect(screen.getByText('IcAlertWarning')).toBeInTheDocument(); + }); + + it('should render failed status and trigger "Why?"', () => { + account_status = 'failed'; + + renderCheck(account_status, openFailedVerificationModal, selected_account_type); + + expect(screen.getByText('Verification failed.')).toBeInTheDocument(); + expect(screen.getByText('IcRedWarning')).toBeInTheDocument(); + + fireEvent.click(screen.getByText('Why?')); + expect(openFailedVerificationModal).toBeCalledWith(selected_account_type); + }); + + it('should render need_verification status and redirect to identity', () => { + account_status = 'need_verification'; + + renderCheck(account_status, openFailedVerificationModal, selected_account_type); + + expect(screen.getByText('Need verification.')); + expect(screen.getByText('IcAlertInfo')); + + const btn = screen.getByRole('link', { name: 'Verify now' }); + expect(btn).toBeInTheDocument(); + expect(btn.hasAttribute('href')); + expect(btn.hasAttribute('/account/proof-of-identity')); + }); +}); diff --git a/packages/account/src/Configs/__test__/personal-details-config.spec.ts b/packages/account/src/Configs/__test__/personal-details-config.spec.ts index fca6bf8183b9..38cc83d36ca1 100644 --- a/packages/account/src/Configs/__test__/personal-details-config.spec.ts +++ b/packages/account/src/Configs/__test__/personal-details-config.spec.ts @@ -11,75 +11,70 @@ jest.mock('@deriv/shared', () => ({ toMoment: jest.fn(), validLength: jest.fn(), })); + describe('personal-details-config', () => { - const mock_props = { + const mock_props: Parameters[0] = { residence_list: [ { - services: { - idv: { - documents_supported: {}, - has_visual_sample: 0, - is_country_supported: 0, - }, - onfido: { - documents_supported: { - passport: { - display_name: 'Passport', - }, - }, - is_country_supported: 0, - }, - }, - phone_idd: '93', - text: 'Afghanistan', - value: 'af', + phone_idd: '62', + text: 'Indonesia', + value: 'is', tin_format: [], disabled: '1', - }, - { - services: { - idv: { - documents_supported: {}, - has_visual_sample: 0, - is_country_supported: 0, - }, - onfido: { - documents_supported: { - driving_licence: { - display_name: 'Driving Licence', - }, - national_identity_card: { - display_name: 'National Identity Card', - }, - passport: { - display_name: 'Passport', - }, - residence_permit: { - display_name: 'Residence Permit', + identity: { + services: { + idv: { + documents_supported: {}, + has_visual_sample: 0, + is_country_supported: 0, + }, + onfido: { + documents_supported: { + driving_licence: { + display_name: 'Driving Licence', + }, + national_identity_card: { + display_name: 'National Identity Card', + }, + passport: { + display_name: 'Passport', + }, + residence_permit: { + display_name: 'Residence Permit', + }, }, + is_country_supported: 1, }, - is_country_supported: 1, }, - phone_idd: '93', - text: 'Indonesia', - value: 'af', - tin_format: [], - disabled: '1', }, }, ], account_settings: { - tax_residence: 'af', + tax_residence: 'id', residence: 'Indonesia', + document_type: '', + document_number: '', }, - is_appstore: false, real_account_signup_target: 'maltainvest', - account_status: { cashier_validation: ['system_maintenance'] }, + account_status: { + cashier_validation: ['system_maintenance'], + currency_config: { + USD: { + is_deposit_suspended: 0, + is_withdrawal_suspended: 0, + }, + }, + p2p_status: 'active', + prompt_client_to_authenticate: 0, + risk_classification: '', + status: [''], + }, + residence: 'af', }; it('should return account tax residence as default value if it is already set', () => { const personal_details = personal_details_config(mock_props); - expect(personal_details[0].tax_residence.default_value).toEqual('Afghanistan'); + expect(personal_details.tax_residence.default_value).toEqual('Indonesia'); }); it('should return residence as the default value for MF clients, If the account tax residence is not set', () => { @@ -91,7 +86,7 @@ describe('personal-details-config', () => { }, }; const personal_details = personal_details_config(new_props); - expect(personal_details[0].tax_residence.default_value).toEqual(new_props.account_settings.residence); + expect(personal_details.tax_residence.default_value).toEqual(new_props.account_settings.residence); }); it('should not set default value for CR clients, If the account tax residence is not set', () => { @@ -104,7 +99,7 @@ describe('personal-details-config', () => { }, }; const personal_details = personal_details_config(new_props); - expect(personal_details[0].tax_residence.default_value).toEqual(''); + expect(personal_details.tax_residence.default_value).toEqual(''); }); it('should include svg in additional fields if client is not high risk for mt5', () => { @@ -121,7 +116,7 @@ describe('personal-details-config', () => { 'account_opening_reason', ]; additional_fields.forEach(field => { - expect(personal_details[0][field].supported_in).toContain('svg'); + expect(personal_details[field].supported_in).toContain('svg'); }); }); }); diff --git a/packages/account/src/Configs/accept-risk-config.ts b/packages/account/src/Configs/accept-risk-config.ts index a2fd562e7191..1b609b76cd31 100644 --- a/packages/account/src/Configs/accept-risk-config.ts +++ b/packages/account/src/Configs/accept-risk-config.ts @@ -1,5 +1,5 @@ -import { getDefaultFields } from '@deriv/shared'; -import { TSchema } from 'Types'; +import React from 'react'; +import { getDefaultFields, TSchema } from '@deriv/shared'; const accept_risk_config: TSchema = { accept_risk: { diff --git a/packages/account/src/Configs/address-details-config.ts b/packages/account/src/Configs/address-details-config.ts index 46b8b85313a1..2ee5973910b1 100644 --- a/packages/account/src/Configs/address-details-config.ts +++ b/packages/account/src/Configs/address-details-config.ts @@ -1,4 +1,5 @@ -import { localize } from '@deriv/translations'; +import React from 'react'; +import { GetSettings } from '@deriv/api-types'; import { generateValidationFunction, getDefaultFields, @@ -7,8 +8,8 @@ import { address_permitted_special_characters_message, TSchema, } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import { TUpgradeInfo } from 'Types'; -import { GetSettings } from '@deriv/api-types'; type TAddressDetailsConfigProps = { upgrade_info: TUpgradeInfo; @@ -160,18 +161,17 @@ const address_details_config: ({ const addressDetailsConfig = ( { upgrade_info, real_account_signup_target, residence, account_settings }: TAddressDetailsConfigProps, - AddressDetails: React.Component, - is_appstore: boolean + AddressDetails: React.Component ) => { const is_svg = upgrade_info?.can_upgrade_to === 'svg'; const config = address_details_config({ account_settings, is_svg }); const disabled_items = account_settings.immutable_fields; - const is_mf = real_account_signup_target === 'maltainvest'; + const is_gb_residence = residence === 'gb'; return { header: { - active_title: is_appstore ? localize('Where do you live?') : localize('Complete your address details'), - title: is_appstore ? localize('ADDRESS') : localize('Address'), + active_title: localize('Complete your address details'), + title: localize('Address'), }, body: AddressDetails, form_value: getDefaultFields(real_account_signup_target, config), @@ -180,9 +180,8 @@ const addressDetailsConfig = ( real_account_signup_target, transformConfig(transformForResidence(config, residence), real_account_signup_target) ), - is_svg, disabled_items, - is_mf, + is_gb_residence, }, passthrough: ['residence_list', 'is_fully_authenticated', 'has_real_account'], icon: 'IcDashboardAddress', @@ -191,10 +190,10 @@ const addressDetailsConfig = ( /** * Transform general rules based on residence - * - * @param {object} rules - Original rules - * @param {string} residence - Client's residence - * @return {object} rules - Transformed rules + * @name transformForResidence + * @param rules - Original rules + * @param residence - Client's residence + * @return rules - Transformed rules */ const transformForResidence = (rules: TSchema, residence: string) => { // Isle of Man Clients do not need to fill out state since API states_list is empty. diff --git a/packages/account/src/Configs/currency-selector-config.ts b/packages/account/src/Configs/currency-selector-config.ts index 19ce792fe4f6..05b58358c8ba 100644 --- a/packages/account/src/Configs/currency-selector-config.ts +++ b/packages/account/src/Configs/currency-selector-config.ts @@ -1,6 +1,6 @@ +import React from 'react'; +import { generateValidationFunction, getDefaultFields, TSchema } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { generateValidationFunction, getDefaultFields } from '@deriv/shared'; -import { TSchema } from 'Types'; const currency_selector_config: TSchema = { currency: { @@ -12,13 +12,12 @@ const currency_selector_config: TSchema = { const currencySelectorConfig = ( { real_account_signup_target }: { real_account_signup_target: string }, - CurrencySelector: React.Component, - is_appstore: boolean + CurrencySelector: React.Component ) => { return { header: { - active_title: is_appstore ? localize('Select wallet currency') : localize('Please choose your currency'), - title: is_appstore ? localize('CURRENCY') : localize('Account currency'), + active_title: localize('Please choose your currency'), + title: localize('Account currency'), }, body: CurrencySelector, form_value: getDefaultFields(real_account_signup_target, currency_selector_config), diff --git a/packages/account/src/Configs/financial-details-config.ts b/packages/account/src/Configs/financial-details-config.ts index db4aa1cb9a05..489987fe8003 100644 --- a/packages/account/src/Configs/financial-details-config.ts +++ b/packages/account/src/Configs/financial-details-config.ts @@ -1,6 +1,7 @@ -import { localize } from '@deriv/translations'; -import { TSchema, generateValidationFunction, getDefaultFields } from '@deriv/shared'; +import React from 'react'; import { GetFinancialAssessment } from '@deriv/api-types'; +import { generateValidationFunction, getDefaultFields, TSchema } from '@deriv/shared'; +import { localize } from '@deriv/translations'; type TFinancialDetailsConfig = { real_account_signup_target: string; @@ -69,312 +70,247 @@ const financialDetailsConfig = ( form_value: getDefaultFields(real_account_signup_target, config), props: { validate: generateValidationFunction(real_account_signup_target, config), - account_turnover_enum: account_turnover_enum(), - binary_options_trading_experience_enum: binary_options_trading_experience_enum(), - binary_options_trading_frequency_enum: binary_options_trading_frequency_enum(), - cfd_trading_experience_enum: cfd_trading_experience_enum(), - cfd_trading_frequency_enum: cfd_trading_frequency_enum(), - education_level_enum: education_level_enum(), - employment_industry_enum: employment_industry_enum(), - employment_status_enum: employment_status_enum(), - forex_trading_experience_enum: forex_trading_experience_enum(), - forex_trading_frequency_enum: forex_trading_frequency_enum(), - estimated_worth_enum: estimated_worth_enum(), - income_source_enum: income_source_enum(), - net_income_enum: net_income_enum(), - occupation_enum: occupation_enum(), - other_instruments_trading_experience_enum: other_instruments_trading_experience_enum(), - other_instruments_trading_frequency_enum: other_instruments_trading_frequency_enum(), - source_of_wealth_enum: source_of_wealth_enum(), }, passthrough: ['residence_list', 'is_fully_authenticated'], }; }; -const account_turnover_enum = () => [ + +export const getAccountTurnoverList = () => [ { - value: 'Less than $25,000', text: localize('Less than $25,000'), + value: 'Less than $25,000', }, { - value: '$25,000 - $50,000', text: localize('$25,000 - $50,000'), + value: '$25,000 - $50,000', }, { - value: '$50,001 - $100,000', text: localize('$50,001 - $100,000'), + value: '$50,001 - $100,000', }, { - value: '$100,001 - $500,000', text: localize('$100,001 - $500,000'), + value: '$100,001 - $500,000', }, { - value: 'Over $500,000', text: localize('Over $500,000'), + value: 'Over $500,000', }, ]; -const binary_options_trading_experience_enum = () => [ - { - value: '0-1 year', - text: localize('0-1 year'), - }, - { - value: '1-2 years', - text: localize('1-2 years'), - }, - { - value: 'Over 3 years', - text: localize('Over 3 years'), - }, -]; -const binary_options_trading_frequency_enum = () => [ - { - value: '0-5 transactions in the past 12 months', - text: localize('0-5 transactions in the past 12 months'), - }, - { - value: '6-10 transactions in the past 12 months', - text: localize('6-10 transactions in the past 12 months'), - }, - { - value: '11-39 transactions in the past 12 months', - text: localize('11-39 transactions in the past 12 months'), - }, - { - value: '40 transactions or more in the past 12 months', - text: localize('40 transactions or more in the past 12 months'), - }, -]; -const cfd_trading_experience_enum = binary_options_trading_experience_enum; // Keeping alias to have a uniform readability -const cfd_trading_frequency_enum = binary_options_trading_frequency_enum; -const education_level_enum = () => [ - { - value: 'Primary', - text: localize('Primary'), - }, - { - value: 'Secondary', - text: localize('Secondary'), - }, - { - value: 'Tertiary', - text: localize('Tertiary'), - }, -]; -const employment_industry_enum = () => [ + +export const getEmploymentIndustryList = () => [ { - value: 'Construction', text: localize('Construction'), + value: 'Construction', }, { - value: 'Education', text: localize('Education'), + value: 'Education', }, { - value: 'Finance', text: localize('Finance'), + value: 'Finance', }, { - value: 'Health', text: localize('Health'), + value: 'Health', }, { - value: 'Tourism', text: localize('Tourism'), + value: 'Tourism', }, { - value: 'Information & Communications Technology', text: localize('Information & Communications Technology'), + value: 'Information & Communications Technology', }, { - value: 'Science & Engineering', text: localize('Science & Engineering'), + value: 'Science & Engineering', }, { - value: 'Legal', text: localize('Legal'), + value: 'Legal', }, { - value: 'Social & Cultural', text: localize('Social & Cultural'), + value: 'Social & Cultural', }, { - value: 'Agriculture', text: localize('Agriculture'), + value: 'Agriculture', }, { - value: 'Real Estate', text: localize('Real Estate'), + value: 'Real Estate', }, { - value: 'Food Services', text: localize('Food Services'), + value: 'Food Services', }, { - value: 'Manufacturing', text: localize('Manufacturing'), + value: 'Manufacturing', }, { - value: 'Unemployed', text: localize('Unemployed'), + value: 'Unemployed', }, ]; -const employment_status_enum = () => [ + +export const getOccupationList = () => [ { - value: 'Employed', - text: localize('Employed'), + text: localize('Chief Executives, Senior Officials and Legislators'), + value: 'Chief Executives, Senior Officials and Legislators', }, { - value: 'Pensioner', - text: localize('Pensioner'), + text: localize('Managers'), + value: 'Managers', }, { - value: 'Self-Employed', - text: localize('Self-Employed'), + text: localize('Professionals'), + value: 'Professionals', }, { - value: 'Student', - text: localize('Student'), + text: localize('Clerks'), + value: 'Clerks', }, { - value: 'Unemployed', - text: localize('Unemployed'), + text: localize('Personal Care, Sales and Service Workers'), + value: 'Personal Care, Sales and Service Workers', }, -]; -const estimated_worth_enum = () => [ { - value: 'Less than $100,000', - text: localize('Less than $100,000'), + text: localize('Agricultural, Forestry and Fishery Workers'), + value: 'Agricultural, Forestry and Fishery Workers', }, { - value: '$100,000 - $250,000', - text: localize('$100,000 - $250,000'), + text: localize('Craft, Metal, Electrical and Electronics Workers'), + value: 'Craft, Metal, Electrical and Electronics Workers', }, { - value: '$250,001 - $500,000', - text: localize('$250,001 - $500,000'), + text: localize('Plant and Machine Operators and Assemblers'), + value: 'Plant and Machine Operators and Assemblers', }, { - value: '$500,001 - $1,000,000', - text: localize('$500,001 - $1,000,000'), + text: localize('Cleaners and Helpers'), + value: 'Cleaners and Helpers', }, { - value: 'Over $1,000,000', - text: localize('Over $1,000,000'), + text: localize('Mining, Construction, Manufacturing and Transport Workers'), + value: 'Mining, Construction, Manufacturing and Transport Workers', }, -]; -const forex_trading_experience_enum = binary_options_trading_experience_enum; // Keeping alias to have a uniform readability -const forex_trading_frequency_enum = binary_options_trading_frequency_enum; -const income_source_enum = () => [ { - value: 'Salaried Employee', - text: localize('Salaried Employee'), + text: localize('Armed Forces'), + value: 'Armed Forces', }, { - value: 'Self-Employed', - text: localize('Self-Employed'), + text: localize('Government Officers'), + value: 'Government Officers', }, { - value: 'Investments & Dividends', - text: localize('Investments & Dividends'), + text: localize('Students'), + value: 'Students', }, { - value: 'Pension', - text: localize('Pension'), + text: localize('Unemployed'), + value: 'Unemployed', }, +]; + +export const getSourceOfWealthList = () => [ { - value: 'State Benefits', - text: localize('State Benefits'), + text: localize('Accumulation of Income/Savings'), + value: 'Accumulation of Income/Savings', }, { - value: 'Savings & Inheritance', - text: localize('Savings & Inheritance'), + text: localize('Cash Business'), + value: 'Cash Business', }, -]; -const net_income_enum = account_turnover_enum; -const occupation_enum = () => [ { - value: 'Chief Executives, Senior Officials and Legislators', - text: localize('Chief Executives, Senior Officials and Legislators'), + text: localize('Company Ownership'), + value: 'Company Ownership', }, { - value: 'Managers', - text: localize('Managers'), + text: localize('Divorce Settlement'), + value: 'Divorce Settlement', }, { - value: 'Professionals', - text: localize('Professionals'), + text: localize('Inheritance'), + value: 'Inheritance', }, { - value: 'Clerks', - text: localize('Clerks'), + text: localize('Investment Income'), + value: 'Investment Income', }, { - value: 'Personal Care, Sales and Service Workers', - text: localize('Personal Care, Sales and Service Workers'), + text: localize('Sale of Property'), + value: 'Sale of Property', }, +]; + +export const getEducationLevelList = () => [ { - value: 'Agricultural, Forestry and Fishery Workers', - text: localize('Agricultural, Forestry and Fishery Workers'), + text: localize('Primary'), + value: 'Primary', }, { - value: 'Craft, Metal, Electrical and Electronics Workers', - text: localize('Craft, Metal, Electrical and Electronics Workers'), + text: localize('Secondary'), + value: 'Secondary', }, { - value: 'Plant and Machine Operators and Assemblers', - text: localize('Plant and Machine Operators and Assemblers'), + text: localize('Tertiary'), + value: 'Tertiary', }, +]; + +export const getNetIncomeList = () => [...getAccountTurnoverList()]; + +export const getEstimatedWorthList = () => [ { - value: 'Cleaners and Helpers', - text: localize('Cleaners and Helpers'), + text: localize('Less than $100,000'), + value: 'Less than $100,000', }, { - value: 'Mining, Construction, Manufacturing and Transport Workers', - text: localize('Mining, Construction, Manufacturing and Transport Workers'), + text: localize('$100,000 - $250,000'), + value: '$100,000 - $250,000', }, { - value: 'Armed Forces', - text: localize('Armed Forces'), + text: localize('$250,001 - $500,000'), + value: '$250,001 - $500,000', }, { - value: 'Government Officers', - text: localize('Students'), + text: localize('$500,001 - $1,000,000'), + value: '$500,001 - $1,000,000', }, { - value: 'Unemployed', - text: localize('Unemployed'), + text: localize('Over $1,000,000'), + value: 'Over $1,000,000', }, ]; -const other_instruments_trading_experience_enum = binary_options_trading_experience_enum; // Keeping alias to have a uniform readability -const other_instruments_trading_frequency_enum = binary_options_trading_frequency_enum; -const source_of_wealth_enum = () => [ - { - value: 'Accumulation of Income/Savings', - text: localize('Accumulation of Income/Savings'), - }, + +export const getIncomeSourceList = () => [ { - value: 'Cash Business', - text: localize('Cash Business'), + text: localize('Salaried Employee'), + value: 'Salaried Employee', }, { - value: 'Company Ownership', - text: localize('Company Ownership'), + text: localize('Self-Employed'), + value: 'Self-Employed', }, { - value: 'Divorce Settlement', - text: localize('Divorce Settlement'), + text: localize('Investments & Dividends'), + value: 'Investments & Dividends', }, { - value: 'Inheritance', - text: localize('Inheritance'), + text: localize('Pension'), + value: 'Pension', }, { - value: 'Investment Income', - text: localize('Investment Income'), + text: localize('State Benefits'), + value: 'State Benefits', }, { - value: 'Sale of Property', - text: localize('Sale of Property'), + text: localize('Savings & Inheritance'), + value: 'Savings & Inheritance', }, ]; diff --git a/packages/account/src/Configs/get-status-badge-config.js b/packages/account/src/Configs/get-status-badge-config.tsx similarity index 92% rename from packages/account/src/Configs/get-status-badge-config.js rename to packages/account/src/Configs/get-status-badge-config.tsx index 5f05486e7666..7e394f01c8a4 100644 --- a/packages/account/src/Configs/get-status-badge-config.js +++ b/packages/account/src/Configs/get-status-badge-config.tsx @@ -3,7 +3,11 @@ import { Link } from 'react-router-dom'; import { Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; -const getStatusBadgeConfig = (account_status, openFailedVerificationModal, selected_account_type) => { +const getStatusBadgeConfig = ( + account_status: string, + openFailedVerificationModal: (selected_account_type: string) => void, + selected_account_type: string +) => { switch (account_status) { case 'pending': return { diff --git a/packages/account/src/Configs/personal-details-config.ts b/packages/account/src/Configs/personal-details-config.ts index 1bc0691e9d24..1c404fb4f36d 100644 --- a/packages/account/src/Configs/personal-details-config.ts +++ b/packages/account/src/Configs/personal-details-config.ts @@ -1,3 +1,4 @@ +import { GetAccountStatus, GetSettings, ResidenceList } from '@deriv/api-types'; import { TSchema, generateValidationFunction, @@ -8,18 +9,17 @@ import { } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { shouldShowIdentityInformation } from 'Helpers/utils'; -import { TResidenseList, TUpgradeInfo } from 'Types'; -import { GetAccountStatus, GetSettings } from '@deriv/api-types'; +import { TUpgradeInfo } from 'Types'; +import { PHONE_NUMBER_LENGTH } from 'Constants/personal-details'; type TPersonalDetailsConfig = { upgrade_info?: TUpgradeInfo; real_account_signup_target: string; - residence_list: TResidenseList[]; + residence_list: ResidenceList; account_settings: GetSettings & { document_type: string; document_number: string; }; - is_appstore?: boolean; residence: string; account_status: GetAccountStatus; is_high_risk_client_for_mt5?: boolean; @@ -28,7 +28,6 @@ type TPersonalDetailsConfig = { export const personal_details_config = ({ residence_list, account_settings, - is_appstore, real_account_signup_target, is_high_risk_client_for_mt5, }: TPersonalDetailsConfig) => { @@ -36,11 +35,7 @@ export const personal_details_config = ({ return {}; } - // minimum characters required is 9 numbers (excluding +- signs or space) - const min_phone_number = 9; - const max_phone_number = 35; - - const default_residence = real_account_signup_target === 'maltainvest' ? account_settings?.residence : ''; + const default_residence = (real_account_signup_target === 'maltainvest' && account_settings?.residence) || ''; const config = { account_opening_reason: { @@ -86,16 +81,18 @@ export const personal_details_config = ({ }, place_of_birth: { supported_in: ['maltainvest', 'iom', 'malta'], - default_value: account_settings.place_of_birth - ? residence_list.find(item => item.value === account_settings.place_of_birth)?.text - : '', + default_value: + (account_settings.place_of_birth && + residence_list.find(item => item.value === account_settings.place_of_birth)?.text) || + '', rules: [['req', localize('Place of birth is required.')]], }, citizen: { supported_in: ['iom', 'malta', 'maltainvest'], - default_value: account_settings.citizen - ? residence_list.find(item => item.value === account_settings.citizen)?.text - : '', + default_value: + (account_settings.citizen && + residence_list.find(item => item.value === account_settings.citizen)?.text) || + '', rules: [['req', localize('Citizenship is required')]], }, phone: { @@ -108,20 +105,22 @@ export const personal_details_config = ({ (value: string) => { // phone_trim uses regex that trims non-digits const phone_trim = value.replace(/\D/g, ''); - return validLength(phone_trim, { min: min_phone_number, max: max_phone_number }); + // minimum characters required is 9 numbers (excluding +- signs or space) + return validLength(phone_trim, { min: PHONE_NUMBER_LENGTH.MIN, max: PHONE_NUMBER_LENGTH.MAX }); }, localize('You should enter {{min}}-{{max}} numbers.', { - min: min_phone_number, - max: max_phone_number, + min: PHONE_NUMBER_LENGTH.MIN, + max: PHONE_NUMBER_LENGTH.MAX, }), ], ], }, tax_residence: { //if tax_residence is already set, we will use it as default value else for mf clients we will use residence as default value - default_value: account_settings?.tax_residence - ? residence_list.find(item => item.value === account_settings?.tax_residence)?.text ?? '' - : default_residence, + default_value: + (account_settings?.tax_residence && + residence_list.find(item => item.value === account_settings?.tax_residence)?.text) || + default_residence, supported_in: ['maltainvest'], rules: [['req', localize('Tax residence is required.')]], }, @@ -177,7 +176,6 @@ export const personal_details_config = ({ text: '', value: '', example_format: '', - sample_image: '', }, supported_in: ['svg'], rules: [], @@ -189,39 +187,26 @@ export const personal_details_config = ({ }, }; - const getConfig = () => { - // Need to check if client is high risk (only have SVG i.e. China & Russia) - // No need to get additinal details when client is high risk - if (!is_high_risk_client_for_mt5 && real_account_signup_target !== 'maltainvest') { - const properties_to_update: (keyof typeof config)[] = [ - 'place_of_birth', - 'tax_residence', - 'tax_identification_number', - 'account_opening_reason', - ]; - - properties_to_update.forEach(key => { - config[key].supported_in.push('svg'); - // Remove required rule for TIN and Tax residence from the config to make the fields optional - if (key === 'tax_identification_number' || key === 'tax_residence') { - config[key].rules = config[key].rules.filter(rule => rule[0] !== 'req'); - } - }); - } + // Need to check if client is high risk (only have SVG i.e. China & Russia) + // No need to get additinal details when client is high risk + if (!is_high_risk_client_for_mt5 && real_account_signup_target !== 'maltainvest') { + const properties_to_update: (keyof typeof config)[] = [ + 'place_of_birth', + 'tax_residence', + 'tax_identification_number', + 'account_opening_reason', + ]; - if (is_appstore) { - const allowed_fields = ['first_name', 'last_name', 'date_of_birth', 'phone']; - return Object.keys(config).reduce((new_config, key) => { - if (allowed_fields.includes(key)) { - new_config[key] = config[key]; - } - return new_config; - }, {}); - } - return config; - }; + properties_to_update.forEach(key => { + config[key].supported_in.push('svg'); + // Remove required rule for TIN and Tax residence from the config to make the fields optional + if (key === 'tax_identification_number' || key === 'tax_residence') { + config[key].rules = config[key].rules.filter(rule => rule[0] !== 'req'); + } + }); + } - return [getConfig()]; + return config; }; const personalDetailsConfig = ( @@ -237,10 +222,9 @@ const personalDetailsConfig = ( PersonalDetails: T, is_appstore = false ) => { - const [config] = personal_details_config({ + const config = personal_details_config({ residence_list, account_settings, - is_appstore, real_account_signup_target, residence, account_status, diff --git a/packages/account/src/Configs/proof-of-identity-config.ts b/packages/account/src/Configs/proof-of-identity-config.ts index e4ab20cbd145..cf1b0260e3ec 100644 --- a/packages/account/src/Configs/proof-of-identity-config.ts +++ b/packages/account/src/Configs/proof-of-identity-config.ts @@ -1,3 +1,4 @@ +import React from 'react'; import { GetSettings } from '@deriv/api-types'; import { localize } from '@deriv/translations'; diff --git a/packages/account/src/Configs/terms-of-use-config.ts b/packages/account/src/Configs/terms-of-use-config.ts index 5e033268edf6..7cdc490913e8 100644 --- a/packages/account/src/Configs/terms-of-use-config.ts +++ b/packages/account/src/Configs/terms-of-use-config.ts @@ -1,7 +1,6 @@ -import { getDefaultFields, isDesktop } from '@deriv/shared'; - +import React from 'react'; +import { getDefaultFields, isDesktop, TSchema } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { TSchema } from 'Types'; const terms_of_use_config: TSchema = { agreed_tos: { @@ -16,14 +15,13 @@ const terms_of_use_config: TSchema = { const termsOfUseConfig = ( { real_account_signup_target }: { real_account_signup_target: string }, - TermsOfUse: React.Component, - is_appstore = false + TermsOfUse: React.Component ) => { - const active_title = is_appstore ? localize('Our terms of use') : localize('Terms of use'); + const active_title = localize('Terms of use'); return { header: { active_title: isDesktop() ? active_title : null, - title: is_appstore ? localize('TERMS OF USE') : localize('Terms of use'), + title: active_title, }, body: TermsOfUse, form_value: getDefaultFields(real_account_signup_target, terms_of_use_config), diff --git a/packages/account/src/Configs/trading-assessment-config.ts b/packages/account/src/Configs/trading-assessment-config.tsx similarity index 99% rename from packages/account/src/Configs/trading-assessment-config.ts rename to packages/account/src/Configs/trading-assessment-config.tsx index 00343186ace8..1637c828fc5b 100644 --- a/packages/account/src/Configs/trading-assessment-config.ts +++ b/packages/account/src/Configs/trading-assessment-config.tsx @@ -1,11 +1,12 @@ +import React from 'react'; +import { GetFinancialAssessment, GetSettings } from '@deriv/api-types'; import { generateValidationFunction, getDefaultFields } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { GetFinancialAssessment, GetSettings } from '@deriv/api-types'; type TTradingAssessmentConfig = { - real_account_signup_target: string; - financial_assessment: GetFinancialAssessment; account_settings: GetSettings; + financial_assessment: GetFinancialAssessment; + real_account_signup_target: string; setSubSectionIndex: number; }; diff --git a/packages/account/src/Constants/external-urls.ts b/packages/account/src/Constants/external-urls.ts new file mode 100644 index 000000000000..3d3789cc86be --- /dev/null +++ b/packages/account/src/Constants/external-urls.ts @@ -0,0 +1,2 @@ +export const OECD_TIN_FORMAT_URL = + 'https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/'; diff --git a/packages/account/src/Constants/idv-document-config.ts b/packages/account/src/Constants/idv-document-config.ts index 59fdbc749838..c63b2dcdf1d0 100644 --- a/packages/account/src/Constants/idv-document-config.ts +++ b/packages/account/src/Constants/idv-document-config.ts @@ -1,8 +1,5 @@ -import { getUrlBase } from '@deriv/shared'; import { localize } from '@deriv/translations'; -const getImageLocation = (image_name: string) => getUrlBase(`/public/images/common/${image_name}`); - // Note: Ensure that the object keys matches BE API's keys. This is simply a mapping for FE templates const getIDVDocumentConfig = () => ({ @@ -10,119 +7,98 @@ const getIDVDocumentConfig = () => ({ alien_card: { new_display_name: '', example_format: '123456', - sample_image: getImageLocation('ke_alien_card.png'), }, national_id: { new_display_name: '', example_format: '12345678', - sample_image: getImageLocation('ke_national_identity_card.png'), }, passport: { new_display_name: '', example_format: 'A12345678', - sample_image: getImageLocation('ke_passport.png'), }, }, za: { national_id: { new_display_name: localize('National ID'), example_format: '1234567890123', - sample_image: getImageLocation('za_national_identity_card.png'), }, national_id_no_photo: { new_display_name: localize('National ID (No Photo)'), example_format: '1234567890123', - sample_image: '', }, }, ng: { bvn: { new_display_name: localize('Bank Verification Number'), example_format: '12345678901', - sample_image: '', }, cac: { new_display_name: localize('Corporate Affairs Commission'), example_format: '12345678', - sample_image: '', }, drivers_license: { new_display_name: '', example_format: 'ABC123456789', - sample_image: getImageLocation('ng_drivers_license.png'), }, nin: { new_display_name: localize('National Identity Number'), example_format: '12345678901', - sample_image: '', }, nin_slip: { new_display_name: localize('National Identity Number Slip'), example_format: '12345678901', - sample_image: getImageLocation('ng_nin_slip.png'), }, tin: { new_display_name: localize('Taxpayer identification number'), example_format: '12345678-1234', - sample_image: '', }, voter_id: { new_display_name: localize('Voter ID'), example_format: '1234567890123456789', - sample_image: getImageLocation('ng_voter_id.png'), }, }, gh: { drivers_license: { new_display_name: '', example_format: 'B1234567', - sample_image: '', }, national_id: { new_display_name: localize('National ID'), example_format: 'GHA-123456789-1', - sample_image: '', }, passport: { new_display_name: localize('Passport'), example_format: 'G1234567', - sample_image: '', }, ssnit: { new_display_name: localize('Social Security and National Insurance Trust'), example_format: 'C123456789012', - sample_image: '', }, voter_id: { new_display_name: localize('Voter ID'), example_format: '01234567890', - sample_image: '', }, }, br: { cpf: { new_display_name: localize('CPF'), example_format: '123.456.789-12', - sample_image: '', }, }, ug: { national_id: { new_display_name: localize('National ID'), example_format: 'CM12345678PE1D', - sample_image: getImageLocation('ug_national_identity_card.png'), }, national_id_no_photo: { new_display_name: localize('National ID (No Photo)'), example_format: 'CM12345678PE1D', - sample_image: '', }, }, zw: { national_id: { new_display_name: localize('National ID'), example_format: '081234567F53', - sample_image: getImageLocation('zw_national_identity_card.png'), }, }, cl: { diff --git a/packages/account/src/Constants/personal-details.ts b/packages/account/src/Constants/personal-details.ts new file mode 100644 index 000000000000..936d07ecec71 --- /dev/null +++ b/packages/account/src/Constants/personal-details.ts @@ -0,0 +1,4 @@ +export const PHONE_NUMBER_LENGTH = { + MIN: 9, + MAX: 35, +}; diff --git a/packages/account/src/Containers/__tests__/routes.spec.tsx b/packages/account/src/Containers/__tests__/routes.spec.tsx index 6c06ae2b351c..5d2ad2c67afe 100644 --- a/packages/account/src/Containers/__tests__/routes.spec.tsx +++ b/packages/account/src/Containers/__tests__/routes.spec.tsx @@ -10,10 +10,6 @@ jest.mock('Components/Routes', () => ({ BinaryRoutes: jest.fn(() => 'MockedBinaryRoutesComponent'), })); -jest.mock('onfido-sdk-ui', () => ({ - init: jest.fn().mockResolvedValue({}), -})); - jest.mock('@deriv/components', () => ({ ...jest.requireActual('@deriv/components'), PageError: jest.fn(() => 'MockedPageErrorComponent'), diff --git a/packages/account/src/Helpers/__tests__/utils.spec.tsx b/packages/account/src/Helpers/__tests__/utils.spec.tsx index e3aeeb15070b..2589a55b4026 100644 --- a/packages/account/src/Helpers/__tests__/utils.spec.tsx +++ b/packages/account/src/Helpers/__tests__/utils.spec.tsx @@ -119,7 +119,6 @@ describe('getDocumentData', () => { expect(getDocumentData('zw', 'national_id')).toEqual({ new_display_name: 'National ID', example_format: '081234567F53', - sample_image: '/public/images/common/zw_national_identity_card.png', }); }); }); diff --git a/packages/account/src/Helpers/utils.tsx b/packages/account/src/Helpers/utils.tsx index 637724d9ef60..b9403a5b0411 100644 --- a/packages/account/src/Helpers/utils.tsx +++ b/packages/account/src/Helpers/utils.tsx @@ -59,7 +59,6 @@ export const getDocumentData = (country_code: string, document_type: string) => const DEFAULT_CONFIG = { new_display_name: '', example_format: '', - sample_image: '', }; const IDV_DOCUMENT_DATA: any = getIDVDocuments(country_code); return IDV_DOCUMENT_DATA[document_type] ?? DEFAULT_CONFIG; diff --git a/packages/account/src/Sections/Profile/LanguageSettings/__tests__/language-settings.spec.tsx b/packages/account/src/Sections/Profile/LanguageSettings/__tests__/language-settings.spec.tsx new file mode 100644 index 000000000000..b2eb19d9925c --- /dev/null +++ b/packages/account/src/Sections/Profile/LanguageSettings/__tests__/language-settings.spec.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { isMobile, routes } from '@deriv/shared'; +import LanguageSettings from '../language-settings'; +import { mockStore, StoreProvider } from '@deriv/stores'; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isMobile: jest.fn(() => false), +})); + +jest.mock('@deriv/translations', () => ({ + ...jest.requireActual('@deriv/translations'), + getAllowedLanguages: jest.fn(() => ({ lang_1: 'Test Lang 1', lang_2: 'Test Lang 2' })), +})); + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + Icon: jest.fn(() =>
Flag Icon
), +})); + +jest.mock('react-i18next', () => ({ + ...jest.requireActual('react-i18next'), + useTranslation: jest.fn(() => ({ i18n: { changeLanguage: jest.fn() } })), +})); + +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + Redirect: jest.fn(() =>
Redirect
), +})); + +describe('LanguageSettings', () => { + const mockRootStore = mockStore({ + common: { + current_language: 'lang_1', + }, + }); + + const renderLanguageSettings = () => { + render(, { + wrapper: ({ children }) => {children}, + }); + }; + + it('should render LanguageSettings', () => { + renderLanguageSettings(); + + expect(screen.getByText('Select Language')).toBeInTheDocument(); + + const flags_icons = screen.getAllByText('Flag Icon'); + const lang_1 = screen.getByText('Test Lang 1'); + const lang_2 = screen.getByText('Test Lang 2'); + + expect(flags_icons).toHaveLength(2); + expect(lang_1).toBeInTheDocument(); + expect(/(active)/i.test(lang_1.className)).toBeTruthy(); + expect(lang_2).toBeInTheDocument(); + expect(/(active)/i.test(lang_2.className)).toBeFalsy(); + }); + + it('should trigger language change', () => { + renderLanguageSettings(); + + const lang_2 = screen.getByText('Test Lang 2'); + userEvent.click(lang_2); + + expect(mockRootStore.common.changeSelectedLanguage).toHaveBeenCalled(); + }); + + it('should redirect for mobile', () => { + (isMobile as jest.Mock).mockReturnValue(true); + Object.defineProperty(window, 'location', { + configurable: true, + value: { pathname: routes.languages }, + }); + + renderLanguageSettings(); + + expect(screen.queryByText('Select Language')).not.toBeInTheDocument(); + expect(screen.getByText('Redirect')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Sections/Profile/LanguageSettings/language-settings.tsx b/packages/account/src/Sections/Profile/LanguageSettings/language-settings.tsx index cb0b7eea8b27..fb8886034605 100644 --- a/packages/account/src/Sections/Profile/LanguageSettings/language-settings.tsx +++ b/packages/account/src/Sections/Profile/LanguageSettings/language-settings.tsx @@ -1,68 +1,40 @@ import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { Button, DesktopWrapper } from '@deriv/components'; +import { Redirect } from 'react-router-dom'; import { localize, getAllowedLanguages } from '@deriv/translations'; +import { isMobile, routes } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import FormSubHeader from 'Components/form-sub-header'; -import { Formik, FormikHandlers, FormikHelpers, FormikValues } from 'formik'; -import FormFooter from 'Components/form-footer'; import LanguageRadioButton from 'Components/language-settings'; -import { observer, useStore } from '@deriv/stores'; const LanguageSettings = observer(() => { const { common } = useStore(); - const { changeSelectedLanguage, current_language, isCurrentLanguage } = common; - const { i18n } = useTranslation(); + const { changeSelectedLanguage, current_language } = common; + + if (window.location.pathname === routes.languages && isMobile()) { + return ; + } + const allowed_language_keys: string[] = Object.keys(getAllowedLanguages()); - const initial_values = { language_code: current_language }; return ( - { - const { language_code } = values; - await changeSelectedLanguage(language_code); - await i18n.changeLanguage?.(language_code); - }} - > - {({ handleSubmit, setFieldValue, values }: FormikHandlers & FormikHelpers & FormikValues) => { - return ( -
-
- - - -
- {allowed_language_keys.map(language_key => { - return ( - ) => - setFieldValue('language_code', event.target.value) - } - /> - ); - })} -
-
- -
+ + + } + > +
+ + {({ field }: FieldProps) => ( + { + setFieldTouched('token_name', true); + handleChange(e); + }} + onBlur={handleBlur} + hint={ + } - )} - type='submit' - is_disabled={ - !dirty || - isSubmitting || - !isValid || - !selectedTokenScope(values).length + required + error={ + touched.token_name && errors.token_name + ? errors.token_name + : undefined + } + /> + )} + + -
-
- - } - > - - - - - )} - - - {is_desktop && } -
- - - + )} + type='submit' + is_disabled={ + !dirty || + isSubmitting || + !isValid || + !selectedTokenScope(values).length + } + has_effect + is_loading={isSubmitting} + is_submit_success={isLoading} + primary + large + > + + +
+ + + } + > + + + + + )} + + + {is_desktop && } +
+ + ); -}; +}); -export default observer(ApiToken); +export default ApiToken; diff --git a/packages/account/src/Sections/Security/ClosingAccount/__tests__/closing-account-reason.spec.tsx b/packages/account/src/Sections/Security/ClosingAccount/__tests__/closing-account-reason.spec.tsx index 608e2c14ab3f..997ae836f78f 100644 --- a/packages/account/src/Sections/Security/ClosingAccount/__tests__/closing-account-reason.spec.tsx +++ b/packages/account/src/Sections/Security/ClosingAccount/__tests__/closing-account-reason.spec.tsx @@ -1,13 +1,13 @@ import React from 'react'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { APIProvider, useRequest } from '@deriv/api'; +import { APIProvider, useMutation } from '@deriv/api'; import { mockStore, StoreProvider } from '@deriv/stores'; import ClosingAccountReason from '../closing-account-reason'; jest.mock('@deriv/api', () => ({ ...jest.requireActual('@deriv/api'), - useRequest: jest.fn(), + useMutation: jest.fn(), })); jest.mock('../closing-account-warning-modal', () => ({ @@ -16,7 +16,7 @@ jest.mock('../closing-account-warning-modal', () => ({ })); // @ts-expect-error ignore this until find a way to make arguments as partial -const mockUseRequest = useRequest as jest.MockedFunction>; +const mockUseMutation = useMutation as jest.MockedFunction>; describe('', () => { const mockRootStore = mockStore({}); @@ -43,7 +43,7 @@ describe('', () => { const renderComponent = () => { // @ts-expect-error ignore this until find a way to make arguments as partial - mockUseRequest.mockReturnValue({ isLoading: false }); + mockUseMutation.mockReturnValue({ isLoading: false }); render( diff --git a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-has-pending-conditions.tsx b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-has-pending-conditions.tsx index 2384a1cbe778..2de8137f8d70 100644 --- a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-has-pending-conditions.tsx +++ b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-has-pending-conditions.tsx @@ -56,6 +56,7 @@ const ClosingAccountHasPendingConditions = observer( } }); } + if (details?.open_positions) { Object.keys(details.open_positions).forEach(login_id => { const info = { @@ -77,6 +78,7 @@ const ClosingAccountHasPendingConditions = observer( } }); } + if (details?.balance) { Object.keys(details.balance).forEach(login_id => { const info = { @@ -99,6 +101,7 @@ const ClosingAccountHasPendingConditions = observer( } }); } + return ( diff --git a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-balance.tsx b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-balance.tsx index 2ed4d21d7793..1cee755e6778 100644 --- a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-balance.tsx +++ b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-balance.tsx @@ -1,6 +1,13 @@ import React from 'react'; import { Money } from '@deriv/components'; -import { CFD_PLATFORMS, formatMoney, getCFDAccount, getCFDAccountDisplay, getCFDPlatformLabel } from '@deriv/shared'; +import { + CFD_PLATFORMS, + formatMoney, + getCFDAccount, + getCFDAccountDisplay, + getCFDPlatformLabel, + getMT5Icon, +} from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; import { Localize } from '@deriv/translations'; import { TCFDPlatform, TDetailsOfDerivXAccount, TDetailsOfMT5Account } from 'Types'; @@ -11,9 +18,14 @@ type TClosingAccountPendingBalanceProps = { platform: TCFDPlatform; account_balance: TDetailsOfMT5Account[] | TDetailsOfDerivXAccount[]; }; + +type TShortcode = Parameters[0]['shortcode']; + const ClosingAccountPendingBalance = observer(({ platform, account_balance }: TClosingAccountPendingBalanceProps) => { - const { client } = useStore(); - const { is_eu } = client; + const { traders_hub } = useStore(); + const { is_eu_user } = traders_hub; + + const is_mt5_platform = platform === CFD_PLATFORMS.MT5; return ( ( ); + export default ClosingAccountPendingContent; diff --git a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-positions.tsx b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-positions.tsx index 603a0ef2f41a..cd5eb7ddb102 100644 --- a/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-positions.tsx +++ b/packages/account/src/Sections/Security/ClosingAccount/closing-account-pending-conditions/closing-account-pending-positions.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { CFD_PLATFORMS, getCFDAccount, getCFDAccountDisplay, getCFDPlatformLabel } from '@deriv/shared'; +import { CFD_PLATFORMS, getCFDAccount, getCFDAccountDisplay, getCFDPlatformLabel, getMT5Icon } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; import { Localize } from '@deriv/translations'; import { TCFDPlatform, TDetailsOfDerivXAccount, TDetailsOfMT5Account } from 'Types'; @@ -11,10 +11,15 @@ type TClosingAccountPendingPositionsProps = { open_positions: Array; }; +type TShortcode = Parameters[0]['shortcode']; + const ClosingAccountPendingPositions = observer( ({ platform, open_positions }: TClosingAccountPendingPositionsProps) => { - const { client } = useStore(); - const { is_eu } = client; + const { traders_hub } = useStore(); + const { is_eu_user } = traders_hub; + + const is_mt5_platform = platform === CFD_PLATFORMS.MT5; + return ( ( ; } }; + const getErrorModalContent = () => { switch (error_info) { case 'account_has_pending_conditions_modal': diff --git a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-list-row.spec.tsx b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-list-row.spec.tsx index f623e0b88d0b..96e0d0706875 100644 --- a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-list-row.spec.tsx +++ b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-list-row.spec.tsx @@ -12,7 +12,7 @@ describe('LoginHistoryListRow', () => { date: '2023-08-29 07:05:35 GMT', action: 'Login', browser: 'Chrome v116.0.0.0', - ip: '175.143.37.57', + ip: 'MOCK.IP.ADDRESS', status: 'Successful', }; @@ -33,7 +33,7 @@ describe('LoginHistoryListRow', () => { }); }); it('should render LoginHistoryListRow Table Title', () => { - const titles = [/date and time/i, /browser/i, /ip/i, /action/i, /status/i]; + const titles = [/date and time/i, /browser/i, /ip address/i, /action/i, /status/i]; renderComponent(); titles.forEach(title => { expect(screen.getByText(title)).toBeInTheDocument(); @@ -41,7 +41,7 @@ describe('LoginHistoryListRow', () => { }); it('should render LoginHistoryListRow Table Content', () => { - const texts = [/2023-08-29 07:05:35 GMT/i, /chrome v116.0.0.0/i, /login/i, /175.143.37.57/i, /successful/i]; + const texts = [/2023-08-29 07:05:35 GMT/i, /chrome v116.0.0.0/i, /login/i, /MOCK.IP.ADDRESS/i, /successful/i]; renderComponent(); texts.forEach(text => { expect(screen.getByText(text)).toBeInTheDocument(); diff --git a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-table-row.spec.tsx b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-table-row.spec.tsx index 29d63021b017..df4775d72b60 100644 --- a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-table-row.spec.tsx +++ b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history-table-row.spec.tsx @@ -8,12 +8,12 @@ describe('LoginHistoryListRow', () => { date: '2023-08-29 07:05:35 GMT', action: 'Login', browser: 'Chrome v116.0.0.0', - ip: '175.143.37.57', + ip: 'MOCK.IP.ADDRESS', status: 'Successful', }; it('should render LoginHistoryTableRow Table Content', () => { - const texts = [/2023-08-29 07:05:35 GMT/i, /chrome v116.0.0.0/i, /login/i, /175.143.37.57/i, /successful/i]; + const texts = [/2023-08-29 07:05:35 GMT/i, /chrome v116.0.0.0/i, /login/i, /MOCK.IP.ADDRESS/i, /successful/i]; render(); texts.forEach(text => { expect(screen.getByText(text)).toBeInTheDocument(); diff --git a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history.spec.tsx b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history.spec.tsx index 185ac75a9d9e..db23ee6859e1 100644 --- a/packages/account/src/Sections/Security/LoginHistory/__test__/login-history.spec.tsx +++ b/packages/account/src/Sections/Security/LoginHistory/__test__/login-history.spec.tsx @@ -64,7 +64,7 @@ describe('', () => { browser: 'Chrome v116.0.0.0', action: 'login', status: 'successful', - ip: '175.143.37.57', + ip: 'MOCK.IP.ADDRESS', id: 0, }, ], @@ -100,7 +100,7 @@ describe('', () => { /2023-08-28 03:11:45 GMT/i, /login/i, /chrome v116.0.0.0/i, - /175.143.37.57/i, + /MOCK.IP.ADDRESS/i, /successful/i, ]; table_items.forEach(item => { diff --git a/packages/account/src/Sections/Security/Passwords/__tests__/deriv-email.spec.tsx b/packages/account/src/Sections/Security/Passwords/__tests__/deriv-email.spec.tsx new file mode 100644 index 000000000000..da8d7dd4c548 --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/__tests__/deriv-email.spec.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { APIProvider } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import DerivEmail from '../deriv-email'; + +describe('DerivEmail', () => { + let modal_root_el: HTMLDivElement; + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + document.body.removeChild(modal_root_el); + }); + + const store = mockStore({ client: { email: 'test@demo.com' } }); + + const renderComponent = ({ store_config = store }) => + render( + + + + + + ); + + it('should render email address in disabled form', () => { + renderComponent({}); + + const el_input_field = screen.getByRole('textbox', { name: /Email address\*/i }); + expect(el_input_field).toBeDisabled(); + }); + + it('should display button when it is not redirected from deriv-go', () => { + renderComponent({}); + + const el_button = screen.getByRole('button', { name: /Change email/i }); + expect(el_button).toBeInTheDocument(); + }); + + it('should not display button when it is redirected from deriv-go', () => { + renderComponent({ + store_config: mockStore({ + common: { is_from_derivgo: true }, + }), + }); + + const el_button = screen.queryByRole('button', { name: /Change email/i }); + expect(el_button).not.toBeInTheDocument(); + }); + + it('should not display unlink account modal when not associated with social media', async () => { + renderComponent({}); + const el_button = screen.getByRole('button', { name: /Change email/i }); + userEvent.click(el_button); + let el_modal; + await waitFor(() => { + el_modal = screen.getByText('We’ve sent you an email'); + }); + expect(el_modal).toBeInTheDocument(); + }); + + it('should display unlink account modal when button is clicked', async () => { + const store_config = mockStore({ client: { social_identity_provider: 'Google', is_social_signup: true } }); + renderComponent({ store_config }); + const el_button = screen.getByRole('button', { name: /Change email/i }); + userEvent.click(el_button); + let el_modal; + await waitFor(() => { + el_modal = screen.getByText('Change your login email'); + expect(el_modal).toBeInTheDocument(); + }); + const el_unlink_btn = screen.getByRole('button', { name: /Unlink from Google/i }); + userEvent.click(el_unlink_btn); + + await waitFor(() => { + el_modal = screen.getByText('We’ve sent you an email'); + expect(el_modal).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.js b/packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.tsx similarity index 63% rename from packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.js rename to packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.tsx index e74ee1804a48..072c0c3f96f6 100644 --- a/packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.js +++ b/packages/account/src/Sections/Security/Passwords/__tests__/deriv-password.spec.tsx @@ -1,27 +1,18 @@ import React from 'react'; -import { render, screen, waitFor, fireEvent, queryByText } from '@testing-library/react'; +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import DerivPassword from '../deriv-password'; -import { WS } from '@deriv/shared'; +import { APIProvider, useVerifyEmail } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; jest.mock('Assets/ic-brand-deriv-red.svg', () => () => 'BrandDerivRed'); -jest.mock('@deriv/shared', () => ({ - ...jest.requireActual('@deriv/shared'), - WS: { - verifyEmail: jest.fn(), - }, +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useVerifyEmail: jest.fn(() => ({ mutate: jest.fn() })), })); describe('', () => { - let mock_props = { - email: 'mf@deriv.com', - is_social_signup: false, - social_identity_provider: undefined, - is_eu_user: false, - financial_restricted_countries: false, - }; - - let modal_root_el; + let modal_root_el: HTMLDivElement; beforeAll(() => { modal_root_el = document.createElement('div'); @@ -32,8 +23,21 @@ describe('', () => { afterAll(() => { document.body.removeChild(modal_root_el); }); + + const store = mockStore({ client: { email: 'mf@deriv.com' } }); + + const renderComponent = ({ store_config = store }) => + render( + + + + + + ); + it('Should render properly', async () => { - render(); + renderComponent({}); + expect( screen.getByRole('heading', { name: /deriv password/i, @@ -44,11 +48,8 @@ describe('', () => { /use the to log in to deriv\.com, deriv go, deriv trader, smarttrader, deriv bot and deriv ctrader\./i ) ).toBeInTheDocument(); - // expect BrandDerivRed not to be in the document expect(screen.queryByText(/BrandDerivRed/i)).toBeInTheDocument(); - // expect button with text change password to be in the document expect(screen.getByRole('button', { name: /change password/i })).toBeInTheDocument(); - // expect button with text unlink from to not be in the document expect(screen.queryByText(/unlink from/i)).not.toBeInTheDocument(); const popover_wrapper = screen.getAllByTestId('dt_popover_wrapper'); @@ -56,7 +57,10 @@ describe('', () => { }); it('displays the correct platform information for non-MF clients & restricted countries', () => { - render(); + const store_config = mockStore({ + traders_hub: { financial_restricted_countries: true }, + }); + renderComponent({ store_config }); expect(screen.getByText(/use the to log in to deriv\.com, deriv trader and deriv go\./i)); @@ -68,27 +72,30 @@ describe('', () => { }); it('displays the correct platform information for MF clients', () => { - render(); + const store_config = mockStore({ + traders_hub: { is_eu_user: true }, + }); + renderComponent({ store_config }); expect(screen.getByText(/use the to log in to deriv\.com and deriv trader\./i)).toBeInTheDocument(); - const popover_wrapper = screen.getAllByTestId('dt_popover_wrapper'); - // expect popover to have length of 4 - expect(popover_wrapper).toHaveLength(1); - // expect button with text change password to be in the document + const popover_wrapper = screen.getByTestId('dt_popover_wrapper'); + + expect(popover_wrapper).toBeInTheDocument(); expect(screen.getByRole('button', { name: /change password/i })).toBeInTheDocument(); }); it('displays a change password button for non-social signups', () => { - render(); + renderComponent({}); const change_password_button = screen.getByRole('button', { name: /change password/i, }); + expect(change_password_button).toBeInTheDocument(); }); it('should invoke verifyEmail when change password is clicked', async () => { - render(); + renderComponent({}); const ele_change_btn = screen.getByRole('button', { name: /change password/i, }); @@ -96,23 +103,16 @@ describe('', () => { expect(screen.queryByText(/we’ve sent you an email/i)).toBeInTheDocument(); expect(screen.getByText(/please click on the link in the email to reset your password\./i)).toBeInTheDocument(); await waitFor(() => { - expect(WS.verifyEmail).toHaveBeenCalled(); + expect(useVerifyEmail).toHaveBeenCalled(); }); }); - it('displays a button to unlink social identity provider', async () => { - const social_props = { - ...mock_props, - is_social_signup: true, - social_identity_provider: 'apple', - }; - render(); + it('displays a button to unlink social identity provider', () => { + const store_config = mockStore({ client: { is_social_signup: true, social_identity_provider: 'apple' } }); + renderComponent({ store_config }); + const unlink_button = screen.getByText(/unlink from/i); - expect(unlink_button).toBeInTheDocument(); - fireEvent.click(unlink_button); - await waitFor(() => { - expect(WS.verifyEmail).toHaveBeenCalled(); - }); + expect(unlink_button).toBeInTheDocument(); }); }); diff --git a/packages/account/src/Sections/Security/Passwords/__tests__/passwords-platform.spec.tsx b/packages/account/src/Sections/Security/Passwords/__tests__/passwords-platform.spec.tsx new file mode 100644 index 000000000000..b8e084f1afe5 --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/__tests__/passwords-platform.spec.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { APIProvider } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import PasswordsPlatform from '../passwords-platform'; + +describe('', () => { + const mock_props = { + has_dxtrade_accounts: false, + has_mt5_accounts: true, + }; + + let modal_root_el: HTMLDivElement; + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + afterAll(() => { + document.body.removeChild(modal_root_el); + }); + + const store = mockStore({ client: { email: 'test@demo.com' } }); + + const renderComponent = ({ props = mock_props, store_config = store }) => + render( + + + + + + ); + + it('should render DX password section when platform is MT5', async () => { + renderComponent({}); + + expect(screen.getByText('Deriv MT5 Password')).toBeInTheDocument(); + }); + + it('should render DX password section when platform is DerivX', async () => { + const new_props: React.ComponentProps = { + ...mock_props, + has_dxtrade_accounts: true, + has_mt5_accounts: false, + }; + renderComponent({ props: new_props }); + + expect(screen.getByText('Deriv X Password')).toBeInTheDocument(); + }); + + it('should open Send email modal when Change password button is clicked', async () => { + renderComponent({}); + + userEvent.click(screen.getByRole('button', { name: /change password/i })); + await waitFor(() => { + const el_modal = screen.getByText('We’ve sent you an email'); + expect(el_modal).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/account/src/Sections/Security/Passwords/__tests__/passwords.spec.tsx b/packages/account/src/Sections/Security/Passwords/__tests__/passwords.spec.tsx new file mode 100644 index 000000000000..8d00d8bc3965 --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/__tests__/passwords.spec.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { APIProvider } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import Passwords from '../passwords'; + +jest.mock('Assets/ic-brand-deriv-red.svg', () => jest.fn(() => 'mockedSVGIcon')); + +describe('', () => { + let modal_root_el: HTMLDivElement; + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + afterAll(() => { + document.body.removeChild(modal_root_el); + }); + + const store = mockStore({}); + + const renderComponent = ({ store_config = store }) => { + return render( + + + + + + ); + }; + + it('should render Email and password section', () => { + const store_config = mockStore({ + client: { is_dxtrade_password_not_set: true, is_mt5_password_not_set: true }, + }); + renderComponent({ store_config }); + + expect(screen.getByText('Email address')).toBeInTheDocument(); + expect(screen.getByText('mockedSVGIcon')).toBeInTheDocument(); + }); + + it('should render MT5 platform section', async () => { + const store_config = mockStore({ + client: { is_dxtrade_password_not_set: true }, + }); + renderComponent({ store_config }); + + const ele_mt5 = await screen.findByText('Deriv MT5 Password'); + expect(ele_mt5).toBeInTheDocument(); + }); + + it('should render DerivX platform section', async () => { + const store_config = mockStore({ + client: { is_mt5_password_not_set: true }, + }); + renderComponent({ store_config }); + + const ele_derivx = await screen.findByText('Deriv X Password'); + expect(ele_derivx).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Sections/Security/Passwords/__tests__/platform-partials.spec.tsx b/packages/account/src/Sections/Security/Passwords/__tests__/platform-partials.spec.tsx new file mode 100644 index 000000000000..9ebac639b42a --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/__tests__/platform-partials.spec.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { CFD_PLATFORMS } from '@deriv/shared'; +import PlatformPartials from '../platform-partials'; + +describe('', () => { + const mock_props: React.ComponentProps = { + type: CFD_PLATFORMS.DXTRADE, + description:
Test description
, + handleClick: jest.fn(), + }; + + it('should render mt5 partials', () => { + render(); + + expect(screen.getByText('Test description')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /change password/i })).toBeInTheDocument(); + }); + + it('should call handleClick when button is clicked', async () => { + render(); + + const el_button = screen.getByRole('button', { name: /change password/i }); + userEvent.click(el_button); + + await waitFor(() => expect(mock_props.handleClick).toHaveBeenCalledTimes(1)); + }); +}); diff --git a/packages/account/src/Sections/Security/Passwords/deriv-email.jsx b/packages/account/src/Sections/Security/Passwords/deriv-email.tsx similarity index 56% rename from packages/account/src/Sections/Security/Passwords/deriv-email.jsx rename to packages/account/src/Sections/Security/Passwords/deriv-email.tsx index a962f2526c33..c9455578d7b0 100644 --- a/packages/account/src/Sections/Security/Passwords/deriv-email.jsx +++ b/packages/account/src/Sections/Security/Passwords/deriv-email.tsx @@ -1,68 +1,70 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { Formik } from 'formik'; -import { withRouter } from 'react-router'; -import { WS, toTitleCase } from '@deriv/shared'; -import { Localize, localize } from '@deriv/translations'; import { Button, Text, Input } from '@deriv/components'; +import { useVerifyEmail } from '@deriv/api'; +import { toTitleCase } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize, localize } from '@deriv/translations'; import FormSubHeader from 'Components/form-sub-header'; import SentEmailModal from 'Components/sent-email-modal'; import UnlinkAccountModal from 'Components/unlink-account-modal'; -import { observer, useStore } from '@deriv/stores'; -const DerivEmail = observer(({ email, social_identity_provider, is_social_signup }) => { - const { common } = useStore(); - const { is_from_derivgo } = common; +type TVerifyEmailPayload = Parameters['mutate']>[0]; + +/** + * Display the user's email address and a button to change it. + * @name DerivEmail + * @returns {React.ReactNode} + */ +const DerivEmail = observer(() => { + const { + common: { is_from_derivgo }, + client: { social_identity_provider, is_social_signup, email }, + } = useStore(); + const { mutate } = useVerifyEmail(); const [is_unlink_account_modal_open, setIsUnlinkAccountModalOpen] = React.useState(false); const [is_send_email_modal_open, setIsSendEmailModalOpen] = React.useState(false); + const payload: TVerifyEmailPayload = { verify_email: email, type: 'request_email' }; + const onClickChangeEmail = () => { if (is_social_signup) { setIsUnlinkAccountModalOpen(true); } else { - WS.verifyEmail(email, 'request_email'); + mutate(payload); setIsSendEmailModalOpen(true); } }; const onClickSendEmail = () => { - WS.verifyEmail(email, 'request_email'); + mutate(payload); setIsUnlinkAccountModalOpen(false); setIsSendEmailModalOpen(true); }; - const onClickResendEmail = () => { - WS.verifyEmail(email, 'request_email'); - }; - return (
- - - - - + + +
- -
- -
-
+
+ +
{!is_from_derivgo && (
); -}; - -DerivPassword.propTypes = { - email: PropTypes.string, - is_dark_mode_on: PropTypes.bool, - is_eu_user: PropTypes.bool, - financial_restricted_countries: PropTypes.bool, - is_social_signup: PropTypes.bool, - social_identity_provider: PropTypes.string, -}; +}); export default DerivPassword; diff --git a/packages/account/src/Sections/Security/Passwords/index.js b/packages/account/src/Sections/Security/Passwords/index.js deleted file mode 100644 index 0c13bc42a994..000000000000 --- a/packages/account/src/Sections/Security/Passwords/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Passwords from './passwords.jsx'; - -export default Passwords; diff --git a/packages/account/src/Sections/Security/Passwords/index.ts b/packages/account/src/Sections/Security/Passwords/index.ts new file mode 100644 index 000000000000..04e64f927ceb --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/index.ts @@ -0,0 +1,3 @@ +import Passwords from './passwords'; + +export default Passwords; diff --git a/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx b/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx deleted file mode 100644 index 400884fb9178..000000000000 --- a/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx +++ /dev/null @@ -1,111 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { Button, Icon, Popover, Text } from '@deriv/components'; -import { CFD_PLATFORMS, WS, getPlatformSettings } from '@deriv/shared'; -import { localize, Localize } from '@deriv/translations'; -import FormSubHeader from 'Components/form-sub-header'; -import SentEmailModal from 'Components/sent-email-modal'; - -const PasswordsPlatform = ({ email, has_dxtrade_accounts, has_mt5_accounts }) => { - const [identifier, setIdenifier] = React.useState(''); - const [is_sent_email_modal_open, setIsSentEmailModalOpen] = React.useState(false); - - const platform_name_dxtrade = getPlatformSettings('dxtrade').name; - - const getPlatformTitle = () => { - let title = ''; - if (has_mt5_accounts) { - title = localize('Deriv MT5 Password'); - } else if (has_dxtrade_accounts) { - title = localize('{{platform_name_dxtrade}} Password', { platform_name_dxtrade }); - } - return title; - }; - - const onClickSendEmail = cfd_platform => { - const password_reset_code = - cfd_platform === CFD_PLATFORMS.MT5 - ? 'trading_platform_mt5_password_reset' - : 'trading_platform_dxtrade_password_reset'; - - WS.verifyEmail(email, password_reset_code, { - url_parameters: { - redirect_to: 3, - }, - }); - setIdenifier(cfd_platform); - setIsSentEmailModalOpen(true); - }; - - return ( - - -
- {has_mt5_accounts && ( - - - - -
- - - -
-
- )} - {has_dxtrade_accounts && ( - - - - -
- - - -
-
- )} - setIsSentEmailModalOpen(false)} - onClickSendEmail={onClickSendEmail} - is_modal_when_mobile - /> - {/* - setIsSuccessDialogOpen(false)} - /> */} -
-
- ); -}; - -PasswordsPlatform.propTypes = { - email: PropTypes.string, - has_dxtrade_accounts: PropTypes.bool, - has_mt5_accounts: PropTypes.bool, -}; - -export default PasswordsPlatform; diff --git a/packages/account/src/Sections/Security/Passwords/passwords-platform.tsx b/packages/account/src/Sections/Security/Passwords/passwords-platform.tsx new file mode 100644 index 000000000000..a26e5f06b57b --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/passwords-platform.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { useMutation } from '@deriv/api'; +import { CFD_PLATFORMS, getPlatformSettings } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize, localize } from '@deriv/translations'; +import FormSubHeader from 'Components/form-sub-header'; +import SentEmailModal from 'Components/sent-email-modal'; +import PlatformPartials from './platform-partials'; + +type TPasswordsPlatformProps = { + has_dxtrade_accounts?: boolean; + has_mt5_accounts?: boolean; +}; + +/** + * Displays a change password instructions for MT5 and/or DXTrade. + * @name PasswordsPlatform + * @param [has_dxtrade_accounts=false] - Whether the user has DXTrade accounts. + * @param [has_mt5_accounts=false] - Whether the user has MT5 accounts. + * @returns React.ReactNode + */ +const PasswordsPlatform = observer( + ({ has_dxtrade_accounts = false, has_mt5_accounts = false }: TPasswordsPlatformProps) => { + const { mutate } = useMutation('verify_email'); + + const { + client: { email }, + } = useStore(); + + const [identifier, setIdentifier] = React.useState(''); + const [is_sent_email_modal_open, setIsSentEmailModalOpen] = React.useState(false); + + const platform_name_dxtrade = getPlatformSettings('dxtrade').name; + + const getPlatformTitle = () => { + let title = ''; + if (has_mt5_accounts) { + title = localize('Deriv MT5 Password'); + } else if (has_dxtrade_accounts) { + title = localize('{{platform_name_dxtrade}} Password', { platform_name_dxtrade }); + } + return title; + }; + + const onClickSendEmail = (cfd_platform?: string) => { + const password_reset_code = + cfd_platform === CFD_PLATFORMS.MT5 + ? 'trading_platform_mt5_password_reset' + : 'trading_platform_dxtrade_password_reset'; + + mutate({ + payload: { + verify_email: email, + type: password_reset_code, + + url_parameters: { + redirect_to: 3, + }, + }, + }); + + setIdentifier(cfd_platform ?? ''); + setIsSentEmailModalOpen(true); + }; + + return ( + + +
+ {has_mt5_accounts && ( + + } + /> + )} + {has_dxtrade_accounts && ( + + } + /> + )} + setIsSentEmailModalOpen(false)} + onClickSendEmail={onClickSendEmail} + is_modal_when_mobile + /> +
+
+ ); + } +); +export default PasswordsPlatform; diff --git a/packages/account/src/Sections/Security/Passwords/passwords.jsx b/packages/account/src/Sections/Security/Passwords/passwords.jsx deleted file mode 100644 index 719d784a160c..000000000000 --- a/packages/account/src/Sections/Security/Passwords/passwords.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import { Loading } from '@deriv/components'; -import { observer, useStore } from '@deriv/stores'; -import DerivPassword from './deriv-password.jsx'; -import DerivEmail from './deriv-email.jsx'; -import PasswordsPlatform from './passwords-platform.jsx'; - -const Passwords = observer(() => { - const [is_loading, setIsLoading] = React.useState(true); - const { client, ui, common, traders_hub } = useStore(); - const { - is_populating_mt5_account_list, - is_populating_dxtrade_account_list, - is_social_signup, - email, - social_identity_provider, - mt5_login_list, - is_mt5_password_not_set, - dxtrade_accounts_list, - is_dxtrade_password_not_set, - } = client; - const { is_from_derivgo } = common; - const { is_eu_user, financial_restricted_countries } = traders_hub; - const { is_dark_mode_on } = ui; - React.useEffect(() => { - if ( - is_populating_mt5_account_list === false && - is_populating_dxtrade_account_list === false && - is_social_signup !== undefined - ) { - setIsLoading(false); - } - }, [is_populating_mt5_account_list, is_populating_dxtrade_account_list, is_social_signup]); - - if (is_loading) { - return ; - } - - return ( -
- - - {!is_from_derivgo && (mt5_login_list?.length > 0 || !is_mt5_password_not_set) && ( - 0 || !is_mt5_password_not_set} - /> - )} - {!is_from_derivgo && (dxtrade_accounts_list?.length > 0 || !is_dxtrade_password_not_set) && ( - 0 || !is_dxtrade_password_not_set} - /> - )} -
- ); -}); - -export default Passwords; diff --git a/packages/account/src/Sections/Security/Passwords/passwords.tsx b/packages/account/src/Sections/Security/Passwords/passwords.tsx new file mode 100644 index 000000000000..59a4dfde3931 --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/passwords.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { Loading } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; +import DerivPassword from './deriv-password'; +import DerivEmail from './deriv-email'; +import PasswordsPlatform from './passwords-platform'; + +/** + * Displays the Email, Password, section under Account settings. + * @name Passwords + * @returns {React.ReactNode} + */ +const Passwords = observer(() => { + const { client, common } = useStore(); + const { + is_populating_mt5_account_list, + is_populating_dxtrade_account_list, + is_social_signup, + mt5_login_list, + is_mt5_password_not_set, + dxtrade_accounts_list, + is_dxtrade_password_not_set, + } = client; + const { is_from_derivgo } = common; + + const [is_loading, setIsLoading] = React.useState(true); + const has_mt5_accounts = mt5_login_list?.length > 0 || !is_mt5_password_not_set; + const has_dxtrade_accounts = dxtrade_accounts_list?.length > 0 || !is_dxtrade_password_not_set; + + React.useEffect(() => { + if ( + is_populating_mt5_account_list === false && + is_populating_dxtrade_account_list === false && + is_social_signup !== undefined + ) { + setIsLoading(false); + } + }, [is_populating_mt5_account_list, is_populating_dxtrade_account_list, is_social_signup]); + + if (is_loading) { + return ; + } + + return ( +
+ + + {!is_from_derivgo && has_mt5_accounts && } + {!is_from_derivgo && has_dxtrade_accounts && ( + + )} +
+ ); +}); + +export default Passwords; diff --git a/packages/account/src/Sections/Security/Passwords/platform-description.tsx b/packages/account/src/Sections/Security/Passwords/platform-description.tsx new file mode 100644 index 000000000000..ecbfbff8dad2 --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/platform-description.tsx @@ -0,0 +1,85 @@ +import React from 'react'; +import { Localize } from '@deriv/translations'; + +type TPlatformDescription = { + brand_website_name: string; + platform_values: { + platform_name_trader: string; + platform_name_dbot: string; + platform_name_smarttrader: string; + platform_name_go: string; + platform_name_ctrader: string; + }; + is_eu_user: boolean; + financial_restricted_countries: boolean; +}; + +/** + * Renders description for the platforms. + * @name PlatformDescription + * @param brand_website_name - Name of the website + * @param platform_values - Object containing platform names + * @param is_eu_user - Boolean value to check if user is from EU + * @param financial_restricted_countries - Boolean value to check if user is from a restricted country + * @returns Returns a react node + */ +const PlatformDescription = ({ + brand_website_name, + platform_values, + is_eu_user, + financial_restricted_countries, +}: TPlatformDescription) => { + const { + platform_name_trader, + platform_name_dbot, + platform_name_smarttrader, + platform_name_go, + platform_name_ctrader, + } = platform_values; + if (is_eu_user) { + return ( + Deriv password to log in to {{brand_website_name}} and {{platform_name_trader}}.' + } + components={[]} + values={{ + brand_website_name, + platform_name_trader, + }} + /> + ); + } else if (financial_restricted_countries) { + return ( + Deriv password to log in to {{brand_website_name}}, {{platform_name_trader}} and {{platform_name_go}}.' + } + components={[]} + values={{ + brand_website_name, + platform_name_trader, + platform_name_go, + }} + /> + ); + } + return ( + Deriv password to log in to {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} and {{platform_name_ctrader}}.' + } + components={[]} + values={{ + brand_website_name, + platform_name_trader, + platform_name_dbot, + platform_name_smarttrader, + platform_name_go, + platform_name_ctrader, + }} + /> + ); +}; + +export default PlatformDescription; diff --git a/packages/account/src/Sections/Security/Passwords/platform-partials.tsx b/packages/account/src/Sections/Security/Passwords/platform-partials.tsx new file mode 100644 index 000000000000..92e03a2f108c --- /dev/null +++ b/packages/account/src/Sections/Security/Passwords/platform-partials.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { Button, Icon, Popover, Text } from '@deriv/components'; +import { getPlatformSettings, CFD_PLATFORMS } from '@deriv/shared'; +import { localize } from '@deriv/translations'; + +type TPlatformPartialsProps = { + description: JSX.Element; + type: typeof CFD_PLATFORMS[keyof typeof CFD_PLATFORMS]; + handleClick: (type: typeof CFD_PLATFORMS[keyof typeof CFD_PLATFORMS]) => void; +}; + +/** + * Component for displaying a change password instructions for a platform + * @name PlatformPartials + * @param description - The description of the platform + * @param type - The type of the platform + * @param handleClick - The function to call when the button is clicked + * @returns React.ReactNode + */ +const PlatformPartials = ({ description, type, handleClick }: TPlatformPartialsProps) => { + const platform_config = getPlatformSettings(type); + + return ( + + + {description} + +
+ + + +
+
+ ); +}; + +export default PlatformPartials; diff --git a/packages/account/src/Sections/Security/TwoFactorAuthentication/__tests__/two-factor-disabled.spec.tsx b/packages/account/src/Sections/Security/TwoFactorAuthentication/__tests__/two-factor-disabled.spec.tsx index eb43b5eb29d2..16065303e11b 100644 --- a/packages/account/src/Sections/Security/TwoFactorAuthentication/__tests__/two-factor-disabled.spec.tsx +++ b/packages/account/src/Sections/Security/TwoFactorAuthentication/__tests__/two-factor-disabled.spec.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import { APIProvider } from '@deriv/api'; import { StoreProvider, mockStore } from '@deriv/stores'; -import { isDesktop, isMobile } from '@deriv/shared'; import TwoFactorDisabled from '../two-factor-disabled'; jest.mock('@deriv/components', () => { diff --git a/packages/account/src/Sections/Security/TwoFactorAuthentication/digit-form.tsx b/packages/account/src/Sections/Security/TwoFactorAuthentication/digit-form.tsx index b566b160a61a..7d43d8cb82b0 100644 --- a/packages/account/src/Sections/Security/TwoFactorAuthentication/digit-form.tsx +++ b/packages/account/src/Sections/Security/TwoFactorAuthentication/digit-form.tsx @@ -58,9 +58,9 @@ const DigitForm = observer(() => { const digit_code = values.digit_code; if (!digit_code) { return { digit_code: localize('Digit code is required.') }; - } else if (!(digit_code.length === 6)) { + } else if (digit_code.length !== 6) { return { digit_code: localize('Length of digit code must be 6 characters.') }; - } else if (!/^[0-9]{6}$/g.test(digit_code)) { + } else if (!/^\d{6}$/g.test(digit_code)) { return { digit_code: localize('Digit code must only contain numbers.') }; } return {}; diff --git a/packages/account/src/Sections/Verification/ProofOfIdentity/__tests__/proof-of-identity-container.spec.js b/packages/account/src/Sections/Verification/ProofOfIdentity/__tests__/proof-of-identity-container.spec.js index eb2e0087aec4..8d998bffa19c 100644 --- a/packages/account/src/Sections/Verification/ProofOfIdentity/__tests__/proof-of-identity-container.spec.js +++ b/packages/account/src/Sections/Verification/ProofOfIdentity/__tests__/proof-of-identity-container.spec.js @@ -19,10 +19,6 @@ jest.mock('@deriv/components', () => ({ Loading: jest.fn(() => 'mockedLoading'), })); -jest.mock('onfido-sdk-ui', () => ({ - init: jest.fn().mockResolvedValue({}), -})); - jest.mock('../../Helpers/verification.js', () => ({ populateVerificationStatus: jest.fn().mockReturnValue({ is_age_verified: false, diff --git a/packages/account/src/Sections/Verification/ProofOfIdentity/onfido-sdk-view-container.tsx b/packages/account/src/Sections/Verification/ProofOfIdentity/onfido-sdk-view-container.tsx index e395acc3ffa6..81229c563e4d 100644 --- a/packages/account/src/Sections/Verification/ProofOfIdentity/onfido-sdk-view-container.tsx +++ b/packages/account/src/Sections/Verification/ProofOfIdentity/onfido-sdk-view-container.tsx @@ -1,6 +1,5 @@ import React, { useCallback } from 'react'; import countries from 'i18n-iso-countries'; -import { init, SdkHandle, SdkResponse, SupportedLanguages } from 'onfido-sdk-ui'; import { CSSTransition } from 'react-transition-group'; import { GetSettings, ResidenceList } from '@deriv/api-types'; import { Loading, ThemedScrollbars } from '@deriv/components'; @@ -35,6 +34,11 @@ type TOnfidoSdkViewContainer = { is_default_enabled?: boolean; }; +// TODO: Update types for this later once bundle and CDN issue with Onfido is resolved +type SdkHandle = any; +type SupportedLanguages = any; +type SdkResponse = any; + const OnfidoSdkViewContainer = ({ account_settings, country_code, @@ -99,7 +103,7 @@ const OnfidoSdkViewContainer = ({ async (service_token: string) => { if (!service_token) return; try { - onfido_init.current = await init({ + onfido_init.current = await window.Onfido.init({ containerId: 'onfido', language: { locale: (getLanguage().toLowerCase() as SupportedLanguages) || 'en', diff --git a/packages/account/src/Sections/Verification/ProofOfIdentity/proof-of-identity-submission.jsx b/packages/account/src/Sections/Verification/ProofOfIdentity/proof-of-identity-submission.jsx index abf5f9c59326..a183b40ff426 100644 --- a/packages/account/src/Sections/Verification/ProofOfIdentity/proof-of-identity-submission.jsx +++ b/packages/account/src/Sections/Verification/ProofOfIdentity/proof-of-identity-submission.jsx @@ -6,8 +6,9 @@ import IdvDocumentSubmit from 'Components/poi/idv-document-submit'; import IdvUploadComplete from 'Components/poi/idv-status/idv-submit-complete'; import Unsupported from 'Components/poi/status/unsupported'; import UploadComplete from 'Components/poi/status/upload-complete'; + import OnfidoUpload from './onfido-sdk-view-container'; -import { identity_status_codes, submission_status_code, service_code } from './proof-of-identity-utils'; +import { identity_status_codes, service_code, submission_status_code } from './proof-of-identity-utils'; const POISubmission = observer( ({ diff --git a/packages/account/src/Sections/Verification/ProofOfOwnership/__test__/proof-of-ownership-form.spec.js b/packages/account/src/Sections/Verification/ProofOfOwnership/__test__/proof-of-ownership-form.spec.js index 7f7720899a95..8f20ebe21696 100644 --- a/packages/account/src/Sections/Verification/ProofOfOwnership/__test__/proof-of-ownership-form.spec.js +++ b/packages/account/src/Sections/Verification/ProofOfOwnership/__test__/proof-of-ownership-form.spec.js @@ -1,6 +1,9 @@ import React from 'react'; + import { fireEvent, render, screen } from '@testing-library/react'; + import ProofOfOwnershipForm from '../proof-of-ownership-form.jsx'; + import { grouped_payment_method_data } from './test-data'; describe('proof-of-ownership-form.jsx', () => { diff --git a/packages/account/src/Styles/account.scss b/packages/account/src/Styles/account.scss index f1f5a9ec3a6b..8aa2b4ca0fae 100644 --- a/packages/account/src/Styles/account.scss +++ b/packages/account/src/Styles/account.scss @@ -2212,27 +2212,6 @@ $MIN_HEIGHT_FLOATING: calc( } } - &__sample-container { - margin-left: 1.6rem; - - @include mobile { - margin-left: unset; - width: 94%; - } - } - - &__sample-container-external { - margin-top: 2.8rem; - } - - &__image-container { - width: fit-content; - height: fit-content; - padding: 8px; - border-radius: 4px; - background-color: $color-grey-2; - } - &__image { max-width: 24.5rem; border-radius: 4px; diff --git a/packages/account/src/Types/common.type.ts b/packages/account/src/Types/common.type.ts index 30d98b246685..746d62899935 100644 --- a/packages/account/src/Types/common.type.ts +++ b/packages/account/src/Types/common.type.ts @@ -111,15 +111,6 @@ type TIdentity = { }; }; -export type TResidenseList = { - identity: TIdentity; - phone_idd: string; - tin_format: string[]; - disabled: string; - text: string; - value: string; -}; - export type TFile = { path: string; lastModified: number; @@ -169,7 +160,6 @@ export type TDocument = { id: string; text: string; value?: string; - sample_image?: string; example_format?: string; additional?: { display_name?: string; diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index c338fac2bec1..43de7ed9c23e 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -1 +1,2 @@ export { default as RudderStack } from './rudderstack'; +export type { TEvents } from './rudderstack'; diff --git a/packages/analytics/src/rudderstack.ts b/packages/analytics/src/rudderstack.ts index 153e919b2c3a..489db83520cb 100644 --- a/packages/analytics/src/rudderstack.ts +++ b/packages/analytics/src/rudderstack.ts @@ -133,7 +133,7 @@ type IdentifyAction = { language: string; }; -type TEvents = { +export type TEvents = { ce_chart_types_form: ChartTypesFormAction; ce_indicators_types_form: IndicatorsTypesFormAction; ce_market_types_form: MarketTypesFormAction; diff --git a/packages/api/package.json b/packages/api/package.json index c439c01abfc2..a095ceb55c71 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "main": "src/index.ts", "dependencies": { - "@deriv/deriv-api": "^1.0.11", + "@deriv/deriv-api": "^1.0.13", "@deriv/utils": "^1.0.0", "@deriv/shared": "^1.0.0", "react": "^17.0.2", diff --git a/packages/api/src/__tests__/useAccountSecurity.spec.tsx b/packages/api/src/__tests__/useAccountSecurity.spec.tsx index b22288054697..ba32ee2f1c86 100644 --- a/packages/api/src/__tests__/useAccountSecurity.spec.tsx +++ b/packages/api/src/__tests__/useAccountSecurity.spec.tsx @@ -3,14 +3,13 @@ import { renderHook } from '@testing-library/react-hooks'; import { useGetSecretKey, useGetTwoFa, useSendUserOTP } from '../hooks/useAccountSecurity'; import APIProvider from '../APIProvider'; import { useAuthorize } from '../hooks'; -import useRequest from '../useRequest'; - -jest.mock('../useRequest', () => jest.fn()); +import { useMutation } from '..'; +jest.mock('../useMutation', () => jest.fn()); jest.mock('../hooks/useAuthorize', () => jest.fn()); const mockUseAuthorize = useAuthorize as jest.MockedFunction; -const mockUseRequest = useRequest as jest.MockedFunction>; +const mockUseMutation = useMutation as jest.MockedFunction>; describe('useAccountSecurity', () => { afterEach(() => { @@ -19,11 +18,11 @@ describe('useAccountSecurity', () => { const mockMutate = jest.fn(); - test('should call useGetTwoFa and get is_TwoFA_enabled in response', async () => { + it('should call useGetTwoFa and get is_TwoFA_enabled in response', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: true }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -46,11 +45,11 @@ describe('useAccountSecurity', () => { expect(result.current.is_TwoFA_enabled).toEqual(true); }); - test('should call useGetTwoFa and if authorization fails then mutate function should not be called', async () => { + it('should call useGetTwoFa and if authorization fails then mutate function should not be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: false }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -73,11 +72,11 @@ describe('useAccountSecurity', () => { expect(mockMutate).not.toHaveBeenCalled(); }); - test('should call useGetTwoFa and if authorization succeeds then mutate function should be called', async () => { + it('should call useGetTwoFa and if authorization succeeds then mutate function should be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: true }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -100,11 +99,11 @@ describe('useAccountSecurity', () => { expect(mockMutate).toHaveBeenCalled(); }); - test('should call useGetSecretKey and get secret_key in response', async () => { + it('should call useGetSecretKey and get secret_key in response', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: true }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -126,11 +125,11 @@ describe('useAccountSecurity', () => { expect(result.current.data?.account_security?.totp?.secret_key).toEqual('secret_key_123'); }); - test('should call useGetSecretKey and if authorization fails then mutate function should not be called', async () => { + it('should call useGetSecretKey and if authorization fails then mutate function should not be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: false }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -153,11 +152,11 @@ describe('useAccountSecurity', () => { expect(mockMutate).not.toHaveBeenCalled(); }); - test('should call useGetSecretKey and if authorization succeeds then mutate function should be called', async () => { + it('should call useGetSecretKey and if authorization succeeds then mutate function should be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: false }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { @@ -180,11 +179,11 @@ describe('useAccountSecurity', () => { expect(mockMutate).not.toHaveBeenCalled(); }); - test('should call useSendUserOTP and get is_TwoFA_enabled in response', async () => { + it('should call useSendUserOTP and get is_TwoFA_enabled in response', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: true }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { is_enabled: 0 } } }, mutate: mockMutate, isSuccess: true, @@ -201,11 +200,11 @@ describe('useAccountSecurity', () => { expect(result.current.is_TwoFA_enabled).toEqual(false); }); - test('should call useSendUserOTP and if authorization succeeds then mutate function should be called', async () => { + it('should call useSendUserOTP and if authorization succeeds then mutate function should be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: true }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { is_enabled: 0 } } }, mutate: mockMutate, isSuccess: true, @@ -222,11 +221,11 @@ describe('useAccountSecurity', () => { expect(mockMutate).toHaveBeenCalled(); }); - test('should call useSendUserOTP and if authorization fails then mutate function should not be called', async () => { + it('should call useSendUserOTP and if authorization fails then mutate function should not be called', async () => { // @ts-expect-error ignore this until find a way to make arguments as partial mockUseAuthorize.mockReturnValue({ isSuccess: false }); // @ts-expect-error need to come up with a way to mock the return type of useRequest - mockUseRequest.mockReturnValueOnce({ + mockUseMutation.mockReturnValueOnce({ data: { account_security: { totp: { is_enabled: 0 } } }, mutate: mockMutate, isSuccess: true, diff --git a/packages/api/src/hooks/__tests__/useApiToken.spec.tsx b/packages/api/src/hooks/__tests__/useApiToken.spec.tsx index 1725f2830b23..6ca1c2175c7f 100644 --- a/packages/api/src/hooks/__tests__/useApiToken.spec.tsx +++ b/packages/api/src/hooks/__tests__/useApiToken.spec.tsx @@ -1,38 +1,43 @@ +import React from 'react'; +import { useWS } from '@deriv/shared'; import { renderHook } from '@testing-library/react-hooks'; import useApiToken from '../useApiToken'; import APIProvider from '../../APIProvider'; -import React from 'react'; -import { WS } from '@deriv/shared'; jest.mock('@deriv/shared', () => ({ - WS: { - send: jest.fn().mockResolvedValueOnce({ - msg_type: 'api_token', - echo_req: {}, - api_token: { - tokens: [ - { - display_name: 'Created by script', - last_used: '', - scopes: ['read', 'trade', 'payments', 'admin'], - token: '', - valid_for_ip: '', - }, - { - display_name: 'test12', - last_used: '', - scopes: ['read', 'payments'], - token: '', - valid_for_ip: '', - }, - ], - }, - }), - }, + ...jest.requireActual('@deriv/shared'), + useWS: jest.fn(), })); +const mockUseWS = useWS as jest.MockedFunction; describe('useApiToken', () => { it('should return the token data when a get call is made', async () => { + mockUseWS.mockReturnValue({ + send: jest.fn(() => + Promise.resolve({ + msg_type: 'api_token', + echo_req: {}, + api_token: { + tokens: [ + { + display_name: 'Created by script', + last_used: '', + scopes: ['read', 'trade', 'payments', 'admin'], + token: '', + valid_for_ip: '', + }, + { + display_name: 'test12', + last_used: '', + scopes: ['read', 'payments'], + token: '', + valid_for_ip: '', + }, + ], + }, + }) + ), + }); const wrapper = ({ children }: { children: JSX.Element }) => {children}; const { result, waitForNextUpdate } = renderHook(() => useApiToken(), { wrapper }); @@ -45,7 +50,9 @@ describe('useApiToken', () => { it('should return error when error is thrown', async () => { const error_message = { message: 'Invalid API token' }; - WS.send.mockResolvedValueOnce({ error: error_message }); + mockUseWS.mockReturnValue({ + send: jest.fn(() => Promise.resolve({ error: error_message })), + }); const wrapper = ({ children }: { children: JSX.Element }) => {children}; const { result, waitForNextUpdate } = renderHook(() => useApiToken(), { wrapper }); diff --git a/packages/api/src/hooks/index.ts b/packages/api/src/hooks/index.ts index 03b411de6ea1..5ddf5ee76077 100644 --- a/packages/api/src/hooks/index.ts +++ b/packages/api/src/hooks/index.ts @@ -38,4 +38,5 @@ export { default as useTradingPlatformPasswordChange } from './useTradingPlatfor export { default as useTransactions } from './useTransactions'; export { default as useTransferBetweenAccounts } from './useTransferBetweenAccounts'; export { default as useWalletAccountsList } from './useWalletAccountsList'; +export { default as useVerifyEmail } from './useVerifyEmail'; export { useGetTwoFa, useGetSecretKey, useSendUserOTP } from './useAccountSecurity'; diff --git a/packages/api/src/hooks/useAccountSecurity.ts b/packages/api/src/hooks/useAccountSecurity.ts index 3961ace27206..afa3ae3940a1 100644 --- a/packages/api/src/hooks/useAccountSecurity.ts +++ b/packages/api/src/hooks/useAccountSecurity.ts @@ -1,14 +1,14 @@ import React from 'react'; import useAuthorize from './useAuthorize'; -import useRequest from '../useRequest'; +import useMutation from '../useMutation'; type TAccountSecurityPayload = NonNullable< - NonNullable>['mutate']>[0]>['payload'] + NonNullable>['mutate']>[0]>['payload'] >; const useAccountSecurity = () => { const { isSuccess: success_auth } = useAuthorize(); - const { mutate, ...rest } = useRequest('account_security'); + const { mutate, ...rest } = useMutation('account_security'); return { mutate, success_auth, diff --git a/packages/api/src/hooks/useApiToken.ts b/packages/api/src/hooks/useApiToken.ts index 57187c3691ca..d4472aab2132 100644 --- a/packages/api/src/hooks/useApiToken.ts +++ b/packages/api/src/hooks/useApiToken.ts @@ -1,9 +1,9 @@ import React from 'react'; -import useRequest from '../useRequest'; import useInvalidateQuery from '../useInvalidateQuery'; +import useMutation from '../useMutation'; type TAPITokenPayload = NonNullable< - NonNullable>['mutate']>>[0]>['payload'] + NonNullable>['mutate']>>[0]>['payload'] >; type TDeleteAPITokenPayload = NonNullable['delete_token']; @@ -16,7 +16,7 @@ type TCreateAPITokenPayload = Omit, 'delete_token' */ const useApiToken = () => { const invalidate = useInvalidateQuery(); - const { data, mutate, ...rest } = useRequest('api_token', { + const { data, mutate, ...rest } = useMutation('api_token', { onSuccess: () => invalidate('api_token'), }); diff --git a/packages/api/src/hooks/useCloseDerivAccount.ts b/packages/api/src/hooks/useCloseDerivAccount.ts index 2903ee0652d1..3ab31c77a483 100644 --- a/packages/api/src/hooks/useCloseDerivAccount.ts +++ b/packages/api/src/hooks/useCloseDerivAccount.ts @@ -1,10 +1,10 @@ -import useRequest from '../useRequest'; +import useMutation from '../useMutation'; /** * A custom hook that calls the `account_closure` api. This call allows clients to close all their accounts (including virtual-money account) */ const useCloseDerivAccount = () => { - const response = useRequest('account_closure'); + const response = useMutation('account_closure'); return response; }; diff --git a/packages/api/src/hooks/useGetApiToken.ts b/packages/api/src/hooks/useGetApiToken.ts index 97b8e572c52c..cb270fe799ee 100644 --- a/packages/api/src/hooks/useGetApiToken.ts +++ b/packages/api/src/hooks/useGetApiToken.ts @@ -1,7 +1,7 @@ -import useFetch from '../useFetch'; +import useMutation from '../useMutation'; const useGetApiToken = () => { - const { data, ...rest } = useFetch('api_token'); + const { data, ...rest } = useMutation('api_token'); return { api_token_data: data, diff --git a/packages/api/src/hooks/useLoginHistory.ts b/packages/api/src/hooks/useLoginHistory.ts index c6d1c49873fb..c2e394784575 100644 --- a/packages/api/src/hooks/useLoginHistory.ts +++ b/packages/api/src/hooks/useLoginHistory.ts @@ -1,17 +1,17 @@ import { useMemo } from 'react'; import { getLoginHistoryFormattedData } from '@deriv/utils'; import useAuthorize from './useAuthorize'; -import useFetch from '../useFetch'; -import useRequest from '../useRequest'; +import useMutation from '../useMutation'; +import useQuery from '../useQuery'; type TUseLoginHistoryPayload = NonNullable< - NonNullable>['mutate']>>[0]>['payload'] + NonNullable>['mutate']>>[0]>['payload'] >; /** A custom hook to retrieve a summary of login history for user.*/ const useLoginHistory = (payload?: TUseLoginHistoryPayload) => { const { isSuccess } = useAuthorize(); - const { data, ...rest } = useFetch('login_history', { + const { data, ...rest } = useQuery('login_history', { payload, options: { enabled: isSuccess }, }); diff --git a/packages/api/src/hooks/useResidenceList.ts b/packages/api/src/hooks/useResidenceList.ts index ed7073fa6512..ec65b0076050 100644 --- a/packages/api/src/hooks/useResidenceList.ts +++ b/packages/api/src/hooks/useResidenceList.ts @@ -1,4 +1,5 @@ import { useMemo } from 'react'; + import useQuery from '../useQuery'; /** A custom hook that gets the residence list. */ diff --git a/packages/api/src/hooks/useSetApiToken.ts b/packages/api/src/hooks/useSetApiToken.ts index 6e669be51da1..b19a0191a7e0 100644 --- a/packages/api/src/hooks/useSetApiToken.ts +++ b/packages/api/src/hooks/useSetApiToken.ts @@ -1,11 +1,11 @@ import React from 'react'; -import useRequest from '../useRequest'; +import { useMutation } from '..'; type TAPITokenPayload = NonNullable< - NonNullable>['mutate']>>[0]>['payload'] + NonNullable>['mutate']>>[0]>['payload'] >; const useSetApiToken = () => { - const { data, mutate, ...rest } = useRequest('api_token'); + const { data, mutate, ...rest } = useMutation('api_token'); const update = React.useCallback((payload?: TAPITokenPayload) => mutate({ payload }), [mutate]); diff --git a/packages/api/src/hooks/useTransactions.ts b/packages/api/src/hooks/useTransactions.ts index cc66005a0145..1491b69c6265 100644 --- a/packages/api/src/hooks/useTransactions.ts +++ b/packages/api/src/hooks/useTransactions.ts @@ -1,5 +1,7 @@ import { useMemo } from 'react'; + import useInfiniteQuery from '../useInfiniteQuery'; + import useAuthorize from './useAuthorize'; /** A custom hook to get the summary of account transactions */ diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 87cdbaaa7ed6..3294a9b84a5b 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,6 +1,6 @@ -import useQuery from './useQuery'; -import useMutation from './useMutation'; import useInfiniteQuery from './useInfiniteQuery'; +import useMutation from './useMutation'; +import useQuery from './useQuery'; export { default as APIProvider } from './APIProvider'; export { default as useInvalidateQuery } from './useInvalidateQuery'; diff --git a/packages/api/src/useAPI.ts b/packages/api/src/useAPI.ts index ffe43b32beb8..a5969884df3f 100644 --- a/packages/api/src/useAPI.ts +++ b/packages/api/src/useAPI.ts @@ -1,5 +1,5 @@ import { useCallback, useContext } from 'react'; -import APIContext from './APIContext'; + import type { TSocketEndpointNames, TSocketPaginateableEndpointNames, @@ -8,6 +8,8 @@ import type { TSocketSubscribableEndpointNames, } from '../types'; +import APIContext from './APIContext'; + const useAPI = () => { const api = useContext(APIContext); diff --git a/packages/api/src/useInfiniteQuery.ts b/packages/api/src/useInfiniteQuery.ts index 2c4be0cb3415..55793a71715d 100644 --- a/packages/api/src/useInfiniteQuery.ts +++ b/packages/api/src/useInfiniteQuery.ts @@ -1,5 +1,5 @@ import { useInfiniteQuery as _useInfiniteQuery } from '@tanstack/react-query'; -import useAPI from './useAPI'; + import type { TSocketAcceptableProps, TSocketPaginatateableRequestCleaned, @@ -7,6 +7,8 @@ import type { TSocketRequestInfiniteQueryOptions, TSocketRequestPayload, } from '../types'; + +import useAPI from './useAPI'; import { getQueryKeys } from './utils'; const useInfiniteQuery = ( diff --git a/packages/api/src/usePaginatedFetch.ts b/packages/api/src/usePaginatedFetch.ts index bb025842b853..3551c6915124 100644 --- a/packages/api/src/usePaginatedFetch.ts +++ b/packages/api/src/usePaginatedFetch.ts @@ -1,12 +1,14 @@ import { useCallback, useState } from 'react'; -import useQuery from './useQuery'; + import type { TSocketAcceptableProps, + TSocketPaginateableEndpointNames, TSocketRequestPayload, TSocketRequestQueryOptions, - TSocketPaginateableEndpointNames, } from '../types'; +import useQuery from './useQuery'; + const usePaginatedFetch = ( name: T, ...props: TSocketAcceptableProps diff --git a/packages/api/src/useQuery.ts b/packages/api/src/useQuery.ts index 034ec8544c12..6c7c04a8929f 100644 --- a/packages/api/src/useQuery.ts +++ b/packages/api/src/useQuery.ts @@ -1,5 +1,5 @@ import { useQuery as _useQuery } from '@tanstack/react-query'; -import useAPI from './useAPI'; + import type { TSocketAcceptableProps, TSocketEndpointNames, @@ -7,6 +7,8 @@ import type { TSocketRequestQueryOptions, TSocketResponseData, } from '../types'; + +import useAPI from './useAPI'; import { getQueryKeys } from './utils'; const useQuery = (name: T, ...props: TSocketAcceptableProps) => { diff --git a/packages/api/types.ts b/packages/api/types.ts index 5bd5aa6f2a71..df0453b7fe16 100644 --- a/packages/api/types.ts +++ b/packages/api/types.ts @@ -1,12 +1,12 @@ import type { - APITokenRequest, - APITokenResponse, AccountLimitsRequest, AccountLimitsResponse, AccountStatusRequest, AccountStatusResponse, ActiveSymbolsRequest, ActiveSymbolsResponse, + APITokenRequest, + APITokenResponse, ApplicationDeleteRequest, ApplicationDeleteResponse, ApplicationGetDetailsRequest, @@ -71,10 +71,10 @@ import type { LandingCompanyDetailsResponse, LandingCompanyRequest, LandingCompanyResponse, - LogOutRequest, - LogOutResponse, LoginHistoryRequest, LoginHistoryResponse, + LogOutRequest, + LogOutResponse, MT5AccountsListRequest, MT5AccountsListResponse, MT5DepositRequest, @@ -103,10 +103,6 @@ import type { P2PAdvertCreateResponse, P2PAdvertInformationRequest, P2PAdvertInformationResponse, - P2PAdvertListRequest, - P2PAdvertListResponse, - P2PAdvertUpdateRequest, - P2PAdvertUpdateResponse, P2PAdvertiserAdvertsRequest, P2PAdvertiserAdvertsResponse, P2PAdvertiserCreateRequest, @@ -121,6 +117,10 @@ import type { P2PAdvertiserRelationsResponse, P2PAdvertiserUpdateRequest, P2PAdvertiserUpdateResponse, + P2PAdvertListRequest, + P2PAdvertListResponse, + P2PAdvertUpdateRequest, + P2PAdvertUpdateResponse, P2PChatCreateRequest, P2PChatCreateResponse, P2POrderCancelRequest, @@ -229,6 +229,32 @@ import type { import type { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'; type TPrivateSocketEndpoints = { + wallet_migration: { + request: { + /** + * Must be `state`, `start` or `reset` + */ + wallet_migration: 'state' | 'start' | 'reset'; + }; + response: { + wallet_migration: { + /** + * State of wallet migration. + */ + state: 'ineligible' | 'eligible' | 'in_progress' | 'migrated' | 'failed'; + }; + /** + * Echo of the request made. + */ + echo_req: { + [k: string]: unknown; + }; + /** + * Action name of the request made. + */ + msg_type: 'wallet_migration'; + }; + }; cashier_payments: { request: { /** @@ -929,7 +955,7 @@ type TPrivateSocketEndpoints = { echo_req: { [k: string]: unknown; }; - /**z + /** * Action name of the request made. */ msg_type: 'trading_platform_available_accounts'; diff --git a/packages/appstore/package.json b/packages/appstore/package.json index a34c8c5c4281..77cd51eb805a 100644 --- a/packages/appstore/package.json +++ b/packages/appstore/package.json @@ -24,28 +24,34 @@ "author": "Deriv", "license": "Apache-2.0", "dependencies": { + "@deriv/api": "^1.0.0", "@deriv/account": "^1.0.0", "@deriv/api-types": "^1.0.118", "@deriv/cashier": "^1.0.0", - "@deriv/components": "^1.0.0", "@deriv/cfd": "^1.0.0", + "@deriv/components": "^1.0.0", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", "@deriv/trader": "^3.8.0", "@deriv/translations": "^1.0.0", + "@deriv/utils": "^1.0.0", + "@testing-library/jest-dom": "^5.12.0", "@deriv/hooks": "^1.0.0", "@deriv/wallets": "^1.0.0", "classnames": "^2.2.6", "formik": "^2.1.4", + "lodash.debounce": "^4.0.8", "mobx": "^6.6.1", "mobx-react-lite": "^3.4.0", "object.fromentries": "^2.0.0", "prop-types": "^15.7.2", "react": "^17.0.2", "react-content-loader": "^6.2.0", - "react-router": "^5.2.0", "react-joyride": "^2.5.3", - "react-router-dom": "^5.2.0" + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", + "react-transition-group": "4.4.2", + "embla-carousel-react": "^8.0.0-rc12" }, "devDependencies": { "@babel/eslint-parser": "^7.17.0", @@ -65,8 +71,8 @@ "@types/react-router-dom": "^5.1.6", "babel-core": "^6.26.3", "babel-loader": "^8.1.0", - "copy-webpack-plugin": "^9.0.1", "concurrently": "^5.3.0", + "copy-webpack-plugin": "^9.0.1", "cross-env": "^5.2.0", "css-loader": "^5.0.1", "css-minimizer-webpack-plugin": "^3.0.1", diff --git a/packages/appstore/src/assets/svgs/wallets/how-it-works.svg b/packages/appstore/src/assets/svgs/wallets/how-it-works.svg new file mode 100644 index 000000000000..7c76148973a5 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/how-it-works.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/image-types.tsx b/packages/appstore/src/assets/svgs/wallets/image-types.tsx new file mode 100644 index 000000000000..d94ca85744ce --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/image-types.tsx @@ -0,0 +1,10 @@ +import { WalletsImagesList } from './wallets-image'; + +export type TWalletsImagesListKey = keyof typeof WalletsImagesList; +export type TImageTestID = `dt_${TWalletsImagesListKey}`; + +export type WalletsImageProps = { + image: T; + className?: string; + width?: number; +}; diff --git a/packages/appstore/src/assets/svgs/wallets/index.tsx b/packages/appstore/src/assets/svgs/wallets/index.tsx new file mode 100644 index 000000000000..dfd3f51c7e64 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/index.tsx @@ -0,0 +1,3 @@ +import WalletsImage from './wallets-image'; + +export default WalletsImage; diff --git a/packages/appstore/src/assets/svgs/wallets/introducing-wallets-eu.svg b/packages/appstore/src/assets/svgs/wallets/introducing-wallets-eu.svg new file mode 100644 index 000000000000..d5a19341f5eb --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/introducing-wallets-eu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/introducing-wallets.svg b/packages/appstore/src/assets/svgs/wallets/introducing-wallets.svg new file mode 100644 index 000000000000..a87524f4c528 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/introducing-wallets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/ready_to_update_wallets_image.svg b/packages/appstore/src/assets/svgs/wallets/ready_to_update_wallets_image.svg new file mode 100644 index 000000000000..e9440a5c4717 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/ready_to_update_wallets_image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/ready_to_upgrade_wallets_image.svg b/packages/appstore/src/assets/svgs/wallets/ready_to_upgrade_wallets_image.svg new file mode 100644 index 000000000000..e9440a5c4717 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/ready_to_upgrade_wallets_image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/trading-accounts-eu.svg b/packages/appstore/src/assets/svgs/wallets/trading-accounts-eu.svg new file mode 100644 index 000000000000..c0e7c9598fd4 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/trading-accounts-eu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/trading-accounts.svg b/packages/appstore/src/assets/svgs/wallets/trading-accounts.svg new file mode 100644 index 000000000000..7802f43e7c6e --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/trading-accounts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-image.tsx b/packages/appstore/src/assets/svgs/wallets/wallets-image.tsx new file mode 100644 index 000000000000..b7de44de33ab --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-image.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { TImageTestID, TWalletsImagesListKey, WalletsImageProps } from './image-types'; +import HowItWorks from 'Assets/svgs/wallets/how-it-works.svg'; +import IntroducingWallets from 'Assets/svgs/wallets/introducing-wallets.svg'; +import IntroducingWalletsEU from 'Assets/svgs/wallets/introducing-wallets-eu.svg'; +import ReadyToUpgradeWalletsImage from './ready_to_upgrade_wallets_image.svg'; +import ReadyDesktopEuImage from 'Assets/svgs/wallets/wallets-ready-desktop-eu.svg'; +import ReadyDesktopImage from 'Assets/svgs/wallets/wallets-ready-desktop.svg'; +import ReadyMobileEuImage from 'Assets/svgs/wallets/wallets-ready-mobile-eu.svg'; +import ReadyMobileImage from 'Assets/svgs/wallets/wallets-ready-mobile.svg'; +import TradingAccounts from 'Assets/svgs/wallets/trading-accounts.svg'; +import TradingAccountsEU from 'Assets/svgs/wallets/trading-accounts-eu.svg'; +import UpgradeDesktopImage from 'Assets/svgs/wallets/wallets-upgrade-desktop.svg'; +import UpgradeMobileImage from 'Assets/svgs/wallets/wallets-upgrade-mobile.svg'; + +export const WalletsImagesList = { + how_it_works: HowItWorks, + introducing_wallets: IntroducingWallets, + introducing_wallets_eu: IntroducingWalletsEU, + ready_desktop: ReadyDesktopImage, + ready_desktop_eu: ReadyDesktopEuImage, + ready_mobile: ReadyMobileImage, + ready_mobile_eu: ReadyMobileEuImage, + trading_accounts: TradingAccounts, + trading_accounts_eu: TradingAccountsEU, + upgrade_desktop: UpgradeDesktopImage, + upgrading_desktop: ReadyDesktopImage, + upgrading_desktop_eu: ReadyDesktopEuImage, + upgrade_mobile: UpgradeMobileImage, + upgrading_mobile: ReadyMobileImage, + upgrading_mobile_eu: ReadyMobileEuImage, + ready_to_upgrade_wallets_image: ReadyToUpgradeWalletsImage, +} as const; + +const WalletsImage = ({ image, className, width }: WalletsImageProps) => { + const Component = WalletsImagesList[image] as React.ElementType; + const data_testid: TImageTestID = `dt_${image}`; + + return ; +}; + +export default WalletsImage; diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop-eu.svg b/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop-eu.svg new file mode 100644 index 000000000000..b6a2921adc75 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop-eu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop.svg b/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop.svg new file mode 100644 index 000000000000..8968ce4e2d42 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-ready-desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile-eu.svg b/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile-eu.svg new file mode 100644 index 000000000000..2df69c4e3170 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile-eu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile.svg b/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile.svg new file mode 100644 index 000000000000..2a7f784a6dcc --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-ready-mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-desktop.svg b/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-desktop.svg new file mode 100644 index 000000000000..81a9e3b68662 --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-mobile.svg b/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-mobile.svg new file mode 100644 index 000000000000..92c92111f8fd --- /dev/null +++ b/packages/appstore/src/assets/svgs/wallets/wallets-upgrade-mobile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/components/add-more-wallets/__test__/add-more-wallets.spec.tsx b/packages/appstore/src/components/add-more-wallets/__test__/add-more-wallets.spec.tsx new file mode 100644 index 000000000000..5ae97d7ff1ad --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/__test__/add-more-wallets.spec.tsx @@ -0,0 +1,136 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import { APIProvider } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import AddMoreWallets from '../add-more-wallets'; + +jest.mock('../wallet-add-card', () => { + const AddWalletCard = () =>
AddWalletCard
; + return AddWalletCard; +}); + +jest.mock('../carousel-container', () => { + const CarouselContainer = ({ children }: React.PropsWithChildren) => ( +
{children}
+ ); + return CarouselContainer; +}); + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { account_category: 'wallet', landing_company_name: 'svg', is_virtual: 0, currency: 'USD' }, + ], + landing_company_name: 'svg', + }, + }, + }; + } + + if (name === 'get_account_types') { + return { + data: { + get_account_types: { + wallet: { + crypto: { + currencies: ['BTC', 'ETH'], + }, + doughflow: { + currencies: ['USD', 'EUR'], + }, + }, + }, + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('AddMoreWallets', () => { + const wrapper = (mock: ReturnType) => { + const Component = ({ children }: React.PropsWithChildren) => { + return ( + + {children} + + ); + }; + return Component; + }; + + it('should render the component without errors', () => { + const mock = mockStore({ + client: { + loginid: 'CRW909900', + accounts: { + CRW909900: { + token: '12345', + }, + }, + is_crypto: (currency: string) => currency === 'BTC', + }, + }); + + const { container } = render(, { wrapper: wrapper(mock) }); + expect(container).toBeInTheDocument(); + }); + + it('should render the title correctly', () => { + const mock = mockStore({ + client: { + loginid: 'CRW909900', + accounts: { + CRW909900: { + token: '12345', + }, + }, + is_crypto: (currency: string) => currency === 'BTC', + }, + }); + + render(, { wrapper: wrapper(mock) }); + expect(screen.getByText('Add more Wallets')).toBeInTheDocument(); + }); + + it('should render the carousel', () => { + const mock = mockStore({ + client: { + loginid: 'CRW909900', + accounts: { + CRW909900: { + token: '12345', + }, + }, + is_crypto: (currency: string) => currency === 'BTC', + }, + }); + + render(, { wrapper: wrapper(mock) }); + expect(screen.getByTestId('dt_carousel_container')).toBeInTheDocument(); + }); + + it('should render the wallet add card', () => { + const mock = mockStore({ + client: { + loginid: 'CRW909900', + accounts: { + CRW909900: { + token: '12345', + }, + }, + is_crypto: (currency: string) => currency === 'BTC', + }, + }); + + render(, { wrapper: wrapper(mock) }); + const wallet_cards = screen.getAllByText(/AddWalletCard/i); + expect(wallet_cards).toHaveLength(4); + }); +}); diff --git a/packages/appstore/src/components/add-more-wallets/__test__/wallet-add-card.spec.tsx b/packages/appstore/src/components/add-more-wallets/__test__/wallet-add-card.spec.tsx new file mode 100644 index 000000000000..8666b2da0b61 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/__test__/wallet-add-card.spec.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import { APIProvider } from '@deriv/api'; +import { screen, render } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import AddWalletCard from '../wallet-add-card'; + +const wallet_info = { + currency: 'BTC', + gradient_card_class: '', + landing_company_name: 'svg', + is_added: false, +}; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { account_category: 'wallet', landing_company_name: 'svg', is_virtual: 0, currency: 'USD' }, + ], + landing_company_name: 'svg', + }, + }, + }; + } + + if (name === 'get_account_types') { + return { + data: { + get_account_types: { + wallet: { + crypto: { + currencies: ['BTC'], + }, + doughflow: { + currencies: ['USD'], + }, + }, + }, + }, + }; + } + + if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + USD: { type: 'fiat', name: 'US Dollar' }, + BTC: { type: 'crypto', name: 'Bitcoin' }, + UST: { type: 'crypto', name: 'USDT' }, + }, + }, + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('AddWalletCard', () => { + it('should render currency card', () => { + const mock = mockStore({}); + + render( + + + + + + ); + + const add_btn = screen.getByRole('button', { name: /Add/i }); + expect(screen.getByText('BTC Wallet')).toBeInTheDocument(); + expect(screen.getByText('SVG')).toBeInTheDocument(); + expect(add_btn).toBeInTheDocument(); + expect(add_btn).toBeEnabled(); + expect( + screen.getByText( + "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain." + ) + ).toBeInTheDocument(); + }); + + it('should disabled button when it is disabled', () => { + const mock = mockStore({}); + + render( + + + + + + ); + + const added_btn = screen.getByRole('button', { name: /Added/i }); + expect(added_btn).toBeInTheDocument(); + expect(added_btn).toBeDisabled(); + }); + + it('should show USDT instead of UST for UST currency', () => { + const mock = mockStore({}); + + render( + + + + + + ); + expect(screen.getByText('USDT Wallet')).toBeInTheDocument(); + expect(screen.queryByText('UST Wallet')).not.toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/add-more-wallets/add-more-wallets.scss b/packages/appstore/src/components/add-more-wallets/add-more-wallets.scss new file mode 100644 index 000000000000..a9a60392bb33 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/add-more-wallets.scss @@ -0,0 +1,91 @@ +@mixin align-center { + display: flex; + align-items: center; +} + +.add-wallets { + display: flex; + padding-top: 2.4rem; + flex-direction: column; + align-items: flex-start; + gap: 1.6rem; + width: 100%; + + &__title { + @include mobile { + padding-left: 1.6rem; + } + } + &__content { + background-color: var(--general-main-1); + border-radius: $BORDER_RADIUS; + position: relative; + width: 100%; + } + &__card { + width: 23rem; + height: 29rem; + padding: 1.6rem; + border-radius: 1.6rem; + border: 0.1rem solid var(--general-active); + background-color: var(--general-main-1); + box-shadow: $wallet-box-shadow; + cursor: pointer; + &-description, + &-wrapper { + display: flex; + flex-direction: column; + } + &-description { + align-items: flex-start; + gap: 0.8rem; + } + &-wrapper { + align-items: center; + gap: 2.4rem; + @include mobile { + gap: 1.6rem; + } + } + } +} + +.carousel { + overflow: hidden; + padding: 3.2rem 1.6rem; + &__wrapper { + height: 100%; + @include align-center; + justify-content: flex-start; + gap: 2.4rem; + } + &__btn { + background-color: var(--general-main-1); + z-index: 1; + color: var(--text-general); + position: absolute; + @include align-center; + justify-content: center; + top: 45%; + cursor: pointer; + width: 4rem; + height: 4rem; + border: 1px solid var(--general-background-main); + border-radius: 50%; + box-shadow: $btn-shadow; + &-prev { + left: 1.6rem; + } + &-next { + right: 1.6rem; + } + &-icon { + width: 50%; + height: 35%; + } + &:disabled { + opacity: 0.3; + display: none; + } + } +} diff --git a/packages/appstore/src/components/add-more-wallets/add-more-wallets.tsx b/packages/appstore/src/components/add-more-wallets/add-more-wallets.tsx new file mode 100644 index 000000000000..0af06208e35e --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/add-more-wallets.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Text, Loading } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { useAvailableWallets } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import CarouselContainer from './carousel-container'; +import AddWalletCard from './wallet-add-card'; + +import './add-more-wallets.scss'; + +const AddMoreWallets = observer(() => { + const { data, isLoading } = useAvailableWallets(); + const { + ui: { is_mobile }, + } = useStore(); + + return ( +
+ + + + + {isLoading ? ( + + ) : ( + data?.map(wallet => ) + )} + +
+ ); +}); + +export default AddMoreWallets; diff --git a/packages/appstore/src/components/add-more-wallets/carousel-buttons.tsx b/packages/appstore/src/components/add-more-wallets/carousel-buttons.tsx new file mode 100644 index 000000000000..2e3353819d72 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/carousel-buttons.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Icon } from '@deriv/components'; + +type PrevNextButtonProps = { + enabled: boolean; + nav_action: 'prev' | 'next'; + onClick: () => void; +}; + +export const CarouselButton: React.FC = props => { + const { enabled, onClick, nav_action } = props; + const icon = nav_action === 'prev' ? 'IcChevronLeftBold' : 'IcChevronRightBold'; + const className = nav_action === 'prev' ? 'carousel__btn carousel__btn-prev' : 'carousel__btn carousel__btn-next'; + + return ( + + ); +}; diff --git a/packages/appstore/src/components/add-more-wallets/carousel-container.tsx b/packages/appstore/src/components/add-more-wallets/carousel-container.tsx new file mode 100644 index 000000000000..5ce8f9b059f2 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/carousel-container.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import useEmblaCarousel, { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel-react'; +import { observer, useStore } from '@deriv/stores'; +import { CarouselButton } from './carousel-buttons'; + +const CarouselContainer: React.FC> = observer(({ children }) => { + const { ui } = useStore(); + const { is_mobile } = ui; + + const options: EmblaOptionsType = { + align: 0, + containScroll: 'trimSnaps', + watchDrag: is_mobile, + }; + + const [emblaRef, emblaApi] = useEmblaCarousel(options); + const [is_hovered, setIsHovered] = React.useState(is_mobile); + const [prev_btn_enabled, setPrevBtnEnabled] = React.useState(false); + const [next_btn_enabled, setNextBtnEnabled] = React.useState(false); + + const scrollPrev = React.useCallback(() => emblaApi?.scrollPrev(), [emblaApi]); + const scrollNext = React.useCallback(() => emblaApi?.scrollNext(), [emblaApi]); + + const onSelect = React.useCallback((embla_api: EmblaCarouselType) => { + setPrevBtnEnabled(embla_api.canScrollPrev()); + setNextBtnEnabled(embla_api.canScrollNext()); + }, []); + + React.useEffect(() => { + if (!emblaApi) return; + + onSelect(emblaApi); + emblaApi.on('reInit', onSelect); + emblaApi.on('select', onSelect); + }, [emblaApi, onSelect]); + + return ( +
!is_mobile && setIsHovered(true)} + onMouseLeave={() => !is_mobile && setIsHovered(false)} + > +
+
{children}
+
+ {!is_mobile && is_hovered && ( + + + + + )} +
+ ); +}); + +export default CarouselContainer; diff --git a/packages/appstore/src/components/add-more-wallets/index.ts b/packages/appstore/src/components/add-more-wallets/index.ts new file mode 100644 index 000000000000..db03122683b1 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/index.ts @@ -0,0 +1,3 @@ +import AddMoreWallets from './add-more-wallets'; + +export default AddMoreWallets; diff --git a/packages/appstore/src/components/add-more-wallets/wallet-add-card.tsx b/packages/appstore/src/components/add-more-wallets/wallet-add-card.tsx new file mode 100644 index 000000000000..5e74b263ee52 --- /dev/null +++ b/packages/appstore/src/components/add-more-wallets/wallet-add-card.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { TWalletInfo } from 'Types'; +import { Text, WalletCard } from '@deriv/components'; +import { useCurrencyConfig } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import { getWalletCurrencyIcon } from '@deriv/utils'; +import wallet_description_mapper from 'Constants/wallet_description_mapper'; + +type TAddWalletCard = { + wallet_info: React.PropsWithChildren; +}; + +const AddWalletCard = observer(({ wallet_info }: TAddWalletCard) => { + const { + ui: { is_dark_mode_on, is_mobile }, + } = useStore(); + + const { currency = '', landing_company_name, is_added, gradient_card_class } = wallet_info; + const { getConfig } = useCurrencyConfig(); + const currency_config = getConfig(currency); + + const wallet_details = { + currency, + icon: getWalletCurrencyIcon(currency, is_dark_mode_on), + icon_type: currency_config?.type, + jurisdiction_title: landing_company_name?.toUpperCase(), + name: currency_config?.name, + gradient_class: gradient_card_class, + }; + + return ( +
+
+ +
+ + + + + {wallet_description_mapper[currency]} + +
+
+
+ ); +}); + +export default AddWalletCard; diff --git a/packages/appstore/src/components/app-content.tsx b/packages/appstore/src/components/app-content.tsx new file mode 100644 index 000000000000..5f0ff1ba57cb --- /dev/null +++ b/packages/appstore/src/components/app-content.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { routes } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import Routes from 'Components/routes/routes'; +import classNames from 'classnames'; +import './app.scss'; + +const AppContent: React.FC = observer(() => { + const { ui } = useStore(); + const { is_dark_mode_on } = ui; + + return ( +
+
+ +
+
+ ); +}); + +export default AppContent; diff --git a/packages/appstore/src/components/app.tsx b/packages/appstore/src/components/app.tsx index 1a9c0e436dfb..88996a0cfe80 100644 --- a/packages/appstore/src/components/app.tsx +++ b/packages/appstore/src/components/app.tsx @@ -1,45 +1,24 @@ -import classNames from 'classnames'; -import * as React from 'react'; -import { setWebsocket, routes } from '@deriv/shared'; -import { StoreProvider, observer } from '@deriv/stores'; +import React from 'react'; import CashierStoreProvider from '@deriv/cashier/src/cashier-providers'; import CFDStoreProvider from '@deriv/cfd/src/cfd-providers'; -import Routes from 'Components/routes/routes'; -import { useStores, initContext } from 'Stores'; -import { TRootStore } from 'Types'; +import { StoreProvider } from '@deriv/stores'; +import AppContent from './app-content'; import './app.scss'; -type TAppProps = { +type TProps = { passthrough: { - root_store: TRootStore; - WS: Record; + root_store: React.ComponentProps['store']; }; }; -const App = ({ passthrough: { WS, root_store } }: TAppProps) => { - initContext(root_store, WS); - setWebsocket(WS); - const { ui }: TRootStore = useStores(); +const App: React.FC = ({ passthrough: { root_store } }) => ( + + + + + + + +); - return ( - - - -
-
- -
-
-
-
-
- ); -}; - -export default observer(App); +export default App; diff --git a/packages/appstore/src/components/cfds-listing/__tests__/index.spec.tsx b/packages/appstore/src/components/cfds-listing/__tests__/index.spec.tsx index 2653f7213d26..ca6cac2aa4bc 100644 --- a/packages/appstore/src/components/cfds-listing/__tests__/index.spec.tsx +++ b/packages/appstore/src/components/cfds-listing/__tests__/index.spec.tsx @@ -10,10 +10,9 @@ jest.mock('Components/containers/listing-container', () => describe('CFDsListing', () => { const mock = mockStore({ traders_hub: { - selected_region: 'NON-EU', + selected_region: 'Non-EU', has_any_real_account: true, is_real: true, - can_get_more_cfd_mt5_accounts: true, no_MF_account: true, is_demo_low_risk: true, }, diff --git a/packages/appstore/src/components/cfds-listing/index.tsx b/packages/appstore/src/components/cfds-listing/index.tsx index 9ce334e15dd4..96166410afb1 100644 --- a/packages/appstore/src/components/cfds-listing/index.tsx +++ b/packages/appstore/src/components/cfds-listing/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import { observer, useStore } from '@deriv/stores'; import { Text, StaticUrl } from '@deriv/components'; +import { useCFDCanGetMoreMT5Accounts } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; import { isMobile, formatMoney, getAuthenticationStatusInfo, Jurisdiction } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; import ListingContainer from 'Components/containers/listing-container'; @@ -13,7 +14,6 @@ import { Actions } from 'Components/containers/trading-app-card-actions'; import { getHasDivider } from 'Constants/utils'; import { AvailableAccount, TDetailsOfEachMT5Loginid } from 'Types'; import './cfds-listing.scss'; -import { useCFDCanGetMoreMT5Accounts } from '@deriv/hooks'; type TDetailedExistingAccount = AvailableAccount & TDetailsOfEachMT5Loginid & @@ -153,7 +153,7 @@ const CFDsListing = observer(() => { title={ !isMobile() && (
- + {localize('CFDs')} diff --git a/packages/appstore/src/components/containers/__tests__/wallets.spec.tsx b/packages/appstore/src/components/containers/__tests__/wallets.spec.tsx new file mode 100644 index 000000000000..f2e97f99c0ca --- /dev/null +++ b/packages/appstore/src/components/containers/__tests__/wallets.spec.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import Wallet from '../wallet'; +import { TWalletAccount } from 'Types'; + +const mockedRootStore = mockStore({}); + +jest.mock('react-transition-group', () => ({ + CSSTransition: jest.fn(({ children }) =>
{children}
), +})); + +jest.mock('@deriv/account', () => ({ + ...jest.requireActual('@deriv/account'), + getStatusBadgeConfig: jest.fn(() => ({ icon: '', text: '' })), +})); + +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useWalletModalActionHandler: jest.fn(() => ({ setWalletModalActiveTabIndex: jest.fn(), handleAction: jest.fn() })), +})); + +jest.mock('./../currency-switcher-container', () => jest.fn(({ children }) =>
{children}
)); +jest.mock('./../../wallet-content', () => jest.fn(() => wallet test content)); + +describe('', () => { + let mocked_props: TWalletAccount; + beforeEach(() => { + // @ts-expect-error need to give a value to all props + mocked_props = { + currency: 'USD', + landing_company_name: 'svg', + balance: 10000, + loginid: 'CRW123123', + is_selected: false, + is_demo: true, + is_malta_wallet: false, + gradient_header_class: 'wallet-header__usd-bg', + gradient_card_class: 'wallet-card__usd-bg', + }; + }); + it('Check class for NOT demo', () => { + const { container } = render( + + + + ); + expect(container.childNodes[0]).toHaveClass('wallet'); + expect(container.childNodes[0]).not.toHaveClass('wallet__demo'); + }); + + it('Check class for demo', () => { + const { container } = render( + + + + ); + + expect(container.childNodes[0]).toHaveClass('wallet'); + expect(container.childNodes[0]).toHaveClass('wallet__demo'); + }); + + it('Check for demo wallet header', () => { + render( + + + + ); + + const currency_card = screen.queryByTestId('dt_demo'); + expect(currency_card).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/containers/currency-switcher-container.tsx b/packages/appstore/src/components/containers/currency-switcher-container.tsx index 332211ee85a6..d1e980020ac3 100644 --- a/packages/appstore/src/components/containers/currency-switcher-container.tsx +++ b/packages/appstore/src/components/containers/currency-switcher-container.tsx @@ -1,16 +1,54 @@ -import React, { HTMLAttributes, ReactNode } from 'react'; +import React from 'react'; import classNames from 'classnames'; import { Icon } from '@deriv/components'; +import { Jurisdiction } from '@deriv/shared'; +import { useStore, observer } from '@deriv/stores'; import CurrencyIcon, { Currency } from 'Assets/svgs/currency'; +import TradingPlatformIcon from 'Assets/svgs/trading-platform'; import './currency-switcher-container.scss'; -import { useStore, observer } from '@deriv/stores'; -interface CurrentSwitcherContainerProps extends Omit, 'title'> { - actions?: ReactNode; +interface CurrentSwitcherContainerProps extends Omit, 'title'> { + actions?: React.ReactNode; has_interaction?: boolean; - icon: Currency; - title: ReactNode; + icon: Currency | 'Options'; + title?: React.ReactNode; + show_dropdown?: boolean; } +type CurrencyPlatformIconProps = { + icon: Currency | 'Options'; +}; + +type DropdownProps = Omit< + CurrentSwitcherContainerProps, + 'actions' | 'children' | 'className' | 'has_interaction' | 'icon' | 'title' | 'show_dropdown' +>; + +const CurrencyPlatformIcon = ({ icon }: CurrencyPlatformIconProps) => + icon === 'Options' ? ( + + ) : ( + + ); + +const Dropdown = observer(({ ...props }: DropdownProps) => { + const store = useStore(); + const { modules, traders_hub } = store; + const { is_eu_user, is_demo } = traders_hub; + const { current_list } = modules.cfd; + + const has_mf_mt5_account = Object.keys(current_list) + .map(key => current_list[key]) + .some(account => account.landing_company_short === Jurisdiction.MALTA_INVEST); + + if ((is_eu_user && has_mf_mt5_account) || is_demo) { + return null; + } + return ( +
+ +
+ ); +}); const CurrentSwitcherContainer = observer( ({ @@ -20,34 +58,13 @@ const CurrentSwitcherContainer = observer( has_interaction = false, icon, title, + show_dropdown = true, ...props }: CurrentSwitcherContainerProps) => { - const { client, modules, traders_hub } = useStore(); + const store = useStore(); + const { client } = store; const { document_status } = client.authentication_status; - const { is_eu_user, is_demo } = traders_hub; - const { current_list } = modules.cfd; - - const has_mf_mt5_account = Object.keys(current_list) - .map(key => current_list[key]) - .some(account => account.landing_company_short === 'maltainvest'); - - const Dropdown = () => { - const icon_dropdown = ( -
- -
- ); - - if ((is_eu_user && has_mf_mt5_account) || is_demo) { - return null; - } - return icon_dropdown; - }; return (
- +
{actions} - + {show_dropdown && }
); diff --git a/packages/appstore/src/components/containers/listing-container.tsx b/packages/appstore/src/components/containers/listing-container.tsx index 7317666c4085..969cec68f38a 100644 --- a/packages/appstore/src/components/containers/listing-container.tsx +++ b/packages/appstore/src/components/containers/listing-container.tsx @@ -1,54 +1,65 @@ import React, { HTMLAttributes, ReactNode } from 'react'; +import classNames from 'classnames'; +import { observer, useStore } from '@deriv/stores'; +import { TWalletAccount } from 'Types'; import CurrencySwitcherCard from 'Components/currency-switcher-card'; import GridContainer from 'Components/containers/grid-container'; -import './listing-container.scss'; -import { useStores } from 'Stores/index'; -import { observer } from 'mobx-react-lite'; import TitleCardLoader from 'Components/pre-loader/title-card-loader'; +import WalletTransferBlock from 'Components/wallet-content/wallet-transfer-block'; +import './listing-container.scss'; -type ListingContainerProps = { +type TListingContainerProps = { title: ReactNode; description: ReactNode; is_deriv_platform?: boolean; + wallet_account?: TWalletAccount; + className?: string; + is_outside_grid_container?: boolean; +}; +type TOptionsProps = Pick; +type TSwitcherProps = Pick; + +const Options = observer(({ title, description, is_deriv_platform }: TOptionsProps) => { + const { + client: { is_landing_company_loaded }, + } = useStore(); + + if (is_landing_company_loaded || !is_deriv_platform) { + return ( +
+ {title} + {description} +
+ ); + } + + return ; +}); + +const Switcher = ({ wallet_account, is_deriv_platform }: TSwitcherProps) => { + if (!is_deriv_platform) return null; + if (wallet_account) return ; + return ; }; const ListingContainer = ({ title, description, is_deriv_platform = false, + is_outside_grid_container, + wallet_account, children, -}: ListingContainerProps & Omit, 'title'>) => { - const { client } = useStores(); - const { is_landing_company_loaded } = client; - - const Options = () => { - if (is_landing_company_loaded) { - return ( -
- {title} - {description} -
- ); - } else if (!is_deriv_platform) { - return ( -
- {title} - {description} -
- ); - } - return ; - }; - + className, +}: TListingContainerProps & Omit, 'title'>) => { return ( -
+
- - {is_deriv_platform && } + +
- {children} + {is_outside_grid_container ? children : {children}}
); }; -export default observer(ListingContainer); +export default ListingContainer; diff --git a/packages/appstore/src/components/containers/trading-app-card.tsx b/packages/appstore/src/components/containers/trading-app-card.tsx index 46a3a867a257..d7c4996b55c8 100644 --- a/packages/appstore/src/components/containers/trading-app-card.tsx +++ b/packages/appstore/src/components/containers/trading-app-card.tsx @@ -9,13 +9,18 @@ import { BrandConfig, DERIV_PLATFORM_NAMES, } from 'Constants/platform-config'; -import './trading-app-card.scss'; import TradingAppCardActions, { Actions } from './trading-app-card-actions'; import { AvailableAccount, TDetailsOfEachMT5Loginid } from 'Types'; import { useStores } from 'Stores/index'; import { observer } from 'mobx-react-lite'; import { localize } from '@deriv/translations'; import { CFD_PLATFORMS, ContentFlag, getStaticUrl, getUrlSmartTrader, getUrlBinaryBot } from '@deriv/shared'; +import { useActiveWallet } from '@deriv/hooks'; +import './trading-app-card.scss'; + +type TWalletsProps = { + wallet_account?: ReturnType; +}; const TradingAppCard = ({ availability, @@ -33,7 +38,8 @@ const TradingAppCard = ({ mt5_acc_auth_status, selected_mt5_jurisdiction, openFailedVerificationModal, -}: Actions & BrandConfig & AvailableAccount & TDetailsOfEachMT5Loginid) => { + wallet_account, +}: Actions & BrandConfig & AvailableAccount & TDetailsOfEachMT5Loginid & TWalletsProps) => { const { common, traders_hub, @@ -43,6 +49,9 @@ const TradingAppCard = ({ const { current_language } = common; const { is_account_being_created } = cfd; + const demo_label = localize('Demo'); + const is_real_account = wallet_account ? !wallet_account.is_virtual : is_real; + const low_risk_cr_non_eu = content_flag === ContentFlag.LOW_RISK_CR_NON_EU; const app_platform = @@ -111,9 +120,9 @@ const TradingAppCard = ({
- {!is_real && sub_title ? `${sub_title} ${localize('Demo')}` : sub_title} + {!is_real_account && sub_title ? `${sub_title} ${demo_label}` : sub_title} - {short_code_and_region && ( + {!wallet_account && short_code_and_region && ( - {!is_real && !sub_title && !is_deriv_platform ? `${name} ${localize('Demo')}` : name} + {!is_real_account && !sub_title && !is_deriv_platform ? `${name} ${demo_label}` : name} {appDescription()} diff --git a/packages/appstore/src/components/containers/wallet.scss b/packages/appstore/src/components/containers/wallet.scss new file mode 100644 index 000000000000..312f6136b87a --- /dev/null +++ b/packages/appstore/src/components/containers/wallet.scss @@ -0,0 +1,44 @@ +.wallet { + background-color: var(--general-main-1); + border-radius: $BORDER_RADIUS * 4; + align-self: stretch; + + &__demo { + background-color: var(--wallet-demo-bg-color); + } + + &__content { + padding: 2.4rem; + } + + &__content-transition { + &-enter { + transform: translateY(-3rem); + opacity: 0; + } + + &-enter-active { + transition: all 240ms ease-in-out; + transform: translateY(0); + position: relative; + opacity: 1; + } + + &-enter-done, + &-exit { + transform: translateY(0); + opacity: 1; + } + + &-exit-active { + transition: all 240ms ease-in-out; + transform: translateY(-3rem); + position: relative; + opacity: 0; + } + + &-exit-done { + opacity: 0; + } + } +} diff --git a/packages/appstore/src/components/containers/wallet.tsx b/packages/appstore/src/components/containers/wallet.tsx new file mode 100644 index 000000000000..895a73c68e16 --- /dev/null +++ b/packages/appstore/src/components/containers/wallet.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import classNames from 'classnames'; +import WalletHeader from 'Components/wallet-header'; +import WalletContent from 'Components/wallet-content'; +import { CSSTransition } from 'react-transition-group'; +import { TWalletAccount } from 'Types'; +import './wallet.scss'; + +type TWallet = { + wallet_account: TWalletAccount; +}; + +const Wallet = ({ wallet_account }: TWallet) => { + const headerRef = React.useRef(null); + const { is_selected, is_demo, is_malta_wallet } = wallet_account; + + return ( +
+ + { + if (headerRef?.current) { + headerRef.current.style.scrollMargin = '20px'; + headerRef.current.scrollIntoView({ behavior: 'smooth' }); + } + }} + classNames='wallet__content-transition' + unmountOnExit + > + + +
+ ); +}; + +export default Wallet; diff --git a/packages/appstore/src/components/demo-reset-balance/__tests__/demo-reset-balance.spec.tsx b/packages/appstore/src/components/demo-reset-balance/__tests__/demo-reset-balance.spec.tsx new file mode 100644 index 000000000000..e0f4c1ee1e16 --- /dev/null +++ b/packages/appstore/src/components/demo-reset-balance/__tests__/demo-reset-balance.spec.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { APIProvider, useRequest } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import DemoResetBalance from '../demo-reset-balance'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useRequest: jest.fn(() => ({ mutate: jest.fn() })), +})); + +const mockUseRequest = useRequest as jest.MockedFunction>; + +describe('', () => { + it('should render demo reset balance component correctly', () => { + const mock = mockStore({}); + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({}); + const setActiveTabIndex = jest.fn(); + + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(screen.getByText('Reset balance to 10,000.00 USD')).toBeInTheDocument(); + expect( + screen.getByText('Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.') + ).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Reset balance' })).toBeInTheDocument(); + }); + + it('should disable reset balance button if the balance is equal to 10000 usd', () => { + const mock = mockStore({ + client: { + accounts: { + VRW1002: { + balance: 10000, + }, + }, + loginid: 'VRW1002', + }, + }); + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({}); + const setActiveTabIndex = jest.fn(); + + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(screen.getByRole('button', { name: /Reset balance/i })).toBeDisabled(); + }); + + it('should call reset balance API when click on Reset balance', () => { + const mock = mockStore({ + client: { + accounts: { + VRW1002: { + balance: 9880, + }, + }, + loginid: 'VRW1002', + }, + }); + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({ + mutate: jest.fn(), + }); + const { mutate } = mockUseRequest('topup_virtual'); + const setActiveTabIndex = jest.fn(); + + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + const reset_balance_button = screen.getByRole('button', { name: /Reset balance/i }); + userEvent.click(reset_balance_button); + expect(mutate).toBeCalledTimes(1); + }); + + it('should change tab when click on transfer funds button', () => { + const mock = mockStore({}); + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({ + isSuccess: true, + }); + const setActiveTabIndex = jest.fn(); + + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + const transfer_funds_button = screen.getByRole('button', { name: /Transfer funds/i }); + + userEvent.click(transfer_funds_button); + expect(setActiveTabIndex).toBeCalledTimes(1); + }); + + it('should show success message and transfer funds button if reset balance is reset successfully', () => { + const mock = mockStore({}); + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({ + isSuccess: true, + }); + const setActiveTabIndex = jest.fn(); + + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + + expect(screen.getByText('Your balance has been reset to 10,000.00 USD.')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /Transfer funds/i })).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.scss b/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.scss new file mode 100644 index 000000000000..82243f29aec9 --- /dev/null +++ b/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.scss @@ -0,0 +1,20 @@ +.reset-balance { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + + &__title, + &__button { + margin-top: 2.4rem; + + @include mobile { + margin-top: 1.6rem; + } + } + + &__text { + margin-top: 0.8rem; + } +} diff --git a/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.tsx b/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.tsx new file mode 100644 index 000000000000..3294963d2d58 --- /dev/null +++ b/packages/appstore/src/components/demo-reset-balance/demo-reset-balance.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { Icon, Text, Button, Div100vhContainer } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { useRequest } from '@deriv/api'; +import { observer, useStore } from '@deriv/stores'; +import './demo-reset-balance.scss'; + +type TDemoResetBalanceProps = { + setActiveTabIndex?: (index: number) => void; +}; + +const DemoResetBalance = observer(({ setActiveTabIndex }: TDemoResetBalanceProps) => { + const { mutate, isSuccess: isResetBalanceSuccess } = useRequest('topup_virtual'); + const { client, ui } = useStore(); + const { accounts, loginid } = client; + const { is_mobile } = ui; + + const can_reset_balance = loginid && (accounts[loginid]?.balance || 0) !== 10000; + + const resetBalance = () => { + mutate(); + }; + + const redirectToTransferTab = () => { + setActiveTabIndex?.(0); + }; + + return ( + +
+ + + + {isResetBalanceSuccess ? ( + + ) : ( + + )} + + + + {isResetBalanceSuccess ? ( + + ) : ( + + )} + + + {isResetBalanceSuccess ? ( + + ) : ( + + )} +
+
+ ); +}); + +export default DemoResetBalance; diff --git a/packages/appstore/src/components/demo-reset-balance/index.ts b/packages/appstore/src/components/demo-reset-balance/index.ts new file mode 100644 index 000000000000..0bb492bb7d66 --- /dev/null +++ b/packages/appstore/src/components/demo-reset-balance/index.ts @@ -0,0 +1,3 @@ +import DemoResetBalance from './demo-reset-balance'; + +export default DemoResetBalance; diff --git a/packages/appstore/src/components/elements/text/__tests__/balance-text.spec.tsx b/packages/appstore/src/components/elements/text/__tests__/balance-text.spec.tsx index cdc113b5b034..00616cfbe344 100644 --- a/packages/appstore/src/components/elements/text/__tests__/balance-text.spec.tsx +++ b/packages/appstore/src/components/elements/text/__tests__/balance-text.spec.tsx @@ -3,16 +3,18 @@ import BalanceText from '../balance-text'; import { render, screen } from '@testing-library/react'; import { StoreProvider, mockStore } from '@deriv/stores'; +const createWrapper = (mock: ReturnType) => { + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + return wrapper; +}; + describe('BalanceText', () => { it('should render the component', () => { const mock = mockStore({}); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); }); @@ -20,12 +22,8 @@ describe('BalanceText', () => { it('should render the correct balance and currency', () => { const mock = mockStore({}); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); expect(screen.getByText('1,000.00')).toBeInTheDocument(); @@ -35,15 +33,11 @@ describe('BalanceText', () => { it('should render the correct div class for dotted underline_style', () => { const mock = mockStore({}); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); - expect(screen.getByTestId('dt_balance-text__container')).toHaveClass('balance-text--dotted'); + expect(screen.getByTestId('dt_balance_text_container')).toHaveClass('balance-text--dotted'); }); it('should have classname ending with demo if user has selected_account_type demo and has an active real account ', () => { @@ -56,12 +50,8 @@ describe('BalanceText', () => { }, }); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); expect(screen.getByText('1,000.00')).toHaveClass('balance-text__text--demo'); @@ -77,12 +67,8 @@ describe('BalanceText', () => { }, }); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); expect(screen.getByText('1,000.00')).toHaveClass('balance-text__text--real'); @@ -95,12 +81,8 @@ describe('BalanceText', () => { }, }); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); expect(screen.getByText('1,000.00')).not.toHaveClass('balance-text__text--real'); @@ -110,14 +92,10 @@ describe('BalanceText', () => { it('should have classname as container if underline_style is none', () => { const mock = mockStore({}); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} - ); - const { container } = render(, { - wrapper, + wrapper: createWrapper(mock), }); expect(container).toBeInTheDocument(); - expect(screen.getByTestId('dt_balance-text__container')).toHaveClass('balance-text__container'); + expect(screen.getByTestId('dt_balance_text_container')).toHaveClass('balance-text__container'); }); }); diff --git a/packages/appstore/src/components/elements/text/balance-text.tsx b/packages/appstore/src/components/elements/text/balance-text.tsx index 1c08fe0b1884..cb9a5996578b 100644 --- a/packages/appstore/src/components/elements/text/balance-text.tsx +++ b/packages/appstore/src/components/elements/text/balance-text.tsx @@ -2,7 +2,7 @@ import React from 'react'; import classNames from 'classnames'; import { Text } from '@deriv/components'; import { formatMoney } from '@deriv/shared'; -import { useStore, observer } from '@deriv/stores'; +import { observer, useStore } from '@deriv/stores'; import './balance-text.scss'; // Todo: this definitely needs to be somewhere else @@ -32,7 +32,7 @@ const BalanceText = observer(({ balance, currency, size = 'm', underline_style = return (
{formatMoney(currency, balance, true)} diff --git a/packages/appstore/src/components/eu-disclaimer/__tests__/eu-disclaimer.spec.tsx b/packages/appstore/src/components/eu-disclaimer/__tests__/eu-disclaimer.spec.tsx new file mode 100644 index 000000000000..cab7453ebbf8 --- /dev/null +++ b/packages/appstore/src/components/eu-disclaimer/__tests__/eu-disclaimer.spec.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import EUDisclaimer from '../eu-disclaimer'; + +const mockedRootStore = mockStore({}); + +describe('', () => { + it('Check disclaimer exists', () => { + render( + + + + ); + + const eu_statutory_disclaimer = screen.getByText('EU statutory disclaimer'); + + expect(eu_statutory_disclaimer).toBeInTheDocument(); + }); + + it('Check disclaimer for wallets exists', () => { + render( + + + + ); + + const eu_statutory_disclaimer = screen.queryByText('EU statutory disclaimer'); + + expect(eu_statutory_disclaimer).not.toBeInTheDocument(); + }); + + it('Check classes when dont pass the props', () => { + render( + + + + ); + + const wrapper = screen.getByTestId('dt_disclaimer_wrapper'); + const text = screen.getByTestId('dt_disclaimer_text'); + + expect(wrapper).toHaveClass('disclaimer'); + expect(text).toHaveClass('disclaimer-text'); + }); + + it('Check classes when pass the props', () => { + render( + + + + ); + + const wrapper = screen.getByTestId('dt_disclaimer_wrapper'); + const text = screen.getByTestId('dt_disclaimer_text'); + + expect(wrapper).not.toHaveClass('disclaimer'); + expect(text).not.toHaveClass('disclaimer-text'); + expect(wrapper).toHaveClass('wrapper-class'); + expect(text).toHaveClass('text-class'); + }); +}); diff --git a/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.scss b/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.scss new file mode 100644 index 000000000000..65a239cee975 --- /dev/null +++ b/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.scss @@ -0,0 +1,24 @@ +.disclaimer { + position: fixed; + bottom: 3.6rem; + width: 100%; + height: 5rem; + z-index: 3; + display: flex; + align-items: center; + backface-visibility: hidden; + background: var(--icon-grey-background); + + @include mobile { + height: 8rem; + border: 1px solid var(--icon-grey-background); + } + + &-text { + padding: 0 3rem; + + @include mobile { + padding: 0 1.5rem; + } + } +} diff --git a/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.tsx b/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.tsx new file mode 100644 index 000000000000..452de6a693e3 --- /dev/null +++ b/packages/appstore/src/components/eu-disclaimer/eu-disclaimer.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { Text } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { useStore, observer } from '@deriv/stores'; +import './eu-disclaimer.scss'; + +type TEUDisclaimerProps = { + is_wallet?: boolean; + wrapperClassName?: string; + textClassName?: string; +}; +type TDisclaimerLocalizedText = { + is_wallet?: boolean; +}; + +const DisclaimerLocalizedText = ({ is_wallet }: TDisclaimerLocalizedText) => + is_wallet ? ( + 73% 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.' + } + components={[]} + /> + ) : ( + EU statutory disclaimer: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.' + } + components={[]} + /> + ); + +const EUDisclaimer = observer(({ is_wallet, wrapperClassName, textClassName }: TEUDisclaimerProps) => { + const { + ui: { is_mobile }, + } = useStore(); + + return ( +
+ + + +
+ ); +}); + +export default EUDisclaimer; diff --git a/packages/appstore/src/components/eu-disclaimer/index.ts b/packages/appstore/src/components/eu-disclaimer/index.ts new file mode 100644 index 000000000000..26dd46512928 --- /dev/null +++ b/packages/appstore/src/components/eu-disclaimer/index.ts @@ -0,0 +1,3 @@ +import EUDisclaimer from './eu-disclaimer'; + +export default EUDisclaimer; diff --git a/packages/appstore/src/components/main-title-bar/__tests__/index.spec.tsx b/packages/appstore/src/components/main-title-bar/__tests__/index.spec.tsx index 1525ed6aab21..13cdd09da0f9 100644 --- a/packages/appstore/src/components/main-title-bar/__tests__/index.spec.tsx +++ b/packages/appstore/src/components/main-title-bar/__tests__/index.spec.tsx @@ -1,14 +1,65 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import { StoreProvider, mockStore } from '@deriv/stores'; +import { APIProvider /*useFetch*/ } from '@deriv/api'; import MainTitleBar from '..'; -describe('MainTitleBar', () => { - const render_container = () => { - const mock = mockStore({}); +//TODO: Uncomment once useWalletMigration hook is optimized for production release. +// jest.mock('Components/wallets-banner', () => jest.fn(() => 'WalletsBanner')); +// const mockUseFetch = useFetch as jest.MockedFunction>; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + currency: 'USD', + is_virtual: 0, + }, + ], + }, + }, + }; + } else if (name === 'balance') { + return { + data: { + balance: { + accounts: { + CRW909900: { + balance: 1000, + }, + }, + }, + }, + }; + } else if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + USD: { type: 'fiat' }, + }, + }, + }, + }; + } + + return undefined; + }), +})); - const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} +describe('MainTitleBar', () => { + const render_container = (mock_store_override?: ReturnType) => { + const mock_store = mockStore({ feature_flags: { data: { wallet: false } } }); + const wrapper = ({ children }: React.PropsWithChildren) => ( + + {children} + ); return render(, { @@ -21,6 +72,36 @@ describe('MainTitleBar', () => { expect(container).toBeInTheDocument(); }); + //TODO: Uncomment once useWalletMigration hook is optimized for production release. + // it('should not render WalletsBanner component if wallet feature flag is disabled', () => { + // render_container(); + // expect(screen.queryByText('WalletsBanner')).not.toBeInTheDocument(); + // }); + + //TODO: Uncomment once useWalletMigration hook is optimized for production release. + // it('should render WalletsBanner component if wallet feature flag is enabled', () => { + // const mock_store = mockStore({ + // client: { accounts: { CR123456: { token: '12345' } }, loginid: 'CR123456' }, + // feature_flags: { data: { wallet: true } }, + // }); + // // @ts-expect-error need to come up with a way to mock the return type of useFetch + // mockUseFetch.mockReturnValue({ + // data: { + // authorize: { + // account_list: [ + // { + // account_category: 'trading', + // currency: 'USD', + // is_virtual: 0, + // }, + // ], + // }, + // }, + // }); + // render_container(mock_store); + // expect(screen.getByText('WalletsBanner')).toBeInTheDocument(); + // }); + it('should render the correct title text', () => { render_container(); expect(screen.getByText(/Trader's Hub/)).toBeInTheDocument(); diff --git a/packages/appstore/src/components/main-title-bar/index.tsx b/packages/appstore/src/components/main-title-bar/index.tsx index de0ea7fd2dd6..a7ebde37f2ea 100644 --- a/packages/appstore/src/components/main-title-bar/index.tsx +++ b/packages/appstore/src/components/main-title-bar/index.tsx @@ -1,18 +1,21 @@ import React from 'react'; import { Text, DesktopWrapper, MobileWrapper, Tabs, Icon } from '@deriv/components'; +// import { useFeatureFlags } from '@deriv/hooks'; import { ContentFlag } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; +import { Localize, localize } from '@deriv/translations'; +import RegulationsSwitcherLoader from 'Components/pre-loader/regulations-switcher-loader'; +// import WalletsBanner from 'Components/wallets-banner'; import AccountTypeDropdown from './account-type-dropdown'; import AssetSummary from './asset-summary'; import RegulatorSwitcher from './regulators-switcher'; -import { localize } from '@deriv/translations'; import './main-title-bar.scss'; -import RegulationsSwitcherLoader from 'Components/pre-loader/regulations-switcher-loader'; const MainTitleBar = () => { - const { traders_hub, client } = useStore(); + const { traders_hub, client, notifications } = useStore(); const { selected_region, handleTabItemClick, toggleRegulatorsCompareModal, content_flag } = traders_hub; const { is_landing_company_loaded, is_switching } = client; + const { removeAllNotificationMessages, filterNotificationMessages } = notifications; const is_low_risk_cr_real_account = content_flag === ContentFlag.LOW_RISK_CR_NON_EU || content_flag === ContentFlag.LOW_RISK_CR_EU; @@ -21,13 +24,26 @@ const MainTitleBar = () => { setActiveIndex(selected_region === 'Non-EU' ? 0 : 1); }, [selected_region]); + // TODO: Uncomment once useWalletMigration hook is optimized for production release. + // const { is_wallet_enabled } = useFeatureFlags(); + + // TODO: Remove this when we have BE API ready + removeAllNotificationMessages(true); + + React.useEffect(() => { + filterNotificationMessages(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return ( + {/* TODO: Uncomment once useWalletMigration hook is optimized for production release. */} + {/* {is_wallet_enabled && } */}
- {localize("Trader's Hub")} +
@@ -37,7 +53,7 @@ const MainTitleBar = () => { - {localize("Trader's Hub")} +
diff --git a/packages/appstore/src/components/modals/modal-manager.tsx b/packages/appstore/src/components/modals/modal-manager.tsx index a80d73360f20..b35cec7b0fd9 100644 --- a/packages/appstore/src/components/modals/modal-manager.tsx +++ b/packages/appstore/src/components/modals/modal-manager.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { observer } from 'mobx-react-lite'; import { ResetTradingPasswordModal } from '@deriv/account'; +import { useFeatureFlags } from '@deriv/hooks'; import { TTradingPlatformAvailableAccount } from './account-type-modal/types'; import MT5AccountTypeModal from './account-type-modal'; import RegulatorsCompareModal from './regulators-compare-modal'; @@ -18,6 +19,9 @@ import { TOpenAccountTransferMeta } from 'Types'; import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; import FailedVerificationModal from './failed-veriification-modal'; import AccountTransferModal from 'Components/account-transfer-modal'; +import RealWalletsUpgrade from './real-wallets-upgrade/real-wallets-upgrade'; +import WalletsMigrationFailed from './wallets-migration-failed'; +import WalletModal from './wallet-modal'; type TCurrentList = DetailsOfEachMT5Loginid & { enabled: number; @@ -25,6 +29,7 @@ type TCurrentList = DetailsOfEachMT5Loginid & { const ModalManager = () => { const store = useStores(); + const { is_wallet_enabled } = useFeatureFlags(); const { common, client, modules, traders_hub, ui } = store; const { is_logged_in, @@ -53,7 +58,8 @@ const ModalManager = () => { is_reset_trading_password_modal_visible, setResetTradingPasswordModalOpen, } = ui; - const { is_demo, is_account_transfer_modal_open, toggleAccountTransferModal } = traders_hub; + const { is_demo, is_account_transfer_modal_open, toggleAccountTransferModal, is_real_wallets_upgrade_on } = + traders_hub; const [password_manager, setPasswordManager] = React.useState<{ is_visible: boolean; @@ -166,6 +172,9 @@ const ModalManager = () => { toggleModal={toggleAccountTransferModal} /> + {is_real_wallets_upgrade_on && } + + {is_wallet_enabled && } ); }; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/__tests__/real-wallets-upgrade.spec.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/__tests__/real-wallets-upgrade.spec.tsx new file mode 100644 index 000000000000..e9d77292b34e --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/__tests__/real-wallets-upgrade.spec.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import RealWalletsUpgrade from '../real-wallets-upgrade'; +import { render } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { APIProvider } from '@deriv/api'; + +describe('', () => { + const wrapper = (mock: ReturnType) => { + const Component = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + return Component; + }; + it('should render the Modal', () => { + const mock = mockStore({ + traders_hub: { + is_real_wallets_upgrade_on: true, + toggleWalletsUpgrade: true, + }, + }); + + const { container } = render(, { wrapper: wrapper(mock) }); + + expect(container).toBeInTheDocument(); + }); + + it('should not render the Modal if is_real_wallets_upgrade_on is false', () => { + const mock = mockStore({ + traders_hub: { + is_real_wallets_upgrade_on: false, + toggleWalletsUpgrade: false, + }, + }); + + const { container } = render(, { wrapper: wrapper(mock) }); + + expect(container).toBeEmptyDOMElement(); + }); +}); diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/desktop-real-wallets-upgrade.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/desktop-real-wallets-upgrade.tsx new file mode 100644 index 000000000000..4bfa0ceb0c83 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/desktop-real-wallets-upgrade.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Modal } from '@deriv/components'; +import { useStore, observer } from '@deriv/stores'; +import WalletsUpgradeFooter from './wallets-upgrade-footer'; +import WalletsUpgradeContent from './wallets-upgrade-content'; +import { TRealWalletsUpgradeSteps } from 'Types'; + +const DesktopRealWalletsUpgrade = observer(({ wallet_upgrade_steps }: TRealWalletsUpgradeSteps) => { + const { traders_hub: is_real_wallets_upgrade_on } = useStore(); + + const { handleClose } = wallet_upgrade_steps; + + return ( + + + + + + + ); +}); + +export default DesktopRealWalletsUpgrade; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/index.ts b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/index.ts new file mode 100644 index 000000000000..23ebba8288de --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/index.ts @@ -0,0 +1,4 @@ +import DesktopRealWalletsUpgrade from './desktop-real-wallets-upgrade'; +import MobileRealWalletsUpgrade from './mobile-real-wallets-upgrade'; + +export { DesktopRealWalletsUpgrade, MobileRealWalletsUpgrade }; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/mobile-real-wallets-upgrade.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/mobile-real-wallets-upgrade.tsx new file mode 100644 index 000000000000..4991c830864f --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/mobile-real-wallets-upgrade.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { MobileDialog, Modal } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; +import { TRealWalletsUpgradeSteps } from 'Types'; +import WalletsUpgradeContent from './wallets-upgrade-content'; +import WalletsUpgradeFooter from './wallets-upgrade-footer'; + +const MobileRealWalletsUpgrade = observer(({ wallet_upgrade_steps }: TRealWalletsUpgradeSteps) => { + const { traders_hub: is_real_wallets_upgrade_on } = useStore(); + + return ( + } + > + + + + + ); +}); + +export default MobileRealWalletsUpgrade; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallet_steps.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallet_steps.tsx new file mode 100644 index 000000000000..78b4b571ed05 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallet_steps.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { WalletsIntro } from '../wallets-intro'; +import { EndFooter, InitialFooter } from './wallets-upgrade-footer'; +import WalletLinkingStep from '../wallet-linking-step/wallet-linking-step'; +import ReadyToUpgradeWallets from '../ready-to-upgrade-wallets'; +import getMockWalletMigrationResponse from 'Constants/mock_wallet_migration_response'; +import { TWalletSteps } from 'Types'; + +const WalletSteps = ({ + handleBack, + handleClose, + handleNext, + is_disabled, + toggleCheckbox, + upgradeToWallets, +}: TWalletSteps) => [ + { + name: 'intro_wallets', + component: , + footer: , + }, + { + name: 'intro_wallets', + component: , + }, + { + name: 'intro_wallets', + component: , + }, + { + name: 'linking_step', + component: , + }, + { + name: 'linking_step', + component: , + }, + { + name: 'linking_step', + component: , + }, + { + name: 'ready_to_upgrade', + component: , + footer: , + }, +]; + +export default WalletSteps; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-content.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-content.tsx new file mode 100644 index 000000000000..9549d9b3d97c --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-content.tsx @@ -0,0 +1,12 @@ +import WalletSteps from './wallet_steps'; +import { TRealWalletsUpgradeSteps } from 'Types'; + +const WalletsUpgradeContent = ({ wallet_upgrade_steps }: TRealWalletsUpgradeSteps) => { + const wallet_steps_array = WalletSteps({ ...wallet_upgrade_steps }); + + const { current_step } = wallet_upgrade_steps; + + return wallet_steps_array?.[current_step]?.component || wallet_steps_array?.[0].component; +}; + +export default WalletsUpgradeContent; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-footer.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-footer.tsx new file mode 100644 index 000000000000..d23350524844 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/modal-elements/wallets-upgrade-footer.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { Button, Modal } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import WalletSteps from './wallet_steps'; +import { TRealWalletsUpgradeSteps } from 'Types'; + +type TDefaultFooter = { + handleBack: () => void; + handleNext: () => void; +}; + +type TInitialFooter = { + handleClose: () => void; + handleNext: () => void; +}; + +type TEndFooter = { + handleBack: () => void; + is_disabled: boolean; + upgradeToWallets: (value: boolean) => void; +}; + +export const DefaultFooter = ({ handleBack, handleNext }: TDefaultFooter) => ( + + + + +); + +export const InitialFooter = ({ handleClose, handleNext }: TInitialFooter) => ( + + + + +); + +export const EndFooter = ({ handleBack, is_disabled, upgradeToWallets }: TEndFooter) => ( + + + + +); + +const WalletsUpgradeFooter = ({ wallet_upgrade_steps }: TRealWalletsUpgradeSteps) => { + const wallet_steps_array = WalletSteps({ ...wallet_upgrade_steps }); + + const { current_step, handleBack, handleNext } = wallet_upgrade_steps; + + return ( + wallet_steps_array?.[current_step]?.footer || + ); +}; + +export default WalletsUpgradeFooter; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/index.ts b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/index.ts new file mode 100644 index 000000000000..0fee66b7ca8d --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/index.ts @@ -0,0 +1,3 @@ +import ReadyToUpgradeWallets from './ready-to-upgrade-wallets'; + +export default ReadyToUpgradeWallets; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.scss new file mode 100644 index 000000000000..a2a96aa021e9 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.scss @@ -0,0 +1,48 @@ +.wallet-steps { + &__text { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.8rem; + } + + &__image { + position: relative; + left: 1.5rem; + } + + &__info-section { + padding: 1.6rem; + margin-top: 2.4rem; + background-color: var(--transparent-info); + border-radius: 0.8rem; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: 0.8rem; + + @include mobile { + margin-top: 1.6rem; + } + + &-text { + display: grid; + grid-template-columns: 1.6rem 1fr; + grid-column-gap: 0.8rem; + align-items: center; + } + } + + &__checkbox { + margin-top: 2.4rem; + display: flex; + justify-content: center; + .dc-checkbox__label { + @include mobile { + font-size: var(--text-size-xxs); + } + } + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.tsx new file mode 100644 index 000000000000..197ee30202bd --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/ready-to-upgrade-wallets.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { Checkbox, Text, Icon } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import { observer, useStore } from '@deriv/stores'; +import WalletsImage from 'Assets/svgs/wallets'; +import getUpgradeInformationList from 'Constants/upgrade-info-lists-config'; +import './ready-to-upgrade-wallets.scss'; +import { useContentFlag } from '@deriv/hooks'; + +type TReadyToUpgradeWallets = { + value: boolean; + toggleCheckbox: () => void; +}; + +const ReadyToUpgradeWallets = observer(({ value, toggleCheckbox }: TReadyToUpgradeWallets) => { + const { ui } = useStore(); + const { is_mobile } = ui; + const text_body_size = is_mobile ? 'xs' : 's'; + const text_info_size = is_mobile ? 'xxs' : 'xs'; + const form_line_height = is_mobile ? 'm' : 'l'; + + const { is_eu_demo, is_eu_real, is_low_risk_cr_eu } = useContentFlag(); + const is_eu = is_eu_demo || is_eu_real || is_low_risk_cr_eu; + + return ( +
+ +
+ + + + + } + /> + +
+
+ {getUpgradeInformationList({ is_eu, text_info_size, form_line_height }) + .filter(info => info.visibility) + .map(({ name, content }) => ( +
+ + + {content} + +
+ ))} +
+ +
+ ); +}); + +export default ReadyToUpgradeWallets; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/test/ready-to-upgrade-wallets.spec.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/test/ready-to-upgrade-wallets.spec.tsx new file mode 100644 index 000000000000..40542909bddf --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/ready-to-upgrade-wallets/test/ready-to-upgrade-wallets.spec.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import ReadyToUpgradeWallets from '../ready-to-upgrade-wallets'; +import { StoreProvider, mockStore } from '@deriv/stores'; + +describe('ReadyToUpgradeWallets', () => { + const containerReadyToUpgradeWallets = (mock: ReturnType) => { + const toggleCheckbox = jest.fn(); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + + return render(, { + wrapper, + }); + }; + + it('should render ReadyToUpgradeWallets component', () => { + const mock = mockStore({}); + const { container } = containerReadyToUpgradeWallets(mock); + + expect(container).toBeInTheDocument(); + }); + + it('should render checkbox', () => { + const mock = mockStore({}); + containerReadyToUpgradeWallets(mock); + + expect(screen.getByRole('checkbox')).toBeInTheDocument(); + }); + + it('should render proper info sections for non-eu user', () => { + const mock = mockStore({}); + containerReadyToUpgradeWallets(mock); + + expect( + screen.getByText( + 'During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.' + ) + ).toBeInTheDocument(); + expect( + screen.getByText("Your open positions won't be affected and you can continue trading.") + ).toBeInTheDocument(); + expect(screen.getByText(/you can use/i)).toBeInTheDocument(); + expect(screen.getByText(/payment agents'/i)).toBeInTheDocument(); + expect( + screen.getByText(/services to deposit by adding a Payment Agent Wallet after the upgrade./i) + ).toBeInTheDocument(); + expect(screen.getByText(/Deriv P2P/)).toBeInTheDocument(); + expect(screen.getByText(/is unavailable in Wallets at this time/i)).toBeInTheDocument(); + }); + + describe('should render proper info sections for eu user with different content flags', () => { + const validateAssertion = () => { + expect( + screen.getByText( + 'During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.' + ) + ).toBeInTheDocument(); + expect( + screen.getByText("Your open positions won't be affected and you can continue trading.") + ).toBeInTheDocument(); + expect(screen.queryByText(/you can use/i)).not.toBeInTheDocument(); + expect(screen.queryByText(/payment agents'/i)).not.toBeInTheDocument(); + expect( + screen.queryByText(/services to deposit by adding a Payment Agent Wallet after the upgrade./i) + ).not.toBeInTheDocument(); + expect(screen.queryByText(/Deriv P2P/)).not.toBeInTheDocument(); + expect(screen.queryByText(/is unavailable in Wallets at this time/i)).not.toBeInTheDocument(); + }; + + it('should render proper info sections for eu user with eu_demo content flag', () => { + const mock = mockStore({ traders_hub: { content_flag: 'eu_demo' } }); + containerReadyToUpgradeWallets(mock); + + validateAssertion(); + }); + + it('should render proper info sections for eu user with eu_real content flag', () => { + const mock = mockStore({ traders_hub: { content_flag: 'eu_real' } }); + containerReadyToUpgradeWallets(mock); + + validateAssertion(); + }); + + it('should render proper info sections for eu user with low_risk_cr_eu content flag', () => { + const mock = mockStore({ traders_hub: { content_flag: 'low_risk_cr_eu' } }); + containerReadyToUpgradeWallets(mock); + + validateAssertion(); + }); + }); +}); diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.scss new file mode 100644 index 000000000000..079da1291c28 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.scss @@ -0,0 +1,25 @@ +.wallet-account { + width: 28.8rem; + height: 4.8rem; + display: flex; + align-items: center; + justify-content: flex-start; + border: 1px solid $color-grey-2; + border-radius: 0.8rem; + + @include mobile { + width: 24.4rem; + } + + &__details { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + margin-left: 1.6rem; + } + + &__icon { + margin-left: 1.6rem; + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.tsx new file mode 100644 index 000000000000..e092d2cf7b7f --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-account/wallet-account.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Icon, Text } from '@deriv/components'; +import './wallet-account.scss'; + +type TWalletAccount = { + balance: number; + currency: string; + name: string; + icon: string; +}; + +const WalletAccount = ({ balance, name, currency, icon }: TWalletAccount) => ( +
+ +
+ + {name} + + + {balance} {currency} + +
+
+); + +export default WalletAccount; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.scss new file mode 100644 index 000000000000..846a4867ed8c --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.scss @@ -0,0 +1,148 @@ +.wallet-link-wrapper { + display: grid; + grid-template-columns: repeat(3, auto); + align-items: center; + justify-content: flex-start; + gap: 1.6rem; + + &__title { + display: flex; + align-items: center; + justify-content: center; + width: 28.8rem; + + &-text { + width: fit-content; + padding: 0.4rem 0.8rem; + border-radius: $BORDER_RADIUS * 6; + text-align: center; + background-color: var(--general-section-2); + + @include mobile { + background-color: var(--general-section-1); + } + } + } + + @include mobile { + width: 100%; + display: flex; + flex-direction: column; + gap: 1.2rem; + } + + &__accounts { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1.6rem; + + @include mobile { + gap: 0.8rem; + + &-title { + width: 100%; + display: block; + border-radius: $BORDER_RADIUS_2 $BORDER_RADIUS_2 0 0; + } + } + } + + &__link { + height: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + @include mobile { + width: 100%; + flex-direction: column; + } + + &-bracket { + width: 1.5rem; + height: calc(100% - 4.8rem); + border: 1px solid var(--brand-red-coral); + border-left: none; + + &--single { + height: 0; + border: none; + border-top: 1px solid var(--brand-red-coral); + } + + @include mobile { + width: 24.4rem; + height: 0.8rem; + border-top: none; + } + } + + &-icon { + display: flex; + flex-direction: row; + align-items: center; + gap: 1.4rem; + + @include mobile { + flex-direction: column; + gap: 0.6rem; + } + + &:before, + &:after { + content: ''; + display: inline-block; + background: var(--brand-red-coral); + } + + &:before { + width: 4.8rem; + height: 0.1rem; + + @include mobile { + width: 0.1rem; + height: 1.6rem; + } + } + + &:after { + width: 6.3rem; + height: 0.1rem; + + @include mobile { + width: 0.1rem; + height: 2.4rem; + } + } + } + } + + &__card-wrapper { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + &:after { + display: inline-block; + content: ''; + } + + &-title { + display: block; + position: absolute; + bottom: 0; + width: 100%; + border-radius: 0 0 $BORDER_RADIUS_2 $BORDER_RADIUS_2; + } + + @include mobile { + display: block; + height: 14rem; + } + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.tsx new file mode 100644 index 000000000000..6602310076b8 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-link/wallet-link-wrapper.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Icon, Text, WalletCard } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import WalletAccount from '../wallet-account/wallet-account'; +import { observer, useStore } from '@deriv/stores'; +import './wallet-link-wrapper.scss'; + +export type TWalletLinkWrapper = { + wallet_details: React.ComponentProps['wallet']; + account_list: { + balance: number; + currency: string; + account_name: string; + icon: string; + }[]; +}; + +const WalletLinkWrapper = observer(({ wallet_details, account_list }: TWalletLinkWrapper) => { + const { ui } = useStore(); + const { is_mobile } = ui; + return ( +
+
+ {is_mobile && ( + + + + )} + {account_list.map(account => { + return ( + + ); + })} +
+
+
+
+ +
+
+
+ + {is_mobile && ( + + + + )} +
+
+ ); +}); + +export default WalletLinkWrapper; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.scss new file mode 100644 index 000000000000..1f7a86dd5cd1 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.scss @@ -0,0 +1,60 @@ +.wallet-linking-step { + width: 100%; + height: calc(57.4rem); // 73.4rem (modal-height) - 16rem (~15.2rem height of header + footer + margin from top) + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + + @include mobile { + height: 100%; + margin: 4rem 0 7.4rem; + } + + &__description { + margin-top: 0.8rem; + } + + &__content { + display: flex; + flex-direction: column; + margin-top: 2rem; + padding: 0.4rem 1.6rem; + gap: 2.2rem; + + @include mobile { + gap: 3.2rem; + padding: 0.4rem 3.8rem; + } + } + + &__title-small { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 36.1rem; + margin-top: 5.6rem; + + &-text { + padding: 0.4rem 0.8rem; + border-radius: $BORDER_RADIUS * 6; + } + } + + &__note { + margin-top: 2.4rem; + padding: 0.8rem 1.6rem; + border-radius: $BORDER_RADIUS; + } + + &__title-text { + width: fit-content; + background-color: var(--general-section-2); + + @include mobile { + background-color: var(--general-section-1); + } + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.tsx new file mode 100644 index 000000000000..33fb901133a9 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallet-linking-step/wallet-linking-step.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { Text, ThemedScrollbars } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { observer, useStore } from '@deriv/stores'; +import WalletLinkWrapper, { TWalletLinkWrapper } from '../wallet-link/wallet-link-wrapper'; +import './wallet-linking-step.scss'; + +type TWalletLinkingStep = { + data: { title: string; wallets: TWalletLinkWrapper[] }; +}; + +const WalletLinkingStep = observer(({ data }: TWalletLinkingStep) => { + const { ui } = useStore(); + const { is_mobile } = ui; + return ( +
+ + {data.title} + + + + + + + + {!is_mobile && ( +
+ + + + + + +
+ )} + + {data.wallets.map(({ wallet_details, account_list }) => { + return ( + + ); + })} + +
+ ); +}); + +export default WalletLinkingStep; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/__tests__/wallets-intro.spec.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/__tests__/wallets-intro.spec.tsx new file mode 100644 index 000000000000..98b2c65a8a62 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/__tests__/wallets-intro.spec.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import WalletsImage from 'Assets/svgs/wallets'; +import { WalletsIntroComponent } from '../wallets-intro'; +import { render, screen } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; + +let mock = mockStore({}); + +const mocked_props = { + image: , + title: 'Upgrade To Wallets', + description: 'A better way to manage your funds', + bullets: ['Bullet 1', 'Bullet 2', 'Bullet 3'], +}; + +const checkContainerWalletsIntroComponent = () => { + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + const { container } = render(, { + wrapper, + }); + expect(container).toBeInTheDocument(); +}; + +describe('WalletsIntroComponent', () => { + beforeEach(() => { + mock = mockStore({}); + }); + it('should render Wallet Intro Component', () => { + checkContainerWalletsIntroComponent(); + }); + + it('should render icon', () => { + checkContainerWalletsIntroComponent(); + expect(screen.queryByTestId('dt_how_it_works')).toBeInTheDocument(); + }); + + it('should render title, description and bullets', () => { + checkContainerWalletsIntroComponent(); + expect(screen.getByText(mocked_props.title)).toBeInTheDocument(); + expect(screen.getByText(mocked_props.description)).toBeInTheDocument(); + mocked_props.bullets.forEach(bullet => { + expect(screen.getByText(bullet)).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/index.ts b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/index.ts new file mode 100644 index 000000000000..4cfcc528ec65 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/index.ts @@ -0,0 +1,3 @@ +import { WalletsIntro, WalletsIntroComponent } from './wallets-intro'; + +export { WalletsIntro, WalletsIntroComponent }; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.scss new file mode 100644 index 000000000000..3f94b7c93e78 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.scss @@ -0,0 +1,54 @@ +.wallet-steps { + &__title { + padding-top: 2rem; + + @include mobile { + font-size: var(--text-size-m); + } + } + + &__description { + padding: 0.5rem 0 1.5rem; + + @include mobile { + font-size: var(--text-size-sm); + } + } + + &__bullet { + display: flex; + align-items: center; + padding-bottom: 1rem; + text-align: center; + justify-content: center; + + @include mobile { + justify-content: left; + } + + &-points { + display: grid; + grid-template-columns: 1.6rem 1fr; + align-items: center; + gap: 0.8rem; + + @include mobile { + align-items: baseline; + } + } + + @include mobile { + justify-content: left; + } + + &-text { + @include mobile { + text-align: left; + } + } + + &-icon { + margin-right: 1rem; + } + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.tsx new file mode 100644 index 000000000000..9742af03357a --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/components/wallets-intro/wallets-intro.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import { Text, Icon } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; +import getWalletsIntroContent from 'Constants/wallets-intro-content-config'; +import { useContentFlag } from '@deriv/hooks'; +import './wallets-intro.scss'; + +type TWalletsIntro = { + title: string; + description: string; + bullets: string[]; + eu_user?: boolean; + image?: React.ReactNode; +}; + +type TWalletsIntroComponent = { + current_step: number; +}; + +const WalletsIntroComponent = observer(({ image, title, description, bullets }: TWalletsIntro) => { + const { ui } = useStore(); + const { is_mobile } = ui; + + const text_title_size = is_mobile ? 'xsm' : 'l'; + const text_body_size = is_mobile ? 's' : 'm'; + const text_info_size = is_mobile ? 'xs' : 's'; + const form_line_height = is_mobile ? 'm' : 'l'; + + return ( + + {image} + + {title} + + + {description} + + {bullets.map(bullet => ( +
+ {bullet && ( +
+ + + {bullet} + +
+ )} +
+ ))} +
+ ); +}); + +const WalletsIntro = ({ current_step }: TWalletsIntroComponent) => { + const { is_eu_demo, is_eu_real, is_low_risk_cr_eu } = useContentFlag(); + const is_eu = is_eu_demo || is_eu_real || is_low_risk_cr_eu; + const step = getWalletsIntroContent(is_eu)?.[current_step] || []; + + return ( +
+ +
+ ); +}; + +export { WalletsIntro, WalletsIntroComponent }; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/index.ts b/packages/appstore/src/components/modals/real-wallets-upgrade/index.ts new file mode 100644 index 000000000000..dc268ba30609 --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/index.ts @@ -0,0 +1,3 @@ +import RealWalletsUpgrade from './real-wallets-upgrade'; + +export default RealWalletsUpgrade; diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.scss b/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.scss new file mode 100644 index 000000000000..2fc3b82c960b --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.scss @@ -0,0 +1,34 @@ +.wallet-steps { + width: 100%; + height: 100%; + display: flex; + + @include mobile { + align-items: center; + } + + &__content { + max-width: 77.6rem; + margin: 5rem auto 0; + text-align: center; + + @include mobile { + margin: 2rem auto 8rem; + } + } + + &__footer { + width: 100%; + position: sticky; + bottom: 0; + background-color: inherit; + + @include mobile { + justify-content: center; + background: var(--fill-normal); + &-button { + width: 50%; + } + } + } +} diff --git a/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.tsx b/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.tsx new file mode 100644 index 000000000000..32f6d224104a --- /dev/null +++ b/packages/appstore/src/components/modals/real-wallets-upgrade/real-wallets-upgrade.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { useWalletMigration } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import { DesktopRealWalletsUpgrade, MobileRealWalletsUpgrade } from './components/modal-elements'; +import './real-wallets-upgrade.scss'; + +const RealWalletsUpgrade = observer(() => { + const { traders_hub, ui } = useStore(); + const { is_real_wallets_upgrade_on, toggleWalletsUpgrade } = traders_hub; + const { is_mobile } = ui; + + const [current_step, setCurrentStep] = React.useState(0); + const [is_disabled, setIsDisabled] = React.useState(false); + + React.useEffect(() => { + if (!is_real_wallets_upgrade_on) { + setCurrentStep(0); + setIsDisabled(false); + } + }, [is_real_wallets_upgrade_on]); + + const handleNext = () => setCurrentStep(prev_step => prev_step + 1); + + const handleBack = () => setCurrentStep(prev_step => prev_step - 1); + + const handleClose = () => toggleWalletsUpgrade(false); + + const { start_migration } = useWalletMigration(); + + const upgradeToWallets = () => { + start_migration(); + toggleWalletsUpgrade(false); + }; + + const toggleCheckbox = () => { + setIsDisabled(prevDisabled => !prevDisabled); + }; + + const wallet_upgrade_steps = { + current_step, + handleBack, + handleClose, + handleNext, + is_disabled, + toggleCheckbox, + upgradeToWallets, + }; + + return ( + + {is_mobile ? ( + + ) : ( + + )} + + ); +}); + +export default RealWalletsUpgrade; diff --git a/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-body.spec.tsx b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-body.spec.tsx new file mode 100644 index 000000000000..490a3e1efb79 --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-body.spec.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { render, screen, fireEvent } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { BrowserRouter } from 'react-router-dom'; +import WalletModalBody from '../wallet-modal-body'; +import { mockStore, StoreProvider } from '@deriv/stores'; + +jest.mock('Components/wallet-transfer', () => jest.fn(() =>
WalletTransfer
)); +jest.mock('Components/transaction-list', () => jest.fn(() =>
Transactions
)); +jest.mock('Components/wallet-deposit', () => jest.fn(() =>
Deposit
)); + +describe('WalletModalBody', () => { + let mocked_props: React.ComponentProps; + + beforeEach(() => { + mocked_props = { + contentScrollHandler: jest.fn(), + is_dark: false, + is_mobile: false, + is_wallet_name_visible: true, + setIsWalletNameVisible: jest.fn(), + wallet: { + balance: 1000, + currency: 'USD', + currency_config: { + display_code: 'USD', + is_crypto: false, + } as typeof mocked_props['wallet']['currency_config'], + gradient_card_class: 'wallet-card__usd', + gradient_header_class: 'wallet-header__usd', + icon: '', + is_demo: true, + is_disabled: 0, + is_malta_wallet: false, + is_selected: true, + is_virtual: 1, + landing_company_name: 'svg', + wallet_currency_type: 'Demo', + }, + }; + }); + + const renderWithRouter = (component: JSX.Element) => { + render({component}); + }; + + it('Should render proper tabs for demo wallet', () => { + const mocked_store = mockStore({ + traders_hub: { + active_modal_tab: 'Transfer', + }, + }); + renderWithRouter( + + + + ); + + expect(screen.getByText('Transfer')).toBeInTheDocument(); + expect(screen.getByText('Transactions')).toBeInTheDocument(); + expect(screen.getByText('Reset balance')).toBeInTheDocument(); + }); + + it('Should render proper content under the Transfer tab', () => { + const mocked_store = mockStore({ + traders_hub: { + active_modal_tab: 'Transfer', + }, + }); + renderWithRouter( + + + + ); + + const el_transfer_tab = screen.getByText('Transfer'); + userEvent.click(el_transfer_tab); + + expect(screen.getByText('WalletTransfer')).toBeInTheDocument(); + }); + + it('Should trigger setWalletModalActiveTab callback when the user clicked on the tab', () => { + mocked_props.wallet.is_demo = false; + const mocked_store = mockStore({ + traders_hub: { + active_modal_tab: 'Deposit', + }, + }); + renderWithRouter( + + + + ); + + const el_transactions_tab = screen.getByText('Transactions'); + userEvent.click(el_transactions_tab); + + expect(mocked_store.traders_hub.setWalletModalActiveTab).toHaveBeenCalledTimes(1); + }); + + it('Should trigger contentScrollHandler callback when the user scrolls the content', () => { + mocked_props.wallet.is_demo = false; + const mocked_store = mockStore({ + traders_hub: { + active_modal_tab: 'Deposit', + }, + }); + renderWithRouter( + + + + ); + + const el_themed_scrollbars = screen.getByTestId('dt_themed_scrollbars'); + fireEvent.scroll(el_themed_scrollbars); + + expect(mocked_props.contentScrollHandler).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-header.spec.tsx b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-header.spec.tsx new file mode 100644 index 000000000000..c6911fe75bce --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal-header.spec.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import WalletModalHeader from '../wallet-modal-header'; + +jest.mock('@deriv/hooks', () => ({ + useCurrencyConfig: () => ({ getConfig: () => ({ display_code: 'USD' }) }), +})); + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(() => ({ + data: { + website_status: { + currencies_config: { + USD: { + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'US Dollar', + stake_default: 10, + type: 'fiat', + }, + }, + }, + }, + })), +})); + +describe('WalletModalHeader', () => { + let mocked_props: React.ComponentProps; + + beforeEach(() => { + mocked_props = { + closeModal: jest.fn(), + is_dark: false, + is_mobile: false, + is_wallet_name_visible: true, + wallet: { + balance: 1000, + currency: 'USD', + currency_config: { + display_code: 'USD', + is_crypto: false, + } as typeof mocked_props['wallet']['currency_config'], + gradient_card_class: 'wallet-card__usd', + gradient_header_class: 'wallet-header__usd', + icon: 'IcWalletIcon', + is_demo: true, + is_disabled: 0, + is_malta_wallet: false, + is_selected: true, + is_virtual: 1, + landing_company_name: 'svg', + wallet_currency_type: 'USD', + }, + }; + }); + + it('Should render header with proper title, balance, badge and icons', () => { + render(); + + expect(screen.getByText('USD Wallet')).toBeInTheDocument(); + expect(screen.getByText('Demo')).toBeInTheDocument(); + expect(screen.getByText('1,000.00 USD')).toBeInTheDocument(); + expect(screen.getByTestId('dt_wallet_icon')).toBeInTheDocument(); + expect(screen.getByTestId('dt_close_icon')).toBeInTheDocument(); + }); + + it('Should trigger onClose callback when the user clicked on the cross close button', () => { + render(); + + const el_close_btn = screen.getByTestId('dt_close_icon'); + userEvent.click(el_close_btn); + + expect(mocked_props.closeModal).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal.spec.tsx b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal.spec.tsx new file mode 100644 index 000000000000..741468feae89 --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/__tests__/wallet-modal.spec.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import WalletModal from '../wallet-modal'; +import { useActiveWallet } from '@deriv/hooks'; +import { APIProvider } from '@deriv/api'; + +jest.mock('../wallet-modal-header', () => jest.fn(() =>
WalletModalHeader
)); +jest.mock('../wallet-modal-body', () => jest.fn(() =>
WalletModalBody
)); + +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useActiveWallet: jest.fn(), +})); + +const mockUseActiveWallet = useActiveWallet as jest.MockedFunction; + +describe('WalletModal', () => { + let modal_root_el: HTMLDivElement; + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + it('Should render cashier modal if is_wallet_modal_visible is true', () => { + const mocked_store = mockStore({ + ui: { is_wallet_modal_visible: true }, + client: { is_authorize: true }, + traders_hub: { active_modal_wallet_id: 'CRW000000' }, + }); + + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseActiveWallet.mockReturnValue({ loginid: 'CRW000000', is_demo: false }); + + render( + + + + + + ); + + expect(screen.getByText('WalletModalHeader')).toBeInTheDocument(); + expect(screen.getByText('WalletModalBody')).toBeInTheDocument(); + }); + + it('Should not render cashier modal and show loader if authorize is false', () => { + const mocked_store = mockStore({ + ui: { is_wallet_modal_visible: true }, + client: { is_authorize: false }, + traders_hub: { active_modal_wallet_id: 'CRW000000' }, + }); + + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseActiveWallet.mockReturnValue({ loginid: 'CRW100000', is_demo: false }); + + render( + + + + ); + + expect(screen.getByTestId('dt_initial_loader')).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/modals/wallet-modal/index.ts b/packages/appstore/src/components/modals/wallet-modal/index.ts new file mode 100644 index 000000000000..b3326d3837de --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/index.ts @@ -0,0 +1,4 @@ +import WalletModal from './wallet-modal'; +import './wallet-modal.scss'; + +export default WalletModal; diff --git a/packages/appstore/src/components/modals/wallet-modal/provider.tsx b/packages/appstore/src/components/modals/wallet-modal/provider.tsx new file mode 100644 index 000000000000..ed32b044f676 --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/provider.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { localize } from '@deriv/translations'; +import DemoResetBalance from 'Components/demo-reset-balance'; +import TransactionList from 'Components/transaction-list'; +import WalletDeposit from 'Components/wallet-deposit'; +import WalletTransfer from 'Components/wallet-transfer'; +import WalletWithdrawal from '../../wallet-withdrawal'; + +export type TWalletType = 'real' | 'demo' | 'p2p' | 'payment_agent'; + +export const getCashierOptions = (type: TWalletType) => { + switch (type) { + case 'real': + return [ + { + icon: 'IcAdd', + label: localize('Deposit'), + content: () => , + }, + { icon: 'IcMinus', label: localize('Withdraw'), content: () => }, + { + icon: 'IcAccountTransfer', + label: localize('Transfer'), + content: (props: React.ComponentProps) => , + }, + { + icon: 'IcStatement', + label: localize('Transactions'), + content: () => , + }, + ]; + case 'demo': + return [ + { + icon: 'IcAccountTransfer', + label: localize('Transfer'), + content: (props: React.ComponentProps) => , + }, + { + icon: 'IcStatement', + label: localize('Transactions'), + content: () => , + }, + { + icon: 'IcAdd', + label: localize('Reset balance'), + content: (props: React.ComponentProps) => , + }, + ]; + case 'p2p': + return [ + { + icon: 'IcAdd', + label: localize('Buy/Sell'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcStatement', + label: localize('Orders'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcStatement', + label: localize('My ads'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcStatement', + label: localize('My profile'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcAccountTransfer', + label: localize('Transfer'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcStatement', + label: localize('Transactions'), + content: () =>

Transfer Real

, + }, + ]; + case 'payment_agent': + return [ + { icon: 'IcAdd', label: localize('Deposit'), content: () =>

Transfer Real

}, + { icon: 'IcMinus', label: localize('Withdraw'), content: () =>

Transfer Real

}, + { + icon: 'IcAccountTransfer', + label: localize('Transfer'), + content: () =>

Transfer Real

, + }, + { + icon: 'IcStatement', + label: localize('Transactions'), + content: () =>

Transfer Real

, + }, + ]; + default: + return []; + } +}; diff --git a/packages/appstore/src/components/modals/wallet-modal/wallet-modal-body.tsx b/packages/appstore/src/components/modals/wallet-modal/wallet-modal-body.tsx new file mode 100644 index 000000000000..828324573ce5 --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/wallet-modal-body.tsx @@ -0,0 +1,103 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Tabs, ThemedScrollbars, Div100vhContainer } from '@deriv/components'; +import { getCashierOptions } from './provider'; +import { observer, useStore } from '@deriv/stores'; +import type { TWalletAccount } from 'Types'; + +type TWalletModalBodyProps = { + contentScrollHandler: React.UIEventHandler; + is_dark: boolean; + is_mobile: boolean; + setIsWalletNameVisible: (value: boolean) => void; + is_wallet_name_visible: boolean; + wallet: TWalletAccount; +}; + +const real_tabs = { + Deposit: 0, + Withdraw: 1, + Transfer: 2, + Transactions: 3, +} as const; + +const demo_tabs = { + Deposit: 2, + Transfer: 0, + Transactions: 1, + Withdraw: undefined, +} as const; + +const WalletModalBody = observer( + ({ + contentScrollHandler, + is_dark, + is_mobile, + setIsWalletNameVisible, + is_wallet_name_visible, + wallet, + }: TWalletModalBodyProps) => { + const store = useStore(); + + const { is_demo } = wallet; + + const { + traders_hub: { active_modal_tab, setWalletModalActiveTab }, + } = store; + + const getHeightOffset = React.useCallback(() => { + const desktop_header_height = '24.4rem'; + const mobile_header_height = '8.2rem'; + + return is_mobile ? mobile_header_height : desktop_header_height; + }, [is_mobile]); + + const tabs = is_demo ? demo_tabs : real_tabs; + + return ( + { + const tab_name = Object.keys(tabs).find( + key => tabs[key as keyof typeof tabs] === index + ) as typeof active_modal_tab; + setWalletModalActiveTab(tab_name); + }} + > + {getCashierOptions(is_demo ? 'demo' : 'real').map(option => { + return ( +
+ + +
+ {option.content({ + is_wallet_name_visible, + contentScrollHandler, + setIsWalletNameVisible, + })} +
+
+
+
+ ); + })} +
+ ); + } +); + +export default WalletModalBody; diff --git a/packages/appstore/src/components/modals/wallet-modal/wallet-modal-header.tsx b/packages/appstore/src/components/modals/wallet-modal/wallet-modal-header.tsx new file mode 100644 index 000000000000..ed4613c80cfc --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/wallet-modal-header.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Icon, Text, WalletIcon } from '@deriv/components'; +import { formatMoney } from '@deriv/shared'; +import { getAccountName } from 'Constants/utils'; +import { WalletJurisdictionBadge } from 'Components/wallet-jurisdiction-badge'; +import type { TWalletAccount } from 'Types'; + +type TWalletModalHeaderProps = { + closeModal: VoidFunction; + is_dark: boolean; + is_mobile: boolean; + is_wallet_name_visible: boolean; + wallet: TWalletAccount; +}; + +const WalletModalHeader = ({ + closeModal, + is_dark, + is_mobile, + is_wallet_name_visible, + wallet, +}: TWalletModalHeaderProps) => { + const { balance, currency, icon, currency_config, is_demo, gradient_header_class, landing_company_name } = wallet; + const is_crypto = currency_config?.is_crypto; + const display_currency_code = currency_config?.display_code; + + const header_class_name = 'wallet-modal--header'; + + const getCloseIcon = React.useCallback(() => { + if (is_demo && is_dark) return 'IcAppstoreCloseLight'; + if (is_demo && !is_dark) return 'IcAppstoreCloseDark'; + if (is_dark) return 'IcAppstoreCloseDark'; + return 'IcAppstoreCloseLight'; + }, [is_dark, is_demo]); + + const getWalletIcon = React.useCallback(() => { + if (currency && ['USDT', 'eUSDT', 'tUSDT', 'UST'].includes(currency)) { + return is_dark ? 'IcWalletModalTetherDark' : 'IcWalletModalTetherLight'; + } + return icon; + }, [currency, icon, is_dark]); + + const getStylesByClassName = (class_name: string) => { + return classNames(class_name, { + [`${class_name}-demo`]: is_demo, + }); + }; + + const getWalletIconType = (): React.ComponentProps['type'] => { + if (is_demo) return 'demo'; + return is_crypto ? 'crypto' : 'fiat'; + }; + + const getWalletIconSize = (): React.ComponentProps['size'] => { + if (is_mobile) return is_demo || is_crypto ? 'large' : 'xlarge'; + return 'xxlarge'; + }; + + return ( +
+
+
+
+ + {getAccountName({ + display_currency_code: wallet.currency_config?.display_code, + account_type: 'wallet', + })} + + +
+ + {formatMoney(currency || '', balance, true)} {display_currency_code} + +
+
+ +
+
+ +
+
+
+ ); +}; + +export default WalletModalHeader; diff --git a/packages/appstore/src/components/modals/wallet-modal/wallet-modal.scss b/packages/appstore/src/components/modals/wallet-modal/wallet-modal.scss new file mode 100644 index 000000000000..043ee42f64c0 --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/wallet-modal.scss @@ -0,0 +1,218 @@ +.dc-modal__container_wallet-modal { + display: flex; + align-items: center; + position: fixed; + inset: 0; + min-height: calc(100vh - 84px) !important; + min-width: 100vw !important; + margin: 4.8rem 0 3.6rem; + border-radius: unset; + background-color: var(--general-main-1); + z-index: 9997; + box-shadow: none; + + @include mobile { + margin: 0; + } + + // styles for mobile and desktop modal body (tabs with content) + .dc-tabs { + &--wallet-modal { + width: 100%; + margin-top: -4.8rem; + z-index: 9999; + + @include mobile { + top: 8.2rem; + margin-top: 0; + transition: top 0.2s ease; + + &.is_scrolled { + top: 4.2rem; + } + } + + &-themed-scrollbar { + width: 100%; + } + + &-content-wrapper { + max-width: 128rem; + margin: 0 auto; + padding: 2.4rem 4rem; + + @include mobile { + padding: 1.6rem; + } + } + } + &__list { + padding: 0 4rem; + + @include mobile { + padding: 0 1.6rem; + } + + &--wallet-modal { + max-width: 128rem; + width: 100%; + margin: 0 auto; + + @include mobile { + width: 100%; + z-index: 3; + overflow-x: scroll; + + /* IE and Edge */ + -ms-overflow-style: none; + /* Firefox */ + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + + &::-webkit-scrollbar-thumb { + display: none; + } + + &.is_scrolled { + top: 4.4rem; + } + } + } + } + + &__item { + display: flex; + align-items: center; + justify-content: center; + padding: 0 3.2rem; + height: 4.8rem; + + @include mobile { + padding: 0 1.6rem; + height: 4rem; + font-size: var(--text-size-xxs); + } + + &__icon { + padding: 0; + margin-right: 0.8rem; + } + } + + &__active { + background-color: var(--general-main-1); + border-radius: 1.6rem 1.6rem 0 0; + } + + &__content { + width: 100%; + font-size: var(--text-size-l); + color: var(--text-prominent); + display: flex; + align-items: center; + justify-content: center; + + @include mobile { + font-size: var(--text-size-xs); + } + } + } +} + +.wallet-modal--header { + max-width: 128rem; + width: 100%; + display: flex; + position: relative; + height: 16rem; + padding: 2.4rem 4rem 7.2rem; + + @include mobile { + height: 12.2rem; + padding: 1.6rem 1.6rem 5.6rem; + transition: height 0.2s ease; + + .title-visibility { + height: 2rem; + } + + .title-visibility, + .icon-visibility { + visibility: visible; + transition: visibility 0s, height 0.2s ease; + } + } + + //TODO: check do we need this after bg change to radial-gradient + &__title-wrapper { + position: relative; + } + + &__title { + display: flex; + align-items: center; + + &-wallet { + padding-right: 0.8rem; + color: var(--text-general); + + &-demo { + color: var(--demo-text-color-1); + } + } + + &-balance { + color: var(--text-prominent); + + &-demo { + color: var(--demo-text-color-2); + } + } + } + + &--hidden-title { + height: 8.2rem; + align-items: center; + justify-content: space-between; + + .title-visibility, + .icon-visibility { + visibility: hidden; + height: 0; + } + } + + &__currency-icon { + z-index: 3; + margin-left: auto; + margin-right: 1.6rem; + + @include mobile { + margin-right: 0.8rem; + } + } + + &__close-icon { + position: relative; + + .dc-icon { + cursor: pointer; + } + } + + &-background { + width: 100%; + display: flex; + justify-content: center; + position: relative; + overflow: hidden; + + @include mobile { + position: fixed; + z-index: 3; + } + } +} diff --git a/packages/appstore/src/components/modals/wallet-modal/wallet-modal.tsx b/packages/appstore/src/components/modals/wallet-modal/wallet-modal.tsx new file mode 100644 index 000000000000..0bcadb75798c --- /dev/null +++ b/packages/appstore/src/components/modals/wallet-modal/wallet-modal.tsx @@ -0,0 +1,80 @@ +import React, { useEffect } from 'react'; +import { Loading, Modal } from '@deriv/components'; +import { useActiveWallet } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import WalletModalHeader from './wallet-modal-header'; +import WalletModalBody from './wallet-modal-body'; + +const WalletModal = observer(() => { + const store = useStore(); + + const { + client: { is_authorize, switchAccount }, + ui: { is_dark_mode_on, is_wallet_modal_visible, is_mobile, setIsWalletModalVisible }, + traders_hub: { active_modal_tab, active_modal_wallet_id, setWalletModalActiveTab }, + } = store; + + const active_wallet = useActiveWallet(); + + useEffect(() => { + let timeout_id: NodeJS.Timeout; + + if (is_wallet_modal_visible && active_wallet?.loginid !== active_modal_wallet_id) { + /** Adding a delay as per requirement because the modal must appear first, then switch the account */ + timeout_id = setTimeout(() => switchAccount(active_modal_wallet_id), 500); + } + + return () => clearTimeout(timeout_id); + }, [active_modal_wallet_id, active_wallet?.loginid, is_wallet_modal_visible, switchAccount]); + + const [is_wallet_name_visible, setIsWalletNameVisible] = React.useState(true); + + React.useEffect(() => { + return setIsWalletNameVisible(true); + }, [active_modal_tab, is_wallet_modal_visible]); + + const closeModal = () => { + setIsWalletModalVisible(false); + setWalletModalActiveTab(active_modal_tab); + }; + + const contentScrollHandler = React.useCallback( + (e: React.UIEvent) => { + if (is_mobile && is_wallet_modal_visible) { + const target = e.target as HTMLDivElement; + setIsWalletNameVisible(target.scrollTop <= 0); + } + }, + [is_mobile, is_wallet_modal_visible] + ); + + const is_loading = active_wallet?.loginid !== active_modal_wallet_id || !is_authorize || !active_wallet; + + return ( + + {is_loading ? ( + + ) : ( + + + + + )} + + ); +}); + +export default WalletModal; diff --git a/packages/appstore/src/components/modals/wallets-migration-failed/__tests__/wallets-migration-failed.spec.tsx b/packages/appstore/src/components/modals/wallets-migration-failed/__tests__/wallets-migration-failed.spec.tsx new file mode 100644 index 000000000000..764d74276ff2 --- /dev/null +++ b/packages/appstore/src/components/modals/wallets-migration-failed/__tests__/wallets-migration-failed.spec.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import WalletsMigrationFailed from '../wallets-migration-failed'; + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), +})); + +describe('', () => { + it('Should render the Modal', () => { + const mockRootStore = mockStore({ + traders_hub: { + is_wallet_migration_failed: true, + }, + }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + + const { container } = render(, { wrapper }); + + expect(container).toBeInTheDocument(); + }); + + it('Should not render the Modal if is_wallet_migration_failed is false', () => { + const mockRootStore = mockStore({}); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + + const { container } = render(, { wrapper }); + + expect(container).toBeEmptyDOMElement(); + }); +}); diff --git a/packages/appstore/src/components/modals/wallets-migration-failed/index.ts b/packages/appstore/src/components/modals/wallets-migration-failed/index.ts new file mode 100644 index 000000000000..1099aa7c3845 --- /dev/null +++ b/packages/appstore/src/components/modals/wallets-migration-failed/index.ts @@ -0,0 +1,3 @@ +import WalletsMigrationFailed from './wallets-migration-failed'; + +export default WalletsMigrationFailed; diff --git a/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.scss b/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.scss new file mode 100644 index 000000000000..f4078494c8a5 --- /dev/null +++ b/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.scss @@ -0,0 +1,29 @@ +.wallets-migration-failed { + padding: 2.4rem !important; + + @include mobile { + padding: 1.6rem !important; + } + + &__title { + margin-bottom: 2.4rem; + + @include mobile { + margin-bottom: 1.6rem; + } + } + + &__footer { + padding: 0 2.4rem 2.4rem; + + @include mobile { + padding: 0 1.6rem 1.6rem; + } + } + + &__text { + @include mobile { + font-size: 1.2rem !important; + } + } +} diff --git a/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.tsx b/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.tsx new file mode 100644 index 000000000000..ddca901304c0 --- /dev/null +++ b/packages/appstore/src/components/modals/wallets-migration-failed/wallets-migration-failed.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { Text, useOnClickOutside, Modal, Button } from '@deriv/components'; +import { useStore, observer } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import './wallets-migration-failed.scss'; + +const WalletsMigrationFailed = observer(() => { + const { traders_hub, ui } = useStore(); + const { is_wallet_migration_failed, setWalletsMigrationFailedPopup } = traders_hub; + const { is_mobile } = ui; + + const wallets_migration_failed_ref = React.useRef(null); + + const handleClose = () => { + setWalletsMigrationFailedPopup(false); + }; + + const handLiveChatButtonClick = () => { + window.LC_API?.open_chat_window(); + setWalletsMigrationFailedPopup(false); + }; + + const validateClickOutside = (e: MouseEvent) => { + return is_wallet_migration_failed && !wallets_migration_failed_ref?.current?.contains(e.target as Node); + }; + + useOnClickOutside(wallets_migration_failed_ref, handleClose, validateClickOutside); + + return ( + +
+ + + + + + + + + + + + +
+
+ ); +}); + +export default WalletsMigrationFailed; diff --git a/packages/appstore/src/components/options-multipliers-listing/index.tsx b/packages/appstore/src/components/options-multipliers-listing/index.tsx index b76afb64a0fc..eeff8ab41626 100644 --- a/packages/appstore/src/components/options-multipliers-listing/index.tsx +++ b/packages/appstore/src/components/options-multipliers-listing/index.tsx @@ -1,22 +1,22 @@ import React from 'react'; import { observer } from 'mobx-react-lite'; import { Text, StaticUrl } from '@deriv/components'; +import { ContentFlag } from '@deriv/shared'; +import { useStore } from '@deriv/stores'; import { Localize, localize } from '@deriv/translations'; import ListingContainer from 'Components/containers/listing-container'; -import { BrandConfig } from 'Constants/platform-config'; -import TradingAppCard from 'Components/containers/trading-app-card'; -import { useStores } from 'Stores/index'; -import { isMobile, ContentFlag } from '@deriv/shared'; import PlatformLoader from 'Components/pre-loader/platform-loader'; +import TradingAppCard from 'Components/containers/trading-app-card'; +import { BrandConfig } from 'Constants/platform-config'; import { getHasDivider } from 'Constants/utils'; -const OptionsAndMultipliersListing = () => { - const { traders_hub, client, ui } = useStores(); +const OptionsAndMultipliersListing = observer(() => { + const { traders_hub, client, ui } = useStore(); const { available_platforms, is_eu_user, is_real, no_MF_account, no_CR_account, is_demo, content_flag } = traders_hub; const { is_landing_company_loaded, is_eu, has_maltainvest_account, real_account_creation_unlock_date } = client; - const { setShouldShowCooldownModal, openRealAccountSignup } = ui; + const { setShouldShowCooldownModal, openRealAccountSignup, is_mobile } = ui; const low_risk_cr_non_eu = content_flag === ContentFlag.LOW_RISK_CR_NON_EU; @@ -27,15 +27,16 @@ const OptionsAndMultipliersListing = () => { const cr_demo = content_flag === ContentFlag.CR_DEMO; const OptionsTitle = () => { - if ((low_risk_cr_non_eu || high_risk_cr || cr_demo) && !isMobile()) { + if (is_mobile) return null; + if (low_risk_cr_non_eu || high_risk_cr || cr_demo) { return ( - + ); - } else if ((low_risk_cr_eu || is_eu) && !isMobile()) { + } else if (low_risk_cr_eu || is_eu) { return ( - + ); @@ -113,6 +114,6 @@ const OptionsAndMultipliersListing = () => { )} ); -}; +}); -export default observer(OptionsAndMultipliersListing); +export default OptionsAndMultipliersListing; diff --git a/packages/appstore/src/components/routes/routes-wrapper.tsx b/packages/appstore/src/components/routes/routes-wrapper.tsx deleted file mode 100644 index 8092cd5b2913..000000000000 --- a/packages/appstore/src/components/routes/routes-wrapper.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import * as React from 'react'; -import { BrowserRouter as Router } from 'react-router-dom'; - -const RoutesWrapper: React.FC = ({ has_router, children }) => { - if (has_router) { - return {children}; - } - - return {children}; -}; - -type TRoutesWrapperProps = React.PropsWithChildren<{ - has_router: boolean; -}>; - -export default RoutesWrapper; diff --git a/packages/appstore/src/components/routes/routes.tsx b/packages/appstore/src/components/routes/routes.tsx index 8d08e7ca9db0..58a844e118be 100644 --- a/packages/appstore/src/components/routes/routes.tsx +++ b/packages/appstore/src/components/routes/routes.tsx @@ -1,17 +1,29 @@ import * as React from 'react'; -import { useFeatureFlags } from '@deriv/hooks'; -import { Localize } from '@deriv/translations'; +// import { Loading } from '@deriv/components'; +import { useFeatureFlags /*useWalletsList*/ } from '@deriv/hooks'; +import { observer } from '@deriv/stores'; +import { Localize, localize } from '@deriv/translations'; import Wallets from '@deriv/wallets'; -import getRoutesConfig from 'Constants/routes-config'; -import { useStores } from 'Stores'; -import { TRoute } from 'Types'; -import { observer } from 'mobx-react-lite'; +import Onboarding from 'Modules/onboarding'; +import TradersHub from 'Modules/traders-hub'; +// import { WalletsModule } from 'Modules/wallets'; import { Switch } from 'react-router-dom'; import RouteWithSubroutes from './route-with-sub-routes.jsx'; const Routes: React.FC = observer(() => { - const { config } = useStores(); - const { is_next_wallet_enabled } = useFeatureFlags(); + //TODO: Uncomment once useWalletList hook is optimized for production release. + const { /*is_wallet_enabled,*/ is_next_wallet_enabled } = useFeatureFlags(); + // const { has_wallet, isLoading } = useWalletsList(); + // const should_show_wallets = is_wallet_enabled && has_wallet; + + let content: React.FC = TradersHub; + if (is_next_wallet_enabled) { + content = Wallets; + } + // else if (should_show_wallets) { + // content = WalletsModule; + // } + // if (isLoading) return ; return ( { } > - {getRoutesConfig({ - consumer_routes: config.routes, - }).map((route: TRoute, idx: number) => { - // Temporary way to intercept the route to show the Wallets component. - let updated_route = route; - if (updated_route.path === '/appstore/traders-hub') { - updated_route = { - ...updated_route, - component: is_next_wallet_enabled ? Wallets : updated_route.component, - }; - } - - return ; - })} + localize("Trader's Hub")} + /> + localize('Onboarding')} + /> ); diff --git a/packages/appstore/src/components/transaction-list/index.ts b/packages/appstore/src/components/transaction-list/index.ts new file mode 100644 index 000000000000..eee3dd112e2f --- /dev/null +++ b/packages/appstore/src/components/transaction-list/index.ts @@ -0,0 +1,3 @@ +import TransactionList from './transaction-list'; + +export default TransactionList; diff --git a/packages/appstore/src/components/transaction-list/non-pending-transaction.tsx b/packages/appstore/src/components/transaction-list/non-pending-transaction.tsx new file mode 100644 index 000000000000..616230a162b7 --- /dev/null +++ b/packages/appstore/src/components/transaction-list/non-pending-transaction.tsx @@ -0,0 +1,116 @@ +import React from 'react'; +import { AppLinkedWithWalletIcon, Text, WalletIcon } from '@deriv/components'; +import { useWalletTransactions } from '@deriv/hooks'; +import { useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; + +type TNonPendingTransaction = { + transaction: ReturnType['transactions'][number]; +}; + +const NonPendingTransaction = ({ transaction }: TNonPendingTransaction) => { + const { + ui: { is_dark_mode_on, is_mobile }, + } = useStore(); + + const { + account_category, + account_currency, + account_name, + account_type, + action_type, + amount, + balance_after = 0, + gradient_class, + icon, + icon_type, + } = transaction; + + const formatAmount = (value: number) => value.toLocaleString(undefined, { minimumFractionDigits: 2 }); + + const formatActionType = (value: string) => value[0].toUpperCase() + value.substring(1).replace(/_/, ' '); + + const getAppIcon = () => { + switch (account_type) { + case 'standard': + return is_dark_mode_on ? 'IcWalletOptionsDark' : 'IcWalletOptionsLight'; + //TODO: add proper icon for mt5 + case 'mt5': + return 'IcMt5CfdPlatform'; + //TODO: add proper icon for dxtrade + case 'dxtrade': + return ''; + default: + return ''; + } + }; + + return ( +
+
+ {account_category === 'trading' ? ( + + ) : ( + + )} +
+ + {formatActionType(action_type)} + + + {account_name} + +
+
+
+ 0 ? 'profit-success' : 'loss-danger'} + weight='bold' + line_height={is_mobile ? 's' : 'm'} + > + {(amount > 0 ? '+' : '') + formatAmount(amount)} {account_currency} + + + + +
+
+ ); +}; + +export default NonPendingTransaction; diff --git a/packages/appstore/src/components/transaction-list/transaction-for-day.tsx b/packages/appstore/src/components/transaction-list/transaction-for-day.tsx new file mode 100644 index 000000000000..3d28a58231cf --- /dev/null +++ b/packages/appstore/src/components/transaction-list/transaction-for-day.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { Text } from '@deriv/components'; +import { useWalletTransactions } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import NonPendingTransaction from './non-pending-transaction'; + +export const TransactionsForOneDay = observer( + ({ + day, + transaction_list, + }: { + day: string; + transaction_list: ReturnType['transactions']; + }) => { + const { + client: { loginid }, + ui: { is_mobile }, + } = useStore(); + + return ( +
+ + {day} + + {transaction_list.map(transaction => { + let display_transaction = transaction; + if ( + transaction?.action_type === 'transfer' && + transaction?.from?.loginid === loginid && + typeof transaction?.amount === 'number' + ) { + display_transaction = { ...transaction, amount: -transaction.amount }; + } + return ; + })} +
+ ); + } +); diff --git a/packages/appstore/src/components/transaction-list/transaction-list.scss b/packages/appstore/src/components/transaction-list/transaction-list.scss new file mode 100644 index 000000000000..0d98367bc8f5 --- /dev/null +++ b/packages/appstore/src/components/transaction-list/transaction-list.scss @@ -0,0 +1,99 @@ +.transaction-list { + display: flex; + flex-direction: column; + gap: 0.8rem; + + &__container { + display: flex; + flex-direction: column; + gap: 1.6rem; + margin: 0 auto; + width: 100%; + max-width: 800px; + } + + &__filter { + align-self: end; + + .dc-list { + width: 19.5rem; + } + + .dc-dropdown { + &__container { + height: 4rem; + width: 19.5rem; + } + + &__label { + transform: translate(1rem, -1rem) scale(0.75); + } + + &__display { + height: 4rem; + } + + &__display-text { + padding-left: 4rem; + } + } + + .suffix-icon { + height: 1.2rem; + width: 1.2rem; + } + + @include mobile { + align-self: auto; + margin: 0; + width: 100%; + max-width: 100%; + + .dc-dropdown__container, + .dc-list { + width: 100%; + } + } + } + + &__day { + display: flex; + flex-direction: column; + + &-header { + padding: 0.8rem 1.6rem; + } + } + + &__item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px; + box-shadow: inset 0 1px 0 var(--border-normal); + + &__left { + display: flex; + gap: 0.8rem; + + &__title { + display: flex; + flex-direction: column; + align-items: start; + justify-content: center; + gap: 0; + + @include mobile { + max-width: 10.4rem; + } + } + } + + &__right { + display: flex; + flex-direction: column; + align-items: end; + gap: 0.4rem; + } + } +} diff --git a/packages/appstore/src/components/transaction-list/transaction-list.tsx b/packages/appstore/src/components/transaction-list/transaction-list.tsx new file mode 100644 index 000000000000..1b24267e68b8 --- /dev/null +++ b/packages/appstore/src/components/transaction-list/transaction-list.tsx @@ -0,0 +1,77 @@ +import React, { useState } from 'react'; +import { Dropdown } from '@deriv/components'; +import { useActiveWallet, useWalletTransactions } from '@deriv/hooks'; +import { localize } from '@deriv/translations'; +import { groupTransactionsByDay } from '@deriv/utils'; +import { TransactionsForOneDay } from './transaction-for-day'; +import './transaction-list.scss'; + +const TransactionList = () => { + const wallet = useActiveWallet(); + + const filter_options = [ + { + text: localize('All'), + value: '', + }, + ...(wallet?.is_virtual + ? ([ + { + text: localize('Reset balance'), + value: 'reset_balance', + }, + ] as const) + : ([ + { + text: localize('Deposit'), + value: 'deposit', + }, + { + text: localize('Withdrawal'), + value: 'withdrawal', + }, + ] as const)), + { + text: localize('Transfer'), + value: 'transfer', + }, + ] as const; + + const [filter, setFilter] = useState(''); + + const { transactions } = useWalletTransactions(filter); + + // @ts-expect-error reset_balance is not supported in the API yet + const grouped_transactions = groupTransactionsByDay(transactions); + + const onValueChange = (e: { target: { name: string; value: string } }) => { + setFilter(e.target.value as typeof filter); + }; + + return ( +
+
+ + {Object.entries(grouped_transactions).map(([day, transaction_list]) => ( + ['transaction_list'] + } + /> + ))} +
+
+ ); +}; + +export default TransactionList; diff --git a/packages/appstore/src/components/wallet-button/__tests__/wallet-button.spec.tsx b/packages/appstore/src/components/wallet-button/__tests__/wallet-button.spec.tsx new file mode 100644 index 000000000000..280c3c2756df --- /dev/null +++ b/packages/appstore/src/components/wallet-button/__tests__/wallet-button.spec.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import WalletButton from '..'; + +const mockedRootStore = mockStore({}); + +describe('', () => { + const button = { + name: 'Transfer', + text: 'Transfer', + icon: 'IcAccountTransfer', + action: () => { + return true; + }, + } as const; + + it('Should render right text', () => { + render( + + + + ); + + expect(screen.getByText('Transfer')).toBeInTheDocument(); + }); + + it('Should render desktop class', () => { + const { container } = render( + + + + ); + + expect(container.childNodes[0]).toHaveClass('wallet-button__desktop-item'); + expect(container.childNodes[0]).not.toHaveClass('wallet-button__mobile-item'); + }); + + it('Should render mobile class', () => { + const { container } = render( + + + + ); + + expect(container.childNodes[0]).not.toHaveClass('wallet-button__desktop-item'); + expect(container.childNodes[0]).toHaveClass('wallet-button__mobile-item'); + }); + + it('Should add disabled class', () => { + const { container } = render( + + + + ); + + expect(container.childNodes[0]).not.toHaveClass('wallet-button__mobile-item'); + expect(container.childNodes[0]).toHaveClass('wallet-button__desktop-item'); + expect(container.childNodes[0]).toHaveClass('wallet-button__desktop-item-disabled'); + }); +}); diff --git a/packages/appstore/src/components/wallet-button/index.ts b/packages/appstore/src/components/wallet-button/index.ts new file mode 100644 index 000000000000..9197d979040f --- /dev/null +++ b/packages/appstore/src/components/wallet-button/index.ts @@ -0,0 +1,3 @@ +import WalletButton from './wallet-button'; + +export default WalletButton; diff --git a/packages/appstore/src/components/wallet-button/wallet-button.scss b/packages/appstore/src/components/wallet-button/wallet-button.scss new file mode 100644 index 000000000000..47478ceb300d --- /dev/null +++ b/packages/appstore/src/components/wallet-button/wallet-button.scss @@ -0,0 +1,79 @@ +.wallet-button { + &__mobile-item { + display: flex; + flex-direction: column; + align-items: center; + cursor: pointer; + min-width: 5.6rem; + + &-icon { + padding: 0.8rem; + border: 1px solid var(--border-normal); + border-radius: 50%; + } + + &-text { + margin-top: 0.4rem; + } + } + + &__desktop-item { + display: flex; + align-items: center; + cursor: pointer; + height: 3.2rem; + border-radius: $BORDER_RADIUS * 4; + padding: 0.6rem 1.6rem; + margin-right: 0.8rem; + border: 1px solid var(--border-hover); + background-color: var(--prominent); + + &:hover:not(&-disabled) { + background-color: var(--button-secondary-hover); + } + + &-disabled { + cursor: auto; + border: 1px solid var(--general-disabled); + } + + &-text { + margin-left: 0.8rem; + } + + &-transition { + &-enter { + transform: translateX(-1rem); + opacity: 0; + } + + &-enter-active { + transition: all 240ms ease-in-out; + transform: translateX(0); + position: relative; + opacity: 1; + } + + &-enter-done { + transform: translateX(0); + opacity: 1; + } + + &-exit { + transform: translateX(0); + opacity: 1; + } + + &-exit-active { + transition: all 240ms ease-in-out; + transform: translateX(-1rem); + position: relative; + opacity: 0; + } + + &-exit-done { + opacity: 0; + } + } + } +} diff --git a/packages/appstore/src/components/wallet-button/wallet-button.tsx b/packages/appstore/src/components/wallet-button/wallet-button.tsx new file mode 100644 index 000000000000..277025b4dff1 --- /dev/null +++ b/packages/appstore/src/components/wallet-button/wallet-button.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { CSSTransition } from 'react-transition-group'; +import classNames from 'classnames'; +import { Icon, Text } from '@deriv/components'; +import { getWalletHeaderButtons } from 'Constants/utils'; +import './wallet-button.scss'; + +type TProps = { + button: ReturnType[number]; + is_desktop_wallet?: boolean; + is_disabled?: boolean; + is_open?: boolean; +}; + +const WalletButton = ({ button, is_desktop_wallet, is_disabled, is_open }: TProps) => { + const { name, text, icon, action } = button; + return is_desktop_wallet ? ( +
+ + + + {text} + + +
+ ) : ( +
+
+ +
+ + {text} + +
+ ); +}; + +export default WalletButton; diff --git a/packages/appstore/src/components/wallet-cards-carousel/__tests__/wallet-cards-carousel.spec.tsx b/packages/appstore/src/components/wallet-cards-carousel/__tests__/wallet-cards-carousel.spec.tsx new file mode 100644 index 000000000000..f37493775614 --- /dev/null +++ b/packages/appstore/src/components/wallet-cards-carousel/__tests__/wallet-cards-carousel.spec.tsx @@ -0,0 +1,165 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { APIProvider, useFetch } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import WalletCardsCarousel from '..'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + currency: 'USD', + is_virtual: 0, + loginid: 'CRW10001', + }, + { + account_category: 'trading', + currency: 'USD', + is_virtual: 0, + loginid: 'CRW10002', + }, + { + account_category: 'wallet', + currency: 'UST', + is_virtual: 0, + loginid: 'CRW10003', + }, + { + account_category: 'wallet', + currency: 'BTC', + is_virtual: 1, + loginid: 'VRW10001', + }, + { + account_category: 'wallet', + currency: 'AUD', + is_virtual: 0, + loginid: 'CRW10004', + }, + { + account_category: 'wallet', + currency: 'ETH', + is_virtual: 0, + loginid: 'CRW10005', + }, + ], + }, + }, + }; + } else if (name === 'balance') { + return { + data: { + balance: { + accounts: { + CRW909900: { + balance: 0, + }, + }, + }, + }, + }; + } else if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + AUD: { type: 'fiat' }, + BTC: { type: 'crypto' }, + ETH: { type: 'crypto' }, + UST: { type: 'crypto' }, + USD: { type: 'fiat' }, + }, + }, + }, + }; + } else if (name === 'crypto_config') { + return { + data: { + crypto_config: { + currencies_config: { + BTC: {}, + }, + }, + }, + }; + } + + return undefined; + }), +})); + +jest.mock('./../cards-slider-swiper', () => jest.fn(() =>
slider
)); +const mockUseFetch = useFetch as jest.MockedFunction>; + +describe('', () => { + const wrapper = (mock: ReturnType) => { + const Component = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + return Component; + }; + it('Should render slider', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + render(, { wrapper: wrapper(mock) }); + const slider = screen.queryByText('slider'); + + expect(slider).toBeInTheDocument(); + }); + + it('Should render buttons for REAL', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + render(, { wrapper: wrapper(mock) }); + + const btn1 = screen.getByRole('button', { name: /Deposit/i }); + const btn2 = screen.getByRole('button', { name: /Withdraw/i }); + const btn3 = screen.getByRole('button', { name: /Transfer/i }); + const btn4 = screen.getByRole('button', { name: /Transactions/i }); + + expect(btn1).toBeInTheDocument(); + expect(btn2).toBeInTheDocument(); + expect(btn3).toBeInTheDocument(); + expect(btn4).toBeInTheDocument(); + }); + + it('Should render buttons for DEMO', () => { + const mock = mockStore({ client: { accounts: { VRW10001: { token: '12345' } }, loginid: 'VRW10001' } }); + + mockUseFetch.mockReturnValue({ + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + account_type: 'doughflow', + currency: 'USD', + is_virtual: 1, + loginid: 'VRW10001', + }, + ], + loginid: 'VRW10001', + }, + }, + } as unknown as ReturnType); + + render(, { wrapper: wrapper(mock) }); + + const btn1 = screen.getByRole('button', { name: /Transfer/i }); + const btn2 = screen.getByRole('button', { name: /Transactions/i }); + const btn3 = screen.getByRole('button', { name: /Reset balance/i }); + + expect(btn1).toBeInTheDocument(); + expect(btn2).toBeInTheDocument(); + expect(btn3).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-cards-carousel/cards-slider-swiper.tsx b/packages/appstore/src/components/wallet-cards-carousel/cards-slider-swiper.tsx new file mode 100644 index 000000000000..dfa33194257d --- /dev/null +++ b/packages/appstore/src/components/wallet-cards-carousel/cards-slider-swiper.tsx @@ -0,0 +1,86 @@ +import React, { useEffect, useState } from 'react'; +import useEmblaCarousel from 'embla-carousel-react'; +import { WalletCard, ProgressBarTracker } from '@deriv/components'; +import { useWalletsList } from '@deriv/hooks'; +import { formatMoney } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { getAccountName } from 'Constants/utils'; +import { TWalletAccount } from 'Types'; +import './wallet-cards-carousel.scss'; + +const CardsSliderSwiper = observer(() => { + const { client } = useStore(); + const { switchAccount } = client; + const { data } = useWalletsList(); + + const active_wallet_index = data.findIndex(item => item?.is_selected) || 0; + + const [active_index, setActiveIndex] = useState(active_wallet_index); + const [emblaRef, emblaApi] = useEmblaCarousel({ skipSnaps: true, containScroll: false }); + + const steps = data.map((_, idx) => idx.toString()); + + useEffect(() => { + emblaApi?.on('select', () => { + const index = emblaApi?.selectedScrollSnap() || 0; + setActiveIndex(index + 1); + }); + }, [emblaApi]); + + useEffect(() => { + emblaApi?.scrollTo(active_index - 1); + }, [active_index, emblaApi]); + + useEffect(() => { + const timeout_id = setTimeout(() => { + if (!data[active_index - 1]?.is_selected) switchAccount(data[active_index - 1]?.loginid); + }, 1000); + + return () => clearTimeout(timeout_id); + }, [active_index, data, switchAccount]); + + useEffect(() => { + setActiveIndex(active_wallet_index + 1); + }, [active_wallet_index]); + + const slider = React.useMemo( + () => + data?.map((item: TWalletAccount) => { + const { loginid, icon, currency_config, balance, currency, landing_company_name, gradient_card_class } = + item; + return ( +
+ +
+ ); + }), + [data?.length] + ); + + return ( + +
+
{slider}
+
+
+ +
+
+ ); +}); + +export default CardsSliderSwiper; diff --git a/packages/appstore/src/components/wallet-cards-carousel/index.ts b/packages/appstore/src/components/wallet-cards-carousel/index.ts new file mode 100644 index 000000000000..7a4b6f3d0f73 --- /dev/null +++ b/packages/appstore/src/components/wallet-cards-carousel/index.ts @@ -0,0 +1,3 @@ +import WalletCardsCarousel from './wallet-cards-carousel'; + +export default WalletCardsCarousel; diff --git a/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.scss b/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.scss new file mode 100644 index 000000000000..9279aafa264b --- /dev/null +++ b/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.scss @@ -0,0 +1,36 @@ +.wallet-cards-carousel { + margin: -1.6rem -1.6rem -1.4rem; + padding: 2.4rem 0 1.6rem; + + &__viewport { + overflow: hidden; + } + &__container { + height: 100%; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 2.4rem; + } + &__pagination { + margin-block: 1.6rem; + } + + &__buttons { + display: flex; + justify-content: center; + gap: 0.8rem; + } +} + +.wallet-carousel-content-container { + display: flex; + padding: 1.6rem; + flex-direction: column; + align-items: center; + background-color: var(--general-main-1); + + &-demo { + background-color: var(--wallet-demo-bg-color); + } +} diff --git a/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.tsx b/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.tsx new file mode 100644 index 000000000000..5473bdf3bf45 --- /dev/null +++ b/packages/appstore/src/components/wallet-cards-carousel/wallet-cards-carousel.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { useActiveWallet } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import WalletButton from 'Components/wallet-button'; +import { getWalletHeaderButtons } from 'Constants/utils'; +import CardsSliderSwiper from './cards-slider-swiper'; +import './wallet-cards-carousel.scss'; + +const WalletCardsCarousel = observer(() => { + const { ui, traders_hub } = useStore(); + const { setIsWalletModalVisible } = ui; + const { setWalletModalActiveWalletID, setWalletModalActiveTab } = traders_hub; + const active_wallet = useActiveWallet(); + + const wallet_buttons = getWalletHeaderButtons(active_wallet?.is_demo || false); + + return ( +
+ +
+ {wallet_buttons.map(button => { + button.action = () => { + setWalletModalActiveTab(button.name); + setIsWalletModalVisible(true); + setWalletModalActiveWalletID(active_wallet?.loginid); + }; + + return ; + })} +
+
+ ); +}); + +export default WalletCardsCarousel; diff --git a/packages/appstore/src/components/wallet-content/__tests__/wallet-content-divider.spec.tsx b/packages/appstore/src/components/wallet-content/__tests__/wallet-content-divider.spec.tsx new file mode 100644 index 000000000000..bddb0ec95bcc --- /dev/null +++ b/packages/appstore/src/components/wallet-content/__tests__/wallet-content-divider.spec.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import WalletContentDivider from '../wallet-content-divider'; + +describe('', () => { + it('Check classname for NOT demo', () => { + const { container } = render(); + + expect(container.childNodes[0]).toHaveClass('wallet-content__divider'); + expect(container.childNodes[0]).not.toHaveClass('wallet-content__divider-demo'); + }); + + it('Check classname for demo', () => { + const { container } = render(); + + expect(container.childNodes[0]).toHaveClass('wallet-content__divider'); + expect(container.childNodes[0]).toHaveClass('wallet-content__divider-demo'); + }); +}); diff --git a/packages/appstore/src/components/wallet-content/__tests__/wallet-content.spec.tsx b/packages/appstore/src/components/wallet-content/__tests__/wallet-content.spec.tsx new file mode 100644 index 000000000000..925c2bd480c1 --- /dev/null +++ b/packages/appstore/src/components/wallet-content/__tests__/wallet-content.spec.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import WalletContent from '../wallet-content'; + +const mockedRootStore = mockStore({ + modules: { + cfd: { + toggleCompareAccountsModal: jest.fn(), + }, + }, +}); + +jest.mock('./../../containers/currency-switcher-container', () => jest.fn(({ children }) =>
{children}
)); + +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useActiveWallet: jest.fn(), +})); + +describe('', () => { + it('Check class', () => { + render( + + + + ); + + const wrapper = screen.queryByTestId('dt_wallet-content'); + expect(wrapper).toHaveClass('wallet-content'); + expect(wrapper).not.toHaveClass('wallet-content__demo'); + }); + + it('Check class for demo', () => { + render( + + + + ); + + const wrapper = screen.queryByTestId('dt_wallet-content'); + expect(wrapper).toHaveClass('wallet-content'); + expect(wrapper).toHaveClass('wallet-content__demo'); + }); + + it('Check there is NOT disclaimer for demo', () => { + render( + + + + ); + + const disclaimer = screen.queryByTestId('dt_disclaimer_wrapper'); + + expect(disclaimer).not.toBeInTheDocument(); + }); + + it('Check there is NOT disclaimer for Non-EU', () => { + render( + + + + ); + + const disclaimer = screen.queryByTestId('dt_disclaimer_wrapper'); + + expect(disclaimer).not.toBeInTheDocument(); + }); + + it('Check there is disclaimer for EU and not demo', () => { + render( + + + + ); + + const disclaimer = screen.queryByTestId('dt_disclaimer_wrapper'); + + expect(disclaimer).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-content/__tests__/wallet-transfer-block.spec.tsx b/packages/appstore/src/components/wallet-content/__tests__/wallet-transfer-block.spec.tsx new file mode 100644 index 000000000000..71b3d47ae566 --- /dev/null +++ b/packages/appstore/src/components/wallet-content/__tests__/wallet-transfer-block.spec.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import WalletTransferBlock from '../wallet-transfer-block'; +import { TWalletAccount } from 'Types'; +import { StoreProvider, mockStore } from '@deriv/stores'; + +const wallet_account: TWalletAccount = { + name: 'USD', + currency: 'USD', + icon: '', + balance: 10415.24, + icon_type: 'fiat', + landing_company_name: 'svg', + is_disabled: false, + is_virtual: false, + loginid: 'CRW10001', +}; + +jest.mock('./../../containers/currency-switcher-container', () => jest.fn(({ children }) =>
{children}
)); + +const mockedRootStore = mockStore({ + modules: { + cfd: { + toggleCompareAccountsModal: jest.fn(), + }, + }, +}); + +describe('', () => { + it('Check balance', () => { + render( + + + + ); + const { currency } = wallet_account; + + const balance_title = screen.getByText(`10,415.24 ${currency}`); + + expect(balance_title).toBeInTheDocument(); + }); + + it('Check loginid', () => { + render( + + + + ); + const { loginid } = wallet_account; + + const loginid_title = screen.getByText(String(loginid)); + + expect(loginid_title).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-content/index.ts b/packages/appstore/src/components/wallet-content/index.ts new file mode 100644 index 000000000000..fee1bf581d8b --- /dev/null +++ b/packages/appstore/src/components/wallet-content/index.ts @@ -0,0 +1,3 @@ +import WalletContent from './wallet-content'; + +export default WalletContent; diff --git a/packages/appstore/src/components/wallet-content/wallet-cfds-listing.tsx b/packages/appstore/src/components/wallet-content/wallet-cfds-listing.tsx new file mode 100644 index 000000000000..bfb0a014da40 --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-cfds-listing.tsx @@ -0,0 +1,253 @@ +import React from 'react'; +import { Text, StaticUrl, Button } from '@deriv/components'; +import { useActiveWallet, useCFDCanGetMoreMT5Accounts } from '@deriv/hooks'; +import { formatMoney, isCryptocurrency } from '@deriv/shared'; +import { localize, Localize } from '@deriv/translations'; +import ListingContainer from 'Components/containers/listing-container'; +import TradingAppCard from 'Components/containers/trading-app-card'; +import PlatformLoader from 'Components/pre-loader/platform-loader'; +import { getHasDivider } from 'Constants/utils'; +import { useStore, observer } from '@deriv/stores'; +import GetMoreAccounts from 'Components/get-more-accounts'; +import { TDetailsOfEachMT5Loginid } from 'Types'; +import './wallet-content.scss'; + +type TProps = { + fiat_wallet_currency?: string; +}; + +const CryptoCFDs = observer(({ fiat_wallet_currency }: TProps) => { + const { traders_hub, ui } = useStore(); + const { setWalletModalActiveWalletID, setWalletModalActiveTab } = traders_hub; + + const { is_mobile, setIsWalletModalVisible } = ui; + + const wallet_account = useActiveWallet(); + if (!wallet_account) return null; + + return ( +
+ + + + +
+ ); +}); + +const FiatCFDs = observer(() => { + const { traders_hub } = useStore(); + const { + selected_region, + getExistingAccounts, + selected_account_type, + available_dxtrade_accounts, + combined_cfd_mt5_accounts, + toggleAccountTypeModalVisibility, + } = traders_hub; + + const can_get_more_cfd_mt5_accounts = useCFDCanGetMoreMT5Accounts(); + + const wallet_account = useActiveWallet(); + if (!wallet_account) return null; + + const getMT5AccountAuthStatus = (current_acc_status: string) => { + if (current_acc_status === 'proof_failed') { + return 'failed'; + } + if (current_acc_status === 'verification_pending') { + return 'pending'; + } + return null; + }; + + return ( + +
+ + + +
+ {combined_cfd_mt5_accounts.map((existing_account, index) => { + const { + action_type, + description, + icon, + key, + landing_company_short, + market_type, + name, + platform, + status, + sub_title, + } = existing_account; + const list_size = combined_cfd_mt5_accounts.length; + const mt5_account_status = status ? getMT5AccountAuthStatus(status) : null; + return ( + + ); + })} + {can_get_more_cfd_mt5_accounts && ( + + )} + {available_dxtrade_accounts?.length > 0 && ( +
+ + + +
+ )} + {available_dxtrade_accounts?.map(account => { + const existing_accounts = getExistingAccounts(account.platform ?? '', account.market_type ?? ''); + const has_existing_accounts = existing_accounts.length > 0; + return has_existing_accounts ? ( + existing_accounts.map((existing_account: TDetailsOfEachMT5Loginid) => ( + + )) + ) : ( + + ); + })} +
+ ); +}); + +const WalletCFDsListing = observer(({ fiat_wallet_currency = 'USD' }: TProps) => { + const { + client, + modules: { cfd }, + ui, + } = useStore(); + + const { toggleCompareAccountsModal } = cfd; + const { is_landing_company_loaded, is_logging_in, is_switching } = client; + const { is_mobile } = ui; + + const wallet_account = useActiveWallet(); + + if (!wallet_account || !is_landing_company_loaded || is_switching || is_logging_in) + return ( +
+ +
+ ); + + const { currency, landing_company_name, is_virtual } = wallet_account; + const accounts_sub_text = + landing_company_name === 'svg' || is_virtual ? ( + + ) : ( + + ); + + const is_fiat = !isCryptocurrency(currency) && currency !== 'USDT'; + + return ( + + + + +
+ + {accounts_sub_text} + +
+
+ ) + } + description={ + + Learn more' + } + components={[]} + /> + + } + is_outside_grid_container={!is_fiat} + > + {is_mobile && ( +
+ + {accounts_sub_text} + +
+ )} + {is_fiat ? : } + + ); +}); + +export default WalletCFDsListing; diff --git a/packages/appstore/src/components/wallet-content/wallet-content-divider.tsx b/packages/appstore/src/components/wallet-content/wallet-content-divider.tsx new file mode 100644 index 000000000000..442c7c4ad486 --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-content-divider.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import classNames from 'classnames'; + +const WalletContentDivider = ({ is_demo_divider }: { is_demo_divider?: boolean }) => ( +
+); + +export default WalletContentDivider; diff --git a/packages/appstore/src/components/wallet-content/wallet-content.scss b/packages/appstore/src/components/wallet-content/wallet-content.scss new file mode 100644 index 000000000000..dca6d6f6931d --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-content.scss @@ -0,0 +1,75 @@ +.wallet-content { + &__loader { + padding: 2.4rem; + + @include mobile { + padding: 1.6rem 0; + } + } + + &__divider { + border: 1px solid var(--general-section-1); + margin-inline: 2.4rem; + + &-demo { + border-color: var(--wallet-demo-divider-color); + } + } + + &__border-reset { + border: 0; + } + + &__disclaimer { + width: 100%; + height: 7rem; + display: flex; + align-items: center; + backface-visibility: hidden; + background-color: var(--wallet-eu-disclaimer); + border-radius: 0 0 $BORDER_RADIUS * 4 $BORDER_RADIUS * 4; + + @include mobile { + height: 8rem; + border: 1px solid var(--wallet-eu-disclaimer); + } + + &-text { + padding: 0 4rem; + + @include mobile { + padding: 0 1.5rem; + } + } + } + + &__cfd { + & .listing-container__content { + padding-block-start: 0; + } + + & .cfd-accounts__compare-table-title { + padding-left: 0.8rem; + } + + &-crypto { + display: flex; + flex-direction: column; + align-items: center; + padding: 2.4rem; + + @include mobile { + padding: 0; + } + + &-title { + padding: 2.4rem; + + @include mobile { + padding: 2.4rem 1.6rem; + text-align: center; + } + } + } + } +} diff --git a/packages/appstore/src/components/wallet-content/wallet-content.tsx b/packages/appstore/src/components/wallet-content/wallet-content.tsx new file mode 100644 index 000000000000..195b87c978b9 --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-content.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import classNames from 'classnames'; +import ContentDivider from './wallet-content-divider'; +import WalletCfdsListing from './wallet-cfds-listing'; +import WalletOptionsAndMultipliersListing from './wallet-option-multipliers-listing'; +import EUDisclaimer from 'Components/eu-disclaimer'; +import './wallet-content.scss'; + +type TProps = { + is_demo: boolean; + is_malta_wallet: boolean; +}; + +const WalletContent = ({ is_demo, is_malta_wallet }: TProps) => { + return ( +
+ + + + + {is_malta_wallet && !is_demo && ( + + )} +
+ ); +}; + +export default WalletContent; diff --git a/packages/appstore/src/components/wallet-content/wallet-option-multipliers-listing.tsx b/packages/appstore/src/components/wallet-content/wallet-option-multipliers-listing.tsx new file mode 100644 index 000000000000..a3f39f67a5cb --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-option-multipliers-listing.tsx @@ -0,0 +1,131 @@ +import React from 'react'; +import { Text, StaticUrl } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import ListingContainer from 'Components/containers/listing-container'; +import TradingAppCard from 'Components/containers/trading-app-card'; +import PlatformLoader from 'Components/pre-loader/platform-loader'; +import { getHasDivider } from 'Constants/utils'; +import { Jurisdiction } from '@deriv/shared'; +import { useStore, observer } from '@deriv/stores'; +import { useActiveWallet } from '@deriv/hooks'; +import './wallet-content.scss'; + +type TProps = { + landing_company_name: string | undefined; +}; + +const OptionsTitle = observer(({ landing_company_name }: TProps) => { + const { + ui: { is_mobile }, + } = useStore(); + + const is_svg_wallet = landing_company_name === 'svg'; + + if (is_svg_wallet && !is_mobile) { + return ( + + + + ); + } else if (!is_svg_wallet && !is_mobile) { + return ( + + + + ); + } + return null; +}); + +const ListingContainerDescription = ({ landing_company_name }: TProps) => + landing_company_name === 'svg' ? ( + + , + , + ]} + /> + + ) : ( + + ]} + /> + + ); + +const WalletOptionsAndMultipliersListing = observer(() => { + const { traders_hub, client, ui } = useStore(); + const { setShouldShowCooldownModal, openRealAccountSignup } = ui; + const { + is_landing_company_loaded, + has_maltainvest_account, + real_account_creation_unlock_date, + is_logging_in, + is_switching, + } = client; + const { available_platforms, is_eu_user, is_real, no_MF_account, no_CR_account, is_demo } = traders_hub; + + const wallet_account = useActiveWallet(); + + if (!wallet_account || is_switching || is_logging_in || !is_landing_company_loaded) { + return ( +
+ +
+ ); + } + + const platforms_action_type = + is_demo || (!no_CR_account && !is_eu_user) || (has_maltainvest_account && is_eu_user) ? 'trade' : 'none'; + + const derivAccountAction = () => { + if (no_MF_account) { + if (real_account_creation_unlock_date) { + setShouldShowCooldownModal(true); + } else { + openRealAccountSignup(Jurisdiction.MALTA_INVEST); + } + } else { + openRealAccountSignup(Jurisdiction.SVG); + } + }; + + return ( + } + description={} + is_deriv_platform + > + {is_real && (no_CR_account || no_MF_account) && ( +
+ +
+ )} + {available_platforms.map((available_platform, index) => ( + + ))} +
+ ); +}); + +export default WalletOptionsAndMultipliersListing; diff --git a/packages/appstore/src/components/wallet-content/wallet-transfer-block.tsx b/packages/appstore/src/components/wallet-content/wallet-transfer-block.tsx new file mode 100644 index 000000000000..b2e04796583d --- /dev/null +++ b/packages/appstore/src/components/wallet-content/wallet-transfer-block.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { Button, Text } from '@deriv/components'; +import { formatMoney } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import CurrencySwitcherContainer from 'Components/containers/currency-switcher-container'; +import { TWalletAccount } from 'Types'; + +type TProps = { + wallet_account: TWalletAccount; +}; + +const WalletTransferBlock = observer(({ wallet_account }: TProps) => { + const { traders_hub, ui } = useStore(); + const { setIsWalletModalVisible } = ui; + const { setWalletModalActiveWalletID, setWalletModalActiveTab } = traders_hub; + + const { currency, balance, loginid } = wallet_account; + + return ( + { + setWalletModalActiveTab('Transfer'); + setIsWalletModalVisible(true); + setWalletModalActiveWalletID(loginid); + }} + secondary + className='currency-switcher__button' + > + + + } + has_interaction + show_dropdown={false} + > + + + {formatMoney(currency, balance, true)} {currency} + + + {loginid} + + + + ); +}); +export default WalletTransferBlock; diff --git a/packages/appstore/src/components/wallet-deposit/index.ts b/packages/appstore/src/components/wallet-deposit/index.ts new file mode 100644 index 000000000000..7a81ec16480e --- /dev/null +++ b/packages/appstore/src/components/wallet-deposit/index.ts @@ -0,0 +1,3 @@ +import WalletDeposit from './wallet-deposit'; + +export default WalletDeposit; diff --git a/packages/appstore/src/components/wallet-deposit/wallet-deposit.scss b/packages/appstore/src/components/wallet-deposit/wallet-deposit.scss new file mode 100644 index 000000000000..2daf382ce975 --- /dev/null +++ b/packages/appstore/src/components/wallet-deposit/wallet-deposit.scss @@ -0,0 +1,7 @@ +.wallet-deposit { + &__fiat-container { + display: flex; + max-width: 58.8rem; + margin: 0 auto; + } +} diff --git a/packages/appstore/src/components/wallet-deposit/wallet-deposit.tsx b/packages/appstore/src/components/wallet-deposit/wallet-deposit.tsx new file mode 100644 index 000000000000..4e26439f5c3f --- /dev/null +++ b/packages/appstore/src/components/wallet-deposit/wallet-deposit.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { useCurrencyConfig } from '@deriv/hooks'; +import { useStore, observer } from '@deriv/stores'; +import { Div100vhContainer } from '@deriv/components'; +import DepositFiatIframe from '@deriv/cashier/src/modules/deposit-fiat/components/deposit-fiat-iframe/deposit-fiat-iframe'; +import './wallet-deposit.scss'; + +const WalletDeposit = observer(() => { + const { client, ui } = useStore(); + const { is_mobile } = ui; + const { currency, loginid } = client; + + const { getConfig } = useCurrencyConfig(); + const currency_config = getConfig(currency); + const is_crypto = currency_config?.is_crypto; + + //TODO: remove when selected wallet will be provided to WalletDeposit props + const real_fiat_wallet = loginid?.startsWith('CRW') && !is_crypto; + + return real_fiat_wallet ? ( + + + + ) : ( +
Deposit Development Is In Progress
+ ); +}); + +export default WalletDeposit; diff --git a/packages/appstore/src/components/wallet-header/__tests__/wallet-header.spec.tsx b/packages/appstore/src/components/wallet-header/__tests__/wallet-header.spec.tsx new file mode 100644 index 000000000000..b506d6c39f44 --- /dev/null +++ b/packages/appstore/src/components/wallet-header/__tests__/wallet-header.spec.tsx @@ -0,0 +1,326 @@ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import '@testing-library/jest-dom'; +import { getStatusBadgeConfig } from '@deriv/account'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { TWalletAccount } from 'Types'; +import WalletHeader from '..'; + +const mockedRootStore = mockStore({}); + +jest.mock('@deriv/account', () => ({ + ...jest.requireActual('@deriv/account'), + getStatusBadgeConfig: jest.fn(() => ({ icon: '', text: '' })), +})); + +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useWalletModalActionHandler: jest.fn(() => ({ setWalletModalActiveTabIndex: jest.fn(), handleAction: jest.fn() })), +})); + +describe('', () => { + const default_mocked_props: TWalletAccount = { + is_demo: false, + currency: 'USD', + landing_company_name: 'svg', + balance: 10000, + loginid: 'CRW123123', + is_malta_wallet: false, + is_selected: true, + gradient_header_class: 'wallet-header__usd-bg', + gradient_card_class: 'wallet-card__usd-bg', + wallet_currency_type: '', + currency_config: undefined, + icon: '', + }; + + describe('Check currency card', () => { + it('Should render right currency card for DEMO', () => { + const mocked_props = { ...default_mocked_props, is_demo: true }; + render( + + + + ); + + expect(screen.queryByTestId(`dt_demo`)).toBeInTheDocument(); + }); + + it('Should render right currency card for REAL SVG fiat', () => { + const mocked_props = { ...default_mocked_props, currency: 'AUD' }; + render( + + + + ); + + expect(screen.queryByTestId(`dt_${mocked_props.currency.toLowerCase()}`)).toBeInTheDocument(); + }); + + it('Should render right currency card for REAL SVG crypto', () => { + const mocked_props = { ...default_mocked_props, currency: 'ETH' }; + render( + + + + ); + + expect(screen.queryByTestId(`dt_${mocked_props.currency.toLowerCase()}`)).toBeInTheDocument(); + }); + + it('Should render right currency card for REAL MALTA fiat', () => { + const mocked_props = { ...default_mocked_props, currency: 'ETH', landing_company_name: 'malta' }; + render( + + + + ); + + expect(screen.queryByTestId(`dt_${mocked_props.currency.toLowerCase()}`)).toBeInTheDocument(); + }); + }); + + describe('Check balance', () => { + it('Should render right balance with balance as props', () => { + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + landing_company_name: 'malta', + balance: 2345.56, + }; + render( + + + + ); + + expect(screen.getByText('2,345.56 EUR')).toBeInTheDocument(); + }); + + it('Should render balance === 0.00', () => { + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + landing_company_name: 'malta', + balance: 0, + }; + render( + + + + ); + + expect(screen.queryByText(`0.00 ${mocked_props.currency}`)).toBeInTheDocument(); + }); + + it('Should render badge Pending verification', () => { + getStatusBadgeConfig.mockReturnValue({ icon: '', text: 'Pending verification' }); + + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + landing_company_name: 'malta', + balance: 0, + }; + + const mocked_store = mockStore({ + client: { + loginid: 'MFW1231', + }, + traders_hub: { multipliers_account_status: 'pending', is_eu_user: true }, + }); + + render( + + + + ); + + expect(screen.queryByText(/Pending verification/i)).toBeInTheDocument(); + expect(screen.queryByText(/balance/i)).not.toBeInTheDocument(); + }); + + it('Should render badge Verification failed', () => { + getStatusBadgeConfig.mockReturnValue({ icon: '', text: 'Verification failed' }); + + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + landing_company_name: 'malta', + balance: 0, + }; + + const mocked_store = mockStore({ + client: { + loginid: 'MFW1231', + }, + traders_hub: { multipliers_account_status: 'failed', is_eu_user: true }, + }); + + render( + + + + ); + + expect(screen.queryByText(/Verification failed/i)).toBeInTheDocument(); + expect(screen.queryByText(/balance/i)).not.toBeInTheDocument(); + }); + + it('Should render badge Need verification', () => { + getStatusBadgeConfig.mockReturnValue({ icon: '', text: 'Need verification' }); + + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + landing_company_name: 'malta', + balance: 0, + }; + + const mocked_store = mockStore({ + client: { + loginid: 'MFW1231', + }, + traders_hub: { multipliers_account_status: 'need_verification', is_eu_user: true }, + }); + + render( + + + + ); + + expect(screen.queryByText(/Need verification/i)).toBeInTheDocument(); + expect(screen.queryByText(/balance/i)).not.toBeInTheDocument(); + }); + }); + + describe('Check buttons', () => { + it('Buttons collapsed', () => { + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + balance: 0, + is_selected: false, + is_demo: true, + }; + + render( + + + + ); + + expect(screen.queryByRole('button', { name: /Transfer/i })).not.toBeInTheDocument(); + }); + + it('Buttons uncollapsed', () => { + const mocked_props = { + ...default_mocked_props, + currency: 'EUR', + balance: 0, + is_selected: true, + is_demo: true, + }; + + const mocked_store = mockStore({ + client: { + loginid: 'CRW1231', + }, + }); + + render( + + + + ); + + expect(screen.getByRole('button', { name: /Transfer/i })).toBeInTheDocument(); + }); + + it('Arrow button click and switchAccount should be called', async () => { + const mocked_props = { + ...default_mocked_props, + balance: 0, + is_selected: false, + is_demo: true, + loginid: 'CRW1231', + }; + + render( + + + + ); + + const arrow_btn = screen.getByTestId('dt_arrow'); + userEvent.click(arrow_btn); + + await waitFor(() => { + expect(mockedRootStore.client.switchAccount).toBeCalledTimes(1); + }); + }); + + it('Check buttons for demo', () => { + const mocked_props = { + ...default_mocked_props, + balance: 0, + currency: 'EUR', + is_demo: true, + loginid: 'VRW123123', + }; + + const mocked_store = mockStore({ + client: { + loginid: 'VRW123123', + }, + }); + + render( + + + + ); + + const transfer_btn = screen.getByRole('button', { name: /Transfer/i }); + const transactions_btn = screen.getByRole('button', { name: /Transactions/i }); + const reset_btn = screen.getByRole('button', { name: /Reset balance/i }); + + expect(transfer_btn).toBeInTheDocument(); + expect(transactions_btn).toBeInTheDocument(); + expect(reset_btn).toBeInTheDocument(); + }); + + it('Check buttons for real', () => { + const mocked_props = { + ...default_mocked_props, + balance: 1230, + currency: 'EUR', + loginid: 'CRW123123', + }; + + const mocked_store = mockStore({ + client: { + loginid: 'CRW123123', + }, + }); + + render( + + + + ); + + const deposit_btn = screen.getByRole('button', { name: /Deposit/i }); + const withdraw_btn = screen.getByRole('button', { name: /Withdraw/i }); + const transfer_btn = screen.getByRole('button', { name: /Transfer/i }); + const transactions_btn = screen.getByRole('button', { name: /Transactions/i }); + + expect(deposit_btn).toBeInTheDocument(); + expect(withdraw_btn).toBeInTheDocument(); + expect(transfer_btn).toBeInTheDocument(); + expect(transactions_btn).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/appstore/src/components/wallet-header/index.ts b/packages/appstore/src/components/wallet-header/index.ts new file mode 100644 index 000000000000..ed176c4b242f --- /dev/null +++ b/packages/appstore/src/components/wallet-header/index.ts @@ -0,0 +1,3 @@ +import WalletHeader from './wallet-header'; + +export default WalletHeader; diff --git a/packages/appstore/src/components/wallet-header/wallet-currency-card.tsx b/packages/appstore/src/components/wallet-header/wallet-currency-card.tsx new file mode 100644 index 000000000000..967614865c52 --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-currency-card.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { WalletIcon } from '@deriv/components'; +import { TWalletAccount } from 'Types'; + +type TWalletCurrencyCard = Pick & { + gradient_class?: string; + icon_type?: string; +}; + +const WalletCurrencyCard = ({ is_demo, currency, icon, icon_type, gradient_class }: TWalletCurrencyCard) => { + return ( +
+ +
+ ); +}; + +export default WalletCurrencyCard; diff --git a/packages/appstore/src/components/wallet-header/wallet-header-balance.tsx b/packages/appstore/src/components/wallet-header/wallet-header-balance.tsx new file mode 100644 index 000000000000..d985a9b0cd06 --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-header-balance.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { Text, StatusBadge } from '@deriv/components'; +import { getStatusBadgeConfig } from '@deriv/account'; +import { useStore, observer } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import { TWalletAccount } from 'Types'; +import { formatMoney } from '@deriv/shared'; + +type TWalletHeaderBalance = Pick; + +const WalletHeaderBalance = observer(({ balance, currency }: TWalletHeaderBalance) => { + const { + traders_hub: { openFailedVerificationModal, multipliers_account_status, is_eu_user }, + } = useStore(); + + const balance_amount = ( + + + + ); + + // TODO: just for test use empty object. When BE will be ready it will be fixed + const { text: badge_text, icon: badge_icon } = getStatusBadgeConfig( + multipliers_account_status, + openFailedVerificationModal, + { + platform: '', + category: '', + type: '', + jurisdiction: '', + } + ); + + return ( +
+ {multipliers_account_status && is_eu_user ? ( + + ) : ( + + + + + {balance_amount} + + )} +
+ ); +}); +export default WalletHeaderBalance; diff --git a/packages/appstore/src/components/wallet-header/wallet-header-buttons.tsx b/packages/appstore/src/components/wallet-header/wallet-header-buttons.tsx new file mode 100644 index 000000000000..2a13cde524cd --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-header-buttons.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { observer, useStore } from '@deriv/stores'; +import { TWalletAccount, TWalletButton } from 'Types'; +import WalletButton from 'Components/wallet-button'; + +type TWalletHeaderButtons = { + is_disabled: boolean; + is_open: boolean; + buttons: TWalletButton[]; + wallet_account: TWalletAccount; +}; + +const WalletHeaderButtons = observer(({ is_disabled, is_open, buttons, wallet_account }: TWalletHeaderButtons) => { + const { ui, traders_hub } = useStore(); + const { setIsWalletModalVisible } = ui; + const { setWalletModalActiveWalletID, setWalletModalActiveTab } = traders_hub; + + return ( +
+ {buttons.map(button => { + button.action = () => { + setWalletModalActiveTab(button.name); + setIsWalletModalVisible(true); + setWalletModalActiveWalletID(wallet_account.loginid); + }; + + return ( + + ); + })} +
+ ); +}); +export default WalletHeaderButtons; diff --git a/packages/appstore/src/components/wallet-header/wallet-header-title.tsx b/packages/appstore/src/components/wallet-header/wallet-header-title.tsx new file mode 100644 index 000000000000..ad88f61d55f5 --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-header-title.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Text, Badge } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { TWalletAccount } from 'Types'; + +type TWalletHeaderTitle = Pick; + +const WalletHeaderTitle = ({ is_demo, currency, landing_company_name }: TWalletHeaderTitle) => { + return ( +
+ + {is_demo ? ( + + ) : ( + + )} + + {!is_demo && ( + + )} +
+ ); +}; + +export default WalletHeaderTitle; diff --git a/packages/appstore/src/components/wallet-header/wallet-header.scss b/packages/appstore/src/components/wallet-header/wallet-header.scss new file mode 100644 index 000000000000..adbd6d34988c --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-header.scss @@ -0,0 +1,91 @@ +.wallet-header { + padding: 2.4rem; + background-color: var(--general-main-1); + border-radius: $BORDER_RADIUS * 4; + height: 12.8rem; + + &__demo { + position: relative; + background-color: var(--wallet-demo-bg-color); + } + &__demo:before { + content: ' '; + display: block; + position: absolute; + inset: 0; + opacity: 0.1; + background-repeat: repeat; + background-position: 3% 30%; + border-radius: $BORDER_RADIUS * 4; + } + + .theme--light &__demo:before { + background-image: url('./../../public/images/wallet-header-demo-bg.svg'); + } + + .theme--dark &__demo:before { + background-image: url('./../../public/images/wallet-header-demo-bg-dark.svg'); + } + + &__container { + position: relative; + display: flex; + height: 8rem; + } + + &__currency { + display: flex; + justify-content: center; + align-items: center; + width: 12.8rem; + margin-right: 2.4rem; + border-radius: $BORDER_RADIUS * 2; + } + + &__description { + display: flex; + flex-direction: column; + justify-content: space-between; + padding-block: 0.5rem; + + &-title { + display: flex; + align-items: center; + } + + &-badge { + margin-left: 0.8rem; + } + + &-buttons { + display: flex; + } + } + + &__balance { + display: flex; + align-self: center; + padding-block: 1.3rem; + margin-left: auto; + + &-title-amount { + display: flex; + flex-direction: column; + padding-inline: 2.4rem; + + &-title { + align-self: flex-end; + } + } + + &-arrow-icon { + cursor: pointer; + transition: transform 0.3s ease; + transform: rotate(0deg); + align-self: center; + } + &-arrow-icon-active { + transform: rotate(180deg); + } + } +} diff --git a/packages/appstore/src/components/wallet-header/wallet-header.tsx b/packages/appstore/src/components/wallet-header/wallet-header.tsx new file mode 100644 index 000000000000..a8d7f9957247 --- /dev/null +++ b/packages/appstore/src/components/wallet-header/wallet-header.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { Icon } from '@deriv/components'; +import classNames from 'classnames'; +import WalletCurrencyCard from './wallet-currency-card'; +import WalletHeaderButtons from './wallet-header-buttons'; +import WalletHeaderTitle from './wallet-header-title'; +import WalletHeaderBalance from './wallet-header-balance'; +import { TWalletAccount } from 'Types'; +import { getWalletHeaderButtons } from 'Constants/utils'; +import { observer, useStore } from '@deriv/stores'; +import './wallet-header.scss'; + +type TWalletHeader = { + wallet_account: TWalletAccount; +}; + +const WalletHeader = observer(({ wallet_account }: TWalletHeader) => { + const { client, traders_hub } = useStore(); + const { switchAccount, loginid } = client; + const is_active = wallet_account.is_selected; + // const [is_loading, setIsLoading] = useState(false); + const { multipliers_account_status } = traders_hub; + + const { is_demo, currency, gradient_card_class, currency_config, icon, balance, landing_company_name } = + wallet_account; + + const wallet_buttons = getWalletHeaderButtons(wallet_account.is_demo); + + const onArrowClickHandler = async () => { + // setIsLoading(true); + if (loginid !== wallet_account.loginid) await switchAccount(wallet_account.loginid); + // setIsLoading(false); + }; + + /** @todo: uncomment this when we have a skeleton loader for wallet header*/ + // useEffect(() => { + // if (is_authorize) { + // setIsLoading(false); + // } + // }, [is_authorize]);} + + return ( +
+
+ +
+ + +
+
+ + +
+
+
+ ); +}); + +export default WalletHeader; diff --git a/packages/appstore/src/components/wallet-jurisdiction-badge/__tests__/wallet-jurisdiction-badge.spec.tsx b/packages/appstore/src/components/wallet-jurisdiction-badge/__tests__/wallet-jurisdiction-badge.spec.tsx new file mode 100644 index 000000000000..8c036a66244c --- /dev/null +++ b/packages/appstore/src/components/wallet-jurisdiction-badge/__tests__/wallet-jurisdiction-badge.spec.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import WalletJurisdictionBadge from '../wallet-jurisdiction-badge'; +import { render, screen } from '@testing-library/react'; + +describe('WalletJurisdictionBadge', () => { + it('Should render demo badge', () => { + render(); + + expect(screen.getByText('Demo')).toBeInTheDocument(); + }); + + it('Should render svg badge', () => { + render(); + + expect(screen.getByText('SVG')).toBeInTheDocument(); + }); + + it('Should render malta badge', () => { + render(); + + expect(screen.getByText('MALTA')).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-jurisdiction-badge/index.ts b/packages/appstore/src/components/wallet-jurisdiction-badge/index.ts new file mode 100644 index 000000000000..eb311bb13e05 --- /dev/null +++ b/packages/appstore/src/components/wallet-jurisdiction-badge/index.ts @@ -0,0 +1,3 @@ +import WalletJurisdictionBadge from './wallet-jurisdiction-badge'; + +export { WalletJurisdictionBadge }; diff --git a/packages/appstore/src/components/wallet-jurisdiction-badge/wallet-jurisdiction-badge.tsx b/packages/appstore/src/components/wallet-jurisdiction-badge/wallet-jurisdiction-badge.tsx new file mode 100644 index 000000000000..3447b05ea32d --- /dev/null +++ b/packages/appstore/src/components/wallet-jurisdiction-badge/wallet-jurisdiction-badge.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Badge } from '@deriv/components'; +import { localize } from '@deriv/translations'; + +type TWalletJurisdictionBadge = { + is_demo: boolean; + shortcode?: string; +}; + +const WalletJurisdictionBadge = ({ is_demo, shortcode }: TWalletJurisdictionBadge) => { + return is_demo ? ( + + ) : ( + + ); +}; + +export default WalletJurisdictionBadge; diff --git a/packages/appstore/src/components/wallet-transfer/__tests__/wallet-transfer.spec.tsx b/packages/appstore/src/components/wallet-transfer/__tests__/wallet-transfer.spec.tsx new file mode 100644 index 000000000000..888267235c12 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/__tests__/wallet-transfer.spec.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import WalletTransfer from '../wallet-transfer'; +import { APIProvider } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { render, screen } from '@testing-library/react'; + +jest.mock('../transfer-account-selector', () => jest.fn(() =>
TransferAccountSelector
)); + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + AmountInput: () =>
AmountInput
, +})); + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(() => ({ data: undefined })), +})); + +describe('WalletTransfer', () => { + const mock = mockStore({ + client: { + loginid: 'CRW1030', + accounts: { + CRW1030: { + token: 'token', + }, + }, + }, + }); + + it('Should render two amount inputs and two transfer account selectors', () => { + render( + + + + + + ); + + expect(screen.getAllByText('AmountInput')).toHaveLength(2); + expect(screen.getAllByText('TransferAccountSelector')).toHaveLength(2); + }); +}); diff --git a/packages/appstore/src/components/wallet-transfer/index.ts b/packages/appstore/src/components/wallet-transfer/index.ts new file mode 100644 index 000000000000..488f1606ef01 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/index.ts @@ -0,0 +1,3 @@ +import WalletTransfer from './wallet-transfer'; + +export default WalletTransfer; diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-list.spec.tsx b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-list.spec.tsx new file mode 100644 index 000000000000..93c945e7c9ee --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-list.spec.tsx @@ -0,0 +1,98 @@ +import React from 'react'; +import TransferAccountList from '../transfer-account-list'; +import { render, screen } from '@testing-library/react'; + +jest.mock('../../wallet-transfer-tile/wallet-transfer-tile', () => jest.fn(() =>
WalletTransferTile
)); + +describe('TransferAccountList', () => { + let mocked_props: React.ComponentProps; + + beforeEach(() => { + mocked_props = { + is_mobile: false, + selected_account: { + account_type: 'wallet', + balance: 100, + currency: 'USD', + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'Icon', + is_demo: false, + loginid: 'CRW1000', + shortcode: 'svg', + type: 'fiat', + active_wallet_icon: 'Wallet Icon', + }, + setIsListModalOpen: jest.fn(), + setSelectedAccount: jest.fn(), + transfer_accounts: { + trading_accounts: { + CR1000: { + account_type: 'trading', + balance: 10, + currency: 'USD', + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'Icon', + is_demo: false, + loginid: '1', + shortcode: 'svg', + type: 'fiat', + active_wallet_icon: 'IcCurrencyUsd', + }, + MTR2000: { + account_type: 'mt5', + balance: 10, + currency: 'USD', + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'Icon', + is_demo: false, + loginid: '2', + shortcode: 'svg', + type: 'fiat', + active_wallet_icon: 'IcCurrencyUsd', + }, + }, + + wallet_accounts: { + CRW1000: { + account_type: 'wallet', + balance: 10000, + currency: 'USD', + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'Icon', + is_demo: false, + loginid: '3', + shortcode: 'svg', + type: 'fiat', + active_wallet_icon: 'IcCurrencyUsd', + }, + }, + }, + transfer_hint: 'Transfer hint', + wallet_name: 'USD Wallet', + }; + }); + + it('Should render proper titles of transfer accounts', () => { + render(); + + expect(screen.getByText('Trading accounts linked with USD Wallet')).toBeInTheDocument(); + expect(screen.getByText('Wallets')).toBeInTheDocument(); + }); + + it('Should render proper amount of transfer accounts', () => { + render(); + + expect(screen.getAllByText('WalletTransferTile')).toHaveLength(3); + }); + + it('Should render transfer hint for Wallets account list', () => { + mocked_props.transfer_accounts = { ...mocked_props.transfer_accounts, trading_accounts: {} }; + render(); + + expect(screen.getByText('Transfer hint')).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-selector.spec.tsx b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-selector.spec.tsx new file mode 100644 index 000000000000..8784109c5814 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/__tests__/transfer-account-selector.spec.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import TransferAccountSelector from '../transfer-account-selector'; +import userEvent from '@testing-library/user-event'; +import { render, screen } from '@testing-library/react'; + +jest.mock('../transfer-account-list', () => jest.fn(() =>
TransferAccountList
)); +jest.mock('../../wallet-transfer-tile', () => jest.fn(() =>
WalletTransferTile
)); + +describe('TransferAccountSelector', () => { + let modal_root_el: HTMLDivElement, mocked_props: React.ComponentProps; + + beforeAll(() => { + modal_root_el = document.createElement('div'); + modal_root_el.setAttribute('id', 'modal_root'); + document.body.appendChild(modal_root_el); + }); + + beforeEach(() => { + mocked_props = { + is_mobile: false, + is_wallet_name_visible: false, + label: 'Transfer from', + onSelectAccount: jest.fn(), + placeholder: 'Placeholder', + portal_id: 'modal_root', + setIsWalletNameVisible: jest.fn(), + transfer_accounts: { + trading_accounts: {}, + wallet_accounts: {}, + }, + transfer_hint: 'Transfer hint', + value: undefined, + wallet_name: 'USD Wallet', + }; + }); + + it('Should render placeholder, if there is no selected account', () => { + render(); + + expect(screen.getByText('Transfer from')).toBeInTheDocument(); + expect(screen.getByText('Placeholder')).toBeInTheDocument(); + expect(screen.getByTestId('dt_chevron_icon')).toBeInTheDocument(); + }); + + it('Should render WalletTransferTile if the account was selected', () => { + mocked_props.value = { + active_wallet_icon: 'Icon', + display_currency_code: 'USD', + account_type: 'wallet', + balance: 100, + currency: 'USD', + gradient_class: 'wallet-card__usd-bg', + is_demo: false, + loginid: '12345678', + shortcode: 'svg', + type: 'fiat', + icon: 'Wallet Icon', + }; + render(); + + expect(screen.getByText('Transfer from')).toBeInTheDocument(); + expect(screen.getByText('WalletTransferTile')).toBeInTheDocument(); + expect(screen.getByTestId('dt_chevron_icon')).toBeInTheDocument(); + }); + + it('Should render account selector transfer tile with default values default', () => { + render(); + + expect(screen.getByText('Transfer from')).toBeInTheDocument(); + expect(screen.getByText('Placeholder')).toBeInTheDocument(); + expect(screen.getByTestId('dt_chevron_icon')).toBeInTheDocument(); + }); + + it('Should render TransferAccountList when the user is clicking on Transfer selector', () => { + render(); + + const el_transfer_tile = screen.getByTestId('dt_transfer_account_selector'); + userEvent.click(el_transfer_tile); + + expect(screen.getByText('TransferAccountList')).toBeInTheDocument(); + }); + + it('Should render proper label', () => { + render(); + + expect(screen.getByText('Transfer from')).toBeInTheDocument(); + }); +}); diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/index.ts b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/index.ts new file mode 100644 index 000000000000..50a91c417029 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/index.ts @@ -0,0 +1,3 @@ +import TransferAccountSelector from './transfer-account-selector'; + +export default TransferAccountSelector; diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-list.tsx b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-list.tsx new file mode 100644 index 000000000000..e7239d33d9db --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-list.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Text } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import WalletTransferTile from '../wallet-transfer-tile'; +import type { TTransferAccount } from 'Types'; + +type TTransferAccountList = { + is_mobile?: boolean; + onSelectAccount?: (account: TTransferAccount) => void; + selected_account?: TTransferAccount; + setIsListModalOpen: (value: boolean) => void; + setSelectedAccount: React.Dispatch>; + transfer_accounts: Record<'trading_accounts' | 'wallet_accounts', Record>; + transfer_hint?: string | JSX.Element; + wallet_name?: string; +}; + +const TitleLine = () =>
; + +const TransferAccountList = ({ + is_mobile, + onSelectAccount, + selected_account, + setIsListModalOpen, + setSelectedAccount, + transfer_accounts, + transfer_hint, + wallet_name, +}: TTransferAccountList) => { + const is_single_list = React.useMemo( + () => + Object.keys(transfer_accounts).filter( + key => Object.keys(transfer_accounts[key as 'trading_accounts' | 'wallet_accounts']).length > 0 + ).length === 1, + [transfer_accounts] + ); + + return ( +
+ {Object.keys(transfer_accounts).map((key, idx) => { + if (Object.values(transfer_accounts[key as 'trading_accounts' | 'wallet_accounts']).length === 0) + return null; + + return ( + +
+
+ + {key === 'trading_accounts' ? ( + + ) : ( + + )} + + +
+
+ {Object.values(transfer_accounts[key as 'trading_accounts' | 'wallet_accounts']).map( + account => ( + { + setSelectedAccount(account); + if (account) onSelectAccount?.(account); + setIsListModalOpen(false); + }} + /> + ) + )} +
+
+ {transfer_hint && ( + + {transfer_hint} + + )} +
+ ); + })} +
+ ); +}; +export default React.memo(TransferAccountList); diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.scss b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.scss new file mode 100644 index 000000000000..acbaf273e617 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.scss @@ -0,0 +1,173 @@ +.transfer-account-selector { + display: flex; + align-items: center; + width: 100%; + background-color: var(--general-main-1); + padding: 0.8rem; + cursor: pointer; + + &__value { + padding: 0; + } + + &__chevron-icon { + display: flex; + margin-left: 1rem; + + @include mobile { + margin-left: auto; + } + } + + &__heading { + display: flex; + margin-bottom: 0.4rem; + } + + &__heading-with-chevron { + display: flex; + } + + &__content { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-right: auto; + width: 100%; + + @include mobile { + align-items: unset; + } + } + + &__list { + border-bottom: 4px solid $color-grey-2; + + &__container { + @include mobile { + padding: 0 1.6rem 1.6rem; + } + + .transfer-hint { + margin: 1.6rem 0; + padding: 0 0.8rem; + + @include mobile { + margin: 0.8rem 0; + padding: 0; + } + } + } + + &--is-last, + &--is-single, + &--is-mobile { + border-bottom: none; + } + + &--is-last:is(&--is-mobile) { + margin-bottom: 0.8rem; + } + + &-items { + margin-bottom: 1.6rem; + padding: 0 0.8rem; + + @include mobile { + margin-bottom: 0; + padding: 0; + } + } + + &-header { + display: flex; + padding: 1.6rem 2.4rem 0.8rem; + + @include mobile { + padding: 0.8rem 0.8rem 0.4rem; + + &__title-line { + flex-grow: 1; + border-bottom: 1px solid $color-grey-2; + margin: 0 0 0.65rem 1rem; + } + } + } + + &-tile { + padding: 1rem 2rem; + flex-direction: row; + align-items: center; + cursor: pointer; + + @include mobile { + border-radius: unset; + padding: 0.8rem; + } + + .wallet-transfer-tile__icon { + margin-right: 1.6rem; + + @include mobile { + margin-right: 0.8rem; + } + } + } + } +} + +// Overwrite modal style +.dc-modal__container_transfer-account-selector__modal-header { + max-width: 40rem; + max-height: 52.8rem !important; + + @include mobile { + max-width: unset; + max-height: unset !important; + } +} + +.dc-modal-header--transfer-account-selector__modal-header { + border-bottom: 2px solid $color-grey-2; +} + +#mobile_list_modal_root { + position: absolute; + inset: 0; + z-index: 2; + display: none; + opacity: 0; + + &:not(:empty) { + display: flex; + opacity: 1; + } + + .dc-modal { + width: 100vw; + + &__container { + max-width: unset !important; + border-radius: unset; + box-shadow: unset; + } + + &-header { + border: none; + padding: 1.6rem 2.4rem 0rem; + + &__title { + font-size: var(--text-size-xxs); + padding: 0; + margin-bottom: 0; + } + + &__close { + padding: 0; + margin: 0; + height: auto; + width: auto; + } + } + } +} diff --git a/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.tsx b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.tsx new file mode 100644 index 000000000000..b6bed30949af --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/transfer-account-selector/transfer-account-selector.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import { Div100vhContainer, Icon, Modal, Text, ThemedScrollbars } from '@deriv/components'; +import TransferAccountList from './transfer-account-list'; +import WalletTransferTile from '../wallet-transfer-tile'; +import { WalletJurisdictionBadge } from 'Components/wallet-jurisdiction-badge'; +import type { TTransferAccount } from 'Types'; +import './transfer-account-selector.scss'; + +type TTransferAccountSelectorProps = { + contentScrollHandler?: React.UIEventHandler; + is_mobile?: boolean; + is_wallet_name_visible?: boolean; + label?: string; + onSelectAccount?: (account: TTransferAccount) => void; + placeholder?: string; + portal_id?: string; + setIsWalletNameVisible?: (value: boolean) => void; + transfer_accounts: Record<'trading_accounts' | 'wallet_accounts', Record>; + transfer_hint?: string | JSX.Element; + value?: TTransferAccount; + wallet_name?: string; +}; + +type TAccountSelectorTransferTileProps = { + is_mobile?: boolean; + label?: string; + selected_account?: TTransferAccount; + placeholder?: string; +}; + +const ChevronIcon = () => { + return ( +
+ +
+ ); +}; + +const AccountSelectorTransferTile = ({ + is_mobile, + label, + placeholder, + selected_account, +}: TAccountSelectorTransferTileProps) => { + return ( + +
+
+
+ {label} +
+ + {is_mobile && } +
+ + {selected_account ? ( + + ) : ( + + {placeholder} + + )} +
+ + {!is_mobile && ( + + + + + )} +
+ ); +}; + +const TransferAccountSelector = ({ + contentScrollHandler, + is_mobile, + is_wallet_name_visible, + label, + onSelectAccount, + placeholder, + portal_id, + setIsWalletNameVisible, + transfer_accounts = { trading_accounts: {}, wallet_accounts: {} }, + transfer_hint, + value, + wallet_name, +}: TTransferAccountSelectorProps) => { + const [is_list_modal_open, setIsListModalOpen] = React.useState(false); + const [selected_account, setSelectedAccount] = React.useState(value); + + React.useEffect(() => { + setSelectedAccount(value); + }, [value]); + + const openAccountsList = () => { + setIsListModalOpen(true); + }; + + const getHeightOffset = React.useCallback(() => { + const header_height = '16.2rem'; + const collapsed_header_height = '12.2rem'; + return is_wallet_name_visible ? header_height : collapsed_header_height; + }, [is_wallet_name_visible]); + + return ( +
+ + +
+ + setIsWalletNameVisible?.(true)} + portalId={portal_id} + transition_timeout={is_mobile ? { enter: 250, exit: 0 } : 250} + title={label} + toggleModal={() => setIsListModalOpen(old => !old)} + > + + + + + + +
+ ); +}; + +export default TransferAccountSelector; diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/__tests__/wallet-transfer-tile.spec.tsx b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/__tests__/wallet-transfer-tile.spec.tsx new file mode 100644 index 000000000000..c7719d5f6b7d --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/__tests__/wallet-transfer-tile.spec.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import WalletTransferTile from '../wallet-transfer-tile'; +import userEvent from '@testing-library/user-event'; +import { render, screen } from '@testing-library/react'; + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + AppLinkedWithWalletIcon: jest.fn(() =>
AppLinkedWithWalletIcon
), + WalletIcon: jest.fn(() =>
WalletIcon
), +})); + +describe('WalletTransferTile', () => { + let mocked_props: Required>; + + beforeEach(() => { + mocked_props = { + account: { + account_type: 'trading', + balance: 100, + currency: 'USD', + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'Icon', + is_demo: false, + shortcode: 'svg', + loginid: '12345678', + type: 'fiat', + active_wallet_icon: 'Wallet Icon', + }, + className: 'classname', + has_hover: false, + icon_size: 'small', + is_active: false, + is_list_item: false, + is_mobile: false, + onClick: jest.fn(), + }; + }); + + it('Should render merged icon (App with Wallet)', () => { + render(); + + expect(screen.getByText('AppLinkedWithWalletIcon')).toBeInTheDocument(); + }); + + it('Should render single wallet icon, if there is wallet account type', () => { + mocked_props.account = { ...mocked_props.account, account_type: 'wallet' }; + render(); + + expect(screen.getByText('WalletIcon')).toBeInTheDocument(); + }); + + it('Should render jurisdiction in mobile view', () => { + mocked_props.is_list_item = false; + mocked_props.is_mobile = true; + render(); + + expect(screen.getByText('SVG')).toBeInTheDocument(); + }); + + it('Should render jurisdiction in desktop view', () => { + mocked_props.is_list_item = true; + render(); + + expect(screen.getByText('SVG')).toBeInTheDocument(); + }); + + it('Should render proper account label', () => { + render(); + + expect(screen.getByText('Deriv Apps')).toBeInTheDocument(); + }); + + it('Should render proper account balance', () => { + render(); + + expect(screen.getByText('Balance: 100.00 USD')).toBeInTheDocument(); + }); + + it('Should trigger onClick callback when the user is clicking on Wallet tile', () => { + render(); + + const el_wallet_tile = screen.getByTestId('dt_wallet_transfer_tile'); + userEvent.click(el_wallet_tile); + + expect(mocked_props.onClick).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/index.ts b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/index.ts new file mode 100644 index 000000000000..e5851511bba4 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/index.ts @@ -0,0 +1,3 @@ +import WalletTransferTile from './wallet-transfer-tile'; + +export default WalletTransferTile; diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.scss b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.scss new file mode 100644 index 000000000000..606c6b4f0890 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.scss @@ -0,0 +1,48 @@ +.wallet-transfer-tile { + display: flex; + align-items: center; + justify-content: flex-start; + background-color: var(--general-main-1); + border-radius: $BORDER_RADIUS; + flex-grow: 1; + + @include mobile { + flex-direction: column; + align-items: flex-start; + + &__icon-with-badge { + display: flex; + align-items: end; + margin-bottom: 0.4rem; + } + } + + &--hover { + &:hover { + background-color: var(--general-hover); + } + } + + &--active { + background-color: var(--state-active); + } + + &--list-item-background { + background-color: var(--general-main-2); + } + + &__icon { + margin-right: 0.8rem; + min-width: 4rem; + + @include mobile { + margin-right: 0.4rem; + } + } + + &__content { + display: flex; + flex-direction: column; + flex-grow: 1; + } +} diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.tsx b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.tsx new file mode 100644 index 000000000000..510eebfbc27c --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer-tile/wallet-transfer-tile.tsx @@ -0,0 +1,123 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Text, AppLinkedWithWalletIcon, WalletIcon } from '@deriv/components'; +import { formatMoney } from '@deriv/shared'; +import { Localize } from '@deriv/translations'; +import { getAccountName } from 'Constants/utils'; +import { WalletJurisdictionBadge } from 'Components/wallet-jurisdiction-badge'; +import type { TTransferAccount } from 'Types'; +import './wallet-transfer-tile.scss'; + +type TIconSize = + | React.ComponentProps['size'] + | React.ComponentProps['size']; + +type TWalletTileProps = { + account?: TTransferAccount; + className?: string; + has_hover?: boolean; + icon_size?: TIconSize; + is_active?: boolean; + is_list_item?: boolean; + is_mobile?: boolean; + onClick?: () => void; +}; + +const IconComponent = ({ account, icon_size }: TWalletTileProps) => { + if (account?.account_type === 'wallet') { + return account?.icon ? ( + ['size']} + type={account?.type} + /> + ) : null; + } + + return account?.icon && account?.active_wallet_icon ? ( + ['size']} + type={account?.type} + wallet_icon={account?.active_wallet_icon} + /> + ) : null; +}; + +const Balance = ({ account, is_list_item, is_mobile }: TWalletTileProps) => { + if (account?.balance !== undefined) { + let size; + if (is_list_item) size = is_mobile ? 'xxxs' : 'xxs'; + else size = is_mobile ? 'xxxxs' : 'xxxs'; + + return ( + + + + ); + } + + return null; +}; + +const Label = ({ account, is_list_item, is_mobile }: TWalletTileProps) => { + let size; + if (is_list_item) size = is_mobile ? 'xxs' : 'xs'; + else size = is_mobile ? 'xxxxs' : 'xxxs'; + + return ( + + {getAccountName({ ...account })} + + ); +}; + +const WalletTransferTile = ({ + account, + className, + has_hover, + icon_size = 'small', + is_active, + is_list_item, + is_mobile, + onClick, +}: TWalletTileProps) => { + return ( +
onClick?.()} + > +
+
+ +
+ + {!is_list_item && is_mobile && ( + + )} +
+ +
+
+ + {is_list_item && } +
+ ); +}; + +export default React.memo(WalletTransferTile); diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer.scss b/packages/appstore/src/components/wallet-transfer/wallet-transfer.scss new file mode 100644 index 000000000000..120976f2dc40 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer.scss @@ -0,0 +1,52 @@ +.wallet-transfer { + display: flex; + flex-direction: column; + max-width: 65rem; + width: 100%; + margin: 9.6rem auto 4.8rem; + + @include mobile { + margin: 4.8rem auto; + } + + &__tiles-container { + display: flex; + flex-direction: column; + } + + &__divider { + border: 0.5px solid var(--border-normal); + margin: 0.8rem 0; + } + + &__tile { + display: flex; + border: 1px solid var(--border-normal); + border-radius: $BORDER_RADIUS; + + .amount-input-wrapper { + border-radius: $BORDER_RADIUS; + flex-basis: 50%; + justify-content: space-between; + + @include mobile { + flex-basis: 60%; + } + } + + .transfer-account-selector { + border-radius: $BORDER_RADIUS; + flex-basis: 50%; + + @include mobile { + flex-basis: 40%; + } + } + } + + &__transfer-button { + margin-top: 4.8rem; + display: flex; + justify-content: flex-end; + } +} diff --git a/packages/appstore/src/components/wallet-transfer/wallet-transfer.tsx b/packages/appstore/src/components/wallet-transfer/wallet-transfer.tsx new file mode 100644 index 000000000000..f77d89aca091 --- /dev/null +++ b/packages/appstore/src/components/wallet-transfer/wallet-transfer.tsx @@ -0,0 +1,280 @@ +import React, { useEffect } from 'react'; +import classNames from 'classnames'; +import { Field, FieldProps, Formik, Form, FormikHelpers } from 'formik'; +import { AmountInput, Button, Loading, MessageList } from '@deriv/components'; +import { useWalletTransfer, useCurrencyConfig } from '@deriv/hooks'; +import { validNumber } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { localize, Localize } from '@deriv/translations'; +import TransferAccountSelector from './transfer-account-selector'; +import { getAccountName } from 'Constants/utils'; +import type { TMessageItem } from 'Types'; +import './wallet-transfer.scss'; + +type TWalletTransferProps = { + contentScrollHandler: React.UIEventHandler; + is_wallet_name_visible: boolean; + setIsWalletNameVisible: (value: boolean) => void; +}; + +const Divider = () =>
; + +const initial_demo_balance = 10000.0; + +const ERROR_CODES = { + is_demo: { + between_min_max: 'BetweenMinMax', + insufficient_fund: 'InsufficientFund', + }, +}; + +const WalletTransfer = observer(({ is_wallet_name_visible, setIsWalletNameVisible }: TWalletTransferProps) => { + const { client, ui, traders_hub } = useStore(); + const { setWalletModalActiveTab } = traders_hub; + const { is_switching } = client; + const { is_mobile } = ui; + + const { getConfig } = useCurrencyConfig(); + + const { + active_wallet, + is_accounts_loading, + from_account, + to_account, + to_account_list, + transfer_accounts, + setFromAccount, + setToAccount, + } = useWalletTransfer(); + + useEffect(() => { + if (!from_account?.loginid) { + setFromAccount(active_wallet); + } + }, [active_wallet, from_account, setFromAccount]); + + const portal_id = is_mobile ? 'mobile_list_modal_root' : 'modal_root'; + + const is_amount_to_input_disabled = !to_account; + + const active_wallet_name = getAccountName({ ...active_wallet }); + + const transfer_to_hint = React.useMemo(() => { + return to_account?.loginid === active_wallet?.loginid ? ( + + ) : ( + '' + ); + }, [active_wallet?.loginid, active_wallet_name, from_account, to_account?.loginid]); + + const [message_list, setMessageList] = React.useState([]); + + const clearErrorMessages = React.useCallback( + () => setMessageList(list => list.filter(el => el.type !== 'error')), + [] + ); + + const appendMessage = (error_code: string, message: TMessageItem) => { + setMessageList(list => { + if (list.some(el => el.key === error_code)) return list; + return [...list, message]; + }); + }; + + const validateAmount = (amount: number) => { + clearErrorMessages(); + + if (!amount || is_amount_to_input_disabled || !active_wallet?.is_demo) return; + + const { is_ok, message } = validNumber(amount.toString(), { + type: 'float', + decimals: getConfig(from_account?.currency ?? '')?.fractional_digits, + min: 1, + max: from_account?.balance, + }); + + const should_reset_balance = + active_wallet?.balance !== undefined && + amount > active_wallet?.balance && + active_wallet?.balance < initial_demo_balance; + + if (from_account?.loginid === active_wallet.loginid && should_reset_balance) { + appendMessage(ERROR_CODES.is_demo.insufficient_fund, { + variant: 'with-action-button', + key: ERROR_CODES.is_demo.insufficient_fund, + button_label: localize('Reset balance'), + onClickHandler: () => setWalletModalActiveTab('Deposit'), + message: localize( + 'You have insufficient fund in the selected wallet, please reset your virtual balance' + ), + type: 'error', + }); + } else if (!is_ok) { + //else if not wallet loginid and not is_ok message + appendMessage(ERROR_CODES.is_demo.between_min_max, { + variant: 'base', + key: ERROR_CODES.is_demo.between_min_max, + message: `${message} ${from_account?.display_currency_code}`, + type: 'error', + }); + } + }; + + const onSelectFromAccount = React.useCallback( + ( + account: typeof from_account, + resetForm: FormikHelpers<{ + to_amount: number; + from_amount: number; + }>['resetForm'] + ) => { + if (account?.loginid === from_account?.loginid) return; + setFromAccount(account); + if (account?.loginid === active_wallet?.loginid) { + setToAccount(undefined); + } else { + setToAccount(active_wallet); + } + clearErrorMessages(); + resetForm(); + }, + [active_wallet, clearErrorMessages, from_account?.loginid, setFromAccount, setToAccount] + ); + + const onSelectToAccount = React.useCallback( + ( + account: typeof to_account, + resetForm: FormikHelpers<{ + to_amount: number; + from_amount: number; + }>['resetForm'] + ) => { + if (account?.loginid === to_account?.loginid) return; + setToAccount(account); + clearErrorMessages(); + resetForm(); + }, + [clearErrorMessages, setToAccount, to_account?.loginid] + ); + + if (is_accounts_loading || is_switching) { + return ; + } + + return ( +
+ undefined} + validateOnBlur={false} + > + {({ setValues, values, resetForm }) => ( +
+
+
0, + })} + > + + {({ field }: FieldProps) => ( + el.type === 'error')} + initial_value={field.value} + label={localize('Amount you send')} + onChange={(value: number) => { + setValues({ + from_amount: value, + to_amount: is_amount_to_input_disabled ? 0 : value, + }); + }} + /> + )} + + + onSelectFromAccount(account, resetForm)} + placeholder={localize('Select a trading account or a Wallet')} + portal_id={portal_id} + setIsWalletNameVisible={setIsWalletNameVisible} + transfer_accounts={transfer_accounts} + wallet_name={active_wallet_name} + value={from_account} + /> +
+ +
+ + {({ field }: FieldProps) => ( + el.type === 'error')} + initial_value={field.value} + label={localize('Amount you receive')} + onChange={(value: number) => { + setValues({ from_amount: value, to_amount: value }); + }} + /> + )} + + + onSelectToAccount(account, resetForm)} + placeholder={!to_account ? localize('Select a trading account or a Wallet') : ''} + portal_id={portal_id} + setIsWalletNameVisible={setIsWalletNameVisible} + transfer_accounts={to_account_list} + transfer_hint={transfer_to_hint} + wallet_name={active_wallet_name} + value={to_account} + /> +
+
+
+ +
+
+ )} +
+
+ ); +}); + +export default WalletTransfer; diff --git a/packages/appstore/src/components/wallet-withdrawal/__tests__/wallet-withdrawal.test.tsx b/packages/appstore/src/components/wallet-withdrawal/__tests__/wallet-withdrawal.test.tsx new file mode 100644 index 000000000000..a6e9ec4f4b46 --- /dev/null +++ b/packages/appstore/src/components/wallet-withdrawal/__tests__/wallet-withdrawal.test.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import WalletWithdrawal from '../wallet-withdrawal'; +import { mockStore } from '@deriv/stores'; +import CashierProviders from '@deriv/cashier/src/cashier-providers'; +import { useRequest } from '@deriv/api'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useRequest: jest.fn(), +})); + +// @ts-expect-error ignore this until find a way to make arguments as partial +const mockUseRequest = useRequest as jest.MockedFunction>; + +const mock_store = mockStore({ + client: { + email: 'john@company.com', + }, + modules: { cashier: { transaction_history: { onMount: jest.fn() } } }, +}); + +describe('WalletWithdrawal', () => { + test('should render the component', () => { + // @ts-expect-error ignore this until find a way to make arguments as partial + mockUseRequest.mockReturnValue({}); + + render(, { + wrapper: ({ children }) => {children}, + }); + + expect(screen.queryByTestId('dt_empty_state_title')).toBeInTheDocument(); + expect(screen.queryByTestId('dt_empty_state_description')).toBeInTheDocument(); + expect(screen.queryByTestId('dt_empty_state_action')).toHaveTextContent('Send email'); + }); +}); diff --git a/packages/appstore/src/components/wallet-withdrawal/index.ts b/packages/appstore/src/components/wallet-withdrawal/index.ts new file mode 100644 index 000000000000..bab74c8c7b9b --- /dev/null +++ b/packages/appstore/src/components/wallet-withdrawal/index.ts @@ -0,0 +1,3 @@ +import WalletWithdrawal from './wallet-withdrawal'; + +export default WalletWithdrawal; diff --git a/packages/appstore/src/components/wallet-withdrawal/wallet-withdrawal.tsx b/packages/appstore/src/components/wallet-withdrawal/wallet-withdrawal.tsx new file mode 100644 index 000000000000..0344dfd24c92 --- /dev/null +++ b/packages/appstore/src/components/wallet-withdrawal/wallet-withdrawal.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import WithdrawalVerificationEmail from '@deriv/cashier/src/pages/withdrawal/withdrawal-verification-email'; + +const WalletWithdrawal = () => { + return ; +}; + +export default WalletWithdrawal; diff --git a/packages/appstore/src/components/wallets-banner/__tests__/wallets-banner.spec.tsx b/packages/appstore/src/components/wallets-banner/__tests__/wallets-banner.spec.tsx new file mode 100644 index 000000000000..ccc8eb85e9ee --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/__tests__/wallets-banner.spec.tsx @@ -0,0 +1,222 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import '@testing-library/jest-dom'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { TImageTestID } from 'Assets/svgs/wallets/image-types'; +import WalletsBannerUpgrade from '../wallets-banner-upgrade'; +import WalletsBannerUpgrading from '../wallets-banner-upgrading'; +import WalletsBannerReady from '../wallets-banner-ready'; + +describe('', () => { + const mockRootStore = mockStore({ + traders_hub: { + toggleWalletsUpgrade: true, + }, + }); + + describe('Should render properly with right banner if status is eligible: ', () => { + const desktop: TImageTestID = 'dt_upgrade_desktop'; + const mobile: TImageTestID = 'dt_upgrade_mobile'; + + it('Should render upgrade now button', async () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const btn = screen.getByRole('button', { name: /Upgrade now/i }); + expect(btn).toBeInTheDocument(); + }); + + it('Should render image properly for desktop', () => { + mockRootStore.ui.is_mobile = false; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(desktop_image).toBeInTheDocument(); + expect(mobile_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for mobile', () => { + mockRootStore.ui.is_mobile = true; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(mobile_image).toBeInTheDocument(); + expect(desktop_image).not.toBeInTheDocument(); + }); + }); + + describe('Should render properly with right banner if status is in_progress: ', () => { + const desktop: TImageTestID = 'dt_upgrading_desktop'; + const mobile: TImageTestID = 'dt_upgrading_mobile'; + const desktop_eu: TImageTestID = 'dt_upgrading_desktop_eu'; + const mobile_eu: TImageTestID = 'dt_upgrading_mobile_eu'; + + it('Should render right title', () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const title = screen.queryByText(/We're setting up your Wallets/i); + + expect(title).toBeInTheDocument(); + }); + + it('Should render loading dots', () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const loading_dots = screen.queryByTestId('dt_wallets_loading_dots'); + + expect(loading_dots).toBeInTheDocument(); + }); + + it('Should render image properly for desktop for Non-EU', () => { + mockRootStore.ui.is_mobile = false; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(desktop_image).toBeInTheDocument(); + expect(mobile_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for mobile for Non-EU', () => { + mockRootStore.ui.is_mobile = true; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(mobile_image).toBeInTheDocument(); + expect(desktop_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for desktop for EU', () => { + mockRootStore.ui.is_mobile = false; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop_eu); + const mobile_image = screen.queryByTestId(mobile_eu); + + expect(desktop_image).toBeInTheDocument(); + expect(mobile_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for mobile for EU', () => { + mockRootStore.ui.is_mobile = true; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop_eu); + const mobile_image = screen.queryByTestId(mobile_eu); + + expect(mobile_image).toBeInTheDocument(); + expect(desktop_image).not.toBeInTheDocument(); + }); + }); + + describe('Should render properly with right banner if status is migrated: ', () => { + const desktop: TImageTestID = 'dt_ready_desktop'; + const mobile: TImageTestID = 'dt_ready_mobile'; + const desktop_eu: TImageTestID = 'dt_ready_desktop_eu'; + const mobile_eu: TImageTestID = 'dt_ready_mobile_eu'; + + it('Should render right title', () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const title = screen.queryByText(/Your Wallets are ready/i); + + expect(title).toBeInTheDocument(); + }); + + it('Should render tick', () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const tick = screen.queryByTestId('dt_wallets_ready_tick'); + + expect(tick).toBeInTheDocument(); + }); + + it('Should render right button', () => { + render(, { + wrapper: ({ children }) => {children}, + }); + const btn = screen.queryByText('Log out'); + + expect(btn).toBeInTheDocument(); + }); + + it('Should render image properly for desktop for Non-EU', () => { + mockRootStore.ui.is_mobile = false; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(desktop_image).toBeInTheDocument(); + expect(mobile_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for mobile for Non-EU', () => { + mockRootStore.ui.is_mobile = true; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop); + const mobile_image = screen.queryByTestId(mobile); + + expect(mobile_image).toBeInTheDocument(); + expect(desktop_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for desktop for EU', () => { + mockRootStore.ui.is_mobile = false; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop_eu); + const mobile_image = screen.queryByTestId(mobile_eu); + + expect(desktop_image).toBeInTheDocument(); + expect(mobile_image).not.toBeInTheDocument(); + }); + + it('Should render image properly for mobile for EU', () => { + mockRootStore.ui.is_mobile = true; + render(, { + wrapper: ({ children }) => {children}, + }); + const desktop_image = screen.queryByTestId(desktop_eu); + const mobile_image = screen.queryByTestId(mobile_eu); + + expect(mobile_image).toBeInTheDocument(); + expect(desktop_image).not.toBeInTheDocument(); + }); + + it('Should call logout function when click on button', async () => { + render(, { + wrapper: ({ children }) => {children}, + }); + + const btn = screen.getByText('Log out'); + + await userEvent.click(btn); + + expect(btn).toBeInTheDocument(); + expect(mockRootStore.client.logout).toBeCalledTimes(1); + }); + }); +}); diff --git a/packages/appstore/src/components/wallets-banner/index.ts b/packages/appstore/src/components/wallets-banner/index.ts new file mode 100644 index 000000000000..5309a3973964 --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/index.ts @@ -0,0 +1,4 @@ +import WalletsBanner from './wallets-banner'; +import './wallets-banner.scss'; + +export default WalletsBanner; diff --git a/packages/appstore/src/components/wallets-banner/wallets-banner-ready.tsx b/packages/appstore/src/components/wallets-banner/wallets-banner-ready.tsx new file mode 100644 index 000000000000..0501b929c73c --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/wallets-banner-ready.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import WalletsImage from 'Assets/svgs/wallets'; +import { Button, Icon, Text } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import { TWalletsImagesListKey } from 'Assets/svgs/wallets/image-types'; +import { observer, useStore } from '@deriv/stores'; + +// just for now for testing purpose, in the future 'is_eu' value will be taken from the store +type TWalletsBannerReady = { + is_eu?: boolean; +}; + +const WalletsBannerReady = observer(({ is_eu }: TWalletsBannerReady) => { + const { + client: { logout }, + ui: { is_mobile }, + } = useStore(); + + const mobile_class = is_eu ? 'ready_mobile_eu' : 'ready_mobile'; + const desktop_class = is_eu ? 'ready_desktop_eu' : 'ready_desktop'; + + const image: TWalletsImagesListKey = is_mobile ? mobile_class : desktop_class; + + const title_size = is_mobile ? 'xs' : 'sm'; + const description_size = is_mobile ? 'xxxs' : 'xs'; + const tick_size = is_mobile ? 16 : 24; + + const onButtonClickHandler = async () => { + await logout(); + }; + + return ( +
+
+
+ +
+ ]} + /> + ]} + /> +
+ +
+ ); +}); + +export default WalletsBannerReady; diff --git a/packages/appstore/src/components/wallets-banner/wallets-banner-upgrade.tsx b/packages/appstore/src/components/wallets-banner/wallets-banner-upgrade.tsx new file mode 100644 index 000000000000..825891d1ce52 --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/wallets-banner-upgrade.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import WalletsImage from 'Assets/svgs/wallets'; +import { Button, Text } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import { TWalletsImagesListKey } from 'Assets/svgs/wallets/image-types'; +import { observer, useStore } from '@deriv/stores'; + +const WalletsBannerUpgrade = observer(() => { + const { traders_hub, ui } = useStore(); + const { toggleWalletsUpgrade } = traders_hub; + const { is_mobile } = ui; + + const image: TWalletsImagesListKey = is_mobile ? 'upgrade_mobile' : 'upgrade_desktop'; + const size: string = is_mobile ? 'xs' : 'm'; + + return ( +
+
+
+ , ]} + /> +
+
+ +
+ ); +}); + +export default WalletsBannerUpgrade; diff --git a/packages/appstore/src/components/wallets-banner/wallets-banner-upgrading.tsx b/packages/appstore/src/components/wallets-banner/wallets-banner-upgrading.tsx new file mode 100644 index 000000000000..0158acc3f4fe --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/wallets-banner-upgrading.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import WalletsImage from 'Assets/svgs/wallets'; +import { Text } from '@deriv/components'; +import { Localize } from '@deriv/translations'; +import { TWalletsImagesListKey } from 'Assets/svgs/wallets/image-types'; +import { observer, useStore } from '@deriv/stores'; + +// just for now for testing purpose, in the future 'is_eu' value will be taken from the store +type TWalletsBannerUpgrading = { + is_eu?: boolean; +}; + +const WalletsBannerUpgrading = observer(({ is_eu }: TWalletsBannerUpgrading) => { + const { ui } = useStore(); + const { is_mobile } = ui; + + const mobile_class = is_eu ? 'upgrading_mobile_eu' : 'upgrading_mobile'; + const desktop_class = is_eu ? 'upgrading_desktop_eu' : 'upgrading_desktop'; + const image: TWalletsImagesListKey = is_mobile ? mobile_class : desktop_class; + + const title_size = is_mobile ? 'xs' : 'sm'; + const description_size = is_mobile ? 'xxxs' : 'xs'; + + return ( +
+
+
+ + + +
+ ]} + /> + ]} + /> +
+ +
+ ); +}); + +export default WalletsBannerUpgrading; diff --git a/packages/appstore/src/components/wallets-banner/wallets-banner.scss b/packages/appstore/src/components/wallets-banner/wallets-banner.scss new file mode 100644 index 000000000000..588446d13f80 --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/wallets-banner.scss @@ -0,0 +1,188 @@ +.wallets-banner { + &__container { + position: relative; + padding-inline: 4.8rem; + margin-bottom: 2.4rem; + overflow: hidden; + + // TODO: remove this after the whole flow is finalized + background-color: var(--general-main-1); + + border: 1px solid var(--wallets-banner-border-color); + box-shadow: var(--wallet-box-shadow); + border-radius: $BORDER_RADIUS * 4; + + @include mobile { + padding: 1.4rem 1.6rem; + border-radius: $BORDER_RADIUS * 2; + } + } + + &__image { + position: absolute; + right: 0; + bottom: 0; + border-top-right-radius: $BORDER_RADIUS * 4; + border-bottom-right-radius: $BORDER_RADIUS * 4; + + @include mobile { + border-top-right-radius: $BORDER_RADIUS * 2; + border-bottom-right-radius: $BORDER_RADIUS * 2; + } + } + + &__upgrade-banner { + height: 18rem; + + @include mobile { + height: 10.8rem; + } + + &-description { + width: 45%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: baseline; + + @include mobile { + width: 70%; + } + } + + &-button { + margin-top: 0.8rem; + padding-inline: 6.7rem; + + @include mobile { + padding-inline: 1.6rem; + } + } + } + + &__upgrading-banner { + display: flex; + align-items: center; + height: 18.2rem; + + @include mobile { + height: 14.2rem; + } + + &-description { + width: 45%; + height: 80%; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: baseline; + + @include mobile { + width: 70%; + } + } + + &-loading { + span { + animation-name: loading; + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-timing-function: cubic-bezier(1, 0, 0, 1); + } + + span:nth-child(2) { + animation-delay: 0.5s; + } + + span:nth-child(3) { + animation-delay: 1s; + } + } + + &-dot { + height: 0.8rem; + width: 0.8rem; + background-color: var(--wallets-banner-dot-color); + border-radius: 50%; + display: inline-block; + margin-right: 0.6rem; + + @include mobile { + height: 0.5rem; + width: 0.5rem; + } + } + + &-image { + opacity: 50%; + height: 100%; + } + } + + &__ready-banner { + display: flex; + align-items: center; + height: 23rem; + background-color: var(--wallets-banner-ready-bg-color); + + @include mobile { + height: 19rem; + } + + &-tick { + display: flex; + justify-content: center; + align-items: center; + background-color: var(--wallets-banner-ready-tick-bg-color); + border-radius: 50%; + width: 4.8rem; + height: 4.8rem; + + @include mobile { + width: 3.2rem; + height: 3.2rem; + } + } + + &-description { + width: 45%; + height: 80%; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: baseline; + + @include mobile { + width: 70%; + } + } + + &-button { + margin-top: 0.8rem; + padding-inline: 8.6rem; + + @include mobile { + padding-inline: 5rem; + } + } + + &-image { + opacity: 90%; + height: 100%; + + @include mobile { + opacity: 100%; + } + } + } +} + +@keyframes loading { + 0% { + background-color: var(--wallets-banner-active-dot-color); + } + 100% { + opacity: var(--wallets-banner-dot-color); + } +} diff --git a/packages/appstore/src/components/wallets-banner/wallets-banner.tsx b/packages/appstore/src/components/wallets-banner/wallets-banner.tsx new file mode 100644 index 000000000000..62561f8c0a84 --- /dev/null +++ b/packages/appstore/src/components/wallets-banner/wallets-banner.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import WalletsBannerUpgrade from './wallets-banner-upgrade'; +import WalletsBannerUpgrading from './wallets-banner-upgrading'; +import WalletsBannerReady from './wallets-banner-ready'; +import { useWalletMigration } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; + +const WalletsBanner = observer(() => { + const { is_eligible, is_failed, is_in_progress, is_migrated } = useWalletMigration(); + const { traders_hub } = useStore(); + const { is_eu_user } = traders_hub; + + if (is_migrated) return ; + + if (is_eligible || is_failed) return ; + + if (is_in_progress) return ; + + return null; +}); + +export default WalletsBanner; diff --git a/packages/appstore/src/constants/mock_wallet_migration_response.ts b/packages/appstore/src/constants/mock_wallet_migration_response.ts new file mode 100644 index 000000000000..b557ff1be44b --- /dev/null +++ b/packages/appstore/src/constants/mock_wallet_migration_response.ts @@ -0,0 +1,213 @@ +import { localize } from '@deriv/translations'; +import { getWalletCurrencyIcon } from './utils'; + +const getMockWalletMigrationResponse = () => { + return [ + { + title: localize('Non-EU USD accounts'), + wallets: [ + { + wallet_details: { + balance: 0, + currency: 'USD', + icon: getWalletCurrencyIcon('USD', false), + icon_type: 'fiat', + jurisdiction_title: 'SVG', + name: 'USD', + gradient_class: 'wallet-card__usd-bg', + }, + account_list: [ + { + balance: 1000, + currency: 'USD', + account_name: 'US Dollar', + icon: 'IcCurrencyUsd', + platform: 'deriv', + }, + { + balance: 100, + currency: 'USD', + account_name: 'MT5 Derived SVG', + icon: 'IcRebrandingMt5DerivedDashboard', + platform: 'mt5', + sub_account_type: 'Derived', + landing_company_name: 'SVG', + }, + { + balance: 123, + currency: 'USD', + account_name: 'MT5 Derived BVI', + icon: 'IcRebrandingMt5DerivedDashboard', + platform: 'mt5', + sub_account_type: 'Derived', + landing_company_name: 'BVI', + }, + { + balance: 20, + currency: 'USD', + account_name: 'MT5 Derived Vanuata', + icon: 'IcRebrandingMt5DerivedDashboard', + platform: 'mt5', + sub_account_type: 'Derived', + landing_company_name: 'Vanuatu', + }, + { + balance: 100, + currency: 'USD', + account_name: 'MT5 Financial SVG', + icon: 'IcRebrandingMt5FinancialDashboard', + platform: 'mt5', + sub_account_type: 'Financial', + landing_company_name: 'SVG', + }, + { + balance: 100, + currency: 'USD', + account_name: 'MT5 Financial BVI', + icon: 'IcRebrandingMt5FinancialDashboard', + platform: 'mt5', + sub_account_type: 'Financial', + landing_company_name: 'SVG', + }, + { + balance: 100, + currency: 'USD', + account_name: 'MT5 Financial Vanuatu', + icon: 'IcRebrandingMt5FinancialDashboard', + platform: 'mt5', + sub_account_type: 'Financial', + landing_company_name: 'SVG', + }, + { + balance: 100, + currency: 'USD', + account_name: 'MT5 Financial Labuan', + icon: 'IcRebrandingMt5FinancialDashboard', + platform: 'mt5', + sub_account_type: 'Financial', + landing_company_name: 'SVG', + }, + { + balance: 150, + currency: 'USD', + account_name: 'MT5 Swap-free', + icon: 'IcRebrandingMt5SwapFree', + platform: 'mt5', + sub_account_type: 'Swap-Free', + }, + { + balance: 100, + currency: 'USD', + account_name: 'Deriv X', + icon: 'IcRebrandingDerivx', + platform: 'derivx', + }, + { + balance: 100, + currency: 'USD', + account_name: 'Deriv EZ', + icon: 'IcDerivez', + platform: 'derivez', + }, + ], + }, + ], + }, + { + title: localize('EU-regulated USD accounts'), + wallets: [ + { + wallet_details: { + balance: 0, + currency: 'USD', + icon: getWalletCurrencyIcon('USD', false), + icon_type: 'fiat', + jurisdiction_title: 'MALTA', + name: 'USD', + gradient_class: 'wallet-card__usd-bg', + }, + account_list: [ + { + balance: 1000, + currency: 'USD', + account_name: 'US Dollar', + icon: 'IcCurrencyUsd', + platform: 'deriv', + }, + { + balance: 234, + currency: 'USD', + account_name: 'MT5 CFDs', + icon: 'IcRebrandingMt5Cfds', + platform: 'mt5', + }, + ], + }, + ], + }, + { + title: localize('Cryptocurrency accounts'), + wallets: [ + { + wallet_details: { + balance: 0, + currency: 'BTC', + icon: getWalletCurrencyIcon('BTC', false), + icon_type: 'crypto', + jurisdiction_title: 'SVG', + name: 'Bitcoin', + gradient_class: 'wallet-card__btc-bg', + }, + account_list: [ + { + balance: 0.00212012, + currency: 'BTC', + account_name: 'Bitcoin', + icon: 'IcCurrencyBtc', + }, + ], + }, + { + wallet_details: { + balance: 0, + currency: 'ETH', + icon: getWalletCurrencyIcon('ETH', false), + icon_type: 'crypto', + jurisdiction_title: 'SVG', + name: 'Ethereum', + gradient_class: 'wallet-card__eth-bg', + }, + account_list: [ + { + balance: 0.00212012, + currency: 'ETH', + account_name: 'Ethereum', + icon: 'IcCurrencyEth', + }, + ], + }, + { + wallet_details: { + balance: 0, + currency: 'USDC', + icon: getWalletCurrencyIcon('USDC', false), + icon_type: 'crypto', + jurisdiction_title: 'SVG', + name: 'USD Coin', + gradient_class: 'wallet-card__usdc-bg', + }, + account_list: [ + { + balance: 0.00212012, + currency: 'USDC', + account_name: 'USD Coin', + icon: 'IcCurrencyUsdc', + }, + ], + }, + ], + }, + ]; +}; + +export default getMockWalletMigrationResponse; diff --git a/packages/appstore/src/constants/routes-config.ts b/packages/appstore/src/constants/routes-config.ts deleted file mode 100644 index 42109b352a64..000000000000 --- a/packages/appstore/src/constants/routes-config.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { localize } from '@deriv/translations'; -import TradersHub from 'Modules/traders-hub'; -import ConfigStore from 'Stores/config-store'; -import { TRoute } from 'Types'; -import Onboarding from 'Modules/onboarding'; -import CFDCompareAccounts from '@deriv/cfd/src/Containers/cfd-compare-accounts'; - -type TRoutesConfig = { - consumer_routes: ConfigStore['routes']; -}; - -// 1. Order matters! Put more specific consumer_routes at the top. -// 2. Don't use `Localize` component since native html tag like `option` cannot render them -const initRoutesConfig = ({ consumer_routes }: TRoutesConfig): TRoute[] => [ - { - path: consumer_routes.traders_hub, - component: TradersHub, - getTitle: () => localize("Trader's Hub"), - }, - { - path: consumer_routes.onboarding, - component: Onboarding, - getTitle: () => localize('Onboarding'), - }, - { - path: consumer_routes.compare_cfds, - component: CFDCompareAccounts, - getTitle: () => localize('CFDCompareAccounts'), - }, -]; - -let routes_config: Array; - -const getRoutesConfig = ({ consumer_routes }: TRoutesConfig): TRoute[] => { - // For default page route if page/path is not found, must be kept at the end of routes_config array. - if (!routes_config) { - const route_default = { getTitle: () => localize('Error 404') }; - - routes_config = initRoutesConfig({ consumer_routes }); - routes_config.push(route_default); - } - - return routes_config; -}; -export default getRoutesConfig; diff --git a/packages/appstore/src/constants/upgrade-info-lists-config.tsx b/packages/appstore/src/constants/upgrade-info-lists-config.tsx new file mode 100644 index 000000000000..468529bdd6d5 --- /dev/null +++ b/packages/appstore/src/constants/upgrade-info-lists-config.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Text } from '@deriv/components'; +import { Localize } from '@deriv/translations'; + +type TUpgradeInformationList = { + is_eu: boolean; + text_info_size: string; + form_line_height: string; +}; + +const getUpgradeInformationList = ({ is_eu, text_info_size, form_line_height }: TUpgradeInformationList) => [ + { + name: 'upgrade_info', + visibility: true, + content: ( + + ), + }, + { + name: 'open_positions', + visibility: true, + content: , + }, + { + name: 'deriv_p2p', + visibility: !is_eu, + content: ( + } + /> + ), + }, + { + name: 'payment_agents', + visibility: !is_eu, + content: ( + } + /> + ), + }, +]; + +export default getUpgradeInformationList; diff --git a/packages/appstore/src/constants/utils.ts b/packages/appstore/src/constants/utils.ts index db86a3d13da9..d089409d2c29 100644 --- a/packages/appstore/src/constants/utils.ts +++ b/packages/appstore/src/constants/utils.ts @@ -1,4 +1,6 @@ import { isMobile } from '@deriv/shared'; +import { localize } from '@deriv/translations'; +import { TTransferAccount, TWalletButton } from 'Types'; /** * This function checks whether the current item should have a border at the bottom 'aka "divider" '. @@ -20,3 +22,125 @@ export const getHasDivider = (current_item_index: number, list_size: number, ava (list_size % available_grid_columns === 0 ? available_grid_columns : list_size % available_grid_columns) ); }; + +// TODO: Moved to shared package! Delete it later, right now it uses for cashier wallet modals +// TODO: Refactor using data transformation layer pattern when we will have API for wallets (e.g. wallet.icon) +export const getWalletCurrencyIcon = (currency: string, is_dark_mode_on: boolean, is_modal = false) => { + switch (currency) { + case 'demo': + if (is_modal) return 'IcWalletDerivDemoLight'; + return is_dark_mode_on ? 'IcWalletDerivDemoDark' : 'IcWalletDerivDemoLight'; + case 'USD': + return 'IcWalletCurrencyUsd'; + case 'EUR': + return 'IcWalletCurrencyEur'; + case 'AUD': + return 'IcWalletCurrencyAud'; + case 'GBP': + return 'IcWalletCurrencyGbp'; + case 'BTC': + return is_dark_mode_on ? 'IcWalletBitcoinDark' : 'IcWalletBitcoinLight'; + case 'ETH': + return is_dark_mode_on ? 'IcWalletEtheriumDark' : 'IcWalletEtheriumLight'; + case 'USDT': + case 'eUSDT': + case 'tUSDT': + case 'UST': + if (is_modal) { + return is_dark_mode_on ? 'IcWalletModalTetherDark' : 'IcWalletModalTetherLight'; + } + return is_dark_mode_on ? 'IcWalletTetherDark' : 'IcWalletTetherLight'; + case 'LTC': + return is_dark_mode_on ? 'IcWalletLiteCoinDark' : 'IcWalletLiteCoinLight'; + case 'USDC': + return is_dark_mode_on ? 'IcWalletUsdCoinDark' : 'IcWalletUsdCoinLight'; + default: + return 'Unknown'; + } +}; + +export const getWalletHeaderButtons = (is_demo: boolean, handleAction?: () => void): TWalletButton[] => { + return is_demo + ? [ + { + name: 'Transfer', + text: localize('Transfer'), + icon: 'IcAccountTransfer', + action: () => handleAction?.(), + }, + { + name: 'Transactions', + text: localize('Transactions'), + icon: 'IcStatement', + action: () => handleAction?.(), + }, + { + name: 'Deposit', + text: localize('Reset balance'), + icon: 'IcCashierAdd', + action: () => handleAction?.(), + }, + ] + : [ + { + name: 'Deposit', + text: localize('Deposit'), + icon: 'IcCashierAdd', + action: () => handleAction?.(), + }, + { + name: 'Withdraw', + text: localize('Withdraw'), + icon: 'IcCashierMinus', + action: () => handleAction?.(), + }, + { + name: 'Transfer', + text: localize('Transfer'), + icon: 'IcAccountTransfer', + action: () => handleAction?.(), + }, + { + name: 'Transactions', + text: localize('Transactions'), + icon: 'IcStatement', + action: () => handleAction?.(), + }, + ]; +}; + +export const getAccountName = ({ + account_type, + mt5_market_type, + display_currency_code, +}: Partial>): string => { + switch (account_type) { + case 'trading': + return localize('Deriv Apps'); + case 'mt5': { + switch (mt5_market_type) { + case 'financial': + return localize('MT5 Financial'); + case 'synthetic': + return localize('MT5 Derived'); + case 'all': + return localize('MT5 Swap-free'); + default: + return ''; + } + } + case 'derivez': + return localize('Deriv EZ'); + case 'dxtrade': + return localize('Deriv X'); + // @ts-expect-error Need to update @deriv/api-types to fix the TS error + case 'ctrader': + return localize('Deriv cTrader'); + case 'wallet': + return localize('{{display_currency_code}} Wallet', { + display_currency_code, + }); + default: + return ''; + } +}; diff --git a/packages/appstore/src/constants/wallet-mocked-response.ts b/packages/appstore/src/constants/wallet-mocked-response.ts new file mode 100644 index 000000000000..ba8ab7d627d7 --- /dev/null +++ b/packages/appstore/src/constants/wallet-mocked-response.ts @@ -0,0 +1,43 @@ +// TODO: Remove this file once we have the real API response +const wallets = [ + { + name: 'USD Wallet', + currency: 'usd', + icon: 'IcCurrencyUsd', + balance: 100000, + icon_type: 'fiat', + state: 'default', + jurisdiction_title: 'svg', + }, + { + name: 'USD Wallet', + currency: 'usd', + icon: 'IcCurrencyUsd', + balance: 100000, + icon_type: 'fiat', + state: 'default', + jurisdiction_title: 'svg', + }, + { + name: 'MT5 Derived Demo', + currency: 'usd', + icon: 'IcRebrandingMt5Logo', + wallet_icon: 'IcWalletDerivDemoLight', + balance: 879, + icon_type: 'app', + app: 'mt5', + state: 'default', + is_demo: true, + }, + { + name: 'Bitcoin Wallet', + currency: 'btc', + icon: 'IcCashierBitcoinLight', + balance: 0.003546, + icon_type: 'crypto', + state: 'default', + jurisdiction_title: 'svg', + }, +]; + +export default wallets; diff --git a/packages/appstore/src/constants/wallet_description_mapper.ts b/packages/appstore/src/constants/wallet_description_mapper.ts new file mode 100644 index 000000000000..914c2d1a63af --- /dev/null +++ b/packages/appstore/src/constants/wallet_description_mapper.ts @@ -0,0 +1,27 @@ +import { localize } from '@deriv/translations'; + +type TWalletDescriptionMapper = { + [key: string]: string; +}; + +const wallet_description_mapper: TWalletDescriptionMapper = { + AUD: localize('Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.'), + EUR: localize( + 'Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.' + ), + USD: localize('Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.'), + BTC: localize( + "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain." + ), + ETH: localize('Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.'), + LTC: localize( + 'Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.' + ), + USDC: localize('Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.'), + eUSDT: localize('Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.'), + tUSDT: localize('Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.'), + UST: localize('Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.'), + PaymentAgent: localize('Deposit and withdraw funds via authorised, independent payment agents.'), +}; + +export default wallet_description_mapper; diff --git a/packages/appstore/src/constants/wallets-intro-content-config.tsx b/packages/appstore/src/constants/wallets-intro-content-config.tsx new file mode 100644 index 000000000000..9cc822735c3c --- /dev/null +++ b/packages/appstore/src/constants/wallets-intro-content-config.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import WalletsImage from 'Assets/svgs/wallets'; +import { localize, Localize } from '@deriv/translations'; + +const getWalletsIntroContent = (is_eu: boolean) => [ + { + image: , + title: localize('Introducing Wallets'), + description: is_eu ? localize('A new way to manage your funds') : localize('A better way to manage your funds'), + bullets: [ + is_eu ? localize('One Wallet for all your transactions') : localize('One Wallet, one currency'), + is_eu + ? localize('Keep track of your trading funds in one place') + : localize('A Wallet for each currency to focus your funds'), + !is_eu && ( + + ), + ], + }, + { + image: , + title: localize('How it works'), + description: is_eu ? localize('Simply add your funds and trade') : localize('Get a Wallet, add funds, trade'), + bullets: [ + !is_eu && localize('Get a Wallet for the currency you want'), + localize('Add funds to your Wallet via your favourite payment method'), + localize('Move funds to your trading account to start trading'), + ], + }, + { + image: , + title: localize('What happens to my trading accounts'), + description: localize("We'll link them"), + bullets: [ + is_eu + ? localize("We'll connect your existing USD trading account(s) to your new USD Wallet ") + : localize("We'll connect your existing trading accounts of the same currency to your new Wallet"), + !is_eu && localize('For example, all your USD trading account(s) will be linked to your USD Wallet'), + ], + }, +]; + +export default getWalletsIntroContent; diff --git a/packages/appstore/src/modules/traders-hub/__tests__/index.spec.tsx b/packages/appstore/src/modules/traders-hub/__tests__/index.spec.tsx index fd2f3eddabd5..bbe3c8f1b4ad 100644 --- a/packages/appstore/src/modules/traders-hub/__tests__/index.spec.tsx +++ b/packages/appstore/src/modules/traders-hub/__tests__/index.spec.tsx @@ -2,17 +2,22 @@ import React from 'react'; import { ContentFlag } from '@deriv/shared'; import { StoreProvider, mockStore } from '@deriv/stores'; import { render, screen } from '@testing-library/react'; +import { APIProvider } from '@deriv/api'; import TradersHub from '..'; jest.mock('Components/modals/modal-manager', () => jest.fn(() => 'mockedModalManager')); +jest.mock('Components/main-title-bar', () => jest.fn(() => 'mockedMainTitleBar')); jest.mock('Components/cfds-listing', () => jest.fn(() => 'mockedCFDsListing')); jest.mock('Components/options-multipliers-listing', () => jest.fn(() => 'mocked')); +jest.mock('../../tour-guide/tour-guide', () => jest.fn(() => 'mocked')); describe('TradersHub', () => { const render_container = (mock_store_override = {}) => { const mock_store = mockStore(mock_store_override); const wrapper = ({ children }: { children: JSX.Element }) => ( - {children} + + {children} + ); return render(, { diff --git a/packages/appstore/src/modules/traders-hub/index.tsx b/packages/appstore/src/modules/traders-hub/index.tsx index ac99a42f880d..c18f45c1ac9a 100644 --- a/packages/appstore/src/modules/traders-hub/index.tsx +++ b/packages/appstore/src/modules/traders-hub/index.tsx @@ -12,7 +12,7 @@ import classNames from 'classnames'; import TourGuide from '../tour-guide/tour-guide'; import './traders-hub.scss'; -const TradersHub = () => { +const TradersHub = observer(() => { const { traders_hub, client, ui } = useStore(); const { notification_messages_ui: Notifications, is_mobile } = ui; const { is_landing_company_loaded, is_logged_in, is_switching, is_logging_in, is_account_setting_loaded } = client; @@ -123,6 +123,6 @@ const TradersHub = () => { )} ); -}; +}); -export default observer(TradersHub); +export default TradersHub; diff --git a/packages/appstore/src/modules/wallets/desktop-wallets-list.tsx b/packages/appstore/src/modules/wallets/desktop-wallets-list.tsx new file mode 100644 index 000000000000..7889ef84ddff --- /dev/null +++ b/packages/appstore/src/modules/wallets/desktop-wallets-list.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { useWalletsList } from '@deriv/hooks'; +import { observer } from '@deriv/stores'; +import Wallet from 'Components/containers/wallet'; + +const DesktopWalletsList = observer(() => { + const { data } = useWalletsList(); + + return ( + + {data?.map(wallet => ( + + ))} + + ); +}); + +export default DesktopWalletsList; diff --git a/packages/appstore/src/modules/wallets/index.ts b/packages/appstore/src/modules/wallets/index.ts new file mode 100644 index 000000000000..b8cb10bdc8c3 --- /dev/null +++ b/packages/appstore/src/modules/wallets/index.ts @@ -0,0 +1 @@ +export { default as WalletsModule } from './wallets'; diff --git a/packages/appstore/src/modules/wallets/mobile-wallets-carousel.tsx b/packages/appstore/src/modules/wallets/mobile-wallets-carousel.tsx new file mode 100644 index 000000000000..df31999b94e8 --- /dev/null +++ b/packages/appstore/src/modules/wallets/mobile-wallets-carousel.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { ButtonToggle } from '@deriv/components'; +import { useActiveWallet, useContentFlag } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import ButtonToggleLoader from 'Components/pre-loader/button-toggle-loader'; +import WalletCardsCarousel from 'Components/wallet-cards-carousel'; +import WalletCFDsListing from 'Components/wallet-content/wallet-cfds-listing'; +import WalletOptionsAndMultipliersListing from 'Components/wallet-content/wallet-option-multipliers-listing'; +import classNames from 'classnames'; + +const MobileWalletsCarousel = observer(() => { + const { client, traders_hub } = useStore(); + const { is_landing_company_loaded } = client; + const { selected_platform_type, setTogglePlatformType, is_eu_user } = traders_hub; + const { is_eu_demo, is_eu_real } = useContentFlag(); + const eu_title = is_eu_demo || is_eu_real || is_eu_user; + const active_wallet = useActiveWallet(); + + const platform_toggle_options = [ + { text: 'CFDs', value: 'cfd' }, + { text: eu_title ? 'Multipliers' : 'Options & Multipliers', value: 'options' }, + ]; + + const platformTypeChange = (event: { target: { value: string; name: string } }) => { + setTogglePlatformType(event.target.value); + }; + + return ( + <> + +
+ {is_landing_company_loaded ? ( + + ) : ( + + )} + {selected_platform_type === 'cfd' && } + {selected_platform_type === 'options' && } +
+ + ); +}); + +export default MobileWalletsCarousel; diff --git a/packages/appstore/src/modules/wallets/wallets.scss b/packages/appstore/src/modules/wallets/wallets.scss new file mode 100644 index 000000000000..a152a1057e9c --- /dev/null +++ b/packages/appstore/src/modules/wallets/wallets.scss @@ -0,0 +1,25 @@ +.wallets-module { + display: flex; + min-height: calc(100vh - 84px); + background-color: var(--general-section-1); + + @include mobile { + min-height: 100vh; + } + + &__content { + width: 100%; + max-width: 131.2rem; + margin: auto; + display: flex; + padding: 4rem; + flex-direction: column; + align-items: center; + gap: 2.4rem; + align-self: stretch; + + @include mobile { + padding: 2.4rem 0; + } + } +} diff --git a/packages/appstore/src/modules/wallets/wallets.tsx b/packages/appstore/src/modules/wallets/wallets.tsx new file mode 100644 index 000000000000..7704a25adaa6 --- /dev/null +++ b/packages/appstore/src/modules/wallets/wallets.tsx @@ -0,0 +1,37 @@ +import React, { useEffect } from 'react'; +import { ThemedScrollbars, Loading } from '@deriv/components'; +import { useActiveWallet, useWalletsList } from '@deriv/hooks'; +import { observer, useStore } from '@deriv/stores'; +import AddMoreWallets from 'Components/add-more-wallets'; +import ModalManager from 'Components/modals/modal-manager'; +import DesktopWalletsList from './desktop-wallets-list'; +import MobileWalletsCarousel from './mobile-wallets-carousel'; +import './wallets.scss'; + +const Wallets = observer(() => { + const { client, ui } = useStore(); + const { switchAccount, is_authorize } = client; + const { is_mobile } = ui; + const { data } = useWalletsList(); + const active_wallet = useActiveWallet(); + + useEffect(() => { + if (!active_wallet && data && data?.length) { + switchAccount(data[0].loginid); + } + }, [active_wallet, data, switchAccount]); + + if (!is_authorize) return ; + + return ( + +
+ {is_mobile ? : } + +
+ +
+ ); +}); + +export default Wallets; diff --git a/packages/appstore/src/public/images/wallet-header-demo-bg-dark.svg b/packages/appstore/src/public/images/wallet-header-demo-bg-dark.svg new file mode 100644 index 000000000000..0689dc76a1c5 --- /dev/null +++ b/packages/appstore/src/public/images/wallet-header-demo-bg-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/public/images/wallet-header-demo-bg.svg b/packages/appstore/src/public/images/wallet-header-demo-bg.svg new file mode 100644 index 000000000000..1625156e5725 --- /dev/null +++ b/packages/appstore/src/public/images/wallet-header-demo-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/appstore/src/services/websocket.ts b/packages/appstore/src/services/websocket.ts deleted file mode 100644 index b2ac6e22830e..000000000000 --- a/packages/appstore/src/services/websocket.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { DerivWS } from 'Types'; - -let ws: DerivWS = null; - -export const useWs = (): DerivWS => ws; - -export const initWs = (ws_instance: DerivWS): void => (ws = ws_instance); diff --git a/packages/appstore/src/stores/base-store.ts b/packages/appstore/src/stores/base-store.ts deleted file mode 100644 index b24a80ad456d..000000000000 --- a/packages/appstore/src/stores/base-store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import RootStore from './root-store'; - -export default class BaseStore { - public root_store: RootStore; - - public constructor(root_store: RootStore) { - this.root_store = root_store; - } -} diff --git a/packages/appstore/src/stores/config-store.ts b/packages/appstore/src/stores/config-store.ts deleted file mode 100644 index 7b92e450171a..000000000000 --- a/packages/appstore/src/stores/config-store.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { TConfigProps } from 'Types'; -import BaseStore from './base-store'; - -export default class ConfigStore extends BaseStore { - public has_router = true; - public routes = { - traders_hub: '/appstore/traders-hub', - onboarding: '/appstore/onboarding', - compare_cfds: '/appstore/compare-accounts', - - my_apps: '/my-apps', - explore: '/explore', - about_us: '/about-us', - resources: '/resources', - - market_commodities: '/markets/commodities', - market_forex: '/markets/forex', - market_stock: '/markets/stock', - market_synthetic: '/markets/synthetic', - markets: '/markets', - - platform_binary_bot: '/platforms/binary-bot', - platform_dbot: '/platforms/dbot', - platform_dmt5: '/platforms/dmt5', - platform_dmt5_financial: '/platforms/dmt5-financial', - platform_dmt5_financial_stp: '/platforms/dmt5-financial-stp', - platform_dmt5_synthetic: '/platforms/dmt5-synthetic', - platform_dtrader: '/platforms/dtrader', - platform_smarttrader: '/platforms/smarttrader', - platforms: '/platforms', - - trade_type_cfds: '/trade-types/cfds', - trade_type_multipliers: '/trade-types/multipliers', - trade_type_options: '/trade-types/options', - trade_types: '/trade-types', - - wallet_bank_wire: '/wallets/bank-wire', - wallet_cards: '/wallets/cards', - wallet_crypto: '/wallets/crypto', - wallet_ewallet: '/wallets/ewallet', - wallets: '/wallets', - }; - - public setConfig(config: TConfigProps): void { - this.has_router = config.has_router; - this.routes = config.routes; - } -} diff --git a/packages/appstore/src/stores/index.ts b/packages/appstore/src/stores/index.ts index 7f15b07398b9..86259b611fcd 100644 --- a/packages/appstore/src/stores/index.ts +++ b/packages/appstore/src/stores/index.ts @@ -1,18 +1,4 @@ -import * as React from 'react'; -import { initWs } from 'Services/websocket'; -import { TRootStore } from 'Types'; -import RootStore from './root-store'; - -let stores_context: React.Context; - -export const initContext = (core_store: TRootStore, websocket: Record): void => { - if (!stores_context) { - const root_store = new RootStore(core_store); - stores_context = React.createContext(root_store); - - initWs(websocket); - } -}; +import { useStore } from '@deriv/stores'; /** @deprecated Use `useStore` from `@deriv/stores` package instead. */ -export const useStores = (): TRootStore => React.useContext(stores_context); +export const useStores: () => any = useStore; diff --git a/packages/appstore/src/stores/root-store.ts b/packages/appstore/src/stores/root-store.ts deleted file mode 100644 index 471185b72deb..000000000000 --- a/packages/appstore/src/stores/root-store.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TRootStore } from 'Types'; -import ConfigStore from './config-store'; - -export default class RootStore { - public config: ConfigStore; - public ws: unknown; - public client: Record; - public common: Record; - public ui: Record; - public modules: Record; - public notifications: Record; - public traders_hub: Record; - - public constructor(core_store: TRootStore) { - this.config = new ConfigStore(this); - this.client = core_store.client; - this.common = core_store.common; - this.ui = core_store.ui; - this.modules = core_store.modules; - this.notifications = core_store.notifications; - this.traders_hub = core_store.traders_hub; - } -} diff --git a/packages/appstore/src/types/api.types.ts b/packages/appstore/src/types/api.types.ts deleted file mode 100644 index 90ebe40a82b9..000000000000 --- a/packages/appstore/src/types/api.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type TErrorResponse = - | { - message: string; - code: string; - } - | undefined; diff --git a/packages/appstore/src/types/common.types.ts b/packages/appstore/src/types/common.types.ts index 846ee2f212c4..7bd4ef4ece1b 100644 --- a/packages/appstore/src/types/common.types.ts +++ b/packages/appstore/src/types/common.types.ts @@ -1,4 +1,6 @@ import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; +import { useWalletsList, useAvailableWallets } from '@deriv/hooks'; +import { useStore } from '@deriv/stores'; import { PlatformIcons } from 'Assets/svgs/trading-platform'; import { RegionAvailability } from 'Constants/platform-config'; @@ -134,6 +136,8 @@ export interface AvailableAccount { market_type?: 'all' | 'financial' | 'synthetic'; icon: keyof typeof PlatformIcons; availability: RegionAvailability; + short_code_and_region?: string; + login?: string; } export type Currency = @@ -167,3 +171,73 @@ export interface AccountListDetail { loginid: string; title: string; } + +export type TAccountStatus = 'pending' | 'failed' | 'need_verification' | ''; +export type TWalletCurrency = + | Extract + | 'USDT' + | 'eUSDT' + | 'tUSDT'; +export type TWalletShortcode = Extract; +export type TLinkedTo = { + loginid?: string; + platform?: string; + balance?: string; + currency?: string; +}; + +export type TWalletAccount = NonNullable['data']>[number]; +export type TWalletInfo = NonNullable['data']>[number]; + +export type TTransferAccount = { + active_wallet_icon: string | undefined; + account_type?: 'wallet' | 'trading' | 'dxtrade' | 'mt5' | 'derivez' | 'binary' | 'ctrader'; + balance: number; + currency?: string; + display_currency_code: string | undefined; + gradient_class?: `wallet-card__${string}`; + icon?: string; + is_demo: boolean; + loginid?: string; + mt5_market_type?: 'all' | 'financial' | 'synthetic'; + shortcode: string | undefined; + type: 'fiat' | 'crypto' | 'demo'; +}; + +export type TMessageItem = + | { + variant: 'base'; + key: string; + type: 'info' | 'error' | 'success'; + message: string | JSX.Element; + } + | { + variant: 'with-action-button'; + onClickHandler: VoidFunction; + button_label: string; + key: string; + type: 'info' | 'error' | 'success'; + message: string | JSX.Element; + }; + +export type TWalletButton = { + name: Parameters['traders_hub']['setWalletModalActiveTab']>[0]; + text: string; + icon: string; + action: () => void; +}; + +export type TWalletSteps = { + handleBack: () => void; + handleClose: () => void; + handleNext: () => void; + is_disabled: boolean; + toggleCheckbox: () => void; + upgradeToWallets: (value: boolean) => void; +}; + +export type TRealWalletsUpgradeSteps = { + wallet_upgrade_steps: TWalletSteps & { + current_step: number; + }; +}; diff --git a/packages/appstore/src/types/index.ts b/packages/appstore/src/types/index.ts index edc109feef38..237db8bfebe2 100644 --- a/packages/appstore/src/types/index.ts +++ b/packages/appstore/src/types/index.ts @@ -1,6 +1 @@ -export * from './props.types'; -export * from './stores.types'; -export * from './params.types'; -export * from './api.types'; -export * from './ws.types'; export * from './common.types'; diff --git a/packages/appstore/src/types/params.types.ts b/packages/appstore/src/types/params.types.ts deleted file mode 100644 index 182bbc23e79d..000000000000 --- a/packages/appstore/src/types/params.types.ts +++ /dev/null @@ -1,30 +0,0 @@ -export type TRoute = { - component?: any; - default?: boolean; - exact?: boolean; - getTitle?: () => string; - icon?: string; - is_authenticated?: boolean; - is_routed?: boolean; - is_modal?: boolean; - label?: string; - path?: string; - routes?: TRoute[]; - subroutes?: TRoute[]; - to?: string; - is_logged_in?: boolean; - is_logging_in?: boolean; -}; - -export type TRouteGroup = { - default?: boolean; - icon?: string; - getTitle?: () => string; - path?: string; - subitems?: number[]; -}; -export type TRouteConfig = TRoute & { - is_modal?: boolean; - is_authenticated?: boolean; - routes?: TRoute[]; -}; diff --git a/packages/appstore/src/types/props.types.ts b/packages/appstore/src/types/props.types.ts deleted file mode 100644 index ed94bb03b11d..000000000000 --- a/packages/appstore/src/types/props.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import ConfigStore from 'Stores/config-store'; - -export type TConfigProps = { - has_router: boolean; - routes: ConfigStore['routes']; -}; diff --git a/packages/appstore/src/types/stores.types.ts b/packages/appstore/src/types/stores.types.ts deleted file mode 100644 index 690863da4f7e..000000000000 --- a/packages/appstore/src/types/stores.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import ConfigStore from 'Stores/config-store'; - -export type TRootStore = { - ui: Record; - common: Record; - client: Record; - config: ConfigStore; - modules: Record; - notifications: Record; - traders_hub: Record; -}; diff --git a/packages/appstore/src/types/ws.types.ts b/packages/appstore/src/types/ws.types.ts deleted file mode 100644 index 8dc541ad5384..000000000000 --- a/packages/appstore/src/types/ws.types.ts +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type DerivWS = any; diff --git a/packages/appstore/webpack.config.js b/packages/appstore/webpack.config.js index 2326f6fd28df..ea6310164228 100644 --- a/packages/appstore/webpack.config.js +++ b/packages/appstore/webpack.config.js @@ -107,9 +107,6 @@ module.exports = function (env) { 'style-loader', { loader: 'css-loader', - options: { - url: (_, resourcePath) => resourcePath.includes('packages/wallets'), - }, }, { loader: 'postcss-loader', @@ -158,6 +155,15 @@ module.exports = function (env) { include: /public\//, use: svg_loaders, }, + { + test: /\.svg$/, + exclude: [/node_modules/, path.resolve('../', 'wallets')], + include: /public\//, + type: 'asset/resource', + generator: { + filename: 'appstore/public/[name].[contenthash][ext]', + }, + }, { test: /\.svg$/, exclude: [/node_modules|public\//], diff --git a/packages/bot-skeleton/package.json b/packages/bot-skeleton/package.json index f396b5a390ac..afcdb7aea322 100644 --- a/packages/bot-skeleton/package.json +++ b/packages/bot-skeleton/package.json @@ -35,7 +35,7 @@ "eslint-plugin-react-hooks": "^4.2.0" }, "dependencies": { - "@deriv/deriv-api": "^1.0.11", + "@deriv/deriv-api": "^1.0.13", "@deriv/indicators": "^1.0.0", "@deriv/js-interpreter": "^3.0.0", "@deriv/shared": "^1.0.0", diff --git a/packages/bot-skeleton/src/scratch/dbot.js b/packages/bot-skeleton/src/scratch/dbot.js index 0eadcfcc3f29..312aef9128ef 100644 --- a/packages/bot-skeleton/src/scratch/dbot.js +++ b/packages/bot-skeleton/src/scratch/dbot.js @@ -1,14 +1,16 @@ -import './blockly'; -import { isAllRequiredBlocksEnabled, updateDisabledBlocks, validateErrorOnBlockDelete } from './utils'; -import main_xml from './xml/main.xml'; -import DBotStore from './dbot-store'; import { save_types } from '../constants'; import { config } from '../constants/config'; -import { getSavedWorkspaces, saveWorkspaceToRecent } from '../utils/local-storage'; -import { observer as globalObserver, compareXml } from '../utils'; +import { api_base } from '../services/api/api-base'; import ApiHelpers from '../services/api/api-helpers'; import Interpreter from '../services/tradeEngine/utils/interpreter'; -import { api_base } from '../services/api/api-base'; +import { compareXml,observer as globalObserver } from '../utils'; +import { getSavedWorkspaces, saveWorkspaceToRecent } from '../utils/local-storage'; + +import main_xml from './xml/main.xml'; +import DBotStore from './dbot-store'; +import { isAllRequiredBlocksEnabled, updateDisabledBlocks, validateErrorOnBlockDelete } from './utils'; + +import './blockly'; class DBot { constructor() { diff --git a/packages/bot-web-ui/package-lock.json b/packages/bot-web-ui/package-lock.json index dd2b96df9265..d67f84ddb208 100644 --- a/packages/bot-web-ui/package-lock.json +++ b/packages/bot-web-ui/package-lock.json @@ -95,7 +95,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@deriv/deriv-api": "^1.0.11", + "@deriv/deriv-api": "^1.0.13", "@deriv/indicators": "^1.0.0", "@deriv/js-interpreter": "^3.0.0", "@deriv/shared": "^1.0.0", diff --git a/packages/bot-web-ui/package.json b/packages/bot-web-ui/package.json index 286723187417..85012700679b 100644 --- a/packages/bot-web-ui/package.json +++ b/packages/bot-web-ui/package.json @@ -70,7 +70,7 @@ "@datadog/browser-logs": "^4.36.0", "@deriv/bot-skeleton": "^1.0.0", "@deriv/components": "^1.0.0", - "@deriv/deriv-charts": "1.3.6", + "@deriv/deriv-charts": "1.4.0", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", "@deriv/translations": "^1.0.0", diff --git a/packages/bot-web-ui/src/components/bot-notification-messages/__tests__/bot-notification-messages.spec.tsx b/packages/bot-web-ui/src/components/bot-notification-messages/__tests__/bot-notification-messages.spec.tsx index 0d78d55be055..0341c0e713a0 100644 --- a/packages/bot-web-ui/src/components/bot-notification-messages/__tests__/bot-notification-messages.spec.tsx +++ b/packages/bot-web-ui/src/components/bot-notification-messages/__tests__/bot-notification-messages.spec.tsx @@ -16,9 +16,6 @@ jest.mock('@deriv/bot-skeleton', () => ({ ...jest.requireActual('@deriv/bot-skeleton'), blocksCoordinate: jest.fn(), })); -jest.mock('@deriv/deriv-charts', () => ({ - setSmartChartsPublicPath: jest.fn(), -})); describe('BotNotificationMessages', () => { let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; diff --git a/packages/bot-web-ui/src/components/chart/__tests__/toolbar-widgets.spec.tsx b/packages/bot-web-ui/src/components/chart/__tests__/toolbar-widgets.spec.tsx index 0e0effa13c49..07a9b8c8eedc 100644 --- a/packages/bot-web-ui/src/components/chart/__tests__/toolbar-widgets.spec.tsx +++ b/packages/bot-web-ui/src/components/chart/__tests__/toolbar-widgets.spec.tsx @@ -22,6 +22,7 @@ jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); // // Mocking the imports from @deriv/deriv-charts jest.mock('@deriv/deriv-charts', () => ({ + ...jest.requireActual('@deriv/deriv-charts'), __esModule: true, ChartMode: jest.fn(() =>
Mocked ChartMode
), DrawTools: jest.fn(() =>
Mocked DrawTools
), @@ -29,7 +30,6 @@ jest.mock('@deriv/deriv-charts', () => ({ StudyLegend: jest.fn(() =>
Mocked StudyLegend
), ToolbarWidget: jest.fn(({ children }) =>
{children}
), Views: jest.fn(() =>
Mocked Views
), - setSmartChartsPublicPath: jest.fn(), })); describe('ToolbarWidgets', () => { diff --git a/packages/bot-web-ui/src/components/contract-card-loading/__tests__/contract-card-loading.spec.tsx b/packages/bot-web-ui/src/components/contract-card-loading/__tests__/contract-card-loading.spec.tsx index c947b59ac3d6..fa7935458d2f 100644 --- a/packages/bot-web-ui/src/components/contract-card-loading/__tests__/contract-card-loading.spec.tsx +++ b/packages/bot-web-ui/src/components/contract-card-loading/__tests__/contract-card-loading.spec.tsx @@ -13,10 +13,6 @@ jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ })); jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); -jest.mock('@deriv/deriv-charts', () => ({ - setSmartChartsPublicPath: jest.fn(), -})); - describe('ContractCardLoader', () => { let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element; beforeAll(() => { diff --git a/packages/bot-web-ui/src/components/contract-result-overlay/contract-result-overlay.spec.tsx b/packages/bot-web-ui/src/components/contract-result-overlay/contract-result-overlay.spec.tsx index 277e5ea6c0de..155ca9a8418b 100644 --- a/packages/bot-web-ui/src/components/contract-result-overlay/contract-result-overlay.spec.tsx +++ b/packages/bot-web-ui/src/components/contract-result-overlay/contract-result-overlay.spec.tsx @@ -13,9 +13,6 @@ jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ unHighlightAllBlocks: jest.fn(), })); jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); -jest.mock('@deriv/deriv-charts', () => ({ - setSmartChartsPublicPath: jest.fn(), -})); describe('ContractResultOverlay', () => { let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; 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 a7bfbcde7dcd..3caffd8258e4 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 @@ -1,11 +1,14 @@ import React from 'react'; import classNames from 'classnames'; + import { observer } from '@deriv/stores'; + import { useDBotStore } from '../../../stores/useDBotStore'; import LoadModal from '../../load-modal'; import SaveModal from '../dashboard-component/load-bot-preview/save-modal'; import BotBuilderTourHandler from '../dbot-tours/bot-builder-tour'; import QuickStrategy from '../quick-strategy'; + import WorkspaceWrapper from './workspace-wrapper'; const BotBuilder = observer(() => { 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 4110c8d34bdf..3a4028460580 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,5 +1,6 @@ import React from 'react'; -import { isDesktop, isMobile } from '@deriv/shared'; +import { useStore } from '@deriv/stores'; +// eslint-disable-next-line import/no-extraneous-dependencies import { render, screen } from '@testing-library/react'; import { useDBotStore } from 'Stores/useDBotStore'; import Toolbar from '..'; @@ -33,10 +34,14 @@ jest.mock('Stores/useDBotStore', () => ({ useDBotStore: jest.fn(() => mockDbotStore), })); -jest.mock('@deriv/shared', () => ({ - ...jest.requireActual('@deriv/shared'), - isMobile: jest.fn(() => false), - isDesktop: jest.fn(() => true), +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), })); describe('Toolbar component', () => { @@ -61,8 +66,11 @@ describe('Toolbar component', () => { }); it('Toolbar should renders a button, when it is mobile version', async () => { - (isDesktop as jest.Mock).mockReturnValue(false); - (isMobile as jest.Mock).mockReturnValue(true); + (useStore as jest.Mock).mockReturnValue({ + ui: { + is_mobile: true, + }, + }); render(); expect(await screen.findByRole('button')).toBeInTheDocument(); }); 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 4b1fcd1b3141..e2eb70bbe3b6 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,7 +1,6 @@ import React from 'react'; import { Dialog } from '@deriv/components'; -import { isMobile } from '@deriv/shared'; -import { observer } from '@deriv/stores'; +import { observer, useStore } from '@deriv/stores'; import { Localize, localize } from '@deriv/translations'; import { useDBotStore } from 'Stores/useDBotStore'; import ToolbarButton from './toolbar-button'; @@ -9,6 +8,9 @@ import WorkspaceGroup from './workspace-group'; const Toolbar = observer(() => { const { run_panel, save_modal, load_modal, toolbar, quick_strategy } = useDBotStore(); + const { + ui: { is_mobile }, + } = useStore(); const { has_redo_stack, has_undo_stack, @@ -32,7 +34,7 @@ const Toolbar = observer(() => {
- {isMobile() && ( + {is_mobile && ( { ]} /> ) : ( - localize('Any unsaved changes will be lost.') + )} 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 9e904e5bfa07..7dac2d6e335e 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,7 +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'; jest.mock('@deriv/components', () => { 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 0786c435beb1..977df2d29739 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,11 +1,15 @@ 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 { useDBotStore } from 'Stores/useDBotStore'; + import OnboardTourHandler from '../dbot-tours/onboarding-tour'; + import Local from './load-bot-preview/local'; import Cards from './cards'; import InfoPanel from './info-panel'; 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 04bca7895733..06c29f16119a 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,14 +1,18 @@ import React from 'react'; import classNames from 'classnames'; + import { DesktopWrapper, Icon, MobileWrapper, Modal, Text } from '@deriv/components'; -import { isMobile } from '@deriv/shared'; -import { observer } from '@deriv/stores'; +import { observer, useStore } from '@deriv/stores'; + import { DBOT_TABS } from 'Constants/bot-contents'; import { useDBotStore } from 'Stores/useDBotStore'; + import { SIDEBAR_INTRO } from './constants'; const InfoPanel = observer(() => { - const is_mobile = isMobile(); + const { + ui: { is_mobile }, + } = useStore(); const { dashboard } = useDBotStore(); const { active_tour, is_info_panel_visible, setActiveTab, setActiveTabTutorial, setInfoPanelVisibility } = dashboard; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/bot-preview.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/bot-preview.spec.tsx index 5b7797191e07..d46c2fb53eda 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/bot-preview.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/bot-preview.spec.tsx @@ -12,9 +12,6 @@ jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ unHighlightAllBlocks: jest.fn(), })); jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); -jest.mock('@deriv/deriv-charts', () => ({ - setSmartChartsPublicPath: jest.fn(), -})); describe('BotPreview', () => { it('should render BotPreview component with ref', () => { const mock_store = mockStore({}); diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/icon-radio.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/icon-radio.spec.tsx new file mode 100644 index 000000000000..5851f7dbc242 --- /dev/null +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/icon-radio.spec.tsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { Icon } from '@deriv/components'; +import { mockStore, StoreProvider } from '@deriv/stores'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { render, screen } from '@testing-library/react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import userEvent from '@testing-library/user-event'; +import { mock_ws } from 'Utils/mock'; +import RootStore from 'Stores/root-store'; +import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import IconRadio from '../icon-radio'; + +jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); +jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ + saveRecentWorkspace: jest.fn(), + unHighlightAllBlocks: jest.fn(), +})); +jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); + +describe('IconRadio', () => { + let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; + + beforeAll(() => { + const mock_store = mockStore({}); + mock_DBot_store = mockDBotStore(mock_store, mock_ws); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + + {children} + + + ); + }); + + it('should render the text passed as prop', () => { + const { container } = render( + } + text='test' + google_drive_connected={false} + onDriveConnect={() => { + // empty + }} + />, + { wrapper } + ); + expect(container).toHaveTextContent('test'); + }); + + it('should render Google Drive as disconnected', () => { + const { container } = render( + } + text='Google Drive' + google_drive_connected={false} + onDriveConnect={() => { + // empty + }} + />, + { wrapper } + ); + expect(container).toHaveTextContent('Connect'); + }); + + it('should fire gdrive connect callback', async () => { + const onDriveConnectCB = jest.fn(); + render( + } + text='Google Drive' + google_drive_connected={false} + onDriveConnect={onDriveConnectCB} + />, + { wrapper } + ); + await userEvent.click(screen.getByText('Connect')); + expect(onDriveConnectCB).toHaveBeenCalled(); + }); + + it('should fire gdrive disconnect callback', async () => { + const onDriveConnectCB = jest.fn(); + render( + } + text='Google Drive' + google_drive_connected={true} + onDriveConnect={onDriveConnectCB} + />, + { wrapper } + ); + await userEvent.click(screen.getByText('Disconnect')); + expect(onDriveConnectCB).toHaveBeenCalled(); + }); +}); diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/local-footer.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/local-footer.spec.tsx new file mode 100644 index 000000000000..5f6c2669c77f --- /dev/null +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/local-footer.spec.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { isMobile } from '@deriv/shared'; +import { mockStore, StoreProvider } from '@deriv/stores'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { render, screen } from '@testing-library/react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import userEvent from '@testing-library/user-event'; +import { mock_ws } from 'Utils/mock'; +import RootStore from 'Stores/root-store'; +import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import LocalFooter from '../local-footer'; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isMobile: jest.fn(), +})); + +jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); +jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ + saveRecentWorkspace: jest.fn(), + unHighlightAllBlocks: jest.fn(), +})); +jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); + +describe('LocalFooter', () => { + let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; + + beforeAll(() => { + const mock_store = mockStore({}); + mock_DBot_store = mockDBotStore(mock_store, mock_ws); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + + {children} + + + ); + }); + + it('should render LocalFooter', () => { + const { container } = render(, { wrapper }); + expect(container).toBeInTheDocument(); + }); + + it('should open modal on click open button', async () => { + render(, { wrapper }); + const open_button = screen.getByText('Open'); + await userEvent.click(open_button); + expect(mock_DBot_store?.load_modal?.is_load_modal_open).toBeTruthy(); + }); + + it('should render cancel button on mobile', () => { + (isMobile as jest.Mock).mockReturnValueOnce(true); + render(, { wrapper }); + expect(screen.getByText('Cancel')).toBeInTheDocument(); + }); + + it('should reset local file on cancel button click', async () => { + (isMobile as jest.Mock).mockReturnValueOnce(true); + render(, { wrapper }); + const cancel_button = screen.getByText('Cancel'); + await userEvent.click(cancel_button); + expect(mock_DBot_store?.load_modal?.loaded_local_file).toBeNull(); + }); +}); diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/recent-footer.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/recent-footer.spec.tsx new file mode 100644 index 000000000000..6c27e3939ef6 --- /dev/null +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/recent-footer.spec.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { mockStore, StoreProvider } from '@deriv/stores'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { render, screen } from '@testing-library/react'; +import { mock_ws } from 'Utils/mock'; +import RootStore from 'Stores/root-store'; +import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import RecentFooter from '../recent-footer'; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isMobile: jest.fn(), +})); + +jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); +jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ + saveRecentWorkspace: jest.fn(), + unHighlightAllBlocks: jest.fn(), +})); +jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); + +describe('RecentFooter', () => { + let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; + + beforeAll(() => { + const mock_store = mockStore({}); + mock_DBot_store = mockDBotStore(mock_store, mock_ws); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + + {children} + + + ); + }); + + it('should render RecentFooter', () => { + const { container } = render(, { wrapper }); + expect(container).toBeInTheDocument(); + }); + + it('should render open button', async () => { + render(, { wrapper }); + const open_button = screen.getByText('Open'); + expect(open_button).toBeInTheDocument(); + }); +}); diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/stop-bot-modal.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/stop-bot-modal.spec.tsx new file mode 100644 index 000000000000..6b1f1a96f50a --- /dev/null +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/__tests__/stop-bot-modal.spec.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { render, screen } from '@testing-library/react'; +import { mock_ws } from 'Utils/mock'; +import RootStore from 'Stores/index'; +import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import StopBotModal from '../stop-bot-modal'; + +jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); +jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ + saveRecentWorkspace: jest.fn(), + unHighlightAllBlocks: jest.fn(), +})); +jest.mock('@deriv/bot-skeleton/src/scratch/hooks/block_svg', () => jest.fn()); + +describe('StopBotModal', () => { + let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; + + beforeAll(() => { + const mock_store = mockStore({}); + mock_DBot_store = mockDBotStore(mock_store, mock_ws); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + + {children} + + + ); + }); + + it('should render the StopBotModal component', () => { + const { container } = render(, { + wrapper, + }); + expect(container).toBeInTheDocument(); + }); + + it('should render dialog with button label stop my bot', () => { + render(, { + wrapper, + }); + mock_DBot_store?.quick_strategy?.toggleStopBotDialog(); + expect(screen.getByText('Stop my bot')).toBeInTheDocument(); + }); +}); 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 43252ec061d1..0299e3d52670 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 @@ -4,10 +4,10 @@ import { Text } from '@deriv/components'; import { localize } from '@deriv/translations'; type TIconRadio = { - google_drive_connected: boolean; - icon: string; + google_drive_connected?: boolean; + icon: React.ReactElement<{ className: string }, string>; text: string; - onDriveConnect: () => void; + onDriveConnect?: () => void; }; const IconRadio = ({ icon, text, google_drive_connected, onDriveConnect }: TIconRadio) => { const is_drive_radio = text === 'Google Drive'; 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 3380df771da9..b5efd9be7dc2 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,15 +1,20 @@ 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 { observer } from '@deriv/stores'; + import { DBOT_TABS } from 'Constants/bot-contents'; -import { waitForDomElement } from 'Utils/dom-observer'; import { useDBotStore } from 'Stores/useDBotStore'; +import { waitForDomElement } from 'Utils/dom-observer'; + import { useComponentVisibility } from '../../hooks/useComponentVisibility'; + import { CONTEXT_MENU_MOBILE, MENU_DESKTOP, STRATEGY } from './constants'; + import './index.scss'; type TRecentWorkspace = { diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard.tsx index 8990bb53c772..2fe93bc328d7 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard.tsx @@ -1,5 +1,6 @@ import React, { useEffect } from 'react'; import classNames from 'classnames'; + import { updateWorkspaceName } from '@deriv/bot-skeleton'; import dbot from '@deriv/bot-skeleton/src/scratch/dbot'; import { initTrashCan } from '@deriv/bot-skeleton/src/scratch/hooks/trashcan'; @@ -8,10 +9,13 @@ import { DesktopWrapper, Dialog, MobileWrapper, Tabs } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; + import Chart from 'Components/chart'; import { DBOT_TABS, TAB_IDS } from 'Constants/bot-contents'; import { useDBotStore } from 'Stores/useDBotStore'; + import RunPanel from '../run-panel'; + import RunStrategy from './dashboard-component/run-strategy'; import { tour_list } from './dbot-tours/utils'; import DashboardComponent from './dashboard-component'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-desktop.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-desktop.tsx index 102d06d91b0c..9d0044dc21c7 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-desktop.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-desktop.tsx @@ -1,7 +1,10 @@ import React from 'react'; + import { observer } from '@deriv/stores'; -import { getSetting } from 'Utils/settings'; + import { useDBotStore } from 'Stores/useDBotStore'; +import { getSetting } from 'Utils/settings'; + import ReactJoyrideWrapper from '../common/react-joyride-wrapper'; import TourEndDialog from '../common/tour-end-dialog'; import TourStartDialog from '../common/tour-start-dialog'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-mobile.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-mobile.tsx index 1964f56f0b39..fb11296b7fe5 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-mobile.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/bot-builder-tour-mobile.tsx @@ -1,9 +1,12 @@ import React from 'react'; + import { ProgressBarTracker } from '@deriv/components'; import { observer } from '@deriv/stores'; import { localize } from '@deriv/translations'; -import { getSetting } from 'Utils/settings'; + import { useDBotStore } from 'Stores/useDBotStore'; +import { getSetting } from 'Utils/settings'; + import Accordion from '../common/accordion'; import TourButton from '../common/tour-button'; import TourStartDialog from '../common/tour-start-dialog'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/index.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/index.tsx index d8208c9cba57..3b512e67d903 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/index.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/bot-builder-tour/index.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { observer } from 'mobx-react'; + import { isMobile } from '@deriv/shared'; + import BotBuilderTourDesktop from './bot-builder-tour-desktop'; import BotBuilderTourMobile from './bot-builder-tour-mobile'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/accordion.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/accordion.spec.tsx index 2577b3b9fb2d..699f1850fc7e 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/accordion.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/accordion.spec.tsx @@ -1,5 +1,7 @@ import React from 'react'; + import { fireEvent, render, screen, waitFor } from '@testing-library/react'; + import Accordion from '../accordion'; const mocked_props = { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/react-joyride-wrapper.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/react-joyride-wrapper.spec.tsx index d7a58b2f8150..7e71f25c1fd2 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/react-joyride-wrapper.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/react-joyride-wrapper.spec.tsx @@ -1,9 +1,12 @@ import React from 'react'; + import { mockStore, StoreProvider } from '@deriv/stores'; // eslint-disable-next-line import/no-extraneous-dependencies import { render, screen } from '@testing-library/react'; -import { mock_ws } from 'Utils/mock'; + import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import { mock_ws } from 'Utils/mock'; + import ReactJoyrideWrapper from '../react-joyride-wrapper'; jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/tour-button.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/tour-button.spec.tsx index 9cd8e41ccd4b..960e55f7bdf8 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/tour-button.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/__tests__/tour-button.spec.tsx @@ -1,5 +1,7 @@ import React from 'react'; + import { fireEvent, render, screen } from '@testing-library/react'; + import TourButton from '../tour-button'; const mocked_props = { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/accordion.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/accordion.tsx index 02da2ffa2940..797ba949058b 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/accordion.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/accordion.tsx @@ -1,7 +1,9 @@ import React from 'react'; import classNames from 'classnames'; + import { Icon, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; + import { TStepMobile } from '../config'; type TAccordion = { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/react-joyride-wrapper.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/react-joyride-wrapper.tsx index 103226c2e470..a123f715050d 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/react-joyride-wrapper.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/react-joyride-wrapper.tsx @@ -1,5 +1,6 @@ import React from 'react'; import ReactJoyride, { CallBackProps, Step, Styles } from 'react-joyride'; + import { localize } from '@deriv/translations'; const common_tour_button_properties = { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-button.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-button.tsx index c1d92380adef..fca1280afd76 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-button.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-button.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import { Text } from '@deriv/components'; type TTourButton = { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-end-dialog.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-end-dialog.tsx index f5c273613509..aeeae1c010db 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-end-dialog.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-end-dialog.tsx @@ -1,8 +1,10 @@ import React from 'react'; + import { Dialog, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { observer } from '@deriv/stores'; import { Localize, localize } from '@deriv/translations'; + import { useDBotStore } from '../../../../stores/useDBotStore'; const TourEndDialog = observer(() => { diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-start-dialog.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-start-dialog.tsx index 673936b6ba67..27983aebffbc 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-start-dialog.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-start-dialog.tsx @@ -1,9 +1,12 @@ import React from 'react'; + import { Dialog, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { observer } from '@deriv/stores'; import { Localize, localize } from '@deriv/translations'; + import { DBOT_TABS } from 'Constants/bot-contents'; + import { useDBotStore } from '../../../../stores/useDBotStore'; import { bot_builder_tour_header, onboarding_tour_header, tourDialogAction, tourDialogInfo } from '../config'; import { setTourSettings, tour_list } from '../utils'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-steps.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-steps.tsx index da7f22c27029..42dcd3da26bb 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-steps.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/common/tour-steps.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import { getUUID } from '@deriv/bot-skeleton/src/services/tradeEngine/utils/helpers'; import { Text } from '@deriv/components'; import { observer } from '@deriv/stores'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/__tests__/config.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/__tests__/config.spec.tsx index 6740ebc9fdd8..7981e387a27d 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/__tests__/config.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/__tests__/config.spec.tsx @@ -1,9 +1,12 @@ import React from 'react'; + import { mockStore, StoreProvider } from '@deriv/stores'; import { render, screen } from '@testing-library/react'; -import { mock_ws } from 'Utils/mock'; + import RootStore from 'Stores/root-store'; import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; +import { mock_ws } from 'Utils/mock'; + import OnboardingTourMobile from '../../onboarding-tour/onboarding-tour-mobile'; import { DBOT_ONBOARDING_MOBILE } from '../index'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/index.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/index.tsx index 6dd3f126ef03..b80ed86103f2 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/index.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/config/index.tsx @@ -1,8 +1,10 @@ -import { getImageLocation } from '../../../../public-path'; import React from 'react'; + import { Icon, Text } from '@deriv/components'; import { getUrlBase, isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; + +import { getImageLocation } from '../../../../public-path'; import TourSteps from '../common/tour-steps'; const is_mobile = isMobile(); diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/index.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/index.tsx index b27e470f5ba6..7818f82e5e23 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/index.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/index.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { observer } from 'mobx-react'; + import { isMobile } from '@deriv/shared'; + import OnboardingTourDesktop from './onboarding-tour-desktop'; import OnboardingTourMobile from './onboarding-tour-mobile'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-desktop.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-desktop.tsx index c77788a34df6..528a84d0def7 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-desktop.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-desktop.tsx @@ -1,7 +1,10 @@ import React from 'react'; + import { observer } from '@deriv/stores'; -import { getSetting } from 'Utils/settings'; + import { useDBotStore } from 'Stores/useDBotStore'; +import { getSetting } from 'Utils/settings'; + import ReactJoyrideWrapper from '../common/react-joyride-wrapper'; import TourStartDialog from '../common/tour-start-dialog'; import { DBOT_ONBOARDING } from '../config'; diff --git a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-mobile.tsx b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-mobile.tsx index 2e04b3e49234..b9454cab4784 100644 --- a/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-mobile.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dbot-tours/onboarding-tour/onboarding-tour-mobile.tsx @@ -1,10 +1,13 @@ import React from 'react'; import classNames from 'classnames'; + import { Icon, ProgressBarTracker, Text } from '@deriv/components'; import { observer } from '@deriv/stores'; import { localize } from '@deriv/translations'; -import { getSetting } from 'Utils/settings'; + import { useDBotStore } from 'Stores/useDBotStore'; +import { getSetting } from 'Utils/settings'; + import TourButton from '../common/tour-button'; import { DBOT_ONBOARDING_MOBILE, TMobileTourConfig } from '../config'; 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 9278ed19e197..d73f1a83bc3c 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 @@ -8,8 +8,18 @@ import { DBOT_TABS } from 'Constants/bot-contents'; import { removeKeyValue } from 'Utils/settings'; import { useDBotStore } from 'Stores/useDBotStore'; +type TGuideList = { + content?: string; + id: number; + src?: string; + subtype?: string; + type: string; + url?: string; + imageclass?: string; +}; + type TGuideContent = { - guide_list: []; + guide_list: TGuideList[]; }; const GuideContent = observer(({ guide_list }: TGuideContent) => { @@ -25,6 +35,7 @@ const GuideContent = observer(({ guide_list }: TGuideContent) => { setActiveTour, setShowMobileTourDialog, } = dashboard; + const is_mobile = isMobile(); const triggerTour = (type: string) => { if (type === 'OnBoard') { @@ -39,7 +50,6 @@ const GuideContent = observer(({ guide_list }: TGuideContent) => { if (is_mobile) setShowMobileTourDialog(true); } }; - const is_mobile = isMobile(); return React.useMemo( () => ( 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 8e293ef1c166..38b468380cd0 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,6 +1,5 @@ import React from 'react'; import classNames from 'classnames'; -import debounce from 'lodash.debounce'; import { DesktopWrapper, Icon, MobileWrapper, SelectNative, Tabs } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { observer } from '@deriv/stores'; @@ -10,50 +9,77 @@ import FAQContent from './faq-content'; import GuideContent from './guide-content'; import { faq_content, guide_content, user_guide_content } from './tutorial-content'; +type TFilteredList = { + content?: string; + id: number; + src?: string; + subtype?: string; + type: string; + url?: string; + imageclass?: string; +}; + +type TSelectedTab = { + label: string; + content: string | React.ReactNode; +}; + +const initialSelectedTab: TSelectedTab = { + label: '', + content: '', +}; + const Sidebar = observer(() => { const { dashboard } = useDBotStore(); const { active_tab_tutorials, active_tab, faq_search_value, setActiveTabTutorial, setFAQSearchValue } = dashboard; const guide_tab_content = [...user_guide_content, ...guide_content]; - const [search_filtered_list, setsearchFilteredList] = React.useState(guide_tab_content); - const [search_faq_list, setsearchFAQList] = React.useState(faq_content); - const search_input = React.useRef(null); + const [search_filtered_list, setsearchFilteredList] = React.useState([...guide_tab_content]); + const [search_faq_list, setsearchFAQList] = React.useState([...faq_content]); + const [selected_tab, setSelectedTab] = React.useState(initialSelectedTab); const menu_items = [ { label: localize('Guide'), - content: , + content: , }, { label: localize('FAQ'), - content: , + content: , }, ]; - const selected_tab = menu_items?.[active_tab_tutorials] || {}; React.useEffect(() => { - if (search_input?.current?.value) { - search_input.current.value = ''; - setsearchFAQList([]); - } - - setsearchFilteredList(guide_tab_content); - setsearchFAQList(faq_content); + setFAQSearchValue(''); + setSelectedTab(menu_items?.[active_tab_tutorials] || {}); + setsearchFilteredList([...guide_tab_content]); + setsearchFAQList([...faq_content]); }, [active_tab_tutorials, active_tab]); + const removeHTMLTagsFromString = (param = '') => { + return param.replace(/<.*?>/g, ''); + }; + React.useEffect(() => { - const content_list = active_tab_tutorials === 0 ? guide_tab_content : faq_content; - const filtered_list = content_list.filter(data => { - return content_list === guide_tab_content - ? data.content.toLowerCase().includes(faq_search_value) - : data.title.toLowerCase().includes(faq_search_value); - }); - return active_tab_tutorials === 0 ? setsearchFilteredList(filtered_list) : setsearchFAQList(filtered_list); - }, [faq_search_value]); + const is_faq = active_tab_tutorials === 1; + const search = faq_search_value?.toLowerCase(); + + if (is_faq) { + const filtered_list = faq_content?.filter(({ title, description = [] }) => { + const match = description?.map(item => (item.type === 'text' ? item.content : '')).join(' '); + const title_has_match = removeHTMLTagsFromString(title)?.toLowerCase()?.includes(search); + const description_has_match = removeHTMLTagsFromString(match)?.toLowerCase()?.includes(search); + return title_has_match || description_has_match; + }); + setsearchFAQList(filtered_list); + } else { + const filtered_list = guide_tab_content?.filter(({ content = '' }) => + content?.toLowerCase()?.includes(search) + ); + setsearchFilteredList(filtered_list); + } + }, [faq_search_value, active_tab_tutorials]); const onSearch = (event: React.ChangeEvent) => { - const value = event.target.value; - debounce(() => { - setFAQSearchValue(value); - }, 700)(); + setFAQSearchValue(event.target.value); }; const onChangeHandle = React.useCallback( @@ -71,11 +97,11 @@ const Sidebar = observer(() => {
{ const { run_panel, dashboard } = useDBotStore(); - const { client } = useStore(); + const { + client, + ui: { is_mobile }, + } = useStore(); const { currency } = client; const { active_index, @@ -250,8 +254,6 @@ const RunPanel = observer(() => { const { total_payout, total_profit, total_stake, won_contracts, lost_contracts, number_of_runs } = statistics; const { BOT_BUILDER, CHART } = DBOT_TABS; - const is_mobile = isMobile(); - React.useEffect(() => { onMount(); return () => onUnmount(); 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 4ef10938d3f4..c061587ea502 100644 --- a/packages/bot-web-ui/src/components/summary/summary-card.tsx +++ b/packages/bot-web-ui/src/components/summary/summary-card.tsx @@ -1,12 +1,15 @@ import React from 'react'; import classNames from 'classnames'; + import { ContractCard, Text } from '@deriv/components'; import { getCardLabels, isMobile } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; + import ContractCardLoader from 'Components/contract-card-loading'; import { getContractTypeDisplay } from 'Constants/contract'; import { useDBotStore } from 'Stores/useDBotStore'; + import { TSummaryCardProps } from './summary-card.types'; const SummaryCard = observer(({ contract_info, is_contract_loading }: TSummaryCardProps) => { diff --git a/packages/bot-web-ui/src/components/transaction-details/__tests__/transaction-details.spec.tsx b/packages/bot-web-ui/src/components/transaction-details/__tests__/transaction-details.spec.tsx index c0c426728fc2..67102dcb8d90 100644 --- a/packages/bot-web-ui/src/components/transaction-details/__tests__/transaction-details.spec.tsx +++ b/packages/bot-web-ui/src/components/transaction-details/__tests__/transaction-details.spec.tsx @@ -1,17 +1,10 @@ import React from 'react'; -import { isMobile } from '@deriv/shared'; import { mockStore, StoreProvider } from '@deriv/stores'; // eslint-disable-next-line import/no-extraneous-dependencies import { render, screen, waitFor } from '@testing-library/react'; -import RootStore from 'Stores/index'; import { DBotStoreProvider, mockDBotStore } from 'Stores/useDBotStore'; import TransactionDetails from '../transaction-details'; -jest.mock('@deriv/shared', () => ({ - ...jest.requireActual('@deriv/shared'), - isMobile: jest.fn(), -})); - jest.mock('@deriv/bot-skeleton/src/scratch/blockly', () => jest.fn()); jest.mock('@deriv/bot-skeleton/src/scratch/dbot', () => ({ saveRecentWorkspace: jest.fn(), @@ -47,31 +40,37 @@ const mock_ws = { send: jest.fn(), }; describe('TransactionDetails', () => { - let wrapper: ({ children }: { children: JSX.Element }) => JSX.Element, mock_DBot_store: RootStore | undefined; - beforeEach(() => { jest.resetModules(); - const mock_store = mockStore({}); - mock_DBot_store = mockDBotStore(mock_store, mock_ws); + }); - wrapper = ({ children }: { children: JSX.Element }) => ( + const wrapper = (mock_store: ReturnType) => { + const mock_DBot_store = mockDBotStore(mock_store, mock_ws); + + const Component = ({ children }: { children: JSX.Element }) => ( {children} ); - }); + + return Component; + }; it('should render Desktop component based on Desktop', async () => { - (isMobile as jest.Mock).mockReturnValueOnce(false); - await waitFor(() => render(, { wrapper })); + const mock_store = mockStore({}); + await waitFor(() => render(, { wrapper: wrapper(mock_store) })); expect(screen.queryByText('Desktop Details')).toBeInTheDocument(); }); it('should render Mobile component on mobile', async () => { - (isMobile as jest.Mock).mockReturnValueOnce(true); - await waitFor(() => render(, { wrapper })); + const mock_store = mockStore({ + ui: { + is_mobile: true, + }, + }); + await waitFor(() => render(, { wrapper: wrapper(mock_store) })); expect(screen.getByText('Mobile Details')).toBeInTheDocument(); }); }); diff --git a/packages/bot-web-ui/src/components/transaction-details/transaction-details-mobile.tsx b/packages/bot-web-ui/src/components/transaction-details/transaction-details-mobile.tsx index b84c6ffc6bb0..6a14171ad93e 100644 --- a/packages/bot-web-ui/src/components/transaction-details/transaction-details-mobile.tsx +++ b/packages/bot-web-ui/src/components/transaction-details/transaction-details-mobile.tsx @@ -1,12 +1,16 @@ import React from 'react'; + import { MobileFullPageModal } from '@deriv/components'; import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; + import { StatisticsSummary } from 'Components/run-panel/run-panel'; import { transaction_elements } from 'Constants/transactions'; import { useDBotStore } from 'Stores/useDBotStore'; + import MobileTransactionCards from './mobile-transaction-card'; import { TRunPanelStore, TTransactionStore } from './transaction-details.types'; + import './transaction-details-mobile.scss'; const TransactionDetailsMobile = observer(() => { diff --git a/packages/bot-web-ui/src/components/transaction-details/transaction-details.tsx b/packages/bot-web-ui/src/components/transaction-details/transaction-details.tsx index 432682da3fe1..dc809a71f8a4 100644 --- a/packages/bot-web-ui/src/components/transaction-details/transaction-details.tsx +++ b/packages/bot-web-ui/src/components/transaction-details/transaction-details.tsx @@ -1,14 +1,18 @@ import React, { Suspense } from 'react'; import { Loading } from '@deriv/components'; -import { isMobile } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import TransactionDetailsDesktop from './transaction-details-desktop'; import TransactionDetailsMobile from './transaction-details-mobile'; -export default function TransactionDetails() { - const is_mobile = isMobile(); +export const TransactionDetails = observer(() => { + const { + ui: { is_mobile }, + } = useStore(); return ( }> {is_mobile ? : } ); -} +}); + +export default TransactionDetails; diff --git a/packages/bot-web-ui/src/constants/contract.js b/packages/bot-web-ui/src/constants/contract.js index 0efd631e0205..44a18458b511 100644 --- a/packages/bot-web-ui/src/constants/contract.js +++ b/packages/bot-web-ui/src/constants/contract.js @@ -1,5 +1,6 @@ import { getTotalProfit } from '@deriv/shared'; import { localize } from '@deriv/translations'; + import { getBuyPrice } from 'Utils/multiplier'; export const getSupportedContracts = is_high_low => ({ diff --git a/packages/bot-web-ui/src/stores/dashboard-store.ts b/packages/bot-web-ui/src/stores/dashboard-store.ts index b04a4f1b0fa5..3bf83b1e15e0 100644 --- a/packages/bot-web-ui/src/stores/dashboard-store.ts +++ b/packages/bot-web-ui/src/stores/dashboard-store.ts @@ -1,8 +1,12 @@ import { action, computed, makeObservable, observable, reaction } from 'mobx'; + import { setColors } from '@deriv/bot-skeleton'; import { isMobile } from '@deriv/shared'; + import { clearInjectionDiv } from 'Constants/load-modal'; + import { setTourSettings, tour_type, TTourType } from '../components/dashboard/dbot-tours/utils'; + import RootStore from './root-store'; export interface IDashboardStore { diff --git a/packages/bot-web-ui/src/stores/download-store.js b/packages/bot-web-ui/src/stores/download-store.js index 5c60ffc34ce5..582efa895531 100644 --- a/packages/bot-web-ui/src/stores/download-store.js +++ b/packages/bot-web-ui/src/stores/download-store.js @@ -1,4 +1,5 @@ import { action, makeObservable } from 'mobx'; + import { log_types } from '@deriv/bot-skeleton'; import { localize } from '@deriv/translations'; diff --git a/packages/bot-web-ui/src/stores/journal-store.js b/packages/bot-web-ui/src/stores/journal-store.js index 9522b41f735a..6f4d61b5599e 100644 --- a/packages/bot-web-ui/src/stores/journal-store.js +++ b/packages/bot-web-ui/src/stores/journal-store.js @@ -1,8 +1,10 @@ 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 { 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'; 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 95a414834f61..69c28aa0c318 100644 --- a/packages/bot-web-ui/src/stores/summary-card-store.js +++ b/packages/bot-web-ui/src/stores/summary-card-store.js @@ -1,5 +1,7 @@ import { action, computed, makeObservable, observable, reaction } from 'mobx'; + import { getIndicativePrice, isEqualObject, isMultiplierContract, Validator } from '@deriv/shared'; + import { getValidationRules } from 'Constants/contract'; import { contract_stages } from 'Constants/contract-stage'; import { getContractUpdateConfig } from 'Utils/multiplier'; diff --git a/packages/cashier/package.json b/packages/cashier/package.json index 26cbec245694..b470ee74ddc9 100644 --- a/packages/cashier/package.json +++ b/packages/cashier/package.json @@ -38,7 +38,7 @@ "@deriv/api": "^1.0.0", "@deriv/api-types": "^1.0.118", "@deriv/components": "^1.0.0", - "@deriv/deriv-api": "^1.0.11", + "@deriv/deriv-api": "^1.0.13", "@deriv/hooks": "^1.0.0", "@deriv/p2p": "^0.7.3", "@deriv/shared": "^1.0.0", diff --git a/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.scss b/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.scss index 9da413fc79a2..305250d49e66 100644 --- a/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.scss +++ b/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.scss @@ -2,9 +2,11 @@ display: grid; grid-template-columns: 1fr auto 1fr; grid-gap: 0.8rem; + @include desktop { max-width: 36rem; - margin: 0 auto 2.4rem; + margin: 0 auto; + .dc-icon { margin-top: 1rem; } @@ -12,7 +14,12 @@ .dc-input { margin-bottom: unset; } + + .dc-input__hint { + margin: 0.1rem 0 0 1.3rem; + } } + @include mobile { display: flex; flex-direction: column; @@ -28,6 +35,7 @@ margin: 1.4rem; } } + .input-group { display: flex; @@ -36,6 +44,7 @@ margin-left: -4rem; } } + &__hint { grid-column: 3; margin-left: 0; diff --git a/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.scss b/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.scss index 775cb2a2689b..565ebcd856b7 100644 --- a/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.scss +++ b/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.scss @@ -1,8 +1,11 @@ .email-verification-empty-state { display: flex; - flex: 1; flex-direction: column; align-items: center; justify-content: center; - margin: 4rem auto 0; + gap: 4.6rem; + + @include mobile { + gap: 2.4rem; + } } diff --git a/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.tsx b/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.tsx index e73862177b55..f8c592a3db46 100644 --- a/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.tsx +++ b/packages/cashier/src/components/email-verification-empty-state/email-verification-empty-state.tsx @@ -21,7 +21,7 @@ const EmailVerificationEmptyState = ({ type }: TEmailVerificationEmptyStateProps return (
{ - if (!isMobile() || (is_default_route && (is_loading || is_cashier_onboarding))) return localize('Cashier'); + if (!is_mobile || (is_default_route && (is_loading || is_cashier_onboarding))) return localize('Cashier'); return selected_route.getTitle?.(); - }, [is_cashier_onboarding, is_default_route, is_loading, selected_route]); + }, [is_cashier_onboarding, is_default_route, is_loading, selected_route, is_mobile]); const updateActiveTab = useCallback( (path?: string) => { @@ -205,7 +205,7 @@ const Cashier = observer(({ history, location, routes: routes_config }: TCashier }, [history, is_p2p_enabled, is_p2p_enabled_success]); if ( - ((!is_logged_in || isMobile()) && is_logging_in) || + ((!is_logged_in || is_mobile) && is_logging_in) || !is_account_setting_loaded || is_payment_agent_checking || is_p2p_enabled_loading diff --git a/packages/cashier/src/containers/routes/error-component/__tests__/error-component.spec.tsx b/packages/cashier/src/containers/routes/error-component/__tests__/error-component.spec.tsx index 1e26400526ee..8805f7e2a32e 100644 --- a/packages/cashier/src/containers/routes/error-component/__tests__/error-component.spec.tsx +++ b/packages/cashier/src/containers/routes/error-component/__tests__/error-component.spec.tsx @@ -27,7 +27,6 @@ describe('', () => { redirect_label: 'test_label', should_clear_error_on_click: true, should_show_refresh: true, - app_routing_history: [{ pathname: '/cashier' }], redirectOnClick: jest.fn(), setError: jest.fn(), }; diff --git a/packages/cashier/src/containers/routes/error-component/error-component.tsx b/packages/cashier/src/containers/routes/error-component/error-component.tsx index c826db55784d..0b6355258712 100644 --- a/packages/cashier/src/containers/routes/error-component/error-component.tsx +++ b/packages/cashier/src/containers/routes/error-component/error-component.tsx @@ -2,8 +2,12 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import { PageErrorContainer } from '@deriv/components'; import { routes } from '@deriv/shared'; -import { TRootStore } from '../../../types'; import { localize, Localize } from '@deriv/translations'; +import { TCoreStores } from '@deriv/stores/types'; + +type TErrorComponentProps = TCoreStores['common']['error'] & { + setError?: (has_error: boolean, error: React.ReactNode | null) => void; +}; const ErrorComponent = ({ header, @@ -14,7 +18,7 @@ const ErrorComponent = ({ setError, should_clear_error_on_click, should_show_refresh = true, -}: TRootStore['common']['error']) => { +}: TErrorComponentProps) => { const history = useHistory(); React.useEffect(() => { diff --git a/packages/cashier/src/modules/cashier-onboarding/components/cashier-onboarding-fiat-card/cashier-onboarding-fiat-card.tsx b/packages/cashier/src/modules/cashier-onboarding/components/cashier-onboarding-fiat-card/cashier-onboarding-fiat-card.tsx index e42105c9e09c..e243d2ca0f3b 100644 --- a/packages/cashier/src/modules/cashier-onboarding/components/cashier-onboarding-fiat-card/cashier-onboarding-fiat-card.tsx +++ b/packages/cashier/src/modules/cashier-onboarding/components/cashier-onboarding-fiat-card/cashier-onboarding-fiat-card.tsx @@ -8,7 +8,7 @@ import { CashierOnboardingCard } from '../cashier-onboarding-card'; import { CashierOnboardingIconMarquee } from '../cashier-onboarding-icon-marquee'; const icons: React.ComponentProps['icons'] = [ - 'IcWalletCreditDebit', + 'IcCashierCreditDebit', 'IcCashierInstantBankTransfer', 'IcCashierEwallet', 'IcCashierLocalPaymentMethods', diff --git a/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.scss b/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.scss index 6301c88c6b02..1e752c01ec31 100644 --- a/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.scss +++ b/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.scss @@ -6,6 +6,7 @@ &__hint { color: var(--text-general); margin-top: 0.5rem; + &__disabled { color: var(--text-less-prominent); } @@ -23,10 +24,12 @@ margin-right: 0.4rem; } } + &__crypto { &--disabled { pointer-events: none; } + &--percentage-selector { display: flex; flex-direction: column; @@ -34,6 +37,7 @@ margin-bottom: 2.4rem; } } + &__inline-warning-message { margin-bottom: 3rem; @@ -42,6 +46,7 @@ width: 100%; } } + &__drop-down-wrapper { @include mobile { margin-top: 1.2rem; @@ -51,6 +56,7 @@ } } } + &__drop-down { display: inline-block; min-width: 20.3rem; @@ -58,9 +64,11 @@ line-height: 1.43; text-align: left; margin: 0 auto 5.1rem; + @include desktop { max-width: 40rem; } + @include mobile { width: 100%; min-width: auto; @@ -71,21 +79,26 @@ @include desktop { margin: 0 auto 3.3rem; } + @include mobile { margin-bottom: 2.4rem; } } + & .dc-dropdown__display-text { width: 100%; align-items: center; } + & .dc-field--error { padding-top: 0.5rem; + .link { pointer-events: all; } } } + &__notes { @include mobile { padding: 1.6rem 0; @@ -99,6 +112,7 @@ margin-top: 0; } } + &__bullet { background-color: var(--text-general); border-radius: 100%; @@ -113,10 +127,12 @@ margin-bottom: 0.8rem; } } + &__wrapper { .cashier__form-submit { margin-top: 3rem; } + .account-transfer-form__input { min-width: 40rem; height: 6.5rem; @@ -125,12 +141,15 @@ .dc-input__hint { margin: 0.5rem 0 -1.9rem 1.3rem; } + .dc-field--error { margin-top: 0.5rem; } + &-fit-content { width: fit-content; } + @include mobile { width: 100%; min-width: auto; @@ -141,14 +160,17 @@ } } } + &__currency, &__balance { line-height: 1.43; } + &__currency { &-icon { align-self: center; } + &-wrapper { display: flex; flex-direction: column; @@ -158,13 +180,16 @@ margin-right: 8px; } } + &__icon { display: flex; justify-content: center; } + &__balance { margin-left: auto; } + &__form-submit { display: flex; flex-direction: column; @@ -175,6 +200,7 @@ > * { width: auto; } + &--align-end { align-items: flex-end; @@ -187,7 +213,7 @@ &__form-buttons { display: flex; flex-direction: row; - justify-content: end; + justify-content: flex-end; align-items: center; margin-top: 4rem; @@ -213,11 +239,13 @@ &-wrapper { display: flex; height: 100%; + @include mobile { height: initial; } } } + @include desktop { &__form-submit { min-width: 36rem; @@ -226,14 +254,17 @@ } } } + .dc-modal__container_account_transfer { &_switch_modal { transition: none; + .dc-modal { @include mobile() { &-header__close { margin: 2.4rem 1.6rem 0; } + &-body { font-size: 1.4rem; } @@ -242,9 +273,11 @@ &-header__title { padding: 2.4rem 2.4rem 0; } + &-body { padding: 2.4rem; } + &-footer { padding: 0 2.4rem 2.4rem; } diff --git a/packages/cashier/src/pages/payment-agent/payment-agent-list/payment-agent-list.scss b/packages/cashier/src/pages/payment-agent/payment-agent-list/payment-agent-list.scss index 39618819c1bc..221249d604c6 100644 --- a/packages/cashier/src/pages/payment-agent/payment-agent-list/payment-agent-list.scss +++ b/packages/cashier/src/pages/payment-agent/payment-agent-list/payment-agent-list.scss @@ -7,6 +7,9 @@ padding: 0; margin: 0; } + .email-verification-empty-state { + margin-top: 2.4rem; + } &__instructions { @include mobile { display: grid; diff --git a/packages/cashier/src/pages/withdrawal/crypto-withdraw-form/crypto-withdraw-form.tsx b/packages/cashier/src/pages/withdrawal/crypto-withdraw-form/crypto-withdraw-form.tsx index 1c0c6726b34b..cf2b1ca536f3 100644 --- a/packages/cashier/src/pages/withdrawal/crypto-withdraw-form/crypto-withdraw-form.tsx +++ b/packages/cashier/src/pages/withdrawal/crypto-withdraw-form/crypto-withdraw-form.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Button, Icon, Input, Loading, Text } from '@deriv/components'; import { useCurrentAccountDetails } from '@deriv/hooks'; -import { CryptoConfig, getCurrencyName, isMobile } from '@deriv/shared'; +import { CryptoConfig, getCurrencyName } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; import { Localize, localize } from '@deriv/translations'; import classNames from 'classnames'; @@ -48,7 +48,8 @@ const Header = ({ currency }: THeaderProps) => { }; const CryptoWithdrawForm = observer(() => { - const { client } = useStore(); + const { client, ui } = useStore(); + const { is_mobile } = ui; const { balance, currency, @@ -101,11 +102,11 @@ const CryptoWithdrawForm = observer(() => { return (
- {!isMobile() &&
} -
- + {!is_mobile &&
} +
+
- {isMobile() &&
} + {is_mobile &&
} ({ + ...jest.requireActual('@deriv/api'), + useRequest: jest.fn(), +})); + +// @ts-expect-error ignore this until find a way to make arguments as partial +const mockUseRequest = useRequest as jest.MockedFunction>; + +const mock_store = mockStore({ + client: { + email: 'john@company.com', + }, + modules: { cashier: { transaction_history: { onMount: jest.fn() } } }, +}); + +describe('WithdrawalVerificationEmail', () => { + test('should render the component', () => { + // @ts-expect-error ignore this until find a way to make arguments as partial + mockUseRequest.mockReturnValue({}); + + render(, { + wrapper: ({ children }) => {children}, + }); + + expect(screen.queryByTestId('dt_empty_state_title')).toBeInTheDocument(); + expect(screen.queryByTestId('dt_empty_state_description')).toBeInTheDocument(); + expect(screen.queryByTestId('dt_empty_state_action')).toHaveTextContent('Send email'); + }); + + test('should show the error component when `error` is provided', () => { + // @ts-expect-error ignore this until find a way to make arguments as partial + mockUseRequest.mockReturnValue({ error: { code: 'CODE', message: 'foo' } }); + + render(, { + wrapper: ({ children }) => {children}, + }); + + expect(screen.getByText('foo')).toBeInTheDocument(); + }); + + test('should show the proper message when email has been sent.', () => { + // @ts-expect-error ignore this until find a way to make arguments as partial + mockUseRequest.mockReturnValue({ mutate: jest.fn() }); + + render(, { + wrapper: ({ children }) => {children}, + }); + + const send_button = screen.getByText('Send email'); + fireEvent.click(send_button); + + expect(screen.getByText("We've sent you an email.")).toBeInTheDocument(); + }); +}); diff --git a/packages/cashier/src/pages/withdrawal/withdrawal-verification-email/withdrawal-verification-email.tsx b/packages/cashier/src/pages/withdrawal/withdrawal-verification-email/withdrawal-verification-email.tsx index 4c27bcd72789..c71074f27156 100644 --- a/packages/cashier/src/pages/withdrawal/withdrawal-verification-email/withdrawal-verification-email.tsx +++ b/packages/cashier/src/pages/withdrawal/withdrawal-verification-email/withdrawal-verification-email.tsx @@ -16,11 +16,11 @@ const WithdrawalVerificationEmail = observer(() => { return ( - +

diff --git a/packages/cfd/package.json b/packages/cfd/package.json index df4d52d2ad50..ad79b8b8496f 100644 --- a/packages/cfd/package.json +++ b/packages/cfd/package.json @@ -85,7 +85,7 @@ "@deriv/account": "^1.0.0", "@deriv/api-types": "^1.0.118", "@deriv/components": "^1.0.0", - "@deriv/deriv-api": "^1.0.11", + "@deriv/deriv-api": "^1.0.13", "@deriv/hooks": "^1.0.0", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", diff --git a/packages/cfd/src/Components/__tests__/cfd-personal-details-form.spec.js b/packages/cfd/src/Components/__tests__/cfd-personal-details-form.spec.js index b109af2696b4..de64ceecd6c3 100644 --- a/packages/cfd/src/Components/__tests__/cfd-personal-details-form.spec.js +++ b/packages/cfd/src/Components/__tests__/cfd-personal-details-form.spec.js @@ -88,7 +88,7 @@ describe('', () => { value: 'ax', }, ], - value: { + initial_values: { citizen: '', tax_residence: '', tax_identification_number: '', @@ -137,7 +137,7 @@ describe('', () => { }); it('should disable Citizenship and Tax residence fields if they were submitted earlier & immutable from BE', async () => { - const values = { + const initial_values = { citizen: 'Indonesia', tax_residence: 'Indonesia', tax_identification_number: '', @@ -150,7 +150,7 @@ describe('', () => { ); diff --git a/packages/cfd/src/Components/cfd-account-card.tsx b/packages/cfd/src/Components/cfd-account-card.tsx index 3687a4086600..2a277397ae86 100644 --- a/packages/cfd/src/Components/cfd-account-card.tsx +++ b/packages/cfd/src/Components/cfd-account-card.tsx @@ -1,29 +1,32 @@ -import classNames from 'classnames'; import React from 'react'; import { CSSTransition } from 'react-transition-group'; -import { Icon, Money, Button, Text, DesktopWrapper, MobileWrapper, Popover } from '@deriv/components'; -import { isMobile, mobileOSDetect, getCFDPlatformLabel, CFD_PLATFORMS } from '@deriv/shared'; -import { localize, Localize } from '@deriv/translations'; -import { CFDAccountCopy } from './cfd-account-copy'; +import classNames from 'classnames'; +import { FormikValues } from 'formik'; + +import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; +import { Button, DesktopWrapper, Icon, MobileWrapper, Money, Popover, Text } from '@deriv/components'; +import { CFD_PLATFORMS, getCFDPlatformLabel, isMobile, mobileOSDetect } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize, localize } from '@deriv/translations'; + import { - getDXTradeWebTerminalLink, - getPlatformDXTradeDownloadLink, getCTraderWebTerminalLink, getDerivEzWebTerminalLink, + getDXTradeWebTerminalLink, + getPlatformDXTradeDownloadLink, } from '../Helpers/constants'; +import { useCfdStore } from '../Stores/Modules/CFD/Helpers/useCfdStores'; + +import { CFDAccountCopy } from './cfd-account-copy'; import { TAccountIconValues, - TSpecBoxProps, - TPasswordBoxProps, - TCFDAccountCardActionProps, TCFDAccountCard, + TCFDAccountCardActionProps, + TPasswordBoxProps, + TSpecBoxProps, TTradingPlatformAccounts, TTradingPlatformAvailableAccount, } from './props.types'; -import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; -import { useStore, observer } from '@deriv/stores'; -import { useCfdStore } from '../Stores/Modules/CFD/Helpers/useCfdStores'; -import { FormikValues } from 'formik'; const account_icons: { [key: string]: TAccountIconValues } = { mt5: { diff --git a/packages/cfd/src/Components/cfd-personal-details-form.tsx b/packages/cfd/src/Components/cfd-personal-details-form.tsx index da1d0300d765..f523f08aa429 100644 --- a/packages/cfd/src/Components/cfd-personal-details-form.tsx +++ b/packages/cfd/src/Components/cfd-personal-details-form.tsx @@ -1,6 +1,6 @@ import { Field, FieldProps, Formik, FormikHelpers as FormikActions, FormikProps } from 'formik'; import React from 'react'; -import { LandingCompany, ResidenceList } from '@deriv/api-types'; +import { ResidenceList } from '@deriv/api-types'; import { Autocomplete, AutoHeightWrapper, @@ -25,17 +25,15 @@ type TCFDPersonalDetailsFormProps = { form_error?: string; index: number; is_loading: boolean; - landing_company: LandingCompany; onSubmit: TOnSubmit; residence_list: ResidenceList; - value: TFormValues; + initial_values: TFormValues; }; type TValidatePersonalDetailsParams = { values: TFormValues; residence_list: ResidenceList; account_opening_reason: TAccountOpeningReasonList; - is_tin_required: boolean; }; type TFindDefaultValuesInResidenceList = (params: { @@ -125,11 +123,8 @@ const validatePersonalDetails = ({ values, residence_list, account_opening_reason, - is_tin_required, }: TValidatePersonalDetailsParams) => { - const [tax_residence_obj] = residence_list.filter(res => res.text === values.tax_residence && res.tin_format); - - const tin_format = tax_residence_obj?.tin_format; + const tin_format = residence_list.find(res => res.text === values.tax_residence)?.tin_format; const tin_regex = tin_format || ['^[A-Za-z0-9./s-]{0,25}$']; // fallback to API's default rule check @@ -137,8 +132,9 @@ const validatePersonalDetails = ({ citizen: [(v: string) => !!v, (v: string) => residence_list.map(i => i.text).includes(v)], tax_residence: [(v: string) => !!v, (v: string) => residence_list.map(i => i.text).includes(v)], tax_identification_number: [ - (v: string) => ((!values.tax_residence && is_tin_required) || tin_format ? !!v : true), + (v: string) => !!v, (v: string) => (tin_regex ? tin_regex?.some(regex => v.match(regex)) : true), + () => !!values.tax_residence, ], account_opening_reason: [ (v: string) => !!v, @@ -157,6 +153,8 @@ const validatePersonalDetails = ({ const field_error_messages = (field_name: string): string[] => [ localize('{{field_name}} is required', { field_name }), localize('{{field_name}} is not properly formatted.', { field_name }), + // this rule is specifically for tax_identification_number when tax_residence is empty + localize('Please fill in Tax residence.'), ]; const errors: { [key: string]: React.ReactNode } = {}; @@ -212,25 +210,24 @@ const submitForm: TSubmitForm = (values, actions, idx, onSubmit, is_dirty, resid const CFDPersonalDetailsForm = ({ changeable_fields, is_loading, - landing_company, residence_list, onSubmit, - value, + initial_values, index, form_error, }: TCFDPersonalDetailsFormProps) => { const account_opening_reason = getAccountOpeningReasonList(); - const is_tin_required = !!(landing_company?.config?.tax_details_required ?? false); const onSubmitForm = (values: TFormValues, actions: FormikActions) => - submitForm(values, actions, index, onSubmit, !isDeepEqual(value, values), residence_list); + submitForm(values, actions, index, onSubmit, !isDeepEqual(initial_values, values), residence_list); + + const isFieldDisabled = (field: string) => !!initial_values[field] && !changeable_fields?.includes(field); - if (residence_list.length === 0) return ; - if (is_loading) return ; + if (is_loading || residence_list.length === 0) return ; return ( @@ -238,7 +235,6 @@ const CFDPersonalDetailsForm = ({ values, residence_list, account_opening_reason, - is_tin_required, }) } onSubmit={onSubmitForm} @@ -258,23 +254,11 @@ const CFDPersonalDetailsForm = ({ const citizenship_error = touched.citizen && errors.citizen; const place_of_birth_error = touched.place_of_birth && errors.place_of_birth; const tax_residence_error = touched.tax_residence && errors.tax_residence; - const account_opening_reason_error = touched.account_opening_reason && errors.account_opening_reason; - const is_citizenship_disabled = !!value.citizen && !changeable_fields?.includes('citizen'); - const is_place_of_birth_disabled = - !!value.place_of_birth && !changeable_fields?.includes('place_of_birth'); - const is_tax_residence_disabled = - !!value.tax_residence && !changeable_fields?.includes('tax_residence'); - const is_account_opening_reason_disabled = - !!value.account_opening_reason && !changeable_fields?.includes('account_opening_reason'); const handleItemSelection = (item: ResidenceList[0], _field: string) => { const item_value = item.value ? item.text : ''; setFieldValue(_field, item_value, true); }; - const tin_field_label = residence_list.find(res => res.text === values.tax_residence && res.tin_format) - ?.tin_format - ? localize('Tax identification number*') - : localize('Tax identification number'); return ( @@ -318,7 +302,7 @@ const CFDPersonalDetailsForm = ({ type='text' label={localize('Citizenship*')} error={citizenship_error} - disabled={is_citizenship_disabled} + disabled={isFieldDisabled('citizen')} list_items={residence_list} onItemSelection={(item: ResidenceList[0]) => handleItemSelection(item, 'citizen') @@ -336,7 +320,7 @@ const CFDPersonalDetailsForm = ({ value={values.citizen} list_items={residence_list} error={citizenship_error} - disabled={is_citizenship_disabled} + disabled={isFieldDisabled('citizen')} use_text={true} onChange={(e: React.ChangeEvent) => setFieldValue('citizen', e.target.value, true) @@ -358,7 +342,7 @@ const CFDPersonalDetailsForm = ({ type='text' label={localize('Place of birth*')} error={place_of_birth_error} - disabled={is_place_of_birth_disabled} + disabled={isFieldDisabled('place_of_birth')} list_items={residence_list} onItemSelection={(item: ResidenceList[0]) => handleItemSelection(item, 'place_of_birth') @@ -376,7 +360,7 @@ const CFDPersonalDetailsForm = ({ value={values.place_of_birth} list_items={residence_list} error={place_of_birth_error} - disabled={is_place_of_birth_disabled} + disabled={isFieldDisabled('place_of_birth')} use_text={true} onChange={(e: React.ChangeEvent) => setFieldValue('place_of_birth', e.target.value, true) @@ -397,7 +381,7 @@ const CFDPersonalDetailsForm = ({ autoComplete='off' label={localize('Tax residence*')} error={tax_residence_error} - disabled={is_tax_residence_disabled} + disabled={isFieldDisabled('tax_residence')} list_items={residence_list} onItemSelection={(item: ResidenceList[0]) => handleItemSelection(item, 'tax_residence') @@ -414,7 +398,7 @@ const CFDPersonalDetailsForm = ({ label={localize('Tax residence*')} value={values.tax_residence} error={tax_residence_error} - disabled={is_tax_residence_disabled} + disabled={isFieldDisabled('tax_residence')} list_items={residence_list} use_text={true} onChange={(e: React.ChangeEvent) => @@ -428,19 +412,19 @@ const CFDPersonalDetailsForm = ({ - {({ field }: FieldProps) => ( + {({ + field, + meta: { error, touched }, + }: FieldProps) => ( @@ -465,8 +449,8 @@ const CFDPersonalDetailsForm = ({ label={localize('Account opening reason*')} list_items={account_opening_reason} value={values.account_opening_reason} - disabled={is_account_opening_reason_disabled} - error={account_opening_reason_error} + disabled={isFieldDisabled('account_opening_reason')} + error={touched && error} onChange={(e: React.ChangeEvent) => { handleChange(e); setFieldValue( diff --git a/packages/cfd/src/Components/specbox.tsx b/packages/cfd/src/Components/specbox.tsx index a7ffdff76385..7af8302c1ff8 100644 --- a/packages/cfd/src/Components/specbox.tsx +++ b/packages/cfd/src/Components/specbox.tsx @@ -1,6 +1,8 @@ import React from 'react'; import classNames from 'classnames'; + import { Text } from '@deriv/components'; + import { CFDAccountCopy } from './cfd-account-copy'; export type TSpecBoxProps = { diff --git a/packages/cfd/src/Containers/cfd-personal-details-container.tsx b/packages/cfd/src/Containers/cfd-personal-details-container.tsx index 508c70d32f42..d9ff17cb277d 100644 --- a/packages/cfd/src/Containers/cfd-personal-details-container.tsx +++ b/packages/cfd/src/Containers/cfd-personal-details-container.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { DesktopWrapper, Div100vhContainer, MobileWrapper, Text } from '@deriv/components'; +import { Div100vhContainer, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; import { TCFDPersonalDetailsContainerProps } from './props.types'; import CFDPersonalDetailsForm from '../Components/cfd-personal-details-form'; @@ -13,7 +13,7 @@ type TSetSubmitting = (isSubmitting: boolean) => void; const CFDPersonalDetailsContainer = observer(({ onSubmit }: TCFDPersonalDetailsContainerProps) => { const { client } = useStore(); - const { account_settings, getChangeableFields, landing_company, residence_list, setAccountSettings } = client; + const { account_settings, getChangeableFields, residence_list, setAccountSettings } = client; const [form_error, setFormError] = React.useState(''); const [is_loading, setIsLoading] = React.useState(false); @@ -94,7 +94,7 @@ const CFDPersonalDetailsContainer = observer(({ onSubmit }: TCFDPersonalDetailsC onSubmit(index, value); }; - const getPersonalDetailsForm = () => ( + return (
); - - return ( - - {getPersonalDetailsForm()} - {getPersonalDetailsForm()} - - ); }); export default CFDPersonalDetailsContainer; diff --git a/packages/cfd/src/Containers/compare-accounts-content.tsx b/packages/cfd/src/Containers/compare-accounts-content.tsx index f0c08058f2b5..5df647c940ef 100644 --- a/packages/cfd/src/Containers/compare-accounts-content.tsx +++ b/packages/cfd/src/Containers/compare-accounts-content.tsx @@ -1,8 +1,9 @@ import React from 'react'; -import { Table, Text, ThemedScrollbars, Div100vhContainer } from '@deriv/components'; -import { localize, Localize } from '@deriv/translations'; -import { isDesktop, CFD_PLATFORMS, isLandingCompanyEnabled } from '@deriv/shared'; + import { LandingCompany } from '@deriv/api-types'; +import { Div100vhContainer, Table, Text, ThemedScrollbars } from '@deriv/components'; +import { CFD_PLATFORMS, isDesktop, isLandingCompanyEnabled } from '@deriv/shared'; +import { Localize, localize } from '@deriv/translations'; type TCFDAttributeDescriberProps = { name: string; diff --git a/packages/cfd/src/Containers/dmt5-trade-modal.tsx b/packages/cfd/src/Containers/dmt5-trade-modal.tsx index 3ede695524ec..76b215000699 100644 --- a/packages/cfd/src/Containers/dmt5-trade-modal.tsx +++ b/packages/cfd/src/Containers/dmt5-trade-modal.tsx @@ -1,25 +1,29 @@ import React from 'react'; -import { Text, Icon, Money } from '@deriv/components'; -import { TTradingPlatformAccounts } from '../Components/props.types'; + import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; +import { Icon, Money, Text } from '@deriv/components'; import { CFD_PLATFORMS, - isMobile, getCFDAccountDisplay, + getCFDAccountKey, getCFDPlatformLabel, getPlatformSettings, getUrlBase, - getCFDAccountKey, + isMobile, } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; +import { getPlatformMt5DownloadLink } from '../Helpers/constants'; import SpecBox from '../Components/specbox'; import PasswordBox from '../Components/passwordbox'; -import { getPlatformMt5DownloadLink, getMT5WebTerminalLink } from '../Helpers/constants'; import TradingPlatformIcon from '../Assets/svgs/trading-platform'; +import { TTradingPlatformAccounts } from '../Components/props.types'; + import { TCFDPasswordReset } from './props.types'; type TMT5TradeModalProps = { - mt5_trade_account: DetailsOfEachMT5Loginid; + mt5_trade_account: DetailsOfEachMT5Loginid & { + webtrader_url?: string; + }; show_eu_related_content: boolean; onPasswordManager: ( arg1: string | undefined, @@ -151,11 +155,7 @@ const DMT5TradeModal = ({ diff --git a/packages/cfd/src/Helpers/constants.ts b/packages/cfd/src/Helpers/constants.ts index 34efa01099f2..fdc37e99ef76 100644 --- a/packages/cfd/src/Helpers/constants.ts +++ b/packages/cfd/src/Helpers/constants.ts @@ -37,9 +37,7 @@ const REAL_DXTRADE_URL = 'https://dx.deriv.com'; const DEMO_DXTRADE_URL = 'https://dx-demo.deriv.com'; const CTRADER_DESKTOP_DOWNLOAD = 'https://getctrader.com/deriv/ctrader-deriv-setup.exe'; - const CTRADER_DOWNLOAD_LINK = 'https://ctrader.com/download/'; - const CTRADER_URL = 'https://ct.deriv.com/'; const DERIVEZ_URL = 'https://dqwsqxuu0r6t9.cloudfront.net/'; @@ -117,7 +115,7 @@ const getPlatformMt5DownloadLink = (platform: string | undefined = undefined) => case 'android': return 'https://download.mql5.com/cdn/mobile/mt5/android?server=Deriv-Demo,Deriv-Server,Deriv-Server-02'; default: - return getMT5WebTerminalLink({ category: 'real' }); // Web + return ''; } }; @@ -145,22 +143,6 @@ const getDerivEzWebTerminalLink = (category: string, token?: string) => { return url; }; -const getMT5WebTerminalLink = ({ - category, - loginid, - server_name = 'Deriv-Server', -}: { - category?: string; - loginid?: string; - server_name?: string; -}) => { - const is_demo = category === 'demo'; - const server = is_demo ? 'Deriv-Demo' : server_name; - const login = loginid ?? ''; - - return `https://metatraderweb.app/trade?servers=${server}&trade_server=${server}${login && `&login=${login}`}`; -}; - export { REAL_DXTRADE_URL, DEMO_DXTRADE_URL, @@ -179,6 +161,5 @@ export { platformsIcons, getTitle, getDerivEzWebTerminalLink, - getMT5WebTerminalLink, getTopUpConfig, }; diff --git a/packages/cfd/src/Stores/Modules/CFD/cfd-store.js b/packages/cfd/src/Stores/Modules/CFD/cfd-store.js index 2a00f2728dc5..20723e8fda12 100644 --- a/packages/cfd/src/Stores/Modules/CFD/cfd-store.js +++ b/packages/cfd/src/Stores/Modules/CFD/cfd-store.js @@ -1,6 +1,6 @@ import { action, computed, observable, reaction, runInAction, makeObservable, override } from 'mobx'; import { getAccountListKey, getAccountTypeFields, CFD_PLATFORMS, WS, Jurisdiction } from '@deriv/shared'; -import BaseStore from 'Stores/base-store'; +import BaseStore from '../../base-store'; import { getDxCompanies, getMtCompanies, getDerivezCompanies } from './Helpers/cfd-config'; export default class CFDStore extends BaseStore { diff --git a/packages/cfd/src/Stores/base-store.js b/packages/cfd/src/Stores/base-store.js index 4e005596209a..9dd1131f5da7 100644 --- a/packages/cfd/src/Stores/base-store.js +++ b/packages/cfd/src/Stores/base-store.js @@ -1,5 +1,6 @@ -import { action, intercept, observable, reaction, toJS, when, makeObservable } from 'mobx'; -import { isProduction, isEmptyObject, Validator } from '@deriv/shared'; +import { action, intercept, makeObservable,observable, reaction, toJS, when } from 'mobx'; + +import { isEmptyObject, isProduction, Validator } from '@deriv/shared'; /** * BaseStore class is the base class for all defined stores in the application. It handles some stuff such as: diff --git a/packages/components/src/components/amount-input/__tests__/amount-input.spec.tsx b/packages/components/src/components/amount-input/__tests__/amount-input.spec.tsx new file mode 100644 index 000000000000..29d8b6a8d27c --- /dev/null +++ b/packages/components/src/components/amount-input/__tests__/amount-input.spec.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import AmountInput from '../amount-input'; + +describe('', () => { + it('should render with the initial value of "0.00" if {initial_value} is not specified', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + expect(input).toHaveDisplayValue('0.00'); + }); + + it('should render with the correct initial value if {initial_value} was supplied', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + expect(input).toHaveDisplayValue('42.00'); + }); + + it('should not change the value on non-numeric and non-"." inputs', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + userEvent.type(input, 'abcdef!@#$%^&*()_+-={}[];\'"|\\/,.<>'); + expect(input).toHaveDisplayValue('0.00'); + }); + + it('should change the value like an ATM, i.e. from right to left, when entering digits', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + userEvent.type(input, '1'); + expect(input).toHaveDisplayValue('0.01'); + userEvent.type(input, '2'); + expect(input).toHaveDisplayValue('0.12'); + userEvent.type(input, '3'); + expect(input).toHaveDisplayValue('1.23'); + }); + + it('should add commas for big values', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + userEvent.type(input, '123456789'); + expect(input).toHaveDisplayValue('1,234,567.89'); + }); + + it('should not remove "0.00" when backspacing', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + userEvent.type(input, '100'); + expect(input).toHaveDisplayValue('1.00'); + userEvent.clear(input); + expect(input).toHaveDisplayValue('0.00'); + }); + + it('should not accept more than {maxDigits} digits', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + userEvent.type(input, '1234567890987654321'); + expect(input).toHaveDisplayValue('1,234,567.89'); + }); + + it('should work correctly with explicitly set {decimal_points}', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + expect(input).toHaveDisplayValue('0.00000'); + userEvent.type(input, '12345678'); + expect(input).toHaveDisplayValue('123.45678'); + }); + + it('should allow pasting numbers and then interpret those correctly', () => { + render(); + const input = screen.getByTestId('dt_amount-input'); + const values = [ + ['123', '123.00'], + ['123.42', '123.42'], + ['123,42', '123.42'], + ['123,000.00', '123,000.00'], + ]; + values.forEach(pair => { + userEvent.clear(input); + userEvent.click(input); + userEvent.paste(input, pair[0]); + expect(input).toHaveDisplayValue(pair[1]); + }); + }); +}); diff --git a/packages/components/src/components/amount-input/amount-input.scss b/packages/components/src/components/amount-input/amount-input.scss new file mode 100644 index 000000000000..0a4b9f2f84a8 --- /dev/null +++ b/packages/components/src/components/amount-input/amount-input.scss @@ -0,0 +1,51 @@ +.amount-input-wrapper { + display: flex; + flex-direction: column; + padding: 0.8rem; + height: auto; +} + +.amount-input-container { + position: relative; + height: 2.8rem; + + .dc-input__field { + color: var(--text-general); + } + + &--error { + .dc-input__field { + color: var(--text-loss-danger); + -webkit-text-fill-color: var(--text-loss-danger); + } + } + + &--disabled { + .dc-input__field { + color: var(--text-disabled-1); + } + } + + @include mobile { + height: 2.4rem; + } +} + +.amount-input { + position: absolute; + border: none; + flex: 1; + margin: 0; + padding: 0; + height: 100%; + width: 100%; + + input { + font-size: var(--text-size-sm); + font-weight: var(--text-weight-bold); + + @include mobile { + font-size: var(--text-size-s); + } + } +} diff --git a/packages/components/src/components/amount-input/amount-input.tsx b/packages/components/src/components/amount-input/amount-input.tsx new file mode 100644 index 000000000000..95f1b21814e3 --- /dev/null +++ b/packages/components/src/components/amount-input/amount-input.tsx @@ -0,0 +1,151 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import classNames from 'classnames'; +import { isMobile } from '@deriv/shared'; +import Input from '../input'; +import Text from '../text'; + +type TAmountInput = { + currency: string; + decimal_places?: number; + disabled?: boolean; + has_error?: boolean; + initial_value?: number; + label?: string; + locale?: Intl.LocalesArgument; + max_digits?: number; + onChange?: (value: number) => void; +}; + +const AmountInput = ({ + currency, + decimal_places = 2, + disabled = false, + has_error, + initial_value = 0, + label, + locale, + max_digits = 8, + onChange, +}: TAmountInput) => { + const [value, setValue] = useState(initial_value); + const [focus, setFocus] = useState(false); + const [is_pasting, setIsPasting] = useState(false); + const [caret_right_offset, setCaretRightOffset] = useState(0); + const [selection, setSelection] = useState<{ + selectionStart: number; + selectionEnd: number; + }>({ selectionStart: 0, selectionEnd: 0 }); + const [target, setTarget] = useState['target']>(); + + const displayNumber = useCallback( + (number: number) => number.toLocaleString(locale, { minimumFractionDigits: decimal_places }), + [decimal_places, locale] + ); + + useEffect(() => { + setValue(initial_value); + }, [initial_value]); + + useEffect(() => { + // update caret position every time the value changes (this happens after onChange) + const updated_caret_position = displayNumber(value).length - caret_right_offset; + target?.setSelectionRange(updated_caret_position, updated_caret_position); + setSelection({ selectionStart: updated_caret_position, selectionEnd: updated_caret_position }); + }, [value, target, displayNumber]); + + const onChangeHandler: React.ComponentProps['onChange'] = e => { + if (!target) setTarget(e.target); + let new_value = value; + if (!is_pasting) { + // handle ATM typing: + // remove all characters that are not digit / point / comma: + const input_value = e.target.value.replace(/[^\d.,]/g, ''); + if (input_value.replace(/[.,]/g, '').replace(/^0+/g, '').length <= max_digits) + new_value = Number(input_value.replace(/[.,]/g, '')) / Math.pow(10, decimal_places); + } else { + // handle pasting: + const selection_length = selection.selectionEnd - selection.selectionStart; + const pasted_string_length = e.target.value.length + selection_length - displayNumber(value).length; + const pasted_string = e.target.value.substring( + selection.selectionStart, + selection.selectionStart + pasted_string_length + ); + // remove all characters that are not digit / point / comma: + const input_value = e.target.value.replace(/[^\d.,]/g, ''); + // understand the value user wants to paste: + const pasted_value = pasted_string + .replace(/[^\d.,]/g, '') // remove all characters that are not digit / point / comma + .replace(/[,.](?=.*[,.])/g, '') // leave only the last point / comma + .replace(',', '.'); // make the last point / comma separator a point + if (pasted_value.replace('.', '')) { + // if the value is a valid non-empty string, handle the two scenarios: + if ((value === 0 && caret_right_offset === 0) || selection_length === displayNumber(value).length) { + // handle pasting when there's nothing entered before it, or it is overridden (intention: reset value): + new_value = Number( + pasted_value.substring( + 0, + pasted_value.includes('.') ? max_digits + 1 : max_digits - decimal_places + ) + ); + } else if (input_value.replace(/[.,]/g, '').replace(/^0+/g, '').length <= max_digits) { + // handle pasting when there's something entered before it and there's space for the pasted value (intention: add to value): + new_value = Number(input_value.replace(/[.,]/g, '')) / Math.pow(10, decimal_places); + } + } + } + setValue(new_value); + setIsPasting(false); + onChange?.(new_value); + }; + + const inputActionHandler: React.ComponentProps['onMouseDown'] & + React.ComponentProps['onMouseUp'] & + React.ComponentProps['onKeyDown'] = e => { + if (e.currentTarget.selectionStart !== null && e.currentTarget.selectionEnd !== null) { + setCaretRightOffset(e.currentTarget.value.length - e.currentTarget.selectionEnd); + setSelection({ + selectionStart: e.currentTarget.selectionStart, + selectionEnd: e.currentTarget.selectionEnd, + }); + } + }; + + return ( +
+ {label} +
+ undefined} + /> + setFocus(true)} + onBlur={() => setFocus(false)} + onChange={onChangeHandler} + onKeyDown={inputActionHandler} + onMouseDown={inputActionHandler} + onMouseUp={inputActionHandler} + onPaste={() => setIsPasting(true)} + type='text' + inputMode='numeric' + value={displayNumber(value)} + /> +
+
+ ); +}; + +export default AmountInput; diff --git a/packages/components/src/components/amount-input/index.ts b/packages/components/src/components/amount-input/index.ts new file mode 100644 index 000000000000..ee447d524403 --- /dev/null +++ b/packages/components/src/components/amount-input/index.ts @@ -0,0 +1,4 @@ +import AmountInput from './amount-input'; +import './amount-input.scss'; + +export default AmountInput; diff --git a/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.scss b/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.scss new file mode 100644 index 000000000000..afc5625a4566 --- /dev/null +++ b/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.scss @@ -0,0 +1,56 @@ +@mixin container-space($parent, $space) { + #{$parent}__top-icon { + top: $space * 1rem; + left: $space * 1rem; + } + + #{$parent}__bottom-icon { + bottom: $space * 1rem; + right: $space * 1rem; + } +} + +.app-icon { + $p-app-icon: &; + + position: relative; + display: flex; + align-items: center; + justify-content: center; + border-radius: $BORDER_RADIUS; + overflow: hidden; + + &__top-icon { + position: absolute; + top: 0; + left: 0; + z-index: 1; + } + + &__bottom-icon { + position: absolute; + bottom: 0; + right: 0; + } + + &--small { + width: 4rem; + height: 2.4rem; + + @include container-space($p-app-icon, 0.1); + } + + &--medium { + width: 6.4rem; + height: 4rem; + + @include container-space($p-app-icon, 0.2); + } + + &--large { + width: 12.8rem; + height: 8rem; + + @include container-space($p-app-icon, 0.4); + } +} diff --git a/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.tsx b/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.tsx new file mode 100644 index 000000000000..4b8942096d31 --- /dev/null +++ b/packages/components/src/components/app-linked-with-wallet-icon/app-linked-with-wallet-icon.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { WalletIcon } from '../wallet-icon'; +import './app-linked-with-wallet-icon.scss'; + +type TAppIconProps = { + app_icon: string; + gradient_class: string; + has_bg?: boolean; + hide_watermark?: boolean; + size?: 'small' | 'medium' | 'large'; + type: React.ComponentProps['type']; + wallet_icon: string; +}; + +/** + * Use the WalletIcon sizes + */ +const sizes = { + top: { + small: 'small', + medium: 'medium', + large: 'xlarge', + }, + bottom: { + small: 'xsmall', + medium: 'small', + large: 'large', + }, +} as const; + +const AppLinkedWithWalletIcon = ({ + app_icon, + gradient_class, + hide_watermark, + size = 'medium', + type, + wallet_icon, +}: TAppIconProps) => { + if (!app_icon || !wallet_icon || !gradient_class) { + return null; + } + + return ( +
+ {/* Top Icon */} +
+ +
+ + {/* Bottom Icon */} +
+ +
+
+ ); +}; + +export default AppLinkedWithWalletIcon; diff --git a/packages/components/src/components/app-linked-with-wallet-icon/index.ts b/packages/components/src/components/app-linked-with-wallet-icon/index.ts new file mode 100644 index 000000000000..b601135cad4c --- /dev/null +++ b/packages/components/src/components/app-linked-with-wallet-icon/index.ts @@ -0,0 +1,3 @@ +import AppLinkedWithWalletIcon from './app-linked-with-wallet-icon'; + +export { AppLinkedWithWalletIcon }; diff --git a/packages/components/src/components/badge/__tests__/badge.spec.tsx b/packages/components/src/components/badge/__tests__/badge.spec.tsx new file mode 100644 index 000000000000..5d93634423ad --- /dev/null +++ b/packages/components/src/components/badge/__tests__/badge.spec.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { isMobile } from '@deriv/shared'; +import Badge from '../badge'; + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isMobile: jest.fn(), +})); + +describe('Badge component', () => { + beforeEach(() => { + (isMobile as jest.Mock).mockReturnValue(true); + }); + + afterEach(() => { + (isMobile as jest.Mock).mockReset(); + }); + + it('Should render properly with default values and label', () => { + render(); + expect(screen.getByText('Badge')).toBeInTheDocument(); + }); + + it('Should render proper medium badge in mobile view', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('height: 1.2rem'); + expect(badge).toHaveStyle('padding-inline: 0.4rem'); + }); + + it('Should render proper medium badge in desktop view', () => { + (isMobile as jest.Mock).mockReturnValue(false); + + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('height: 1.4rem'); + expect(badge).toHaveStyle('padding-inline: 0.4rem'); + }); + + it('Should render proper large badge in mobile view', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('height: 1.6rem'); + expect(badge).toHaveStyle('padding-inline: 0.8rem'); + }); + + it('Should render proper large badge in desktop view', () => { + (isMobile as jest.Mock).mockReturnValue(false); + + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('height: 2.2rem'); + expect(badge).toHaveStyle('padding-inline: 0.8rem'); + }); + + it('Should render badge with normal font weight', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('--text-weight: var(--text-weight-normal)'); + }); + + it('Should render badge with normal font weight', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('--text-weight: var(--text-weight-bold)'); + }); + + it('Should render badge with proper font-size in mobile view', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('--text-size: var(--text-size-xxxxs)'); + }); + + it('Should render badge with proper font-size in desktop view', () => { + (isMobile as jest.Mock).mockReturnValue(false); + + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveStyle('--text-size: var(--text-size-xxxs)'); + }); + + it('Should render badge with proper amount of rounded corners', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveClass('dc-badge--two-rounded'); + }); + + it('Should render badge with bordered type', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveClass('dc-badge--bordered'); + }); + + it('Should render badge with contained type', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveClass('dc-badge--contained'); + }); + + it('Should render badge with contained type and red background', () => { + render(); + const badge = screen.getByText('Badge'); + expect(badge).toHaveClass('dc-badge--contained dc-badge--red'); + expect(badge).toHaveClass('dc-badge--contained dc-badge--red'); + }); +}); diff --git a/packages/components/src/components/badge/badge.scss b/packages/components/src/components/badge/badge.scss new file mode 100644 index 000000000000..70392d4057ba --- /dev/null +++ b/packages/components/src/components/badge/badge.scss @@ -0,0 +1,40 @@ +.dc-badge { + display: inline-flex; + justify-content: center; + align-items: center; + color: $color-white; + + &--contained { + border: none; + } + + &--bordered { + border: 1px solid var(--text-prominent); + color: var(--text-prominent); + } + + &--blue { + background-color: $color-blue; + } + + &--orange { + background-color: $color-orange; + } + + &--red { + background-color: $color-red; + } + + &--gray { + background-color: $color-grey-5; + } + + &--full-rounded { + border-radius: $BORDER_RADIUS/2; + } + + &--two-rounded { + border-bottom-left-radius: $BORDER_RADIUS * 2; + border-top-right-radius: $BORDER_RADIUS * 2; + } +} diff --git a/packages/components/src/components/badge/badge.tsx b/packages/components/src/components/badge/badge.tsx new file mode 100644 index 000000000000..b588b1a3fd47 --- /dev/null +++ b/packages/components/src/components/badge/badge.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import classNames from 'classnames'; +import { isMobile } from '@deriv/shared'; +import Text from '../text'; + +type TBadgeSize = 'medium' | 'large'; +type TWeight = 'bold' | 'normal'; +type TBackgroundColor = 'blue' | 'orange' | 'red' | 'gray'; +type TRoundedCorners = 4 | 2; + +interface Badge extends React.HTMLAttributes { + className?: string; + custom_color?: string; + label: string; + rounded_corners?: TRoundedCorners; + size?: TBadgeSize; + weight?: TWeight; +} + +interface BadgeContained extends Badge { + type: 'contained'; + background_color: TBackgroundColor; +} + +interface BadgeBordered extends Badge { + type: 'bordered'; +} + +type BadgeProps = BadgeContained | BadgeBordered; + +const Badge = (props: BadgeProps) => { + const { + className, + custom_color, + label, + rounded_corners = 4, + size = 'medium', + type, + weight = 'bold', + ...rest + } = props; + + const is_contained = type === 'contained'; + const is_bordered = type === 'bordered'; + + const badge_height = React.useMemo(() => { + switch (size) { + case 'large': + return { + height: isMobile() ? '1.6rem' : '2.2rem', + paddingInline: '0.8rem', + }; + case 'medium': + default: + return { + height: isMobile() ? '1.2rem' : '1.4rem', + paddingInline: '0.4rem', + }; + } + }, [size]); + + const badge_class_names = React.useMemo(() => { + return classNames( + 'dc-badge', + { + 'dc-badge--contained': is_contained, + 'dc-badge--bordered': is_bordered, + 'dc-badge--blue': is_contained && props.background_color === 'blue', + 'dc-badge--orange': is_contained && props.background_color === 'orange', + 'dc-badge--red': is_contained && props.background_color === 'red', + 'dc-badge--gray': is_contained && props.background_color === 'gray', + 'dc-badge--full-rounded': rounded_corners === 4, + 'dc-badge--two-rounded': rounded_corners === 2, + }, + className + ); + }, [className, is_bordered, is_contained, is_contained && props.background_color, rounded_corners]); + + if (!label) return null; + + return ( + + {label} + + ); +}; + +export default Badge; diff --git a/packages/components/src/components/badge/index.ts b/packages/components/src/components/badge/index.ts new file mode 100644 index 000000000000..df4fc62f3ce8 --- /dev/null +++ b/packages/components/src/components/badge/index.ts @@ -0,0 +1,4 @@ +import Badge from './badge'; +import './badge.scss'; + +export default Badge; diff --git a/packages/components/src/components/calendar/calendar-body.tsx b/packages/components/src/components/calendar/calendar-body.tsx index eb16d0a4ef1e..4b097cbdcbd9 100644 --- a/packages/components/src/components/calendar/calendar-body.tsx +++ b/packages/components/src/components/calendar/calendar-body.tsx @@ -5,13 +5,13 @@ import { CommonPropTypes } from './views/types'; type TBodyProps = CommonPropTypes & { calendar_view: string; date_format: string; - disabled_days: number[]; + disabled_days?: number[]; start_date: string; - events: Array<{ + events?: Array<{ dates: string[]; descrip: string; }>; - has_range_selection: boolean; + has_range_selection?: boolean; hovered_date: string | null; onMouseLeave?: React.MouseEventHandler; onMouseOver?: React.MouseEventHandler; diff --git a/packages/components/src/components/calendar/calendar-footer.tsx b/packages/components/src/components/calendar/calendar-footer.tsx index 9f1853dafa5b..e00a785bbbc9 100644 --- a/packages/components/src/components/calendar/calendar-footer.tsx +++ b/packages/components/src/components/calendar/calendar-footer.tsx @@ -6,7 +6,7 @@ type TFooterProps = { clear_text?: string; footer: string; has_clear_btn?: boolean; - has_today_btn: boolean; + has_today_btn?: boolean; onClick?: React.MouseEventHandler; onClear?: React.MouseEventHandler; use_icon?: string; diff --git a/packages/components/src/components/calendar/calendar.tsx b/packages/components/src/components/calendar/calendar.tsx index 288f9a16f031..bd898d3e5d59 100644 --- a/packages/components/src/components/calendar/calendar.tsx +++ b/packages/components/src/components/calendar/calendar.tsx @@ -7,30 +7,30 @@ import { getDate } from './helpers/constants'; type TCalendarProps = { date_format?: string; - footer: string; - has_today_btn: boolean; - holidays: Array<{ + footer?: string; + has_today_btn?: boolean; + holidays?: Array<{ dates: string[]; descrip: string; }>; max_date?: string; min_date?: string; - onChangeCalendarMonth: (start_of_month: string) => void; + onChangeCalendarMonth?: (start_of_month: string) => void; onSelect: (formatted_date: string, keep_open: boolean) => void; - start_date: string; + start_date?: string; value: string; - disable_days: number[]; + disable_days?: number[]; calendar_view?: string; calendar_el_ref: React.RefObject; - disabled_days: number[]; - events: Array<{ + disabled_days?: number[]; + events?: Array<{ dates: string[]; descrip: string; }>; - has_range_selection: boolean; - keep_open: boolean; + has_range_selection?: boolean; + keep_open?: boolean; onHover?: (selected_date: moment.MomentInput | null) => void; - should_show_today: boolean; + should_show_today?: boolean; }; type TCalendarRef = { @@ -52,7 +52,7 @@ const Calendar: React.MemoExoticComponent< date_format = 'YYYY-MM-DD', disabled_days, events, - footer, + footer = '', has_today_btn, has_range_selection, keep_open, @@ -61,7 +61,7 @@ const Calendar: React.MemoExoticComponent< onChangeCalendarMonth, onHover, onSelect, - start_date, + start_date = '', value, should_show_today, }, @@ -137,7 +137,7 @@ const Calendar: React.MemoExoticComponent< setSelectedDate(formatted_date); if (onSelect) { - onSelect(formatted_date, keep_open); + onSelect(formatted_date, !!keep_open); } }; @@ -211,7 +211,7 @@ const Calendar: React.MemoExoticComponent< hovered_date={hovered_date} onMouseOver={onMouseOver} onMouseLeave={onMouseLeave} - should_show_today={should_show_today} + should_show_today={!!should_show_today} />
diff --git a/packages/components/src/components/calendar/views/calendar-days.tsx b/packages/components/src/components/calendar/views/calendar-days.tsx index 257f5c764f35..19c3d7727595 100644 --- a/packages/components/src/components/calendar/views/calendar-days.tsx +++ b/packages/components/src/components/calendar/views/calendar-days.tsx @@ -17,7 +17,7 @@ import Text from '../../text'; type TDaysProps = CommonPropTypes & { date_format: string; - has_range_selection: boolean; + has_range_selection?: boolean; events?: Array<{ dates: string[]; descrip: string; diff --git a/packages/components/src/components/collapsible/arrow-button.tsx b/packages/components/src/components/collapsible/arrow-button.tsx index 42654e49280d..ad616e8cacf0 100644 --- a/packages/components/src/components/collapsible/arrow-button.tsx +++ b/packages/components/src/components/collapsible/arrow-button.tsx @@ -13,7 +13,7 @@ type TArrowButton = { is_open?: boolean; onClick: () => void; title?: string; - position: 'top' | 'bottom'; + position?: 'top' | 'bottom'; }; const IconArrow = ({ className }: { className?: string }) => ( diff --git a/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.tsx b/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.tsx index 7c0153eee830..54aa0019758a 100644 --- a/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.tsx @@ -24,7 +24,7 @@ type TAccumulatorCardBody = { getContractById: React.ComponentProps['getContractById']; indicative?: number; is_sold: boolean; - onMouseLeave: () => void; + onMouseLeave?: () => void; removeToast: (toast_id: string) => void; setCurrentFocus: (value: string) => void; status?: string; diff --git a/packages/components/src/components/contract-card/contract-card-items/contract-card-body.tsx b/packages/components/src/components/contract-card/contract-card-items/contract-card-body.tsx index 2f72de4633be..f9fe7c825133 100644 --- a/packages/components/src/components/contract-card/contract-card-items/contract-card-body.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/contract-card-body.tsx @@ -31,11 +31,11 @@ export type TGeneralContractCardBodyProps = { has_progress_slider: boolean; is_mobile: boolean; is_sold: boolean; - onMouseLeave: () => void; + onMouseLeave?: () => void; removeToast: (toast_id: string) => void; setCurrentFocus: (name: string) => void; status?: string; - toggleCancellationWarning: () => void; + toggleCancellationWarning: (state_change?: boolean) => void; progress_slider?: React.ReactNode; is_positions?: boolean; }; diff --git a/packages/components/src/components/contract-card/contract-card-items/contract-card-footer.tsx b/packages/components/src/components/contract-card/contract-card-items/contract-card-footer.tsx index d599eb7b1081..db1988ca776d 100644 --- a/packages/components/src/components/contract-card/contract-card-items/contract-card-footer.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/contract-card-footer.tsx @@ -11,13 +11,13 @@ export type TCardFooterPropTypes = { contract_info: TContractInfo; getCardLabels: TGetCardLables; is_multiplier?: boolean; - is_positions: boolean; + is_positions?: boolean; is_sell_requested: boolean; onClickCancel: (contract_id?: number) => void; onClickSell: (contract_id?: number) => void; onFooterEntered?: () => void; server_time: moment.Moment; - should_show_transition: boolean; + should_show_transition?: boolean; }; const CardFooter = ({ @@ -32,7 +32,7 @@ const CardFooter = ({ server_time, should_show_transition, }: TCardFooterPropTypes) => { - const { in_prop } = useNewRowTransition(should_show_transition); + const { in_prop } = useNewRowTransition(!!should_show_transition); const is_valid_to_cancel = isValidToCancel(contract_info); diff --git a/packages/components/src/components/contract-card/contract-card-items/contract-card-header.tsx b/packages/components/src/components/contract-card/contract-card-items/contract-card-header.tsx index 4079df1bb026..1ce4c8a311d1 100644 --- a/packages/components/src/components/contract-card/contract-card-items/contract-card-header.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/contract-card-header.tsx @@ -1,17 +1,16 @@ import React from 'react'; import classNames from 'classnames'; import { CSSTransition } from 'react-transition-group'; -import { localize } from '@deriv/translations'; import { isHighLow, getCurrentTick, getGrowthRatePercentage, - getContractSubtype, isAccumulatorContract, isSmartTraderContract, isBot, isMobile, isTurbosContract, + getLocalizedTurbosSubtype, } from '@deriv/shared'; import ContractTypeCell from './contract-type-cell'; import Button from '../../button'; @@ -83,8 +82,7 @@ const ContractCardHeader = ({ }, { is_param_displayed: is_turbos, - displayed_param: - getContractSubtype(contract_type || '') === 'Long' ? localize('Long') : localize('Short'), + displayed_param: getLocalizedTurbosSubtype(contract_type), }, ], [multiplier, growth_rate, is_accumulator, is_turbos, contract_type] diff --git a/packages/components/src/components/contract-card/contract-card-items/contract-type-cell.tsx b/packages/components/src/components/contract-card/contract-card-items/contract-type-cell.tsx index ef5d594ac828..41629909cfd9 100644 --- a/packages/components/src/components/contract-card/contract-card-items/contract-type-cell.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/contract-type-cell.tsx @@ -9,7 +9,7 @@ export type TContractTypeCellProps = { is_high_low: boolean; multiplier?: number; type?: string; - displayed_trade_param?: string; + displayed_trade_param?: React.ReactNode; }; const ContractTypeCell = ({ diff --git a/packages/components/src/components/contract-card/contract-card-items/contract-update-form.tsx b/packages/components/src/components/contract-card/contract-card-items/contract-update-form.tsx index 1e116c67e966..a337de1179df 100644 --- a/packages/components/src/components/contract-card/contract-card-items/contract-update-form.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/contract-update-form.tsx @@ -33,7 +33,7 @@ export type TContractUpdateFormProps = Pick< contract: TContractStore; error_message_alignment?: string; getCardLabels: TGetCardLables; - onMouseLeave: () => void; + onMouseLeave?: () => void; removeToast: (toast_id: string) => void; setCurrentFocus: (name: string | null) => void; status: string; diff --git a/packages/components/src/components/contract-card/contract-card-items/toggle-card-dialog.tsx b/packages/components/src/components/contract-card/contract-card-items/toggle-card-dialog.tsx index ce87b3690213..1ef02a0e921f 100644 --- a/packages/components/src/components/contract-card/contract-card-items/toggle-card-dialog.tsx +++ b/packages/components/src/components/contract-card/contract-card-items/toggle-card-dialog.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { isDesktop, isMobile } from '@deriv/shared'; import ContractCardDialog from './contract-card-dialog'; import ContractUpdateForm from './contract-update-form'; +import PopoverMessageCheckbox from '../../popover-message-checkbox'; import Icon from '../../icon'; import DesktopWrapper from '../../desktop-wrapper'; import MobileDialog from '../../mobile-dialog'; @@ -56,7 +57,7 @@ const ToggleCardDialog = ({ const [is_visible, setIsVisible] = React.useState(false); const [top, setTop] = React.useState(0); const [left, setLeft] = React.useState(0); - const is_do_not_show_selected = !should_show_cancellation_warning; + const [should_hide_selected, setShouldHideSelected] = React.useState(!should_show_cancellation_warning); const toggle_ref = React.useRef(null); const dialog_ref = React.useRef(null); @@ -93,11 +94,15 @@ const ToggleCardDialog = ({ }; const onPopoverClose = () => { - if (is_do_not_show_selected) { + if (should_hide_selected) { toggleCancellationWarning?.(); } }; + const onPopoverCheckboxChange = () => { + setShouldHideSelected(!should_hide_selected); + }; + const toggleDialog = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); @@ -133,7 +138,15 @@ const ToggleCardDialog = ({ is_bubble_hover_enabled margin={2} zIndex='2' - message={getCardLabels().TAKE_PROFIT_LOSS_NOT_AVAILABLE} + message={ + + } onBubbleClose={onPopoverClose} >
{edit_icon}
diff --git a/packages/components/src/components/contract-card/contract-card.tsx b/packages/components/src/components/contract-card/contract-card.tsx index 77a54f5f9ecb..94993077b32e 100644 --- a/packages/components/src/components/contract-card/contract-card.tsx +++ b/packages/components/src/components/contract-card/contract-card.tsx @@ -14,15 +14,15 @@ import { TGetCardLables, TGetContractPath } from '../types'; type TContractCardProps = { contract_info: TContractInfo; getCardLabels: TGetCardLables; - getContractPath: TGetContractPath; + getContractPath?: TGetContractPath; is_multiplier: boolean; - is_positions: boolean; - is_unsupported: boolean; - onClickRemove: (contract_id: number) => void; + is_positions?: boolean; + is_unsupported?: boolean; + onClickRemove?: (contract_id?: number) => void; profit_loss: number; - result: string; + result?: string; should_show_result_overlay: boolean; - toggleUnsupportedContractModal: (is_unsupported_contract_modal_visible: boolean) => void; + toggleUnsupportedContractModal?: (is_unsupported_contract_modal_visible: boolean) => void; }; const ContractCard = ({ @@ -53,7 +53,7 @@ const ContractCard = ({ is_multiplier={is_multiplier} is_visible={!!contract_info.is_sold} onClickRemove={onClickRemove} - onClick={() => toggleUnsupportedContractModal(true)} + onClick={() => toggleUnsupportedContractModal?.(true)} result={result || fallback_result} is_positions={is_positions} /> diff --git a/packages/components/src/components/contract-card/result-overlay/result-overlay.tsx b/packages/components/src/components/contract-card/result-overlay/result-overlay.tsx index 25be6f8cf87a..6a3b63c094f6 100644 --- a/packages/components/src/components/contract-card/result-overlay/result-overlay.tsx +++ b/packages/components/src/components/contract-card/result-overlay/result-overlay.tsx @@ -8,13 +8,13 @@ import { TGetCardLables, TGetContractPath } from '../../types'; type TResultOverlayProps = { contract_id?: number; getCardLabels: TGetCardLables; - getContractPath: TGetContractPath; + getContractPath?: TGetContractPath; is_multiplier?: boolean; - is_positions: boolean; - is_unsupported: boolean; + is_positions?: boolean; + is_unsupported?: boolean; is_visible: boolean; onClick: () => void; - onClickRemove: (contract_id: number) => void; + onClickRemove?: (contract_id?: number) => void; result: string; }; @@ -88,7 +88,9 @@ const ResultOverlay = ({ onClickRemove(Number(contract_id))} + onClick={() => { + if (contract_id) onClickRemove?.(contract_id); + }} /> )} {getContractPath && ( diff --git a/packages/components/src/components/date-picker/date-picker-calendar.tsx b/packages/components/src/components/date-picker/date-picker-calendar.tsx index 0b1c63c1cb72..fa72b7fcb1d6 100644 --- a/packages/components/src/components/date-picker/date-picker-calendar.tsx +++ b/packages/components/src/components/date-picker/date-picker-calendar.tsx @@ -11,29 +11,29 @@ type TDatePickerCalendarProps = { is_datepicker_visible: boolean; calendar_el_ref: React.RefObject; parent_ref: React.RefObject; - portal_id: string; + portal_id?: string; style: React.CSSProperties; placement: string; onSelect: (formatted_date: string, keep_open: boolean) => void; calendar_view?: 'date' | 'month' | 'year' | 'decade'; - keep_open: boolean; - footer: string; - has_today_btn: boolean; - holidays: Array<{ + keep_open?: boolean; + footer?: string; + has_today_btn?: boolean; + holidays?: Array<{ dates: string[]; descrip: string; }>; - onChangeCalendarMonth: (start_of_month: string) => void; - start_date: string; - disable_days: number[]; - disabled_days: number[]; - events: Array<{ + onChangeCalendarMonth?: (start_of_month: string) => void; + start_date?: string; + disable_days?: number[]; + disabled_days?: number[]; + events?: Array<{ dates: string[]; descrip: string; }>; - has_range_selection: boolean; + has_range_selection?: boolean; onHover?: (selected_date: moment.MomentInput | null) => void; - should_show_today: boolean; + should_show_today?: boolean; }; type TCalendarRef = { diff --git a/packages/components/src/components/date-picker/date-picker-native.tsx b/packages/components/src/components/date-picker/date-picker-native.tsx index 089c17a15ba0..3025a9fd4483 100644 --- a/packages/components/src/components/date-picker/date-picker-native.tsx +++ b/packages/components/src/components/date-picker/date-picker-native.tsx @@ -4,21 +4,21 @@ import { toMoment } from '@deriv/shared'; import Icon from '../icon'; import Text from '../text'; -type TDatePickerNativeProps = Omit, 'onSelect'> & { +type TDatePickerNativeProps = Omit, 'onSelect' | 'onChange'> & { value: string | null; - label: string; - placeholder: string; - max_date: moment.Moment; - min_date: moment.Moment; - display_format: string; - data_testid: string; - name: string; + label?: string; + placeholder?: string; + max_date?: moment.Moment | string; + min_date?: moment.Moment | string; + display_format?: string; + data_testid?: string; + name?: string; error?: string; - disabled: boolean; + disabled?: boolean; hint?: string; onSelect: (selected_date: string) => void; - onBlur: React.FocusEventHandler; - onFocus: React.FocusEventHandler; + onBlur?: React.FocusEventHandler; + onFocus?: React.FocusEventHandler; }; const Native = ({ diff --git a/packages/components/src/components/date-picker/date-picker.tsx b/packages/components/src/components/date-picker/date-picker.tsx index f3934fad7ec6..4b11b61e7961 100644 --- a/packages/components/src/components/date-picker/date-picker.tsx +++ b/packages/components/src/components/date-picker/date-picker.tsx @@ -6,24 +6,26 @@ import Native from './date-picker-native'; import MobileWrapper from '../mobile-wrapper'; import DesktopWrapper from '../desktop-wrapper'; import { useOnClickOutside } from '../../hooks/use-onclickoutside'; -import { MomentInput } from 'moment'; +import moment, { MomentInput } from 'moment'; +import { TDatePickerOnChangeEvent } from '../types'; -type TDatePickerOnChangeEvent = { - date?: string; - duration?: number | null | string; - target?: { name: string; value: number | string | moment.Moment | null }; -}; type TDatePicker = Omit< React.ComponentProps & React.ComponentProps & React.ComponentProps, - 'value' | 'onSelect' | 'is_datepicker_visible' | 'placement' | 'style' | 'calendar_el_ref' | 'parent_ref' + | 'date_format' + | 'onSelect' + | 'is_datepicker_visible' + | 'is_placeholder_visible' + | 'placement' + | 'style' + | 'calendar_el_ref' + | 'parent_ref' + | 'onChange' + | 'onChangeInput' > & { - mode: string; - start_date: moment.Moment; + mode?: string; value: moment.Moment | string; onChange: (e: TDatePickerOnChangeEvent) => void; - footer: React.ReactElement; - date_format: string; - has_range_selection: boolean; + date_format?: string; }; type TCalendarRef = { @@ -46,7 +48,7 @@ const DatePicker = React.memo((props: TDatePicker) => { max_date, min_date, start_date, - name, + name = '', onBlur, onChange, onFocus, diff --git a/packages/components/src/components/dialog/dialog.tsx b/packages/components/src/components/dialog/dialog.tsx index e45ceba656d4..7bd402d56707 100644 --- a/packages/components/src/components/dialog/dialog.tsx +++ b/packages/components/src/components/dialog/dialog.tsx @@ -98,7 +98,7 @@ const Dialog = ({ } }; - const validateClickOutside = () => !!(dismissable || (has_close_icon && is_visible && is_closed_on_cancel)); + const validateClickOutside = () => !!dismissable || !!(has_close_icon && is_visible && is_closed_on_cancel); useOnClickOutside(wrapper_ref, handleClose, validateClickOutside); diff --git a/packages/components/src/components/div100vh-container/div100vh-container.tsx b/packages/components/src/components/div100vh-container/div100vh-container.tsx index 6bcf1a60361a..426772e5a777 100644 --- a/packages/components/src/components/div100vh-container/div100vh-container.tsx +++ b/packages/components/src/components/div100vh-container/div100vh-container.tsx @@ -15,14 +15,14 @@ import Div100vh from 'react-div-100vh'; /* To bypass usage of component altogether, use is_bypassed */ type TDiv100vhContainer = { - id?: string; height_offset?: string; is_bypassed?: boolean; is_disabled?: boolean; max_height_offset?: string; - className: string; + className?: string; max_autoheight_offset?: string; -}; + id?: string; +} & React.ComponentProps<'div'>; const Div100vhContainer = ({ children, diff --git a/packages/components/src/components/empty-state/empty-state.scss b/packages/components/src/components/empty-state/empty-state.scss index c8d32e5fc7d1..36dc95f1aede 100644 --- a/packages/components/src/components/empty-state/empty-state.scss +++ b/packages/components/src/components/empty-state/empty-state.scss @@ -1,8 +1,19 @@ .empty-state { width: 100%; display: flex; - flex: 1; flex-direction: column; align-items: center; - gap: 1.4rem; + gap: 2.4rem; + + &__content { + display: flex; + flex-direction: column; + gap: 0.8rem; + } + + &__action .dc-btn__text { + @include mobile { + font-size: var(--text-size-xxs); + } + } } diff --git a/packages/components/src/components/empty-state/empty-state.tsx b/packages/components/src/components/empty-state/empty-state.tsx index c56b8a6ccc3e..21f9cf1bbca6 100644 --- a/packages/components/src/components/empty-state/empty-state.tsx +++ b/packages/components/src/components/empty-state/empty-state.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { isMobile } from '@deriv/shared'; import Button from '../button'; import Icon from '../icon'; import Text from '../text'; @@ -20,18 +21,18 @@ export type TProps = { const EmptyState: React.FC = ({ icon, title, description, action }) => (
{icon && } -
- {title && ( - - {title} - - )} - {description && ( - - {description} - - )} -
+
+ {title && ( + + {title} + + )} + {description && ( + + {description} + + )} +
{action && ( +
+ )} +
+ ); +}; + +export default AlertMessage; diff --git a/packages/components/src/components/message-list/index.ts b/packages/components/src/components/message-list/index.ts new file mode 100644 index 000000000000..bd4c491a159a --- /dev/null +++ b/packages/components/src/components/message-list/index.ts @@ -0,0 +1 @@ +export { default as MessageList } from './message-list'; diff --git a/packages/components/src/components/message-list/message-list.scss b/packages/components/src/components/message-list/message-list.scss new file mode 100644 index 000000000000..f5954f4ba4cd --- /dev/null +++ b/packages/components/src/components/message-list/message-list.scss @@ -0,0 +1,53 @@ +.message-list { + width: 100%; + max-width: 63.4rem; + margin: 0 auto; + min-height: 3.2rem; + + .alert-message { + display: flex; + flex-direction: row; + column-gap: 0.8rem; + justify-content: flex-start; + min-height: 3.2rem; + + @include mobile { + margin: 0; + } + + &__icon-container { + position: relative; + + .icon-container { + &__line { + border: 1px solid var(--border-normal); + position: absolute; + height: 100%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + &__icon { + display: flex; + position: relative; + margin-top: 0.8rem; + } + } + } + + &__message-container, + &__button-container { + display: flex; + align-items: center; + } + + &__message-container { + padding: 0.7rem 0; + } + + &__button-container { + margin-left: auto; + } + } +} diff --git a/packages/components/src/components/message-list/message-list.tsx b/packages/components/src/components/message-list/message-list.tsx new file mode 100644 index 000000000000..705fdba43438 --- /dev/null +++ b/packages/components/src/components/message-list/message-list.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import AlertMessage from './alert-message'; +import './message-list.scss'; + +type TMessageListProps = { list: (React.ComponentProps & { key: string })[] }; + +const animations = { + initial: { + height: 0, + opacity: 0, + }, + animate: { + height: 'auto', + opacity: 1, + transition: { + height: { + duration: 0.2, + }, + opacity: { + duration: 0.15, + delay: 0.05, + }, + }, + }, + exit: { + height: 0, + opacity: 0, + transition: { + height: { + duration: 0.2, + }, + opacity: { duration: 0.1 }, + }, + }, +}; + +const MessageList = ({ list }: TMessageListProps) => { + return ( +
+ + {list.map(item => { + return ( + + + + ); + })} + +
+ ); +}; + +export default MessageList; diff --git a/packages/components/src/components/mobile-dialog/mobile-dialog.tsx b/packages/components/src/components/mobile-dialog/mobile-dialog.tsx index 13355bb5d346..31189672c854 100644 --- a/packages/components/src/components/mobile-dialog/mobile-dialog.tsx +++ b/packages/components/src/components/mobile-dialog/mobile-dialog.tsx @@ -8,31 +8,31 @@ import Div100vhContainer from '../div100vh-container'; type TMobileDialog = { content_height_offset?: string; - onClose: React.MouseEventHandler; + footer?: React.ReactNode; has_content_scroll?: boolean; + has_close_icon?: boolean; + has_full_height?: boolean; + header_classname?: string; + onClose: React.MouseEventHandler; portal_element_id: string; renderTitle?: () => string; title?: React.ReactNode; visible?: boolean; wrapper_classname?: string; - header_classname?: string; - has_full_height?: boolean; - footer?: React.ReactNode; - has_close_icon?: boolean; }; const MobileDialog = (props: React.PropsWithChildren) => { const { - title, - visible, children, + footer, + has_close_icon = true, has_full_height, + header_classname, portal_element_id, renderTitle, + title, + visible, wrapper_classname, - footer, - has_close_icon = true, - header_classname, } = props; const footer_ref = React.useRef(null); diff --git a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.tsx b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.tsx index fb9ad3e19142..2f92b0f15bbc 100644 --- a/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.tsx +++ b/packages/components/src/components/mobile-drawer/mobile-drawer-submenu.tsx @@ -12,7 +12,7 @@ type TMobileDrawerSubmenu = { submenu_icon?: string; submenu_title?: string | React.ReactElement; submenu_suffix_icon?: string; - route_config_path: string; + route_config_path?: string; }; const SubMenu = ({ @@ -43,7 +43,9 @@ const SubMenu = ({ {submenu_title} diff --git a/packages/components/src/components/modal/modal.tsx b/packages/components/src/components/modal/modal.tsx index 526640ed61bd..9e36f9996fc3 100644 --- a/packages/components/src/components/modal/modal.tsx +++ b/packages/components/src/components/modal/modal.tsx @@ -209,6 +209,7 @@ type TModal = TModalElement & { exit_classname?: string; onEntered?: () => void; onExited?: () => void; + transition_timeout?: React.ComponentProps['timeout']; }; const Modal = ({ @@ -238,13 +239,14 @@ const Modal = ({ should_header_stick_body = true, small, title, + transition_timeout, toggleModal, width, }: React.PropsWithChildren) => ( ) => { let sign = ''; - if (+amount && (amount < 0 || has_sign)) { - sign = amount > 0 ? '+' : '-'; + if (Number(amount) && (Number(amount) < 0 || has_sign)) { + sign = Number(amount) > 0 ? '+' : '-'; } // if it's formatted already then don't make any changes unless we should remove extra -/+ signs diff --git a/packages/components/src/components/numpad/numpad.tsx b/packages/components/src/components/numpad/numpad.tsx index 662f840aaa33..e7f6c2e4dfd5 100644 --- a/packages/components/src/components/numpad/numpad.tsx +++ b/packages/components/src/components/numpad/numpad.tsx @@ -12,20 +12,20 @@ type TNumpad = { is_regular?: boolean; is_currency?: boolean; is_submit_disabled?: boolean; - label: string; + label?: string; reset_press_interval: number; reset_value: string; - max: number; - min: number; + max?: number; + min?: number; pip_size: number; onSubmit: (param: number | string) => void; - v: string; + v?: string; render?: (props: { value: string; className: string }) => React.ReactNode; submit_label: string; - value: string; - format: (v: string) => number; + value: string | number; + format?: (v: string) => number | string; onValueChange: (val: number | string) => void; - onValidate: (default_value: number | string) => string | undefined; + onValidate: (default_value: number | string) => boolean | 'error'; }; const concatenate = (number: string | number, default_value: string | number) => @@ -71,7 +71,7 @@ const Numpad = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [default_value, value]); - const updateValue = (val: string) => { + const updateValue = (val: string | number) => { setValue(val); if (onValueChange) onValueChange(val); }; diff --git a/packages/components/src/components/password-meter/password-meter.scss b/packages/components/src/components/password-meter/password-meter.scss index 9d75aa546ec9..93aa57c6fc14 100644 --- a/packages/components/src/components/password-meter/password-meter.scss +++ b/packages/components/src/components/password-meter/password-meter.scss @@ -7,7 +7,7 @@ &, &__bg { position: absolute; - bottom: 1px; + top: 3.5rem; left: 1px; height: 4px; border-radius: 0 0 3px 3px; diff --git a/packages/components/src/components/positions-drawer-card/positions-drawer-card.tsx b/packages/components/src/components/positions-drawer-card/positions-drawer-card.tsx index fd9ed4667948..7a1396fb1107 100644 --- a/packages/components/src/components/positions-drawer-card/positions-drawer-card.tsx +++ b/packages/components/src/components/positions-drawer-card/positions-drawer-card.tsx @@ -20,7 +20,7 @@ import { TToastConfig } from '../types/contract.types'; type TPositionsDrawerCardProps = { addToast: (toast_config: TToastConfig) => void; className?: string; - contract_info: TContractInfo; + contract_info?: TContractInfo; contract_update?: TContractInfo['contract_update']; currency: string; current_focus: string | null; @@ -29,21 +29,21 @@ type TPositionsDrawerCardProps = { is_mobile?: boolean; is_sell_requested?: boolean; is_unsupported?: boolean; - is_link_disabled: boolean; + is_link_disabled?: boolean; profit_loss?: number; onClickCancel: (contract_id?: number) => void; onClickSell: (contract_id?: number) => void; - onClickRemove: (contract_id: number) => void; + onClickRemove: (contract_id?: number) => void; onFooterEntered?: () => void; onMouseEnter?: () => void; onMouseLeave?: () => void; removeToast: (key: string) => void; result?: string; setCurrentFocus: (value: string) => void; - server_time: moment.Moment; + server_time?: moment.Moment; should_show_transition?: boolean; should_show_cancellation_warning: boolean; - status: string; + status?: string; toggleCancellationWarning: () => void; toggleUnsupportedContractModal: (value: boolean) => void; }; @@ -77,13 +77,13 @@ const PositionsDrawerCard = ({ toggleCancellationWarning, toggleUnsupportedContractModal, }: TPositionsDrawerCardProps) => { - const is_accumulator = isAccumulatorContract(contract_info.contract_type); - const is_multiplier = isMultiplierContract(contract_info.contract_type || ''); - const is_turbos = isTurbosContract(contract_info.contract_type); - const is_vanilla = isVanillaContract(contract_info.contract_type); - const is_crypto = isCryptoContract(contract_info.underlying || ''); + const is_accumulator = isAccumulatorContract(contract_info?.contract_type); + const is_multiplier = isMultiplierContract(contract_info?.contract_type || ''); + const is_turbos = isTurbosContract(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 has_ended = !!getEndTime(contract_info as TContractInfo); const is_mobile = isMobile(); const contract_card_classname = classNames('dc-contract-card', { 'dc-contract-card--green': Number(profit_loss) > 0 && !result, @@ -97,7 +97,7 @@ const PositionsDrawerCard = ({ ); const card_header = ( ); const card_body = ( ); @@ -162,26 +162,26 @@ const PositionsDrawerCard = ({ const supported_contract_card = (
toggleUnsupportedContractModal(true)}> - {contract_info.underlying ? contract_el : loader_el} + {contract_info?.underlying ? contract_el : loader_el}
); const unsupported_contract_card = is_link_disabled ? ( -
{contract_info.underlying ? contract_el : loader_el}
+
{contract_info?.underlying ? contract_el : loader_el}
) : ( - {contract_info.underlying ? contract_el : loader_el} + {contract_info?.underlying ? contract_el : loader_el} ); return (
{ if (typeof onMouseEnter === 'function') onMouseEnter(); diff --git a/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.scss b/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.scss index b3c7ce016b50..63a08088745e 100644 --- a/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.scss +++ b/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.scss @@ -17,4 +17,8 @@ border-radius: 50%; background-color: var(--fill-normal-1); } + + &-transition { + transition: all 0.24s linear; + } } diff --git a/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.tsx b/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.tsx index d53ef8751683..1f3fae41c73f 100644 --- a/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.tsx +++ b/packages/components/src/components/progress-bar-tracker/progress-bar-tracker.tsx @@ -1,12 +1,14 @@ import React from 'react'; +import classNames from 'classnames'; type TProgressBarTracker = { step: number; steps_list: Array; setStep: React.Dispatch>; + is_transition?: boolean; }; -const ProgressBarTracker = ({ step, steps_list, setStep }: TProgressBarTracker) => ( +const ProgressBarTracker = ({ step, steps_list, setStep, is_transition = false }: TProgressBarTracker) => (
{steps_list.map((step_item, index) => { const active = step === index + 1; @@ -15,7 +17,11 @@ const ProgressBarTracker = ({ step, steps_list, setStep }: TProgressBarTracker)
setStep(index + 1)} - className={active ? 'dc-progress-bar-tracker-rectangle' : 'dc-progress-bar-tracker-circle'} + className={classNames({ + 'dc-progress-bar-tracker-rectangle': active, + 'dc-progress-bar-tracker-circle': !active, + 'dc-progress-bar-tracker-transition': is_transition, + })} /> ); })} diff --git a/packages/components/src/components/progress-slider-mobile/progress-slider-mobile.tsx b/packages/components/src/components/progress-slider-mobile/progress-slider-mobile.tsx index 02fce1d5f43a..44b74c15cd8b 100644 --- a/packages/components/src/components/progress-slider-mobile/progress-slider-mobile.tsx +++ b/packages/components/src/components/progress-slider-mobile/progress-slider-mobile.tsx @@ -9,9 +9,9 @@ import { TGetCardLables } from '../types'; type TProgressSliderMobileProps = { className?: string; - current_tick: number | null; + current_tick?: number | null; expiry_time?: number; - is_loading: boolean; + is_loading?: boolean; server_time: moment.Moment; start_time?: number; ticks_count?: number; diff --git a/packages/components/src/components/progress-slider-mobile/progress-ticks-mobile.tsx b/packages/components/src/components/progress-slider-mobile/progress-ticks-mobile.tsx index 901810fc0316..6e09f313fb61 100644 --- a/packages/components/src/components/progress-slider-mobile/progress-ticks-mobile.tsx +++ b/packages/components/src/components/progress-slider-mobile/progress-ticks-mobile.tsx @@ -4,7 +4,7 @@ import Text from '../text'; import { TGetCardLables } from '../types'; type TProgressTicksMobileProps = { - current_tick: number | null; + current_tick?: number | null; ticks_count: number; getCardLabels: TGetCardLables; }; diff --git a/packages/components/src/components/remaining-time/remaining-time.tsx b/packages/components/src/components/remaining-time/remaining-time.tsx index e67a4b3d7047..047336f831dd 100644 --- a/packages/components/src/components/remaining-time/remaining-time.tsx +++ b/packages/components/src/components/remaining-time/remaining-time.tsx @@ -1,6 +1,8 @@ import React from 'react'; -import { formatDuration, getDiffDuration } from '@deriv/shared'; import moment from 'moment'; + +import { formatDuration, getDiffDuration } from '@deriv/shared'; + import { TGetCardLables } from '../types'; type TRemainingTimeProps = { diff --git a/packages/components/src/components/send-email-template/send-email-template.tsx b/packages/components/src/components/send-email-template/send-email-template.tsx index 955916de4707..e3273b37337d 100644 --- a/packages/components/src/components/send-email-template/send-email-template.tsx +++ b/packages/components/src/components/send-email-template/send-email-template.tsx @@ -11,8 +11,8 @@ type TSendEmailTemplate = { live_chat?: React.ReactNode; onClickSendEmail: () => void; resend_timeout?: number; - subtitle?: string; - title: string; + subtitle?: React.ReactNode; + title: React.ReactNode; txt_resend_in: string; txt_resend: string; }; diff --git a/packages/components/src/components/tabs/tab.tsx b/packages/components/src/components/tabs/tab.tsx index eba22fac25bc..5c26046094d6 100644 --- a/packages/components/src/components/tabs/tab.tsx +++ b/packages/components/src/components/tabs/tab.tsx @@ -4,15 +4,15 @@ import Counter from '../counter'; import Icon from '../icon'; type TTabProps = { - active_icon_color: string; + active_icon_color?: string; active_tab_ref?: React.RefObject | null; bottom?: boolean; className?: string; count: number; header_content: React.ReactElement; header_fit_content?: boolean; - icon_color: string; - icon_size: number; + icon_color?: string; + icon_size?: number; icon: string; id?: string; is_active: boolean; @@ -25,17 +25,17 @@ type TTabProps = { }; const Tab = ({ - active_icon_color, + active_icon_color = '', active_tab_ref, - bottom, - className, + bottom = false, + className = '', count, header_content, - header_fit_content, - icon_color, - icon_size, + header_fit_content = false, + icon_color = '', + icon_size = 0, icon, - id, + id = '', is_active, is_label_hidden, is_scrollable, diff --git a/packages/components/src/components/tabs/tabs.tsx b/packages/components/src/components/tabs/tabs.tsx index c7d8f5483e77..99817c188937 100644 --- a/packages/components/src/components/tabs/tabs.tsx +++ b/packages/components/src/components/tabs/tabs.tsx @@ -14,20 +14,20 @@ declare module 'react' { } type TTabsProps = RouteComponentProps & { - active_icon_color: string; + active_icon_color?: string; active_index?: number; - background_color: string; + background_color?: string; bottom?: boolean; - center: boolean; - children: React.ReactElement[]; + center?: boolean; + children: (React.ReactElement | null)[]; className?: string; - fit_content: boolean; + fit_content?: boolean; has_active_line?: boolean; has_bottom_line?: boolean; header_fit_content?: boolean; history: History; - icon_color: string; - icon_size: number; + icon_color?: string; + icon_size?: number; is_100vw?: boolean; is_full_width?: boolean; is_overflow_hidden?: boolean; @@ -39,27 +39,27 @@ type TTabsProps = RouteComponentProps & { }; const Tabs = ({ - active_icon_color, + active_icon_color = '', active_index = 0, - background_color, - bottom, - center, + background_color = '', + bottom = false, + center = false, children, - className, - fit_content, + className = '', + fit_content = false, has_active_line = true, has_bottom_line = true, - header_fit_content, + header_fit_content = false, history, - icon_color, - icon_size, - is_100vw, - is_full_width, - is_overflow_hidden, - is_scrollable, + icon_color = '', + icon_size = 0, + is_100vw = false, + is_full_width = false, + is_overflow_hidden = false, + is_scrollable = false, onTabItemClick, - should_update_hash, - single_tab_has_no_label, + should_update_hash = false, + single_tab_has_no_label = false, top, }: TTabsProps) => { const [active_line_style, updateActiveLineStyle] = React.useState({}); @@ -99,7 +99,7 @@ const Tabs = ({ initial_index_to_show = hash_index; } else { // if no hash is in url but component has passed hash prop, set hash of the tab shown - const child_props = children[initial_index_to_show].props; + const child_props = children[initial_index_to_show]?.props; const current_id = child_props && child_props.hash; if (current_id) { pushHash(current_id); @@ -128,7 +128,7 @@ const Tabs = ({ const onClickTabItem = (index: number) => { if (should_update_hash) { - const hash = children[index].props['data-hash']; + const hash = children[index]?.props['data-hash']; pushHash(hash); } setActiveTabIndex(index); diff --git a/packages/components/src/components/tooltip/tooltip.tsx b/packages/components/src/components/tooltip/tooltip.tsx index 5f5cbac0c599..8d1203ff18a6 100644 --- a/packages/components/src/components/tooltip/tooltip.tsx +++ b/packages/components/src/components/tooltip/tooltip.tsx @@ -21,7 +21,7 @@ const Tooltip = ({ icon, // only question, info and dot accepted message, }: React.PropsWithChildren) => { - const [hover_ref, show_tooltip_balloon_icon_on_hover] = useHover(); + const [hover_ref, show_tooltip_balloon_icon_on_hover] = useHover(); const icon_class = classNames(classNameIcon, icon); diff --git a/packages/components/src/components/types/common.types.ts b/packages/components/src/components/types/common.types.ts index 65048a670689..df3b6a82b70a 100644 --- a/packages/components/src/components/types/common.types.ts +++ b/packages/components/src/components/types/common.types.ts @@ -23,3 +23,9 @@ export type TTableRowItem = export type TRow = { [key: string]: any }; export type TPassThrough = { isTopUp: (item: TRow) => boolean }; + +export type TDatePickerOnChangeEvent = { + date?: string; + duration?: number | null | string; + target?: { name?: string; value?: number | string | moment.Moment | null }; +}; diff --git a/packages/components/src/components/types/index.ts b/packages/components/src/components/types/index.ts index 7911e1a631d9..98187945e4e1 100644 --- a/packages/components/src/components/types/index.ts +++ b/packages/components/src/components/types/index.ts @@ -2,7 +2,7 @@ import { TIconsManifest, TIconProps } from './icons.types'; import { TAccordionProps, TAccordionItem } from './accordion.types'; import { TMultiStepProps, TMultiStepRefProps } from './multi-step.types'; import { TPopoverProps } from './popover.types'; -import { TGetCardLables, TGetContractTypeDisplay } from './common.types'; +import { TGetCardLables, TGetContractTypeDisplay, TDatePickerOnChangeEvent } from './common.types'; import { TErrorMessages, TGetContractPath, TToastConfig } from './contract.types'; export type { @@ -18,4 +18,5 @@ export type { TGetContractPath, TToastConfig, TGetContractTypeDisplay, + TDatePickerOnChangeEvent, }; diff --git a/packages/components/src/components/wallet-card/index.ts b/packages/components/src/components/wallet-card/index.ts new file mode 100644 index 000000000000..c6b23d764216 --- /dev/null +++ b/packages/components/src/components/wallet-card/index.ts @@ -0,0 +1,3 @@ +import WalletCard from './wallet-card'; + +export { WalletCard }; diff --git a/packages/components/src/components/wallet-card/wallet-card.scss b/packages/components/src/components/wallet-card/wallet-card.scss new file mode 100644 index 000000000000..04ff96692983 --- /dev/null +++ b/packages/components/src/components/wallet-card/wallet-card.scss @@ -0,0 +1,147 @@ +.wallet-card { + position: relative; + + &__container { + border-radius: inherit; + width: 100%; + height: 100%; + + &--active { + border: 2px solid var(--text-red); + } + + &--small { + display: flex; + align-items: center; + justify-content: center; + } + + &-fade { + position: absolute; + inset: 0; + opacity: 0; + background: var(--wallets-card-active-gradient-background); + border-radius: inherit; + + &--active { + opacity: 1; + } + } + + &:hover & { + &-fade { + opacity: 1; + &--disabled, + &--faded, + &--added { + opacity: 0; + } + } + } + } + + &__shine { + position: absolute; + inset: 0; + clip-path: polygon(40% 10%, 104% -6.94%, 92.5% 100%, 28% 100%); + mix-blend-mode: overlay; + opacity: 0.16; + border-top-right-radius: $BORDER_RADIUS_2; + background-color: $color-white; + } + + &__content { + position: relative; + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 1.6rem; + + &--medium { + @include mobile { + padding: 0.8rem; + } + } + } + + &--small { + width: 6.4rem; + height: 4rem; + border-radius: $BORDER_RADIUS; + } + + &--medium { + width: 20rem; + height: 12rem; + border-radius: $BORDER_RADIUS_2; + + @include mobile { + width: 16rem; + height: 9.6rem; + } + } + + &--large { + width: 24rem; + height: 14.4rem; + border-radius: $BORDER_RADIUS_2; + + @include mobile { + width: 21.6rem; + height: 12.8rem; + } + } + + &__active-icon { + position: absolute; + inset: 0; + display: flex; + justify-content: center; + align-items: center; + + &--small { + position: absolute; + top: 0; + left: 100%; + transform: translate(-1.2rem, -0.4rem); + width: unset; + height: unset; + } + } + + &__top-wrapper { + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100%; + } + + &__bottom-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + width: 100%; + } + + &__wallet-button { + background: $color-white; + &-text { + color: $color-black-1; + } + + &--added { + opacity: 0.32; + } + } + + &--disabled { + opacity: 0.32; + } + + &--faded { + opacity: 0.72; + } +} diff --git a/packages/components/src/components/wallet-card/wallet-card.tsx b/packages/components/src/components/wallet-card/wallet-card.tsx new file mode 100644 index 000000000000..7e6c44d154f9 --- /dev/null +++ b/packages/components/src/components/wallet-card/wallet-card.tsx @@ -0,0 +1,113 @@ +import React from 'react'; +import classNames from 'classnames'; +import { localize } from '@deriv/translations'; +import Badge from '../badge'; +import Button from '../button'; +import Icon from '../icon'; +import Text from '../text'; +import { isMobile } from '@deriv/shared'; +import { WalletIcon } from '../wallet-icon'; +import './wallet-card.scss'; + +type TWalletCardProps = { + // TODO: This type should be updated when the response is ready + wallet: { + balance: string; + currency: string; + icon: string; + icon_type: 'fiat' | 'crypto' | 'app' | 'demo'; + jurisdiction_title: string; + name: string; + gradient_class: string; + }; + size?: 'small' | 'medium' | 'large'; + state?: 'active' | 'add' | 'added' | 'default' | 'disabled' | 'faded'; +}; + +type IconComponentProps = { + size: TWalletCardProps['size']; + icon_type: TWalletCardProps['wallet']['icon_type']; + icon: TWalletCardProps['wallet']['icon']; +}; + +const IconComponent = ({ size, icon_type, icon }: IconComponentProps) => { + let icon_size: React.ComponentProps['size'] = 'large'; + if (size === 'small') icon_size = 'medium'; + if (size === 'medium') icon_size = isMobile() && icon_type === 'crypto' ? 'medium' : 'large'; + return ; +}; + +const WalletCard: React.FC> = ({ + wallet, + size = 'medium', + state = 'default', +}) => ( +
+
+ {size !== 'small' &&
} +
+ {size === 'small' && } + {size !== 'small' && ( +
+
+ + {wallet.jurisdiction_title === 'virtual' ? ( + + ) : ( + + )} +
+ +
+ {state !== 'add' && state !== 'added' ? ( + + + {wallet.name} + + + {wallet.balance} {wallet.currency} + + + ) : ( +
+
+ )} +
+ {state === 'active' && ( +
+ +
+ )} +
+); +export default WalletCard; diff --git a/packages/components/src/components/wallet-icon/index.ts b/packages/components/src/components/wallet-icon/index.ts new file mode 100644 index 000000000000..200597c2f437 --- /dev/null +++ b/packages/components/src/components/wallet-icon/index.ts @@ -0,0 +1,3 @@ +import WalletIcon from './wallet-icon'; + +export { WalletIcon }; diff --git a/packages/components/src/components/wallet-icon/wallet-icon.scss b/packages/components/src/components/wallet-icon/wallet-icon.scss new file mode 100644 index 000000000000..0044ee04e5b8 --- /dev/null +++ b/packages/components/src/components/wallet-icon/wallet-icon.scss @@ -0,0 +1,39 @@ +.wallet-icon { + position: relative; + display: flex; + align-items: center; + justify-content: center; + border-radius: $BORDER_RADIUS; + overflow: hidden; + + &__default-bg { + // Default Background + background: radial-gradient(100% 4130.74% at 0% 100%, rgba(244, 67, 54, 0.24) 0%, rgba(40, 57, 145, 0.48) 100%) + #ffffff; + } + + &--xsmall { + width: 2.4rem; + height: 1.4rem; + } + + &--small { + width: 4rem; + height: 2.4rem; + } + + &--medium { + width: 6.4rem; + height: 4rem; + } + + &--large { + width: 8.4rem; + height: 5.2rem; + } + + &--xlarge { + width: 12.8rem; + height: 8rem; + } +} diff --git a/packages/components/src/components/wallet-icon/wallet-icon.tsx b/packages/components/src/components/wallet-icon/wallet-icon.tsx new file mode 100644 index 000000000000..37616338e99c --- /dev/null +++ b/packages/components/src/components/wallet-icon/wallet-icon.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import classNames from 'classnames'; +import Icon from '../icon'; +import './wallet-icon.scss'; + +type TWalletIconSizes = keyof typeof sizes['square' | 'box']; + +type TWalletIconProps = { + gradient_class?: string; + icon: string; + size?: TWalletIconSizes; + type?: 'demo' | 'fiat' | 'crypto' | 'app'; + has_bg?: boolean; + hide_watermark?: boolean; +}; + +const sizes = { + square: { + xsmall: 12, + small: 16, + medium: 24, + large: 32, + xlarge: 48, + xxlarge: 64, + }, + // The crypto and demo sizes are the same + box: { + xsmall: { + width: 20, + height: 12, + }, + small: { + width: 32, + height: 20, + }, + medium: { + width: 48, + height: 30, + }, + large: { + width: 64, + height: 40, + }, + xlarge: { + width: 96, + height: 60, + }, + xxlarge: { + width: 120, + height: 80, + }, + }, +} as const; + +const WalletIcon = ({ gradient_class, icon, size = 'medium', type, has_bg, hide_watermark }: TWalletIconProps) => { + if (!icon) { + return null; + } + + return ( +
+ {(type === 'fiat' || type === 'app') && } + {(type === 'demo' || type === 'crypto') && ( + + )} +
+ ); +}; + +export default WalletIcon; diff --git a/packages/components/src/hooks/use-hover.ts b/packages/components/src/hooks/use-hover.ts index e28bc981f48a..9583eacf6d99 100644 --- a/packages/components/src/hooks/use-hover.ts +++ b/packages/components/src/hooks/use-hover.ts @@ -1,7 +1,8 @@ import React, { RefObject } from 'react'; + import { isMobileOs } from '@deriv/shared'; -export const useHover = ( +export const useHover = ( refSetter?: RefObject | null, should_prevent_bubbling?: boolean ) => { diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index c2e7729236ed..d531d9c211af 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -10,11 +10,13 @@ // export default { Label, Button }; export { default as Accordion } from './components/accordion'; +export { default as AmountInput } from './components/amount-input'; export { default as AutoHeightWrapper } from './components/auto-height-wrapper'; export { default as Autocomplete } from './components/autocomplete'; export { default as AutoSizer } from './components/autosizer'; export { default as Button } from './components/button'; export { default as SpanButton } from './components/span-button'; +export { default as Badge } from './components/badge'; export { default as ButtonLink } from './components/button-link'; export { default as ButtonToggle } from './components/button-toggle'; export { default as Calendar } from './components/calendar'; @@ -51,6 +53,8 @@ export { default as FormProgress } from './components/form-progress'; export { default as FormSubmitButton } from './components/form-submit-button'; export { default as FormSubmitErrorMessage } from './components/form-submit-error-message'; export { default as FormCancelButton } from './components/form-cancel-button'; +export * from './components/gradient-background'; +export * from './components/gradient-background-two-point'; export { default as HintBox } from './components/hint-box'; export { default as HorizontalSwipe } from './components/horizontal-swipe'; export { default as Icon } from './components/icon'; @@ -105,6 +109,7 @@ export { default as Text } from './components/text'; export { default as Toast } from './components/toast'; export { default as ThemedScrollbars } from './components/themed-scrollbars'; export { default as ToggleSwitch } from './components/toggle-switch'; +export * from './components/message-list'; export { default as TickPicker } from './components/tick-picker'; export { default as TickProgress } from './components/tick-progress'; export { default as Timeline } from './components/timeline'; @@ -113,4 +118,8 @@ export { default as UILoader } from './components/u-i-loader'; export { default as UnhandledErrorModal } from './components/unhandled-error-modal'; export { default as VerticalTab } from './components/vertical-tab'; export { default as Wizard } from './components/wizard'; +export * from './components/wallet-card'; +export * from './components/wallet-icon'; +export * from './components/app-linked-with-wallet-icon'; export * from './hooks'; +export * from './components/types'; diff --git a/packages/components/stories/icon/icons.js b/packages/components/stories/icon/icons.js index a6e90972c513..c8dfc15c055a 100644 --- a/packages/components/stories/icon/icons.js +++ b/packages/components/stories/icon/icons.js @@ -30,6 +30,8 @@ export const icons = 'IcAppstoreOptionTradeType', 'IcAppstoreSkeletonCardBorder', 'IcAppstoreSuccess', + 'IcAppstoreTickWhite', + 'IcAppstoreTick', 'IcAppstoreTradersHubHome', 'IcAppstoreTradingHubBeta', 'IcAppstoreTradingHubOnboardingDark', @@ -54,6 +56,7 @@ export const icons = 'IcAppstoreWalletUsdLight', 'IcAppstoreWalletUsdcLight', 'IcAppstoreWalletUsdtLight', + 'IcAppstoreWalletsLink', 'IcAppstoreWarning', ], 'brand': [ @@ -111,6 +114,8 @@ export const icons = 'IcCashierClipboard', 'IcCashierCommissionDeposit', 'IcCashierCommissionWithdrawal', + 'IcCashierCreditDebitDark', + 'IcCashierCreditDebitLight', 'IcCashierCryptoDark', 'IcCashierCryptoLight', 'IcCashierDaiDark', @@ -363,6 +368,8 @@ export const icons = 'IcDbotUserGuide', 'IcDbotViewDetail', 'IcDelete', + 'IcDemoResetBalanceDone', + 'IcDemoResetBalance', 'IcDemo', 'IcDerivOutline', 'IcDeriv', @@ -615,6 +622,8 @@ export const icons = 'IcWindowsLogo', 'IcWindows', 'IcWip', + 'IcWithdrawRequestVerificationSent', + 'IcWithdrawRequestVerification', 'IcZingpay', 'IcZoomIn', 'IcZoomOut', @@ -762,7 +771,11 @@ export const icons = 'IcRebrandingDxtradeDashboard', 'IcRebrandingDxtradeWordmark', 'IcRebrandingDxtrade', + 'IcRebrandingMt5Cfds', + 'IcRebrandingMt5DerivedDashboard', + 'IcRebrandingMt5FinancialDashboard', 'IcRebrandingMt5Logo', + 'IcRebrandingMt5SwapFree', 'IcRebrandingSmarttraderDashboard', 'IcRebrandingSmarttrader', ], @@ -1015,39 +1028,34 @@ export const icons = 'IcUnderlyingWLDXAU', ], 'wallet': [ - 'IcWalletClearFunds', - 'IcWalletCreditDebitDark', - 'IcWalletCreditDebitLight', - 'IcWalletCredit', - 'IcWalletCryptoLight', + 'IcWalletBitcoinDark', + 'IcWalletBitcoinLight', + 'IcWalletCurrencyAud', + 'IcWalletCurrencyEur', + 'IcWalletCurrencyGbp', + 'IcWalletCurrencyUsd', 'IcWalletDerivApps', - 'IcWalletDeriv', - 'IcWalletDp2pLight', - 'IcWalletExplore', - 'IcWalletFasapayDark', - 'IcWalletFasapayLight', - 'IcWalletJetonDark', - 'IcWalletJetonLight', - 'IcWalletMarkets', + 'IcWalletDerivDemoDark', + 'IcWalletDerivDemoLight', + 'IcWalletDerivP2pDark', + 'IcWalletDerivP2pLight', + 'IcWalletErrorMessageWithCross', + 'IcWalletEthereumDark', + 'IcWalletEthereumLight', + 'IcWalletInfoMessageWithThreeDots', + 'IcWalletLiteCoinDark', + 'IcWalletLiteCoinLight', + 'IcWalletModalTetherDark', + 'IcWalletModalTetherLight', 'IcWalletMyApps', - 'IcWalletNetellerDark', - 'IcWalletNetellerLight', - 'IcWalletNeteller', + 'IcWalletOptionsDark', + 'IcWalletOptionsLight', + 'IcWalletPaymentAgentDark', 'IcWalletPaymentAgentLight', - 'IcWalletPaytrustDark', - 'IcWalletPaytrustLight', - 'IcWalletPlatforms', - 'IcWalletSkrillDark', - 'IcWalletSkrillLight', - 'IcWalletSticpayDark', - 'IcWalletSticpayLight', - 'IcWalletSticpay', - 'IcWalletTradeTypes', - 'IcWalletTransactionsEmpty', - 'IcWalletWallets', - 'IcWalletWebmoneyLight', - 'IcWalletWebmoney', - 'IcWalletZingpayDark', - 'IcWalletZingpayLight', + 'IcWalletSuccessMessage', + 'IcWalletTetherDark', + 'IcWalletTetherLight', + 'IcWalletUsdCoinDark', + 'IcWalletUsdCoinLight', ], } diff --git a/packages/core/package.json b/packages/core/package.json index 78a980d6fac8..c42b72233f8d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -95,8 +95,8 @@ "@deriv/cashier": "^1.0.0", "@deriv/cfd": "^1.0.0", "@deriv/components": "^1.0.0", - "@deriv/deriv-api": "^1.0.11", - "@deriv/deriv-charts": "1.3.6", + "@deriv/deriv-api": "^1.0.13", + "@deriv/deriv-charts": "1.4.0", "@deriv/hooks": "^1.0.0", "@deriv/p2p": "^0.7.3", "@deriv/reports": "^1.0.0", @@ -104,6 +104,7 @@ "@deriv/shared": "^1.0.0", "@deriv/trader": "^3.8.0", "@deriv/translations": "^1.0.0", + "@deriv/utils": "^1.0.0", "@livechat/customer-sdk": "^2.0.4", "acorn": "^6.1.1", "babel-polyfill": "^6.26.0", diff --git a/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/index.ts b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/index.ts new file mode 100644 index 000000000000..b08d7e33809c --- /dev/null +++ b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/index.ts @@ -0,0 +1,4 @@ +import MenuTitle from './menu-title'; +import MobileLanguageMenu from './mobile-language-menu'; + +export { MenuTitle, MobileLanguageMenu }; diff --git a/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/menu-title.tsx b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/menu-title.tsx new file mode 100644 index 000000000000..268b4b729ef3 --- /dev/null +++ b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/menu-title.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { observer, useStore } from '@deriv/stores'; +import { Icon, Text } from '@deriv/components'; +import { localize, Localize } from '@deriv/translations'; + +const MenuTitle = observer(() => { + const { common, ui } = useStore(); + const { current_language } = common; + const { is_mobile_language_menu_open, setMobileLanguageMenuOpen } = ui; + return ( + +
{localize('Menu')}
+
{ + if (!is_mobile_language_menu_open) { + setMobileLanguageMenuOpen(true); + } + }} + > + {!is_mobile_language_menu_open && ( + + + + + + + )} +
+
+ ); +}); + +export default MenuTitle; diff --git a/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/mobile-language-menu.tsx b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/mobile-language-menu.tsx new file mode 100644 index 000000000000..28439060e5cd --- /dev/null +++ b/packages/core/src/App/Components/Layout/Header/Components/ToggleMenu/mobile-language-menu.tsx @@ -0,0 +1,50 @@ +import classNames from 'classnames'; +import React from 'react'; +import { MobileDrawer } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; +import { getAllowedLanguages, localize } from '@deriv/translations'; +import { LanguageLink } from 'App/Components/Routes'; + +type TMobileLanguageMenu = { + expandSubMenu: (prop: boolean) => void; + toggleDrawer: () => void; +}; + +const MobileLanguageMenu = observer(({ expandSubMenu, toggleDrawer }: TMobileLanguageMenu) => { + const { common, ui } = useStore(); + const { is_language_changing } = common; + const { is_mobile_language_menu_open, setMobileLanguageMenuOpen } = ui; + return ( + { + expandSubMenu(is_expanded); + setMobileLanguageMenuOpen(false); + }} + submenu_toggle_class='dc-mobile-drawer__submenu-toggle--hidden' + > +
+ {Object.keys(getAllowedLanguages()).map(lang => ( + { + toggleDrawer(); + setMobileLanguageMenuOpen(false); + }} + /> + ))} +
+
+ ); +}); + +export default MobileLanguageMenu; diff --git a/packages/core/src/App/Components/Layout/Header/__tests__/menu-link.spec.tsx b/packages/core/src/App/Components/Layout/Header/__tests__/menu-link.spec.tsx new file mode 100644 index 000000000000..e599857ed7db --- /dev/null +++ b/packages/core/src/App/Components/Layout/Header/__tests__/menu-link.spec.tsx @@ -0,0 +1,156 @@ +import React from 'react'; +import { Router } from 'react-router-dom'; +import { createBrowserHistory } from 'history'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useIsRealAccountNeededForCashier } from '@deriv/hooks'; +import { getStaticUrl, isMobile, routes } from '@deriv/shared'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import MenuLink from 'App/Components/Layout/Header/menu-link'; + +jest.mock('Stores/connect', () => ({ + __esModule: true, + default: 'mockedDefaultExport', + connect: + () => + (Component: T) => + Component, +})); + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + Icon: jest.fn(() =>
Mock Link Icon
), +})); + +jest.mock('@deriv/hooks', () => ({ + ...jest.requireActual('@deriv/hooks'), + useIsRealAccountNeededForCashier: jest.fn(() => false), +})); + +jest.mock('@deriv/shared', () => ({ + ...jest.requireActual('@deriv/shared'), + isMobile: jest.fn(() => false), + getStaticUrl: jest.fn(() => 'MockUrl'), +})); + +describe('MenuLink', () => { + const mockRootStore = mockStore({}); + let mock_props: React.ComponentProps; + + beforeEach(() => { + mock_props = { + link_to: '', + data_testid: 'dt_menu_link', + text: 'Mock text', + onClickLink: jest.fn(), + }; + }); + + const renderCheck = () => { + expect(screen.getByText('Mock Link Icon')).toBeInTheDocument(); + expect(screen.getByText('Mock text')).toBeInTheDocument(); + }; + + const renderComponent = () => { + const history = createBrowserHistory(); + render(, { + wrapper: ({ children }) => ( + + {children} + + ), + }); + }; + + it('should render no links with icon and text without passing link_to', () => { + renderComponent(); + + renderCheck(); + const link = screen.getByTestId('dt_menu_link'); + expect(link.onclick).toBeFalsy(); + }); + + it('should render menu link if deriv_static_url', () => { + mock_props.link_to = 'MockLink'; + + renderComponent(); + + renderCheck(); + const link = screen.getByTestId('dt_menu_link'); + userEvent.click(link); + expect(mock_props.onClickLink).toHaveBeenCalled(); + }); + + it('should render with passing link_to', () => { + (getStaticUrl as jest.Mock).mockReturnValue(''); + mock_props.link_to = 'MockLink'; + + renderComponent(); + + renderCheck(); + const link = screen.getByTestId('dt_menu_link'); + userEvent.click(link); + expect(mock_props.onClickLink).toHaveBeenCalled(); + }); + + it('should not render if is_hidden is passed', () => { + mock_props.is_hidden = true; + + renderComponent(); + + expect(screen.queryByText('Mock Link Icon')).not.toBeInTheDocument(); + expect(screen.queryByText('Mock text')).not.toBeInTheDocument(); + const link = screen.queryByTestId('dt_menu_link'); + expect(link).not.toBeInTheDocument(); + }); + + it('should render menu link for mobile and two icons with passed suffix_icon', () => { + (isMobile as jest.Mock).mockReturnValue(true); + mock_props.link_to = '/account/languages'; + mock_props.suffix_icon = 'suffix_icon'; + + renderComponent(); + + const icons = screen.getAllByText('Mock Link Icon'); + expect(icons).toHaveLength(2); + const link = screen.getByTestId('dt_menu_link'); + expect(link).toBeInTheDocument(); + userEvent.click(link); + expect(mockRootStore.ui.setMobileLanguageMenuOpen).toHaveBeenCalled(); + }); + + it('should render menu link for cashier for real account on traders hub', () => { + (useIsRealAccountNeededForCashier as jest.Mock).mockReturnValue(true); + mock_props.link_to = '/cashier/deposit'; + Object.defineProperty(window, 'location', { + configurable: true, + value: { pathname: routes.traders_hub }, + }); + + renderComponent(); + + renderCheck(); + const link = screen.getByTestId('dt_menu_link'); + userEvent.click(link); + expect(mockRootStore.ui.toggleNeedRealAccountForCashierModal).toHaveBeenCalled(); + expect(mock_props.onClickLink).toHaveBeenCalled(); + }); + + it('should render menu link for cashier for virtual account on traders hub', () => { + (useIsRealAccountNeededForCashier as jest.Mock).mockReturnValue(false); + mockRootStore.client.is_virtual = true; + mock_props.link_to = '/cashier/deposit'; + Object.defineProperty(window, 'location', { + configurable: true, + value: { pathname: routes.traders_hub }, + }); + + renderComponent(); + + renderCheck(); + const link = screen.getByTestId('dt_menu_link'); + userEvent.click(link); + expect(mockRootStore.ui.toggleReadyToDepositModal).toHaveBeenCalled(); + expect(mock_props.onClickLink).toHaveBeenCalled(); + }); +}); diff --git a/packages/core/src/App/Components/Layout/Header/menu-link.tsx b/packages/core/src/App/Components/Layout/Header/menu-link.tsx new file mode 100644 index 000000000000..83c37f0c81db --- /dev/null +++ b/packages/core/src/App/Components/Layout/Header/menu-link.tsx @@ -0,0 +1,174 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Icon, Text } from '@deriv/components'; +import { useIsRealAccountNeededForCashier } from '@deriv/hooks'; +import { isMobile, routes, getStaticUrl } from '@deriv/shared'; +import { isExternalLink } from '@deriv/utils'; +import { observer, useStore } from '@deriv/stores'; +import { localize } from '@deriv/translations'; +import { BinaryLink } from 'App/Components/Routes'; + +type TMenuLink = { + data_testid: string; + icon: string; + is_active: boolean; + is_disabled: boolean; + is_hidden: boolean; + link_to: string; + onClickLink: () => void; + suffix_icon: string; + text: string; +}; + +const MenuLink = observer( + ({ + data_testid, + icon = '', + is_active, + is_disabled, + is_hidden, + link_to = '', + onClickLink, + suffix_icon = '', + text, + }: Partial) => { + const { ui, client } = useStore(); + const { has_any_real_account, is_virtual } = client; + const { setMobileLanguageMenuOpen, toggleReadyToDepositModal, toggleNeedRealAccountForCashierModal } = ui; + const real_account_needed_for_cashier = useIsRealAccountNeededForCashier(); + const is_trade_text = text === localize('Trade'); + const deriv_static_url = getStaticUrl(link_to); + const traders_hub_path = window.location.pathname === routes.traders_hub; + const is_languages_link_on_mobile = isMobile() && link_to === routes.languages; + const is_external_link = deriv_static_url && isExternalLink(link_to); + const is_cashier_link = [ + routes.cashier_deposit, + routes.cashier_withdrawal, + routes.cashier_acc_transfer, + ].includes(link_to); + + if (is_hidden) return null; + + if (is_languages_link_on_mobile) { + return ( +
setMobileLanguageMenuOpen(true)} + data-testid={data_testid} + > + + {text} + {suffix_icon && } +
+ ); + } + if (real_account_needed_for_cashier && is_cashier_link && traders_hub_path) { + const handleClickCashier = () => { + onClickLink?.(); + toggleNeedRealAccountForCashierModal(); + }; + return ( +
+ + {text} + {suffix_icon && } +
+ ); + } + + if (is_cashier_link && is_virtual && !has_any_real_account) { + const toggle_modal_routes = window.location.pathname === routes.root || traders_hub_path; + + const handleClickCashier = () => { + if (toggle_modal_routes) { + toggleReadyToDepositModal(); + } + onClickLink?.(); + }; + return ( +
+ + {text} + {suffix_icon && } +
+ ); + } + + if (!link_to) { + return ( +
+ + {text} + {suffix_icon && } +
+ ); + } else if (is_external_link) { + return ( +
+ + + {text} + + {suffix_icon && } + + ); + } + + return ( + + + + {text} + + {suffix_icon && } + + ); + } +); + +export default MenuLink; diff --git a/packages/core/src/App/Components/Layout/Header/toggle-menu-drawer.jsx b/packages/core/src/App/Components/Layout/Header/toggle-menu-drawer.jsx index ee643e4d6ad3..81e796d2634f 100644 --- a/packages/core/src/App/Components/Layout/Header/toggle-menu-drawer.jsx +++ b/packages/core/src/App/Components/Layout/Header/toggle-menu-drawer.jsx @@ -1,177 +1,36 @@ import classNames from 'classnames'; import React from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; -import { Div100vhContainer, Icon, MobileDrawer, ToggleSwitch, Text } from '@deriv/components'; +import { useLocation, useHistory } from 'react-router-dom'; +import { Div100vhContainer, Icon, MobileDrawer, ToggleSwitch } from '@deriv/components'; import { useOnrampVisible, useAccountTransferVisible, - useIsRealAccountNeededForCashier, useIsP2PEnabled, usePaymentAgentTransferVisible, } from '@deriv/hooks'; import { routes, PlatformContext, getStaticUrl, whatsapp_url } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; -import { localize, getAllowedLanguages, Localize } from '@deriv/translations'; +import { localize } from '@deriv/translations'; import NetworkStatus from 'App/Components/Layout/Footer'; import ServerTime from 'App/Containers/server-time.jsx'; -import { BinaryLink, LanguageLink } from 'App/Components/Routes'; import getRoutesConfig from 'App/Constants/routes-config'; -import { changeLanguage } from 'Utils/Language'; import LiveChat from 'App/Components/Elements/LiveChat'; import useLiveChat from 'App/Components/Elements/LiveChat/use-livechat.ts'; import PlatformSwitcher from './platform-switcher'; - -const MenuLink = observer( - ({ link_to, icon, is_active, is_disabled, is_language, suffix_icon, text, onClickLink, is_hidden }) => { - const { common, ui, client } = useStore(); - const { changeCurrentLanguage } = common; - const deriv_static_url = getStaticUrl(link_to); - const history = useHistory(); - const { has_any_real_account, is_virtual } = client; - const { toggleReadyToDepositModal, toggleNeedRealAccountForCashierModal } = ui; - const real_account_needed_for_cashier = useIsRealAccountNeededForCashier(); - - const cashier_link = - link_to === routes.cashier_deposit || - link_to === routes.cashier_withdrawal || - link_to === routes.cashier_acc_transfer; - - if (is_hidden) return null; - - const traders_hub_path = window.location.pathname === routes.traders_hub; - - if (real_account_needed_for_cashier && cashier_link && traders_hub_path) { - const handleClickCashier = () => { - onClickLink(); - toggleNeedRealAccountForCashierModal(); - }; - return ( -
- - {text} - {suffix_icon && } -
- ); - } - - if (cashier_link && is_virtual && !has_any_real_account) { - const toggle_modal_routes = - window.location.pathname === routes.root || window.location.pathname === routes.traders_hub; - - const toggleModal = () => { - if (toggle_modal_routes && !has_any_real_account) { - toggleReadyToDepositModal(); - } - }; - - const handleClickCashier = () => { - if (is_virtual && has_any_real_account) { - history.push(routes.cashier_deposit); - } else if (!has_any_real_account && is_virtual) { - toggleModal(); - } - onClickLink(); - }; - return ( -
- - {text} - {suffix_icon && } -
- ); - } - - if (is_language) { - return ( - { - onClickLink(); - changeLanguage(link_to, changeCurrentLanguage); - }} - > - - {text} - {suffix_icon && } - - ); - } else if (!link_to) { - return ( -
- - {text} - {suffix_icon && } -
- ); - } else if (deriv_static_url) { - return ( - - - - {text} - - {suffix_icon && } - - ); - } - - return ( - - - - {text} - - {suffix_icon && } - - ); - } -); +import MenuLink from './menu-link'; +import { MobileLanguageMenu, MenuTitle } from './Components/ToggleMenu'; const ToggleMenuDrawer = observer(({ platform_config }) => { const { common, ui, client, traders_hub, modules } = useStore(); - const { app_routing_history, current_language, is_language_changing } = common; - const { disableApp, enableApp, is_dark_mode_on: is_dark_mode, setDarkMode: toggleTheme } = ui; + const { app_routing_history, current_language } = common; + const { + disableApp, + enableApp, + is_mobile_language_menu_open, + is_dark_mode_on: is_dark_mode, + setDarkMode: toggleTheme, + setMobileLanguageMenuOpen, + } = ui; const { account_status, is_logged_in, @@ -199,7 +58,7 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { const [transitionExit, setTransitionExit] = React.useState(false); const [primary_routes_config, setPrimaryRoutesConfig] = React.useState([]); const [is_submenu_expanded, expandSubMenu] = React.useState(false); - const [is_language_change, setIsLanguageChange] = React.useState(false); + const { is_appstore } = React.useContext(PlatformContext); const timeout = React.useRef(); const history = useHistory(); @@ -237,6 +96,7 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { }, [is_appstore, account_status, should_allow_authentication]); const toggleDrawer = React.useCallback(() => { + if (is_mobile_language_menu_open) setMobileLanguageMenuOpen(false); if (!is_open) setIsOpen(!is_open); else { setTransitionExit(true); @@ -353,68 +213,6 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { ); }; - const getLanguageRoutes = () => { - return ( - - {Object.keys(getAllowedLanguages()).map((lang, idx) => ( - - - - ))} - - ); - }; - - const GetLanguageRoutesTraderHub = React.useCallback(() => { - return ( - { - expandSubMenu(is_expanded); - setIsLanguageChange(is_changing => !is_changing); - }} - submenu_toggle_class='dc-mobile-drawer__submenu-toggle--hidden' - > -
- {Object.keys(getAllowedLanguages()).map(lang => ( - { - toggleDrawer(); - setIsLanguageChange(is_changing => !is_changing); - }} - /> - ))} -
-
- ); - }, [is_language_change, toggleDrawer, is_language_changing]); - const HelpCentreRoute = has_border_bottom => { return ( @@ -433,34 +231,6 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { const is_trading_hub_category = route.startsWith(routes.traders_hub) || route.startsWith(routes.cashier) || route.startsWith(routes.account); - const MenuTitle = React.useCallback( - () => ( - -
{localize('Menu')}
-
{ - if (!is_language_change) { - setIsLanguageChange(true); - } - }} - > - - - - -
-
- ), - [current_language, is_language_change] - ); - return ( @@ -540,8 +310,6 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { />
)} - {!is_logged_in && getLanguageRoutes()} - {primary_routes_config.map((route_config, idx) => getRoutesWithSubMenu(route_config, idx) )} @@ -634,11 +402,13 @@ const ToggleMenuDrawer = observer(({ platform_config }) => { )} - + - {is_language_change && } + {is_mobile_language_menu_open && ( + + )}
diff --git a/packages/core/src/App/Components/Routes/__tests__/language-link.spec.tsx b/packages/core/src/App/Components/Routes/__tests__/language-link.spec.tsx index 589c867294b6..c747e6724b76 100644 --- a/packages/core/src/App/Components/Routes/__tests__/language-link.spec.tsx +++ b/packages/core/src/App/Components/Routes/__tests__/language-link.spec.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { screen, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { mockStore, StoreProvider } from '@deriv/stores'; -import { TRootStore } from '@deriv/stores/types'; import { TLanguageLink } from 'App/Components/Routes/language-link'; import { LanguageLink } from '../index'; diff --git a/packages/core/src/App/Components/Routes/language-link.tsx b/packages/core/src/App/Components/Routes/language-link.tsx index acb3cea10b63..104d7a723a74 100644 --- a/packages/core/src/App/Components/Routes/language-link.tsx +++ b/packages/core/src/App/Components/Routes/language-link.tsx @@ -1,7 +1,6 @@ import React from 'react'; import classNames from 'classnames'; import { observer, useStore } from '@deriv/stores'; -import { useTranslation } from 'react-i18next'; import { Icon } from '@deriv/components'; import { getAllowedLanguages } from '@deriv/translations'; @@ -13,7 +12,6 @@ export type TLanguageLink = { }; const LanguageLink = observer(({ icon_classname, is_clickable = false, lang, toggleModal }: TLanguageLink) => { - const { i18n } = useTranslation(); const { common } = useStore(); const { changeSelectedLanguage, current_language } = common; const is_active = current_language === lang; @@ -53,10 +51,9 @@ const LanguageLink = observer(({ icon_classname, is_clickable = false, lang, tog data-testid='dt_settings_language_button' id={`dt_settings_${lang}_button`} key={lang} - onClick={async () => { + onClick={() => { + changeSelectedLanguage(lang); toggleModal?.(); - await changeSelectedLanguage(lang); - await i18n.changeLanguage?.(lang); }} className={classNames('settings-language__language-link', { 'settings-language__language-link--active': is_active, diff --git a/packages/core/src/App/Components/dev-tools/index.tsx b/packages/core/src/App/Components/dev-tools/index.tsx new file mode 100644 index 000000000000..2492cf1cb312 --- /dev/null +++ b/packages/core/src/App/Components/dev-tools/index.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import MockDialog from './mock-dialog'; +import { useLocalStorageData } from '@deriv/hooks'; + +const DevTools = () => { + const [show_mockserver_panel, setShowMockServerPanel] = useLocalStorageData( + 'show_mockserver_panel', + false + ); + + React.useEffect(() => { + const handleShortcutKey = (event: globalThis.KeyboardEvent) => { + if (event.ctrlKey && event.key === '0') { + setShowMockServerPanel(prev => !prev); + } + }; + + window.addEventListener('keydown', handleShortcutKey); + + return () => { + window.removeEventListener('keydown', handleShortcutKey); + }; + }, [setShowMockServerPanel]); + + if (show_mockserver_panel) { + return ; + } + + return ; +}; + +export default DevTools; diff --git a/packages/core/src/App/Components/dev-tools/mock-dialog.scss b/packages/core/src/App/Components/dev-tools/mock-dialog.scss new file mode 100644 index 000000000000..5dac9eb13f5d --- /dev/null +++ b/packages/core/src/App/Components/dev-tools/mock-dialog.scss @@ -0,0 +1,65 @@ +.mock-dialog { + position: absolute; + bottom: 4.6rem; + right: 1rem; + width: 34rem; + border-radius: $BORDER_RADIUS; + padding: 1.2rem 1.6rem; + background-color: var(--general-main-1); + box-shadow: 0 20px 13px rgba(0, 0, 0, 0.01), 0 4px 3px rgba(0, 0, 0, 0.02); + border: 1px solid var(--general-hover); + z-index: 69420; + + &__title { + margin-bottom: 1.4rem; + } + + &__status { + border-radius: 4px; + border: 2px solid; + padding: 0.8rem 1.2rem; + margin-bottom: 2.4rem; + + &--offline { + background-color: #f3f4f6; + border-color: #e5e7eb; + + .dc-text { + color: #6b7280; + } + } + } + + &__form { + display: flex; + min-height: 40rem; + flex-direction: column; + gap: 2rem; + + &--dropdown-container { + display: inline-flex; + gap: 1rem; + + button { + height: unset; + } + } + + &--input { + margin-bottom: unset; + } + + &--submit-container { + display: flex; + justify-content: end; + gap: 1rem; + + button:disabled { + cursor: not-allowed; + span { + color: #9ca3af; + } + } + } + } +} diff --git a/packages/core/src/App/Components/dev-tools/mock-dialog.tsx b/packages/core/src/App/Components/dev-tools/mock-dialog.tsx new file mode 100644 index 000000000000..c91d65ece887 --- /dev/null +++ b/packages/core/src/App/Components/dev-tools/mock-dialog.tsx @@ -0,0 +1,163 @@ +import React from 'react'; +import classNames from 'classnames'; +import { Button, Dropdown, Input, Text } from '@deriv/components'; +import { useLocalStorageData } from '@deriv/hooks'; +import { useStore } from '@deriv/stores'; +import { useWS } from '@deriv/shared'; +import { getLanguage } from '@deriv/translations'; +import './mock-dialog.scss'; + +type MockServerStatus = 'online' | 'connecting' | 'offline'; + +type MockServerData = { + session_id: string; + is_mockserver_enabled: boolean; +}; + +const default_mock_data = { + session_id: '', + is_mockserver_enabled: false, +}; + +const MockDialog = () => { + const WS = useWS(); + const { client } = useStore(); + const [session_list, setSessionList] = React.useState([]); + const [mock_server_data, setMockServerData, clearAllData] = useLocalStorageData( + 'mock_server_data', + default_mock_data + ); + + React.useEffect(() => { + getSessionList(); + }, []); + + const getSessionList = async () => { + const response = await WS.send({ + generate_mock: 1, + session_list: 1, + }); + + const { session_list: list } = response; + if (Array.isArray(list)) { + setSessionList(prev => [...prev, ...list]); + } + }; + + const handleMockLogin = async () => { + const response = await WS.send({ + generate_mock: 1, + login: 1, + session_id: mock_server_data?.session_id, + }); + + delete response.echo_req; + delete response.req_id; + delete response.active_loginid; + + const param_obj: Record = {}; + Object.keys(response).forEach((loginid, index) => { + const current_index = index + 1; + param_obj[`acct${current_index}`] = loginid; + param_obj[`token${current_index}`] = response[loginid].token ?? ''; + param_obj[`cur${current_index}`] = response[loginid].currency || 'USD'; + }); + + const params = new URLSearchParams(param_obj); + const new_url = new URL(`${window.location.href}?${params}`); + window.location.replace(new_url); + }; + + const handleSessionIdChange = (id: string) => { + if (id) { + WS.closeAndOpenNewConnection(getLanguage(), id); + } + }; + + const handleClearAll = () => { + clearAllData(); + WS.closeAndOpenNewConnection(getLanguage(), ''); + }; + + const getServerStatus = (): MockServerStatus => { + if (mock_server_data?.session_id && WS.hasReadyState(1)) { + return 'online'; + } else if (mock_server_data?.session_id && (!client.is_logged_in || client.is_logging_in)) { + return 'connecting'; + } + return 'offline'; + }; + + return ( +
+
+ + Mock Server Config + +
+
+ + Mock Server status: {getServerStatus().toLocaleUpperCase()} + +
+
+
+ ({ + text: s, + value: s, + }))} + onChange={e => + setMockServerData(prev => (prev !== null ? { ...prev, session_id: e.target.value } : prev)) + } + value={mock_server_data?.session_id} + is_align_text_left + /> + +
+ + setMockServerData(prev => (prev !== null ? { ...prev, session_id: e.target.value } : prev)) + } + /> +
+ +
+
+ + +
+
+
+ ); +}; + +export default MockDialog; diff --git a/packages/core/src/App/Containers/AccountSignupModal/account-signup-modal.jsx b/packages/core/src/App/Containers/AccountSignupModal/account-signup-modal.jsx index 1cbfedc8767a..db7e32bf388b 100644 --- a/packages/core/src/App/Containers/AccountSignupModal/account-signup-modal.jsx +++ b/packages/core/src/App/Containers/AccountSignupModal/account-signup-modal.jsx @@ -1,17 +1,22 @@ -import { Formik, Form } from 'formik'; -import PropTypes from 'prop-types'; import React from 'react'; -import { getLocation, SessionStore } from '@deriv/shared'; +import { Form,Formik } from 'formik'; +import PropTypes from 'prop-types'; + import { Button, Checkbox, Dialog, Loading, Text } from '@deriv/components'; +import { getLocation, SessionStore } from '@deriv/shared'; import { localize } from '@deriv/translations'; + import { WS } from 'Services'; import { connect } from 'Stores/connect'; + +import CitizenshipForm from '../CitizenshipModal/set-citizenship-form.jsx'; import PasswordSelectionModal from '../PasswordSelectionModal/password-selection-modal.jsx'; import ResidenceForm from '../SetResidenceModal/set-residence-form.jsx'; -import CitizenshipForm from '../CitizenshipModal/set-citizenship-form.jsx'; -import 'Sass/app/modules/account-signup.scss'; + import validateSignupFields from './validate-signup-fields.jsx'; +import 'Sass/app/modules/account-signup.scss'; + const AccountSignup = ({ enableApp, is_mobile, isModalVisible, clients_country, onSignup, residence_list }) => { const signupInitialValues = { citizenship: '', password: '', residence: '' }; const [api_error, setApiError] = React.useState(false); diff --git a/packages/core/src/App/Containers/CitizenshipModal/set-citizenship-form.jsx b/packages/core/src/App/Containers/CitizenshipModal/set-citizenship-form.jsx index 4cd4581eff0c..b856dd77b323 100644 --- a/packages/core/src/App/Containers/CitizenshipModal/set-citizenship-form.jsx +++ b/packages/core/src/App/Containers/CitizenshipModal/set-citizenship-form.jsx @@ -1,6 +1,7 @@ +import React from 'react'; import { Field } from 'formik'; import PropTypes from 'prop-types'; -import React from 'react'; + import { Autocomplete, Text } from '@deriv/components'; import { Localize, localize } from '@deriv/translations'; diff --git a/packages/core/src/App/Containers/Layout/header/default-mobile-links.tsx b/packages/core/src/App/Containers/Layout/header/default-mobile-links.tsx index 8bc021ab4901..6dcd2a36e4ed 100644 --- a/packages/core/src/App/Containers/Layout/header/default-mobile-links.tsx +++ b/packages/core/src/App/Containers/Layout/header/default-mobile-links.tsx @@ -1,8 +1,11 @@ import React from 'react'; + import { Button, Icon, Popover } from '@deriv/components'; import { routes } from '@deriv/shared'; import { Localize } from '@deriv/translations'; + import { BinaryLink } from 'App/Components/Routes'; + import ShowNotifications from './show-notifications'; import TradersHubOnboarding from './traders-hub-onboarding'; diff --git a/packages/core/src/App/Containers/Layout/header/dtrader-header.jsx b/packages/core/src/App/Containers/Layout/header/dtrader-header.jsx index e36cbd596cdd..14dbf0fa9a89 100644 --- a/packages/core/src/App/Containers/Layout/header/dtrader-header.jsx +++ b/packages/core/src/App/Containers/Layout/header/dtrader-header.jsx @@ -4,6 +4,7 @@ import React from 'react'; import { withRouter } from 'react-router-dom'; import { DesktopWrapper, MobileWrapper } from '@deriv/components'; import { routes, isMobile, getDecimalPlaces, platforms } from '@deriv/shared'; +// import { useWalletMigration } from '@deriv/hooks'; import { AccountActions, MenuLinks, PlatformSwitcher } from 'App/Components/Layout/Header'; import platform_config from 'App/Constants/platform-config.ts'; import RealAccountSignup from 'App/Containers/RealAccountSignup'; @@ -59,6 +60,11 @@ const DTraderHeader = ({ [removeNotificationMessage] ); + //TODO: Uncomment once useWalletMigration hook is optimized for production release. + // const { is_migrated, is_failed } = useWalletMigration(); + // if (is_migrated) addNotificationMessage(client_notifications.wallets_migrated); + // if (is_failed) addNotificationMessage(client_notifications.wallets_failed); + React.useEffect(() => { document.addEventListener('IgnorePWAUpdate', removeUpdateNotification); return () => document.removeEventListener('IgnorePWAUpdate', removeUpdateNotification); diff --git a/packages/core/src/App/Containers/Modals/app-modals.jsx b/packages/core/src/App/Containers/Modals/app-modals.jsx index 64f42e8750d4..cf06ccb3cfca 100644 --- a/packages/core/src/App/Containers/Modals/app-modals.jsx +++ b/packages/core/src/App/Containers/Modals/app-modals.jsx @@ -1,17 +1,20 @@ import React from 'react'; import { useLocation } from 'react-router-dom'; -import { ContentFlag, routes, moduleLoader, SessionStore } from '@deriv/shared'; -import { connect } from 'Stores/connect'; -import MT5Notification from './mt5-notification'; + +import { ContentFlag, moduleLoader, routes, SessionStore } from '@deriv/shared'; + +import DerivRealAccountRequiredModal from 'App/Components/Elements/Modals/deriv-real-account-required-modal.jsx'; import MT5AccountNeededModal from 'App/Components/Elements/Modals/mt5-account-needed-modal.jsx'; import RedirectNoticeModal from 'App/Components/Elements/Modals/RedirectNotice'; -import CooldownWarningModal from './cooldown-warning-modal.jsx'; -import TradingAssessmentExistingUser from './trading-assessment-existing-user.jsx'; +import { connect } from 'Stores/connect'; + import CompletedAssessmentModal from './completed-assessment-modal.jsx'; -import DerivRealAccountRequiredModal from 'App/Components/Elements/Modals/deriv-real-account-required-modal.jsx'; +import CooldownWarningModal from './cooldown-warning-modal.jsx'; +import MT5Notification from './mt5-notification'; +import NeedRealAccountForCashierModal from './need-real-account-for-cashier-modal'; import ReadyToDepositModal from './ready-to-deposit-modal'; import RiskAcceptTestWarningModal from './risk-accept-test-warning-modal'; -import NeedRealAccountForCashierModal from './need-real-account-for-cashier-modal'; +import TradingAssessmentExistingUser from './trading-assessment-existing-user.jsx'; const AccountSignupModal = React.lazy(() => moduleLoader(() => import(/* webpackChunkName: "account-signup-modal" */ '../AccountSignupModal')) @@ -48,6 +51,15 @@ const WarningCloseCreateRealAccountModal = React.lazy(() => import(/* webpackChunkName: "warning-close-create-real-account" */ '../WarningCloseCreateRealAccountModal') ); +const AdditionalKycInfoModal = React.lazy(() => + import( + /* webpackChunkName: "additional-kyc-info-modal" */ '@deriv/account/src/Components/additional-kyc-info-modal' + ) +); +const InformationSubmittedModal = React.lazy(() => + import(/* webpackChunkName: "information-submitted-modal" */ './information-submitted-modal') +); + const AppModals = ({ is_account_needed_modal_on, is_closing_create_real_account_modal, @@ -70,6 +82,8 @@ const AppModals = ({ is_trading_experience_incomplete, should_show_risk_accept_modal, is_need_real_account_for_cashier_modal_visible, + is_additional_kyc_info_modal_open, + is_kyc_information_submitted_modal_open, }) => { const temp_session_signup_params = SessionStore.get('signup_query_param'); const url_params = new URLSearchParams(useLocation().search || temp_session_signup_params); @@ -156,6 +170,14 @@ const AppModals = ({ ComponentToLoad = ; } + if (is_additional_kyc_info_modal_open) { + ComponentToLoad = ; + } + + if (is_kyc_information_submitted_modal_open) { + ComponentToLoad = ; + } + return ( <> @@ -189,4 +211,6 @@ export default connect(({ client, ui, traders_hub }) => ({ content_flag: traders_hub.content_flag, is_trading_experience_incomplete: client.is_trading_experience_incomplete, should_show_risk_accept_modal: ui.should_show_risk_accept_modal, + is_additional_kyc_info_modal_open: ui.is_additional_kyc_info_modal_open, + is_kyc_information_submitted_modal_open: ui.is_kyc_information_submitted_modal_open, }))(AppModals); diff --git a/packages/core/src/App/Containers/Modals/information-submitted-modal/__test__/information-submitted-modal.spec.tsx b/packages/core/src/App/Containers/Modals/information-submitted-modal/__test__/information-submitted-modal.spec.tsx new file mode 100644 index 000000000000..e7ba71eed40e --- /dev/null +++ b/packages/core/src/App/Containers/Modals/information-submitted-modal/__test__/information-submitted-modal.spec.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import InformationSubmittedModal from '../information-submitted-modal'; + +describe('', () => { + const mock_store = mockStore({ + ui: { + is_kyc_information_submitted_modal_open: true, + }, + }); + + it('should render InformationSubmittedModal component', () => { + render( + + + + ); + expect(screen.getByRole('dialog')).toBeInTheDocument(); + }); + + it('should render InformationSubmittedModal component with title and content', () => { + render( + + + + ); + expect(screen.getByRole('heading', { level: 1 })).toHaveTextContent(/information updated/i); + expect(screen.getByText(/thank you for submitting your information/i)).toBeInTheDocument(); + }); +}); diff --git a/packages/core/src/App/Containers/Modals/information-submitted-modal/index.ts b/packages/core/src/App/Containers/Modals/information-submitted-modal/index.ts new file mode 100644 index 000000000000..d217954c5266 --- /dev/null +++ b/packages/core/src/App/Containers/Modals/information-submitted-modal/index.ts @@ -0,0 +1,3 @@ +import InformationSubmittedModal from './information-submitted-modal'; + +export default InformationSubmittedModal; diff --git a/packages/core/src/App/Containers/Modals/information-submitted-modal/information-submitted-modal.tsx b/packages/core/src/App/Containers/Modals/information-submitted-modal/information-submitted-modal.tsx new file mode 100644 index 000000000000..8ef61e79ccdc --- /dev/null +++ b/packages/core/src/App/Containers/Modals/information-submitted-modal/information-submitted-modal.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Dialog } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import { useStore, observer } from '@deriv/stores'; + +const InformationSubmittedModal = observer(() => { + const { ui } = useStore(); + const { is_kyc_information_submitted_modal_open: is_open, toggleKycInformationSubmittedModal } = ui; + + return ( + + + + ); +}); + +export default InformationSubmittedModal; diff --git a/packages/core/src/App/Containers/PasswordSelectionModal/password-selection-modal.jsx b/packages/core/src/App/Containers/PasswordSelectionModal/password-selection-modal.jsx index 3976f1c650ac..a5244400cbd4 100644 --- a/packages/core/src/App/Containers/PasswordSelectionModal/password-selection-modal.jsx +++ b/packages/core/src/App/Containers/PasswordSelectionModal/password-selection-modal.jsx @@ -1,11 +1,14 @@ +import React from 'react'; import classNames from 'classnames'; import { Field } from 'formik'; -import React from 'react'; + import { Button, PasswordInput, PasswordMeter, Text } from '@deriv/components'; import { getErrorMessages, redirectToSignUp } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; -import { localize, Localize } from '@deriv/translations'; +import { Localize,localize } from '@deriv/translations'; + import SignupSeparatorContainer from '../AccountSignupModal/signup-separator-container.jsx'; + import 'Sass/app/modules/account-signup.scss'; const PasswordSelectionModal = observer( diff --git a/packages/core/src/App/Containers/RealAccountSignup/__tests__/real-account-signup.spec.jsx b/packages/core/src/App/Containers/RealAccountSignup/__tests__/real-account-signup.spec.jsx index f0f70131a0a8..7864791beb1f 100644 --- a/packages/core/src/App/Containers/RealAccountSignup/__tests__/real-account-signup.spec.jsx +++ b/packages/core/src/App/Containers/RealAccountSignup/__tests__/real-account-signup.spec.jsx @@ -1,6 +1,8 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; import { BrowserRouter } from 'react-router-dom'; + +import { render, screen } from '@testing-library/react'; + import RealAccountSignup from '../real-account-signup.jsx'; jest.mock('Stores/connect', () => ({ diff --git a/packages/core/src/App/Containers/RealAccountSignup/account-wizard-form.js b/packages/core/src/App/Containers/RealAccountSignup/account-wizard-form.js index 7fb55cf09287..c412cda01bd2 100644 --- a/packages/core/src/App/Containers/RealAccountSignup/account-wizard-form.js +++ b/packages/core/src/App/Containers/RealAccountSignup/account-wizard-form.js @@ -1,4 +1,5 @@ import { + FinancialDetails, PersonalDetails, TermsOfUse, TradingAssessmentNewUser, @@ -10,18 +11,15 @@ import { tradingAssessmentConfig, } from '@deriv/account'; -import AddressDetails from './address-details'; -import CurrencySelector from './currency-selector.jsx'; -import FinancialDetails from './financial-details.jsx'; +import AddressDetails from '@deriv/account/src/Components/address-details'; +import CurrencySelector from '@deriv/account/src/Components/currency-selector'; const isMaltaAccount = ({ real_account_signup_target }) => real_account_signup_target === 'maltainvest'; -const shouldShowPersonalAndAddressDetailsAndCurrency = ({ real_account_signup_target }) => - real_account_signup_target !== 'samoa'; export const getItems = props => [ - ...(shouldShowPersonalAndAddressDetailsAndCurrency(props) ? [currencySelectorConfig(props, CurrencySelector)] : []), - ...(shouldShowPersonalAndAddressDetailsAndCurrency(props) ? [personalDetailsConfig(props, PersonalDetails)] : []), - ...(shouldShowPersonalAndAddressDetailsAndCurrency(props) ? [addressDetailsConfig(props, AddressDetails)] : []), + currencySelectorConfig(props, CurrencySelector), + personalDetailsConfig(props, PersonalDetails), + addressDetailsConfig(props, AddressDetails), ...(isMaltaAccount(props) ? [tradingAssessmentConfig(props, TradingAssessmentNewUser)] : []), ...(isMaltaAccount(props) ? [financialDetailsConfig(props, FinancialDetails)] : []), termsOfUseConfig(props, TermsOfUse), diff --git a/packages/core/src/App/Containers/RealAccountSignup/address-details.jsx b/packages/core/src/App/Containers/RealAccountSignup/address-details.jsx deleted file mode 100644 index 7b91511c5fe6..000000000000 --- a/packages/core/src/App/Containers/RealAccountSignup/address-details.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { AddressDetails } from '@deriv/account'; -import { connect } from 'Stores/connect'; - -export default connect(({ client }) => ({ - is_gb_residence: client.residence === 'gb', - fetchStatesList: client.fetchStatesList, - states_list: client.states_list, -}))(AddressDetails); diff --git a/packages/core/src/App/Containers/RealAccountSignup/currency-selector.jsx b/packages/core/src/App/Containers/RealAccountSignup/currency-selector.jsx deleted file mode 100644 index a8f23d58b27d..000000000000 --- a/packages/core/src/App/Containers/RealAccountSignup/currency-selector.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import { CurrencySelector } from '@deriv/account'; -import { connect } from 'Stores/connect'; -import './currency-selector.scss'; - -export default connect(({ client, ui }) => ({ - currencies: client.currencies_list, - has_currency: !!client.currency, - has_real_account: client.has_active_real_account, - legal_allowed_currencies: client.upgradeable_currencies, - real_account_signup: ui.real_account_signup, - resetRealAccountSignupParams: ui.resetRealAccountSignupParams, - selectable_currencies: client.selectable_currencies, - available_crypto_currencies: client.available_crypto_currencies, - real_account_signup_target: ui.real_account_signup_target, - is_dxtrade_allowed: client.is_dxtrade_allowed, - is_mt5_allowed: client.is_mt5_allowed, - has_fiat: client.has_fiat, - accounts: client.accounts, - is_eu: client.is_eu, -}))(CurrencySelector); diff --git a/packages/core/src/App/Containers/RealAccountSignup/financial-details.jsx b/packages/core/src/App/Containers/RealAccountSignup/financial-details.jsx deleted file mode 100644 index 274cfa2e9824..000000000000 --- a/packages/core/src/App/Containers/RealAccountSignup/financial-details.jsx +++ /dev/null @@ -1,8 +0,0 @@ -import { FinancialDetails } from '@deriv/account'; -import { connect } from 'Stores/connect'; - -export default connect(({ client }) => ({ - is_gb_residence: client.residence === 'gb', - fetchStatesList: client.fetchStatesList, - states_list: client.states_list, -}))(FinancialDetails); diff --git a/packages/core/src/App/Containers/RealAccountSignup/real-account-signup.jsx b/packages/core/src/App/Containers/RealAccountSignup/real-account-signup.jsx index 3f09be4247d7..22a7b14354fc 100644 --- a/packages/core/src/App/Containers/RealAccountSignup/real-account-signup.jsx +++ b/packages/core/src/App/Containers/RealAccountSignup/real-account-signup.jsx @@ -1,21 +1,25 @@ /* eslint-disable react/display-name */ -import classNames from 'classnames'; import React from 'react'; import { withRouter } from 'react-router-dom'; -import { Button, Text, Modal, DesktopWrapper, MobileDialog, MobileWrapper } from '@deriv/components'; -import { routes } from '@deriv/shared'; +import classNames from 'classnames'; + import { RiskToleranceWarningModal, TestWarningModal } from '@deriv/account'; -import { localize, Localize } from '@deriv/translations'; +import { Button, DesktopWrapper, MobileDialog, MobileWrapper,Modal, Text } from '@deriv/components'; +import { routes } from '@deriv/shared'; +import { Localize,localize } from '@deriv/translations'; + import { connect } from 'Stores/connect'; + import AccountWizard from './account-wizard.jsx'; import AddCurrency from './add-currency.jsx'; import AddOrManageAccounts from './add-or-manage-accounts.jsx'; import ChooseCurrency from './choose-currency.jsx'; -import SetCurrency from './set-currency.jsx'; import FinishedAddCurrency from './finished-add-currency.jsx'; import FinishedSetCurrency from './finished-set-currency.jsx'; +import SetCurrency from './set-currency.jsx'; import SignupErrorContent from './signup-error-content.jsx'; import StatusDialogContainer from './status-dialog-container.jsx'; + import 'Sass/account-wizard.scss'; import 'Sass/real-account-signup.scss'; diff --git a/packages/core/src/App/Containers/RealAccountSignup/set-currency.jsx b/packages/core/src/App/Containers/RealAccountSignup/set-currency.jsx index 93367176e2c1..08a2fef65240 100644 --- a/packages/core/src/App/Containers/RealAccountSignup/set-currency.jsx +++ b/packages/core/src/App/Containers/RealAccountSignup/set-currency.jsx @@ -5,7 +5,7 @@ import { currencySelectorConfig } from '@deriv/account'; import { website_name, generateValidationFunction } from '@deriv/shared'; import { Text } from '@deriv/components'; import { connect } from 'Stores/connect'; -import CurrencySelector from './currency-selector'; +import CurrencySelector from '@deriv/account/src/Components/currency-selector'; import LoadingModal from './real-account-signup-loader.jsx'; import 'Sass/set-currency.scss'; import 'Sass/change-account.scss'; diff --git a/packages/core/src/App/Containers/SetResidenceModal/set-residence-form.jsx b/packages/core/src/App/Containers/SetResidenceModal/set-residence-form.jsx index 765112537ac2..0c5f99c644b7 100644 --- a/packages/core/src/App/Containers/SetResidenceModal/set-residence-form.jsx +++ b/packages/core/src/App/Containers/SetResidenceModal/set-residence-form.jsx @@ -1,6 +1,7 @@ +import React from 'react'; import { Field } from 'formik'; import PropTypes from 'prop-types'; -import React from 'react'; + import { Autocomplete, Text } from '@deriv/components'; import { Localize, localize } from '@deriv/translations'; diff --git a/packages/core/src/App/Containers/SetResidenceModal/set-residence-modal.jsx b/packages/core/src/App/Containers/SetResidenceModal/set-residence-modal.jsx index 05b2f60fa92a..659c037224aa 100644 --- a/packages/core/src/App/Containers/SetResidenceModal/set-residence-modal.jsx +++ b/packages/core/src/App/Containers/SetResidenceModal/set-residence-modal.jsx @@ -1,12 +1,16 @@ +import React from 'react'; import classNames from 'classnames'; -import { Formik, Form } from 'formik'; +import { Form,Formik } from 'formik'; import PropTypes from 'prop-types'; -import React from 'react'; + import { Button, Dialog, Text } from '@deriv/components'; +import { website_name } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; + import { connect } from 'Stores/connect'; -import { website_name } from '@deriv/shared'; + import SetResidenceForm from './set-residence-form.jsx'; + import 'Sass/app/modules/set-residence.scss'; // TODO: Move some of these functions to helpers since some of them are shared with AccountSignUpModal diff --git a/packages/core/src/App/Containers/SettingsModal/settings-language.jsx b/packages/core/src/App/Containers/SettingsModal/settings-language.jsx index 80bf29f4864d..c559f5e7afd2 100644 --- a/packages/core/src/App/Containers/SettingsModal/settings-language.jsx +++ b/packages/core/src/App/Containers/SettingsModal/settings-language.jsx @@ -12,7 +12,7 @@ const LanguageSettings = observer(() => { return (
-
+
{Object.keys(getAllowedLanguages()).map(lang => isCurrentLanguage(lang, current_language) ? ( diff --git a/packages/core/src/App/Containers/app-notification-messages.jsx b/packages/core/src/App/Containers/app-notification-messages.jsx index 98e98a0d6ef1..98dcceb5a2e7 100644 --- a/packages/core/src/App/Containers/app-notification-messages.jsx +++ b/packages/core/src/App/Containers/app-notification-messages.jsx @@ -112,10 +112,12 @@ const AppNotificationMessages = ({ 'svg_needs_poi', 'svg_needs_poi_poa', 'svg_poi_expired', - 'switched_to_real', + 'wallets_migrated', + 'wallets_failed', 'tnc', 'trustpilot', 'unwelcome', + 'additional_kyc_info', ].includes(message.key) || message.type === 'p2p_completed_order' : true; diff --git a/packages/core/src/Stores/Helpers/client-notifications.js b/packages/core/src/Stores/Helpers/client-notifications.js index 537c3d421746..3cfbaba2763b 100644 --- a/packages/core/src/Stores/Helpers/client-notifications.js +++ b/packages/core/src/Stores/Helpers/client-notifications.js @@ -62,7 +62,7 @@ export const getCashierValidations = cashier_arr => { }; // Notifications keys will not be added to localStorage and will appear again after user logout/login -export const excluded_notifications = ['contract_sold', 'switched_to_real', 'has_changed_two_fa']; +export const excluded_notifications = ['contract_sold', 'has_changed_two_fa']; export const maintenance_notifications = ['system_maintenance', 'site_maintenance']; @@ -71,7 +71,10 @@ export const priority_toast_messages = [ 'need_fa', 'p2p_daily_limit_increase', 'authenticate', + 'wallets_migrated', + 'wallets_failed', 'notify_financial_assessment', + 'additional_kyc_info', 'svg_needs_poi_poa', 'svg_needs_poa', 'svg_needs_poi', diff --git a/packages/core/src/Stores/base-store.js b/packages/core/src/Stores/base-store.js index 1c5f1c2de71a..9fe9159f7a47 100644 --- a/packages/core/src/Stores/base-store.js +++ b/packages/core/src/Stores/base-store.js @@ -1,5 +1,6 @@ -import { action, intercept, observable, reaction, toJS, when, makeObservable } from 'mobx'; -import { isProduction, isEmptyObject, Validator } from '@deriv/shared'; +import { action, intercept, makeObservable,observable, reaction, toJS, when } from 'mobx'; + +import { isEmptyObject, isProduction, Validator } from '@deriv/shared'; /** * BaseStore class is the base class for all defined stores in the application. It handles some stuff such as: diff --git a/packages/core/src/Stores/client-store.js b/packages/core/src/Stores/client-store.js index 90df1147ec82..3656e7599411 100644 --- a/packages/core/src/Stores/client-store.js +++ b/packages/core/src/Stores/client-store.js @@ -53,7 +53,6 @@ export default class ClientStore extends BaseStore { email; accounts = {}; trading_platform_available_accounts = []; - ctrader_available_accounts = []; derivez_available_accounts = []; pre_switch_broadcast = false; switched = ''; @@ -167,7 +166,6 @@ export default class ClientStore extends BaseStore { email: observable, accounts: observable, trading_platform_available_accounts: observable, - ctrader_available_accounts: observable, derivez_available_accounts: observable, pre_switch_broadcast: observable, switched: observable, @@ -384,7 +382,6 @@ export default class ClientStore extends BaseStore { responseTradingPlatformAvailableAccounts: action.bound, responseDerivezAvailableAccounts: action.bound, responseTradingPlatformAccountsList: action.bound, - responseCTraderAvailableAccounts: action.bound, responseStatement: action.bound, getChangeableFields: action.bound, syncWithLegacyPlatforms: action.bound, @@ -695,7 +692,7 @@ export default class ClientStore extends BaseStore { if (Object.keys(this.currencies_list).length > 0) { const keys = Object.keys(this.currencies_list); // Fix for edge case when logging out from crypto accounts causes Fiat list to be empty - if (this.currencies_list[localize('Fiat')].length < 1) return 'USD'; + if (this.currencies_list[localize('Fiat')]?.length < 1) return 'USD'; return Object.values(this.currencies_list[`${keys[0]}`])[0].text; } @@ -867,7 +864,7 @@ export default class ClientStore extends BaseStore { const mt_gaming_shortcode = mt_gaming_company?.financial.shortcode || mt_gaming_company?.swap_free.shortcode; const is_current_mf = this.landing_company_shortcode === 'maltainvest'; return ( - is_current_mf || //is_currently logged in mf account via trdaershub + is_current_mf || //is_currently logged in mf account via tradershub (financial_shortcode || gaming_shortcode || mt_gaming_shortcode ? (eu_shortcode_regex.test(financial_shortcode) && gaming_shortcode !== 'svg') || eu_shortcode_regex.test(gaming_shortcode) @@ -1709,7 +1706,6 @@ export default class ClientStore extends BaseStore { WS.tradingPlatformAvailableAccounts(CFD_PLATFORMS.MT5).then(this.responseTradingPlatformAvailableAccounts); WS.tradingPlatformAccountsList(CFD_PLATFORMS.DXTRADE).then(this.responseTradingPlatformAccountsList); WS.tradingPlatformAccountsList(CFD_PLATFORMS.CTRADER).then(this.responseTradingPlatformAccountsList); - WS.tradingPlatformAvailableAccounts(CFD_PLATFORMS.CTRADER).then(this.responseCTraderAvailableAccounts); WS.tradingServers(CFD_PLATFORMS.DXTRADE).then(this.responseDxtradeTradingServers); WS.tradingPlatformAccountsList(CFD_PLATFORMS.DERIVEZ).then(this.responseTradingPlatformAccountsList); WS.tradingPlatformAccountsList(CFD_PLATFORMS.DERIVEZ).then(this.responseDerivezAvailableAccounts); @@ -1949,7 +1945,7 @@ export default class ClientStore extends BaseStore { // if real to virtual --> switch to blue // if virtual to real --> switch to green // else keep the existing connection - const should_switch_socket_connection = this.is_virtual || /VRTC/.test(from_login_id); + const should_switch_socket_connection = this.is_virtual || /VRTC|VRW/.test(from_login_id); if (should_switch_socket_connection) { BinarySocket.closeAndOpenNewConnection(); @@ -2539,12 +2535,6 @@ export default class ClientStore extends BaseStore { } } - responseCTraderAvailableAccounts(response) { - if (!response.error) { - this.ctrader_available_accounts = response.trading_platform_available_accounts; - } - } - responseDerivezAvailableAccounts(response) { if (!response.error) { this.derivez_available_accounts = response.trading_platform_accounts; diff --git a/packages/core/src/Stores/common-store.js b/packages/core/src/Stores/common-store.js index 00dc32ed2599..c0143e1137ea 100644 --- a/packages/core/src/Stores/common-store.js +++ b/packages/core/src/Stores/common-store.js @@ -13,77 +13,71 @@ export default class CommonStore extends BaseStore { super({ root_store }); makeObservable(this, { - server_time: observable, - current_language: observable, - is_language_changing: observable, + addRouteHistoryItem: action.bound, allowed_languages: observable, - has_error: observable, + app_id: observable, + app_router: observable, + app_routing_history: observable, + changeCurrentLanguage: action.bound, + changeSelectedLanguage: action.bound, + changing_language_timer_id: observable, + checkAppId: action.bound, + current_language: observable, + deposit_url: observable, error: observable, - network_status: observable, + has_error: observable, + init: action.bound, + is_from_derivgo: computed, + is_language_changing: observable, is_network_online: observable, is_socket_opened: observable, - was_socket_opened: observable, - services_error: observable, - deposit_url: observable, - withdraw_url: observable, - app_routing_history: observable, - app_router: observable, - app_id: observable, + network_status: observable, platform: observable, + routeBackInApp: action.bound, + routeTo: action.bound, selected_contract_type: observable, - changing_language_timer_id: observable, - setSelectedContractType: action.bound, - init: action.bound, - checkAppId: action.bound, - changeCurrentLanguage: action.bound, + server_time: observable, + services_error: observable, + setAppRouterHistory: action.bound, setAppstorePlatform: action.bound, - setPlatform: action.bound, - is_from_derivgo: computed, + setDepositURL: action.bound, + setError: action.bound, setInitialRouteHistoryItem: action.bound, - setServerTime: action.bound, setIsSocketOpened: action.bound, setNetworkStatus: action.bound, - setError: action.bound, - showError: action.bound, - setDepositURL: action.bound, - setWithdrawURL: action.bound, + setPlatform: action.bound, + setSelectedContractType: action.bound, + setServerTime: action.bound, setServicesError: action.bound, - setAppRouterHistory: action.bound, - routeTo: action.bound, - addRouteHistoryItem: action.bound, - changeSelectedLanguage: action.bound, - routeBackInApp: action.bound, + setWithdrawURL: action.bound, + showError: action.bound, + was_socket_opened: observable, + withdraw_url: observable, }); } - server_time = ServerTime.get() || toMoment(); // fallback: get current time from moment.js - current_language = currentLanguage; - is_language_changing = false; allowed_languages = Object.keys(getAllowedLanguages()); + app_id = undefined; + app_router = { history: null }; + app_routing_history = []; + changing_language_timer_id = ''; + current_language = currentLanguage; + deposit_url = ''; has_error = false; - + is_language_changing = false; + is_network_online = false; + is_socket_opened = false; error = { type: 'info', message: '', }; - network_status = {}; - is_network_online = false; - is_socket_opened = false; - was_socket_opened = false; - - services_error = {}; - - deposit_url = ''; - withdraw_url = ''; - - app_routing_history = []; - app_router = { history: null }; - app_id = undefined; platform = ''; selected_contract_type = ''; - - changing_language_timer_id = ''; + server_time = ServerTime.get() || toMoment(); // fallback: get current time from moment.js + services_error = {}; + was_socket_opened = false; + withdraw_url = ''; setSelectedContractType(contract_type) { this.selected_contract_type = contract_type; diff --git a/packages/core/src/Stores/contract-trade-store.js b/packages/core/src/Stores/contract-trade-store.js index f1196cba1baa..e536c957879f 100644 --- a/packages/core/src/Stores/contract-trade-store.js +++ b/packages/core/src/Stores/contract-trade-store.js @@ -1,13 +1,14 @@ -import { action, computed, observable, toJS, makeObservable, override, reaction, runInAction } from 'mobx'; +import { action, computed, makeObservable, observable, override, reaction, runInAction, toJS } from 'mobx'; + import { getAccuBarriersDTraderTimeout, getContractTypesConfig, isAccumulatorContract, isAccumulatorContractOpen, isCallPut, - isHighLow, isDesktop, isEnded, + isHighLow, isMobile, isMultiplierContract, isTurbosContract, @@ -15,8 +16,9 @@ import { LocalStore, switch_to_tick_chart, } from '@deriv/shared'; -import ContractStore from './contract-store'; + import BaseStore from './base-store'; +import ContractStore from './contract-store'; export default class ContractTradeStore extends BaseStore { // --- Observable properties --- @@ -93,7 +95,7 @@ export default class ContractTradeStore extends BaseStore { should_update_contract_barriers: true, underlying, }); - } else if (is_sold) { + } else if (!isAccumulatorContractOpen(this.last_contract.contract_info)) { this.clearAccumulatorBarriersData(true, false); } } @@ -132,15 +134,18 @@ export default class ContractTradeStore extends BaseStore { barrier_spot_distance, current_spot, current_spot_time, + prev_spot_time, should_update_contract_barriers, underlying, }) { if (current_spot) { + const ticks_history_prev_spot_time = prev_spot_time ?? this.accumulator_barriers_data.current_spot_time; // update current tick coming from ticks_history while skipping an update for duplicate data - if (current_spot_time === this.accumulator_barriers_data.current_spot_time) return; + if (current_spot_time === ticks_history_prev_spot_time) return; const current_spot_data = { current_spot, current_spot_time, + ticks_history_prev_spot_time, tick_update_timestamp: Date.now(), }; this.setNewAccumulatorBarriersData(current_spot_data, true); @@ -152,7 +157,7 @@ export default class ContractTradeStore extends BaseStore { accumulators_low_barrier, barrier_spot_distance, should_update_contract_barriers, - previous_spot_time: current_spot_time, + proposal_prev_spot_time: current_spot_time, }; if ( (this.accumulator_barriers_data.current_spot_time && @@ -171,6 +176,11 @@ export default class ContractTradeStore extends BaseStore { const tick_update_timestamp = should_update_contract_barriers ? this.accumulator_contract_barriers_data.tick_update_timestamp : this.accumulator_barriers_data.tick_update_timestamp; + if (document.hidden) { + clearTimeout(this.accu_barriers_timeout_id); + this.setNewAccumulatorBarriersData(delayed_barriers_data, should_update_contract_barriers); + return; + } this.accu_barriers_timeout_id = setTimeout( () => { runInAction(() => { @@ -255,31 +265,36 @@ export default class ContractTradeStore extends BaseStore { get has_crossed_accu_barriers() { const { symbol } = JSON.parse(sessionStorage.getItem('trade_store')) || {}; + const { current_spot: contract_current_spot, entry_spot, underlying } = this.last_contract.contract_info || {}; const { - current_spot: contract_current_spot, - entry_spot, - underlying, - } = this.root_store.portfolio.active_positions.find( - ({ type, contract_info: _contract_info }) => - isAccumulatorContract(type) && _contract_info.underlying === symbol - )?.contract_info || {}; - const { accumulators_high_barrier, accumulators_low_barrier, current_spot } = + accumulators_high_barrier, + accumulators_low_barrier, + current_spot, + proposal_prev_spot_time, + ticks_history_prev_spot_time, + } = (isAccumulatorContractOpen(this.last_contract.contract_info) ? this.accumulator_contract_barriers_data : this.accumulator_barriers_data) || {}; - return !!( + const is_knock_out = current_spot && accumulators_high_barrier && accumulators_low_barrier && - (current_spot >= accumulators_high_barrier || current_spot <= accumulators_low_barrier) && - (!isAccumulatorContractOpen(this.last_contract.contract_info) || - (entry_spot && entry_spot !== contract_current_spot && underlying === symbol)) + (current_spot >= accumulators_high_barrier || current_spot <= accumulators_low_barrier); + const is_relevant_barrier = + ticks_history_prev_spot_time && ticks_history_prev_spot_time === proposal_prev_spot_time; + const should_highlight_contract_barriers = + entry_spot && entry_spot !== contract_current_spot && underlying === symbol; + return !!( + is_knock_out && + is_relevant_barrier && + (!isAccumulatorContractOpen(this.last_contract.contract_info) || should_highlight_contract_barriers) ); } get markers_array() { let markers = []; - const { contract_type: trade_type, symbol } = JSON.parse(sessionStorage.getItem('trade_store')) || {}; + const { contract_type: trade_type } = JSON.parse(sessionStorage.getItem('trade_store')) || {}; markers = this.applicable_contracts() .map(c => c.marker) .filter(m => m) @@ -287,21 +302,18 @@ export default class ContractTradeStore extends BaseStore { if (markers.length) { markers[markers.length - 1].is_last_contract = true; } - const { current_spot_time, entry_tick_time, exit_tick_time } = - this.root_store.portfolio.active_positions.find( - ({ type, contract_info: _contract_info }) => - isAccumulatorContract(type) && _contract_info.underlying === symbol - )?.contract_info || {}; - const { accumulators_high_barrier, accumulators_low_barrier, barrier_spot_distance, previous_spot_time } = - (((isAccumulatorContractOpen(this.last_contract.contract_info) && - entry_tick_time && - entry_tick_time !== current_spot_time) || - (exit_tick_time && current_spot_time <= exit_tick_time)) && + const { current_spot_time, entry_tick_time, exit_tick_time } = this.last_contract.contract_info || {}; + const should_show_poc_barriers = + (entry_tick_time && entry_tick_time !== current_spot_time) || + (exit_tick_time && current_spot_time <= exit_tick_time); + const { accumulators_high_barrier, accumulators_low_barrier, barrier_spot_distance, proposal_prev_spot_time } = + (isAccumulatorContractOpen(this.last_contract.contract_info) && + should_show_poc_barriers && this.accumulator_contract_barriers_data?.accumulators_high_barrier && this.accumulator_contract_barriers_data) || this.accumulator_barriers_data || {}; - if (trade_type === 'accumulator' && previous_spot_time && accumulators_high_barrier) { + if (trade_type === 'accumulator' && proposal_prev_spot_time && accumulators_high_barrier) { markers.push({ type: 'TickContract', contract_info: { @@ -316,7 +328,7 @@ export default class ContractTradeStore extends BaseStore { }, key: 'dtrader_accumulator_barriers', price_array: [accumulators_high_barrier, accumulators_low_barrier], - epoch_array: [previous_spot_time], + epoch_array: [proposal_prev_spot_time], }); } return markers; @@ -397,7 +409,7 @@ export default class ContractTradeStore extends BaseStore { get last_contract() { const applicable_contracts = this.applicable_contracts(); - const length = applicable_contracts.length; + const length = this.contracts[0]?.contract_info.current_spot_time ? applicable_contracts.length : -1; return length > 0 ? applicable_contracts[length - 1] : {}; } diff --git a/packages/core/src/Stores/notification-store.js b/packages/core/src/Stores/notification-store.js index 1b8c6b895220..38755d5378e3 100644 --- a/packages/core/src/Stores/notification-store.js +++ b/packages/core/src/Stores/notification-store.js @@ -1,9 +1,9 @@ import React from 'react'; import debounce from 'lodash.debounce'; import { action, computed, makeObservable, observable, reaction } from 'mobx'; + import { StaticUrl } from '@deriv/components'; import { - LocalStore, daysSince, formatDate, formatMoney, @@ -15,13 +15,18 @@ import { isEmptyObject, isMobile, isMultiplierContract, + LocalStore, platform_name, routes, unique, } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; + import { BinaryLink } from 'App/Components/Routes'; import { WS } from 'Services'; + +import { sortNotifications, sortNotificationsMobile } from '../App/Components/Elements/NotificationMessage/constants'; + import { excluded_notifications, getCashierValidations, @@ -29,7 +34,6 @@ import { hasMissingRequiredField, maintenance_notifications, } from './Helpers/client-notifications'; -import { sortNotifications, sortNotificationsMobile } from '../App/Components/Elements/NotificationMessage/constants'; import BaseStore from './base-store'; export default class NotificationStore extends BaseStore { @@ -315,6 +319,9 @@ export default class NotificationStore extends BaseStore { this.handlePOAAddressMismatchNotifications(); + if (status?.includes('mt5_additional_kyc_required')) + this.addNotificationMessage(this.client_notifications.additional_kyc_info); + if (!has_enabled_two_fa && obj_total_balance.amount_real > 0) { this.addNotificationMessage(this.client_notifications.two_f_a); } else { @@ -598,7 +605,7 @@ export default class NotificationStore extends BaseStore { this.handleClientNotifications(); } - removeAllNotificationMessages(should_close_persistent) { + removeAllNotificationMessages(should_close_persistent = false) { this.notification_messages = should_close_persistent ? [] : [...this.notification_messages.filter(notifs => notifs.is_persistent)]; @@ -672,7 +679,7 @@ export default class NotificationStore extends BaseStore { setClientNotifications(client_data = {}) { const { ui } = this.root_store; - const { has_enabled_two_fa, setTwoFAChangedStatus } = this.root_store.client; + const { has_enabled_two_fa, setTwoFAChangedStatus, logout } = this.root_store.client; const { setMT5NotificationModal } = this.root_store.traders_hub; const two_fa_status = has_enabled_two_fa ? localize('enabled') : localize('disabled'); @@ -1393,6 +1400,34 @@ export default class NotificationStore extends BaseStore { text: localize('Resubmit proof of identity'), }, }, + wallets_migrated: { + key: 'wallets_migrated', + header: localize('Your Wallets are ready'), + message: localize( + 'To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.' + ), + action: { + onClick: async () => { + await logout(); + }, + text: localize('Log out'), + }, + type: 'announce', + }, + wallets_failed: { + key: 'wallets_failed', + header: localize('Sorry for the interruption'), + message: localize( + "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat." + ), + action: { + onClick: async () => { + window.LC_API.open_chat_window(); + }, + text: localize('Go to LiveChat'), + }, + type: 'danger', + }, mt5_notification: { key: 'mt5_notification', header: localize('Trouble accessing Deriv MT5 on your mobile?'), @@ -1405,6 +1440,23 @@ export default class NotificationStore extends BaseStore { }, type: 'warning', }, + additional_kyc_info: { + key: 'additional_kyc_info', + header: , + message: ( + + ), + should_show_again: true, + action: { + text: localize('Update now'), + onClick: () => { + if (this.is_notifications_visible) this.toggleNotificationsModal(); + ui.toggleAdditionalKycInfoModal(); + this.markNotificationMessage({ key: 'additional_kyc_info' }); + }, + }, + type: 'warning', + }, }; this.client_notifications = notifications; @@ -1418,7 +1470,6 @@ export default class NotificationStore extends BaseStore { this.p2p_redirect_to = p2p_redirect_to; } - //TODO (yauheni-kryzhyk): this method is not used. leaving this for the upcoming new pop-up notifications implementation setShouldShowPopups(should_show_popups) { this.should_show_popups = should_show_popups; } @@ -1487,23 +1538,6 @@ export default class NotificationStore extends BaseStore { }); }; - showAccountSwitchToRealNotification = (loginid, currency) => { - const regulation = loginid?.startsWith('CR') ? localize('non-EU') : localize('EU'); - - this.addNotificationMessage({ - key: 'switched_to_real', - header: localize('Switched to real account'), - message: ( - - ), - type: 'info', - should_show_again: true, - }); - }; - async getP2pCompletedOrders() { await WS.wait('authorize'); const response = await WS.send?.({ p2p_order_list: 1, active: 0 }); diff --git a/packages/core/src/Stores/traders-hub-store.js b/packages/core/src/Stores/traders-hub-store.js index 836dfdb715de..036105ed4763 100644 --- a/packages/core/src/Stores/traders-hub-store.js +++ b/packages/core/src/Stores/traders-hub-store.js @@ -30,6 +30,10 @@ export default class TradersHubStore extends BaseStore { }; is_account_transfer_modal_open = false; selected_account = {}; + is_real_wallets_upgrade_on = false; + is_wallet_migration_failed = false; + active_modal_tab; + active_modal_wallet_id; constructor(root_store) { super({ root_store }); @@ -54,8 +58,12 @@ export default class TradersHubStore extends BaseStore { selected_account: observable, selected_account_type: observable, selected_platform_type: observable, + active_modal_tab: observable, + active_modal_wallet_id: observable, selected_region: observable, open_failed_verification_for: observable, + is_real_wallets_upgrade_on: observable, + is_wallet_migration_failed: observable, closeModal: action.bound, content_flag: computed, getAccount: action.bound, @@ -65,6 +73,8 @@ export default class TradersHubStore extends BaseStore { getAvailableDerivEzAccounts: action.bound, getExistingAccounts: action.bound, handleTabItemClick: action.bound, + setWalletModalActiveTab: action.bound, + setWalletModalActiveWalletID: action.bound, has_any_real_account: computed, is_demo_low_risk: computed, is_demo: computed, @@ -76,6 +86,7 @@ export default class TradersHubStore extends BaseStore { no_MF_account: computed, multipliers_account_status: computed, CFDs_restricted_countries: computed, + financial_restricted_countries: computed, openDemoCFDAccount: action.bound, openModal: action.bound, openRealAccount: action.bound, @@ -99,7 +110,8 @@ export default class TradersHubStore extends BaseStore { toggleIsTourOpen: action.bound, toggleRegulatorsCompareModal: action.bound, showTopUpModal: action.bound, - financial_restricted_countries: computed, + toggleWalletsUpgrade: action.bound, + setWalletsMigrationFailedPopup: action.bound, }); reaction( @@ -142,7 +154,6 @@ export default class TradersHubStore extends BaseStore { const residence = this.root_store.client.residence; const active_demo = /^VRT|VRW/.test(this.root_store.client.loginid); const active_real_mf = /^MF|MFW/.test(this.root_store.client.loginid); - const default_region = () => { if (((active_demo || active_real_mf) && isEuCountry(residence)) || active_real_mf) { return 'EU'; @@ -173,6 +184,14 @@ export default class TradersHubStore extends BaseStore { } } + setWalletModalActiveTab(tab) { + this.active_modal_tab = tab; + } + + setWalletModalActiveWalletID(wallet_id) { + this.active_modal_wallet_id = wallet_id; + } + get no_MF_account() { const { has_maltainvest_account } = this.root_store.client; return this.selected_region === 'EU' && !has_maltainvest_account; @@ -784,4 +803,12 @@ export default class TradersHubStore extends BaseStore { }); openTopUpModal(); } + + toggleWalletsUpgrade(value) { + this.is_real_wallets_upgrade_on = value; + } + + setWalletsMigrationFailedPopup(value) { + this.is_wallet_migration_failed = value; + } } diff --git a/packages/core/src/Stores/ui-store.js b/packages/core/src/Stores/ui-store.js index aea8efd6347b..cc161fbbe1e8 100644 --- a/packages/core/src/Stores/ui-store.js +++ b/packages/core/src/Stores/ui-store.js @@ -1,6 +1,9 @@ +import { action, autorun, computed, makeObservable, observable } from 'mobx'; + import { isMobile, isTouchDevice, LocalStore, routes } from '@deriv/shared'; + import { MAX_MOBILE_WIDTH, MAX_TABLET_WIDTH } from 'Constants/ui'; -import { action, autorun, computed, observable, makeObservable } from 'mobx'; + import BaseStore from './base-store'; const store_name = 'ui_store'; @@ -26,6 +29,7 @@ export default class UIStore extends BaseStore { is_dark_mode_on = window?.matchMedia?.('(prefers-color-scheme: dark)').matches && isMobile(); is_settings_modal_on = false; is_language_settings_modal_on = false; + is_mobile_language_menu_open = false; is_accounts_switcher_on = false; account_switcher_disabled_message = ''; @@ -158,12 +162,16 @@ export default class UIStore extends BaseStore { should_show_assessment_complete_modal = false; app_contents_scroll_ref = null; is_deriv_account_needed_modal_visible = false; + is_wallet_modal_visible = false; is_ready_to_deposit_modal_visible = false; is_need_real_account_for_cashier_modal_visible = false; is_switch_to_deriv_account_modal_visible = false; is_cfd_reset_password_modal_enabled = false; sub_section_index = 0; + is_additional_kyc_info_modal_open = false; + is_kyc_information_submitted_modal_open = false; + getDurationFromUnit = unit => this[`duration_${unit}`]; constructor(root_store) { @@ -193,6 +201,8 @@ export default class UIStore extends BaseStore { super({ root_store, local_storage_properties, store_name }); makeObservable(this, { + is_additional_kyc_info_modal_open: observable, + is_kyc_information_submitted_modal_open: observable, account_needed_modal_props: observable, account_switcher_disabled_message: observable, has_only_forward_starting_contracts: observable, @@ -244,10 +254,12 @@ export default class UIStore extends BaseStore { is_closing_create_real_account_modal: observable, is_dark_mode_on: observable, is_deriv_account_needed_modal_visible: observable, + is_wallet_modal_visible: observable, is_history_tab_active: observable, is_landscape: observable, is_language_settings_modal_on: observable, + is_mobile_language_menu_open: observable, is_nativepicker_visible: observable, is_positions_drawer_on: observable, @@ -341,6 +353,7 @@ export default class UIStore extends BaseStore { toggleShouldShowMultipliersOnboarding: action.bound, shouldNavigateAfterChooseCrypto: action.bound, setShouldShowRiskWarningModal: action.bound, + setIsWalletModalVisible: action.bound, setIsNewAccount: action.bound, setIsRealTabEnabled: action.bound, setIsTradingAssessmentForExistingUserEnabled: action.bound, @@ -364,6 +377,7 @@ export default class UIStore extends BaseStore { setShouldShowWarningModal: action.bound, setSubSectionIndex: action.bound, setTopUpInProgress: action.bound, + setMobileLanguageMenuOpen: action.bound, toggleAccountsDialog: action.bound, toggleAccountSettings: action.bound, toggleAccountSignupModal: action.bound, @@ -383,6 +397,8 @@ export default class UIStore extends BaseStore { toggleLanguageSettingsModal: action.bound, toggleUnsupportedContractModal: action.bound, toggleUpdateEmailModal: action.bound, + toggleAdditionalKycInfoModal: action.bound, + toggleKycInformationSubmittedModal: action.bound, }); window.addEventListener('resize', this.handleResize); @@ -575,6 +591,10 @@ export default class UIStore extends BaseStore { return this.is_dark_mode_on; } + setMobileLanguageMenuOpen(is_mobile_language_menu_open) { + this.is_mobile_language_menu_open = is_mobile_language_menu_open; + } + toggleSetCurrencyModal() { this.is_set_currency_modal_visible = !this.is_set_currency_modal_visible; } @@ -847,6 +867,10 @@ export default class UIStore extends BaseStore { this.is_deriv_account_needed_modal_visible = !this.is_deriv_account_needed_modal_visible; } + setIsWalletModalVisible(value) { + this.is_wallet_modal_visible = value; + } + setShouldShowRiskWarningModal(value) { this.should_show_risk_warning_modal = value; } @@ -902,4 +926,12 @@ export default class UIStore extends BaseStore { setSubSectionIndex(index) { this.sub_section_index = index; } + + toggleAdditionalKycInfoModal() { + this.is_additional_kyc_info_modal_open = !this.is_additional_kyc_info_modal_open; + } + + toggleKycInformationSubmittedModal() { + this.is_kyc_information_submitted_modal_open = !this.is_kyc_information_submitted_modal_open; + } } diff --git a/packages/core/src/Utils/Datadog/index.ts b/packages/core/src/Utils/Datadog/index.ts index 52af8c6d7391..adff65f23f86 100644 --- a/packages/core/src/Utils/Datadog/index.ts +++ b/packages/core/src/Utils/Datadog/index.ts @@ -41,5 +41,6 @@ datadogRum.init({ version: dataDogVersion, trackFrustrations: true, enableExperimentalFeatures: ['clickmap'], + excludedActivityUrls: [/^https:\/\/api.telegram.org.*$/], }); datadogRum.startSessionReplayRecording(); diff --git a/packages/core/src/_common/base/api_middleware.js b/packages/core/src/_common/base/api_middleware.js index 11d0d835351c..f3935110a937 100644 --- a/packages/core/src/_common/base/api_middleware.js +++ b/packages/core/src/_common/base/api_middleware.js @@ -1,7 +1,14 @@ class APIMiddleware { - constructor(config) { + session_id; + + constructor(config, session_id = '') { this.config = config; this.debounced_calls = {}; + this.session_id = session_id; + } + + requestDataTransformer(request) { + return this.session_id ? { ...request, session_id: this.session_id } : request; } sendWillBeCalled({ args: [request] }) { diff --git a/packages/core/src/_common/base/socket_base.js b/packages/core/src/_common/base/socket_base.js index 71a1bf60966b..9781290673a6 100644 --- a/packages/core/src/_common/base/socket_base.js +++ b/packages/core/src/_common/base/socket_base.js @@ -30,8 +30,12 @@ const BinarySocketBase = (() => { is_down: false, }; - const getSocketUrl = language => - `wss://${getSocketURL()}/websockets/v3?app_id=${getAppId()}&l=${language}&brand=${website_name.toLowerCase()}`; + const getSocketUrl = (language, is_mock_server = false) => { + if (is_mock_server) { + return 'ws://127.0.0.1:42069'; + } + return `wss://${getSocketURL()}/websockets/v3?app_id=${getAppId()}&l=${language}&brand=${website_name.toLowerCase()}`; + }; const isReady = () => hasReadyState(1); @@ -41,10 +45,10 @@ const BinarySocketBase = (() => { binary_socket.close(); }; - const closeAndOpenNewConnection = (language = getLanguage()) => { + const closeAndOpenNewConnection = (language = getLanguage(), session_id = '') => { close(); is_switching_socket = true; - openNewConnection(language); + openNewConnection(language, session_id); }; const hasReadyState = (...states) => binary_socket && states.some(s => binary_socket.readyState === s); @@ -56,18 +60,32 @@ const BinarySocketBase = (() => { client_store = client; }; + const getMockServerConfig = () => { + const mock_server_config = localStorage.getItem('mock_server_data'); + return mock_server_config + ? JSON.parse(mock_server_config) + : { + session_id: '', + is_mockserver_enabled: false, + }; + }; + const openNewConnection = (language = getLanguage()) => { + const mock_server_config = getMockServerConfig(); + const session_id = mock_server_config?.session_id || ''; + if (wrong_app_id === getAppId()) return; if (!is_switching_socket) config.wsEvent('init'); if (isClose()) { is_disconnect_called = false; - binary_socket = new WebSocket(getSocketUrl(language)); + binary_socket = new WebSocket(getSocketUrl(language, session_id)); + deriv_api = new DerivAPIBasic({ connection: binary_socket, storage: SocketCache, - middleware: new APIMiddleware(config), + middleware: new APIMiddleware(config, session_id), }); } diff --git a/packages/core/src/index.html b/packages/core/src/index.html index b77e09c71272..73e34a0c2525 100644 --- a/packages/core/src/index.html +++ b/packages/core/src/index.html @@ -156,6 +156,10 @@ + + + + diff --git a/packages/core/src/public/images/app/wallet/wallet-demo-bg-dark.svg b/packages/core/src/public/images/app/wallet/wallet-demo-bg-dark.svg new file mode 100644 index 000000000000..6d1bf48f4626 --- /dev/null +++ b/packages/core/src/public/images/app/wallet/wallet-demo-bg-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/core/src/public/images/app/wallet/wallet-demo-bg-light.svg b/packages/core/src/public/images/app/wallet/wallet-demo-bg-light.svg new file mode 100644 index 000000000000..12660fa7e760 --- /dev/null +++ b/packages/core/src/public/images/app/wallet/wallet-demo-bg-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/core/src/public/images/common/static_images/ke_alien_card.png b/packages/core/src/public/images/common/static_images/ke_alien_card.png deleted file mode 100644 index 22e79adff3ba..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ke_alien_card.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ke_national_identity_card.png b/packages/core/src/public/images/common/static_images/ke_national_identity_card.png deleted file mode 100644 index 0f5c51781715..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ke_national_identity_card.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ke_passport.png b/packages/core/src/public/images/common/static_images/ke_passport.png deleted file mode 100644 index 7cab3bfc4bc0..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ke_passport.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ng_drivers_license.png b/packages/core/src/public/images/common/static_images/ng_drivers_license.png deleted file mode 100644 index 6fb3f95f6085..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ng_drivers_license.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ng_nin_slip.png b/packages/core/src/public/images/common/static_images/ng_nin_slip.png deleted file mode 100644 index 469b108c498d..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ng_nin_slip.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ng_voter_id.png b/packages/core/src/public/images/common/static_images/ng_voter_id.png deleted file mode 100644 index 6a0111ecd9b8..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ng_voter_id.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/ug_national_identity_card.png b/packages/core/src/public/images/common/static_images/ug_national_identity_card.png deleted file mode 100644 index 1d645804746c..000000000000 Binary files a/packages/core/src/public/images/common/static_images/ug_national_identity_card.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/za_national_identity_card.png b/packages/core/src/public/images/common/static_images/za_national_identity_card.png deleted file mode 100644 index e3dc3f3d023e..000000000000 Binary files a/packages/core/src/public/images/common/static_images/za_national_identity_card.png and /dev/null differ diff --git a/packages/core/src/public/images/common/static_images/zw_national_identity_card.png b/packages/core/src/public/images/common/static_images/zw_national_identity_card.png deleted file mode 100644 index 9e79789d7021..000000000000 Binary files a/packages/core/src/public/images/common/static_images/zw_national_identity_card.png and /dev/null differ diff --git a/packages/core/src/sass/app.scss b/packages/core/src/sass/app.scss index 32a0db6d08b8..c190c65ed790 100644 --- a/packages/core/src/sass/app.scss +++ b/packages/core/src/sass/app.scss @@ -47,6 +47,7 @@ @import 'app/_common/components/cookie-banner'; @import 'app/_common/components/notification-banner'; @import 'app/_common/components/notification-promo'; +@import 'app/_common/components/wallet'; @import 'app/_common/components/onfido-container'; @import 'app/_common/components/cfd-poa'; // Modules diff --git a/packages/core/src/sass/app/_common/components/onfido-container.scss b/packages/core/src/sass/app/_common/components/onfido-container.scss index 7c549ba2daf7..d97e2f85585e 100644 --- a/packages/core/src/sass/app/_common/components/onfido-container.scss +++ b/packages/core/src/sass/app/_common/components/onfido-container.scss @@ -263,16 +263,6 @@ } } } - .proof-of-identity__inner-container { - @include desktop { - &--incl-image { - display: grid; - align-items: center; - column-gap: 1.5rem; - grid-template-columns: auto 0.5fr; - } - } - } .additional-field { margin-top: 1.6rem; diff --git a/packages/core/src/sass/app/_common/components/settings-language.scss b/packages/core/src/sass/app/_common/components/settings-language.scss index ebd6c519b3b2..d48a1e07d1c5 100644 --- a/packages/core/src/sass/app/_common/components/settings-language.scss +++ b/packages/core/src/sass/app/_common/components/settings-language.scss @@ -1,26 +1,28 @@ /** @define settings-language */ .settings-language { + margin-left: 1.6rem; + width: fit-content; + @include mobile { display: flex; - padding: 1.5rem 1.5rem 8rem; + flex-direction: column; + padding: 1.6rem 2.2rem 8rem; + width: 100%; + margin-left: 0; } &__language-container { display: grid; - grid-template-columns: repeat(4, minmax(90px, 1fr)); - grid-gap: 1.6rem; - &--has-padding { - padding: 1.6rem; - } + grid-template-columns: repeat(4, min-content); + grid-gap: 0.8rem; + margin: 1.6rem 0; + @include mobile { - grid-template-columns: repeat(2, minmax(50%, 1fr)); - grid-gap: 0.3rem; + grid-template-columns: repeat(2, minmax(40%, 1fr)); grid-template-rows: auto; - width: 100%; - &--has-padding { - padding: 0 1.6rem; - grid-gap: 0; - } + grid-gap: initial; + margin: 0 auto; + padding: 0 0.8rem; @include mobile { &--disabled { @@ -44,6 +46,9 @@ align-items: center; border-radius: $BORDER_RADIUS; padding: 16px; + width: 13.6rem; + height: 8.8rem; + @include mobile { padding: 8px; @@ -53,22 +58,26 @@ } text-decoration: none; background-color: var(--state-normal); - cursor: pointer; + + & * { + cursor: pointer; + } &--active { border: 1px solid var(--border-active); color: var(--text-prominent); + + & * { + cursor: not-allowed; + } } } &-flag { - width: 5rem; - height: 4rem; - cursor: pointer; + width: 3.6rem; + height: 2.8rem; @include mobile { margin-top: 1rem; - width: 4rem; - height: 5rem; } } &-name { @@ -93,8 +102,3 @@ } } } -.account-form { - &--language-settings { - overflow: auto !important; - } -} diff --git a/packages/core/src/sass/app/_common/components/wallet.scss b/packages/core/src/sass/app/_common/components/wallet.scss new file mode 100644 index 000000000000..b9c319115762 --- /dev/null +++ b/packages/core/src/sass/app/_common/components/wallet.scss @@ -0,0 +1,815 @@ +// As these currencies have the same color, will use this variable for them in the map +$usdt-color: ( + 'card': ( + 'light': ( + 'mobile': radial-gradient(100% 277.78% at 0% 100%, rgba(0, 147, 147, 0.24) 0%, rgba(0, 147, 147, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(0, 147, 147, 0.24) 0%, rgba(0, 147, 147, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': radial-gradient(100% 277.78% at 0% 100%, rgba(0, 147, 147, 0.24) 0%, rgba(0, 147, 147, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(0, 147, 147, 0.24) 0%, rgba(0, 147, 147, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(0, 147, 147, 0.4) 0%, + rgba(0, 147, 147, 0.16) 50.52%, + rgba(4, 217, 217, 0.4) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(0, 147, 147, 0.4) 0%, + rgba(0, 147, 147, 0.16) 50.52%, + rgba(4, 217, 217, 0.4) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(0, 147, 147, 0.4) 0%, + rgba(0, 147, 147, 0.16) 50.52%, + rgba(4, 217, 217, 0.4) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(0, 147, 147, 0.4) 0%, + rgba(0, 147, 147, 0.16) 50.52%, + rgba(4, 217, 217, 0.4) 100% + ) + #151717, + ), + ), +); + +$wallet-bg-color: ( + 'usd': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 4130.74% at 0% 100%, rgba(244, 67, 54, 0.24) 0%, rgba(40, 57, 145, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(244, 67, 54, 0.24) 0%, rgba(40, 57, 145, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(244, 67, 54, 0.4) 0%, + rgba(244, 67, 54, 0.16) 50.52%, + rgba(40, 57, 145, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(244, 67, 54, 0.24) 0%, rgba(40, 57, 145, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(244, 67, 54, 0.4) 0%, + rgba(244, 67, 54, 0.16) 50.52%, + rgba(40, 57, 145, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(244, 67, 54, 0.4) 0%, + rgba(244, 67, 54, 0.16) 50.52%, + rgba(40, 57, 145, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(244, 67, 54, 0.4) 0%, + rgba(244, 67, 54, 0.16) 50.52%, + rgba(40, 57, 145, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(244, 67, 54, 0.4) 0%, + rgba(244, 67, 54, 0.16) 50.52%, + rgba(40, 57, 145, 0.56) 100% + ) + #151717, + ), + ), + ), + 'aud': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 4130.74% at 0% 100%, rgba(13, 180, 61, 0.24) 0%, rgba(255, 205, 0, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(13, 180, 61, 0.24) 0%, rgba(255, 205, 0, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 4130.74% at 0% 100%, rgba(13, 180, 61, 0.24) 0%, rgba(255, 205, 0, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(13, 180, 61, 0.24) 0%, rgba(255, 205, 0, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(13, 180, 61, 0.4) 0%, + rgba(13, 180, 61, 0.16) 50.52%, + rgba(255, 205, 0, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(13, 180, 61, 0.4) 0%, + rgba(13, 180, 61, 0.16) 50.52%, + rgba(255, 205, 0, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(13, 180, 61, 0.4) 0%, + rgba(13, 180, 61, 0.16) 50.52%, + rgba(255, 205, 0, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(13, 180, 61, 0.4) 0%, + rgba(13, 180, 61, 0.16) 50.52%, + rgba(255, 205, 0, 0.56) 100% + ) + #151717, + ), + ), + ), + 'eur': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 4130.74% at 0% 100%, rgba(40, 57, 145, 0.24) 0%, rgba(248, 209, 46, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(40, 57, 145, 0.24) 0%, rgba(248, 209, 46, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 4130.74% at 0% 100%, rgba(40, 57, 145, 0.24) 0%, rgba(248, 209, 46, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 4130.74% at 0% 100%, rgba(40, 57, 145, 0.24) 0%, rgba(248, 209, 46, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(248, 209, 46, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(248, 209, 46, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(248, 209, 46, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(248, 209, 46, 0.56) 100% + ) + #151717, + ), + ), + ), + 'gbp': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.24) 0%, + rgba(40, 57, 145, 0.24) 0.01%, + rgba(244, 67, 54, 0.48) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.24) 0%, + rgba(40, 57, 145, 0.24) 0.01%, + rgba(244, 67, 54, 0.48) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.24) 0%, + rgba(40, 57, 145, 0.24) 0.01%, + rgba(244, 67, 54, 0.48) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.24) 0%, + rgba(40, 57, 145, 0.24) 0.01%, + rgba(244, 67, 54, 0.48) 100% + ) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(244, 67, 54, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(244, 67, 54, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(244, 67, 54, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(40, 57, 145, 0.4) 0%, + rgba(40, 57, 145, 0.16) 50.52%, + rgba(244, 67, 54, 0.56) 100% + ) + #151717, + ), + ), + ), + 'p2p': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 68, 79, 0.24) 0%, rgba(255, 100, 68, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 68, 79, 0.24) 0%, rgba(255, 100, 68, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 68, 79, 0.24) 0%, rgba(255, 100, 68, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 68, 79, 0.24) 0%, rgba(255, 100, 68, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 68, 79, 0.4) 0%, + rgba(255, 68, 79, 0.16) 50.52%, + rgba(255, 100, 68, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 68, 79, 0.4) 0%, + rgba(255, 68, 79, 0.16) 50.52%, + rgba(255, 100, 68, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 68, 79, 0.4) 0%, + rgba(255, 68, 79, 0.16) 50.52%, + rgba(255, 100, 68, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 68, 79, 0.4) 0%, + rgba(255, 68, 79, 0.16) 50.52%, + rgba(255, 100, 68, 0.56) 100% + ) + #151717, + ), + ), + ), + 'payment-agent': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(151, 151, 151, 0.24) 0%, + rgba(178, 194, 195, 0.48) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(151, 151, 151, 0.24) 0%, + rgba(178, 194, 195, 0.48) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(151, 151, 151, 0.24) 0%, + rgba(178, 194, 195, 0.48) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(151, 151, 151, 0.24) 0%, + rgba(178, 194, 195, 0.48) 100% + ) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(151, 151, 151, 0.4) 0%, + rgba(151, 151, 151, 0.16) 50.52%, + rgba(178, 194, 195, 0.56) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(151, 151, 151, 0.4) 0%, + rgba(151, 151, 151, 0.16) 50.52%, + rgba(178, 194, 195, 0.56) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(151, 151, 151, 0.4) 0%, + rgba(151, 151, 151, 0.16) 50.52%, + rgba(178, 194, 195, 0.56) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(151, 151, 151, 0.4) 0%, + rgba(151, 151, 151, 0.16) 50.52%, + rgba(178, 194, 195, 0.56) 100% + ) + #151717, + ), + ), + ), + 'btc': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(247, 147, 27, 0.24) 0%, + rgba(247, 199, 27, 0.477) 99.99% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(247, 147, 27, 0.24) 0%, + rgba(247, 199, 27, 0.477) 99.99% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(247, 147, 27, 0.24) 0%, + rgba(247, 199, 27, 0.477) 99.99%, + rgba(255, 100, 68, 0.48) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(247, 147, 27, 0.24) 0%, + rgba(247, 199, 27, 0.477) 99.99%, + rgba(255, 100, 68, 0.48) 100% + ) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(247, 147, 27, 0.4) 0%, + rgba(247, 147, 27, 0.16) 50.52%, + rgba(247, 199, 27, 0.4) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(247, 147, 27, 0.4) 0%, + rgba(247, 147, 27, 0.16) 50.52%, + rgba(247, 199, 27, 0.4) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(247, 147, 27, 0.4) 0%, + rgba(247, 147, 27, 0.16) 50.52%, + rgba(247, 199, 27, 0.4) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(247, 147, 27, 0.4) 0%, + rgba(247, 147, 27, 0.16) 50.52%, + rgba(247, 199, 27, 0.4) 100% + ) + #151717, + ), + ), + ), + 'eth': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(82, 86, 127, 0.4) 0%, + rgba(82, 86, 127, 0.16) 50.52%, + rgba(130, 140, 173, 0.4) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(82, 86, 127, 0.24) 0%, rgba(130, 140, 173, 0.48) 100%) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(82, 86, 127, 0.4) 0%, + rgba(82, 86, 127, 0.16) 50.52%, + rgba(130, 140, 173, 0.4) 100% + ) + #151717, + ), + ), + ), + 'ltc': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(165, 168, 169, 0.24) 0%, + rgba(193, 204, 207, 0.48) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(165, 168, 169, 0.24) 0%, + rgba(193, 204, 207, 0.48) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 277.78% at 0% 100%, + rgba(165, 168, 169, 0.24) 0%, + rgba(193, 204, 207, 0.48) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(165, 168, 169, 0.4) 0%, + rgba(165, 168, 169, 0.16) 50.52%, + rgba(193, 204, 207, 0.4) 100% + ) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(165, 168, 169, 0.4) 0%, + rgba(165, 168, 169, 0.16) 50.52%, + rgba(193, 204, 207, 0.4) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(165, 168, 169, 0.4) 0%, + rgba(165, 168, 169, 0.16) 50.52%, + rgba(193, 204, 207, 0.4) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(165, 168, 169, 0.4) 0%, + rgba(165, 168, 169, 0.16) 50.52%, + rgba(193, 204, 207, 0.4) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(165, 168, 169, 0.4) 0%, + rgba(165, 168, 169, 0.16) 50.52%, + rgba(193, 204, 207, 0.4) 100% + ) + #151717, + ), + ), + ), + 'ust': $usdt-color, + 'usdt': $usdt-color, + 'tusdt': $usdt-color, + 'eusdt': $usdt-color, + 'usdc': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(39, 117, 202, 0.24) 0%, rgba(34, 76, 225, 0.48) 100%) + #ffffff, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(39, 117, 202, 0.24) 0%, rgba(34, 76, 225, 0.48) 100%) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(39, 117, 202, 0.24) 0%, rgba(34, 76, 225, 0.48) 100%) + #151717, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(39, 117, 202, 0.24) 0%, rgba(34, 76, 225, 0.48) 100%) + #151717, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(39, 117, 202, 0.4) 0%, + rgba(39, 117, 202, 0.16) 50.52%, + rgba(34, 76, 225, 0.4) 100% + ) + #ffffff, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(39, 117, 202, 0.4) 0%, + rgba(39, 117, 202, 0.16) 50.52%, + rgba(34, 76, 225, 0.4) 100% + ) + #ffffff, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(39, 117, 202, 0.4) 0%, + rgba(39, 117, 202, 0.16) 50.52%, + rgba(34, 76, 225, 0.4) 100% + ) + #151717, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(39, 117, 202, 0.4) 0%, + rgba(39, 117, 202, 0.16) 50.52%, + rgba(34, 76, 225, 0.4) 100% + ) + #151717, + ), + ), + ), + 'demo': ( + 'card': ( + 'light': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 100, 68, 0.24) 0%, rgba(255, 68, 79, 0.48) 100%) + #212329, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 100, 68, 0.24) 0%, rgba(255, 68, 79, 0.48) 100%) + #212329, + ), + 'dark': ( + 'mobile': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 100, 68, 0.24) 0%, rgba(255, 68, 79, 0.48) 100%) + #fbdddd, + 'desktop': + radial-gradient(100% 277.78% at 0% 100%, rgba(255, 100, 68, 0.24) 0%, rgba(255, 68, 79, 0.48) 100%) + #fbdddd, + ), + ), + 'header': ( + 'light': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 100, 68, 0.4) 0%, + rgba(255, 100, 68, 0.16) 50.52%, + rgba(255, 68, 79, 0.4) 100% + ) + #212329, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 100, 68, 0.4) 0%, + rgba(255, 100, 68, 0.16) 50.52%, + rgba(255, 68, 79, 0.4) 100% + ) + #212329, + ), + 'dark': ( + 'mobile': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 100, 68, 0.4) 0%, + rgba(255, 100, 68, 0.16) 50.52%, + rgba(255, 68, 79, 0.4) 100% + ) + #fbdddd, + 'desktop': + radial-gradient( + 100% 4130.74% at 0% 100%, + rgba(255, 100, 68, 0.4) 0%, + rgba(255, 100, 68, 0.16) 50.52%, + rgba(255, 68, 79, 0.4) 100% + ) + #fbdddd, + ), + ), + ), +); + +/// Wallet background color generator +/// +/// This mixin will generate a helper classes for wallet background color based on the given map +/// +/// @example +/// .wallet-header__usd-bg +/// .wallet-header__usd-bg--dark +@mixin wallet-bg-color($currencies-map: $wallet-bg-color) { + @each $currency, $types in $currencies-map { + @each $type, $themes in $types { + @each $theme, $colors in $themes { + $t: if($theme == 'dark', '--dark', ''); + + .wallet-#{$type}__#{to-lower-case($currency)}-bg#{$t} { + background: map-get($colors, 'desktop'); + + @if $currency == 'demo' { + position: relative; + $demo-icon: if($theme == 'dark', 'wallet-demo-bg-dark', 'wallet-demo-bg-light'); + + &:not([class*='--hide-watermark']):not([class*='--small']) { + &:before { + content: ''; + display: block; + position: absolute; + inset: 0; + background-image: url('~Images/app/wallet/#{$demo-icon}.svg'); + background-repeat: repeat; + background-size: 70px; + mix-blend-mode: overlay; + opacity: 0.24; + } + } + } + + @include mobile { + background: map-get($colors, 'mobile'); + } + } + } + } + } +} + +// Init mixins +@include wallet-bg-color(); diff --git a/packages/core/src/sass/app/_common/layout/traders-hub-header.scss b/packages/core/src/sass/app/_common/layout/traders-hub-header.scss index ea3841980160..1c5b291cb5a6 100644 --- a/packages/core/src/sass/app/_common/layout/traders-hub-header.scss +++ b/packages/core/src/sass/app/_common/layout/traders-hub-header.scss @@ -22,7 +22,8 @@ } @media screen and (max-width: 380px) { - &__cashier-button { + &__cashier-button, + &__logo-wrapper { display: none; } } diff --git a/packages/hooks/src/__tests__/useActiveWallet.spec.tsx b/packages/hooks/src/__tests__/useActiveWallet.spec.tsx new file mode 100644 index 000000000000..1c9d209d674b --- /dev/null +++ b/packages/hooks/src/__tests__/useActiveWallet.spec.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import useActiveWallet from '../useActiveWallet'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { APIProvider } from '@deriv/api'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'balance') { + return { + data: { + balance: { + accounts: { + CRW000000: { + balance: 100, + }, + }, + }, + }, + }; + } + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + loginid: 'CRW000000', + account_category: 'wallet', + is_virtual: 0, + landing_company_name: 'maltainvest', + currency: 'USD', + }, + { + loginid: 'MXN000000', + account_category: 'trading', + is_virtual: 0, + landing_company_name: 'maltainvest', + currency: 'BTC', + }, + ], + loginid: 'CRW000000', + }, + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('useActiveWallet', () => { + it('should return active wallet', () => { + const mock = mockStore({ + client: { + loginid: 'CRW000000', + accounts: { + CRW000000: { + token: 'token', + }, + }, + }, + }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + + const { result } = renderHook(() => useActiveWallet(), { wrapper }); + + expect(result?.current?.is_selected).toEqual(true); + expect(result?.current?.loginid).toEqual(mock.client.loginid); + }); +}); diff --git a/packages/hooks/src/__tests__/useAuthorize.spec.tsx b/packages/hooks/src/__tests__/useAuthorize.spec.tsx new file mode 100644 index 000000000000..39b90ee4f937 --- /dev/null +++ b/packages/hooks/src/__tests__/useAuthorize.spec.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { APIProvider } from '@deriv/api'; +import { renderHook } from '@testing-library/react-hooks'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import useAuthorize from '../useAuthorize'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((_, options: Record<'payload', Record<'authorize', string>>) => ({ + data: { + authorize: { + loginid: options.payload.authorize === '12345' ? 'CRW909900' : 'CRW909901', + account_list: [ + { + account_category: 'wallet', + currency: 'USD', + is_virtual: 0, + }, + ], + }, + }, + })), +})); + +describe('useAuthorize', () => { + test('should return correct data for the given token', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + + const { result } = renderHook(() => useAuthorize(), { wrapper }); + + expect(result.current.data.loginid).toBe('CRW909900'); + expect(result.current.data.loginid).not.toBe('CRW909901'); + }); +}); diff --git a/packages/hooks/src/__tests__/useAvailableWallets.spec.tsx b/packages/hooks/src/__tests__/useAvailableWallets.spec.tsx new file mode 100644 index 000000000000..26f109a83550 --- /dev/null +++ b/packages/hooks/src/__tests__/useAvailableWallets.spec.tsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { APIProvider } from '@deriv/api'; +import useAvailableWallets from '../useAvailableWallets'; +import { renderHook } from '@testing-library/react-hooks'; +import { StoreProvider, mockStore } from '@deriv/stores'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { account_category: 'wallet', landing_company_name: 'svg', is_virtual: 0, currency: 'USD' }, + ], + landing_company_name: 'svg', + }, + }, + }; + } + + if (name === 'get_account_types') { + return { + data: { + get_account_types: { + wallet: { + crypto: { + currencies: ['BTC', 'ETH', 'LTC'], + }, + doughflow: { + currencies: ['USD', 'EUR', 'AUD'], + }, + }, + }, + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('useAvailableWallets', () => { + const createWrapper = (mock: ReturnType) => { + const Component = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + return Component; + }; + it('should return available wallets', () => { + const mock = mockStore({ + client: { + accounts: { CRW909900: { token: '12345', landing_company_name: 'svg' } }, + loginid: 'CRW909900', + is_crypto: (currency: string) => ['BTC', 'ETH', 'LTC'].includes(currency), + }, + }); + + const { result } = renderHook(() => useAvailableWallets(), { wrapper: createWrapper(mock) }); + + expect(result.current?.data).toEqual( + ['AUD', 'EUR', 'BTC', 'ETH', 'LTC', 'USD'].map(currency => ({ + currency, + is_added: currency === 'USD', + landing_company_name: 'svg', + gradient_card_class: `wallet-card__${currency.toLowerCase()}-bg`, + })) + ); + }); + + it('should not return unavailable wallets', () => { + const mock = mockStore({ + client: { + accounts: { CRW909900: { token: '12345', landing_company_name: 'svg' } }, + loginid: 'CRW909900', + is_crypto: (currency: string) => ['BTC', 'ETH', 'LTC'].includes(currency), + }, + }); + + const { result } = renderHook(() => useAvailableWallets(), { wrapper: createWrapper(mock) }); + + expect(result.current?.data).not.toEqual([ + { + currency: 'GBP', + is_added: false, + landing_company_name: 'svg', + gradient_card_class: 'wallet-card__gbp-bg', + }, + ]); + }); +}); diff --git a/packages/hooks/src/__tests__/useContentFlag.spec.tsx b/packages/hooks/src/__tests__/useContentFlag.spec.tsx new file mode 100644 index 000000000000..e00909baa1fd --- /dev/null +++ b/packages/hooks/src/__tests__/useContentFlag.spec.tsx @@ -0,0 +1,90 @@ +import * as React from 'react'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { renderHook } from '@testing-library/react-hooks'; +import useContentFlag from '../useContentFlag'; + +describe('useContentFlag', () => { + test('should return true for cr_demo when content flag is cr_demo', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'cr_demo' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(true); + expect(result.current.is_eu_demo).toBe(false); + expect(result.current.is_eu_real).toBe(false); + expect(result.current.is_high_risk_cr).toBe(false); + expect(result.current.is_low_risk_cr_eu).toBe(false); + expect(result.current.is_low_risk_cr_non_eu).toBe(false); + }); + + test('should return true for eu_demo when content flag is eu_demo', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'eu_demo' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(false); + expect(result.current.is_eu_demo).toBe(true); + expect(result.current.is_eu_real).toBe(false); + expect(result.current.is_high_risk_cr).toBe(false); + expect(result.current.is_low_risk_cr_eu).toBe(false); + expect(result.current.is_low_risk_cr_non_eu).toBe(false); + }); + + test('should return true for eu_real when content flag is eu_real', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'eu_real' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(false); + expect(result.current.is_eu_demo).toBe(false); + expect(result.current.is_eu_real).toBe(true); + expect(result.current.is_high_risk_cr).toBe(false); + expect(result.current.is_low_risk_cr_eu).toBe(false); + expect(result.current.is_low_risk_cr_non_eu).toBe(false); + }); + + test('should return true for high_risk_cr when content flag is high_risk_cr', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'high_risk_cr' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(false); + expect(result.current.is_eu_demo).toBe(false); + expect(result.current.is_eu_real).toBe(false); + expect(result.current.is_high_risk_cr).toBe(true); + expect(result.current.is_low_risk_cr_eu).toBe(false); + expect(result.current.is_low_risk_cr_non_eu).toBe(false); + }); + + test('should return true for low_risk_cr_eu when content flag is low_risk_cr_eu', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'low_risk_cr_eu' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(false); + expect(result.current.is_eu_demo).toBe(false); + expect(result.current.is_eu_real).toBe(false); + expect(result.current.is_high_risk_cr).toBe(false); + expect(result.current.is_low_risk_cr_eu).toBe(true); + expect(result.current.is_low_risk_cr_non_eu).toBe(false); + }); + + test('should return true for low_risk_cr_non_eu when content flag is low_risk_cr_non_eu', async () => { + const mock = mockStore({ traders_hub: { content_flag: 'low_risk_cr_non_eu' } }); + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + const { result } = renderHook(() => useContentFlag(), { wrapper }); + expect(result.current.is_cr_demo).toBe(false); + expect(result.current.is_eu_demo).toBe(false); + expect(result.current.is_eu_real).toBe(false); + expect(result.current.is_high_risk_cr).toBe(false); + expect(result.current.is_low_risk_cr_eu).toBe(false); + expect(result.current.is_low_risk_cr_non_eu).toBe(true); + }); +}); diff --git a/packages/hooks/src/__tests__/useExistingCFDAccounts.spec.tsx b/packages/hooks/src/__tests__/useExistingCFDAccounts.spec.tsx new file mode 100644 index 000000000000..d03eb6ec6d7d --- /dev/null +++ b/packages/hooks/src/__tests__/useExistingCFDAccounts.spec.tsx @@ -0,0 +1,173 @@ +import React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { APIProvider } from '@deriv/api'; +import useExistingCFDAccounts from '../useExistingCFDAccounts'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(name => { + if (name === 'authorize') { + return { + data: { + account_list: [ + { + account_category: 'wallet', + currency: 'USD', + is_virtual: 1, + linked_to: [ + { + loginid: 'CRW909900', + platform: 'mt5', + }, + ], + }, + ], + }, + }; + } + + if (name === 'mt5_login_list') { + return { + data: { + mt5_login_list: [ + { + display_login: 'CRW909900', + email: '', + leverage: '10012123123', + login: 'CRW909900', + server: 'Deriv-Server', + server_description: 'Deriv-Server', + type: 'demo', + }, + ], + }, + }; + } + + if (name === 'trading_platform_accounts') { + return { + data: { + trading_platform_accounts: [ + { + account_id: 'DXR1646584', + account_type: 'real', + balance: 0, + currency: 'USD', + display_balance: '0.00', + enabled: 1, + landing_company_short: 'svg', + login: '8807230', + market_type: 'all', + platform: 'dxtrade', + }, + { + account_type: 'real', + balance: 0, + country: 'za', + currency: 'USD', + display_balance: '0.00', + email: 'mei+za1@binary.com', + group: 'real\\p02_ts01\\all\\svg_ez_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'EZR80001086', + market_type: 'all', + name: 'Baily Pan', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + }, + ], + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('useExistingCFDAccounts', () => { + it('should return the existing cfd accounts', () => { + const mock = mockStore({ + client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' }, + traders_hub: { + combined_cfd_mt5_accounts: [ + { + platform: 'mt5', + description: 'Deriv-Server', + icon: 'Derived', + sub_title: 'sub_name', + name: 'Derived', + }, + ], + }, + }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + const { result } = renderHook(() => useExistingCFDAccounts(), { wrapper }); + + expect(result.current.data.dxtrade_accounts).toEqual( + expect.arrayContaining([ + { + account_id: 'DXR1646584', + account_type: 'real', + balance: 0, + currency: 'USD', + display_balance: '0.00', + enabled: 1, + landing_company_short: 'svg', + login: '8807230', + loginid: 'DXR1646584', + market_type: 'all', + platform: 'dxtrade', + transfer_icon: 'IcRebrandingDerivX', + }, + ]) + ); + + expect(result.current.data.derivez_accounts).toEqual( + expect.arrayContaining([ + { + account_type: 'real', + balance: 0, + country: 'za', + currency: 'USD', + display_balance: '0.00', + email: 'mei+za1@binary.com', + group: 'real\\p02_ts01\\all\\svg_ez_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'EZR80001086', + loginid: 'EZR80001086', + market_type: 'all', + name: 'Baily Pan', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + transfer_icon: 'IcRebrandingDerivEz', + }, + ]) + ); + }); +}); diff --git a/packages/hooks/src/__tests__/useIsAccountStatusPresent.spec.tsx b/packages/hooks/src/__tests__/useIsAccountStatusPresent.spec.tsx index eeffe186e82a..05153b421de5 100644 --- a/packages/hooks/src/__tests__/useIsAccountStatusPresent.spec.tsx +++ b/packages/hooks/src/__tests__/useIsAccountStatusPresent.spec.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; -import { mockStore, StoreProvider } from '@deriv/stores'; import { renderHook } from '@testing-library/react-hooks'; -import { useIsAccountStatusPresent } from '../useIsAccountStatusPresent'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import useIsAccountStatusPresent from '../useIsAccountStatusPresent'; describe('useIsAccountStatusPresent', () => { it('should return false when the status is not present', () => { diff --git a/packages/hooks/src/__tests__/useLocalStorageData.spec.tsx b/packages/hooks/src/__tests__/useLocalStorageData.spec.tsx new file mode 100644 index 000000000000..e020f71c9024 --- /dev/null +++ b/packages/hooks/src/__tests__/useLocalStorageData.spec.tsx @@ -0,0 +1,65 @@ +import { renderHook, act } from '@testing-library/react-hooks'; +import useLocalStorageData from '../useLocalStorageData'; + +describe('useLocalStorageData', () => { + beforeEach(() => { + localStorage.clear(); + }); + + test('should get the current value from localStorage when it exists', () => { + const key = 'test_key'; + const value = 'some value'; + + localStorage.setItem(key, JSON.stringify(value)); + + const { result } = renderHook(() => useLocalStorageData(key)); + const [data] = result.current; + + expect(data).toBe(value); + }); + + test('should use the fallback value when localStorage key does not exist', () => { + const key = 'non_existent_key'; + const fallbackValue = 'default value'; + + const { result } = renderHook(() => useLocalStorageData(key, fallbackValue)); + const [data] = result.current; + + expect(data).toBe(fallbackValue); + }); + + test('should get null when localStorage key does not exist', () => { + const key = 'non_existent_key'; + const { result } = renderHook(() => useLocalStorageData(key)); + const [, , clearData] = result.current; + + act(() => { + clearData(); + }); + + const [data] = result.current; + expect(data).toBeNull(); + }); + + test('should clear the localStorage key and reset to fallback value', () => { + const key = 'test_key'; + const fallbackValue = 'default value'; + + const { result } = renderHook(() => useLocalStorageData(key, fallbackValue)); + const [, setData, clearData] = result.current; + + act(() => { + clearData(); + }); + + expect(localStorage.getItem(key)).toBeNull(); + expect(result.current[0]).toBe(fallbackValue); + + act(() => { + setData('new value'); + }); + + expect(localStorage.getItem(key)).toBe(JSON.stringify('new value')); + expect(result.current[0]).toBe('new value'); + }); +}); diff --git a/packages/hooks/src/__tests__/usePlatformAccounts.spec.tsx b/packages/hooks/src/__tests__/usePlatformAccounts.spec.tsx index d46a4cc10bac..bdc839050760 100644 --- a/packages/hooks/src/__tests__/usePlatformAccounts.spec.tsx +++ b/packages/hooks/src/__tests__/usePlatformAccounts.spec.tsx @@ -3,7 +3,7 @@ import { mockStore, StoreProvider } from '@deriv/stores'; import { renderHook } from '@testing-library/react-hooks'; import usePlatformAccounts from '../usePlatformAccounts'; -describe('usePlatformRealAccounts', () => { +describe('usePlatformAccounts', () => { test('should return proper data when user has no platform demo and real accounts', async () => { const mock = mockStore({}); @@ -64,17 +64,17 @@ describe('usePlatformRealAccounts', () => { accounts: { CR1234: { is_virtual: 0, - loginid: 'VR1234', + loginid: 'CR1234', landing_company_shortcode: 'svg', }, MF1234: { is_virtual: 0, - loginid: 'VR1235', + loginid: 'MF1234', landing_company_shortcode: 'maltainvest', }, VR1235: { is_virtual: 1, - loginid: 'VR1236', + loginid: 'VR1235', }, }, }, diff --git a/packages/hooks/src/__tests__/useStatesList.spec.tsx b/packages/hooks/src/__tests__/useStatesList.spec.tsx new file mode 100644 index 000000000000..6d174de438ba --- /dev/null +++ b/packages/hooks/src/__tests__/useStatesList.spec.tsx @@ -0,0 +1,49 @@ +import * as React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { APIProvider, useFetch } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import useStatesList from '../useStatesList'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(), +})); + +const mockUseFetch = useFetch as jest.MockedFunction>; + +describe('useStatesList', () => { + const mock = mockStore({}); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + + it('should return an empty array when the store is not ready', () => { + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseFetch.mockReturnValue({ + data: { + states_list: [], + }, + }); + const { result } = renderHook(() => useStatesList('in'), { wrapper }); + + expect(result.current.data).toHaveLength(0); + }); + + it('should return data fetched along with correct status', () => { + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseFetch.mockReturnValue({ + data: { + states_list: [ + { text: 'state 1', value: 's1' }, + { text: 'state 2', value: 's2' }, + ], + }, + isFetched: true, + }); + const { result } = renderHook(() => useStatesList('in'), { wrapper }); + expect(result.current.isFetched).toBeTruthy(); + }); +}); diff --git a/packages/hooks/src/__tests__/useTransferBetweenAccounts.spec.tsx b/packages/hooks/src/__tests__/useTransferBetweenAccounts.spec.tsx new file mode 100644 index 000000000000..82deee5e872b --- /dev/null +++ b/packages/hooks/src/__tests__/useTransferBetweenAccounts.spec.tsx @@ -0,0 +1,295 @@ +import React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { APIProvider } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import useTransferBetweenAccounts from '../useTransferBetweenAccounts'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + account_type: 'doughflow', + created_at: 1688642811, + currency: 'USD', + is_disabled: 0, + is_selected: true, + is_virtual: 0, + landing_company_name: 'svg', + linked_to: [ + { + loginid: 'MTR100967300', + platform: 'mt5', + }, + { + loginid: 'MTR80057067', + platform: 'mt5', + }, + { + loginid: 'DXR1646584', + platform: 'dxtrade', + }, + { + loginid: 'EZR80001086', + platform: 'derivez', + }, + ], + loginid: 'CRW1030', + }, + ], + loginid: 'CRW1030', + }, + }, + }; + } + if (name === 'mt5_login_list') { + return { + data: { + mt5_login_list: [ + { + account_type: 'real', + balance: 0, + country: 'ng', + currency: 'USD', + display_balance: '0.00', + email: 'email@gmail.com', + group: 'real\\p02_ts02\\synthetic\\svg_std_usd\\04', + landing_company_short: 'svg', + leverage: 500, + login: 'MTR100967300', + market_type: 'synthetic', + name: 'Name', + server: 'p02_ts02', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_synthetic', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts02', + }, + status: null, + sub_account_category: '', + sub_account_type: 'financial', + }, + { + account_type: 'real', + balance: 0, + country: 'ng', + currency: 'USD', + display_balance: '0.00', + email: 'email@gmail.com', + group: 'real\\p02_ts01\\all\\svg_std-sf_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'MTR80057067', + market_type: 'all', + name: 'Name', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + status: null, + sub_account_category: 'swap_free', + sub_account_type: 'standard', + }, + ], + }, + }; + } + if (name === 'trading_platform_accounts') { + return { + data: { + trading_platform_accounts: [ + { + account_id: 'DXR1646584', + account_type: 'real', + balance: 0, + currency: 'USD', + display_balance: '0.00', + enabled: 1, + landing_company_short: 'svg', + login: '8807230', + market_type: 'all', + platform: 'dxtrade', + }, + { + account_type: 'real', + balance: 0, + country: 'za', + currency: 'USD', + display_balance: '0.00', + email: 'mei+za1@binary.com', + group: 'real\\p02_ts01\\all\\svg_ez_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'EZR80001086', + market_type: 'all', + name: 'Baily Pan', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + }, + ], + }, + }; + } + if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + USD: { + fractional_digits: 2, + name: 'US Dollar', + type: 'fiat', + }, + }, + }, + }, + }; + } + if (name === 'transfer_between_accounts') { + return { + data: { + accounts: [ + { + account_type: 'wallet', + balance: '100.00', + currency: 'USD', + demo_account: 0, + loginid: 'CRW1030', + }, + { + account_type: 'mt5', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'MTR100967300', + }, + { + account_type: 'mt5', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'MTR80057067', + }, + { + account_type: 'derivez', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'EZR80001086', + }, + { + account_type: 'dxtrade', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'DXR1646584', + }, + ], + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('useTransferBetweenAccounts', () => { + let mock_store: ReturnType, wrapper: ({ children }: { children: JSX.Element }) => JSX.Element; + + beforeEach(() => { + mock_store = mockStore({ + client: { + loginid: 'CRW1030', + accounts: { + CRW1030: { + token: 'token', + }, + }, + }, + }); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + }); + + it('should be correct amount of transfer accounts', () => { + const { + result: { + current: { trading_accounts, wallet_accounts }, + }, + } = renderHook(() => useTransferBetweenAccounts(), { wrapper }); + + expect(Object.keys(trading_accounts)).toHaveLength(4); + expect(Object.keys(wallet_accounts)).toHaveLength(1); + }); + + it('all transfer accounts should have extended properties', () => { + const { + result: { + current: { trading_accounts, wallet_accounts }, + }, + } = renderHook(() => useTransferBetweenAccounts(), { wrapper }); + + Object.values({ ...trading_accounts, ...wallet_accounts }).forEach(account => { + expect(account).toHaveProperty('active_wallet_icon'); + expect(account).toHaveProperty('display_currency_code'); + expect(account).toHaveProperty('gradient_class'); + expect(account).toHaveProperty('icon'); + expect(account).toHaveProperty('is_demo'); + expect(account).toHaveProperty('shortcode'); + expect(account).toHaveProperty('type'); + }); + }); + + it('should return proper active account with extended properties', () => { + const { + result: { + current: { active_wallet }, + }, + } = renderHook(() => useTransferBetweenAccounts(), { wrapper }); + + expect(active_wallet).toEqual({ + account_type: 'wallet', + active_wallet_icon: 'IcWalletCurrencyUsd', + balance: 100, + currency: 'USD', + demo_account: 0, + display_currency_code: 'USD', + gradient_class: 'wallet-card__usd-bg', + icon: 'IcWalletCurrencyUsd', + is_demo: false, + loginid: 'CRW1030', + shortcode: 'svg', + type: 'fiat', + }); + }); +}); diff --git a/packages/hooks/src/__tests__/useWalletMigration.spec.tsx b/packages/hooks/src/__tests__/useWalletMigration.spec.tsx new file mode 100644 index 000000000000..a10345f8063f --- /dev/null +++ b/packages/hooks/src/__tests__/useWalletMigration.spec.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { APIProvider, useFetch, useRequest } from '@deriv/api'; +import { renderHook } from '@testing-library/react-hooks'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import useWalletMigration from '../useWalletMigration'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(), + useRequest: jest.fn(() => ({ mutate: jest.fn() })), +})); + +const mockUseFetch = useFetch as jest.MockedFunction>; +// @ts-expect-error need to come up with a way to mock the return type of useRequest +const mockUseRequest = useRequest as jest.MockedFunction>; + +describe('useWalletMigration', () => { + const mock = mockStore({}); + const wrapper = (mock: ReturnType) => { + const Component = ({ children }: { children: JSX.Element }) => { + return ( + + {children} + + ); + }; + return Component; + }; + + test('should return wallet migration state', () => { + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseFetch.mockReturnValue({ data: { wallet_migration: { state: 'eligible' } } }); + + const { result } = renderHook(() => useWalletMigration(), { wrapper: wrapper(mock) }); + + expect(result.current.state).toBe('eligible'); + }); + + test('should send start wallet migration request', () => { + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({ mutate: jest.fn() }); + + const { result } = renderHook(() => useWalletMigration(), { wrapper: wrapper(mock) }); + + result.current.start_migration(); + + expect(mockUseRequest('wallet_migration').mutate).toBeCalledWith({ payload: { wallet_migration: 'start' } }); + }); + + test('should send reset wallet migration request', () => { + // @ts-expect-error need to come up with a way to mock the return type of useRequest + mockUseRequest.mockReturnValue({ mutate: jest.fn() }); + + const { result } = renderHook(() => useWalletMigration(), { wrapper: wrapper(mock) }); + + result.current.reset_migration(); + + expect(mockUseRequest('wallet_migration').mutate).toBeCalledWith({ payload: { wallet_migration: 'reset' } }); + }); +}); diff --git a/packages/hooks/src/__tests__/useWalletTransactions.spec.tsx b/packages/hooks/src/__tests__/useWalletTransactions.spec.tsx new file mode 100644 index 000000000000..72982d7b4513 --- /dev/null +++ b/packages/hooks/src/__tests__/useWalletTransactions.spec.tsx @@ -0,0 +1,150 @@ +import * as React from 'react'; +import { APIProvider, useFetch } from '@deriv/api'; +import { mockStore, StoreProvider } from '@deriv/stores'; +import { renderHook } from '@testing-library/react-hooks'; +import useWalletTransactions from '../useWalletTransactions'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(), +})); + +const mockUseFetch = useFetch as jest.MockedFunction>; +describe('useWalletsList', () => { + test('should return a list of transactions', () => { + const mock = mockStore({ + client: { + accounts: { CRW909900: { token: '12345' } }, + currency: 'USD', + loginid: 'CRW909900', + }, + }); + + mockUseFetch.mockReturnValue({ + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + account_type: 'doughflow', + currency: 'USD', + is_virtual: 0, + loginid: 'CRW909900', + }, + ], + loginid: 'CRW909900', + }, + statement: { + transactions: [ + { + action_type: 'deposit', + amount: 25, + balance_after: 25, + transaction_id: 17494415481, + transaction_time: 1685942136, + }, + { + action_type: 'withdrawal', + amount: 750, + balance_after: 0, + transaction_id: 17494415480, + transaction_time: 1685942135, + }, + { + action_type: 'transfer', + amount: 5, + from: { + loginid: 'CRW909900', + }, + to: { + loginid: 'VRTCMOCK0001', + }, + balance_after: 9995, + transaction_id: 17494415484, + transaction_time: 1685942139, + }, + { + action_type: 'reset_balance', + amount: 350, + balance_after: 10000, + transaction_id: 13693003421, + transaction_time: 1685942138, + }, + { + action_type: 'transfer', + amount: 200, + from: { + loginid: 'VRTCMOCK0001', + }, + to: { + loginid: 'CRW909900', + }, + balance_after: 9650, + transaction_id: 17494415483, + transaction_time: 1685855740, + }, + { + action_type: 'deposit', + amount: 1000, + balance_after: 1000, + transaction_id: 17494117539, + transaction_time: 1685769338, + }, + ], + }, + website_status: { + currencies_config: { + USD: { + fractional_digits: 2, + is_deposit_suspended: 0, + is_suspended: 0, + is_withdrawal_suspended: 0, + name: 'US Dollar', + stake_default: 10, + type: 'fiat', + }, + }, + }, + }, + } as unknown as ReturnType); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + + const { result } = renderHook(() => useWalletTransactions('deposit'), { wrapper }); + + expect(result.current.transactions).toEqual([ + { + action_type: 'deposit', + amount: 25, + balance_after: 25, + gradient_class: 'wallet-card__usd-bg', + transaction_id: 17494415481, + transaction_time: 1685942136, + account_category: 'wallet', + account_currency: 'USD', + account_name: 'USD Wallet', + account_type: 'doughflow', + icon: 'IcWalletCurrencyUsd', + icon_type: 'fiat', + }, + { + action_type: 'deposit', + amount: 1000, + balance_after: 1000, + gradient_class: 'wallet-card__usd-bg', + transaction_id: 17494117539, + transaction_time: 1685769338, + account_category: 'wallet', + account_currency: 'USD', + account_name: 'USD Wallet', + account_type: 'doughflow', + icon: 'IcWalletCurrencyUsd', + icon_type: 'fiat', + }, + ]); + }); +}); diff --git a/packages/hooks/src/__tests__/useWalletTransfer.spec.tsx b/packages/hooks/src/__tests__/useWalletTransfer.spec.tsx new file mode 100644 index 000000000000..4ecf2da6538e --- /dev/null +++ b/packages/hooks/src/__tests__/useWalletTransfer.spec.tsx @@ -0,0 +1,252 @@ +import React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import useWalletTransfer from '../useWalletTransfer'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { APIProvider } from '@deriv/api'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + account_type: 'doughflow', + created_at: 1688642811, + currency: 'USD', + is_disabled: 0, + is_selected: true, + is_virtual: 0, + landing_company_name: 'svg', + linked_to: [ + { + loginid: 'MTR100967300', + platform: 'mt5', + }, + { + loginid: 'MTR80057067', + platform: 'mt5', + }, + { + loginid: 'DXR1646584', + platform: 'dxtrade', + }, + { + loginid: 'EZR80001086', + platform: 'derivez', + }, + ], + loginid: 'CRW1030', + }, + ], + }, + }, + }; + } + if (name === 'mt5_login_list') { + return { + data: { + mt5_login_list: [ + { + account_type: 'real', + balance: 0, + country: 'ng', + currency: 'USD', + display_balance: '0.00', + email: 'email@gmail.com', + group: 'real\\p02_ts02\\synthetic\\svg_std_usd\\04', + landing_company_short: 'svg', + leverage: 500, + login: 'MTR100967300', + market_type: 'synthetic', + name: 'Name', + server: 'p02_ts02', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_synthetic', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts02', + }, + status: null, + sub_account_category: '', + sub_account_type: 'financial', + }, + { + account_type: 'real', + balance: 0, + country: 'ng', + currency: 'USD', + display_balance: '0.00', + email: 'email@gmail.com', + group: 'real\\p02_ts01\\all\\svg_std-sf_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'MTR80057067', + market_type: 'all', + name: 'Name', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + status: null, + sub_account_category: 'swap_free', + sub_account_type: 'standard', + }, + ], + }, + }; + } + if (name === 'trading_platform_accounts') { + return { + data: { + trading_platform_accounts: [ + { + account_id: 'DXR1646584', + account_type: 'real', + balance: 0, + currency: 'USD', + display_balance: '0.00', + enabled: 1, + landing_company_short: 'svg', + login: '8807230', + market_type: 'all', + platform: 'dxtrade', + }, + { + account_type: 'real', + balance: 0, + country: 'za', + currency: 'USD', + display_balance: '0.00', + email: 'mei+za1@binary.com', + group: 'real\\p02_ts01\\all\\svg_ez_usd', + landing_company_short: 'svg', + leverage: 1000, + login: 'EZR80001086', + market_type: 'all', + name: 'Baily Pan', + server: 'p02_ts01', + server_info: { + environment: 'Deriv-Server-02', + geolocation: { + group: 'africa_derivez', + location: 'South Africa', + region: 'Africa', + sequence: 2, + }, + id: 'p02_ts01', + }, + }, + ], + }, + }; + } + if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + USD: { + fractional_digits: 2, + name: 'US Dollar', + type: 'fiat', + }, + }, + }, + }, + }; + } + if (name === 'transfer_between_accounts') { + return { + data: { + accounts: [ + { + account_type: 'wallet', + balance: '100.00', + currency: 'USD', + demo_account: 0, + loginid: 'CRW1030', + }, + { + account_type: 'mt5', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'MTR100967300', + }, + { + account_type: 'mt5', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'MTR80057067', + }, + { + account_type: 'derivez', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'EZR80001086', + }, + { + account_type: 'dxtrade', + balance: '0.00', + currency: 'USD', + demo_account: 0, + loginid: 'DXR1646584', + }, + ], + }, + }; + } + + return { data: undefined }; + }), +})); + +describe('useWalletTransfer', () => { + let mock_store: ReturnType, wrapper: ({ children }: { children: JSX.Element }) => JSX.Element; + + beforeEach(() => { + mock_store = mockStore({ + client: { + loginid: 'CRW1030', + accounts: { + CRW1030: { + token: 'token', + }, + }, + }, + }); + + wrapper = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + }); + + it('from_account should be undefined by default', () => { + const { + result: { + current: { from_account }, + }, + } = renderHook(() => useWalletTransfer(), { wrapper }); + + expect(from_account).toBeUndefined(); + }); +}); diff --git a/packages/hooks/src/__tests__/useWalletsList.spec.tsx b/packages/hooks/src/__tests__/useWalletsList.spec.tsx new file mode 100644 index 000000000000..3ab9ac963f80 --- /dev/null +++ b/packages/hooks/src/__tests__/useWalletsList.spec.tsx @@ -0,0 +1,144 @@ +import * as React from 'react'; +import { APIProvider, useFetch } from '@deriv/api'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { renderHook } from '@testing-library/react-hooks'; +import useWalletsList from '../useWalletsList'; + +const mockUseFetch = useFetch as jest.MockedFunction>; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn((name: string) => { + if (name === 'authorize') { + return { + data: { + authorize: { + account_list: [ + { + account_category: 'wallet', + currency: 'USD', + is_virtual: 1, + }, + { + account_category: 'wallet', + currency: 'UST', + is_virtual: 0, + }, + { + account_category: 'wallet', + currency: 'BTC', + is_virtual: 0, + }, + { + account_category: 'wallet', + currency: 'AUD', + is_virtual: 0, + }, + { + account_category: 'wallet', + currency: 'ETH', + is_virtual: 0, + }, + ], + }, + }, + }; + } else if (name === 'balance') { + return { + data: { + balance: { + accounts: { + CRW909900: { + balance: 0, + }, + }, + }, + }, + }; + } else if (name === 'website_status') { + return { + data: { + website_status: { + currencies_config: { + AUD: { type: 'fiat' }, + BTC: { type: 'crypto' }, + ETH: { type: 'crypto' }, + UST: { type: 'crypto' }, + USD: { type: 'fiat' }, + }, + }, + }, + }; + } else if (name === 'crypto_config') { + return { + data: { + crypto_config: { + currencies_config: { + BTC: {}, + }, + }, + }, + }; + } + + return undefined; + }), +})); + +describe('useWalletsList', () => { + const wrapper = (mock: ReturnType) => { + const Component = ({ children }: { children: JSX.Element }) => ( + + {children} + + ); + return Component; + }; + + test('should return wallets list for the current loginid', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + const { result } = renderHook(() => useWalletsList(), { wrapper: wrapper(mock) }); + + expect(result.current.data?.every(wallet => wallet.account_category === 'wallet')).toEqual(true); + }); + + test('should return sorted wallet list where virtual is the last and crypto is after fiat currency', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + const { result } = renderHook(() => useWalletsList(), { wrapper: wrapper(mock) }); + + expect(result.current.data?.map(wallet => wallet.currency)).toEqual(['AUD', 'BTC', 'ETH', 'UST', 'USD']); + }); + + test('should return has_wallet equals to true if the client has at least one wallet', () => { + const mock = mockStore({ client: { accounts: { CRW909900: { token: '12345' } }, loginid: 'CRW909900' } }); + + const { result } = renderHook(() => useWalletsList(), { wrapper: wrapper(mock) }); + + expect(result.current.has_wallet).toEqual(true); + }); + + test("should return has_wallet equals to false if the client doesn't have any wallet", () => { + const mock = mockStore({ client: { accounts: { CR123456: { token: '12345' } }, loginid: 'CR123456' } }); + + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseFetch.mockReturnValue({ + data: { + authorize: { + account_list: [ + { + account_category: 'trading', + currency: 'USD', + is_virtual: 0, + }, + ], + }, + }, + }); + + const { result } = renderHook(() => useWalletsList(), { wrapper: wrapper(mock) }); + + expect(result.current.has_wallet).toEqual(false); + }); +}); diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index 4b22cbce43d4..69ba5299f8f0 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -1,9 +1,13 @@ export { default as useAccountTransferVisible } from './useAccountTransferVisible'; +export { default as useActiveWallet } from './useActiveWallet'; +export { default as useAuthorize } from './useAuthorize'; +export { default as useAvailableWallets } from './useAvailableWallets'; export { default as useCFDAccounts } from './useCFDAccounts'; export { default as useCFDAllAccounts } from './useCFDAllAccounts'; export { default as useCFDDemoAccounts } from './useCFDDemoAccounts'; export { default as useCFDRealAccounts } from './useCFDRealAccounts'; export { default as useCashierLocked } from './useCashierLocked'; +export { default as useContentFlag } from './useContentFlag'; export { default as useCountdown } from './useCountdown'; export { default as useCryptoTransactions } from './useCryptoTransactions'; export { default as useCurrencyConfig } from './useCurrencyConfig'; @@ -13,6 +17,7 @@ export { default as useDepositCryptoAddress } from './useDepositCryptoAddress'; export { default as useDepositFiatAddress } from './useDepositFiatAddress'; export { default as useDepositLocked } from './useDepositLocked'; export { default as useExchangeRate } from './useExchangeRate'; +export { default as useExistingCFDAccounts } from './useExistingCFDAccounts'; export { default as useFeatureFlags } from './useFeatureFlags'; export { default as useFiatAccountList } from './useFiatAccountList'; export { default as useHasActiveRealAccount } from './useHasActiveRealAccount'; @@ -26,9 +31,11 @@ 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 useIsAccountStatusPresent } from './useIsAccountStatusPresent'; export { default as useIsP2PEnabled } from './useIsP2PEnabled'; export { default as useIsRealAccountNeededForCashier } from './useIsRealAccountNeededForCashier'; export { default as useIsSystemMaintenance } from './useIsSystemMaintenance'; +export { default as useLocalStorageData } from './useLocalStorageData'; export { default as useNeedAuthentication } from './useNeedAuthentication'; export { default as useNeedFinancialAssessment } from './useNeedFinancialAssessment'; export { default as useNeedPOI } from './useNeedPOI'; @@ -45,8 +52,13 @@ export { default as usePlatformDemoAccount } from './usePlatformDemoAccount'; export { default as usePlatformRealAccounts } from './usePlatformRealAccounts'; export { default as useRealSTPAccount } from './useRealSTPAccount'; export { default as useTotalAccountBalance } from './useTotalAccountBalance'; +export { default as useTransferBetweenAccounts } from './useTransferBetweenAccounts'; export { default as useVerifyEmail } from './useVerifyEmail'; -export { useIsAccountStatusPresent } from './useIsAccountStatusPresent'; +export { default as useWalletMigration } from './useWalletMigration'; +export { default as useWalletTransactions } from './useWalletTransactions'; +export { default as useWalletTransfer } from './useWalletTransfer'; +export { default as useWalletsList } from './useWalletsList'; +export { default as useStatesList } from './useStatesList'; export { default as useP2PConfig } from './useP2PConfig'; export { default as useIsClientHighRiskForMT5 } from './useIsClientHighRiskForMT5'; export { default as useCFDCanGetMoreMT5Accounts } from './useCFDCanGetMoreMT5Accounts'; diff --git a/packages/hooks/src/useActiveWallet.ts b/packages/hooks/src/useActiveWallet.ts new file mode 100644 index 000000000000..bb238eb3f727 --- /dev/null +++ b/packages/hooks/src/useActiveWallet.ts @@ -0,0 +1,13 @@ +import { useMemo } from 'react'; +import useWalletsList from './useWalletsList'; + +/** A custom hook that returns the wallet object for the current active wallet. */ +const useActiveWallet = () => { + const { data } = useWalletsList(); + const active_wallet = useMemo(() => data?.find(wallet => wallet.is_selected), [data]); + + /** User's current active wallet. */ + return active_wallet; +}; + +export default useActiveWallet; diff --git a/packages/hooks/src/useAuthorize.ts b/packages/hooks/src/useAuthorize.ts new file mode 100644 index 000000000000..e90502d3a06b --- /dev/null +++ b/packages/hooks/src/useAuthorize.ts @@ -0,0 +1,26 @@ +import { useMemo } from 'react'; +import { useFetch } from '@deriv/api'; +import { useStore } from '@deriv/stores'; + +/** A custom hook that authorize the user with the given token. If no token is given, it will use the current token. */ +const useAuthorize = (token?: string) => { + const { client } = useStore(); + const { accounts, loginid = '' } = client; + const current_token = accounts[loginid || '']?.token; + + const { data, ...rest } = useFetch('authorize', { + payload: { authorize: token ?? current_token }, + options: { enabled: Boolean(token ?? current_token) }, + }); + + // Add additional information to the authorize response. + const modified_authorize = useMemo(() => ({ ...data?.authorize }), [data?.authorize]); + + return { + /** The authorize response. */ + data: modified_authorize, + ...rest, + }; +}; + +export default useAuthorize; diff --git a/packages/hooks/src/useAvailableWallets.ts b/packages/hooks/src/useAvailableWallets.ts new file mode 100644 index 000000000000..8ba16d14e136 --- /dev/null +++ b/packages/hooks/src/useAvailableWallets.ts @@ -0,0 +1,76 @@ +import React from 'react'; +import { useFetch } from '@deriv/api'; +import { useStore } from '@deriv/stores'; +import useWalletsList from './useWalletsList'; +import useAuthorize from './useAuthorize'; + +const useAvailableWallets = () => { + const { client, ui } = useStore(); + const { is_dark_mode_on } = ui; + const { is_crypto } = client; + const { data } = useAuthorize(); + + const { data: account_type_data, ...rest } = useFetch('get_account_types', { + payload: { company: data?.landing_company_name === 'virtual' ? 'svg' : data?.landing_company_name }, + options: { enabled: Boolean(data?.landing_company_name) }, + }); + + const { data: added_wallets } = useWalletsList(); + + const sortedWallets = React.useMemo(() => { + if (!account_type_data) return null; + const { crypto, doughflow } = account_type_data?.get_account_types?.wallet || {}; + const crypto_currencies = crypto?.currencies; + const fiat_currencies = doughflow?.currencies; + + if (!crypto_currencies || !fiat_currencies) return null; + const available_currencies = [...fiat_currencies, ...crypto_currencies]; + const non_virtual_wallets = added_wallets?.filter(wallet => !wallet.is_virtual); + + const modified_wallets = non_virtual_wallets?.map(wallet => ({ + currency: wallet.currency, + landing_company_name: wallet.landing_company_name, + is_added: true, + gradient_card_class: wallet.gradient_card_class, + })); + + const available_wallets = available_currencies + .filter(currency => !modified_wallets?.some(wallet => wallet.currency === currency)) + .map(currency => ({ + currency, + landing_company_name: data?.landing_company_name === 'virtual' ? 'svg' : data?.landing_company_name, + is_added: false, + gradient_card_class: `wallet-card__${currency.toLowerCase()}-bg${is_dark_mode_on ? '--dark' : ''}`, + })); + + // Sort the unadded wallets alphabetically by fiat, crypto, then virtual + available_wallets?.sort((a, b) => { + if (is_crypto(a.currency) !== is_crypto(b.currency)) { + return is_crypto(a.currency) ? 1 : -1; + } + + return (a.currency || 'USD').localeCompare(b.currency || 'USD'); + }); + + // Sort the added wallets alphabetically by fiat, crypto, then virtual (if any) + if (Array.isArray(modified_wallets)) { + modified_wallets?.sort((a, b) => { + if (is_crypto(a.currency) !== is_crypto(b.currency)) { + return is_crypto(a.currency) ? 1 : -1; + } + + return (a.currency || 'USD').localeCompare(b.currency || 'USD'); + }); + return [...available_wallets, ...modified_wallets]; + } + + return [...available_wallets]; + }, [added_wallets, account_type_data, data?.landing_company_name, is_dark_mode_on, is_crypto]); + + return { + ...rest, + data: sortedWallets, + }; +}; + +export default useAvailableWallets; diff --git a/packages/hooks/src/useContentFlag.ts b/packages/hooks/src/useContentFlag.ts new file mode 100644 index 000000000000..b3993c0def39 --- /dev/null +++ b/packages/hooks/src/useContentFlag.ts @@ -0,0 +1,17 @@ +import { useStore } from '@deriv/stores'; + +const useContentFlag = () => { + const { traders_hub } = useStore(); + const { content_flag } = traders_hub; + + return { + is_low_risk_cr_non_eu: content_flag === 'low_risk_cr_non_eu', + is_low_risk_cr_eu: content_flag === 'low_risk_cr_eu', + is_high_risk_cr: content_flag === 'high_risk_cr', + is_cr_demo: content_flag === 'cr_demo', + is_eu_demo: content_flag === 'eu_demo', + is_eu_real: content_flag === 'eu_real', + }; +}; + +export default useContentFlag; diff --git a/packages/hooks/src/useCurrencyConfig.ts b/packages/hooks/src/useCurrencyConfig.ts index bffc564025d9..db9b3e8a4585 100644 --- a/packages/hooks/src/useCurrencyConfig.ts +++ b/packages/hooks/src/useCurrencyConfig.ts @@ -4,7 +4,7 @@ import { useFetch } from '@deriv/api'; /** @deprecated Use `useCurrencyConfig` from `@deriv/api` package instead. */ const useCurrencyConfig = () => { const { data: website_status_data } = useFetch('website_status'); - const { data: crypto_config_data } = useFetch('crypto_config'); + const { data: crypto_config_data, ...rest } = useFetch('crypto_config'); const currencies_config = useMemo(() => { if (!website_status_data?.website_status?.currencies_config) return undefined; @@ -82,6 +82,7 @@ const useCurrencyConfig = () => { getConfig, /** Available currencies and their information */ currencies_config, + ...rest, }; }; diff --git a/packages/hooks/src/useExistingCFDAccounts.ts b/packages/hooks/src/useExistingCFDAccounts.ts new file mode 100644 index 000000000000..2a1961a494cf --- /dev/null +++ b/packages/hooks/src/useExistingCFDAccounts.ts @@ -0,0 +1,106 @@ +import { useMemo } from 'react'; +import { useFetch } from '@deriv/api'; +import useActiveWallet from './useActiveWallet'; +import { useStore } from '@deriv/stores'; + +type TAccount = { + cfd_type?: 'mt5' | 'derivez' | 'dxtrade'; + market_type?: 'financial' | 'synthetic' | 'all'; +}; + +const getAccountIcon = ({ cfd_type, market_type }: TAccount) => { + switch (cfd_type) { + case 'mt5': { + switch (market_type) { + case 'financial': + return 'IcRebrandingMt5FinancialDashboard'; + case 'synthetic': + return 'IcRebrandingMt5DerivedDashboard'; + case 'all': + return 'IcRebrandingMt5SwapFree'; + default: + return 'IcRebrandingDmt5Dashboard'; + } + } + case 'derivez': + return 'IcRebrandingDerivEz'; + case 'dxtrade': + return 'IcRebrandingDerivX'; + default: + return ''; + } +}; + +/** + * @description This hook is used to get the created CFD accounts of the user. + */ +const useExistingCFDAccounts = () => { + const { traders_hub } = useStore(); + const { combined_cfd_mt5_accounts } = traders_hub; + const wallet = useActiveWallet(); + const { data: mt5, ...mt5_rest } = useFetch('mt5_login_list'); + const { data: derivez, ...derivez_rest } = useFetch('trading_platform_accounts', { + payload: { platform: 'derivez' }, + }); + const { data: dxtrade, ...dxtrade_rest } = useFetch('trading_platform_accounts', { + payload: { platform: 'dxtrade' }, + }); + + /** + * + * @description This is the modified MT5 accounts that will be used in the CFD account creation. + */ + const modified_mt5_accounts = useMemo(() => { + const getAccountInfo = (login?: string) => { + return { + platform: wallet?.linked_to?.find(linked => linked.loginid === login)?.platform, + icon: combined_cfd_mt5_accounts?.find(cfd => cfd.login === login)?.icon, + description: combined_cfd_mt5_accounts?.find(cfd => cfd.login === login)?.description, + name: combined_cfd_mt5_accounts?.find(cfd => cfd.login === login)?.name, + sub_title: combined_cfd_mt5_accounts?.find(cfd => cfd.login === login)?.sub_title, + action_type: 'multi-action', + }; + }; + + return mt5?.mt5_login_list?.map(account => ({ + ...account, + ...getAccountInfo(account.login), + loginid: account.login, + transfer_icon: getAccountIcon({ cfd_type: 'mt5', ...account }), + })); + }, [mt5?.mt5_login_list, wallet?.linked_to, combined_cfd_mt5_accounts]); + + const modified_derivez_accounts = useMemo( + () => + derivez?.trading_platform_accounts?.map(account => ({ + ...account, + loginid: account.login, + transfer_icon: getAccountIcon({ cfd_type: 'derivez' }), + })), + [derivez?.trading_platform_accounts] + ); + const modified_dxtrade_accounts = useMemo( + () => + dxtrade?.trading_platform_accounts?.map(account => ({ + ...account, + loginid: account.account_id, + transfer_icon: getAccountIcon({ cfd_type: 'dxtrade' }), + })), + [dxtrade?.trading_platform_accounts] + ); + const data = useMemo( + () => ({ + mt5_accounts: modified_mt5_accounts || [], + dxtrade_accounts: modified_dxtrade_accounts || [], + derivez_accounts: modified_derivez_accounts || [], + }), + [modified_mt5_accounts, modified_dxtrade_accounts, modified_derivez_accounts] + ); + + return { + data, + isSuccess: [mt5_rest.isSuccess, dxtrade_rest.isSuccess, derivez_rest.isSuccess].every(Boolean), + }; +}; + +export default useExistingCFDAccounts; diff --git a/packages/hooks/src/useIsAccountStatusPresent.ts b/packages/hooks/src/useIsAccountStatusPresent.ts index f6b467cd0089..db9144b6e058 100644 --- a/packages/hooks/src/useIsAccountStatusPresent.ts +++ b/packages/hooks/src/useIsAccountStatusPresent.ts @@ -48,7 +48,13 @@ const AccountStatusList = [ type TAccountStatus = typeof AccountStatusList[number]; -export const useIsAccountStatusPresent = (status: TAccountStatus) => { +/** + * Custom hook to check if a particular account status is present. + * @name useIsAccountStatusPresent + * @param status of the account to check + * @returns boolean + */ +const useIsAccountStatusPresent = (status: TAccountStatus) => { const { client: { account_status }, } = useStore(); @@ -57,3 +63,5 @@ export const useIsAccountStatusPresent = (status: TAccountStatus) => { return React.useMemo(() => status_list?.includes(status) ?? false, [status_list, status]); }; + +export default useIsAccountStatusPresent; diff --git a/packages/hooks/src/useLocalStorageData.ts b/packages/hooks/src/useLocalStorageData.ts new file mode 100644 index 000000000000..b3102dda702d --- /dev/null +++ b/packages/hooks/src/useLocalStorageData.ts @@ -0,0 +1,29 @@ +import React from 'react'; +import { getLocalStorage } from '@deriv/utils'; + +/** + * Hook that manages a localStorage value as a React state. + * @template T - The generic type of the localStorage value. + * @param {string} key - The localStorage key. + * @param {T} [fallback_value] - Optional fallback value if the key does not exist or has no value. + * @returns - An array containing the current value, a function to update the value, and a function to clear the value. + */ +const useLocalStorageData = ( + key: string, + fallback_value?: T +): [T | null, React.Dispatch>, VoidFunction] => { + const [data, setData] = React.useState(getLocalStorage(key) ?? fallback_value ?? null); + + React.useEffect(() => { + localStorage.setItem(key, JSON.stringify(data)); + }, [key, data]); + + const clearData = () => { + localStorage.removeItem(key); + setData(fallback_value ?? null); + }; + + return [data, setData, clearData]; +}; + +export default useLocalStorageData; diff --git a/packages/hooks/src/usePlatformDemoAccount.ts b/packages/hooks/src/usePlatformDemoAccount.ts index f416f22aa133..b5f1d41aaf61 100644 --- a/packages/hooks/src/usePlatformDemoAccount.ts +++ b/packages/hooks/src/usePlatformDemoAccount.ts @@ -8,7 +8,10 @@ import { useStore } from '@deriv/stores'; const usePlatformDemoAccount = () => { const { client } = useStore(); const { accounts } = client; - const account_list = Object.keys(accounts).map(loginid => accounts[loginid]); + const account_list = Object.keys(accounts).map(loginid => ({ + ...accounts[loginid], + loginid, + })); const platform_demo_account = account_list.find(account => account.is_virtual); diff --git a/packages/hooks/src/usePlatformRealAccounts.ts b/packages/hooks/src/usePlatformRealAccounts.ts index 3572592a0ef9..dd51f12ffac7 100644 --- a/packages/hooks/src/usePlatformRealAccounts.ts +++ b/packages/hooks/src/usePlatformRealAccounts.ts @@ -9,7 +9,10 @@ const usePlatformRealAccounts = () => { const { client, traders_hub } = useStore(); const { accounts } = client; const { is_eu_user } = traders_hub; - const account_list = Object.keys(accounts).map(loginid => accounts[loginid]); + const account_list = Object.keys(accounts).map(loginid => ({ + ...accounts[loginid], + loginid, + })); const platform_real_accounts = account_list.filter(account => { const is_maltainvest = diff --git a/packages/hooks/src/useStatesList.ts b/packages/hooks/src/useStatesList.ts new file mode 100644 index 000000000000..ad5086745a1c --- /dev/null +++ b/packages/hooks/src/useStatesList.ts @@ -0,0 +1,16 @@ +import { useFetch } from '@deriv/api'; +/** + * Custom hook to get states list for a particular country. + * @returns an object with the states list and the options to manage API response. + */ +const useStatesList = (country: string) => { + const { data, ...rest } = useFetch('states_list', { + // @ts-expect-error The `states_list` type from `@deriv/api-types` is not correct. + // The type should be `string`, but it's an alias to string type. + payload: { states_list: country }, + }); + + return { ...rest, data: data?.states_list ?? [] }; +}; + +export default useStatesList; diff --git a/packages/hooks/src/useTransferBetweenAccounts.ts b/packages/hooks/src/useTransferBetweenAccounts.ts new file mode 100644 index 000000000000..35f232ab805c --- /dev/null +++ b/packages/hooks/src/useTransferBetweenAccounts.ts @@ -0,0 +1,144 @@ +import { useMemo } from 'react'; +import { useStore } from '@deriv/stores'; +import { useFetch } from '@deriv/api'; +import useActiveWallet from './useActiveWallet'; +import useCurrencyConfig from './useCurrencyConfig'; +import useExistingCFDAccounts from './useExistingCFDAccounts'; +import useWalletsList from './useWalletsList'; + +const useTransferBetweenAccounts = () => { + const { ui } = useStore(); + const { is_dark_mode_on } = ui; + + const active_wallet = useActiveWallet(); + + const { data: wallets } = useWalletsList(); + + const { getConfig } = useCurrencyConfig(); + + const trading_apps_icon = is_dark_mode_on ? 'IcWalletOptionsDark' : 'IcWalletOptionsLight'; + + const { + data: { derivez_accounts, dxtrade_accounts, mt5_accounts }, + isSuccess: is_cfd_accounts_loaded, + } = useExistingCFDAccounts(); + + const { data, ...rest } = useFetch('transfer_between_accounts', { + payload: { accounts: 'all' }, + options: { enabled: is_cfd_accounts_loaded }, + }); + + const modified_transfer_accounts = useMemo(() => { + const all_linked_cfd_accounts = [...derivez_accounts, ...dxtrade_accounts, ...mt5_accounts]; + + const getAccountType = (is_demo?: number, currency?: string): 'fiat' | 'crypto' | 'demo' => { + if (is_demo) return 'demo'; + return getConfig(currency || '')?.is_crypto ? 'crypto' : 'fiat'; + }; + + const accounts = data?.accounts?.map(account => { + return { + ...account, + active_wallet_icon: active_wallet?.icon, + balance: parseFloat( + Number(account.balance).toFixed(getConfig(account.currency || '')?.fractional_digits) + ), + display_currency_code: getConfig(account.currency || '')?.display_code, + is_demo: Boolean(account?.demo_account), + shortcode: active_wallet?.landing_company_name, + type: getAccountType(account.demo_account, account.currency), + }; + }); + + return { + trading_accounts: + accounts?.reduce( + (trading_accounts, account) => { + if (account.account_type === 'wallet') return trading_accounts; + if (!account.loginid) return trading_accounts; + + const cfd_icon = all_linked_cfd_accounts.find( + cfd_account => account.loginid && cfd_account.loginid?.includes(account.loginid) + )?.transfer_icon; + + trading_accounts[account.loginid] = { + ...account, + gradient_class: active_wallet?.gradient_card_class, + icon: account.account_type === 'trading' ? trading_apps_icon : cfd_icon, + ...(account.account_type === 'mt5' && { + mt5_market_type: mt5_accounts?.find( + mt5_account => account.loginid && mt5_account.loginid?.includes(account.loginid) + )?.market_type, + }), + }; + + return trading_accounts; + }, + {} as Record< + string, + NonNullable< + typeof accounts[number] & { + gradient_class?: `wallet-card__${string}`; + icon?: string; + mt5_market_type?: 'all' | 'financial' | 'synthetic'; + } + > + > + ) || {}, + wallet_accounts: + accounts?.reduce( + (wallet_accounts, wallet) => { + if (wallet.account_type !== 'wallet') return wallet_accounts; + if (!wallet.loginid) return wallet_accounts; + + const available_wallet = wallets?.find(acc => acc.loginid === wallet.loginid); + + wallet_accounts[wallet.loginid] = { + ...wallet, + icon: available_wallet?.icon, + gradient_class: available_wallet?.gradient_card_class, + }; + + return wallet_accounts; + }, + {} as Record< + string, + NonNullable< + typeof accounts[number] & { + gradient_class?: `wallet-card__${string}`; + icon?: string; + } + > + > + ) || {}, + }; + }, [ + active_wallet?.gradient_card_class, + active_wallet?.icon, + active_wallet?.landing_company_name, + data?.accounts, + derivez_accounts, + dxtrade_accounts, + getConfig, + mt5_accounts, + trading_apps_icon, + wallets, + ]); + + const modified_active_wallet = useMemo(() => { + return active_wallet?.loginid + ? { + ...modified_transfer_accounts.wallet_accounts[active_wallet?.loginid], + } + : undefined; + }, [active_wallet?.loginid, modified_transfer_accounts.wallet_accounts]); + + return { + ...rest, + active_wallet: modified_active_wallet, + trading_accounts: modified_transfer_accounts.trading_accounts, + wallet_accounts: modified_transfer_accounts.wallet_accounts, + }; +}; + +export default useTransferBetweenAccounts; diff --git a/packages/hooks/src/useWalletMigration.ts b/packages/hooks/src/useWalletMigration.ts new file mode 100644 index 000000000000..1c2d4a7186d3 --- /dev/null +++ b/packages/hooks/src/useWalletMigration.ts @@ -0,0 +1,56 @@ +import { useCallback } from 'react'; +import { useAuthorize, useFetch, useInvalidateQuery, useRequest } from '@deriv/api'; +import { useStore } from '@deriv/stores'; + +/** A custom hook to get the status of wallet_migration API and to start/reset the migration process */ +const useWalletMigration = () => { + // TODO: delete it later, it's a temporary solution + // because we have to check for authorize from client store before doing API call + // This hook will be refactored later for subscribe when BE is ready + const { client } = useStore(); + const { is_authorize } = client; + + const invalidate = useInvalidateQuery(); + + /** Make a request to wallet_migration API and onSuccess it will invalidate the cached data */ + const { mutate } = useRequest('wallet_migration', { onSuccess: () => invalidate('wallet_migration') }); + + const { isSuccess } = useAuthorize(); + + /** Fetch the wallet_migration API and refetch it every second if the status is in_progress */ + const { data } = useFetch('wallet_migration', { + payload: { wallet_migration: 'state' }, + options: { + refetchInterval: response => (response?.wallet_migration?.state === 'in_progress' ? 500 : false), + // delete it later + enabled: is_authorize && isSuccess, + }, + }); + + const start_migration = useCallback(() => mutate({ payload: { wallet_migration: 'start' } }), [mutate]); + + const reset_migration = useCallback(() => mutate({ payload: { wallet_migration: 'reset' } }), [mutate]); + + const state = data?.wallet_migration?.state; + + return { + /** The status of the wallet_migration API */ + state, + /** A boolean to check if the status is not_eligible */ + is_ineligible: state === 'ineligible', + /** A boolean to check if the status is eligible */ + is_eligible: state === 'eligible', + /** A boolean to check if the status is in_progress */ + is_in_progress: state === 'in_progress', + /** A boolean to check if the status is completed */ + is_migrated: state === 'migrated', + /** A boolean to check if the status is failed */ + is_failed: state === 'failed', + /** Sends a request to wallet_migration API to start the migration process */ + start_migration, + /** Sends a request to wallet_migration API to reset the migration process */ + reset_migration, + }; +}; + +export default useWalletMigration; diff --git a/packages/hooks/src/useWalletTransactions.ts b/packages/hooks/src/useWalletTransactions.ts new file mode 100644 index 000000000000..847ada643a3e --- /dev/null +++ b/packages/hooks/src/useWalletTransactions.ts @@ -0,0 +1,336 @@ +import { useCallback, useMemo } from 'react'; +import { useStore } from '@deriv/stores'; +import { getWalletCurrencyIcon } from '@deriv/utils'; +import useActiveWallet from './useActiveWallet'; +import useCurrencyConfig from './useCurrencyConfig'; +import usePlatformAccounts from './usePlatformAccounts'; +import useWalletsList from './useWalletsList'; + +const trading_accounts_display_prefixes = { + standard: 'Deriv Apps', + mt5: 'MT5', + dxtrade: 'Deriv X', + binary: 'Binary', +} as const; + +const landing_company_display_shortcodes = { + svg: 'SVG', + malta: 'Malta', +} as const; + +const useWalletTransactions = ( + action_type: '' | 'deposit' | 'withdrawal' | 'initial_fund' | 'reset_balance' | 'transfer' +) => { + const { + client: { loginid, landing_company_shortcode: shortcode }, + ui: { is_dark_mode_on }, + } = useStore(); + const { data: wallets } = useWalletsList(); + const current_wallet = useActiveWallet(); + let { demo: demo_platform_account } = usePlatformAccounts(); + const { real: real_platform_accounts } = usePlatformAccounts(); + + // TODO remove these mocks when we're to switch to API data + demo_platform_account = { + account_category: 'trading', + account_type: 'standard', + currency: 'USD', + loginid: 'VRTCMOCK0001', + is_virtual: 1, + landing_company_shortcode: shortcode as 'svg' | 'malta', + token: '', + }; + real_platform_accounts.push({ + account_category: 'trading', + account_type: 'standard', + currency: 'USD', + loginid: 'CRMOCK0001', + is_virtual: 0, + landing_company_shortcode: shortcode as 'svg' | 'malta', + token: '', + }); + if (wallets && current_wallet) + wallets.push({ + account_type: 'crypto', + balance: 0, + currency: 'BTC', + gradient_header_class: 'wallet-header__btc-bg', + gradient_card_class: `wallet-card__btc-bg${is_dark_mode_on ? '--dark' : ''}`, + is_demo: !!current_wallet.is_virtual, + is_disabled: 0, + is_malta_wallet: false, + is_selected: false, + is_virtual: current_wallet.is_virtual, + landing_company_name: 'svg', + loginid: 'CRWMOCK00042', + currency_config: undefined, + icon: 'IcWalletCurrencyBtc', + wallet_currency_type: 'BTC', + }); + const accounts = useMemo( + () => [demo_platform_account, ...real_platform_accounts], + [demo_platform_account, real_platform_accounts] + ); + const { getConfig } = useCurrencyConfig(); + + const getTradingAccountName = useCallback( + ( + account_type: 'standard' | 'mt5' | 'dxtrade' | 'binary', + is_virtual: boolean, + landing_company_shortcode: 'svg' | 'malta' + ) => { + return `${trading_accounts_display_prefixes[account_type]} ${ + is_virtual ? 'Demo' : `(${landing_company_display_shortcodes[landing_company_shortcode]})` + } account`; + }, + [] + ); + + // TODO remove this mock when we're to switch to API data + const mock_transactions = current_wallet?.is_virtual + ? [ + { + action_type: 'transfer', + amount: 5, + from: { + loginid, + }, + to: { + loginid: 'VRTCMOCK0001', + }, + app_id: {}, + balance_after: 9995, + transaction_id: 17494415484, + transaction_time: 1685942139, + }, + { + action_type: 'reset_balance', + amount: 350, + balance_after: 10000, + transaction_id: 13693003421, + transaction_time: 1685942138, + }, + { + action_type: 'transfer', + amount: 200, + from: { + loginid: 'VRTCMOCK0001', + }, + to: { + loginid, + }, + balance_after: 9650, + transaction_id: 17494415483, + transaction_time: 1685855740, + }, + { + action_type: 'transfer', + amount: 550, + from: { + loginid, + }, + to: { + loginid: 'VRTCMOCK0001', + }, + app_id: {}, + balance_after: 9450, + transaction_id: 17494415482, + transaction_time: 1685855739, + }, + { + action_type: 'initial_fund', + amount: 10000, + balance_after: 10000, + transaction_id: 13693011401, + transaction_time: 1685855738, + }, + ] + : [ + { + action_type: 'transfer', + amount: 5, + from: { + loginid, + }, + to: { + loginid: 'CRMOCK0001', + }, + balance_after: 0, + transaction_id: 17494117541, + transaction_time: 1685942138, + }, + { + action_type: 'transfer', + amount: 20, + from: { + loginid, + }, + to: { + loginid: 'CRWMOCK00042', + }, + balance_after: 5, + transaction_id: 17494415489, + transaction_time: 1685942137, + }, + { + action_type: 'deposit', + amount: 25, + balance_after: 25, + transaction_id: 17494415481, + transaction_time: 1685942136, + }, + { + action_type: 'withdrawal', + amount: 750, + balance_after: 0, + transaction_id: 17494415480, + transaction_time: 1685942135, + }, + { + action_type: 'transfer', + amount: 100, + from: { + loginid: 'CRMOCK0001', + }, + to: { + loginid, + }, + balance_after: 750, + transaction_id: 17494415479, + transaction_time: 1685855738, + }, + { + action_type: 'transfer', + amount: 200, + from: { + loginid: 'CRWMOCK00042', + }, + to: { + loginid, + }, + balance_after: 650, + transaction_id: 17494117541, + transaction_time: 1685855737, + }, + { + action_type: 'transfer', + amount: 550, + from: { + loginid, + }, + to: { + loginid: 'CRMOCK0001', + }, + balance_after: 450, + transaction_id: 17494117540, + transaction_time: 1685855736, + }, + { + action_type: 'deposit', + amount: 1000, + balance_after: 1000, + transaction_id: 17494117539, + transaction_time: 1685769338, + }, + ]; + + // const { isLoading, isSuccess } = useFetch('statement', { + // options: { keepPreviousData: true }, + // payload: { action_type: }, + // }); + + // TODO: un-comment this code when we're to switch to API data + // const transactions = data?.statement?.transactions?.filter( + // el => + // !!el.action_type && + // ['deposit', 'withdrawal', 'initial_fund', 'reset_balance', 'transfer'].includes(el.action_type) + // ) as TWalletTransaction[]; + + const transactions = useMemo( + () => mock_transactions.filter(el => !action_type || el.action_type === action_type), + [action_type, mock_transactions] + ); + + const getTransferAccountName = useCallback( + (other_account: Exclude) => { + if (other_account.account_category === 'wallet') { + const wallet = wallets?.find(el => el.loginid === other_account.loginid); + return `${wallet?.is_virtual ? 'Demo ' : ''}${wallet?.currency} ${'Wallet'}`; + } + return getTradingAccountName( + other_account.account_type as 'standard' | 'mt5' | 'dxtrade' | 'binary', + !!other_account.is_virtual, + other_account.landing_company_shortcode as 'svg' | 'malta' + ); + }, + [getTradingAccountName, wallets] + ); + + const modified_transactions = useMemo( + () => + wallets && current_wallet + ? transactions + .map(transaction => { + if ( + transaction.amount === undefined || + transaction.balance_after === undefined || + transaction.action_type === undefined + ) + return null; + + let account_category = 'wallet'; + let account_type = current_wallet.account_type; + let account_name = `${current_wallet.is_virtual ? 'Demo ' : ''}${ + current_wallet.currency + } ${'Wallet'}`; + let account_currency = current_wallet.currency; + let gradient_class = current_wallet.gradient_card_class; + let icon = getWalletCurrencyIcon( + current_wallet.is_virtual ? 'demo' : current_wallet.currency || 'USD', + is_dark_mode_on + ); + if (transaction.action_type === 'transfer') { + const other_loginid = + transaction.to?.loginid === loginid + ? transaction.from?.loginid + : transaction.to?.loginid; + if (!other_loginid) return null; + const other_account = accounts.find(el => el?.loginid === other_loginid); + if (!other_account?.currency || !other_account?.account_type) return null; + account_category = other_account.account_category || 'wallet'; + account_currency = other_account.currency; + account_name = getTransferAccountName(other_account); + account_type = other_account.account_type; + gradient_class = `wallet-card__${ + other_account.is_virtual === 1 ? 'demo' : other_account?.currency?.toLowerCase() + }-bg${is_dark_mode_on ? '--dark' : ''}`; + icon = getWalletCurrencyIcon( + other_account.is_virtual ? 'demo' : other_account.currency || '', + is_dark_mode_on, + false + ); + } + const currency_config = getConfig(account_currency || ''); + const is_crypto = currency_config?.is_crypto; + const icon_type = is_crypto || current_wallet.is_virtual ? 'crypto' : 'fiat'; + + return { + ...transaction, + account_category, + account_currency, + account_name, + account_type, + gradient_class, + icon, + icon_type, + }; + }) + .filter((value: T | null): value is T => value !== null) + : [], + [accounts, current_wallet, getConfig, getTransferAccountName, is_dark_mode_on, loginid, transactions, wallets] + ); + + return { transactions: modified_transactions, isLoading: false, isSuccess: true }; +}; + +export default useWalletTransactions; diff --git a/packages/hooks/src/useWalletTransfer.ts b/packages/hooks/src/useWalletTransfer.ts new file mode 100644 index 000000000000..4f769ee57b43 --- /dev/null +++ b/packages/hooks/src/useWalletTransfer.ts @@ -0,0 +1,54 @@ +import { useMemo, useState, useEffect } from 'react'; +import useTransferBetweenAccounts from './useTransferBetweenAccounts'; + +const useWalletTransfer = () => { + const { + active_wallet, + trading_accounts, + wallet_accounts, + isLoading: is_accounts_loading, + } = useTransferBetweenAccounts(); + + const [from_account, setFromAccount] = useState(); + const [to_account, setToAccount] = useState(); + + const to_account_list = useMemo(() => { + if (!from_account?.loginid) return { trading_accounts: {}, wallet_accounts: {} }; + if (!active_wallet?.loginid) return { trading_accounts: {}, wallet_accounts: {} }; + + if (from_account?.loginid === active_wallet?.loginid) { + return { + trading_accounts, + wallet_accounts: Object.fromEntries( + Object.entries(wallet_accounts).filter( + ([key]) => active_wallet?.loginid && !key.includes(active_wallet?.loginid) + ) + ), + }; + } + return { trading_accounts: {}, wallet_accounts: { [active_wallet?.loginid]: active_wallet } }; + }, [active_wallet, from_account?.loginid, trading_accounts, wallet_accounts]); + + //this useEffect populates from/to accounts with updated values, if they were updated in the background + useEffect(() => { + setFromAccount(acc => { + return acc?.loginid ? { ...trading_accounts, ...wallet_accounts }[acc?.loginid] : undefined; + }); + setToAccount(acc => { + return acc?.loginid ? { ...trading_accounts, ...wallet_accounts }[acc?.loginid] : undefined; + }); + }, [setFromAccount, setToAccount, trading_accounts, wallet_accounts]); + + return { + active_wallet, + is_accounts_loading, + from_account, + to_account, + to_account_list, + transfer_accounts: { trading_accounts, wallet_accounts }, + setFromAccount, + setToAccount, + }; +}; + +export default useWalletTransfer; diff --git a/packages/hooks/src/useWalletsList.ts b/packages/hooks/src/useWalletsList.ts new file mode 100644 index 000000000000..470be9990895 --- /dev/null +++ b/packages/hooks/src/useWalletsList.ts @@ -0,0 +1,149 @@ +import { useMemo } from 'react'; +import { useFetch } from '@deriv/api'; +import { useStore } from '@deriv/stores'; +import useAuthorize from './useAuthorize'; +import useCurrencyConfig from './useCurrencyConfig'; + +const currency_to_icon_mapper: Record> = { + Demo: { + dark: 'IcWalletDerivDemoDark', + light: 'IcWalletDerivDemoLight', + }, + USD: { + dark: 'IcWalletCurrencyUsd', + light: 'IcWalletCurrencyUsd', + }, + EUR: { + dark: 'IcWalletCurrencyEur', + light: 'IcWalletCurrencyEur', + }, + AUD: { + dark: 'IcWalletCurrencyAud', + light: 'IcWalletCurrencyAud', + }, + GBP: { + dark: 'IcWalletCurrencyGbp', + light: 'IcWalletCurrencyGbp', + }, + BTC: { + dark: 'IcWalletBitcoinDark', + light: 'IcWalletBitcoinLight', + }, + ETH: { + dark: 'IcWalletEthereumDark', + light: 'IcWalletEthereumLight', + }, + USDT: { + dark: 'IcWalletTetherDark', + light: 'IcWalletTetherLight', + }, + eUSDT: { + dark: 'IcWalletTetherDark', + light: 'IcWalletTetherLight', + }, + tUSDT: { + dark: 'IcWalletTetherDark', + light: 'IcWalletTetherLight', + }, + UST: { + dark: 'IcWalletTetherDark', + light: 'IcWalletTetherLight', + }, + LTC: { + dark: 'IcWalletLiteCoinDark', + light: 'IcWalletLiteCoinLight', + }, + USDC: { + dark: 'IcWalletUsdCoinDark', + light: 'IcWalletUsdCoinLight', + }, +}; + +/** A custom hook to get the list of wallets for the current user. */ +const useWalletsList = () => { + const { ui, client } = useStore(); + const { is_dark_mode_on } = ui; + const { is_authorize } = client; + const { getConfig } = useCurrencyConfig(); + + const { data: authorize_data, isSuccess, ...rest } = useAuthorize(); + const { data: balance_data } = useFetch('balance', { + payload: { account: 'all' }, + options: { enabled: is_authorize && isSuccess }, + }); + + // Filter out non-wallet accounts. + const wallets = useMemo( + () => authorize_data?.account_list?.filter(account => account.account_category === 'wallet'), + [authorize_data?.account_list] + ); + + // Add balance to each wallet. + const wallets_with_balance = useMemo( + () => + wallets?.map(wallet => ({ + ...wallet, + /** Wallet balance */ + balance: balance_data?.balance?.accounts?.[wallet.loginid || '']?.balance || 0, + })), + [balance_data?.balance?.accounts, wallets] + ); + + // Add additional information to each wallet. + const modified_wallets = useMemo(() => { + return wallets_with_balance?.map(wallet => { + const wallet_currency_type = wallet.is_virtual === 1 ? 'Demo' : wallet.currency || ''; + const wallet_gradient_class_name = `${wallet_currency_type.toLowerCase()}-bg${ + is_dark_mode_on ? '--dark' : '' + }`; + const wallet_icon = currency_to_icon_mapper[wallet_currency_type]; + + return { + ...wallet, + /** Indicating whether the wallet is the currently selected wallet. */ + is_selected: wallet.loginid === authorize_data?.loginid, + /** Indicating whether the wallet is a virtual-money wallet. */ + is_demo: wallet.is_virtual === 1, + /** Returns the wallet's currency type. ex: `Demo`, `USD`, etc. */ + wallet_currency_type, + /** Landing company shortcode the account belongs to. */ + landing_company_name: wallet.landing_company_name?.replace('maltainvest', 'malta'), + /** Indicating whether the wallet is a maltainvest wallet. */ + is_malta_wallet: wallet.landing_company_name === 'malta', + /** The gradient class name for the wallet header background. */ + gradient_header_class: `wallet-header__${wallet_gradient_class_name}`, + /** The gradient class name for the wallet card background. */ + gradient_card_class: `wallet-card__${wallet_gradient_class_name}`, + /** Wallet's currency config information */ + currency_config: wallet.currency ? getConfig(wallet.currency) : undefined, + /** Local asset name for the wallet icon. ex: `IcWalletCurrencyUsd` for `USD` */ + icon: is_dark_mode_on ? wallet_icon.dark : wallet_icon.light, + } as const; + }); + }, [getConfig, is_dark_mode_on, authorize_data?.loginid, wallets_with_balance]); + + // Sort wallets alphabetically by fiat, crypto, then virtual. + const sorted_wallets = useMemo(() => { + if (!modified_wallets) return []; + + return [...modified_wallets].sort((a, b) => { + if (a.is_virtual !== b.is_virtual) { + return a.is_virtual ? 1 : -1; + } else if (a.currency_config?.is_crypto !== b.currency_config?.is_crypto) { + return a.currency_config?.is_crypto ? 1 : -1; + } + + return (a.currency || 'USD').localeCompare(b.currency || 'USD'); + }); + }, [modified_wallets]); + + return { + /** List of wallets for current user. */ + data: sorted_wallets, + /** Indicating whether the user has a wallet */ + has_wallet: sorted_wallets && sorted_wallets.length > 0, + ...rest, + }; +}; + +export default useWalletsList; diff --git a/packages/p2p/crowdin/messages.json b/packages/p2p/crowdin/messages.json index c3d479632ced..1ee989577557 100644 --- a/packages/p2p/crowdin/messages.json +++ b/packages/p2p/crowdin/messages.json @@ -1 +1 @@ -{"6794664":"Ads that match your Deriv P2P balance and limit.","19789721":"Nobody has blocked you. Yay!","24711354":"Total orders <0>30d | <1>lifetime","47573834":"Fixed rate (1 {{account_currency}})","50672601":"Bought","51881712":"You already have an ad with the same exchange rate for this currency pair and order type.

Please set a different rate for your ad.","55916349":"All","68867477":"Order ID {{ id }}","81450871":"We couldn’t find that page","121738739":"Send","122280248":"Avg release time <0>30d","134205943":"Your ads with fixed rates have been deactivated. Set floating rates to reactivate them.","140800401":"Float","145959105":"Choose a nickname","150156106":"Save changes","159757877":"You won't see {{advertiser_name}}'s ads anymore and they won't be able to place orders on your ads.","170072126":"Seen {{ duration }} days ago","173939998":"Avg. pay time <0>30d","197477687":"Edit {{ad_type}} ad","203271702":"Try again","231473252":"Preferred currency","233677840":"of the market rate","246815378":"Once set, your nickname cannot be changed.","276261353":"Avg pay time <0>30d","277542386":"Please use <0>live chat to contact our Customer Support team for help.","316725580":"You can no longer rate this transaction.","323002325":"Post ad","324970564":"Seller's contact details","338910048":"You will appear to other users as","358133589":"Unblock {{advertiser_name}}?","364681129":"Contact details","367579676":"Blocked","392469164":"You have blocked {{advertiser_name}}.","416167062":"You'll receive","424668491":"expired","439264204":"Please set a different minimum and/or maximum order limit.

The range of your ad should not overlap with any of your active ads.","452752527":"Rate (1 {{ currency }})","459886707":"E-wallets","460477293":"Enter message","464044457":"Buyer's nickname","473688701":"Enter a valid amount","476023405":"Didn't receive the email?","488150742":"Resend email","498500965":"Seller's nickname","500514593":"Hide my ads","501523417":"You have no orders.","517202770":"Set fixed rate","523301614":"Release {{amount}} {{currency}}","525380157":"Buy {{offered_currency}} order","531912261":"Bank name, account number, beneficiary name","554135844":"Edit","555447610":"You won't be able to change your buy and sell limits again after this. Do you want to continue?","560402954":"User rating","565060416":"Exchange rate","580715136":"Please register with us!","587882987":"Advertisers","611376642":"Clear","612069973":"Would you recommend this buyer?","628581263":"The {{local_currency}} market rate has changed.","639382772":"Please upload supported file type.","649549724":"I’ve not received any payment.","654193846":"The verification link appears to be invalid. Hit the button below to request for a new one","655733440":"Others","661808069":"Resend email {{remaining_time}}","662578726":"Available","683273691":"Rate (1 {{ account_currency }})","723172934":"Looking to buy or sell USD? You can post your own ad for others to respond.","728383001":"I’ve received more than the agreed amount.","733311523":"P2P transactions are locked. This feature is not available for payment agents.","767789372":"Wait for payment","782834680":"Time left","783454335":"Yes, remove","830703311":"My profile","834075131":"Blocked advertisers","838024160":"Bank details","842911528":"Don’t show this message again.","846659545":"Your ad is not listed on <0>Buy/Sell because the amount exceeds your daily limit of {{limit}} {{currency}}.\n <1 /><1 />You can still see your ad on <0>My ads. If you’d like to increase your daily limit, please contact us via <2>live chat.","847028402":"Check your email","858027714":"Seen {{ duration }} minutes ago","873437248":"Instructions (optional)","876086855":"Complete the financial assessment form","881351325":"Would you recommend this seller?","887667868":"Order","892431976":"If you cancel your order {{cancellation_limit}} times in {{cancellation_period}} hours, you will be blocked from using Deriv P2P for {{block_duration}} hours.
({{number_of_cancels_remaining}} cancellations remaining)","947389294":"We need your documents","949859957":"Submit","954233511":"Sold","957529514":"To place an order, add one of the advertiser’s preferred payment methods:","957807235":"Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.","988380202":"Your instructions","1001160515":"Sell","1002264993":"Seller's real name","1020552673":"You're creating an ad to buy <0>{{ target_amount }} {{ target_currency }}...","1030390916":"You already have an ad with this range","1035893169":"Delete","1052094244":"Max order","1056821534":"Are you sure?","1057127276":"{{- avg_release_time_in_minutes}} min","1065551550":"Set floating rate","1080990424":"Confirm","1089110190":"You accidentally gave us another email address (usually a work or a personal one instead of the one you meant).","1091533736":"Don't risk your funds with cash transactions. Use bank transfers or e-wallets instead.","1106073960":"You've created an ad","1106485202":"Available Deriv P2P balance","1109217274":"Success!","1119887091":"Verification","1121630246":"Block","1137964885":"Can only contain letters, numbers, and special characters .- _ @.","1151608942":"Total amount","1157877436":"{{field_name}} should not exceed Amount","1161621759":"Choose your nickname","1162965175":"Buyer","1163072833":"<0>ID verified","1164771858":"I’ve received payment from 3rd party.","1191941618":"Enter a value that's within -{{limit}}% to +{{limit}}%","1192337383":"Seen {{ duration }} hour ago","1202500203":"Pay now","1228352589":"Not rated yet","1229976478":"You will be able to see {{ advertiser_name }}'s ads. They'll be able to place orders on your ads, too.","1236083813":"Your payment details","1258285343":"Oops, something went wrong","1265751551":"Deriv P2P Balance","1286797620":"Active","1287051975":"Nickname is too long","1300767074":"{{name}} is no longer on Deriv P2P","1303016265":"Yes","1313218101":"Rate this transaction","1314266187":"Joined today","1320670806":"Leave page","1326475003":"Activate","1328352136":"Sell {{ account_currency }}","1330528524":"Seen {{ duration }} month ago","1337027601":"You sold {{offered_amount}} {{offered_currency}}","1347322213":"How would you rate this transaction?","1347724133":"I have paid {{amount}} {{currency}}.","1366244749":"Limits","1370999551":"Floating rate","1371193412":"Cancel","1381949324":"<0>Address verified","1398938904":"We can't deliver the email to this address (usually because of firewalls or filtering).","1422356389":"No results for \"{{text}}\".","1430413419":"Maximum is {{value}} {{currency}}","1438103743":"Floating rates are enabled for {{local_currency}}. Ads with fixed rates will be deactivated. Switch to floating rates by {{end_date}}.","1448855725":"Add payment methods","1452260922":"Too many failed attempts","1467483693":"Past orders","1474532322":"Sort by","1480915523":"Skip","1497156292":"No ads for this currency 😞","1505293001":"Trade partners","1568512719":"Your daily limits have been increased to {{daily_buy_limit}} {{currency}} (buy) and {{daily_sell_limit}} {{currency}} (sell).","1583335572":"If the ad doesn't receive an order for {{adverts_archive_period}} days, it will be deactivated.","1587250288":"Ad ID {{advert_id}} ","1607051458":"Search by nickname","1612595358":"Cannot upload a file over 2MB","1615530713":"Something's not right","1620858613":"You're editing an ad to sell <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","1623916605":"I wasn’t able to make full payment.","1654365787":"Unknown","1660278694":"The advertiser changed the rate before you confirmed the order.","1671725772":"If you choose to cancel, the edited details will be lost.","1675716253":"Min limit","1678804253":"Buy {{ currency }}","1685888862":"An internal error occurred","1691540875":"Edit payment method","1703154819":"You're editing an ad to sell <0>{{ target_amount }} {{ target_currency }}...","1721422292":"Show my real name","1734661732":"Your DP2P balance is {{ dp2p_balance }}","1747523625":"Go back","1752096323":"{{field_name}} should not be below Min limit","1767817594":"Buy completion <0>30d","1784151356":"at","1791767028":"Set a fixed rate for your ad.","1794470010":"I’ve made full payment, but the seller hasn’t released the funds.","1794474847":"I've received payment","1798116519":"Available amount","1809099720":"Expand all","1810217569":"Please refresh this page to continue.","1842172737":"You've received {{offered_amount}} {{offered_currency}}","1848044659":"You have no ads.","1859308030":"Give feedback","1874956952":"Hit the button below to add payment methods.","1902229457":"Unable to block advertiser","1908023954":"Sorry, an error occurred while processing your request.","1923443894":"Inactive","1928240840":"Sell {{ currency }}","1929119945":"There are no ads yet","1976156928":"You'll send","1992961867":"Rate (1 {{currency}})","1994023526":"The email address you entered had a mistake or typo (happens to the best of us).","2020104747":"Filter","2029375371":"Payment instructions","2032274854":"Recommended by {{recommended_count}} traders","2039361923":"You're creating an ad to sell...","2040110829":"Increase my limits","2060873863":"Your order {{order_id}} is complete","2063890788":"Cancelled","2091671594":"Status","2096014107":"Apply","2104905634":"No one has recommended this trader yet","2108340400":"Hello! This is where you can chat with the counterparty to confirm the order details.nNote: In case of a dispute, we'll use this chat as a reference.","2121837513":"Minimum is {{value}} {{currency}}","2142425493":"Ad ID","2142752968":"Please ensure you've received {{amount}} {{local_currency}} in your account and hit Confirm to complete the transaction.","2145292295":"Rate","-1837059346":"Buy / Sell","-1845037007":"Advertiser's page","-494667560":"Orders","-679691613":"My ads","-526636259":"Error 404","-1540251249":"Buy {{ account_currency }}","-1267880283":"{{field_name}} is required","-2019083683":"{{field_name}} can only include letters, numbers, spaces, and any of these symbols: -+.,'#@():;","-222920564":"{{field_name}} has exceeded maximum length","-2093768906":"{{name}} has released your funds.
Would you like to give your feedback?","-857786650":"Check your verification status.","-612892886":"We’ll need you to upload your documents to verify your identity.","-2090325029":"Identity verification is complete.","-1101273282":"Nickname is required","-919203928":"Nickname is too short","-1907100457":"Cannot start, end with, or repeat special characters.","-270502067":"Cannot repeat a character more than 4 times.","-499872405":"You have open orders for this ad. Complete all open orders before deleting this ad.","-2125702445":"Instructions","-1274358564":"Max limit","-1995606668":"Amount","-1965472924":"Fixed rate","-1081775102":"{{field_name}} should not be below Max limit","-885044836":"{{field_name}} should not exceed Max limit","-1921077416":"All ({{list_value}})","-608125128":"Blocked ({{list_value}})","-1764050750":"Payment details","-2021135479":"This field is required.","-2005205076":"{{field_name}} has exceeded maximum length of 200 characters.","-480724783":"You already have an ad with this rate","-1117584385":"Seen more than 6 months ago","-1766199849":"Seen {{ duration }} months ago","-591593016":"Seen {{ duration }} day ago","-1586918919":"Seen {{ duration }} hours ago","-664781013":"Seen {{ duration }} minute ago","-1717650468":"Online","-1948369500":"File uploaded is not supported","-1207312691":"Completed","-688728873":"Expired","-1951641340":"Under dispute","-1738697484":"Confirm payment","-1611857550":"Waiting for the seller to confirm","-1452684930":"Buyer's real name","-1597110099":"Receive","-892663026":"Your contact details","-1875343569":"Seller's payment details","-92830427":"Seller's instructions","-1940034707":"Buyer's instructions","-471384801":"Sorry, we're unable to increase your limits right now. Please try again in a few minutes.","-329713179":"Ok","-231863107":"No","-150224710":"Yes, continue","-205277874":"Your ad is not listed on Buy/Sell because its minimum order is higher than your Deriv P2P available balance ({{balance}} {{currency}}).","-971817673":"Your ad isn't visible to others","-1735126907":"This could be because your account balance is insufficient, your ad amount exceeds your daily limit, or both. You can still see your ad on <0>My ads.","-674715853":"Your ad exceeds the daily limit","-1530773708":"Block {{advertiser_name}}?","-1689905285":"Unblock","-2035037071":"Your Deriv P2P balance isn't enough. Please increase your balance before trying again.","-412680608":"Add payment method","-293182503":"Cancel adding this payment method?","-1850127397":"If you choose to cancel, the details you’ve entered will be lost.","-1601971804":"Cancel your edits?","-1571737200":"Don't cancel","-1072444041":"Update ad","-1088454544":"Get new link","-2124584325":"We've verified your order","-848068683":"Hit the link in the email we sent you to authorise this transaction.","-1238182882":"The link will expire in 10 minutes.","-142727028":"The email is in your spam folder (sometimes things get lost there).","-1306639327":"Payment methods","-227512949":"Check your spelling or use a different term.","-1554938377":"Search payment method","-1285759343":"Search","-75934135":"Matching ads","-1856204727":"Reset","-1728351486":"Invalid verification link","-433946201":"Leave page?","-818345434":"Are you sure you want to leave this page? Changes made will not be saved.","-392043307":"Do you want to delete this ad?","-854930519":"You will NOT be able to restore it.","-1600783504":"Set a floating rate for your ad.","-2008992756":"Do you want to cancel this order?","-1618084450":"If you cancel this order, you'll be blocked from using Deriv P2P for {{block_duration}} hours.","-2026176944":"Please do not cancel if you have already made payment.","-1989544601":"Cancel this order","-492996224":"Do not cancel","-1447732068":"Payment confirmation","-1951344681":"Please make sure that you've paid {{amount}} {{currency}} to {{other_user_name}}, and upload the receipt as proof of your payment","-919988505":"We accept JPG, PDF, or PNG (up to 2MB).","-670364940":"Upload receipt here","-937707753":"Go Back","-984140537":"Add","-1220275347":"You may choose up to 3 payment methods for this ad.","-1340125291":"Done","-510341549":"I’ve received less than the agreed amount.","-650030360":"I’ve paid more than the agreed amount.","-1192446042":"If your complaint isn't listed here, please contact our Customer Support team.","-573132778":"Complaint","-792338456":"What's your complaint?","-418870584":"Cancel order","-1392383387":"I've paid","-727273667":"Complain","-2016990049":"Sell {{offered_currency}} order","-811190405":"Time","-961632398":"Collapse all","-415476028":"Not rated","-26434257":"You have until {{remaining_review_time}} GMT to rate this transaction.","-768709492":"Your transaction experience","-652933704":"Recommended","-84139378":"Not Recommended","-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","-1660552437":"Return to P2P","-849068301":"Loading...","-2061807537":"Something’s not right","-1354983065":"Refresh","-137444201":"Buy","-904197848":"Limits {{min_order_amount_limit_display}}-{{max_order_amount_limit_display}} {{currency}}","-464361439":"{{- avg_buy_time_in_minutes}} min","-2109576323":"Sell completion <0>30d","-165392069":"Avg. release time <0>30d","-1154208372":"Trade volume <0>30d","-1887970998":"Unblocking wasn't possible as {{name}} is not using Deriv P2P anymore.","-2017825013":"Got it","-1070228546":"Joined {{days_since_joined}}d","-2015102262":"({{number_of_ratings}} rating)","-1412298133":"({{number_of_ratings}} ratings)","-260332243":"{{user_blocked_count}} person has blocked you","-117094654":"{{user_blocked_count}} people have blocked you","-1148912768":"If the market rate changes from the rate shown here, we won't be able to process your order.","-55126326":"Seller","-835196958":"Receive payment to","-1218007718":"You may choose up to 3.","-1933432699":"Enter {{transaction_type}} amount","-2021730616":"{{ad_type}}","-490637584":"Limit: {{min}}–{{max}} {{currency}}","-1974067943":"Your bank details","-1657433201":"There are no matching ads.","-1862812590":"Limits {{ min_order }}–{{ max_order }} {{ currency }}","-375836822":"Buy {{account_currency}}","-1035421133":"Sell {{account_currency}}","-1503997652":"No ads for this currency.","-1048001140":"No results for \"{{value}}\".","-1179827369":"Create new ad","-73663931":"Create ad","-141315849":"No ads for this currency at the moment 😞","-1889014820":"<0>Don’t see your payment method? <1>Add new.","-1406830100":"Payment method","-1561775203":"Buy {{currency}}","-1527285935":"Sell {{currency}}","-592818187":"Your Deriv P2P balance is {{ dp2p_balance }}","-1654157453":"Fixed rate (1 {{currency}})","-379708059":"Min order","-1459289144":"This information will be visible to everyone.","-207756259":"You may tap and choose up to 3.","-1282343703":"You're creating an ad to buy <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-2139632895":"You're creating an ad to sell <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-40669120":"You're creating an ad to sell <0>{{ target_amount }} {{ target_currency }}...","-514789442":"You're creating an ad to buy...","-230677679":"{{text}}","-1914431773":"You're editing an ad to buy <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-107996509":"You're editing an ad to buy <0>{{ target_amount }} {{ target_currency }}...","-863580260":"You're editing an ad to buy...","-1396464057":"You're editing an ad to sell...","-372210670":"Rate (1 {{account_currency}})","-1318334333":"Deactivate","-1667041441":"Rate (1 {{ offered_currency }})","-1886565882":"Your ads with floating rates have been deactivated. Set fixed rates to reactivate them.","-792015701":"Deriv P2P cashier is unavailable in your country.","-1241719539":"When you block someone, you won't see their ads, and they can't see yours. Your ads will be hidden from their search results, too.","-1007339977":"There are no matching name.","-1298666786":"My counterparties","-179005984":"Save","-2059312414":"Ad details","-1769584466":"Stats","-808161760":"Deriv P2P balance = deposits that can’t be reversed","-684271315":"OK","-2090878601":"Daily limit","-474123616":"Want to increase your daily limits to <0>{{max_daily_buy}} {{currency}} (buy) and <1>{{max_daily_sell}} {{currency}} (sell)?","-130547447":"Trade volume <0>30d | <1>lifetime","-1792280476":"Choose your payment method","-383030149":"You haven’t added any payment methods yet","-1156559889":"Bank Transfers","-1269362917":"Add new","-1983512566":"This conversation is closed.","-283017497":"Retry","-979459594":"Buy/Sell","-2052184983":"Order ID","-2096350108":"Counterparty","-750202930":"Active orders","-1626659964":"I've received {{amount}} {{currency}}.","-1638172550":"To enable this feature you must complete the following:","-1086586743":"Please submit your <0>proof of address. You can use Deriv P2P after we’ve verified your documents.","-559300364":"Your Deriv P2P cashier is blocked","-740038242":"Your rate is","-146021156":"Delete {{payment_method_name}}?","-1846700504":"Are you sure you want to remove this payment method?","-1422779483":"That payment method cannot be deleted","-532709160":"Your nickname","-237014436":"Recommended by {{recommended_count}} trader","-2054589794":"You've been temporarily barred from using our services due to multiple cancellation attempts. Try again after {{date_time}} GMT.","-1079963355":"trades","-930400128":"To use Deriv P2P, you need to choose a display name (a nickname) and verify your identity.","-992568889":"No one to show here"} \ No newline at end of file +{"6794664":"Ads that match your Deriv P2P balance and limit.","19789721":"Nobody has blocked you. Yay!","24711354":"Total orders <0>30d | <1>lifetime","47573834":"Fixed rate (1 {{account_currency}})","50672601":"Bought","51881712":"You already have an ad with the same exchange rate for this currency pair and order type.

Please set a different rate for your ad.","55916349":"All","68867477":"Order ID {{ id }}","81450871":"We couldn’t find that page","121738739":"Send","122280248":"Avg release time <0>30d","134205943":"Your ads with fixed rates have been deactivated. Set floating rates to reactivate them.","140800401":"Float","145959105":"Choose a nickname","150156106":"Save changes","159757877":"You won't see {{advertiser_name}}'s ads anymore and they won't be able to place orders on your ads.","170072126":"Seen {{ duration }} days ago","173939998":"Avg. pay time <0>30d","197477687":"Edit {{ad_type}} ad","203271702":"Try again","231473252":"Preferred currency","233677840":"of the market rate","246815378":"Once set, your nickname cannot be changed.","276261353":"Avg pay time <0>30d","277542386":"Please use <0>live chat to contact our Customer Support team for help.","316725580":"You can no longer rate this transaction.","323002325":"Post ad","324970564":"Seller's contact details","338910048":"You will appear to other users as","358133589":"Unblock {{advertiser_name}}?","364681129":"Contact details","367579676":"Blocked","392469164":"You have blocked {{advertiser_name}}.","416167062":"You'll receive","424668491":"expired","439264204":"Please set a different minimum and/or maximum order limit.

The range of your ad should not overlap with any of your active ads.","452752527":"Rate (1 {{ currency }})","459886707":"E-wallets","460477293":"Enter message","464044457":"Buyer's nickname","473688701":"Enter a valid amount","476023405":"Didn't receive the email?","488150742":"Resend email","498500965":"Seller's nickname","500514593":"Hide my ads","501523417":"You have no orders.","517202770":"Set fixed rate","523301614":"Release {{amount}} {{currency}}","525380157":"Buy {{offered_currency}} order","531912261":"Bank name, account number, beneficiary name","554135844":"Edit","555447610":"You won't be able to change your buy and sell limits again after this. Do you want to continue?","560402954":"User rating","565060416":"Exchange rate","580715136":"Please register with us!","587882987":"Advertisers","611376642":"Clear","612069973":"Would you recommend this buyer?","628581263":"The {{local_currency}} market rate has changed.","639382772":"Please upload supported file type.","649549724":"I’ve not received any payment.","654193846":"The verification link appears to be invalid. Hit the button below to request for a new one","655733440":"Others","661808069":"Resend email {{remaining_time}}","662578726":"Available","683273691":"Rate (1 {{ account_currency }})","723172934":"Looking to buy or sell USD? You can post your own ad for others to respond.","728383001":"I’ve received more than the agreed amount.","733311523":"P2P transactions are locked. This feature is not available for payment agents.","767789372":"Wait for payment","782834680":"Time left","783454335":"Yes, remove","830703311":"My profile","834075131":"Blocked advertisers","838024160":"Bank details","842911528":"Don’t show this message again.","846659545":"Your ad is not listed on <0>Buy/Sell because the amount exceeds your daily limit of {{limit}} {{currency}}.\n <1 /><1 />You can still see your ad on <0>My ads. If you’d like to increase your daily limit, please contact us via <2>live chat.","847028402":"Check your email","858027714":"Seen {{ duration }} minutes ago","873437248":"Instructions (optional)","876086855":"Complete the financial assessment form","881351325":"Would you recommend this seller?","887667868":"Order","892431976":"If you cancel your order {{cancellation_limit}} times in {{cancellation_period}} hours, you will be blocked from using Deriv P2P for {{block_duration}} hours.
({{number_of_cancels_remaining}} cancellations remaining)","947389294":"We need your documents","949859957":"Submit","954233511":"Sold","957529514":"To place an order, add one of the advertiser’s preferred payment methods:","957807235":"Blocking wasn't possible as {{name}} is not using Deriv P2P anymore.","988380202":"Your instructions","1001160515":"Sell","1002264993":"Seller's real name","1020552673":"You're creating an ad to buy <0>{{ target_amount }} {{ target_currency }}...","1030390916":"You already have an ad with this range","1035893169":"Delete","1052094244":"Max order","1056821534":"Are you sure?","1057127276":"{{- avg_release_time_in_minutes}} min","1065551550":"Set floating rate","1080990424":"Confirm","1089110190":"You accidentally gave us another email address (usually a work or a personal one instead of the one you meant).","1091533736":"Don't risk your funds with cash transactions. Use bank transfers or e-wallets instead.","1106073960":"You've created an ad","1106485202":"Available Deriv P2P balance","1109217274":"Success!","1119887091":"Verification","1121630246":"Block","1137964885":"Can only contain letters, numbers, and special characters .- _ @.","1151608942":"Total amount","1157877436":"{{field_name}} should not exceed Amount","1161621759":"Choose your nickname","1162965175":"Buyer","1163072833":"<0>ID verified","1164771858":"I’ve received payment from 3rd party.","1191941618":"Enter a value that's within -{{limit}}% to +{{limit}}%","1192337383":"Seen {{ duration }} hour ago","1202500203":"Pay now","1228352589":"Not rated yet","1229976478":"You will be able to see {{ advertiser_name }}'s ads. They'll be able to place orders on your ads, too.","1236083813":"Your payment details","1258285343":"Oops, something went wrong","1265751551":"Deriv P2P Balance","1286797620":"Active","1287051975":"Nickname is too long","1300767074":"{{name}} is no longer on Deriv P2P","1303016265":"Yes","1313218101":"Rate this transaction","1314266187":"Joined today","1320670806":"Leave page","1326475003":"Activate","1328352136":"Sell {{ account_currency }}","1330528524":"Seen {{ duration }} month ago","1337027601":"You sold {{offered_amount}} {{offered_currency}}","1347322213":"How would you rate this transaction?","1347724133":"I have paid {{amount}} {{currency}}.","1366244749":"Limits","1370999551":"Floating rate","1371193412":"Cancel","1381949324":"<0>Address verified","1398938904":"We can't deliver the email to this address (usually because of firewalls or filtering).","1422356389":"No results for \"{{text}}\".","1430413419":"Maximum is {{value}} {{currency}}","1438103743":"Floating rates are enabled for {{local_currency}}. Ads with fixed rates will be deactivated. Switch to floating rates by {{end_date}}.","1448855725":"Add payment methods","1452260922":"Too many failed attempts","1467483693":"Past orders","1474532322":"Sort by","1480915523":"Skip","1497156292":"No ads for this currency 😞","1505293001":"Trade partners","1568512719":"Your daily limits have been increased to {{daily_buy_limit}} {{currency}} (buy) and {{daily_sell_limit}} {{currency}} (sell).","1583335572":"If the ad doesn't receive an order for {{adverts_archive_period}} days, it will be deactivated.","1587250288":"Ad ID {{advert_id}} ","1607051458":"Search by nickname","1615530713":"Something's not right","1620858613":"You're editing an ad to sell <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","1623916605":"I wasn’t able to make full payment.","1654365787":"Unknown","1660278694":"The advertiser changed the rate before you confirmed the order.","1671725772":"If you choose to cancel, the edited details will be lost.","1675716253":"Min limit","1678804253":"Buy {{ currency }}","1685888862":"An internal error occurred","1691540875":"Edit payment method","1699829275":"Cannot upload a file over 5MB","1703154819":"You're editing an ad to sell <0>{{ target_amount }} {{ target_currency }}...","1721422292":"Show my real name","1734661732":"Your DP2P balance is {{ dp2p_balance }}","1747523625":"Go back","1752096323":"{{field_name}} should not be below Min limit","1767817594":"Buy completion <0>30d","1784151356":"at","1791767028":"Set a fixed rate for your ad.","1794470010":"I’ve made full payment, but the seller hasn’t released the funds.","1794474847":"I've received payment","1798116519":"Available amount","1809099720":"Expand all","1810217569":"Please refresh this page to continue.","1842172737":"You've received {{offered_amount}} {{offered_currency}}","1848044659":"You have no ads.","1859308030":"Give feedback","1874956952":"Hit the button below to add payment methods.","1902229457":"Unable to block advertiser","1908023954":"Sorry, an error occurred while processing your request.","1923443894":"Inactive","1928240840":"Sell {{ currency }}","1929119945":"There are no ads yet","1976156928":"You'll send","1992961867":"Rate (1 {{currency}})","1994023526":"The email address you entered had a mistake or typo (happens to the best of us).","2020104747":"Filter","2029375371":"Payment instructions","2032274854":"Recommended by {{recommended_count}} traders","2039361923":"You're creating an ad to sell...","2040110829":"Increase my limits","2060873863":"Your order {{order_id}} is complete","2063890788":"Cancelled","2064304887":"We accept JPG, PDF, or PNG (up to 5MB).","2091671594":"Status","2096014107":"Apply","2104905634":"No one has recommended this trader yet","2108340400":"Hello! This is where you can chat with the counterparty to confirm the order details.nNote: In case of a dispute, we'll use this chat as a reference.","2121837513":"Minimum is {{value}} {{currency}}","2142425493":"Ad ID","2142752968":"Please ensure you've received {{amount}} {{local_currency}} in your account and hit Confirm to complete the transaction.","2145292295":"Rate","-1837059346":"Buy / Sell","-1845037007":"Advertiser's page","-494667560":"Orders","-679691613":"My ads","-526636259":"Error 404","-1540251249":"Buy {{ account_currency }}","-1267880283":"{{field_name}} is required","-2019083683":"{{field_name}} can only include letters, numbers, spaces, and any of these symbols: -+.,'#@():;","-222920564":"{{field_name}} has exceeded maximum length","-2093768906":"{{name}} has released your funds.
Would you like to give your feedback?","-857786650":"Check your verification status.","-612892886":"We’ll need you to upload your documents to verify your identity.","-2090325029":"Identity verification is complete.","-1101273282":"Nickname is required","-919203928":"Nickname is too short","-1907100457":"Cannot start, end with, or repeat special characters.","-270502067":"Cannot repeat a character more than 4 times.","-499872405":"You have open orders for this ad. Complete all open orders before deleting this ad.","-2125702445":"Instructions","-1274358564":"Max limit","-1995606668":"Amount","-1965472924":"Fixed rate","-1081775102":"{{field_name}} should not be below Max limit","-885044836":"{{field_name}} should not exceed Max limit","-1921077416":"All ({{list_value}})","-608125128":"Blocked ({{list_value}})","-1764050750":"Payment details","-2021135479":"This field is required.","-2005205076":"{{field_name}} has exceeded maximum length of 200 characters.","-480724783":"You already have an ad with this rate","-1117584385":"Seen more than 6 months ago","-1766199849":"Seen {{ duration }} months ago","-591593016":"Seen {{ duration }} day ago","-1586918919":"Seen {{ duration }} hours ago","-664781013":"Seen {{ duration }} minute ago","-1717650468":"Online","-1948369500":"File uploaded is not supported","-1207312691":"Completed","-688728873":"Expired","-1951641340":"Under dispute","-1738697484":"Confirm payment","-1611857550":"Waiting for the seller to confirm","-1452684930":"Buyer's real name","-1597110099":"Receive","-892663026":"Your contact details","-1875343569":"Seller's payment details","-92830427":"Seller's instructions","-1940034707":"Buyer's instructions","-471384801":"Sorry, we're unable to increase your limits right now. Please try again in a few minutes.","-329713179":"Ok","-231863107":"No","-150224710":"Yes, continue","-205277874":"Your ad is not listed on Buy/Sell because its minimum order is higher than your Deriv P2P available balance ({{balance}} {{currency}}).","-971817673":"Your ad isn't visible to others","-1735126907":"This could be because your account balance is insufficient, your ad amount exceeds your daily limit, or both. You can still see your ad on <0>My ads.","-674715853":"Your ad exceeds the daily limit","-1530773708":"Block {{advertiser_name}}?","-1689905285":"Unblock","-2035037071":"Your Deriv P2P balance isn't enough. Please increase your balance before trying again.","-412680608":"Add payment method","-293182503":"Cancel adding this payment method?","-1850127397":"If you choose to cancel, the details you’ve entered will be lost.","-1601971804":"Cancel your edits?","-1571737200":"Don't cancel","-1072444041":"Update ad","-1088454544":"Get new link","-2124584325":"We've verified your order","-848068683":"Hit the link in the email we sent you to authorise this transaction.","-1238182882":"The link will expire in 10 minutes.","-142727028":"The email is in your spam folder (sometimes things get lost there).","-1306639327":"Payment methods","-227512949":"Check your spelling or use a different term.","-1554938377":"Search payment method","-1285759343":"Search","-75934135":"Matching ads","-1856204727":"Reset","-1728351486":"Invalid verification link","-433946201":"Leave page?","-818345434":"Are you sure you want to leave this page? Changes made will not be saved.","-392043307":"Do you want to delete this ad?","-854930519":"You will NOT be able to restore it.","-1600783504":"Set a floating rate for your ad.","-2008992756":"Do you want to cancel this order?","-1618084450":"If you cancel this order, you'll be blocked from using Deriv P2P for {{block_duration}} hours.","-2026176944":"Please do not cancel if you have already made payment.","-1989544601":"Cancel this order","-492996224":"Do not cancel","-1447732068":"Payment confirmation","-1951344681":"Please make sure that you've paid {{amount}} {{currency}} to {{other_user_name}}, and upload the receipt as proof of your payment","-670364940":"Upload receipt here","-937707753":"Go Back","-984140537":"Add","-1220275347":"You may choose up to 3 payment methods for this ad.","-1340125291":"Done","-510341549":"I’ve received less than the agreed amount.","-650030360":"I’ve paid more than the agreed amount.","-1192446042":"If your complaint isn't listed here, please contact our Customer Support team.","-573132778":"Complaint","-792338456":"What's your complaint?","-418870584":"Cancel order","-1392383387":"I've paid","-727273667":"Complain","-2016990049":"Sell {{offered_currency}} order","-811190405":"Time","-961632398":"Collapse all","-415476028":"Not rated","-26434257":"You have until {{remaining_review_time}} GMT to rate this transaction.","-768709492":"Your transaction experience","-652933704":"Recommended","-84139378":"Not Recommended","-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","-1660552437":"Return to P2P","-849068301":"Loading...","-2061807537":"Something’s not right","-1354983065":"Refresh","-137444201":"Buy","-904197848":"Limits {{min_order_amount_limit_display}}-{{max_order_amount_limit_display}} {{currency}}","-464361439":"{{- avg_buy_time_in_minutes}} min","-2109576323":"Sell completion <0>30d","-165392069":"Avg. release time <0>30d","-1154208372":"Trade volume <0>30d","-1887970998":"Unblocking wasn't possible as {{name}} is not using Deriv P2P anymore.","-2017825013":"Got it","-1070228546":"Joined {{days_since_joined}}d","-2015102262":"({{number_of_ratings}} rating)","-1412298133":"({{number_of_ratings}} ratings)","-260332243":"{{user_blocked_count}} person has blocked you","-117094654":"{{user_blocked_count}} people have blocked you","-1148912768":"If the market rate changes from the rate shown here, we won't be able to process your order.","-55126326":"Seller","-835196958":"Receive payment to","-1218007718":"You may choose up to 3.","-1933432699":"Enter {{transaction_type}} amount","-2021730616":"{{ad_type}}","-490637584":"Limit: {{min}}–{{max}} {{currency}}","-1974067943":"Your bank details","-1657433201":"There are no matching ads.","-1862812590":"Limits {{ min_order }}–{{ max_order }} {{ currency }}","-375836822":"Buy {{account_currency}}","-1035421133":"Sell {{account_currency}}","-1503997652":"No ads for this currency.","-1048001140":"No results for \"{{value}}\".","-1179827369":"Create new ad","-73663931":"Create ad","-141315849":"No ads for this currency at the moment 😞","-1889014820":"<0>Don’t see your payment method? <1>Add new.","-1406830100":"Payment method","-1561775203":"Buy {{currency}}","-1527285935":"Sell {{currency}}","-592818187":"Your Deriv P2P balance is {{ dp2p_balance }}","-1654157453":"Fixed rate (1 {{currency}})","-379708059":"Min order","-1459289144":"This information will be visible to everyone.","-207756259":"You may tap and choose up to 3.","-1282343703":"You're creating an ad to buy <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-2139632895":"You're creating an ad to sell <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-40669120":"You're creating an ad to sell <0>{{ target_amount }} {{ target_currency }}...","-514789442":"You're creating an ad to buy...","-230677679":"{{text}}","-1914431773":"You're editing an ad to buy <0>{{ target_amount }} {{ target_currency }} for <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})","-107996509":"You're editing an ad to buy <0>{{ target_amount }} {{ target_currency }}...","-863580260":"You're editing an ad to buy...","-1396464057":"You're editing an ad to sell...","-372210670":"Rate (1 {{account_currency}})","-1318334333":"Deactivate","-1667041441":"Rate (1 {{ offered_currency }})","-1886565882":"Your ads with floating rates have been deactivated. Set fixed rates to reactivate them.","-792015701":"Deriv P2P cashier is unavailable in your country.","-1241719539":"When you block someone, you won't see their ads, and they can't see yours. Your ads will be hidden from their search results, too.","-1007339977":"There are no matching name.","-1298666786":"My counterparties","-179005984":"Save","-2059312414":"Ad details","-1769584466":"Stats","-808161760":"Deriv P2P balance = deposits that can’t be reversed","-684271315":"OK","-2090878601":"Daily limit","-474123616":"Want to increase your daily limits to <0>{{max_daily_buy}} {{currency}} (buy) and <1>{{max_daily_sell}} {{currency}} (sell)?","-130547447":"Trade volume <0>30d | <1>lifetime","-1792280476":"Choose your payment method","-383030149":"You haven’t added any payment methods yet","-1156559889":"Bank Transfers","-1269362917":"Add new","-1983512566":"This conversation is closed.","-283017497":"Retry","-979459594":"Buy/Sell","-2052184983":"Order ID","-2096350108":"Counterparty","-750202930":"Active orders","-1626659964":"I've received {{amount}} {{currency}}.","-1638172550":"To enable this feature you must complete the following:","-1086586743":"Please submit your <0>proof of address. You can use Deriv P2P after we’ve verified your documents.","-559300364":"Your Deriv P2P cashier is blocked","-740038242":"Your rate is","-146021156":"Delete {{payment_method_name}}?","-1846700504":"Are you sure you want to remove this payment method?","-1422779483":"That payment method cannot be deleted","-532709160":"Your nickname","-237014436":"Recommended by {{recommended_count}} trader","-2054589794":"You've been temporarily barred from using our services due to multiple cancellation attempts. Try again after {{date_time}} GMT.","-1079963355":"trades","-930400128":"To use Deriv P2P, you need to choose a display name (a nickname) and verify your identity.","-992568889":"No one to show here"} \ No newline at end of file diff --git a/packages/p2p/src/components/__tests__/app-content.spec.js b/packages/p2p/src/components/__tests__/app-content.spec.js index 06136a61fc61..a036fd78a325 100644 --- a/packages/p2p/src/components/__tests__/app-content.spec.js +++ b/packages/p2p/src/components/__tests__/app-content.spec.js @@ -67,7 +67,6 @@ describe('', () => { }); expect(screen.getByText('Tabs')).toBeInTheDocument(); - expect(screen.queryByTestId('my_profile')).not.toBeInTheDocument(); }); it('should render the loading component when is_loading state is true', () => { @@ -104,16 +103,4 @@ describe('', () => { // expect(screen.queryByText('NicknameForm')).not.toBeInTheDocument(); // expect(screen.getByText('Dp2pBlocked')).toBeInTheDocument(); // }); - - it('should render MyProfile component when is_advertiser state is true', () => { - useStores.mockImplementation(() => ({ - ...mocked_store_values, - general_store: { ...mocked_store_values.general_store, is_advertiser: true }, - })); - render(, { - wrapper: ({ children }) => {children}, - }); - - expect(screen.getByTestId('my_profile')).toBeInTheDocument(); - }); }); diff --git a/packages/p2p/src/components/app-content.jsx b/packages/p2p/src/components/app-content.jsx index 49534b82fbc4..ec7aceb8e9cf 100644 --- a/packages/p2p/src/components/app-content.jsx +++ b/packages/p2p/src/components/app-content.jsx @@ -1,16 +1,19 @@ -import classNames from 'classnames'; import React from 'react'; import { useHistory } from 'react-router-dom'; +import classNames from 'classnames'; import { isAction, reaction } from 'mobx'; import { observer } from 'mobx-react-lite'; + import { Loading, Tabs } from '@deriv/components'; import { useP2PNotificationCount } from '@deriv/hooks'; import { isMobile } from '@deriv/shared'; import { useStore } from '@deriv/stores'; -import TemporarilyBarredHint from 'Components/temporarily-barred-hint'; + import { useModalManagerContext } from 'Components/modal-manager/modal-manager-context'; +import TemporarilyBarredHint from 'Components/temporarily-barred-hint'; import { buy_sell } from 'Constants/buy-sell'; import { useStores } from 'Stores'; + import { localize } from './i18next'; const AppContent = ({ order_id }) => { @@ -80,7 +83,7 @@ const AppContent = ({ order_id }) => {
- {general_store.is_advertiser &&
} +
); }; diff --git a/packages/p2p/src/components/dp2p-blocked/dp2p-blocked-description.tsx b/packages/p2p/src/components/dp2p-blocked/dp2p-blocked-description.tsx index 079e629d1084..7703e4ee1959 100644 --- a/packages/p2p/src/components/dp2p-blocked/dp2p-blocked-description.tsx +++ b/packages/p2p/src/components/dp2p-blocked/dp2p-blocked-description.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { observer } from 'mobx-react-lite'; + import { Text } from '@deriv/components'; + import { Localize } from 'Components/i18next'; import { useStores } from 'Stores/index'; //remove index when store migration to ts is done diff --git a/packages/p2p/src/components/dp2p-blocked/dp2p-blocked.tsx b/packages/p2p/src/components/dp2p-blocked/dp2p-blocked.tsx index ea5ff9cb47dc..9147f7545f1b 100644 --- a/packages/p2p/src/components/dp2p-blocked/dp2p-blocked.tsx +++ b/packages/p2p/src/components/dp2p-blocked/dp2p-blocked.tsx @@ -1,7 +1,10 @@ import React from 'react'; + import { Icon, Text } from '@deriv/components'; + import { Localize } from 'Components/i18next'; import { useStores } from 'Stores'; + import Dp2pBlockedChecklist from './dp2p-blocked-checklist'; import Dp2pBlockedDescription from './dp2p-blocked-description'; diff --git a/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/__tests__/order-details-confirm-modal.spec.js b/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/__tests__/order-details-confirm-modal.spec.js index bc179c6219d4..afa79330217a 100644 --- a/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/__tests__/order-details-confirm-modal.spec.js +++ b/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/__tests__/order-details-confirm-modal.spec.js @@ -73,7 +73,7 @@ describe('', () => { ).toBeInTheDocument(); expect(screen.getByText('Confirm')).toBeInTheDocument(); expect(screen.getByText('Go Back')).toBeInTheDocument(); - expect(screen.getByText('We accept JPG, PDF, or PNG (up to 2MB).')).toBeInTheDocument(); + expect(screen.getByText('We accept JPG, PDF, or PNG (up to 5MB).')).toBeInTheDocument(); }); it('should handle GoBack Click', () => { const { hideModal } = useModalManagerContext(); diff --git a/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/order-details-confirm-modal.jsx b/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/order-details-confirm-modal.jsx index 8802381ec655..ed98477e8083 100644 --- a/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/order-details-confirm-modal.jsx +++ b/packages/p2p/src/components/modal-manager/modals/order-details-confirm-modal/order-details-confirm-modal.jsx @@ -71,7 +71,7 @@ const OrderDetailsConfirmModal = () => { as='div' className='order-details-confirm-modal__file_format' > - + { const { advertiser_page_store, buy_sell_store, general_store, my_profile_store } = useStores(); diff --git a/packages/p2p/src/pages/app.jsx b/packages/p2p/src/pages/app.jsx index 19a8e73ff08f..45079a50a3b7 100644 --- a/packages/p2p/src/pages/app.jsx +++ b/packages/p2p/src/pages/app.jsx @@ -70,7 +70,7 @@ const App = () => { // Redirect back to /p2p, this was implemented for the mobile team. Do not remove. if (/\/verification$/.test(location.pathname)) { localStorage.setItem('is_verifying_p2p', true); - history.push(routes.p2p_my_ads); + history.push(routes.p2p_my_profile); } ServerTime.init(general_store.server_time); diff --git a/packages/p2p/src/pages/buy-sell/buy-sell-form.scss b/packages/p2p/src/pages/buy-sell/buy-sell-form.scss index 507fdcecdb66..9062e157f7c8 100644 --- a/packages/p2p/src/pages/buy-sell/buy-sell-form.scss +++ b/packages/p2p/src/pages/buy-sell/buy-sell-form.scss @@ -16,7 +16,6 @@ &__field { margin-bottom: 0 !important; flex: 1; - height: 4rem; .dc-input__container { width: 91%; diff --git a/packages/p2p/src/pages/buy-sell/buy-sell-row.jsx b/packages/p2p/src/pages/buy-sell/buy-sell-row.jsx index 40ee9e611ab5..1d924ea094ea 100644 --- a/packages/p2p/src/pages/buy-sell/buy-sell-row.jsx +++ b/packages/p2p/src/pages/buy-sell/buy-sell-row.jsx @@ -1,18 +1,21 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; import { useHistory } from 'react-router-dom'; -import { Table, Text, Button, Icon } from '@deriv/components'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; + +import { Button, Icon,Table, Text } from '@deriv/components'; +import { useExchangeRate } from '@deriv/hooks'; import { isMobile, routes } from '@deriv/shared'; import { observer, useStore } from '@deriv/stores'; -import { useExchangeRate } from '@deriv/hooks'; -import { buy_sell } from 'Constants/buy-sell'; + import { Localize, localize } from 'Components/i18next'; import { OnlineStatusAvatar } from 'Components/online-status'; -import { useStores } from 'Stores'; import StarRating from 'Components/star-rating'; import TradeBadge from 'Components/trade-badge'; +import { buy_sell } from 'Constants/buy-sell'; +import { useStores } from 'Stores'; import { generateEffectiveRate } from 'Utils/format-value'; + import './buy-sell-row.scss'; const BuySellRow = ({ row: advert }) => { diff --git a/packages/p2p/src/pages/my-profile/__tests__/my-profile.spec.js b/packages/p2p/src/pages/my-profile/__tests__/my-profile.spec.js new file mode 100644 index 000000000000..c621a618bcf0 --- /dev/null +++ b/packages/p2p/src/pages/my-profile/__tests__/my-profile.spec.js @@ -0,0 +1,44 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import MyProfile from '../my-profile'; + +const mock_store = { + general_store: { + advertiser_info: { + buy_completion_rate: 100, + buy_orders_amount: 1, + buy_orders_count: 1, + buy_time_avg: 80, + partner_count: 1, + }, + is_advertiser: false, + should_show_dp2p_blocked: false, + setActiveIndex: jest.fn(), + }, + my_profile_store: { + error_message: '', + getSettings: jest.fn(), + setActiveTab: jest.fn(), + setShouldShowAddPaymentMethodForm: jest.fn(), + }, +}; + +jest.mock('Stores', () => ({ + ...jest.requireActual('Stores'), + useStores: jest.fn(() => mock_store), +})); + +jest.mock('Components/verification', () => jest.fn(() =>
Verification
)); +jest.mock('../my-profile-content.jsx', () => jest.fn(() =>
MyProfileContent
)); +jest.mock('../my-profile-stats/my-profile-details-container', () => + jest.fn(() =>
MyProfileDetailsContainer
) +); +jest.mock('../my-profile-header', () => jest.fn(() =>
MyProfileHeader
)); + +describe('', () => { + it('should show the verification page if is_advertiser is false', () => { + render(); + + expect(screen.getByText('Verification')).toBeInTheDocument(); + }); +}); diff --git a/packages/p2p/src/pages/my-profile/my-profile-stats/my-profile-name/my-profile-name.jsx b/packages/p2p/src/pages/my-profile/my-profile-stats/my-profile-name/my-profile-name.jsx index 01a46540ca73..b5e8fc79d058 100644 --- a/packages/p2p/src/pages/my-profile/my-profile-stats/my-profile-name/my-profile-name.jsx +++ b/packages/p2p/src/pages/my-profile/my-profile-stats/my-profile-name/my-profile-name.jsx @@ -1,15 +1,17 @@ import React from 'react'; -import { DesktopWrapper, MobileWrapper, Text } from '@deriv/components'; import { observer } from 'mobx-react-lite'; -import UserAvatar from 'Components/user/user-avatar'; -import { useStores } from 'Stores'; + +import { DesktopWrapper, MobileWrapper, Text } from '@deriv/components'; import { daysSince, isMobile } from '@deriv/shared'; + import { Localize } from 'Components/i18next'; -import TradeBadge from 'Components/trade-badge'; -import MyProfilePrivacy from 'Pages/my-profile/my-profile-stats/my-profile-privacy/my-profile-privacy'; -import StarRating from 'Components/star-rating'; import RecommendedBy from 'Components/recommended-by'; +import StarRating from 'Components/star-rating'; +import TradeBadge from 'Components/trade-badge'; +import UserAvatar from 'Components/user/user-avatar'; import BlockUserCount from 'Pages/advertiser-page/block-user/block-user-count'; +import MyProfilePrivacy from 'Pages/my-profile/my-profile-stats/my-profile-privacy/my-profile-privacy'; +import { useStores } from 'Stores'; const MyProfileName = () => { const { general_store } = useStores(); diff --git a/packages/p2p/src/pages/my-profile/my-profile.jsx b/packages/p2p/src/pages/my-profile/my-profile.jsx index 58adbcac798a..550660945cdc 100644 --- a/packages/p2p/src/pages/my-profile/my-profile.jsx +++ b/packages/p2p/src/pages/my-profile/my-profile.jsx @@ -1,13 +1,14 @@ import React from 'react'; +import { observer } from 'mobx-react-lite'; import { AutoSizer, DesktopWrapper, Loading, Text } from '@deriv/components'; import { isEmptyObject } from '@deriv/shared'; -import { observer } from 'mobx-react-lite'; -import { useStores } from 'Stores'; +import DailyLimitModal from 'Components/daily-limit-modal'; +import Verification from 'Components/verification'; import { my_profile_tabs } from 'Constants/my-profile-tabs'; +import { useStores } from 'Stores'; +import MyProfileDetailsContainer from './my-profile-stats/my-profile-details-container'; import MyProfileContent from './my-profile-content.jsx'; import MyProfileHeader from './my-profile-header'; -import MyProfileDetailsContainer from './my-profile-stats/my-profile-details-container/my-profile-details-container.jsx'; -import DailyLimitModal from 'Components/daily-limit-modal'; const MyProfile = () => { const { general_store, my_profile_store } = useStores(); @@ -24,7 +25,11 @@ const MyProfile = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - if (isEmptyObject(general_store.advertiser_info) && !general_store.should_show_dp2p_blocked) { + if ( + isEmptyObject(general_store.advertiser_info) && + !general_store.poi_status && + !general_store.should_show_dp2p_blocked + ) { return ; } @@ -38,6 +43,10 @@ const MyProfile = () => { ); } + if (!general_store.is_advertiser) { + return ; + } + return ( {({ height, width }) => ( diff --git a/packages/p2p/src/pages/my-profile/payment-methods/add-payment-method/add-payment-method-form.scss b/packages/p2p/src/pages/my-profile/payment-methods/add-payment-method/add-payment-method-form.scss index c5afd3f9b961..98ca1cb64879 100644 --- a/packages/p2p/src/pages/my-profile/payment-methods/add-payment-method/add-payment-method-form.scss +++ b/packages/p2p/src/pages/my-profile/payment-methods/add-payment-method/add-payment-method-form.scss @@ -60,6 +60,10 @@ padding-right: 0; } } + + & .dc-field--error { + top: 9.8rem; + } } } } diff --git a/packages/p2p/src/stores/general-store.js b/packages/p2p/src/stores/general-store.js index 9bcbe7c24eb9..50b587ce8cd7 100644 --- a/packages/p2p/src/stores/general-store.js +++ b/packages/p2p/src/stores/general-store.js @@ -1,15 +1,18 @@ import React from 'react'; -import { action, computed, observable, reaction, makeObservable } from 'mobx'; -import { get, init, timePromise } from '../utils/server_time'; +import { action, computed, makeObservable,observable, reaction } from 'mobx'; + import { isEmptyObject, isMobile, routes, toMoment } from '@deriv/shared'; + +import { Localize,localize } from 'Components/i18next'; +import { api_error_codes } from 'Constants/api-error-codes'; +import { buy_sell } from 'Constants/buy-sell'; +import { order_list } from 'Constants/order-list'; import BaseStore from 'Stores/base_store'; -import { localize, Localize } from 'Components/i18next'; import { convertToMillis, getFormattedDateString } from 'Utils/date-time'; import { createExtendedOrderDetails } from 'Utils/orders'; import { init as WebsocketInit, requestWS, subscribeWS } from 'Utils/websocket'; -import { order_list } from 'Constants/order-list'; -import { buy_sell } from 'Constants/buy-sell'; -import { api_error_codes } from 'Constants/api-error-codes'; + +import { get, init, timePromise } from '../utils/server_time'; export default class GeneralStore extends BaseStore { active_index = 0; diff --git a/packages/p2p/src/stores/my-ads-store.js b/packages/p2p/src/stores/my-ads-store.js index 189c7db41f3d..8817cbdc3e8a 100644 --- a/packages/p2p/src/stores/my-ads-store.js +++ b/packages/p2p/src/stores/my-ads-store.js @@ -125,7 +125,7 @@ export default class MyAdsStore extends BaseStore { if (response) { if (!response.error) { const { get_account_status } = response; - const { status } = get_account_status.authentication.identity; + const { status } = get_account_status?.authentication?.identity ?? {}; this.root_store.general_store.setPoiStatus(status); } else { this.setErrorMessage(response.error); diff --git a/packages/p2p/src/stores/sendbird-store.ts b/packages/p2p/src/stores/sendbird-store.ts index 826be6ee7856..988c46b52c87 100644 --- a/packages/p2p/src/stores/sendbird-store.ts +++ b/packages/p2p/src/stores/sendbird-store.ts @@ -1,13 +1,15 @@ -import SendbirdChat, { BaseChannel } from '@sendbird/chat'; +import { action, computed, IReactionDisposer, makeObservable, observable, reaction } from 'mobx'; + +import { P2PAdvertiserCreate, P2PAdvertiserInfo } from '@deriv/api-types'; import { epochToMoment, toMoment } from '@deriv/shared'; -import { action, computed, observable, reaction, makeObservable, IReactionDisposer } from 'mobx'; -import BaseStore from 'Stores/base_store'; -import ChatMessage, { convertFromChannelMessage } from 'Utils/chat-message'; -import { requestWS } from 'Utils/websocket'; import { TCoreStores } from '@deriv/stores/types'; +import SendbirdChat, { BaseChannel } from '@sendbird/chat'; import { GroupChannel, GroupChannelHandler, GroupChannelModule } from '@sendbird/chat/groupChannel'; import { BaseMessage, FileMessage, MessageType, MessageTypeFilter, UserMessage } from '@sendbird/chat/message'; -import { P2PAdvertiserCreate, P2PAdvertiserInfo } from '@deriv/api-types'; + +import BaseStore from 'Stores/base_store'; +import ChatMessage, { convertFromChannelMessage } from 'Utils/chat-message'; +import { requestWS } from 'Utils/websocket'; type TChatInfo = { app_id: string; user_id: string; token?: string }; diff --git a/packages/p2p/src/translations/ar.json b/packages/p2p/src/translations/ar.json index 69c4aaf7af21..d0c806ab2d65 100644 --- a/packages/p2p/src/translations/ar.json +++ b/packages/p2p/src/translations/ar.json @@ -153,7 +153,6 @@ "1583335572": "إذا لم يتلق الإعلان طلبًا لمدة {{adverts_archive_period}} يومًا، فسيتم إلغاء تنشيطه.", "1587250288": "معرف الإعلان {{advert_id}} ", "1607051458": "البحث عن طريق الاسم المستعار", - "1612595358": "لا يمكن تحميل ملف يزيد عن 2 ميغابايت", "1615530713": "هناك شيء غير صحيح", "1620858613": "أنت تقوم بتحرير إعلان لبيع <0>{{ target_amount }} {{ target_currency }} مقابل <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "لم أتمكن من تسديد المبلغ بالكامل.", @@ -164,6 +163,7 @@ "1678804253": "شراء {{ currency }}", "1685888862": "حدث خطأ داخلي", "1691540875": "تحرير طريقة الدفع", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "أنت تقوم بتحرير إعلان لبيع <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "أظهر اسمي الحقيقي", "1734661732": "رصيد DP2P الخاص بك هو {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "قم بزيادة حدودي", "2060873863": "اكتمل طلبك {{order_id}}", "2063890788": "أُلغيت", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "الحالة", "2096014107": "تقدم بطلبك", "2104905634": "لم يوصي أحد بهذا التاجر حتى الآن", @@ -293,7 +294,6 @@ "-492996224": "لا تقم بالإلغاء", "-1447732068": "تأكيد الدفع", "-1951344681": "يرجى التأكد من الدفع {{amount}} {{currency}} إلى {{other_user_name}}الإيصال وتحميله كدليل على دفعتك", - "-919988505": "نحن نقبل JPG أو PDF أو PNG (حتى 2 ميجابايت).", "-670364940": "قم بتحميل الإيصال هنا", "-937707753": "ارجع", "-984140537": "أضف", diff --git a/packages/p2p/src/translations/bn.json b/packages/p2p/src/translations/bn.json index 3d081214efaa..82737020a60f 100644 --- a/packages/p2p/src/translations/bn.json +++ b/packages/p2p/src/translations/bn.json @@ -153,7 +153,6 @@ "1583335572": "যদি বিজ্ঞাপনে {{adverts_archive_period}} দিনের জন্য কোন অর্ডার না পায়, তাহলে সেটি নিষ্ক্রিয় হয়ে যাবে।", "1587250288": "আইডি {{advert_id}} যোগ করুন ", "1607051458": "ডাকনাম অনুসারে অনুসন্ধান করুন", - "1612595358": "2MB এর বেশি ফাইল আপলোড করা যাচ্ছে না", "1615530713": "কিছু একটা ঠিক না", "1620858613": "আপনি বিক্রি করার <0>{{ target_amount }} {{ target_currency }}জন্য একটি বিজ্ঞাপন সম্পাদনা করছেন <0>{{ local_amount }} {{ local_currency }}<1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "আমি পূর্ণ অর্থ প্রদান করতে সক্ষম ছিল না।", @@ -164,6 +163,7 @@ "1678804253": "কিনুন {{ currency }}", "1685888862": "একটি অভ্যন্তরীণ ত্রুটি ঘটেছে", "1691540875": "মূল্যপরিশোধের পদ্ধতি সম্পাদনা করুন", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "আপনি <0>{{ target_amount }} {{ target_currency }} বিক্রি করার জন্য একটি বিজ্ঞাপন সম্পাদনা করছেন...", "1721422292": "আমার আসল নাম দেখাও", "1734661732": "আপনার DP2P ব্যালেন্স {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "আমার সীমা বাড়াও", "2060873863": "আপনার অর্ডার {{order_id}} সম্পূর্ণ", "2063890788": "বাতিল করা হয়েছে", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "স্ট্যাটাস", "2096014107": "প্রয়োগ করুন", "2104905634": "কেউই এখনো এই ট্রেডারকে সুপারিশ করেনি", @@ -293,7 +294,6 @@ "-492996224": "বাতিল করা হবে না", "-1447732068": "পেমেন্ট নিশ্চিতকরণ", "-1951344681": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি অর্থ প্রদান {{amount}} {{currency}} করেছেন {{other_user_name}}, এবং আপনার পেমেন্টের প্রমাণ হিসাবে রসিদটি আপলোড করুন", - "-919988505": "আমরা JPG, PDF, বা PNG (2MB পর্যন্ত) গ্রহণ করি।", "-670364940": "এখানে রসিদ আপলোড করুন", "-937707753": "ফিরে যাও", "-984140537": "যোগ করুন", diff --git a/packages/p2p/src/translations/de.json b/packages/p2p/src/translations/de.json index dd907c23c440..4e11bbc62822 100644 --- a/packages/p2p/src/translations/de.json +++ b/packages/p2p/src/translations/de.json @@ -153,7 +153,6 @@ "1583335572": "Wenn für die Anzeige innerhalb von {{adverts_archive_period}} Tagen keine Bestellung eingegangen ist, wird sie deaktiviert.", "1587250288": "ID {{advert_id}} hinzufügen ", "1607051458": "Suche nach Nickname", - "1612595358": "Hochladen einer Datei über 2MB nicht möglich", "1615530713": "Etwas stimmt nicht", "1620858613": "Sie bearbeiten eine Anzeige, um <0>{{ target_amount }} {{ target_currency }} für <0>{{ local_amount }} {{ local_currency }} zu verkaufen <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Ich war nicht in der Lage, die vollständige Zahlung zu leisten.", @@ -164,6 +163,7 @@ "1678804253": "Kaufe {{ currency }}", "1685888862": "Ein interner Fehler ist aufgetreten", "1691540875": "Zahlungsmethode bearbeiten", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Sie bearbeiten eine Anzeige, um <0>{{ target_amount }} {{ target_currency }} zu verkaufen...", "1721422292": "Zeige meinen richtigen Namen", "1734661732": "Ihr DP2P-Guthaben beträgt {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Erhöhe meine Limits", "2060873863": "Ihre Bestellung {{order_id}} ist abgeschlossen", "2063890788": "Abgesagt", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Status", "2096014107": "Bewerben", "2104905634": "Bisher hat noch niemand diesen Trader empfohlen", @@ -293,7 +294,6 @@ "-492996224": "Nicht stornieren", "-1447732068": "Bestätigung der Zahlung", "-1951344681": "Bitte vergewissern Sie sich, dass Sie {{amount}} {{currency}} an {{other_user_name}}bezahlt haben, und laden Sie die Quittung als Beleg für Ihre Zahlung hoch.", - "-919988505": "Wir akzeptieren JPG-, PDF- oder PNG-Dateien (bis zu 2 MB).", "-670364940": "Quittung hier hochladen", "-937707753": "Geh zurück", "-984140537": "Hinzufügen", diff --git a/packages/p2p/src/translations/es.json b/packages/p2p/src/translations/es.json index 8bc1576718c9..8a19e75d9510 100644 --- a/packages/p2p/src/translations/es.json +++ b/packages/p2p/src/translations/es.json @@ -153,7 +153,6 @@ "1583335572": "Si su anuncio no recibe un pedido durante {{adverts_archive_period}} días, se desactivará.", "1587250288": "ID del anuncio {{advert_id}} ", "1607051458": "Buscar por alias", - "1612595358": "No se puede cargar un archivo de más de 2MB", "1615530713": "Algo no está bien", "1620858613": "Está editando un anuncio para vender <0>{{ target_amount }} {{ target_currency }} por <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "No pude realizar el pago completo.", @@ -164,6 +163,7 @@ "1678804253": "Comprar {{ currency }}", "1685888862": "Se ha producido un error interno", "1691540875": "Editar método de pago", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Está editando un anuncio para vender <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Mostrar mi nombre real", "1734661732": "Su saldo DP2P es {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Incrementa mis límites", "2060873863": "Su Pedido {{order_id}} está completo", "2063890788": "Cancelado", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Estado", "2096014107": "Aplicar", "2104905634": "Nadie ha recomendado este trader todavía", @@ -293,7 +294,6 @@ "-492996224": "No cancelar", "-1447732068": "Confirmación de pago", "-1951344681": "Asegúrese de haber pagado de {{amount}} {{currency}} a {{other_user_name}} y cargue el recibo como comprobante de su pago", - "-919988505": "Aceptamos JPG, PDF o PNG (hasta 2 MB).", "-670364940": "Sube el recibo aquí", "-937707753": "Volver atrás", "-984140537": "Añadir", diff --git a/packages/p2p/src/translations/fr.json b/packages/p2p/src/translations/fr.json index 47fb2565afa8..77a18ec2d0c2 100644 --- a/packages/p2p/src/translations/fr.json +++ b/packages/p2p/src/translations/fr.json @@ -153,7 +153,6 @@ "1583335572": "Si l'annonce ne reçoit pas de demande pendant {{adverts_archive_period}} jours, elle sera désactivée.", "1587250288": "ID d'annonce {{advert_id}} ", "1607051458": "Recherche par pseudo", - "1612595358": "Impossible de télécharger un fichier de plus de 2MB", "1615530713": "Quelque chose ne va pas", "1620858613": "Vous modifiez une annonce pour vendre <0>{{ target_amount }} {{ target_currency }} pour <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Je n'ai pas pu effectuer le paiement intégral.", @@ -164,6 +163,7 @@ "1678804253": "Acheter {{ currency }}", "1685888862": "Une erreur interne s'est produite", "1691540875": "Modifier le mode de paiement", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Vous modifiez une annonce pour vendre <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Montrer mon nom réel", "1734661732": "Votre solde DP2P est de {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Augmenter mes limites", "2060873863": "Votre commande {{order_id}} est terminée", "2063890788": "Annulé", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Statut", "2096014107": "Appliquer", "2104905634": "Personne n'a encore recommandé ce trader", @@ -293,7 +294,6 @@ "-492996224": "Ne pas annuler", "-1447732068": "Confirmation du paiement", "-1951344681": "Assurez-vous que vous avez payé {{amount}} {{currency}} à {{other_user_name}} et téléchargez le reçu comme preuve de votre paiement", - "-919988505": "Nous acceptons les formats JPG, PDF ou PNG (jusqu'à 2MB).", "-670364940": "Téléchargez le reçu ici", "-937707753": "Retour", "-984140537": "Ajouter", diff --git a/packages/p2p/src/translations/id.json b/packages/p2p/src/translations/id.json index d687b7f15202..440976195c29 100644 --- a/packages/p2p/src/translations/id.json +++ b/packages/p2p/src/translations/id.json @@ -153,7 +153,6 @@ "1583335572": "Jika iklan ini tidak menerima order dalam tempo {{adverts_archive_period}}, maka iklan akan dinonaktifkan.", "1587250288": "Ad ID {{advert_id}} ", "1607051458": "Cari berdasarkan nama panggilan", - "1612595358": "Tidak dapat mengunggah file lebih dari 2MB", "1615530713": "Ada yang tidak beres", "1620858613": "Anda mengedit iklan untuk menjual <0>{{ target_amount }} {{ target_currency }} untuk <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Saya tidak dapat melakukan pembayaran penuh.", @@ -164,6 +163,7 @@ "1678804253": "Beli {{ currency }}", "1685888862": "Terjadi kesalahan internal", "1691540875": "Edit metode pembayaran", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Anda mengedit iklan untuk menjual <0>{{ target_amount }}{{ target_currency }}...", "1721422292": "Tampilkan nama asli", "1734661732": "Saldo DP2P Anda adalah {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Naikkan batasan saya", "2060873863": "Order {{order_id}} telah diproses", "2063890788": "Dibatalkan", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Status", "2096014107": "Daftar", "2104905634": "Belum ada yang merekomendasikan trader ini", @@ -293,7 +294,6 @@ "-492996224": "Jangan batalkan", "-1447732068": "Konfirmasi pembayaran", "-1951344681": "Pastikan Anda telah membayar {{amount}} {{currency}} ke {{other_user_name}}, dan unggah tanda terima sebagai bukti pembayaran Anda", - "-919988505": "Kami menerima JPG, PDF, atau PNG (hingga 2MB).", "-670364940": "Unggah tanda terima di sini", "-937707753": "Kembali", "-984140537": "Tambah", diff --git a/packages/p2p/src/translations/it.json b/packages/p2p/src/translations/it.json index 1de844fd0aad..21c207aa23fb 100644 --- a/packages/p2p/src/translations/it.json +++ b/packages/p2p/src/translations/it.json @@ -153,7 +153,6 @@ "1583335572": "Se non ricevi ordini per il tuo annuncio per {{adverts_archive_period}} giorni, questo verrà disattivato.", "1587250288": "ID annuncio {{advert_id}} ", "1607051458": "Cerca per soprannome", - "1612595358": "Impossibile caricare un file superiore a 2MB", "1615530713": "Qualcosa non va", "1620858613": "Stai modificando un annuncio per vendere <0>{{ target_amount }} {{ target_currency }} per <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Non ho potuto effettuare il pagamento completo.", @@ -164,6 +163,7 @@ "1678804253": "Acquista {{ currency }}", "1685888862": "Si è verificato un errore interno", "1691540875": "Modifica modalità di pagamento", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Stai modificando un annuncio per vendere <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Mostra il mio vero nome", "1734661732": "Il tuo saldo DP2P è {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Aumenta i miei limiti", "2060873863": "L'ordine {{order_id}} è completo", "2063890788": "Annullato", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Stato", "2096014107": "Richiedi", "2104905634": "Nessuno ha ancora consigliato questo trader", @@ -293,7 +294,6 @@ "-492996224": "Non cancellare", "-1447732068": "Conferma del pagamento", "-1951344681": "Si assicuri di aver pagato {{amount}} {{currency}} a {{other_user_name}}, e carichi la ricevuta come prova del pagamento.", - "-919988505": "Accettiamo JPG, PDF o PNG (fino a 2MB).", "-670364940": "Carichi la ricevuta qui", "-937707753": "Torna indietro", "-984140537": "Aggiungi", diff --git a/packages/p2p/src/translations/ko.json b/packages/p2p/src/translations/ko.json index 69730e81220d..47e4c9916074 100644 --- a/packages/p2p/src/translations/ko.json +++ b/packages/p2p/src/translations/ko.json @@ -153,7 +153,6 @@ "1583335572": "광고가 {{adverts_archive_period}} 일 동안 주문을 받지 못하면 비활성화됩니다.", "1587250288": "광고 ID {{advert_id}} ", "1607051458": "닉네임으로 검색", - "1612595358": "2MB를 초과하는 파일을 업로드할 수 없습니다.", "1615530713": "뭔가 잘못됐어", "1620858613": "판매하기 위해 광고를 편집하고 있습니다. <0>{{ target_amount }} {{ target_currency }} 에 대한 <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "전체 금액을 결제하지 못했습니다.", @@ -164,6 +163,7 @@ "1678804253": "구매하기 {{ currency }}", "1685888862": "내부 오류가 발생했습니다.", "1691540875": "결제 방법 편집", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "판매용 광고를 편집 중입니다. <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "내 실명 보여줘", "1734661732": "DP2P 잔액은 {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "한도 늘리기", "2060873863": "귀하의 주문 {{order_id}} 은 완료되었습니다", "2063890788": "취소됨", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "상태", "2096014107": "적용하기", "2104905634": "아직 아무도 이 트레이더를 추천하지 않았습니다", @@ -293,7 +294,6 @@ "-492996224": "취소하지 마세요", "-1447732068": "결제 확인", "-1951344681": "{{amount}} {{currency}} 에서 {{other_user_name}}으로 결제했는지 확인하고 영수증을 결제 증빙 자료로 업로드하세요.", - "-919988505": "JPG, PDF 또는 PNG(최대 2MB)를 허용합니다.", "-670364940": "여기에서 영수증 업로드", "-937707753": "뒤로 가기", "-984140537": "추가", diff --git a/packages/p2p/src/translations/pl.json b/packages/p2p/src/translations/pl.json index 8699f413f2b2..daec1c115681 100644 --- a/packages/p2p/src/translations/pl.json +++ b/packages/p2p/src/translations/pl.json @@ -153,7 +153,6 @@ "1583335572": "Jeśli ogłoszenie nie otrzyma zlecenia przez {{adverts_archive_period}} dni, zostanie dezaktywowane.", "1587250288": "ID reklamy {{advert_id}} ", "1607051458": "Wyszukaj po pseudonimie", - "1612595358": "Nie można przesłać pliku powyżej 2 MB", "1615530713": "Coś jest nie tak", "1620858613": "Edytujesz reklamę, aby sprzedać <0>{{ target_amount }} {{ target_currency }} za <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Nie udało się dokonać pełnej płatności.", @@ -164,6 +163,7 @@ "1678804253": "Kup {{ currency }}", "1685888862": "Wystąpił błąd wewnętrzny", "1691540875": "Edytuj metodę płatności", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Edytujesz reklamę, aby sprzedać <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Pokaż moje prawdziwe imię", "1734661732": "Twoje saldo DP2P wynosi {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Zwiększ moje limity", "2060873863": "Twoje zlecenie {{order_id}} zostało ukończone", "2063890788": "Anulowano", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Status", "2096014107": "Zastosuj", "2104905634": "Nikt jeszcze nie polecił tego inwestora", @@ -293,7 +294,6 @@ "-492996224": "Nie anuluj", "-1447732068": "Potwierdzenie płatności", "-1951344681": "Prosimy upewnić się, że dokonali Państwo płatności na {{amount}} {{currency}} na adres {{other_user_name}}i przesłać paragon jako dowód płatności.", - "-919988505": "Akceptujemy pliki JPG, PDF lub PNG (do 2 MB).", "-670364940": "Proszę przesłać paragon tutaj", "-937707753": "Wstecz", "-984140537": "Dodaj", diff --git a/packages/p2p/src/translations/pt.json b/packages/p2p/src/translations/pt.json index b868159a03c1..d88e9515abf0 100644 --- a/packages/p2p/src/translations/pt.json +++ b/packages/p2p/src/translations/pt.json @@ -153,7 +153,6 @@ "1583335572": "Se o anúncio não receber um pedido por {{adverts_archive_period}} dias, ele será desativado.", "1587250288": "ID do anúncio {{advert_id}} ", "1607051458": "Pesquise por apelido", - "1612595358": "Não é possível carregar um ficheiro com mais de 2MB", "1615530713": "Alguma coisa não está certa", "1620858613": "Você está editando um anúncio para vender <0>{{ target_amount }} {{ target_currency }} por <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Não consegui fazer o pagamento integral.", @@ -164,6 +163,7 @@ "1678804253": "Comprar {{ currency }}", "1685888862": "Erro interno", "1691540875": "Editar método de pagamento", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Você está editando um anúncio para vender <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Mostrar meu nome verdadeiro", "1734661732": "Seu saldo DP2P é {{dp2p_balance}}", @@ -196,6 +196,7 @@ "2040110829": "Aumentar meus limites", "2060873863": "Seu pedido {{order_id}} está concluído", "2063890788": "Cancelado", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Status", "2096014107": "Aplicar", "2104905634": "Este trader ainda não foi recomendado", @@ -293,7 +294,6 @@ "-492996224": "Não cancele", "-1447732068": "Confirmação de pagamento", "-1951344681": "Verifique se pagou {{amount}} {{currency}} a {{other_user_name}} e faça o upload do recibo como comprovativo de pagamento", - "-919988505": "Aceitamos JPG, PDF ou PNG (até 2MB).", "-670364940": "Faça o upload do recibo aqui", "-937707753": "Voltar", "-984140537": "Adicionar", diff --git a/packages/p2p/src/translations/ru.json b/packages/p2p/src/translations/ru.json index a755b9bc2661..6dd045f0b3a2 100644 --- a/packages/p2p/src/translations/ru.json +++ b/packages/p2p/src/translations/ru.json @@ -153,7 +153,6 @@ "1583335572": "Если ваше объявление не получит ордер в течение {{adverts_archive_period}} дн., оно будет деактивировано.", "1587250288": "ID объявления {{advert_id}} ", "1607051458": "Поиск по псевдониму", - "1612595358": "Невозможно загрузить файл размером более 2 МБ", "1615530713": "Что-то пошло не так", "1620858613": "Вы редактируете объявление о продаже <0>{{ target_amount }} {{ target_currency }} за <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Мне не удалось произвести полную оплату.", @@ -164,6 +163,7 @@ "1678804253": "Купить {{ currency }}", "1685888862": "Произошла внутренняя ошибка", "1691540875": "Изменить платежный метод", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Вы редактируете объявление о продаже <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Показывать мое настоящее имя", "1734661732": "Ваш баланс DP2P: {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Увеличить лимиты", "2060873863": "Ваш ордер {{order_id}} завершен", "2063890788": "Отменено", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Статус", "2096014107": "Применить", "2104905634": "Никто пока не рекомендовал этого трейдера", @@ -293,7 +294,6 @@ "-492996224": "Не отменять", "-1447732068": "Подтверждение платежа", "-1951344681": "Пожалуйста, убедитесь, что Вы оплатили {{amount}} {{currency}} по адресу {{other_user_name}}, и загрузите квитанцию в качестве доказательства оплаты", - "-919988505": "Мы принимаем изображения в форматах JPG, PDF или PNG (до 2 МБ).", "-670364940": "Загрузите чек здесь", "-937707753": "Назад", "-984140537": "Добавить", diff --git a/packages/p2p/src/translations/si.json b/packages/p2p/src/translations/si.json index 3f596c41bb25..3e239f162373 100644 --- a/packages/p2p/src/translations/si.json +++ b/packages/p2p/src/translations/si.json @@ -153,7 +153,6 @@ "1583335572": "දැන්වීමට දින {{adverts_archive_period}} ක් සඳහා ඇණවුමක් නොලැබුනේ නම්, එය අක්රිය වේ.", "1587250288": "දැන්වීම දැන්වීම දැන්වීම {{advert_id}} ", "1607051458": "අන්වර්ථ නාමයෙන් සොයන්න", - "1612595358": "2MB ට වැඩි ගොනුවක් උඩුගත කළ නොහැක", "1615530713": "යමක් හරි නැහැ", "1620858613": "ඔබ විකිණීමට දැන්වීමක් සංස්කරණය කරන්නේ <0>{{ target_amount }} {{ target_currency }} සඳහා <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "මට සම්පූර්ණ ගෙවීමක් කිරීමට නොහැකි විය.", @@ -164,6 +163,7 @@ "1678804253": "{{ currency }}මිලදී ගන්න", "1685888862": "අභ්යන්තර දෝෂයක් සිදුවිය", "1691540875": "ගෙවීම් ක්රමය සංස්කරණය කරන්න", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "ඔබ <0>{{ target_amount }} {{ target_currency }} විකිණීමට දැන්වීමක් සංස්කරණය කරනවා...", "1721422292": "මගේ සැබෑ නම පෙන්වන්න", "1734661732": "ඔබේ DP2P ශේෂය {{ dp2p_balance }}වේ", @@ -196,6 +196,7 @@ "2040110829": "මගේ සීමාවන් වැඩි කරන්න", "2060873863": "ඔබගේ ඇණවුම {{order_id}} සම්පූර්ණයි", "2063890788": "අවලංගු කරන ලදි", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "තත්ත්වය", "2096014107": "අයදුම් කරන්න", "2104905634": "කිසිවෙකු තවමත් මෙම වෙළෙන්දා නිර්දේශ කර නැත", @@ -293,7 +294,6 @@ "-492996224": "අවලංගු නොකරන්න", "-1447732068": "ගෙවීම් තහවුරු කිරීම", "-1951344681": "කරුණාකර ඔබ ගෙවා ඇති බවට වග බලා {{amount}} {{currency}} ගන්න {{other_user_name}}, සහ ඔබේ ගෙවීම පිළිබඳ සාක්ෂියක් ලෙස රිසිට්පත උඩුගත කරන්න", - "-919988505": "අපි පිළිගන්නෙමු JPG, PDF, හෝ PNG (2MB දක්වා).", "-670364940": "කුවිතාන්සිය මෙහි උඩුගත කරන්න", "-937707753": "ආපසු යන්න", "-984140537": "එකතු කරන්න", diff --git a/packages/p2p/src/translations/th.json b/packages/p2p/src/translations/th.json index 971127a20be0..1129bd418342 100644 --- a/packages/p2p/src/translations/th.json +++ b/packages/p2p/src/translations/th.json @@ -153,7 +153,6 @@ "1583335572": "ถ้าโฆษณาไม่ได้รับคําสั่งซื้อเลยในช่วง {{adverts_archive_period}} วัน โฆษณานั้นจะถูกปิดใช้งาน", "1587250288": "หมายเลขโฆษณา {{advert_id}} ", "1607051458": "ค้นหาตามชื่อเล่น", - "1612595358": "ไม่สามารถอัปโหลดไฟล์ขนาดเกิน 2MB", "1615530713": "มีบางอย่างไม่ถูกต้อง", "1620858613": "คุณกำลังแก้ไขโฆษณาเพื่อขาย <0>{{ target_amount }} {{ target_currency }} ในราคา <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "ฉันไม่สามารถชำระเงินเต็มจำนวนได้", @@ -164,6 +163,7 @@ "1678804253": "ซื้อ {{ currency }}", "1685888862": "เกิดข้อผิดพลาดภายใน", "1691540875": "แก้ไขวิธีการชำระเงิน", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "คุณกำลังแก้ไขโฆษณาเพื่อขาย <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "แสดงชื่อจริงของฉัน", "1734661732": "ยอดคงเหลือ DP2P ของคุณคือ {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "เพิ่มขีดจำกัดวงเงินของฉัน", "2060873863": "คำสั่งซื้อของคุณ {{order_id}} เสร็จสมบูรณ์แล้ว", "2063890788": "ยกเลิกแล้ว", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "สถานะ", "2096014107": "นำมาใช้งาน", "2104905634": "ยังไม่มีใครแนะนำเทรดเดอร์รายนี้เลย", @@ -293,7 +294,6 @@ "-492996224": "อย่าทำการยกเลิก", "-1447732068": "การยืนยันการชำระเงิน", "-1951344681": "โปรดตรวจสอบว่าคุณได้ชำระเงิน {{amount}} {{currency}} ให้กับ {{other_user_name}} และอัปโหลดใบเสร็จรับเงินเป็นหลักฐานการชำระเงินของคุณ", - "-919988505": "เรายอมรับ JPG PDF หรือ PNG (สูงสุด 2MB)", "-670364940": "อัปโหลดใบเสร็จที่นี่", "-937707753": "ย้อนกลับไป", "-984140537": "เพิ่ม", diff --git a/packages/p2p/src/translations/tr.json b/packages/p2p/src/translations/tr.json index 0c73d7bf00d9..76bed989bb0f 100644 --- a/packages/p2p/src/translations/tr.json +++ b/packages/p2p/src/translations/tr.json @@ -153,7 +153,6 @@ "1583335572": "Eğer ilan {{adverts_archive_period}} gün boyunca bir emir almazsa devre dışı bırakılır.", "1587250288": "İlan Kimliği {{advert_id}} ", "1607051458": "Takma ada göre ara", - "1612595358": "2MB üzerinde bir dosya yüklenemiyor", "1615530713": "Doğru olmayan bir şeyler var", "1620858613": "Satmak için bir ilan oluşturuyorsunuz: <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }}) için <0>{{ target_amount }} {{ target_currency }}", "1623916605": "Tam ödeme yapamadım.", @@ -164,6 +163,7 @@ "1678804253": "Satın al {{ currency }}", "1685888862": "Dahili bir hata oluştu", "1691540875": "Ödeme yöntemini düzenle", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "<0>{{ target_amount }} {{ target_currency }} satmak için bir ilan oluşturuyorsunuz...", "1721422292": "Gerçek adımı göster", "1734661732": "DP2P bakiyeniz {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Sınırlarımı arttır", "2060873863": "Siparişiniz {{order_id}} tamamlandı", "2063890788": "İptal edildi", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Durum", "2096014107": "Uygula", "2104905634": "Henüz kimse bu tüccarı tavsiye etmedi", @@ -293,7 +294,6 @@ "-492996224": "İptal etme", "-1447732068": "Ödeme onayı", "-1951344681": "Lütfen {{amount}} {{currency}} adresinden {{other_user_name}}adresine ödeme yaptığınızdan emin olun ve ödemenizin kanıtı olarak makbuzu yükleyin", - "-919988505": "JPG, PDF veya PNG (2 MB'a kadar) kabul ediyoruz.", "-670364940": "Makbuzu buraya yükleyin", "-937707753": "Geri dön", "-984140537": "Ekle", diff --git a/packages/p2p/src/translations/vi.json b/packages/p2p/src/translations/vi.json index a49110be5927..26db5af7e69f 100644 --- a/packages/p2p/src/translations/vi.json +++ b/packages/p2p/src/translations/vi.json @@ -153,7 +153,6 @@ "1583335572": "Nếu quảng cáo không nhận được yêu cầu giao dịch trong {{adverts_archive_period}} ngày, quảng cáo sẽ bị vô hiệu hóa.", "1587250288": "ID Quảng cáo {{advert_id}} ", "1607051458": "Tìm bằng nickname", - "1612595358": "Không thể tải lên một tập tin trên 2MB", "1615530713": "Đã có vấn đề xảy ra", "1620858613": "Bạn đang chỉnh sửa một quảng cáo để bán <0>{{ target_amount }} {{ target_currency }} cho <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})", "1623916605": "Tôi không thể thanh toán đầy đủ.", @@ -164,6 +163,7 @@ "1678804253": "Mua {{ currency }}", "1685888862": "Đã xảy ra lỗi nội bộ", "1691540875": "Chỉnh sửa phương thức thanh toán", + "1699829275": "Cannot upload a file over 5MB", "1703154819": "Bạn đang chỉnh sửa một quảng cáo để bán <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "Hiển thị tên thật của tôi", "1734661732": "Số dư DP2P của bạn là {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "Tăng giới hạn của tôi", "2060873863": "Giao dịch {{order_id}} của bạn đã hoàn tất", "2063890788": "Đã huỷ", + "2064304887": "We accept JPG, PDF, or PNG (up to 5MB).", "2091671594": "Trạng thái", "2096014107": "Áp dụng", "2104905634": "Chưa ai giới thiệu trader này", @@ -293,7 +294,6 @@ "-492996224": "Không hủy", "-1447732068": "Xác nhận thanh toán", "-1951344681": "Vui lòng đảm bảo rằng bạn đã thanh toán {{amount}} {{currency}} và tải lên biên lai làm bằng chứng về khoản thanh toán của bạn {{other_user_name}}", - "-919988505": "Chúng tôi chấp nhận JPG, PDF hoặc PNG (tối đa 2MB).", "-670364940": "Tải lên biên lai tại đây", "-937707753": "Quay lại", "-984140537": "Thêm", diff --git a/packages/p2p/src/translations/zh_cn.json b/packages/p2p/src/translations/zh_cn.json index bbc1a3e87d52..83d5275c05f9 100644 --- a/packages/p2p/src/translations/zh_cn.json +++ b/packages/p2p/src/translations/zh_cn.json @@ -153,7 +153,6 @@ "1583335572": "如广告连续 {{adverts_archive_period}} 天没收到订单将被停用。", "1587250288": "广告 ID {{advert_id}} ", "1607051458": "按昵称搜索", - "1612595358": "无法上传超过 2MB 的文件", "1615530713": "出现问题", "1620858613": "正在编辑广告以<0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})卖出<0>{{ target_amount }} {{ target_currency }}", "1623916605": "我无法全额付款。", @@ -164,6 +163,7 @@ "1678804253": "买入 {{ currency }}", "1685888862": "出现内部错误", "1691540875": "编辑付款方式", + "1699829275": "无法上传超过 5MB 的文件", "1703154819": "您正在编辑广告以卖出 <0>{{ target_amount }} {{ target_currency }}...", "1721422292": "显示我的真实姓名", "1734661732": "您的 DP2P 余额是 {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "提高限额", "2060873863": "订单 {{order_id}} 已完成", "2063890788": "已取消", + "2064304887": "我们接受 JPG、PDF 或 PNG(最大 5MB)。", "2091671594": "状态", "2096014107": "申请", "2104905634": "还没有人推荐这个交易者", @@ -293,7 +294,6 @@ "-492996224": "不要取消", "-1447732068": "付款确认", "-1951344681": "请确保已付款 {{amount}} {{currency}} 给 {{other_user_name}},及上传收据作为付款凭证", - "-919988505": "接受 JPG、PDF 或 PNG 格式(最大 2MB)。", "-670364940": "在此处上传收据", "-937707753": "返回", "-984140537": "添加", diff --git a/packages/p2p/src/translations/zh_tw.json b/packages/p2p/src/translations/zh_tw.json index 206833fc81ca..5a5447ec6efc 100644 --- a/packages/p2p/src/translations/zh_tw.json +++ b/packages/p2p/src/translations/zh_tw.json @@ -153,7 +153,6 @@ "1583335572": "如廣告連續 {{adverts_archive_period}} 天沒接到訂單將被停用。", "1587250288": "廣告 ID {{advert_id}} ", "1607051458": "按暱稱搜尋", - "1612595358": "無法上傳超過 2MB 的檔案", "1615530713": "出現問題", "1620858613": "正在編輯廣告以 <0>{{ local_amount }} {{ local_currency }} <1>({{ price_rate }} {{local_currency}}/{{ target_currency }})賣出 <0>{{ target_amount }} {{ target_currency }}", "1623916605": "我無法全額付款。", @@ -164,6 +163,7 @@ "1678804253": "買入 {{ currency }}", "1685888862": "發生內部錯誤", "1691540875": "編輯支付方式", + "1699829275": "無法上傳超過 5MB 的檔案", "1703154819": "您正在編輯廣告以賣出<0>{{ target_amount }} {{ target_currency }}...", "1721422292": "顯示我的真實姓名", "1734661732": "您的 DP2P 餘額是 {{ dp2p_balance }}", @@ -196,6 +196,7 @@ "2040110829": "提高限額", "2060873863": "訂單 {{order_id}} 已完成", "2063890788": "已取消", + "2064304887": "我們接受 JPG、PDF 或 PNG(最多 5 MB)。", "2091671594": "狀況", "2096014107": "申請", "2104905634": "還沒有人推薦這個交易者", @@ -293,7 +294,6 @@ "-492996224": "不要取消", "-1447732068": "付款確認", "-1951344681": "請確認已付款 {{amount}} {{currency}} 給 {{other_user_name}},並上傳收據作為付款證明", - "-919988505": "接受 JPG、PDF 或 PNG(最大 2 MB)。", "-670364940": "這裡上傳收據", "-937707753": "返回", "-984140537": "新增", diff --git a/packages/p2p/src/utils/file-uploader.js b/packages/p2p/src/utils/file-uploader.js index dbc354e1ccce..08cdeca12b43 100644 --- a/packages/p2p/src/utils/file-uploader.js +++ b/packages/p2p/src/utils/file-uploader.js @@ -4,7 +4,7 @@ export const convertToMB = bytes => bytes / (1024 * 1024); export const getPotSupportedFiles = filename => /^.*\.(png|PNG|jpg|JPG|jpeg|JPEG|pdf|PDF)$/.test(filename); -export const max_pot_file_size = 2097152; +export const max_pot_file_size = 5242880; export const isImageType = type => ['image/jpeg', 'image/png', 'image/gif'].includes(type); @@ -15,5 +15,5 @@ const isFileSupported = files => files.filter(each_file => getPotSupportedFiles( export const getErrorMessage = files => isFileTooLarge(files) && isFileSupported(files) - ? localize('Cannot upload a file over 2MB') + ? localize('Cannot upload a file over 5MB') : localize('File uploaded is not supported'); diff --git a/packages/reports/package.json b/packages/reports/package.json index 8dc811b193b6..0407572acfb6 100644 --- a/packages/reports/package.json +++ b/packages/reports/package.json @@ -76,6 +76,7 @@ }, "dependencies": { "@deriv/components": "^1.0.0", + "@deriv/deriv-api": "^1.0.13", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", "@deriv/translations": "^1.0.0", diff --git a/packages/reports/src/Components/Form/CompositeCalendar/composite-calendar-mobile.tsx b/packages/reports/src/Components/Form/CompositeCalendar/composite-calendar-mobile.tsx index d059be4877e1..c4c6baf10125 100644 --- a/packages/reports/src/Components/Form/CompositeCalendar/composite-calendar-mobile.tsx +++ b/packages/reports/src/Components/Form/CompositeCalendar/composite-calendar-mobile.tsx @@ -5,6 +5,8 @@ import { localize } from '@deriv/translations'; import { toMoment } from '@deriv/shared'; import { TInputDateRange } from 'Types'; +type TDatePickerOnChangeParams = Parameters['onChange']>[0]; + type TRadioButton = { id: string; className?: string; @@ -51,7 +53,7 @@ type TCompositeCalendarMobile = { value: { from?: moment.Moment; to?: moment.Moment; is_batch?: boolean }, extra_data?: { date_range: TInputDateRange } ) => void; - setCurrentFocus?: (focus: string) => void; + setCurrentFocus: (focus: string | null) => void; from: number; to: number; }; @@ -134,11 +136,11 @@ const CompositeCalendarMobile = React.memo( setIsOpen(false); }; - const selectDate = (e: React.ChangeEvent, key: string) => { + const selectDate = (e: TDatePickerOnChangeParams, key: string) => { setSelectedDateRange({ value: CUSTOM_KEY }); - if (key === 'from') setFrom(e.target?.value); - if (key === 'to') setTo(e.target?.value); + if (key === 'from') setFrom(e.target?.value as string); + if (key === 'to') setTo(e.target?.value as string); }; const getMobileFooter = () => { @@ -180,12 +182,12 @@ const CompositeCalendarMobile = React.memo(
} onClick={openDialog} setCurrentFocus={setCurrentFocus} - value={applied_date_range?.label} + value={applied_date_range?.label ?? ''} />
) => selectDate(e, 'from')} + onChange={(e: TDatePickerOnChangeParams) => selectDate(e, 'from')} /> ) => selectDate(e, 'to')} + onChange={(e: TDatePickerOnChangeParams) => selectDate(e, 'to')} />
diff --git a/packages/reports/src/Containers/open-positions.tsx b/packages/reports/src/Containers/open-positions.tsx index e5bf812a8a8d..c367cf972c24 100644 --- a/packages/reports/src/Containers/open-positions.tsx +++ b/packages/reports/src/Containers/open-positions.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { withRouter } from 'react-router-dom'; +import { RouteComponentProps, withRouter } from 'react-router-dom'; import { DesktopWrapper, MobileWrapper, @@ -114,7 +114,7 @@ type TTotals = { payout?: number; }; -type TOpenPositions = { +type TOpenPositions = RouteComponentProps & { component_icon: string; }; diff --git a/packages/reports/src/Stores/base-store.js b/packages/reports/src/Stores/base-store.js index 4e005596209a..9dd1131f5da7 100644 --- a/packages/reports/src/Stores/base-store.js +++ b/packages/reports/src/Stores/base-store.js @@ -1,5 +1,6 @@ -import { action, intercept, observable, reaction, toJS, when, makeObservable } from 'mobx'; -import { isProduction, isEmptyObject, Validator } from '@deriv/shared'; +import { action, intercept, makeObservable,observable, reaction, toJS, when } from 'mobx'; + +import { isEmptyObject, isProduction, Validator } from '@deriv/shared'; /** * BaseStore class is the base class for all defined stores in the application. It handles some stuff such as: diff --git a/packages/shared/package.json b/packages/shared/package.json index 45a8fcd869c3..2821fef759c9 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -32,6 +32,10 @@ "devDependencies": { "@babel/eslint-parser": "^7.17.0", "@babel/preset-react": "^7.16.7", + "@testing-library/jest-dom": "^5.12.0", + "@testing-library/react": "^12.0.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^13.5.0", "@types/jsdom": "^20.0.0", "@types/react": "^18.0.7", "@types/react-dom": "^18.0.0", diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 963f4e3419bb..2faa767f9621 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -35,3 +35,4 @@ export * from './services'; export * from './utils/helpers'; export * from './utils/constants'; export * from './utils/loader-handler'; +export * from './utils/types'; diff --git a/packages/shared/src/styles/constants.scss b/packages/shared/src/styles/constants.scss index d9c22b41345b..5e480428a01a 100644 --- a/packages/shared/src/styles/constants.scss +++ b/packages/shared/src/styles/constants.scss @@ -121,6 +121,8 @@ $gradient-color-red-3: linear-gradient(90deg, #ff444f 0%, #211d1e 95.22%); $gradient-color-red-4: linear-gradient(90deg, #ff6444 0%, #ff444f 100%); $gradient-color-black-3: linear-gradient(58.51deg, #061828 28.06%, #1a3c60 93.51%); $gradient-color-black-4: linear-gradient(274.25deg, #333333 9.01%, #5c5b5b 103.31%); +$gradient-color-black-5: linear-gradient(180deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.16) 100%); +$gradient-color-white-2: linear-gradient(180deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.16) 100%); $gradient-color-blue-5: linear-gradient(90deg, #00a8af 0%, #04cfd8 104.41%); $gradient-color-gold: linear-gradient(90deg, #f7931a 0%, #ffc71b 104.41%); $gradient-color-green-4: linear-gradient(90deg, #1db193 0%, #09da7a 104.41%); @@ -182,6 +184,7 @@ $COLOR_DARK_GRAY_4: #999999; /* stylelint-enable color-no-hex */ $BORDER_RADIUS: 4px; +$BORDER_RADIUS_2: 8px; $MAX_CONTAINER_WIDTH: 1440px; @@ -220,3 +223,12 @@ $gradient-webmoney: linear-gradient(90deg, #1a77ac 0%, #0068a3 100%); /* App Cards gradient background */ $gradient-virtual: linear-gradient(274.25deg, #333333 9.01%, #5c5b5b 103.31%); $gradient-virtual-swap-free: linear-gradient(58.51deg, #061828 28.06%, #1a3c60 93.51%); + +/* Wallets */ +$ready-banner-bg-color: #e2f3f3; +$ready-banner-tick-bg-color: #4ab4b3; +$wallet-demo-bg-color: #fff8f9; +$wallet-dark-demo-bg-color: #140506; +$wallet-demo-divider-color: #fff0f1; +$wallet-box-shadow: 0px 12px 16px -4px rgba(14, 14, 14, 0.08), 0px 4px 6px -2px rgba(14, 14, 14, 0.03); +$btn-shadow: 0px 24px 24px 0px rgba(0, 0, 0, 0.08), 0px 0px 24px 0px rgba(0, 0, 0, 0.08); diff --git a/packages/shared/src/styles/themes.scss b/packages/shared/src/styles/themes.scss index 0c1cc6188795..47dfa3f7d690 100644 --- a/packages/shared/src/styles/themes.scss +++ b/packages/shared/src/styles/themes.scss @@ -85,6 +85,7 @@ --text-less-prominent: #{$color-grey-1}; --text-prominent: #{$color-black-1}; --text-disabled: #{$color-grey-1}; + --text-disabled-1: #{$color-grey-6}; --text-loss-danger: #{$color-red-1}; --text-profit-success: #{$color-green-1}; --text-warning: #{$color-yellow}; @@ -199,6 +200,20 @@ --badge-blue: #{$color-blue-4}; --badge-violet: #{$color-blue-2}; --badge-green: #{$color-green-3}; + // wallets + --wallets-banner-ready-bg-color: #{$ready-banner-bg-color}; + --wallets-banner-ready-tick-bg-color: #{$ready-banner-tick-bg-color}; + --wallets-banner-border-color: #{$color-grey-4}; + --wallets-banner-dot-color: #{$color-grey-6}; + --wallets-banner-active-dot-color: #{$color-red}; + --wallets-card-active-gradient-background: #{$gradient-color-black-5}; + --wallet-demo-bg-color: #{$wallet-demo-bg-color}; + --wallet-demo-divider-color: #{$wallet-demo-divider-color}; + --wallet-eu-disclaimer: #{$color-grey-4}; + --wallet-box-shadow: #{$wallet-box-shadow}; + // Demo view + --demo-text-color-1: #{$color-grey}; + --demo-text-color-2: #{$color-white}; // Header --header-background-mt5: #{$color-blue-8}; --header-background-others: #{$color-green-7}; @@ -225,6 +240,7 @@ --text-less-prominent: #{$color-grey-7}; --text-primary: #{$color-grey-1}; --text-disabled: #{$color-black-6}; + --text-disabled-1: #{$color-black-6}; --text-profit-success: #{$color-green-3}; --text-loss-danger: #{$color-red-2}; --text-red: #{$color-red}; @@ -318,6 +334,20 @@ --badge-blue: #{$color-blue-4}; --badge-violet: #{$color-blue-2}; --badge-green: #{$color-green-3}; + // wallets + --wallets-banner-ready-bg-color: #{$ready-banner-bg-color}; + --wallets-banner-ready-tick-bg-color: #{$ready-banner-tick-bg-color}; + --wallets-banner-border-color: #{$color-grey-4}; + --wallets-banner-dot-color: #{$color-grey-6}; + --wallets-banner-active-dot-color: #{$color-red}; + --wallets-card-active-gradient-background: #{$gradient-color-white-2}; + --wallet-demo-bg-color: #{$wallet-dark-demo-bg-color}; + --wallet-demo-divider-color: #{$color-black-8}; + --wallet-eu-disclaimer: #{$color-grey-4}; + --wallet-box-shadow: #{$wallet-box-shadow}; + // Demo view + --demo-text-color-1: #{$color-black-1}; + --demo-text-color-2: #{$color-black-1}; // Header --header-background-mt5: #{$color-blue-8}; --header-background-others: #{$color-green-7}; diff --git a/packages/shared/src/utils/cfd/cfd.ts b/packages/shared/src/utils/cfd/cfd.ts index 7c1b52962a48..2c3f03474c41 100644 --- a/packages/shared/src/utils/cfd/cfd.ts +++ b/packages/shared/src/utils/cfd/cfd.ts @@ -39,7 +39,7 @@ export const getMT5Title = (account_type: string) => { type TPlatform = 'dxtrade' | 'mt5' | 'derivez' | 'ctrader'; type TMarketType = 'financial' | 'synthetic' | 'gaming' | 'all' | undefined; -type TShortcode = 'svg' | 'bvi' | 'labuan' | 'vanuatu'; +type TShortcode = 'svg' | 'bvi' | 'labuan' | 'vanuatu' | 'maltainvest'; type TGetAccount = { market_type: TMarketType; sub_account_type?: TAccount['sub_account_type']; @@ -105,6 +105,8 @@ export const getCFDAccountKey = ({ market_type, sub_account_type, platform, shor return 'financial_fx'; case 'vanuatu': return 'financial_v'; + case 'maltainvest': + return 'financial'; default: return 'financial_demo'; } @@ -181,12 +183,17 @@ export const getCFDAccountDisplay = ({ is_mt5_trade_modal, is_transfer_form = false, }: TGetCFDAccountDisplay) => { - let cfd_account_key = getCFDAccountKey({ market_type, sub_account_type, platform, shortcode }); + const cfd_account_key = getCFDAccountKey({ market_type, sub_account_type, platform, shortcode }); if (!cfd_account_key) return undefined; - if (cfd_account_key === 'financial' && is_eu) { - if (is_mt5_trade_modal) cfd_account_key = 'mt5_cfds'; - else cfd_account_key = 'cfd'; + if (is_mt5_trade_modal && is_eu) { + switch (cfd_account_key) { + case 'financial': + return localize('CFDs'); + case 'financial_demo': + default: + return localize('CFDs Demo'); + } } const cfd_account_display = CFD_text_translated[cfd_account_key](); @@ -206,6 +213,11 @@ type TGetCFDAccount = TGetAccount & { is_transfer_form?: boolean; }; +type TGetMT5Icon = { + market_type: TMarketType; + is_eu?: boolean; +}; + export const getCFDAccount = ({ market_type, sub_account_type, @@ -216,7 +228,7 @@ export const getCFDAccount = ({ let cfd_account_key = getCFDAccountKey({ market_type, sub_account_type, platform }); if (!cfd_account_key) return undefined; - if (cfd_account_key === 'financial' && is_eu) { + if (cfd_account_key === 'financial_demo' && is_eu) { cfd_account_key = 'cfd'; } @@ -225,6 +237,12 @@ export const getCFDAccount = ({ return CFD_text[cfd_account_key as keyof typeof CFD_text]; }; +export const getMT5Icon = ({ market_type, is_eu }: TGetMT5Icon) => { + if (market_type === 'all' && !is_eu) return 'SwapFree'; + if (market_type === 'financial' && is_eu) return 'CFDs'; + return market_type; +}; + export const setSharedCFDText = (all_shared_CFD_text: { [key: string]: () => void }) => { CFD_text_translated = all_shared_CFD_text; }; diff --git a/packages/shared/src/utils/config/adapters.ts b/packages/shared/src/utils/config/adapters.ts index 0b962cb0d005..b984b7cd63a3 100644 --- a/packages/shared/src/utils/config/adapters.ts +++ b/packages/shared/src/utils/config/adapters.ts @@ -4,7 +4,6 @@ type TDocument = { id: string; text: string; value?: string; - sample_image?: string; example_format?: string; additional?: { display_name: string; @@ -21,6 +20,7 @@ type TIDVFormValues = { /** * Formats the IDV form values to be sent to the API + * @name formatIDVFormValues * @param idv_form_value - Formik values of the IDV form * @param country_code - Country code of the user * @returns IDV form values diff --git a/packages/shared/src/utils/constants/contract.ts b/packages/shared/src/utils/constants/contract.ts index c9dc9493fd48..66ecb1feea26 100644 --- a/packages/shared/src/utils/constants/contract.ts +++ b/packages/shared/src/utils/constants/contract.ts @@ -1,5 +1,7 @@ import React from 'react'; + import { localize } from '@deriv/translations'; + import { shouldShowCancellation, shouldShowExpiration, TURBOS, VANILLALONG } from '../contract'; export const getLocalizedBasis = () => @@ -25,7 +27,7 @@ type TContractTypesConfig = { config?: { hide_duration?: boolean }; }; -type TGetContractTypesConfig = (symbol: string) => Record; +type TGetContractTypesConfig = (symbol?: string) => Record; type TContractConfig = { button_name?: React.ReactNode; diff --git a/packages/shared/src/utils/contract/__tests__/contract.spec.ts b/packages/shared/src/utils/contract/__tests__/contract.spec.ts index 50c20e064ba1..c98bec1ab498 100644 --- a/packages/shared/src/utils/contract/__tests__/contract.spec.ts +++ b/packages/shared/src/utils/contract/__tests__/contract.spec.ts @@ -1,3 +1,4 @@ +import { screen, render } from '@testing-library/react'; import * as ContractUtils from '../contract'; import { TContractInfo, TDigitsInfo, TTickItem } from '../contract-types'; @@ -585,3 +586,20 @@ describe('getContractStatus', () => { ).toBe('won'); }); }); + +describe('getLocalizedTurbosSubtype', () => { + it('should return an empty string for non-turbos contracts', () => { + render(ContractUtils.getLocalizedTurbosSubtype('CALL') as JSX.Element); + expect(screen.queryByText('Long')).not.toBeInTheDocument(); + expect(screen.queryByText('Short')).not.toBeInTheDocument(); + expect(ContractUtils.getLocalizedTurbosSubtype('CALL')).toBe(''); + }); + it('should render "Long" for TURBOSLONG contract', () => { + render(ContractUtils.getLocalizedTurbosSubtype('TURBOSLONG') as JSX.Element); + expect(screen.getByText('Long')).toBeInTheDocument(); + }); + it('should render "Short" for TURBOSSHORT contract', () => { + render(ContractUtils.getLocalizedTurbosSubtype('TURBOSSHORT') as JSX.Element); + expect(screen.getByText('Short')).toBeInTheDocument(); + }); +}); diff --git a/packages/shared/src/utils/contract/contract-types.ts b/packages/shared/src/utils/contract/contract-types.ts index 0442d8ffeeb6..0e5be1ce6746 100644 --- a/packages/shared/src/utils/contract/contract-types.ts +++ b/packages/shared/src/utils/contract/contract-types.ts @@ -1,15 +1,26 @@ -import { ContractUpdate, Portfolio1, ProposalOpenContract } from '@deriv/api-types'; +import { + ContractUpdate, + ContractUpdateHistory, + Portfolio1, + ProposalOpenContract, + TickSpotData, +} from '@deriv/api-types'; export type TContractStore = { + clearContractUpdateConfigValues: () => void; contract_info: TContractInfo; + contract_update_history: ContractUpdateHistory; contract_update_take_profit: number | string; contract_update_stop_loss: number | string; - clearContractUpdateConfigValues: () => void; + digits_info: TDigitsInfo; + display_status: string; has_contract_update_take_profit: boolean; has_contract_update_stop_loss: boolean; + is_digit_contract: boolean; + is_ended: boolean; + onChange: (param: { name: string; value: string | number | boolean }) => void; updateLimitOrder: () => void; validation_errors: { contract_update_stop_loss: string[]; contract_update_take_profit: string[] }; - onChange: (param: { name: string; value: string | number | boolean }) => void; }; export type TContractInfo = ProposalOpenContract & @@ -33,3 +44,5 @@ type TLimitProperty = { }; export type TLimitOrder = Partial>; + +export type TTickSpotData = TickSpotData; diff --git a/packages/shared/src/utils/contract/contract.ts b/packages/shared/src/utils/contract/contract.tsx similarity index 95% rename from packages/shared/src/utils/contract/contract.ts rename to packages/shared/src/utils/contract/contract.tsx index 006e872ef84a..4f9ad4bb5f4a 100644 --- a/packages/shared/src/utils/contract/contract.ts +++ b/packages/shared/src/utils/contract/contract.tsx @@ -1,4 +1,6 @@ import moment from 'moment'; +import React from 'react'; +import { Localize } from '@deriv/translations'; import { unique } from '../object'; import { capitalizeFirstLetter } from '../string/string_util'; import { TContractInfo, TDigitsInfo, TLimitOrder, TTickItem } from './contract-types'; @@ -214,7 +216,16 @@ export const shouldShowExpiration = (symbol = '') => symbol.startsWith('cry'); export const shouldShowCancellation = (symbol = '') => !/^(cry|CRASH|BOOM|stpRNG|WLD|JD)/.test(symbol); -export const getContractSubtype = (type: string) => +export const getContractSubtype = (type = '') => /(VANILLALONG|TURBOS)/i.test(type) ? capitalizeFirstLetter(type.replace(/(VANILLALONG|TURBOS)/i, '').toLowerCase()) : ''; + +export const getLocalizedTurbosSubtype = (contract_type = '') => { + if (!isTurbosContract(contract_type)) return ''; + return getContractSubtype(contract_type) === 'Long' ? ( + + ) : ( + + ); +}; diff --git a/packages/shared/src/utils/currency/currency.ts b/packages/shared/src/utils/currency/currency.ts index d26b7eb207e8..6bf986764e61 100644 --- a/packages/shared/src/utils/currency/currency.ts +++ b/packages/shared/src/utils/currency/currency.ts @@ -42,7 +42,7 @@ const crypto_currencies_display_order = [ 'USDK', ]; -export const reorderCurrencies = (list: Array<{ value: string; type: string }>, type = 'fiat') => { +export const reorderCurrencies = (list: Array, type = 'fiat') => { const new_order = type === 'fiat' ? fiat_currencies_display_order : crypto_currencies_display_order; return list.sort((a, b) => { diff --git a/packages/shared/src/utils/date/date-time.ts b/packages/shared/src/utils/date/date-time.ts index ab1934c78ee3..f2660696ae34 100644 --- a/packages/shared/src/utils/date/date-time.ts +++ b/packages/shared/src/utils/date/date-time.ts @@ -51,7 +51,7 @@ export const toLocalFormat = (time: moment.MomentInput) => moment.utc(time).loca * @param {String} time 24 hours format, may or may not include seconds * @return {moment} a new moment object of result */ -export const setTime = (moment_obj: moment.Moment, time: string) => { +export const setTime = (moment_obj: moment.Moment, time: string | null) => { const [hour, minute, second] = time ? time.split(':') : [0, 0, 0]; moment_obj .hour(+hour) diff --git a/packages/shared/src/utils/digital-options/digital-options.ts b/packages/shared/src/utils/digital-options/digital-options.ts index 5ee382320bf5..b619b0af2c35 100644 --- a/packages/shared/src/utils/digital-options/digital-options.ts +++ b/packages/shared/src/utils/digital-options/digital-options.ts @@ -10,7 +10,7 @@ type TShowError = { message: string; header: string; redirect_label: string; - redirectOnClick: (() => void) | null; + redirectOnClick?: (() => void) | null; should_show_refresh: boolean; redirect_to: string; should_clear_error_on_click: boolean; @@ -25,8 +25,8 @@ type TAccounts = { export const showDigitalOptionsUnavailableError = ( showError: (t: TShowError) => void, message: TMessage, - redirectOnClick: (() => void) | null, - should_redirect: boolean, + redirectOnClick?: (() => void) | null, + should_redirect = false, should_clear_error_on_click = true ) => { const { title, text, link } = message; diff --git a/packages/shared/src/utils/files/file-uploader-utils.ts b/packages/shared/src/utils/files/file-uploader-utils.ts index 552d71d4da88..8eac3f283cd9 100644 --- a/packages/shared/src/utils/files/file-uploader-utils.ts +++ b/packages/shared/src/utils/files/file-uploader-utils.ts @@ -80,7 +80,7 @@ export const readFiles = (files: TFile[], getFileReadErrorMessage: (t: string) = documentFormat: getFormatFromMIME(f), file_size: f.size, ...settings, - documentType: settings?.documentType || 'utility_bill', + documentType: settings?.documentType ?? 'utility_bill', }; resolve(file_obj); }; diff --git a/packages/shared/src/utils/helpers/duration.ts b/packages/shared/src/utils/helpers/duration.ts index 84d47c169c9a..be2579641b3f 100644 --- a/packages/shared/src/utils/helpers/duration.ts +++ b/packages/shared/src/utils/helpers/duration.ts @@ -163,10 +163,10 @@ export const hasIntradayDurationUnit = (duration_units_list: TUnit[]) => { * On switching symbols, end_time value of volatility indices should be set to today * * @param {String} symbol - * @param {String} expiry_type + * @param {String | null} expiry_type * @returns {*} */ -export const resetEndTimeOnVolatilityIndices = (symbol: string, expiry_type: string) => +export const resetEndTimeOnVolatilityIndices = (symbol: string, expiry_type: string | null) => /^R_/.test(symbol) && expiry_type === 'endtime' ? toMoment(null).format('DD MMM YYYY') : null; export const getDurationMinMaxValues = ( diff --git a/packages/shared/src/utils/helpers/logic.ts b/packages/shared/src/utils/helpers/logic.ts index 691cef6f72b8..435d9c5a6a34 100644 --- a/packages/shared/src/utils/helpers/logic.ts +++ b/packages/shared/src/utils/helpers/logic.ts @@ -2,55 +2,25 @@ import moment from 'moment'; import { isEmptyObject } from '../object'; import { isAccumulatorContract, isOpen, isUserSold } from '../contract'; import { TContractInfo, TContractStore } from '../contract/contract-types'; - -type TTick = { - ask?: number; - bid?: number; - epoch?: number; - id?: string; - pip_size: number; - quote?: number; - symbol?: string; -}; - -type TIsEndedBeforeCancellationExpired = TGetEndTime & { - cancellation: { - ask_price: number; - date_expiry: number; - }; -}; +import { TickSpotData } from '@deriv/api-types'; type TIsSoldBeforeStart = Required>; type TIsStarted = Required>; -type TGetEndTime = Pick< - TContractInfo, - | 'is_expired' - | 'sell_time' - | 'status' - | 'tick_count' - | 'bid_price' - | 'buy_price' - | 'contract_id' - | 'is_valid_to_sell' - | 'profit' -> & - Required>; - -export const isContractElapsed = (contract_info: TGetEndTime, tick: TTick) => { +export const isContractElapsed = (contract_info: TContractInfo, tick?: TickSpotData) => { if (isEmptyObject(tick) || isEmptyObject(contract_info)) return false; const end_time = getEndTime(contract_info) || 0; - if (end_time && tick.epoch) { + if (end_time && tick && tick.epoch) { const seconds = moment.duration(moment.unix(tick.epoch).diff(moment.unix(end_time))).asSeconds(); return seconds >= 2; } return false; }; -export const isEndedBeforeCancellationExpired = (contract_info: TIsEndedBeforeCancellationExpired) => { +export const isEndedBeforeCancellationExpired = (contract_info: TContractInfo) => { const end_time = getEndTime(contract_info) || 0; - return !!(contract_info.cancellation && end_time < contract_info.cancellation.date_expiry); + return !!(contract_info.cancellation?.date_expiry && end_time < contract_info.cancellation.date_expiry); }; export const isSoldBeforeStart = (contract_info: TIsSoldBeforeStart) => diff --git a/packages/shared/src/utils/login/login.ts b/packages/shared/src/utils/login/login.ts index e8136a0aaad2..9a256d9da1ad 100644 --- a/packages/shared/src/utils/login/login.ts +++ b/packages/shared/src/utils/login/login.ts @@ -1,8 +1,8 @@ -import { deriv_urls } from '../url/constants'; import { website_name } from '../config/app-config'; +import { domain_app_ids, getAppId } from '../config/config'; import { CookieStorage, isStorageSupported, LocalStore } from '../storage/storage'; -import { getAppId, domain_app_ids } from '../config/config'; import { getStaticUrl, urlForCurrentDomain } from '../url'; +import { deriv_urls } from '../url/constants'; export const redirectToLogin = (is_logged_in: boolean, language: string, has_params = true, redirect_delay = 0) => { if (!is_logged_in && isStorageSupported(sessionStorage)) { diff --git a/packages/shared/src/utils/screen/responsive.ts b/packages/shared/src/utils/screen/responsive.ts index 562171dbf9a6..29a3008a24f7 100644 --- a/packages/shared/src/utils/screen/responsive.ts +++ b/packages/shared/src/utils/screen/responsive.ts @@ -17,6 +17,7 @@ export const isTouchDevice = () => (window.DocumentTouch && document instanceof window.DocumentTouch) || navigator.maxTouchPoints > 0 || window.navigator.msMaxTouchPoints > 0; +/** @deprecated Use `is_mobile` from ui-store instead. */ export const isMobile = () => window.innerWidth <= MAX_MOBILE_WIDTH; export const isDesktop = () => isTablet() || window.innerWidth > MAX_TABLET_WIDTH; // TODO: remove tablet once there is a design for the specific size. export const isTablet = () => MAX_MOBILE_WIDTH < window.innerWidth && window.innerWidth <= MAX_TABLET_WIDTH; diff --git a/packages/shared/src/utils/shortcode/shortcode.ts b/packages/shared/src/utils/shortcode/shortcode.ts index 6517450d2bd0..954a1da76487 100644 --- a/packages/shared/src/utils/shortcode/shortcode.ts +++ b/packages/shared/src/utils/shortcode/shortcode.ts @@ -9,19 +9,17 @@ type TIsHighLow = { }; }; -type TInfoFromShortcode = Partial< - Record< - | 'category' - | 'underlying' - | 'barrier_1' - | 'multiplier' - | 'start_time' - | 'payout_tick' - | 'growth_rate' - | 'growth_frequency' - | 'tick_size_barrier', - string - > +type TInfoFromShortcode = Record< + | 'category' + | 'underlying' + | 'barrier_1' + | 'multiplier' + | 'start_time' + | 'payout_tick' + | 'growth_rate' + | 'growth_frequency' + | 'tick_size_barrier', + string >; // category_underlying_amount diff --git a/packages/shared/src/utils/types.ts b/packages/shared/src/utils/types.ts new file mode 100644 index 000000000000..51ebd1123f8f --- /dev/null +++ b/packages/shared/src/utils/types.ts @@ -0,0 +1,3 @@ +import { Jurisdiction } from './constants'; + +export type TBrokerCodes = typeof Jurisdiction[keyof typeof Jurisdiction]; diff --git a/packages/shared/src/utils/validation/declarative-validation-rules.ts b/packages/shared/src/utils/validation/declarative-validation-rules.ts index 96fc564926d6..29578f216009 100644 --- a/packages/shared/src/utils/validation/declarative-validation-rules.ts +++ b/packages/shared/src/utils/validation/declarative-validation-rules.ts @@ -47,7 +47,7 @@ export const validPhone = (value: string) => /^\+?([0-9-]+\s)*[0-9-]+$/.test(val export const validLetterSymbol = (value: string) => /^[A-Za-z]+([a-zA-Z.' -])*[a-zA-Z.' -]+$/.test(value); export const validName = (value: string) => /^(?!.*\s{2,})[\p{L}\s'.-]{2,50}$/u.test(value); export const validLength = (value = '', options: TOptions) => - (options.min ? value.length >= options.min : true) && (options.max ? value.length <= options.max : true); + (options.min ? value.length >= options.min : true) && (options.max ? value.length <= Number(options.max) : true); export const validPassword = (value: string) => /^(?=.*[a-z])(?=.*\d)(?=.*[A-Z])[!-~]{8,25}$/.test(value); export const validEmail = (value: string) => /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,63}$/.test(value); const validBarrier = (value: string) => /^[+-]?\d+\.?\d*$/.test(value); @@ -60,7 +60,7 @@ const validEmailToken = (value: string) => value.trim().length === 8; let pre_build_dvrs: TInitPreBuildDVRs, form_error_messages: TFormErrorMessagesTypes; const isMoreThanMax = (value: number, options: TOptions) => - options.type === 'float' ? +value > +options.max! : compareBigUnsignedInt(value, options.max!) === 1; + options.type === 'float' ? +value > Number(options.max) : compareBigUnsignedInt(value, options.max) === 1; export const validNumber = (value: string, opts: TOptions) => { const options = cloneObject(opts); diff --git a/packages/shared/src/utils/validation/form-validations.ts b/packages/shared/src/utils/validation/form-validations.ts index 9f14e551e8d3..9fff37b7c648 100644 --- a/packages/shared/src/utils/validation/form-validations.ts +++ b/packages/shared/src/utils/validation/form-validations.ts @@ -33,7 +33,7 @@ export const filterByLandingCompany = (landing_company: string, schema: TSchema * @return {function(*=): {}} */ export const generateValidationFunction = (landing_company: string, schema: TSchema) => { - const rules_schema = filterByLandingCompany(landing_company, schema); + const rules_schema = landing_company ? filterByLandingCompany(landing_company, schema) : schema; const rules: { [key: string]: TConfig['rules'] } = {}; Object.entries(rules_schema).forEach(([key, opts]) => { rules[key] = opts.rules; diff --git a/packages/shared/src/utils/validator/validator.ts b/packages/shared/src/utils/validator/validator.ts index 9a6e3818b8a1..0e3c9c5d73ec 100644 --- a/packages/shared/src/utils/validator/validator.ts +++ b/packages/shared/src/utils/validator/validator.ts @@ -1,4 +1,5 @@ -import { TOptions, getPreBuildDVRs, TInitPreBuildDVRs } from '../validation/declarative-validation-rules'; +import { getPreBuildDVRs, TInitPreBuildDVRs, TOptions } from '../validation/declarative-validation-rules'; + import Error from './errors'; type TRuleOptions = { diff --git a/packages/stores/src/mockStore.ts b/packages/stores/src/mockStore.ts index c9bb01318195..22478e25d4e9 100644 --- a/packages/stores/src/mockStore.ts +++ b/packages/stores/src/mockStore.ts @@ -1,5 +1,5 @@ import merge from 'lodash.merge'; -import type { TStores } from '../types'; +import type { TCoreStores, TStores } from '../types'; const mock = (): TStores & { is_mock: boolean } => { const common_store_error = { @@ -12,7 +12,6 @@ const mock = (): TStores & { is_mock: boolean } => { should_clear_error_on_click: false, should_show_refresh: false, redirectOnClick: jest.fn(), - setError: jest.fn(), }; return { is_mock: true, @@ -20,7 +19,6 @@ const mock = (): TStores & { is_mock: boolean } => { account_settings: {}, account_type: 'virtual', accounts: {}, - is_social_signup: false, active_account_landing_company: '', trading_platform_available_accounts: [], account_limits: {}, @@ -108,6 +106,7 @@ const mock = (): TStores & { is_mock: boolean } => { }, balance: '', can_change_fiat_currency: false, + clients_country: '', country_standpoint: { is_belgium: false, is_france: false, @@ -126,6 +125,7 @@ const mock = (): TStores & { is_mock: boolean } => { setCFDScore: jest.fn(), getLimits: jest.fn(), has_active_real_account: false, + has_fiat: false, has_logged_out: false, has_maltainvest_account: false, has_restricted_mt5_account: false, @@ -134,6 +134,7 @@ const mock = (): TStores & { is_mock: boolean } => { is_authorize: false, is_deposit_lock: false, is_dxtrade_allowed: false, + is_dxtrade_password_not_set: false, is_eu: false, is_eu_country: false, has_residence: false, @@ -145,16 +146,19 @@ const mock = (): TStores & { is_mock: boolean } => { is_landing_company_loaded: false, is_logged_in: false, is_logging_in: false, + is_mt5_password_not_set: false, is_pending_proof_of_ownership: false, + is_populating_dxtrade_account_list: false, + is_social_signup: false, is_single_currency: false, is_switching: false, is_tnc_needed: false, + is_high_risk: false, is_trading_experience_incomplete: false, + is_unwelcome: false, is_virtual: false, is_withdrawal_lock: false, is_populating_account_list: false, - is_language_loaded: false, - prev_account_type: '', landing_company_shortcode: '', local_currency_config: { currency: '', @@ -200,6 +204,7 @@ const mock = (): TStores & { is_mock: boolean } => { active_accounts: [], account_list: [], available_crypto_currencies: [], + selectCurrency: jest.fn(), setAccountStatus: jest.fn(), setBalanceOtherAccounts: jest.fn(), setInitialized: jest.fn(), @@ -207,6 +212,7 @@ const mock = (): TStores & { is_mock: boolean } => { setVisibilityRealityCheck: jest.fn(), setP2pAdvertiserInfo: jest.fn(), setPreSwitchAccount: jest.fn(), + social_identity_provider: '', switched: false, switch_broadcast: false, switchEndSignal: jest.fn(), @@ -214,7 +220,6 @@ const mock = (): TStores & { is_mock: boolean } => { isEligibleForMoreRealMt5: jest.fn(), isEligibleForMoreDemoMt5Svg: jest.fn(), updateMT5Status: jest.fn(), - is_high_risk: false, fetchResidenceList: jest.fn(), residence_list: [], should_restrict_bvi_account_creation: false, @@ -225,6 +230,7 @@ const mock = (): TStores & { is_mock: boolean } => { is_populating_mt5_account_list: false, landing_companies: {}, landing_company: {}, + upgradeable_currencies: [], getChangeableFields: jest.fn(), isAccountOfTypeDisabled: jest.fn(), is_mt5_allowed: false, @@ -267,12 +273,17 @@ const mock = (): TStores & { is_mock: boolean } => { real_account_creation_unlock_date: '', has_any_real_account: false, setPrevAccountType: jest.fn(), + setLoginInformation: jest.fn(), + init: jest.fn(), + setLoginId: jest.fn(), + resetLocalStorageValues: jest.fn(), }, common: { error: common_store_error, current_language: 'EN', isCurrentLanguage: jest.fn(), is_from_derivgo: false, + is_socket_opened: false, has_error: false, platform: '', routeBackInApp: jest.fn(), @@ -280,14 +291,17 @@ const mock = (): TStores & { is_mock: boolean } => { changeCurrentLanguage: jest.fn(), changeSelectedLanguage: jest.fn(), is_network_online: false, + network_status: {}, services_error: {}, - server_time: undefined, + server_time: new Date() as unknown as TCoreStores['common']['server_time'], + setError: jest.fn(), + setSelectedContractType: jest.fn(), + setServicesError: jest.fn(), + showError: jest.fn(), is_language_changing: false, - is_socket_opened: false, setAppstorePlatform: jest.fn(), app_routing_history: [], getExchangeRate: jest.fn(), - network_status: {}, }, ui: { advanced_duration_unit: 't', @@ -297,15 +311,22 @@ const mock = (): TStores & { is_mock: boolean } => { }, current_focus: null, is_account_settings_visible: false, + is_advanced_duration: false, is_loading: false, is_cashier_visible: false, - is_app_disabled: false, + is_wallet_modal_visible: false, + is_chart_layout_default: false, is_closing_create_real_account_modal: false, is_dark_mode_on: false, is_language_settings_modal_on: false, + is_desktop: false, + is_app_disabled: false, + has_only_forward_starting_contracts: false, header_extension: null, is_link_expired_modal_visible: false, is_mobile: false, + is_tablet: false, + is_mobile_language_menu_open: false, is_positions_drawer_on: false, is_reports_visible: false, is_route_modal_on: false, @@ -317,25 +338,38 @@ const mock = (): TStores & { is_mock: boolean } => { toggleAccountsDialog: jest.fn(), toggleAccountSettings: jest.fn(), toggleCashier: jest.fn(), - togglePositionsDrawer: jest.fn(), setDarkMode: jest.fn(), setReportsTabIndex: jest.fn(), - has_only_forward_starting_contracts: false, has_real_account_signup_ended: false, + real_account_signup_target: '', + real_account_signup: { + active_modal_index: -1, + previous_currency: '', + current_currency: '', + success_message: '', + error_message: '', + }, + resetRealAccountSignupParams: jest.fn(), notification_messages_ui: jest.fn(), + openPositionsDrawer: jest.fn(), openRealAccountSignup: jest.fn(), + setIsWalletModalVisible: jest.fn(), setHasOnlyForwardingContracts: jest.fn(), setIsClosingCreateRealAccountModal: jest.fn(), + setMobileLanguageMenuOpen: jest.fn(), setRealAccountSignupEnd: jest.fn(), setPurchaseState: jest.fn(), + setAppContentsScrollRef: jest.fn(), shouldNavigateAfterChooseCrypto: jest.fn(), toggleLanguageSettingsModal: jest.fn(), - toggleServicesErrorModal: jest.fn(), + togglePositionsDrawer: jest.fn(), toggleLinkExpiredModal: jest.fn(), + toggleServicesErrorModal: jest.fn(), toggleSetCurrencyModal: jest.fn(), addToast: jest.fn(), removeToast: jest.fn(), reports_route_tab_index: 1, + resetPurchaseStates: jest.fn(), should_show_cancellation_warning: false, toggleCancellationWarning: jest.fn(), toggleUnsupportedContractModal: jest.fn(), @@ -343,13 +377,10 @@ const mock = (): TStores & { is_mock: boolean } => { setSubSectionIndex: jest.fn(), sub_section_index: 0, toggleReadyToDepositModal: jest.fn(), - is_tablet: false, is_ready_to_deposit_modal_visible: false, is_real_acc_signup_on: false, is_need_real_account_for_cashier_modal_visible: false, - is_chart_layout_default: false, toggleNeedRealAccountForCashierModal: jest.fn(), - setAppContentsScrollRef: jest.fn(), is_switch_to_deriv_account_modal_visible: false, openSwitchToRealAccountModal: jest.fn(), is_top_up_virtual_open: false, @@ -371,8 +402,11 @@ const mock = (): TStores & { is_mock: boolean } => { toggleShouldShowRealAccountsList: jest.fn(), is_reset_trading_password_modal_visible: false, setResetTradingPasswordModalOpen: jest.fn(), - is_desktop: false, vanilla_trade_type: 'VANILLALONGCALL', + is_additional_kyc_info_modal_open: false, + toggleAdditionalKycInfoModal: jest.fn(), + is_kyc_information_submitted_modal_open: false, + toggleKycInformationSubmittedModal: jest.fn(), }, traders_hub: { getAccount: jest.fn(), @@ -386,16 +420,15 @@ const mock = (): TStores & { is_mock: boolean } => { login: '', account_id: '', }, - handleTabItemClick: jest.fn(), - is_account_transfer_modal_open: false, is_eu_user: false, + is_demo: false, setIsOnboardingVisited: jest.fn(), is_real: false, - is_regulators_compare_modal_visible: false, - is_tour_open: false, selectRegion: jest.fn(), setSelectedAccount: jest.fn(), is_low_risk_cr_eu_real: false, + is_real_wallets_upgrade_on: false, + toggleWalletsUpgrade: jest.fn(), show_eu_related_content: false, platform_real_balance: { currency: '', @@ -415,11 +448,8 @@ const mock = (): TStores & { is_mock: boolean } => { }, closeAccountTransferModal: jest.fn(), toggleRegulatorsCompareModal: jest.fn(), - selected_region: '', - is_demo: false, financial_restricted_countries: false, selected_account_type: 'real', - selected_platform_type: 'options', no_CR_account: false, no_MF_account: false, modal_data: { @@ -431,7 +461,18 @@ const mock = (): TStores & { is_mock: boolean } => { setTogglePlatformType: jest.fn(), toggleAccountTransferModal: jest.fn(), selectAccountType: jest.fn(), + is_wallet_migration_failed: false, + setWalletsMigrationFailedPopup: jest.fn(), + selected_platform_type: '', + available_platforms: [], + selected_region: 'All', + getExistingAccounts: jest.fn(), available_dxtrade_accounts: [], + toggleAccountTypeModalVisibility: jest.fn(), + active_modal_tab: 'Deposit', + setWalletModalActiveTab: jest.fn(), + active_modal_wallet_id: '', + setWalletModalActiveWalletID: jest.fn(), available_ctrader_accounts: [], toggleIsTourOpen: jest.fn(), is_demo_low_risk: false, @@ -440,14 +481,8 @@ const mock = (): TStores & { is_mock: boolean } => { available_derivez_accounts: [], has_any_real_account: false, startTrade: jest.fn(), - getExistingAccounts: jest.fn(), - toggleAccountTypeModalVisibility: jest.fn(), showTopUpModal: jest.fn(), }, - menu: { - attach: jest.fn(), - update: jest.fn(), - }, notifications: { addNotificationMessage: jest.fn(), addNotificationMessageByKey: jest.fn(), @@ -457,37 +492,65 @@ const mock = (): TStores & { is_mock: boolean } => { filterNotificationMessages: jest.fn(), notifications: [], refreshNotifications: jest.fn(), + removeAllNotificationMessages: jest.fn(), removeNotifications: jest.fn(), removeNotificationByKey: jest.fn(), removeNotificationMessage: jest.fn(), removeNotificationMessageByKey: jest.fn(), setP2POrderProps: jest.fn(), - showAccountSwitchToRealNotification: jest.fn(), setP2PRedirectTo: jest.fn(), + showAccountSwitchToRealNotification: jest.fn(), + setShouldShowPopups: jest.fn(), toggleNotificationsModal: jest.fn(), }, portfolio: { active_positions: [], + active_positions_count: 0, all_positions: [], + barriers: [], error: '', getPositionById: jest.fn(), is_loading: false, is_accumulator: false, is_multiplier: false, is_turbos: false, + onHoverPosition: jest.fn(), + onBuyResponse: jest.fn(), onClickCancel: jest.fn(), onClickSell: jest.fn(), onMount: jest.fn(), + open_accu_contract: null, positions: [], removePositionById: jest.fn(), + setContractType: jest.fn(), }, contract_trade: { - contract_info: {}, - contract_update_stop_loss: '', - contract_update_take_profit: '', - has_contract_update_stop_loss: false, - has_contract_update_take_profit: false, + accountSwitchListener: jest.fn(), + accu_barriers_timeout_id: null, + accumulator_barriers_data: {}, + accumulator_contract_barriers_data: {}, + addContract: jest.fn(), + chart_type: '', + clearAccumulatorBarriersData: jest.fn(), + clearError: jest.fn(), + contracts: [], + error_message: '', getContractById: jest.fn(), + granularity: 0, + has_crossed_accu_barriers: false, + has_error: false, + last_contract: {}, + markers_array: [], + onUnmount: jest.fn(), + prev_chart_type: '', + prev_granularity: null, + removeContract: jest.fn(), + savePreviousChartMode: jest.fn(), + setNewAccumulatorBarriersData: jest.fn(), + updateAccumulatorBarriersData: jest.fn(), + updateChartType: jest.fn(), + updateGranularity: jest.fn(), + updateProposal: jest.fn(), }, modules: {}, exchange_rates: { @@ -516,9 +579,20 @@ const mock = (): TStores & { is_mock: boolean } => { setLoginFlag: jest.fn(), }, pushwoosh: {}, - contract_replay: {}, + contract_replay: { + contract_store: { + contract_info: {}, + digits_info: {}, + display_status: '', + is_digit_contract: false, + is_ended: false, + }, + }, chart_barrier_store: {}, - active_symbols: {}, + active_symbols: { + active_symbols: [], + setActiveSymbols: jest.fn(), + }, }; }; diff --git a/packages/stores/src/stores/FeatureFlagsStore.ts b/packages/stores/src/stores/FeatureFlagsStore.ts index 1258ac4ac389..e5aeecef3675 100644 --- a/packages/stores/src/stores/FeatureFlagsStore.ts +++ b/packages/stores/src/stores/FeatureFlagsStore.ts @@ -1,6 +1,7 @@ import BaseStore from './BaseStore'; const FLAGS = { + wallet: false, next_wallet: false, } satisfies Record; diff --git a/packages/stores/types.ts b/packages/stores/types.ts index f87944fc9ad9..5dec341eaba5 100644 --- a/packages/stores/types.ts +++ b/packages/stores/types.ts @@ -1,24 +1,28 @@ +import type { RouteComponentProps } from 'react-router'; +import type { Moment } from 'moment'; + import type { AccountLimitsResponse, Authorize, ContractUpdate, - ContractUpdateHistory, DetailsOfEachMT5Loginid, GetAccountStatus, GetLimits, - Portfolio1, GetSettings, LandingCompany, LogOutResponse, + Portfolio1, ProposalOpenContract, ResidenceList, SetFinancialAssessmentRequest, SetFinancialAssessmentResponse, StatesList, + WebsiteStatus, + ContractUpdateHistory, Transaction, + ActiveSymbols, } from '@deriv/api-types'; -import type { Moment } from 'moment'; -import type { RouteComponentProps } from 'react-router'; + import type { ExchangeRatesStore, FeatureFlagsStore } from './src/stores'; type TRoutes = @@ -85,6 +89,69 @@ type TPopulateSettingsExtensionsMenuItem = { value: (props: T) => JSX.Element; }; +type TRegionAvailability = 'Non-EU' | 'EU' | 'All'; + +type TIconTypes = + | 'Derived' + | 'Financial' + | 'BinaryBot' + | 'BinaryBotBlue' + | 'DBot' + | 'Demo' + | 'DerivGo' + | 'DerivGoBlack' + | 'DerivLogo' + | 'DerivTradingLogo' + | 'DerivX' + | 'DropDown' + | 'DTrader' + | 'Options' + | 'SmartTrader' + | 'SmartTraderBlue' + | 'CFDs'; + +type AvailableAccount = { + name: string; + is_item_blurry?: boolean; + has_applauncher_account?: boolean; + sub_title?: string; + description?: string; + is_visible?: boolean; + is_disabled?: boolean; + platform?: string; + market_type?: 'all' | 'financial' | 'synthetic'; + icon: TIconTypes; + availability: TRegionAvailability; + short_code_and_region?: string; + login?: string; +}; + +type BrandConfig = { + name: string; + icon: TIconTypes; + availability: TRegionAvailability; + is_deriv_platform?: boolean; +}; + +type TPortfolioPosition = { + contract_info: ProposalOpenContract & + Portfolio1 & { + contract_update?: ContractUpdate; + }; + details?: string; + display_name: string; + id?: number; + indicative: number; + payout?: number; + purchase?: number; + reference: number; + type?: string; + is_unsupported: boolean; + contract_update: ProposalOpenContract['limit_order']; + is_sell_requested: boolean; + profit_loss: number; +}; + type TAppRoutingHistory = { action: string; hash: string; @@ -95,6 +162,9 @@ type TAppRoutingHistory = { type TAccount = NonNullable[0] & { balance?: number; + landing_company_shortcode?: 'svg' | 'costarica' | 'maltainvest' | 'malta' | 'iom'; + is_virtual: number; + account_category?: 'wallet' | 'trading'; }; type TCtraderAccountsList = DetailsOfEachMT5Loginid & { @@ -134,8 +204,12 @@ type TAccountsList = { // balance is missing in @deriv/api-types type TActiveAccount = TAccount & { + balance?: string | number; landing_company_shortcode: 'svg' | 'costarica' | 'maltainvest' | 'malta' | 'iom'; is_virtual: number; + account_category?: 'wallet' | 'trading'; + linked_to?: { loginid: string; platform: string }[]; + token: string; }; type TTradingPlatformAvailableAccount = { @@ -166,21 +240,12 @@ type TAvailableCFDAccounts = { type TAuthenticationStatus = { document_status: string; identity_status: string }; -type TMenuItem = { - icon: JSX.Element; - id: string; - link_to: string | boolean; - login_only: boolean; - onClick: boolean | (() => void); - text: () => string; -}; - type TAddToastProps = { - key: string; + key?: string; content: string | React.ReactNode; - is_bottom?: boolean; timeout?: number; - type: string; + is_bottom?: boolean; + type?: string; }; type TButtonProps = { @@ -220,6 +285,18 @@ type TNotification = | ((withdrawal_locked: boolean, deposit_locked: boolean) => TNotificationMessage) | ((excluded_until: number) => TNotificationMessage); +type LoginParams = { + acct: string; + token: string; + curr: string; + lang: string; +}; + +type IncrementedProperties = { + [K in keyof LoginParams as `${string & K}${N}`]: string; +}; + +type LoginURLParams = LoginParams & IncrementedProperties; type TStandPoint = { financial_company: string; gaming_company: string; @@ -241,6 +318,15 @@ type TDXTraderStatusServerType = Record<'all' | 'demo' | 'real', number>; type TMt5StatusServer = Record<'demo' | 'real', TMt5StatusServerType[]>; +type RealAccountSignupSettings = { + active_modal_index: number; + current_currency: string; + error_code?: string; + error_details?: string | Record; + error_message: string; + previous_currency: string; + success_message: string; +}; type TCountryStandpoint = { is_belgium: boolean; is_france: boolean; @@ -263,9 +349,10 @@ type TClientStore = { }; account_list: TAccountsList; account_status: GetAccountStatus; - available_crypto_currencies: string[]; + available_crypto_currencies: Array; balance?: string | number; can_change_fiat_currency: boolean; + clients_country: string; cfd_score: number; setCFDScore: (score: number) => void; country_standpoint: TCountryStandpoint; @@ -287,9 +374,12 @@ type TClientStore = { is_eu_country: boolean; is_eu: boolean; is_uk: boolean; + is_unwelcome: boolean; + is_single_currency: boolean; is_social_signup: boolean; has_residence: boolean; is_authorize: boolean; + is_dxtrade_password_not_set: boolean; is_financial_account: boolean; is_financial_assessment_needed: boolean; is_financial_information_incomplete: boolean; @@ -298,16 +388,17 @@ type TClientStore = { is_logged_in: boolean; is_logging_in: boolean; is_low_risk: boolean; + is_mt5_password_not_set: boolean; is_pending_proof_of_ownership: boolean; - is_single_currency: boolean; + is_populating_dxtrade_account_list: boolean; is_switching: boolean; is_tnc_needed: boolean; + is_high_risk: boolean; is_trading_experience_incomplete: boolean; is_virtual: boolean; is_withdrawal_lock: boolean; landing_company_shortcode: string; is_populating_account_list: boolean; - is_language_loaded: boolean; local_currency_config: { currency: string; decimal_places?: number; @@ -328,15 +419,19 @@ type TClientStore = { standpoint: TStandPoint; setAccountStatus: (status?: GetAccountStatus) => void; setBalanceOtherAccounts: (balance: number) => void; + selectCurrency: (currency: string) => void; setInitialized: (status?: boolean) => void; setLogout: (status?: boolean) => void; setVisibilityRealityCheck: (value: boolean) => void; setP2pAdvertiserInfo: () => void; setPreSwitchAccount: (status?: boolean) => void; switchAccount: (value?: string) => Promise; + setLoginInformation: (client_accounts: { [k: string]: TActiveAccount }, client_id: string) => void; + social_identity_provider: string; switched: boolean; switch_broadcast: boolean; switchEndSignal: () => void; + upgradeable_currencies: Array; verification_code: { payment_agent_withdraw: string; payment_withdraw: string; @@ -364,7 +459,6 @@ type TClientStore = { poi_state?: string; }; residence_list: ResidenceList; - is_high_risk: boolean; should_restrict_bvi_account_creation: boolean; should_restrict_vanuatu_account_creation: boolean; updateMT5Status: () => Promise; @@ -390,6 +484,7 @@ type TClientStore = { has_account_error_in_mt5_demo_list: boolean; has_account_error_in_dxtrade_real_list: boolean; has_account_error_in_dxtrade_demo_list: boolean; + has_fiat: boolean; is_fully_authenticated: boolean; states_list: StatesList; /** @deprecated Use `useCurrencyConfig` or `useCurrentCurrencyConfig` from `@deriv/hooks` package instead. */ @@ -406,24 +501,26 @@ type TClientStore = { is_svg: boolean; real_account_creation_unlock_date: string; setPrevAccountType: (account_type: string) => void; + init: (login_new_user?: LoginURLParams<1>) => void; + setLoginId: (loginid: string) => void; + resetLocalStorageValues: (loginid: string) => void; setFinancialAndTradingAssessment: ( payload: SetFinancialAssessmentRequest ) => Promise; - prev_account_type: string; }; type TCommonStoreError = { - app_routing_history?: TAppRoutingHistory[]; - header: string | JSX.Element; + header?: string | JSX.Element; message: string | JSX.Element; - redirect_label: string; + redirect_label?: string; redirect_to?: string; - redirectOnClick: (() => void) | null; - setError?: (has_error: boolean, error: React.ReactNode | null) => void; + redirectOnClick?: (() => void) | null; should_clear_error_on_click?: boolean; - should_show_refresh: boolean; + should_redirect?: boolean; + should_show_refresh?: boolean; type?: string; }; + type TCommonStoreServicesError = { code?: string; message?: string; @@ -439,7 +536,7 @@ type TCommonStore = { platform: 'dxtrade' | 'derivez' | 'mt5' | 'ctrader' | ''; routeBackInApp: (history: Pick, additional_platform_path?: string[]) => void; routeTo: (pathname: string) => void; - server_time?: Moment; + server_time: Moment; changeCurrentLanguage: (new_language: string) => void; changeSelectedLanguage: (key: string) => void; current_language: string; @@ -447,6 +544,10 @@ type TCommonStore = { services_error: TCommonStoreServicesError; is_socket_opened: boolean; setAppstorePlatform: (value: string) => void; + setError?: (has_error: boolean, error: TCommonStoreError) => void; + setSelectedContractType: (contract_type: string) => void; + setServicesError: (error: TCommonStoreServicesError) => void; + showError: (error: TCommonStoreError) => void; app_routing_history: TAppRoutingHistory[]; getExchangeRate: (from_currency: string, to_currency: string) => Promise; network_status: Record | { [key: string]: string }; @@ -464,10 +565,16 @@ type TUiStore = { has_real_account_signup_ended: boolean; header_extension: JSX.Element | null; is_account_settings_visible: boolean; - is_loading: boolean; + is_additional_kyc_info_modal_open: boolean; + is_advanced_duration: boolean; is_cashier_visible: boolean; + is_wallet_modal_visible: boolean; + is_chart_asset_info_visible?: boolean; + is_chart_layout_default: boolean; is_closing_create_real_account_modal: boolean; + is_kyc_information_submitted_modal_open: boolean; is_dark_mode_on: boolean; + is_loading: boolean; is_reports_visible: boolean; is_route_modal_on: boolean; is_language_settings_modal_on: boolean; @@ -475,9 +582,12 @@ type TUiStore = { is_app_disabled: boolean; is_link_expired_modal_visible: boolean; is_mobile: boolean; + is_tablet: boolean; + is_mobile_language_menu_open: boolean; is_positions_drawer_on: boolean; is_services_error_visible: boolean; is_unsupported_contract_modal_visible: boolean; + openPositionsDrawer: () => void; openRealAccountSignup: ( value: 'maltainvest' | 'svg' | 'add_crypto' | 'choose' | 'add_fiat' | 'set_currency' | 'manage' ) => void; @@ -493,10 +603,13 @@ type TUiStore = { ] | [] ) => void; + resetPurchaseStates: () => void; setAppContentsScrollRef: (ref: React.MutableRefObject) => void; setCurrentFocus: (value: string | null) => void; setDarkMode: (is_dark_mode_on: boolean) => boolean; - setHasOnlyForwardingContracts: (has_only_forward_starting_contracts: boolean) => void; + setIsWalletModalVisible: (value: boolean) => void; + setHasOnlyForwardingContracts: (has_only_forward_starting_contracts?: boolean) => void; + setMobileLanguageMenuOpen: (is_mobile_language_menu_open: boolean) => void; setReportsTabIndex: (value: number) => void; setIsClosingCreateRealAccountModal: (value: boolean) => void; setRealAccountSignupEnd: (status: boolean) => void; @@ -514,7 +627,6 @@ type TUiStore = { toggleServicesErrorModal: (is_visible: boolean) => void; toggleSetCurrencyModal: () => void; toggleShouldShowRealAccountsList: (value: boolean) => void; - is_tablet: boolean; removeToast: (key: string) => void; is_ready_to_deposit_modal_visible: boolean; reports_route_tab_index: number; @@ -524,7 +636,6 @@ type TUiStore = { toggleReports: (is_visible: boolean) => void; is_real_acc_signup_on: boolean; is_need_real_account_for_cashier_modal_visible: boolean; - is_chart_layout_default: boolean; toggleNeedRealAccountForCashierModal: () => void; is_switch_to_deriv_account_modal_visible: boolean; openSwitchToRealAccountModal: () => void; @@ -532,6 +643,7 @@ type TUiStore = { is_top_up_virtual_open: boolean; is_top_up_virtual_in_progress: boolean; is_top_up_virtual_success: boolean; + real_account_signup_target: string; closeSuccessTopUpModal: () => void; closeTopUpModal: () => void; is_cfd_reset_password_modal_enabled: boolean; @@ -540,56 +652,152 @@ type TUiStore = { is_accounts_switcher_on: boolean; openTopUpModal: () => void; is_reset_trading_password_modal_visible: boolean; + real_account_signup: RealAccountSignupSettings; + resetRealAccountSignupParams: () => void; setResetTradingPasswordModalOpen: () => void; populateHeaderExtensions: (header_items: JSX.Element | null) => void; populateSettingsExtensions: (menu_items: Array | null) => void; purchase_states: boolean[]; setShouldShowCooldownModal: (value: boolean) => void; vanilla_trade_type: 'VANILLALONGCALL' | 'VANILLALONGPUT'; -}; - -type TPortfolioPosition = { - contract_info: ProposalOpenContract & - Portfolio1 & { - contract_update?: ContractUpdate; - }; - details?: string; - display_name: string; - id?: number; - indicative: number; - payout?: number; - purchase?: number; - reference: number; - type?: string; - is_unsupported: boolean; - contract_update: ProposalOpenContract['limit_order']; - is_sell_requested: boolean; - profit_loss: number; + toggleAdditionalKycInfoModal: () => void; + toggleKycInformationSubmittedModal: () => void; }; type TPortfolioStore = { active_positions: TPortfolioPosition[]; + active_positions_count: number; all_positions: TPortfolioPosition[]; + barriers: TBarriers; error: string; getPositionById: (id: number) => TPortfolioPosition; is_loading: boolean; is_multiplier: boolean; is_accumulator: boolean; is_turbos: boolean; + onBuyResponse: (contract_info: { contract_id: number; longcode: string; contract_type: string }) => void; + onHoverPosition: (is_over: boolean, position: TPortfolioPosition, underlying: string) => void; onClickCancel: (contract_id?: number) => void; onClickSell: (contract_id?: number) => void; onMount: () => void; + open_accu_contract: TPortfolioPosition | null; positions: TPortfolioPosition[]; - removePositionById: (id: number) => void; -}; - + removePositionById: (contract_id?: number) => void; + setContractType: (contract_type: string) => void; +}; + +type TAccumulatorBarriersData = { + current_spot: number; + current_spot_time: number; + tick_update_timestamp: number; + accumulators_high_barrier: string; + accumulators_low_barrier: string; + barrier_spot_distance: string; + previous_spot_time: number; +}; +type TAccumulatorContractBarriersData = TAccumulatorBarriersData & { + should_update_contract_barriers: boolean; +}; +type TAddContractParams = { + barrier: number | null; + contract_id: number; + contract_type: string; + start_time: number; + longcode: string; + underlying: string; + is_tick_contract: boolean; + limit_order?: ProposalOpenContract['limit_order']; +}; +type TOnChartBarrierChange = null | ((barrier_1: string, barrier_2?: string) => void); +type TOnChangeParams = { high: string | number; low?: string | number }; +type TBarriers = Array<{ + color: string; + lineStyle: string; + shade?: string; + shadeColor?: string; + high?: string | number; + low?: string | number; + onChange: (barriers: TOnChangeParams) => void; + relative: boolean; + draggable: boolean; + hidePriceLines: boolean; + hideBarrierLine?: boolean; + hideOffscreenLine?: boolean; + title?: string; + onChartBarrierChange: TOnChartBarrierChange | null; + key?: string; + hideOffscreenBarrier?: boolean; + isSingleBarrier?: boolean; + onBarrierChange: (barriers: TOnChangeParams) => void; + updateBarrierColor: (is_dark_mode: boolean) => void; + updateBarriers: (high: string | number, low?: string | number, isFromChart?: boolean) => void; + updateBarrierShade: (should_display: boolean, contract_type: string) => void; + barrier_count: number; + default_shade: string; +}>; type TContractTradeStore = { - contract_info: TPortfolioPosition['contract_info']; - contract_update_stop_loss: string; - contract_update_take_profit: string; - getContractById: (id: number) => TContractStore; - has_contract_update_stop_loss: boolean; - has_contract_update_take_profit: boolean; + accountSwitchListener: () => Promise; + accu_barriers_timeout_id: NodeJS.Timeout | null; + accumulator_barriers_data: Partial; + accumulator_contract_barriers_data: Partial; + addContract: ({ + barrier, + contract_id, + contract_type, + start_time, + longcode, + underlying, + is_tick_contract, + limit_order, + }: TAddContractParams) => void; + chart_type: string; + clearAccumulatorBarriersData: (should_clear_contract_data_only?: boolean, should_clear_timeout?: boolean) => void; + clearError: () => void; + contracts: TContractStore[]; + error_message: string; + getContractById: (contract_id?: number) => TContractStore; + granularity: null | number; + has_crossed_accu_barriers: boolean; + has_error: boolean; + last_contract: TContractStore | Record; + markers_array: Array<{ + type: string; + contract_info: { + accu_barriers_difference: + | boolean + | { + top: string; + bottom: string; + font: string; + }; + has_crossed_accu_barriers: boolean; + is_accumulator_trade_without_contract: boolean; + }; + key: string; + price_array: [string, string]; + epoch_array: [number]; + }>; + onUnmount: () => void; + prev_chart_type: string; + prev_granularity: number | null; + removeContract: (data: { contract_id: string }) => void; + savePreviousChartMode: (chart_type: string, granularity: number | null) => void; + setNewAccumulatorBarriersData: ( + new_barriers_data: TAccumulatorBarriersData, + should_update_contract_barriers?: boolean + ) => void; + updateAccumulatorBarriersData: ({ + accumulators_high_barrier, + accumulators_low_barrier, + barrier_spot_distance, + current_spot, + current_spot_time, + should_update_contract_barriers, + underlying, + }: Partial) => void; + updateChartType: (type: string) => void; + updateGranularity: (granularity: number) => void; + updateProposal: (response: ProposalOpenContract) => void; }; type TContractStore = { @@ -609,11 +817,6 @@ type TContractStore = { validation_errors: { contract_update_stop_loss: string[]; contract_update_take_profit: string[] }; }; -type TMenuStore = { - attach: (item: TMenuItem) => void; - update: (menu: TMenuItem, index: number) => void; -}; - type TNotificationStore = { addNotificationMessage: (message: TNotification) => void; addNotificationMessageByKey: (key: string) => void; @@ -623,16 +826,23 @@ type TNotificationStore = { filterNotificationMessages: () => void; notifications: TNotificationMessage[]; refreshNotifications: () => void; + removeAllNotificationMessages: (should_close_persistent: boolean) => void; removeNotifications: (should_close_persistent: boolean) => void; removeNotificationByKey: ({ key }: { key: string }) => void; removeNotificationMessage: ({ key, should_show_again }: { key: string; should_show_again?: boolean }) => void; removeNotificationMessageByKey: ({ key }: { key: string }) => void; setP2POrderProps: () => void; - showAccountSwitchToRealNotification: (loginid: string, currency: string) => void; setP2PRedirectTo: () => void; + showAccountSwitchToRealNotification: (loginid: string, currency: string) => void; + setShouldShowPopups: (should_show_popups: boolean) => void; toggleNotificationsModal: () => void; }; +type TActiveSymbolsStore = { + active_symbols: ActiveSymbols; + setActiveSymbols: () => Promise; +}; + type TBalance = { currency: string; balance: number; @@ -652,27 +862,31 @@ type TTradersHubStore = { login: string; sub_title: string; icon: 'Derived' | 'Financial' | 'Options' | 'CFDs'; + status?: string; + action_type: 'get' | 'none' | 'trade' | 'dxtrade' | 'multi-action'; + key: string; + name: string; + landing_company_short?: 'bvi' | 'labuan' | 'svg' | 'vanuatu' | 'maltainvest'; + platform?: string; + description?: string; + market_type?: 'all' | 'financial' | 'synthetic'; }[]; openModal: (modal_id: string, props?: unknown) => void; selected_account: { login: string; account_id: string; }; - handleTabItemClick: (idx: number) => void; - is_account_transfer_modal_open: boolean; is_low_risk_cr_eu_real: boolean; is_eu_user: boolean; setIsOnboardingVisited: (is_visited: boolean) => void; show_eu_related_content: boolean; setTogglePlatformType: (platform_type: string) => void; + is_demo: boolean; is_real: boolean; - is_regulators_compare_modal_visible: boolean; - is_tour_open: boolean; selectRegion: (region: string) => void; closeAccountTransferModal: () => void; toggleRegulatorsCompareModal: () => void; - selected_region: string; - openFailedVerificationModal: (selected_account_type: string) => void; + openFailedVerificationModal: (selected_account_type: Record | string) => void; modal_data: TModalData; multipliers_account_status: string; financial_restricted_countries: boolean; @@ -683,12 +897,23 @@ type TTradersHubStore = { no_MF_account: boolean; CFDs_restricted_countries: boolean; toggleAccountTransferModal: () => void; - is_demo: boolean; + is_real_wallets_upgrade_on: boolean; + toggleWalletsUpgrade: (value: boolean) => void; platform_real_balance: TBalance; cfd_demo_balance: TBalance; platform_demo_balance: TBalance; cfd_real_balance: TBalance; selectAccountType: (account_type: string) => void; + is_wallet_migration_failed: boolean; + setWalletsMigrationFailedPopup: (value: boolean) => void; + available_platforms: BrandConfig[]; + selected_region: TRegionAvailability; + getExistingAccounts: (platform: string, market_type: string) => AvailableAccount[]; + toggleAccountTypeModalVisibility: () => void; + active_modal_tab?: 'Deposit' | 'Withdraw' | 'Transfer' | 'Transactions'; + setWalletModalActiveTab: (tab?: 'Deposit' | 'Withdraw' | 'Transfer' | 'Transactions') => void; + active_modal_wallet_id?: string; + setWalletModalActiveWalletID: (wallet_id?: string) => void; available_cfd_accounts: TAvailableCFDAccounts[]; available_dxtrade_accounts: TAvailableCFDAccounts[]; available_ctrader_accounts: TAvailableCFDAccounts[]; @@ -699,12 +924,19 @@ type TTradersHubStore = { available_derivez_accounts: DetailsOfEachMT5Loginid[]; has_any_real_account: boolean; startTrade: () => void; - getExistingAccounts: () => void; getAccount: () => void; - toggleAccountTypeModalVisibility: () => void; showTopUpModal: () => void; }; +type TContractReplay = { + contract_store: { + contract_info: TPortfolioPosition['contract_info']; + digits_info: { [key: number]: { digit: number; spot: string } }; + display_status: string; + is_digit_contract: boolean; + is_ended: boolean; + }; +}; type TGtmStore = { is_gtm_applicable: boolean; visitorId: Readonly; @@ -731,7 +963,6 @@ type TGtmStore = { export type TCoreStores = { client: TClientStore; common: TCommonStore; - menu: TMenuStore; ui: TUiStore; portfolio: TPortfolioStore; contract_trade: TContractTradeStore; @@ -742,9 +973,9 @@ export type TCoreStores = { traders_hub: TTradersHubStore; gtm: TGtmStore; pushwoosh: Record; - contract_replay: Record; + contract_replay: TContractReplay; chart_barrier_store: Record; - active_symbols: Record; + active_symbols: TActiveSymbolsStore; }; export type TStores = TCoreStores & { diff --git a/packages/trader/build/constants.js b/packages/trader/build/constants.js index 1a8cab525725..2560c6ae2b60 100644 --- a/packages/trader/build/constants.js +++ b/packages/trader/build/constants.js @@ -42,6 +42,7 @@ const ALIASES = { Services: path.resolve(__dirname, '../src/Services'), Stores: path.resolve(__dirname, '../src/Stores'), Translations: path.resolve(__dirname, '../src/public/translations'), + Types: path.resolve(__dirname, '../src/Types'), Utils: path.resolve(__dirname, '../src/Utils'), }; diff --git a/packages/trader/package.json b/packages/trader/package.json index 9d802416308b..dcb6682da3a1 100644 --- a/packages/trader/package.json +++ b/packages/trader/package.json @@ -86,8 +86,9 @@ "dependencies": { "@deriv/analytics": "^1.0.0", "@deriv/components": "^1.0.0", - "@deriv/deriv-api": "^1.0.11", - "@deriv/deriv-charts": "1.3.6", + "@deriv/deriv-api": "^1.0.13", + "@deriv/api-types": "^1.0.118", + "@deriv/deriv-charts": "1.4.0", "@deriv/reports": "^1.0.0", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.js b/packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.tsx similarity index 85% rename from packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.js rename to packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.tsx index edea635534de..9f1b66141a40 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.js +++ b/packages/trader/src/App/Components/Elements/ContractAudit/__tests__/contract-details.spec.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { screen, render } from '@testing-library/react'; +import { TContractInfo } from '@deriv/shared'; import ContractDetails from '../contract-details'; describe('ContractDetails', () => { @@ -46,27 +47,27 @@ describe('ContractDetails', () => { }; it('renders the ContractAuditItems specific to Vanilla component when is_vanilla is true', () => { - const wrapper = render( + render( ); - expect(wrapper.queryAllByTestId('dt_bt_label')).toHaveLength(2); + expect(screen.queryAllByTestId('dt_bt_label')).toHaveLength(2); }); it('renders the Payout per point label when is_vanilla is true', () => { render( ); diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.jsx b/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.tsx similarity index 80% rename from packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.jsx rename to packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.tsx index efd400b90269..9fbee190778f 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.jsx +++ b/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit-item.tsx @@ -1,9 +1,17 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { formatDate, formatTime } from '@deriv/shared'; import { Text } from '@deriv/components'; -const ContractAuditItem = ({ icon, id, label, timestamp, value, value2 }) => ( +type TContractAuditItem = { + icon?: React.ReactNode; + id: string; + label?: string; + timestamp?: number; + value: React.ReactNode; + value2?: React.ReactNode; +}; + +const ContractAuditItem = ({ icon, id, label, timestamp, value, value2 }: TContractAuditItem) => (
{icon &&
{icon}
}
@@ -34,13 +42,4 @@ const ContractAuditItem = ({ icon, id, label, timestamp, value, value2 }) => (
); -ContractAuditItem.propTypes = { - icon: PropTypes.node, - id: PropTypes.string, - label: PropTypes.string, - timestamp: PropTypes.string, - value: PropTypes.PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.node]), - value2: PropTypes.PropTypes.oneOfType([PropTypes.number, PropTypes.string]), -}; - export default ContractAuditItem; diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.jsx b/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.tsx similarity index 55% rename from packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.jsx rename to packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.tsx index 24daae7534b5..aaee80ca2f55 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.jsx +++ b/packages/trader/src/App/Components/Elements/ContractAudit/contract-audit.tsx @@ -1,35 +1,56 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Tabs } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { WS } from '@deriv/shared'; +import { WS, TContractStore, TContractInfo } from '@deriv/shared'; +import { useTraderStore } from 'Stores/useTraderStores'; import ContractDetails from './contract-details'; -import ContractHistory from './contract-history.jsx'; +import ContractHistory from './contract-history'; + +type TContractUpdateHistory = TContractStore['contract_update_history']; + +type TContractAudit = Partial< + Pick, 'is_accumulator' | 'is_turbos' | 'is_multiplier' | 'is_vanilla'> +> & { + contract_update_history: TContractUpdateHistory; + contract_end_time: number | undefined; + contract_info: TContractInfo; + duration: string | number; + duration_unit: string; + exit_spot: string | undefined; + has_result: boolean; + is_dark_theme: boolean; + is_open: boolean; + toggleHistoryTab: (state_change?: boolean) => void; +}; + +type TResponse = { + contract_update_history: TContractUpdateHistory; +}; const ContractAudit = ({ contract_update_history, has_result, is_accumulator, is_multiplier, - is_smarttrader_contract, is_turbos, toggleHistoryTab, ...props -}) => { +}: TContractAudit) => { const { contract_id, currency } = props.contract_info; - const [update_history, setUpdateHistory] = React.useState([]); + const [update_history, setUpdateHistory] = React.useState([]); - const getSortedUpdateHistory = history => history.sort((a, b) => b.order_date - a.order_date); + const getSortedUpdateHistory = (history: TContractUpdateHistory) => + history.sort((a, b) => Number(b?.order_date) - Number(a?.order_date)); React.useEffect(() => { if (!!contract_update_history.length && contract_update_history.length > update_history.length) setUpdateHistory(getSortedUpdateHistory(contract_update_history)); }, [contract_update_history, update_history]); - const onTabItemClick = tab_index => { - toggleHistoryTab(tab_index); + const onTabItemClick = (tab_index: number) => { + toggleHistoryTab(!!tab_index); if (tab_index) { - WS.contractUpdateHistory(contract_id).then(response => { + WS.contractUpdateHistory(contract_id).then((response: TResponse) => { setUpdateHistory(getSortedUpdateHistory(response.contract_update_history)); }); } @@ -58,15 +79,4 @@ const ContractAudit = ({ ); }; -ContractAudit.propTypes = { - contract_info: PropTypes.object, - contract_update_history: PropTypes.array, - has_result: PropTypes.bool, - is_accumulator: PropTypes.bool, - is_multiplier: PropTypes.bool, - is_smarttrader_contract: PropTypes.bool, - is_turbos: PropTypes.bool, - toggleHistoryTab: PropTypes.func, -}; - export default ContractAudit; diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/contract-details.jsx b/packages/trader/src/App/Components/Elements/ContractAudit/contract-details.tsx similarity index 80% rename from packages/trader/src/App/Components/Elements/ContractAudit/contract-details.jsx rename to packages/trader/src/App/Components/Elements/ContractAudit/contract-details.tsx index 51e4083bdccf..d209c6a1a68f 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/contract-details.jsx +++ b/packages/trader/src/App/Components/Elements/ContractAudit/contract-details.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Money, Icon, ThemedScrollbars } from '@deriv/components'; import { localize } from '@deriv/translations'; @@ -17,6 +16,7 @@ import { isEndedBeforeCancellationExpired, isUserCancelled, toGMTFormat, + TContractInfo, } from '@deriv/shared'; import { addCommaToNumber, @@ -24,10 +24,26 @@ import { getBarrierValue, isDigitType, } from 'App/Components/Elements/PositionsDrawer/helpers'; -import ContractAuditItem from './contract-audit-item.jsx'; +import ContractAuditItem from './contract-audit-item'; import { isCancellationExpired } from 'Stores/Modules/Trading/Helpers/logic'; -const ContractDetails = ({ contract_end_time, contract_info, duration, duration_unit, exit_spot, is_vanilla }) => { +type TContractDetails = { + contract_end_time?: number; + contract_info: TContractInfo; + duration: number | string; + duration_unit: string; + exit_spot?: string; + is_vanilla?: boolean; +}; + +const ContractDetails = ({ + contract_end_time, + contract_info, + duration, + duration_unit, + exit_spot, + is_vanilla, +}: TContractDetails) => { const { commission, contract_type, @@ -45,15 +61,16 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ display_number_of_contracts, } = contract_info; - const is_profit = profit >= 0; + const is_profit = Number(profit) >= 0; const cancellation_price = getCancellationPrice(contract_info); const show_barrier = !is_vanilla && !isAccumulatorContract(contract_type) && !isSmartTraderContract(contract_type); - const show_duration = !isAccumulatorContract(contract_type) || !isNaN(contract_end_time); + const show_duration = !isAccumulatorContract(contract_type) || !isNaN(Number(contract_end_time)); const show_payout_per_point = isTurbosContract(contract_type) || is_vanilla; + const ticks_label = Number(tick_count) < 2 ? localize('tick') : localize('ticks'); const show_strike_barrier = is_vanilla || isAsiansContract(contract_type); const ticks_duration_text = isAccumulatorContract(contract_type) ? `${tick_passed}/${tick_count} ${localize('ticks')}` - : `${tick_count} ${tick_count < 2 ? localize('tick') : localize('ticks')}`; + : `${tick_count} ${ticks_label}`; const getLabel = () => { if (isUserSold(contract_info) && isEndedBeforeCancellationExpired(contract_info)) @@ -62,7 +79,6 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ if (isCancellationExpired(contract_info)) return localize('Deal cancellation (expired)'); return localize('Deal cancellation (active)'); }; - return (
@@ -79,7 +95,7 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ id='dt_commission_label' icon={} label={localize('Commission')} - value={} + value={} /> {!!cancellation_price && ( } label={localize('Duration')} - value={tick_count > 0 ? ticks_duration_text : `${duration} ${duration_unit}`} + value={Number(tick_count) > 0 ? ticks_duration_text : `${duration} ${duration_unit}`} /> )} {show_strike_barrier && ( @@ -144,7 +160,11 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ id='dt_bt_label' icon={} label={localize('Payout per point')} - value={`${display_number_of_contracts} ${getCurrencyDisplayCode(currency)}` || ' - '} + value={ + display_number_of_contracts + ? `${display_number_of_contracts} ${getCurrencyDisplayCode(currency)}` + : ' - ' + } /> )} @@ -153,32 +173,32 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ id='dt_start_time_label' icon={} label={localize('Start time')} - value={toGMTFormat(epochToMoment(date_start)) || ' - '} + value={toGMTFormat(epochToMoment(Number(date_start))) || ' - '} /> {!isDigitType(contract_type) && ( } label={localize('Entry spot')} - value={addCommaToNumber(entry_spot_display_value) || ' - '} - value2={toGMTFormat(epochToMoment(entry_tick_time)) || ' - '} + value={addCommaToNumber(Number(entry_spot_display_value)) || ' - '} + value2={toGMTFormat(epochToMoment(Number(entry_tick_time))) || ' - '} /> )} - {!isNaN(exit_spot) && ( + {!isNaN(Number(exit_spot)) && ( } label={localize('Exit spot')} - value={addCommaToNumber(exit_spot) || ' - '} - value2={toGMTFormat(epochToMoment(exit_tick_time)) || ' - '} + value={addCommaToNumber(Number(exit_spot)) || ' - '} + value2={toGMTFormat(epochToMoment(Number(exit_tick_time))) || ' - '} /> )} - {!isNaN(contract_end_time) && ( + {!isNaN(Number(contract_end_time)) && ( } label={localize('Exit time')} - value={toGMTFormat(epochToMoment(contract_end_time)) || ' - '} + value={toGMTFormat(epochToMoment(Number(contract_end_time))) || ' - '} /> )}
@@ -186,14 +206,4 @@ const ContractDetails = ({ contract_end_time, contract_info, duration, duration_ ); }; -ContractDetails.propTypes = { - contract_end_time: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - contract_info: PropTypes.object, - date_start: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - duration: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - duration_unit: PropTypes.string, - exit_spot: PropTypes.string, - is_vanilla: PropTypes.bool, -}; - export default ContractDetails; diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/contract-history.jsx b/packages/trader/src/App/Components/Elements/ContractAudit/contract-history.tsx similarity index 75% rename from packages/trader/src/App/Components/Elements/ContractAudit/contract-history.jsx rename to packages/trader/src/App/Components/Elements/ContractAudit/contract-history.tsx index 239c8ee4d8fc..af17015ee0a6 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/contract-history.jsx +++ b/packages/trader/src/App/Components/Elements/ContractAudit/contract-history.tsx @@ -1,12 +1,14 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Icon, Money, ThemedScrollbars, Text } from '@deriv/components'; -import { isMobile } from '@deriv/shared'; - +import { isMobile, TContractStore } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import ContractAuditItem from './contract-audit-item.jsx'; +import ContractAuditItem from './contract-audit-item'; -const ContractHistory = ({ currency, history = [] }) => { +type TContractHistory = { + currency?: string; + history: [] | TContractStore['contract_update_history']; +}; +const ContractHistory = ({ currency, history = [] }: TContractHistory) => { if (!history.length) { return (
@@ -23,14 +25,14 @@ const ContractHistory = ({ currency, history = [] }) => {
{history.map((item, key) => ( - {+item.order_amount < 0 && -} + {Number(item.order_amount) < 0 && -} {item.value && ( @@ -50,9 +52,4 @@ const ContractHistory = ({ currency, history = [] }) => { ); }; -ContractHistory.propTypes = { - currency: PropTypes.string, - history: PropTypes.array, -}; - export default ContractHistory; diff --git a/packages/trader/src/App/Components/Elements/ContractAudit/index.js b/packages/trader/src/App/Components/Elements/ContractAudit/index.js index 1cf766ffd8e6..5051cc70b69f 100644 --- a/packages/trader/src/App/Components/Elements/ContractAudit/index.js +++ b/packages/trader/src/App/Components/Elements/ContractAudit/index.js @@ -1,3 +1,3 @@ -import ContractAudit from './contract-audit.jsx'; +import ContractAudit from './contract-audit'; export default ContractAudit; 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.tsx similarity index 80% rename from packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx rename to packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.tsx index 3bac2237f157..9b8709b0b4a2 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.tsx @@ -1,5 +1,4 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { DesktopWrapper, MobileWrapper, Collapsible, ContractCard, useHover } from '@deriv/components'; import { @@ -9,18 +8,45 @@ import { getContractTypeDisplay, isCryptoContract, isDesktop, + toMoment, } from '@deriv/shared'; import { getMarketInformation } from 'Utils/Helpers/market-underlying'; -import { SwipeableContractDrawer } from './swipeable-components.jsx'; -import MarketClosedContractOverlay from './market-closed-contract-overlay.jsx'; +import { SwipeableContractDrawer } from './swipeable-components'; +import MarketClosedContractOverlay from './market-closed-contract-overlay'; import { useTraderStore } from 'Stores/useTraderStores'; import { observer, useStore } from '@deriv/stores'; +type TContractCardBodyProps = React.ComponentProps; +type TContractCardFooterProps = React.ComponentProps; +type TSwipeableContractDrawerProps = React.ComponentProps; + +type TContractDrawerCardProps = { + currency?: string; + is_collapsed: boolean; + is_market_closed: boolean; + is_smarttrader_contract: boolean; + result?: string; + server_time?: moment.Moment; + toggleContractAuditDrawer: () => void; +} & Pick< + TContractCardBodyProps, + | 'contract_info' + | 'contract_update' + | 'is_accumulator' + | 'is_mobile' + | 'is_multiplier' + | 'is_turbos' + | 'is_vanilla' + | 'status' +> & + Pick & + Pick; + const ContractDrawerCard = observer( ({ contract_info, contract_update, - currency, + currency = '', is_accumulator, is_collapsed, is_market_closed, @@ -35,10 +61,10 @@ const ContractDrawerCard = observer( onSwipedUp, onSwipedDown, result, - server_time, + server_time = toMoment(), status, toggleContractAuditDrawer, - }) => { + }: TContractDrawerCardProps) => { const { ui, contract_trade } = useStore(); const { active_symbols } = useTraderStore(); const { @@ -50,13 +76,13 @@ const ContractDrawerCard = observer( toggleCancellationWarning, } = ui; const { getContractById } = contract_trade; - const [hover_ref, should_hide_closed_overlay] = useHover(); + const [hover_ref, should_hide_closed_overlay] = useHover(); const { profit, validation_error } = contract_info; const is_sold = !!getEndTime(contract_info); const display_name = getSymbolDisplayName( active_symbols, - getMarketInformation(contract_info.shortcode).underlying + getMarketInformation(contract_info.shortcode || '').underlying ); const is_crypto = isCryptoContract(contract_info.underlying); @@ -83,7 +109,7 @@ const ContractDrawerCard = observer( contract_info={contract_info} contract_update={contract_update} currency={currency} - current_focus={current_focus} + current_focus={current_focus ?? ''} getCardLabels={getCardLabels} getContractById={getContractById} is_accumulator={is_accumulator} @@ -97,7 +123,7 @@ const ContractDrawerCard = observer( server_time={server_time} setCurrentFocus={setCurrentFocus} should_show_cancellation_warning={should_show_cancellation_warning} - status={status} + status={status ?? ''} toggleCancellationWarning={toggleCancellationWarning} /> ); @@ -111,7 +137,6 @@ const ContractDrawerCard = observer( onClickCancel={onClickCancel} onClickSell={onClickSell} server_time={server_time} - status={status} /> ); @@ -127,13 +152,13 @@ const ContractDrawerCard = observer( contract_info={contract_info} getCardLabels={getCardLabels} is_multiplier={is_multiplier} - profit_loss={profit} + profit_loss={Number(profit)} should_show_result_overlay={false} >
0 && !result, - 'dc-contract-card--red': profit < 0 && !result, + 'dc-contract-card--green': Number(profit) > 0 && !result, + 'dc-contract-card--red': Number(profit) < 0 && !result, 'contract-card__market-closed--disabled': is_market_closed && should_hide_closed_overlay, })} ref={hover_ref} @@ -175,13 +200,4 @@ const ContractDrawerCard = observer( } ); -ContractDrawerCard.propTypes = { - currency: PropTypes.string, - is_accumulator: PropTypes.bool, - is_smarttrader_contract: PropTypes.bool, - is_collapsed: PropTypes.bool, - is_turbos: PropTypes.bool, - onClickCancel: PropTypes.func, - onClickSell: PropTypes.func, -}; 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.tsx similarity index 84% rename from packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx rename to packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.tsx index 0d51eae66590..69045cc10ab8 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.tsx @@ -1,7 +1,6 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; -import { withRouter } from 'react-router'; +import { RouteComponentProps, withRouter } from 'react-router'; import { CSSTransition } from 'react-transition-group'; import { DesktopWrapper, MobileWrapper, Div100vhContainer } from '@deriv/components'; import { @@ -11,13 +10,35 @@ import { getDurationTime, getDurationUnitText, getEndTime, + TContractStore, } from '@deriv/shared'; import ContractAudit from 'App/Components/Elements/ContractAudit'; import { PositionsCardLoader } from 'App/Components/Elements/ContentLoader'; import ContractDrawerCard from './contract-drawer-card'; -import { SwipeableContractAudit } from './swipeable-components.jsx'; +import { SwipeableContractAudit } from './swipeable-components'; import { observer, useStore } from '@deriv/stores'; +type TContractDrawerCardProps = React.ComponentProps; +type TContractDrawerProps = RouteComponentProps & { + contract_update_history: TContractStore['contract_update_history']; + is_dark_theme: boolean; + toggleHistoryTab: (state_change?: boolean) => void; +} & Pick< + TContractDrawerCardProps, + | 'contract_info' + | 'contract_update' + | 'is_accumulator' + | 'is_market_closed' + | 'is_multiplier' + | 'is_sell_requested' + | 'is_smarttrader_contract' + | 'is_turbos' + | 'is_vanilla' + | 'onClickCancel' + | 'onClickSell' + | 'status' + >; + const ContractDrawer = observer( ({ contract_info, @@ -35,13 +56,13 @@ const ContractDrawer = observer( onClickSell, status, toggleHistoryTab, - }) => { + }: TContractDrawerProps) => { 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 contract_drawer_ref = React.useRef(null); + const contract_drawer_card_ref = React.useRef(null); const [should_show_contract_audit, setShouldShowContractAudit] = React.useState(false); const exit_spot = isUserSold(contract_info) && !is_accumulator && !is_multiplier && !is_turbos @@ -56,7 +77,6 @@ const ContractDrawer = observer( is_accumulator={is_accumulator} is_dark_theme={is_dark_theme} is_multiplier={is_multiplier} - is_smarttrader_contract={is_smarttrader_contract} is_open is_turbos={is_turbos} duration={getDurationTime(contract_info)} @@ -102,7 +122,7 @@ const ContractDrawer = observer( ) : (
- +
); @@ -119,11 +139,10 @@ const ContractDrawer = observer( 'contract-drawer--is-multiplier-sold': is_multiplier && isMobile() && getEndTime(contract_info), })} style={{ - transform: - should_show_contract_audit && + transform: (should_show_contract_audit && contract_drawer_ref.current && contract_drawer_card_ref.current && - `translateY(calc(${contract_drawer_card_ref.current.clientHeight}px - ${contract_drawer_ref.current.clientHeight}px))`, + `translateY(calc(${contract_drawer_card_ref.current.clientHeight}px - ${contract_drawer_ref.current.clientHeight}px))`) as React.CSSProperties['transform'], }} ref={contract_drawer_ref} > @@ -162,13 +181,4 @@ const ContractDrawer = observer( } ); -ContractDrawer.propTypes = { - is_accumulator: PropTypes.bool, - is_multiplier: PropTypes.bool, - is_vanilla: PropTypes.bool, - is_smarttrader_contract: PropTypes.bool, - is_turbos: PropTypes.bool, - toggleHistoryTab: PropTypes.func, -}; - export default withRouter(ContractDrawer); diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/index.js b/packages/trader/src/App/Components/Elements/ContractDrawer/index.js deleted file mode 100644 index 34ed63b1b74e..000000000000 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ContractDrawer from './contract-drawer.jsx'; - -export default ContractDrawer; diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/index.ts b/packages/trader/src/App/Components/Elements/ContractDrawer/index.ts new file mode 100644 index 000000000000..563d551f3b95 --- /dev/null +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/index.ts @@ -0,0 +1,3 @@ +import ContractDrawer from './contract-drawer'; + +export default ContractDrawer; diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.jsx b/packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.tsx similarity index 64% rename from packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.jsx rename to packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.tsx index 8d3d47aeb479..8538cd1de2c6 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/market-closed-contract-overlay.tsx @@ -1,8 +1,7 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Text } from '@deriv/components'; -const MarketClosedContractOverlay = ({ validation_error }) => ( +const MarketClosedContractOverlay = ({ validation_error }: { validation_error?: string }) => (
{validation_error} @@ -10,8 +9,4 @@ const MarketClosedContractOverlay = ({ validation_error }) => (
); -MarketClosedContractOverlay.propTypes = { - symbol: PropTypes.string, -}; - export default MarketClosedContractOverlay; diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.jsx b/packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.tsx similarity index 75% rename from packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.jsx rename to packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.tsx index 9b9e917c28b3..55aefd7f33e7 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/swipeable-components.tsx @@ -1,13 +1,21 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import ReactDOM from 'react-dom'; import { SwipeableWrapper } from '@deriv/components'; +type TSwipeableContractAuditProps = React.PropsWithChildren<{ + is_multiplier?: boolean; + onSwipedDown?: () => void; +}>; +type TSwipeableContractDrawerProps = React.PropsWithChildren<{ + onSwipedDown?: () => void; + onSwipedUp?: () => void; +}>; + /** * Swipeable components */ -export const SwipeableContractAudit = ({ is_multiplier, children, onSwipedDown }) => { +export const SwipeableContractAudit = ({ is_multiplier, children, onSwipedDown }: TSwipeableContractAuditProps) => { const swipe_handlers = SwipeableWrapper.useSwipeable({ onSwipedDown, }); @@ -31,13 +39,7 @@ export const SwipeableContractAudit = ({ is_multiplier, children, onSwipedDown } ); }; -SwipeableContractAudit.propTypes = { - is_multiplier: PropTypes.bool, - children: PropTypes.node, - onSwipedDown: PropTypes.func, -}; - -export const SwipeableContractDrawer = ({ children, onSwipedDown, onSwipedUp }) => { +export const SwipeableContractDrawer = ({ children, onSwipedDown, onSwipedUp }: TSwipeableContractDrawerProps) => { const swipe_handlers = SwipeableWrapper.useSwipeable({ onSwipedDown, onSwipedUp, @@ -45,9 +47,3 @@ export const SwipeableContractDrawer = ({ children, onSwipedDown, onSwipedUp }) return
{children}
; }; - -SwipeableContractDrawer.propTypes = { - children: PropTypes.node, - onSwipedDown: PropTypes.func, - onSwipedUp: PropTypes.func, -}; diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/account-verification-required-modal.spec.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/account-verification-required-modal.spec.tsx index e8d4b3f23adc..5b078a65f760 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/account-verification-required-modal.spec.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/account-verification-required-modal.spec.tsx @@ -1,10 +1,11 @@ import React from 'react'; -import { screen, render } from '@testing-library/react'; import { createBrowserHistory } from 'history'; -import AccountVerificationRequiredModal from '../account-verification-required-modal'; import { Router } from 'react-router-dom'; +import { screen, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { routes, isMobile } from '@deriv/shared'; +import { routes } from '@deriv/shared'; +import { useStore } from '@deriv/stores'; +import AccountVerificationRequiredModal from '../account-verification-required-modal'; type TModal = React.FC<{ children: React.ReactNode; @@ -20,6 +21,16 @@ type TModal = React.FC<{ }>; }; +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: true, + }, + })), +})); + jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), isMobile: jest.fn(() => true), @@ -65,7 +76,11 @@ describe('', () => { expect(screen.getByText('auto')).toBeInTheDocument(); }); it('height should be 220px if isMobile is false', () => { - (isMobile as jest.Mock).mockReturnValue(false); + (useStore as jest.Mock).mockReturnValue({ + ui: { + is_mobile: false, + }, + }); render(); expect(screen.getByText('220px')).toBeInTheDocument(); }); diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/company-wide-limit-exceeded-modal.spec.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/company-wide-limit-exceeded-modal.spec.tsx index dba3b83f6656..8c839fe66352 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/company-wide-limit-exceeded-modal.spec.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/company-wide-limit-exceeded-modal.spec.tsx @@ -37,6 +37,16 @@ jest.mock('@deriv/components', () => { }; }); +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), +})); + describe('', () => { const mocked_props = { is_visible: true, diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/insufficient-balance-modal.spec.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/insufficient-balance-modal.spec.tsx index 997818dba918..fe4cdde3c975 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/insufficient-balance-modal.spec.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/insufficient-balance-modal.spec.tsx @@ -19,6 +19,16 @@ type TModal = React.FC<{ }>; }; +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), +})); + jest.mock('@deriv/components', () => { const original_module = jest.requireActual('@deriv/components'); const Modal: TModal = jest.fn(({ children, is_open, title }) => { diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/account-verification-required-modal.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/account-verification-required-modal.tsx index 58a5ed336f42..d04e470a271a 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/account-verification-required-modal.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/account-verification-required-modal.tsx @@ -1,42 +1,48 @@ import React from 'react'; +import { useHistory } from 'react-router-dom'; import { Button, Modal } from '@deriv/components'; +import { routes } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import { localize, Localize } from '@deriv/translations'; -import { isMobile, routes } from '@deriv/shared'; -import { useHistory } from 'react-router-dom'; type TAccountVerificationRequiredModalProps = { is_visible: boolean; onConfirm: () => void; }; -const AccountVerificationRequiredModal = ({ is_visible, onConfirm }: TAccountVerificationRequiredModalProps) => { - const history = useHistory(); - return ( - - - - +const AccountVerificationRequiredModal = observer( + ({ is_visible, onConfirm }: TAccountVerificationRequiredModalProps) => { + const history = useHistory(); + const { + ui: { is_mobile }, + } = useStore(); + return ( + + + + -
- -
-
- ); -}; +
+ +
+
+ ); + } +); export default AccountVerificationRequiredModal; diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/company-wide-limit-exceeded-modal.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/company-wide-limit-exceeded-modal.tsx index 2e8843804617..72b4ca5e2957 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/company-wide-limit-exceeded-modal.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/company-wide-limit-exceeded-modal.tsx @@ -1,19 +1,22 @@ import React from 'react'; import { Button, Modal, StaticUrl } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; import { localize, Localize } from '@deriv/translations'; -import { isMobile } from '@deriv/shared'; type TCompanyWideLimitExceededModal = { is_visible: boolean; onConfirm: () => void; }; -const CompanyWideLimitExceededModal = ({ is_visible, onConfirm }: TCompanyWideLimitExceededModal) => { +const CompanyWideLimitExceededModal = observer(({ is_visible, onConfirm }: TCompanyWideLimitExceededModal) => { + const { + ui: { is_mobile }, + } = useStore(); return ( @@ -28,6 +31,6 @@ const CompanyWideLimitExceededModal = ({ is_visible, onConfirm }: TCompanyWideLi ); -}; +}); export default CompanyWideLimitExceededModal; diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/insufficient-balance-modal.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/insufficient-balance-modal.tsx index ca272f97b474..f4fe48a7c416 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/insufficient-balance-modal.tsx +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/insufficient-balance-modal.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { RouteComponentProps, withRouter } from 'react-router-dom'; import { Button, Modal } from '@deriv/components'; -import { routes, isMobile } from '@deriv/shared'; +import { routes } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; type TInsufficientBalanceModal = RouteComponentProps & { @@ -11,38 +12,39 @@ type TInsufficientBalanceModal = RouteComponentProps & { toggleModal: () => void; }; -const InsufficientBalanceModal = ({ - history, - is_virtual, - is_visible, - message, - toggleModal, -}: TInsufficientBalanceModal) => ( - - {message} - - {/* TODO: Add topping up mechanism for demo accounts after confirmation */} -
{result || !!contract_info.is_sold ? ( - @@ -210,7 +232,7 @@ const PositionsModalCard = observer( is_loading={is_loading} start_time={contract_info.date_start} expiry_time={contract_info.date_expiry} - server_time={server_time} + server_time={server_time as moment.Moment} ticks_count={contract_info.tick_count} /> )} @@ -238,7 +260,7 @@ const PositionsModalCard = observer( is_mobile={is_mobile} is_sell_requested={is_sell_requested} onClickSell={onClickSell} - server_time={server_time} + server_time={server_time as moment.Moment} /> @@ -268,7 +290,7 @@ const PositionsModalCard = observer( {localize('Entry spot:')} - +
@@ -276,14 +298,13 @@ const PositionsModalCard = observer( {localize('Strike:')} - +
{result || !!contract_info.is_sold ? ( - @@ -295,7 +316,7 @@ const PositionsModalCard = observer( is_loading={is_loading} start_time={contract_info.date_start} expiry_time={contract_info.date_expiry} - server_time={server_time} + server_time={server_time as moment.Moment} ticks_count={contract_info.tick_count} /> )} @@ -327,8 +348,7 @@ const PositionsModalCard = observer( is_sell_requested={is_sell_requested} onClickCancel={onClickCancel} onClickSell={onClickSell} - server_time={server_time} - status={status} + server_time={server_time as moment.Moment} /> ); @@ -343,7 +363,7 @@ const PositionsModalCard = observer( is_mobile={is_mobile} is_sell_requested={is_sell_requested} onClickSell={onClickSell} - server_time={server_time} + server_time={server_time as moment.Moment} /> ); @@ -364,7 +384,7 @@ const PositionsModalCard = observer( is_turbos={is_turbos} has_progress_slider={is_mobile && has_progress_slider && !has_ended} removeToast={removeToast} - server_time={server_time} + server_time={server_time as moment.Moment} setCurrentFocus={setCurrentFocus} should_show_cancellation_warning={should_show_cancellation_warning} status={status} @@ -380,8 +400,7 @@ const PositionsModalCard = observer( is_sell_requested={is_sell_requested} onClickCancel={onClickCancel} onClickSell={onClickSell} - server_time={server_time} - status={status} + server_time={server_time as moment.Moment} /> ); @@ -431,31 +450,4 @@ const PositionsModalCard = observer( } ); -PositionsModalCard.propTypes = { - className: PropTypes.string, - contract_info: PropTypes.object, - contract_update: PropTypes.object, - currency: 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]), - id: PropTypes.number, - indicative: PropTypes.number, - is_loading: PropTypes.bool, - is_sell_requested: PropTypes.bool, - is_unsupported: PropTypes.bool, - is_valid_to_sell: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]), - onClickSell: PropTypes.func, - onClickCancel: PropTypes.func, - profit_loss: PropTypes.number, - result: PropTypes.string, - sell_price: PropTypes.number, - sell_time: PropTypes.number, - status: PropTypes.string, - togglePositions: PropTypes.func, - toggleUnsupportedContractModal: PropTypes.func, - type: PropTypes.string, -}; - export default PositionsModalCard; diff --git a/packages/trader/src/App/Components/Elements/PositionsDrawer/result-mobile.jsx b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-result-mobile.tsx similarity index 89% rename from packages/trader/src/App/Components/Elements/PositionsDrawer/result-mobile.jsx rename to packages/trader/src/App/Components/Elements/PositionsDrawer/positions-result-mobile.tsx index a1578df1b511..f6ecf2403bba 100644 --- a/packages/trader/src/App/Components/Elements/PositionsDrawer/result-mobile.jsx +++ b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-result-mobile.tsx @@ -1,11 +1,15 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { CSSTransition } from 'react-transition-group'; import { Icon } from '@deriv/components'; import { localize } from '@deriv/translations'; -const ResultMobile = ({ is_visible, result }) => { +type TPositionsResultMobile = { + is_visible: boolean; + result: 'won' | 'lost'; +}; + +const PositionsResultMobile = ({ is_visible, result }: TPositionsResultMobile) => { const is_contract_won = result === 'won'; return ( @@ -44,9 +48,4 @@ const ResultMobile = ({ is_visible, result }) => { ); }; -ResultMobile.propTypes = { - is_visible: PropTypes.bool, - result: PropTypes.string, -}; - -export default ResultMobile; +export default PositionsResultMobile; diff --git a/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions-mobile.spec.tsx b/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions-mobile.spec.tsx index cd2855ab77f7..8286a25344b1 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions-mobile.spec.tsx +++ b/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions-mobile.spec.tsx @@ -7,26 +7,58 @@ import { mockStore } from '@deriv/stores'; import { TCoreStores } from '@deriv/stores/types'; import { BrowserRouter } from 'react-router-dom'; -const default_mocked_props = { +const default_mocked_props: React.ComponentProps = { active_positions_count: 0, - filtered_positions: [], currency: 'USD', - disableApp: jest.fn(), - enableApp: jest.fn(), error: '', + filtered_positions: [ + { + contract_info: { + contract_id: 215925907928, + contract_type: 'CALL', + is_sold: 0, + shortcode: 'CALL_1HZ100V_76.33_1692187938_1692188838_S0P_0', + underlying: '1HZ100V', + }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, + }, + { + contract_info: { + contract_id: 2, + contract_type: 'PUT', + is_sold: 0, + shortcode: 'PUT_R_10_19.53_1691443887_1691444787_S0P_0', + underlying: 'R_100', + }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, + }, + ], is_empty: true, onClickSell: jest.fn(), onClickCancel: jest.fn(), - toggleUnsupportedContractModal: jest.fn(), }; + const default_mock_store = { ui: { togglePositionsDrawer: jest.fn(), + toggleUnsupportedContractModal: jest.fn(), is_positions_drawer_on: false, }, }; -jest.mock('App/Components/Elements/PositionsDrawer/positions-modal-card.jsx', () => +jest.mock('App/Components/Elements/PositionsDrawer/positions-modal-card', () => jest.fn(props =>
PositionsModalCard
) ); @@ -68,29 +100,47 @@ describe('TogglePositionsMobile component', () => { expect(screen.getByText(/You have no open positions for this asset./i)).toBeInTheDocument(); }); it('should display 2 positions when is_positions_drawer_on === true, is_empty === false, and has 2 active positions', () => { - const new_mocked_props = { + const new_mocked_props: React.ComponentProps = { active_positions_count: 2, + currency: 'USD', + error: '', filtered_positions: [ { contract_info: { - contract_id: '1', + contract_id: 1, contract_type: 'CALL', is_sold: 0, shortcode: 'CALL_R_10_19.54_1691443851_1691444751_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, { contract_info: { - contract_id: '2', + contract_id: 2, contract_type: 'PUT', is_sold: 0, shortcode: 'PUT_R_10_19.53_1691443887_1691444787_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, ], is_empty: false, + onClickSell: jest.fn(), + onClickCancel: jest.fn(), }; const mock_root_store = mockStore({ ...default_mock_store, @@ -101,29 +151,47 @@ describe('TogglePositionsMobile component', () => { expect(screen.getAllByText(/PositionsModalCard/i)).toHaveLength(2); }); it('should display 1 of 2 positions after closing the modal if one of the 2 positions is sold', async () => { - const new_mocked_props = { + const new_mocked_props: React.ComponentProps = { active_positions_count: 1, + currency: 'USD', + error: '', filtered_positions: [ { contract_info: { - contract_id: '1', + contract_id: 1, contract_type: 'CALL', is_sold: 0, shortcode: 'CALL_R_10_19.54_1691443851_1691444751_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, { contract_info: { - contract_id: '2', + contract_id: 2, contract_type: 'PUT', is_sold: 1, shortcode: 'PUT_R_10_19.53_1691443887_1691444787_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, ], is_empty: false, + onClickSell: jest.fn(), + onClickCancel: jest.fn(), }; const mock_root_store = mockStore({ ...default_mock_store, @@ -140,24 +208,38 @@ describe('TogglePositionsMobile component', () => { }); }); it('should display no more than 5 recent positions', () => { - const positions_pair = [ + const positions_pair: React.ComponentProps['filtered_positions'] = [ { contract_info: { - contract_id: '1', + contract_id: 1, contract_type: 'CALL', is_sold: 0, shortcode: 'CALL_R_10_19.54_1691443851_1691444751_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, { contract_info: { - contract_id: '2', + contract_id: 2, contract_type: 'PUT', is_sold: 0, shortcode: 'PUT_R_10_19.53_1691443887_1691444787_S0P_0', underlying: 'R_100', }, + contract_update: {}, + display_name: 'Volatility 100 (1s) Index', + indicative: 29.55, + reference: 430851089968, + is_sell_requested: false, + is_unsupported: false, + profit_loss: -9.45, }, ]; const new_mocked_props = { diff --git a/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions.spec.tsx b/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions.spec.tsx index 19770e5e8bf3..20e13be8dd7a 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions.spec.tsx +++ b/packages/trader/src/App/Components/Elements/TogglePositions/__tests__/toggle-positions.spec.tsx @@ -1,29 +1,35 @@ import React from 'react'; import userEvent from '@testing-library/user-event'; import { render, screen } from '@testing-library/react'; -import TogglePositions from '../toggle-positions.jsx'; +import TogglePositions from '../toggle-positions'; + +const default_props = { + is_open: false, + positions_count: 0, + togglePositions: jest.fn(), +}; describe('TogglePositions component', () => { it('should have "positions-toggle--active" class when "is_open" is "true"', () => { - render(); + render(); expect(screen.getByTestId('dt_positions_toggle')).toHaveClass('positions-toggle--active'); }); it('should have "positions-toggle--has-count" class when "positions_count > 0"', () => { - render(); + render(); expect(screen.getByTestId('dt_positions_toggle')).toHaveClass('positions-toggle--has-count'); }); it('should call "togglePositions" when the user clicked on the link', () => { const mockTogglePositions = jest.fn(); - render(); + render(); const link = screen.getByTestId('dt_positions_toggle'); userEvent.click(link); expect(mockTogglePositions).toHaveBeenCalledTimes(1); }); it('should render "IcPortfolio" icon', () => { - render(); + render(); expect(screen.getByTestId('dt_icon')).toBeVisible(); }); }); diff --git a/packages/trader/src/App/Components/Elements/TogglePositions/index.js b/packages/trader/src/App/Components/Elements/TogglePositions/index.js index 117ed97b03fd..c97185e5654a 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/index.js +++ b/packages/trader/src/App/Components/Elements/TogglePositions/index.js @@ -1,3 +1,3 @@ -import TogglePositions from './toggle-positions.jsx'; +import TogglePositions from './toggle-positions'; export default TogglePositions; 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.tsx similarity index 88% rename from packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx rename to packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.tsx index d17e8ca51eed..210c358e5952 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx +++ b/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.tsx @@ -5,25 +5,33 @@ import { routes } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { NavLink } from 'react-router-dom'; import EmptyPortfolioMessage from '../EmptyPortfolioMessage'; -import PositionsModalCard from 'App/Components/Elements/PositionsDrawer/positions-modal-card.jsx'; -import TogglePositions from './toggle-positions.jsx'; +import PositionsModalCard from 'App/Components/Elements/PositionsDrawer/positions-modal-card'; +import TogglePositions from './toggle-positions'; import { observer, useStore } from '@deriv/stores'; +type TTogglePositionsMobile = Pick< + ReturnType['portfolio'], + 'active_positions_count' | 'error' | 'onClickSell' | 'onClickCancel' +> & { + currency: ReturnType['client']['currency']; + filtered_positions: ReturnType['portfolio']['all_positions']; + is_empty: boolean; +}; + +type THiddenPositionsId = TTogglePositionsMobile['filtered_positions'][0]['id']; + const TogglePositionsMobile = observer( ({ active_positions_count, currency, - disableApp, - enableApp, error, filtered_positions, is_empty, onClickSell, onClickCancel, - toggleUnsupportedContractModal, - }) => { - const { togglePositionsDrawer, is_positions_drawer_on } = useStore().ui; - const [hidden_positions_ids, setHiddenPositionsIds] = React.useState([]); + }: TTogglePositionsMobile) => { + const { togglePositionsDrawer, toggleUnsupportedContractModal, is_positions_drawer_on } = useStore().ui; + const [hidden_positions_ids, setHiddenPositionsIds] = React.useState([]); const displayed_positions = filtered_positions .filter(p => hidden_positions_ids.every(hidden_position_id => hidden_position_id !== p.contract_info.contract_id) @@ -37,7 +45,6 @@ const TogglePositionsMobile = observer( setHiddenPositionsIds([...new Set([...hidden_positions_ids, ...closed_positions_ids])]); togglePositionsDrawer(); }; - // Show only 5 most recent open contracts const body_content = ( @@ -84,8 +91,6 @@ const TogglePositionsMobile = observer( id='dt_mobile_positions' is_vertical_top has_close_icon - enableApp={enableApp} - disableApp={disableApp} width='calc(100vw - 32px)' > diff --git a/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.jsx b/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.tsx similarity index 74% rename from packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.jsx rename to packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.tsx index c37fb05d11f0..7e7691372e11 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.jsx +++ b/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions.tsx @@ -1,10 +1,15 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { Icon } from '@deriv/components'; import 'Sass/app/_common/components/positions-toggle.scss'; -const TogglePositions = ({ positions_count, is_open, togglePositions }) => { +type TTogglePositions = { + positions_count: number; + is_open: boolean; + togglePositions: () => void; +}; + +const TogglePositions = ({ positions_count, is_open, togglePositions }: TTogglePositions) => { const positions_toggle_class = classNames('positions-toggle', { 'positions-toggle--active': is_open, 'positions-toggle--has-count': positions_count > 0, @@ -22,12 +27,4 @@ const TogglePositions = ({ positions_count, is_open, togglePositions }) => { ); }; -TogglePositions.propTypes = { - is_open: PropTypes.bool, - is_positions_drawer_on: PropTypes.bool, - positions_count: PropTypes.number, - togglePositions: PropTypes.func, - togglePositionsDrawer: PropTypes.func, -}; - export default TogglePositions; diff --git a/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx b/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx deleted file mode 100644 index 833af29df84f..000000000000 --- a/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx +++ /dev/null @@ -1,209 +0,0 @@ -import classNames from 'classnames'; -import React from 'react'; -import PropTypes from 'prop-types'; -import moment from 'moment'; -import { Text } from '@deriv/components'; -import { useIsMounted, WS, convertTimeFormat, isMarketClosed } from '@deriv/shared'; -import { Localize } from '@deriv/translations'; -import { observer } from '@deriv/stores'; -import { useTraderStore } from 'Stores/useTraderStores'; - -// check market in coming 7 days -const days_to_check_before_exit = 7; - -const getTradingTimes = async target_time => { - const data = await WS.tradingTimes(target_time); - if (data.error) { - return { api_initial_load_error: data.error.message }; - } - return data; -}; -// eslint-disable-next-line consistent-return -const getSymbol = (target_symbol, trading_times) => { - let symbol; - const { markets } = trading_times; - for (let i = 0; i < markets.length; i++) { - const { submarkets } = markets[i]; - for (let j = 0; j < submarkets.length; j++) { - const { symbols } = submarkets[j]; - symbol = symbols.find(item => item.symbol === target_symbol); - if (symbol !== undefined) return symbol; - } - } -}; - -const calculateTimeLeft = remaining_time_to_open => { - const difference = remaining_time_to_open - Date.now(); - return difference > 0 - ? { - days: Math.floor(difference / (1000 * 60 * 60 * 24)), - hours: Math.floor((difference / (1000 * 60 * 60)) % 24), - minutes: Math.floor((difference / 1000 / 60) % 60), - seconds: Math.floor((difference / 1000) % 60), - } - : {}; -}; - -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)); - const [is_loading, setLoading] = React.useState(true); - - React.useEffect(() => { - if (!is_main_page || (is_main_page && isMarketClosed(active_symbols, symbol))) { - setLoading(true); - // eslint-disable-next-line consistent-return - const whenMarketOpens = async (days_offset, target_symbol) => { - // days_offset is 0 for today, 1 for tomorrow, etc. - if (days_offset > days_to_check_before_exit) return {}; - let remaining_time_to_open; - const target_date = moment(new Date()).add(days_offset, 'days'); - const api_response = await getTradingTimes(target_date.format('YYYY-MM-DD')); - if (!api_response.api_initial_load_error) { - const { times } = getSymbol(target_symbol, api_response.trading_times); - const { open, close } = times; - const is_closed_all_day = open?.length === 1 && open[0] === '--' && close[0] === '--'; - if (is_closed_all_day) { - // check tomorrow trading times - return whenMarketOpens(days_offset + 1, target_symbol); - } - const date_str = target_date.toISOString().substring(0, 11); - const getUTCDate = hour => new Date(`${date_str}${hour}Z`); - for (let i = 0; i < open?.length; i++) { - const diff = +getUTCDate(open[i]) - Date.now(); - if (diff > 0) { - remaining_time_to_open = +getUTCDate(open[i]); - if (isMounted() && target_symbol === symbol) { - return setWhenMarketOpens({ - days_offset, - opening_time: open[i], - remaining_time_to_open, - }); - } - } - } - whenMarketOpens(days_offset + 1, target_symbol); - } - }; - - whenMarketOpens(0, symbol); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [symbol]); - - React.useEffect(() => { - let timer; - if (when_market_opens?.remaining_time_to_open) { - timer = setTimeout(() => { - setTimeLeft(calculateTimeLeft(when_market_opens.remaining_time_to_open)); - if (new Date(when_market_opens.remaining_time_to_open) - +new Date() < 1000) { - setLoading(true); - if (is_main_page) onMarketOpen(false); - } - }, 1000); - } - return () => { - if (timer) { - clearTimeout(timer); - } - }; - }, [time_left, when_market_opens, onMarketOpen, is_main_page]); - - React.useEffect(() => { - if (!is_loading) setIsTimerLoading(false); - }, [is_loading, setIsTimerLoading]); - - let timer_components = ''; - - if (Object.keys(time_left).length) { - const hours = (time_left.days * 24 + time_left.hours).toString().padStart(2, '0'); - const minutes = time_left.minutes.toString().padStart(2, '0'); - const seconds = time_left.seconds.toString().padStart(2, '0'); - timer_components = `${hours}:${minutes}:${seconds}`; - } - - if (!(when_market_opens && timer_components)) return null; - - const { opening_time, days_offset } = when_market_opens; - let opening_time_banner = null; - if (opening_time) { - const formatted_opening_time = convertTimeFormat(opening_time); - const target_date = moment(new Date()).add(days_offset, 'days'); - const opening_date = target_date.format('DD MMM YYYY'); - const opening_day = target_date.format('dddd'); - opening_time_banner = ( - - ]} - values={{ - formatted_opening_time, - opening_day, - opening_date, - }} - /> - - ); - } - - if (is_loading) setLoading(false); - - return ( - - - - - {opening_time_banner} - - - - - {timer_components} - -
- - ); -}); - -MarketCountdownTimer.propTypes = { - is_main_page: PropTypes.bool, - setIsTimerLoading: PropTypes.func, - onMarketOpen: PropTypes.func, - symbol: PropTypes.string.isRequired, -}; - -export default MarketCountdownTimer; diff --git a/packages/trader/src/App/Components/Elements/market-countdown-timer.tsx b/packages/trader/src/App/Components/Elements/market-countdown-timer.tsx new file mode 100644 index 000000000000..03ec30b9ec2a --- /dev/null +++ b/packages/trader/src/App/Components/Elements/market-countdown-timer.tsx @@ -0,0 +1,224 @@ +import classNames from 'classnames'; +import React from 'react'; +import moment from 'moment'; +import { Text } from '@deriv/components'; +import { useIsMounted, WS, convertTimeFormat, isMarketClosed } from '@deriv/shared'; +import { Localize } from '@deriv/translations'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { TradingTimesRequest, TradingTimesResponse } from '@deriv/api-types'; + +type TMarketCountDownTimer = { + is_main_page: boolean; + setIsTimerLoading: React.Dispatch>; + onMarketOpen: ReturnType['prepareTradeStore']; + symbol: ReturnType['symbol']; +}; + +type TWhenMarketOpens = { + days_offset: number; + opening_time: string; + remaining_time_to_open: number; +}; + +// check market in coming 7 days +const days_to_check_before_exit = 7; + +const getTradingTimes = async (target_time: TradingTimesRequest['trading_times']) => { + const data = await WS.tradingTimes(target_time); + if (data.error) { + return { api_initial_load_error: data.error.message }; + } + return data; +}; +// eslint-disable-next-line consistent-return +const getSymbol = ( + target_symbol: string, + trading_times: NonNullable> +) => { + let symbol; + const { markets } = trading_times; + for (let i = 0; i < markets.length; i++) { + const { submarkets } = markets[i]; + if (submarkets) { + for (let j = 0; j < submarkets.length; j++) { + const { symbols } = submarkets[j]; + symbol = symbols?.find(item => item.symbol === target_symbol); + if (symbol !== undefined) return symbol; + } + } + } +}; + +const calculateTimeLeft = (remaining_time_to_open: number) => { + const difference = remaining_time_to_open - Date.now(); + return difference > 0 + ? { + days: Math.floor(difference / (1000 * 60 * 60 * 24)), + hours: Math.floor((difference / (1000 * 60 * 60)) % 24), + minutes: Math.floor((difference / 1000 / 60) % 60), + seconds: Math.floor((difference / 1000) % 60), + } + : {}; +}; + +const MarketCountdownTimer = observer( + ({ is_main_page, setIsTimerLoading, onMarketOpen, symbol }: TMarketCountDownTimer) => { + const { active_symbols } = useTraderStore(); + const isMounted = useIsMounted(); + const [when_market_opens, setWhenMarketOpens] = React.useState({} as TWhenMarketOpens); + const [time_left, setTimeLeft] = React.useState(calculateTimeLeft(when_market_opens?.remaining_time_to_open)); + const [is_loading, setLoading] = React.useState(true); + + React.useEffect(() => { + if (!is_main_page || (is_main_page && isMarketClosed(active_symbols, symbol))) { + setLoading(true); + // eslint-disable-next-line consistent-return + // @ts-expect-error there is no explict return type because of if statements + const whenMarketOpens = async (days_offset: number, target_symbol: string) => { + // days_offset is 0 for today, 1 for tomorrow, etc. + if (days_offset > days_to_check_before_exit) return {}; + let remaining_time_to_open; + const target_date = moment(new Date()).add(days_offset, 'days'); + const api_response = await getTradingTimes(target_date.format('YYYY-MM-DD')); + if (!api_response.api_initial_load_error) { + const returned_symbol = getSymbol(target_symbol, api_response.trading_times); + const open = returned_symbol?.times.open as string[]; + const close = returned_symbol?.times.close as string[]; + const is_closed_all_day = open?.length === 1 && open[0] === '--' && close[0] === '--'; + if (is_closed_all_day) { + // check tomorrow trading times + return whenMarketOpens(days_offset + 1, target_symbol); + } + const date_str = target_date.toISOString().substring(0, 11); + const getUTCDate = (hour: string) => new Date(`${date_str}${hour}Z`); + for (let i = 0; i < open?.length; i++) { + const diff = +getUTCDate(open[i]) - Date.now(); + if (diff > 0) { + remaining_time_to_open = +getUTCDate(open[i]); + if (isMounted() && target_symbol === symbol) { + return setWhenMarketOpens({ + days_offset, + opening_time: open[i], + remaining_time_to_open, + }); + } + } + } + whenMarketOpens(days_offset + 1, target_symbol); + } + }; + + whenMarketOpens(0, symbol); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [symbol]); + + React.useEffect(() => { + let timer: ReturnType; + if (when_market_opens?.remaining_time_to_open) { + timer = setTimeout(() => { + setTimeLeft(calculateTimeLeft(when_market_opens.remaining_time_to_open)); + if (+new Date(when_market_opens.remaining_time_to_open) - +new Date() < 1000) { + setLoading(true); + if (is_main_page) onMarketOpen(false); + } + }, 1000); + } + return () => { + if (timer) { + clearTimeout(timer); + } + }; + }, [time_left, when_market_opens, onMarketOpen, is_main_page]); + + React.useEffect(() => { + if (!is_loading) setIsTimerLoading(false); + }, [is_loading, setIsTimerLoading]); + + let timer_components = ''; + + if (Object.keys(time_left).length) { + const hours = (Number(time_left.days) * 24 + Number(time_left.hours)).toString().padStart(2, '0'); + const minutes = Number(time_left.minutes).toString().padStart(2, '0'); + const seconds = Number(time_left.seconds).toString().padStart(2, '0'); + timer_components = `${hours}:${minutes}:${seconds}`; + } + + if (!(when_market_opens && timer_components)) return null; + + const { opening_time, days_offset } = when_market_opens; + let opening_time_banner = null; + if (opening_time) { + const formatted_opening_time = convertTimeFormat(opening_time); + const target_date = moment(new Date()).add(days_offset, 'days'); + const opening_date = target_date.format('DD MMM YYYY'); + const opening_day = target_date.format('dddd'); + opening_time_banner = ( + + ]} + values={{ + formatted_opening_time, + opening_day, + opening_date, + }} + /> + + ); + } + + if (is_loading) setLoading(false); + + return ( + + + + + {opening_time_banner} + + + + + {timer_components} + +
+ + ); + } +); + +export default MarketCountdownTimer; diff --git a/packages/trader/src/App/Components/Elements/market-is-closed-overlay.jsx b/packages/trader/src/App/Components/Elements/market-is-closed-overlay.tsx similarity index 68% rename from packages/trader/src/App/Components/Elements/market-is-closed-overlay.jsx rename to packages/trader/src/App/Components/Elements/market-is-closed-overlay.tsx index a68ab239d67c..e2c58ab7180b 100644 --- a/packages/trader/src/App/Components/Elements/market-is-closed-overlay.jsx +++ b/packages/trader/src/App/Components/Elements/market-is-closed-overlay.tsx @@ -1,14 +1,29 @@ import classNames from 'classnames'; import React from 'react'; -import PropTypes from 'prop-types'; import { Button, Text } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import MarketCountdownTimer from './market-countdown-timer.jsx'; +import MarketCountdownTimer from './market-countdown-timer'; +import { useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores.js'; -const MarketIsClosedOverlay = ({ is_eu, is_synthetics_trading_market_available, onClick, onMarketOpen, symbol }) => { +type TMarketIsClosedOverlay = { + is_eu: ReturnType['client']['is_eu']; + is_synthetics_trading_market_available: ReturnType['is_synthetics_trading_market_available']; + onClick: () => void; + onMarketOpen: React.ComponentProps['onMarketOpen']; + symbol: ReturnType['symbol']; +}; + +const MarketIsClosedOverlay = ({ + is_eu, + is_synthetics_trading_market_available, + onClick, + onMarketOpen, + symbol, +}: TMarketIsClosedOverlay) => { const [is_timer_loading, setIsTimerLoading] = React.useState(true); - let message = ( + let message: JSX.Element | null = ( ); let btn_lbl = localize('Try Synthetic Indices'); @@ -45,12 +60,4 @@ const MarketIsClosedOverlay = ({ is_eu, is_synthetics_trading_market_available, ); }; -MarketIsClosedOverlay.propTypes = { - is_eu: PropTypes.bool, - is_synthetics_trading_market_available: PropTypes.bool, - onClick: PropTypes.func, - onMarketOpen: PropTypes.func, - symbol: PropTypes.string, -}; - export default MarketIsClosedOverlay; diff --git a/packages/trader/src/App/Components/Form/TimePicker/dialog.jsx b/packages/trader/src/App/Components/Form/TimePicker/dialog.tsx similarity index 78% rename from packages/trader/src/App/Components/Form/TimePicker/dialog.jsx rename to packages/trader/src/App/Components/Form/TimePicker/dialog.tsx index ff1a62816947..8824e8bd245c 100644 --- a/packages/trader/src/App/Components/Form/TimePicker/dialog.jsx +++ b/packages/trader/src/App/Components/Form/TimePicker/dialog.tsx @@ -1,33 +1,54 @@ -import PropTypes from 'prop-types'; import classNames from 'classnames'; import React from 'react'; import { localize } from '@deriv/translations'; import { toMoment } from '@deriv/shared'; -function isBetween(to_compare_moment, start_times_moment, end_times_moment, duration) { +type TDialogProps = { + className: string; + end_times: moment.Moment[]; + onChange: (arg: string | React.ChangeEvent) => void; + preClass: string; + selected_time: string; + start_times: moment.Moment[]; +}; + +function isBetween( + to_compare_moment: moment.Moment, + start_times_moment: moment.Moment[], + end_times_moment: moment.Moment[], + duration?: string +) { for (let i = 0; i < start_times_moment.length; i++) { - if (to_compare_moment.isBetween(start_times_moment[i], end_times_moment[i], duration)) { + if ( + to_compare_moment.isBetween( + start_times_moment[i], + end_times_moment[i], + duration as moment.unitOfTime.StartOf + ) + ) { return true; } } return false; } -const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, className }) => { +const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, className }: TDialogProps) => { const start_times_moment = start_times ? start_times.map(start_time => toMoment(start_time)) : [toMoment()]; const end_times_moment = end_times ? end_times.map(end_time => toMoment(end_time)) - : [toMoment().hour('23').minute('59').seconds('59').milliseconds('999')]; + : [toMoment().hour(23).minute(59).seconds(59).milliseconds(999)]; const to_compare_moment = toMoment(); const [hour, minute] = selected_time.split(':'); const hours = [...Array(24).keys()].map(a => `0${a}`.slice(-2)); const minutes = [...Array(12).keys()].map(a => `0${a * 5}`.slice(-2)); - const selectOption = (type, current_value, prev_value, is_enabled = true) => { + const selectOption = (type: string, current_value: string, prev_value: string, is_enabled = true) => { if (is_enabled && prev_value) { const [prev_hour, prev_minute] = prev_value.split(':'); if ((type === 'h' && current_value !== prev_hour) || (type === 'm' && current_value !== prev_minute)) { - onChange(`${type === 'h' ? current_value : prev_hour}:${type === 'm' ? current_value : prev_minute}`); + const selected_hour = type === 'h' ? current_value : prev_hour; + const selected_minute = type === 'm' ? current_value : prev_minute; + onChange(`${selected_hour}:${selected_minute}`); } } }; @@ -40,8 +61,8 @@ const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, cla {localize('Hour')}
- {hours.map((h, key) => { - to_compare_moment.hour(h); + {hours.map(h => { + to_compare_moment.hour(Number(h)); const start_times_reset_minute = start_times_moment.map(start_time => start_time.clone().minute(0) ); @@ -69,7 +90,7 @@ const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, cla { [`${preClass}__selector-list-item--selected`]: hour === h }, { [`${preClass}__selector-list-item--disabled`]: !is_enabled } )} - key={key} + key={h} onClick={() => { selectOption('h', h, selected_time, is_enabled); }} @@ -85,8 +106,8 @@ const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, cla {localize('Minute')}
- {minutes.map((mm, key) => { - to_compare_moment.hour(hour).minute(mm); + {minutes.map(mm => { + to_compare_moment.hour(Number(hour)).minute(Number(mm)); const is_enabled = isBetween( to_compare_moment, start_times_moment, @@ -100,7 +121,7 @@ const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, cla { [`${preClass}__selector-list-item--selected`]: minute === mm }, { [`${preClass}__selector-list-item--disabled`]: !is_enabled } )} - key={key} + key={mm} onClick={() => { selectOption('m', mm, selected_time, is_enabled); }} @@ -116,13 +137,4 @@ const Dialog = ({ preClass, selected_time, end_times, start_times, onChange, cla ); }; -Dialog.propTypes = { - className: PropTypes.string, - end_times: PropTypes.array, - onChange: PropTypes.func, - preClass: PropTypes.string, - selected_time: PropTypes.array, - start_times: PropTypes.array, -}; - export default Dialog; diff --git a/packages/trader/src/App/Components/Form/TimePicker/index.js b/packages/trader/src/App/Components/Form/TimePicker/index.js deleted file mode 100644 index 211fc0bce630..000000000000 --- a/packages/trader/src/App/Components/Form/TimePicker/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import TimePicker from './time-picker.jsx'; - -export default TimePicker; diff --git a/packages/trader/src/App/Components/Form/TimePicker/index.ts b/packages/trader/src/App/Components/Form/TimePicker/index.ts new file mode 100644 index 000000000000..2185a96bb404 --- /dev/null +++ b/packages/trader/src/App/Components/Form/TimePicker/index.ts @@ -0,0 +1,3 @@ +import TimePicker from './time-picker'; + +export default TimePicker; diff --git a/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx b/packages/trader/src/App/Components/Form/TimePicker/time-picker.tsx similarity index 77% rename from packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx rename to packages/trader/src/App/Components/Form/TimePicker/time-picker.tsx index 5e38be3e7836..fd5df901cc44 100644 --- a/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx +++ b/packages/trader/src/App/Components/Form/TimePicker/time-picker.tsx @@ -1,10 +1,22 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { CSSTransition } from 'react-transition-group'; import { Icon, InputField } from '@deriv/components'; -import Dialog from './dialog.jsx'; +import Dialog from './dialog'; import { observer, useStore } from '@deriv/stores'; +import moment from 'moment'; + +type TTimePickerProps = { + end_times: moment.Moment[]; + is_nativepicker?: boolean; + name: string; + onChange: (e: { target: { name: string; value: string } }) => Promise; + padding?: string; + placeholder: string; + selected_time: string; + start_times: moment.Moment[]; + validation_errors?: string[]; +}; const class_prefix = 'time-picker'; @@ -19,11 +31,11 @@ const TimePicker = observer( selected_time, start_times, validation_errors, - }) => { + }: TTimePickerProps) => { const { ui } = useStore(); const { current_focus, setCurrentFocus } = ui; const [is_open, setIsOpen] = React.useState(false); - const [wrapper_ref, setWrapperRef] = React.useState(null); + const [wrapper_ref, setWrapperRef] = React.useState(null); React.useEffect(() => { document.addEventListener('mousedown', handleClickOutside); @@ -34,22 +46,22 @@ const TimePicker = observer( setIsOpen(!is_open); }; - const handleChange = arg => { + const handleChange = (arg: string | React.ChangeEvent) => { // To handle nativepicker; - const value = typeof arg === 'object' ? arg.target.selected_time : arg; + const value = typeof arg === 'object' ? arg.target.value : arg; if (value !== selected_time) { onChange({ target: { name, value } }); } }; - const saveRef = node => { + const saveRef: React.RefCallback = node => { if (!node) return; setWrapperRef(node); }; - const handleClickOutside = event => { - if (!wrapper_ref?.contains(event.target) && is_open) { + const handleClickOutside = (event: Event) => { + if (!wrapper_ref?.contains(event.target as Node) && is_open) { setIsOpen(false); } }; @@ -63,8 +75,8 @@ const TimePicker = observer( value={selected_time} onChange={handleChange} name={name} - min={start_times[0]} - max={end_times[end_times.length - 1]} + min={start_times[0]?.format('HH:mm')} + max={end_times[end_times.length - 1]?.format('HH:mm')} /> ) : ( @@ -109,17 +121,4 @@ const TimePicker = observer( } ); -TimePicker.propTypes = { - end_times: PropTypes.array, - is_clearable: PropTypes.bool, - is_nativepicker: PropTypes.bool, - name: PropTypes.string, - onChange: PropTypes.func, - padding: PropTypes.string, - placeholder: PropTypes.string, - selected_time: PropTypes.string, - start_times: PropTypes.array, - validation_errors: PropTypes.array, -}; - export default TimePicker; diff --git a/packages/trader/src/App/Components/Routes/binary-link.jsx b/packages/trader/src/App/Components/Routes/binary-link.jsx index 43d66e6c5d4e..2a4434fd6300 100644 --- a/packages/trader/src/App/Components/Routes/binary-link.jsx +++ b/packages/trader/src/App/Components/Routes/binary-link.jsx @@ -7,7 +7,7 @@ import getRoutesConfig from '../../Constants/routes-config'; // TODO: solve circular dependency problem // when binary link is imported into components present in routes config // or into their descendants -const BinaryLink = ({ active_class, to, children, ...props }) => { +const BinaryLink = ({ active_class = '', to, children, ...props }) => { const path = normalizePath(to); const route = findRouteByPath(path, getRoutesConfig()); diff --git a/packages/trader/src/App/Containers/ProgressSliderStream/__tests__/progress-slider-stream.spec.jsx b/packages/trader/src/App/Containers/ProgressSliderStream/__tests__/progress-slider-stream.spec.jsx deleted file mode 100644 index 76db96aadf64..000000000000 --- a/packages/trader/src/App/Containers/ProgressSliderStream/__tests__/progress-slider-stream.spec.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { screen, render } from '@testing-library/react'; -import { mockStore } from '@deriv/stores'; -import TraderProviders from '../../../../trader-providers'; -import ProgressSliderStream from '../progress-slider-stream'; - -jest.mock('@deriv/components', () => ({ - ...jest.requireActual('@deriv/components'), - ProgressSlider: () =>
Mocked Progress Slider
, -})); - -const contract_info = { - contract_type: 'TEST', - date_expiry: 1222222224, - date_start: 1222222222, - tick_count: 2, - tick_stream: [ - { epoch: 1, tick: 1, tick_display_value: '300' }, - { epoch: 2, tick: 2, tick_display_value: '302' }, - ], -}; - -describe('', () => { - const mockProgressSliderStream = (mocked_store, contract_info = null) => { - return ( - - - - ); - }; - - it('should not render if contract_info is falsy', () => { - const mock_root_store = mockStore({}); - render(mockProgressSliderStream(mock_root_store)); - - expect(screen.queryByText('Mocked Progress Slider')).not.toBeInTheDocument(); - }); - it('should render if contract_info was passed in props', () => { - const mock_root_store = mockStore({}); - render(mockProgressSliderStream(mock_root_store, contract_info)); - - expect(screen.getByText('Mocked Progress Slider')).toBeInTheDocument(); - }); -}); diff --git a/packages/trader/src/App/Containers/ProgressSliderStream/index.js b/packages/trader/src/App/Containers/ProgressSliderStream/index.js deleted file mode 100644 index 657c6ba7065a..000000000000 --- a/packages/trader/src/App/Containers/ProgressSliderStream/index.js +++ /dev/null @@ -1 +0,0 @@ -export default from './progress-slider-stream.jsx'; diff --git a/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx b/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx deleted file mode 100644 index 34409af133c9..000000000000 --- a/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { ProgressSlider } from '@deriv/components'; -import { getCardLabels, getCurrentTick } from '@deriv/shared'; -import { observer, useStore } from '@deriv/stores'; - -const ProgressSliderStream = observer(({ contract_info }) => { - const { common, portfolio } = useStore(); - const { server_time } = common; - const { is_loading } = portfolio; - - if (!contract_info) { - return
; - } - const current_tick = contract_info.tick_count && getCurrentTick(contract_info); - - return ( - - ); -}); - -ProgressSliderStream.propTypes = { - contract_info: PropTypes.object, -}; - -export default ProgressSliderStream; diff --git a/packages/trader/src/App/Containers/populate-header.jsx b/packages/trader/src/App/Containers/populate-header.tsx similarity index 90% rename from packages/trader/src/App/Containers/populate-header.jsx rename to packages/trader/src/App/Containers/populate-header.tsx index 74127c7c9c33..6cb78ddd14cc 100644 --- a/packages/trader/src/App/Containers/populate-header.jsx +++ b/packages/trader/src/App/Containers/populate-header.tsx @@ -1,15 +1,14 @@ import React from 'react'; -import TogglePositionsMobile from 'App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx'; +import TogglePositionsMobile from 'App/Components/Elements/TogglePositions/toggle-positions-mobile'; import { filterByContractType } from 'App/Components/Elements/PositionsDrawer/helpers'; import { useTraderStore } from 'Stores/useTraderStores'; import { observer, useStore } from '@deriv/stores'; import { TURBOS, VANILLALONG, isTurbosContract, isVanillaContract } from '@deriv/shared'; const PopulateHeader = observer(() => { - const { portfolio, ui, client } = useStore(); + const { portfolio, 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, @@ -37,12 +36,10 @@ const PopulateHeader = observer(() => { return ( diff --git a/packages/trader/src/App/Containers/trade-footer-extensions.jsx b/packages/trader/src/App/Containers/trade-footer-extensions.tsx similarity index 82% rename from packages/trader/src/App/Containers/trade-footer-extensions.jsx rename to packages/trader/src/App/Containers/trade-footer-extensions.tsx index 702950f5ebca..8643c94f5987 100644 --- a/packages/trader/src/App/Containers/trade-footer-extensions.jsx +++ b/packages/trader/src/App/Containers/trade-footer-extensions.tsx @@ -1,11 +1,11 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { withRouter } from 'react-router-dom'; +import { RouteComponentProps, withRouter } from 'react-router-dom'; import { routes } from '@deriv/shared'; -import TogglePositions from 'App/Components/Elements/TogglePositions'; +import TogglePositions from '../Components/Elements/TogglePositions/toggle-positions'; import { observer, useStore } from '@deriv/stores'; -const TradeFooterExtensions = observer(() => { +const TradeFooterExtensions = observer((props: RouteComponentProps) => { + const { location } = props; const { client, portfolio, ui } = useStore(); const { is_logged_in } = client; const { active_positions_count } = portfolio; @@ -40,8 +40,4 @@ const TradeFooterExtensions = observer(() => { return null; }); -TradeFooterExtensions.propTypes = { - location: PropTypes.object, -}; - export default withRouter(TradeFooterExtensions); diff --git a/packages/trader/src/App/app.tsx b/packages/trader/src/App/app.tsx index a2bfedb085fb..bbafd8fa512f 100644 --- a/packages/trader/src/App/app.tsx +++ b/packages/trader/src/App/app.tsx @@ -2,7 +2,7 @@ import React from 'react'; import Loadable from 'react-loadable'; import Routes from 'App/Containers/Routes/routes.jsx'; import TradeHeaderExtensions from 'App/Containers/trade-header-extensions'; -import TradeFooterExtensions from 'App/Containers/trade-footer-extensions.jsx'; +import TradeFooterExtensions from 'App/Containers/trade-footer-extensions'; import TradeSettingsExtensions from 'App/Containers/trade-settings-extensions'; import { NetworkStatusToastErrorPopup } from 'Modules/Trading/Containers/toast-popup'; import initStore from './init-store'; diff --git a/packages/trader/src/Assets/Trading/Categories/__tests__/contract-type-description-video.spec.tsx b/packages/trader/src/Assets/Trading/Categories/__tests__/contract-type-description-video.spec.tsx index 0c63969ce23b..7e0d00ecc520 100644 --- a/packages/trader/src/Assets/Trading/Categories/__tests__/contract-type-description-video.spec.tsx +++ b/packages/trader/src/Assets/Trading/Categories/__tests__/contract-type-description-video.spec.tsx @@ -34,4 +34,13 @@ describe('', () => { expect(screen.getByTestId(/description_video/i)).toBeInTheDocument(); }); + it('should render the component with video of proper width and height if it is mobile', () => { + const mock_root_store = mockStore({ ui: { is_mobile: true } }); + render(mockContractTypeDescriptionVideo(mock_root_store, default_mocked_props)); + const video = screen.getByTestId(/description_video/i); + + expect(video).toBeInTheDocument(); + expect(video).toHaveAttribute('width', '328'); + expect(video).toHaveAttribute('height', '184.5'); + }); }); diff --git a/packages/trader/src/Assets/Trading/Categories/contract-type-description-video.tsx b/packages/trader/src/Assets/Trading/Categories/contract-type-description-video.tsx index 116aaa8c437e..6fc7bf8a16bf 100644 --- a/packages/trader/src/Assets/Trading/Categories/contract-type-description-video.tsx +++ b/packages/trader/src/Assets/Trading/Categories/contract-type-description-video.tsx @@ -10,7 +10,7 @@ type TContractTypeDescriptionVideo = { const ContractTypeDescriptionVideo = ({ selected_contract_type, data_testid }: TContractTypeDescriptionVideo) => { const { ui } = useStore(); - const { is_dark_mode_on: is_dark_theme } = ui; + const { is_dark_mode_on: is_dark_theme, is_mobile } = ui; const getVideoSource = React.useCallback( (extension: 'mp4' | 'webm') => { return getUrlBase( @@ -36,6 +36,8 @@ const ContractTypeDescriptionVideo = ({ selected_contract_type, data_testid }: T onContextMenu={e => e.preventDefault()} preload='auto' controls + width={is_mobile ? 328 : 480} + height={is_mobile ? 184.5 : 270} className='contract-type-info__video' data-testid={data_testid} > diff --git a/packages/trader/src/Modules/Contract/Components/Digits/digits.jsx b/packages/trader/src/Modules/Contract/Components/Digits/digits.tsx similarity index 66% rename from packages/trader/src/Modules/Contract/Components/Digits/digits.jsx rename to packages/trader/src/Modules/Contract/Components/Digits/digits.tsx index 8436d533dde2..acf0cad7a96f 100644 --- a/packages/trader/src/Modules/Contract/Components/Digits/digits.jsx +++ b/packages/trader/src/Modules/Contract/Components/Digits/digits.tsx @@ -1,13 +1,58 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { toJS } from 'mobx'; import { DesktopWrapper, MobileWrapper, Popover, Text } from '@deriv/components'; -import { getMarketNamesMap, isMobile, useIsMounted, isContractElapsed } from '@deriv/shared'; +import { + getMarketNamesMap, + isMobile, + useIsMounted, + isContractElapsed, + TContractStore, + TTickSpotData, +} from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; import { Bounce, SlideIn } from 'App/Components/Animations'; import { DigitSpot, LastDigitPrediction } from '../LastDigitPrediction'; import 'Sass/app/modules/contract/digits.scss'; +import { useTraderStore } from 'Stores/useTraderStores'; + +type TTraderStore = ReturnType; +type TOnChangeStatus = { status: string | null | undefined; current_tick: number | null }; +type TOnLastDigitSpot = { + spot: string | null; + is_lost?: boolean; + is_selected_winning: boolean; + is_latest: boolean; + is_won?: boolean; +}; +type TDigitsWrapper = TDigits & { + onChangeStatus?: (params: TOnChangeStatus) => void; + onLastDigitSpot?: (params: TOnLastDigitSpot) => void; +}; +type TDigits = Pick & { + digits_array?: number[]; + display_status?: TContractStore['display_status']; + is_digit_contract?: TContractStore['is_digit_contract']; + is_ended?: TContractStore['is_ended']; + is_trade_page?: boolean; + onDigitChange?: TTraderStore['onChange']; + selected_digit?: TTraderStore['last_digit']; + trade_type?: TTraderStore['contract_type']; + tick?: TTickSpotData; + underlying: TTraderStore['symbol']; +}; +type TTickStream = NonNullable[number]; +type TTickData = + | TTickSpotData + | null + | undefined + | { + ask: TTickStream['tick']; + bid: TTickStream['tick']; + current_tick: number; + epoch: TTickStream['epoch']; + pip_size?: number; + }; const DigitsWrapper = ({ contract_info, @@ -22,9 +67,9 @@ const DigitsWrapper = ({ trade_type, onChangeStatus, ...props -}) => { +}: TDigitsWrapper) => { const has_contract = contract_info.date_start; - let tick = props.tick; + let tick: TTickData = props.tick; const is_tick_ready = is_trade_page ? !!tick : true; const is_contract_elapsed = is_trade_page ? isContractElapsed(contract_info, tick) : false; @@ -35,13 +80,13 @@ const DigitsWrapper = ({ if (has_contract && !is_contract_elapsed) { tick = null; const tick_stream = contract_info.tick_stream; - if (tick_stream && tick_stream.length) { + if (tick_stream?.length) { const t = toJS(tick_stream.slice(-1)[0]); tick = { ask: t.tick, bid: t.tick, epoch: t.epoch, - pip_size: t.tick_display_value.split('.')[1].length, + pip_size: t.tick_display_value?.split('.')[1].length, current_tick: tick_stream.length, }; } @@ -49,7 +94,7 @@ const DigitsWrapper = ({ React.useEffect(() => { if (onChangeStatus) { - onChangeStatus({ status, current_tick: tick ? tick.current_tick : null }); + onChangeStatus({ status, current_tick: tick && 'current_tick' in tick ? tick.current_tick : null }); } }, [tick, is_trade_page, display_status, onChangeStatus, status]); @@ -59,15 +104,15 @@ const DigitsWrapper = ({ // i.e - 40px + 6px left and 6px right padding/margin = 52 dimension={isMobile() ? 64 : 52} has_entry_spot={!!contract_info.entry_tick} - barrier={!is_contract_elapsed && is_tick_ready ? +contract_info.barrier : null} - contract_type={!is_contract_elapsed && is_tick_ready ? contract_info.contract_type : null} + barrier={!is_contract_elapsed && is_tick_ready ? Number(contract_info.barrier) : null} + contract_type={!is_contract_elapsed && is_tick_ready ? contract_info.contract_type : ''} digits={digits_array} digits_info={!is_contract_elapsed && is_tick_ready ? digits_info : {}} is_digit_contract={is_digit_contract} is_ended={is_ended} is_trade_page={is_trade_page} - status={status} - tick={tick} + status={status as React.ComponentProps['status']} + tick={tick as React.ComponentProps['tick']} trade_type={trade_type} onDigitChange={onDigitChange} selected_digit={selected_digit} @@ -76,28 +121,26 @@ const DigitsWrapper = ({ ); }; -const Digits = React.memo(props => { - const [status, setStatus] = React.useState(); - const [current_tick, setCurrentTick] = React.useState(); - const [spot, setSpot] = React.useState(); - const [is_selected_winning, setIsSelectedWinning] = React.useState(); - const [is_latest, setIsLatest] = React.useState(); - const [is_won, setIsWon] = React.useState(); - const [is_lost, setIsLost] = React.useState(); +const Digits = React.memo((props: TDigits) => { + const [status, setStatus] = React.useState(); + const [current_tick, setCurrentTick] = React.useState(); + const [spot, setSpot] = React.useState(); + const [is_selected_winning, setIsSelectedWinning] = React.useState(); + const [is_won, setIsWon] = React.useState(); + const [is_lost, setIsLost] = React.useState(); const isMounted = useIsMounted(); const { contract_info, digits_array, is_digit_contract, is_trade_page, underlying } = props; - const onChangeStatus = params => { + const onChangeStatus = (params: TOnChangeStatus) => { setStatus(params.status); setCurrentTick(params.current_tick); }; - const onLastDigitSpot = params => { + const onLastDigitSpot = (params: TOnLastDigitSpot) => { setSpot(params.spot); setIsLost(params.is_lost); setIsSelectedWinning(params.is_selected_winning); - setIsLatest(params.is_latest); setIsWon(params.is_won); }; @@ -105,7 +148,8 @@ const Digits = React.memo(props => { const underlying_name = is_trade_page ? underlying : contract_info.underlying; return localize('Last digit stats for latest 1000 ticks for {{underlying_name}}', { - underlying_name: getMarketNamesMap()[underlying_name.toUpperCase()], + underlying_name: + getMarketNamesMap()[underlying_name?.toUpperCase() as keyof ReturnType], }); }; @@ -151,7 +195,6 @@ const Digits = React.memo(props => { current_spot={spot} is_lost={is_lost} is_selected_winning={is_selected_winning} - is_visible={!!(is_latest && spot)} is_won={is_won} /> @@ -164,18 +207,4 @@ const Digits = React.memo(props => { Digits.displayName = 'Digits'; -Digits.propTypes = { - contract_info: PropTypes.object, - digits_array: PropTypes.array, - digits_info: PropTypes.object, - display_status: PropTypes.string, - is_digit_contract: PropTypes.bool, - is_ended: PropTypes.bool, - is_trade_page: PropTypes.bool, - trade_type: PropTypes.string, - onDigitChange: PropTypes.func, - selected_digit: PropTypes.number, - underlying: PropTypes.string, -}; - export default Digits; diff --git a/packages/trader/src/Modules/Contract/Components/Digits/index.js b/packages/trader/src/Modules/Contract/Components/Digits/index.js index d46e4208466c..5a177415c03a 100644 --- a/packages/trader/src/Modules/Contract/Components/Digits/index.js +++ b/packages/trader/src/Modules/Contract/Components/Digits/index.js @@ -1,3 +1,3 @@ -import Digits from './digits.jsx'; +import Digits from './digits'; export default Digits; diff --git a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-display.tsx b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-display.tsx index 856cfe2e4aec..482d22dc692f 100644 --- a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-display.tsx +++ b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-display.tsx @@ -20,7 +20,7 @@ type TDigitDisplay = Pick, 'is_lost' | 'i digit: number | null; spot: string | null; }; - selected_digit: number | boolean; + selected_digit?: number; status: ProposalOpenContract['status']; stats?: number | null; value: number; diff --git a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-spot.tsx b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-spot.tsx index 18ee62ff7b95..0f8720f4314f 100644 --- a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-spot.tsx +++ b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/digit-spot.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Text } from '@deriv/components'; type TDigitSpot = { - current_spot: string | null; + current_spot?: string | null; is_selected_winning?: boolean; is_lost?: boolean; is_won?: boolean; diff --git a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/last-digit-prediction.tsx b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/last-digit-prediction.tsx index b8dbabe9bbb2..bca5ba854ec4 100644 --- a/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/last-digit-prediction.tsx +++ b/packages/trader/src/Modules/Contract/Components/LastDigitPrediction/last-digit-prediction.tsx @@ -11,13 +11,13 @@ type TLastDigitPrediction = Pick< 'barrier' | 'is_digit_contract' | 'has_entry_spot' | 'onLastDigitSpot' > & { contract_type?: string; - digits: number[]; + digits?: number[]; digits_info: { [key: string]: { digit: number; spot: string } }; dimension: number; is_ended?: boolean; - is_trade_page: boolean; - onDigitChange: (event: { target: { name: string; value: number } }) => void; - selected_digit: number | boolean; + is_trade_page?: boolean; + onDigitChange?: (event: { target: { name: string; value: number } }) => void; + selected_digit?: number; status?: ProposalOpenContract['status']; tick?: TicksStreamResponse['tick']; trade_type?: string; @@ -138,7 +138,7 @@ const LastDigitPrediction = ({ value={idx} onLastDigitSpot={onLastDigitSpot} onSelect={isSelectableDigitType() ? handleSelect : null} - selected_digit={isSelectableDigitType() ? selected_digit : false} + selected_digit={isSelectableDigitType() ? selected_digit : undefined} /> ))} diff --git a/packages/trader/src/Modules/SmartChart/Components/Markers/__tests__/accumulators-chart-elements.spec.tsx b/packages/trader/src/Modules/SmartChart/Components/Markers/__tests__/accumulators-chart-elements.spec.tsx index 450d0b3d3652..517c9cf0dd4b 100644 --- a/packages/trader/src/Modules/SmartChart/Components/Markers/__tests__/accumulators-chart-elements.spec.tsx +++ b/packages/trader/src/Modules/SmartChart/Components/Markers/__tests__/accumulators-chart-elements.spec.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import AccumulatorsChartElements from '../accumulators-chart-elements'; -jest.mock('App/Components/Elements/PositionsDrawer/helpers/positions-helper.js', () => ({ +jest.mock('App/Components/Elements/PositionsDrawer/helpers/positions-helper', () => ({ filterByContractType: jest.fn(() => true), })); jest.mock('../accumulators-profit-loss-tooltip', () => jest.fn(() =>
AccumulatorsProfitLossTooltip
)); diff --git a/packages/trader/src/Modules/SmartChart/Components/Markers/accumulators-chart-elements.tsx b/packages/trader/src/Modules/SmartChart/Components/Markers/accumulators-chart-elements.tsx index 8ec25b78dd94..7b5ae0171dcd 100644 --- a/packages/trader/src/Modules/SmartChart/Components/Markers/accumulators-chart-elements.tsx +++ b/packages/trader/src/Modules/SmartChart/Components/Markers/accumulators-chart-elements.tsx @@ -1,4 +1,4 @@ -import { filterByContractType } from 'App/Components/Elements/PositionsDrawer/helpers/positions-helper.js'; +import { filterByContractType } from 'App/Components/Elements/PositionsDrawer/helpers/positions-helper'; import React from 'react'; import AccumulatorsProfitLossTooltip from './accumulators-profit-loss-tooltip'; import { ProposalOpenContract } from '@deriv/api-types'; 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.tsx similarity index 63% rename from packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx rename to packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.tsx index 40968d4136c5..e3e191c0e053 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.tsx @@ -2,42 +2,71 @@ import React from 'react'; import { Checkbox, RadioGroup, Dialog, Popover, Text } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; import { onToggleCancellation, onChangeCancellationDuration } from 'Stores/Modules/Trading/Helpers/multiplier'; -import Fieldset from 'App/Components/Form/fieldset.tsx'; +import Fieldset from 'App/Components/Form/fieldset'; import { observer, useStore } from '@deriv/stores'; +import { TTradeStore } from 'Types'; import { useTraderStore } from 'Stores/useTraderStores'; -const DealCancellationWarningDialog = observer(({ is_visible, onConfirm, onCancel }) => { - const { ui } = useStore(); - const { disableApp, enableApp, should_show_cancellation_warning, toggleCancellationWarning } = ui; - return ( - void; + onCancel: () => void; +}; + +type TCancelDeal = { + has_cancellation: boolean; + has_take_profit: boolean; + has_stop_loss: boolean; + onChangeMultiple: ( + props: Partial< + Pick< + TTradeStore, + | 'cancellation_duration' + | 'has_cancellation' + | 'has_stop_loss' + | 'has_take_profit' + | 'stop_loss' + | 'take_profit' + > > - - - - toggleCancellationWarning()} - name={'should_show_cancellation_warning'} - label={localize("Don't show this again")} - /> - - ); -}); + ) => void; + cancellation_duration: string; +}; + +const DealCancellationWarningDialog = observer( + ({ is_visible, onConfirm, onCancel }: TDealCancellationWarningDialog) => { + const { ui } = useStore(); + const { disableApp, enableApp, should_show_cancellation_warning, toggleCancellationWarning } = ui; + return ( + + + + + toggleCancellationWarning()} + name='should_show_cancellation_warning' + label={localize("Don't show this again")} + /> + + ); + } +); const CancelDeal = observer( - ({ has_cancellation, has_take_profit, has_stop_loss, onChangeMultiple, cancellation_duration }) => { + ({ has_cancellation, has_take_profit, has_stop_loss, onChangeMultiple, cancellation_duration }: TCancelDeal) => { const { ui } = useStore(); const { should_show_cancellation_warning } = ui; const { cancellation_range_list } = useTraderStore(); @@ -78,7 +107,7 @@ const CancelDeal = observer( id='dt_multiplier-stake__tooltip' is_bubble_hover_enabled classNameBubble='trade-container__deal-cancellation-popover' - zIndex={9999} + zIndex='9999' message={localize( 'Cancel your trade anytime within a chosen time-frame. Triggered automatically if your trade reaches the stop out level within the chosen time-frame.' )} 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.tsx similarity index 98% rename from packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx rename to packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.tsx index 08befd4c6659..d9e522fb057e 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.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Money } from '@deriv/components'; import { localize } from '@deriv/translations'; -import RiskManagementDialog from 'Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx'; +import RiskManagementDialog from 'Modules/Trading/Containers/Multiplier/risk-management-dialog'; import { observer } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; diff --git a/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-button.spec.tsx b/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-button.spec.tsx index 6fbdf17615dd..c031641f198f 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-button.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-button.spec.tsx @@ -1,7 +1,9 @@ import React from 'react'; + +import { isDesktop, isMobile } from '@deriv/shared'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { isDesktop, isMobile } from '@deriv/shared'; + import PurchaseButton from '../purchase-button'; const default_mocked_props = { @@ -31,7 +33,7 @@ const default_mocked_props = { should_fade: false, setPurchaseState: jest.fn(), type: 'VANILLALONGCALL', -}; +} as unknown as React.ComponentProps; jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), diff --git a/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-fieldset.spec.tsx b/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-fieldset.spec.tsx index aad213c17fc1..d01422b93c7b 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-fieldset.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/__tests__/purchase-fieldset.spec.tsx @@ -1,9 +1,11 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; + import { isDesktop, isMobile } from '@deriv/shared'; -import PurchaseFieldset from '../purchase-fieldset'; +import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import PurchaseFieldset from '../purchase-fieldset'; + const default_mocked_props = { basis: '', buy_info: {}, @@ -33,7 +35,7 @@ const default_mocked_props = { purchased_states_arr: [true, false], setPurchaseState: jest.fn(), type: '', -}; +} as unknown as React.ComponentProps; jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), 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 972fddcaaeb1..3cc03e313cbc 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx @@ -3,7 +3,7 @@ import { Money } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; 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 TradeParamsModal from '../../Containers/trade-params-mobile'; import { observer, useStore } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; diff --git a/packages/trader/src/Modules/Trading/Components/Elements/payout-per-point-mobile.tsx b/packages/trader/src/Modules/Trading/Components/Elements/payout-per-point-mobile.tsx index f2a409658087..fd24be61089d 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/payout-per-point-mobile.tsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/payout-per-point-mobile.tsx @@ -5,22 +5,10 @@ import Fieldset from 'App/Components/Form/fieldset'; import { observer } from '@deriv/stores'; import { getContractSubtype, isVanillaContract } from '@deriv/shared'; import { useTraderStore } from 'Stores/useTraderStores'; +import { TProposalTypeInfo } from 'Types'; type TProposalInfo = { - [key: string]: { - has_error?: boolean; - id: string; - has_increased?: boolean; - message?: string; - cancellation?: { - ask_price: number; - date_expiry: number; - }; - growth_rate?: number; - obj_contract_basis?: Record<'text' | 'value', string>; - returns?: string; - stake: string; - }; + [key: string]: TProposalTypeInfo; }; const PayoutPerPointMobile = observer(() => { diff --git a/packages/trader/src/Modules/Trading/Components/Elements/purchase-button.tsx b/packages/trader/src/Modules/Trading/Components/Elements/purchase-button.tsx index 2d39b67f94e8..5f24ead4faeb 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/purchase-button.tsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/purchase-button.tsx @@ -3,11 +3,11 @@ import React from 'react'; import { DesktopWrapper, MobileWrapper, Money, IconTradeTypes, Text } from '@deriv/components'; import ContractInfo from 'Modules/Trading/Components/Form/Purchase/contract-info'; import { getContractTypeDisplay } from '@deriv/shared'; -import { TProposalTypeInfo } from 'Types'; +import { TProposalTypeInfo, TTradeStore } from 'Types'; type TPurchaseButton = { basis: string; - buy_info: { error?: string }; + buy_info: TTradeStore['purchase_info']; currency: string; growth_rate: number; has_deal_cancellation: boolean; @@ -164,6 +164,7 @@ const PurchaseButton = ({ is_loading={is_loading} is_multiplier={is_multiplier} is_turbos={is_turbos} + is_vanilla={is_vanilla} should_fade={should_fade} proposal_info={info} type={type} diff --git a/packages/trader/src/Modules/Trading/Components/Elements/purchase-fieldset.tsx b/packages/trader/src/Modules/Trading/Components/Elements/purchase-fieldset.tsx index 9dd0c883dfb5..b45321d42b1f 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/purchase-fieldset.tsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/purchase-fieldset.tsx @@ -5,11 +5,11 @@ import Fieldset from 'App/Components/Form/fieldset'; import ContractInfo from 'Modules/Trading/Components/Form/Purchase/contract-info'; import PurchaseButton from 'Modules/Trading/Components/Elements/purchase-button'; import CancelDealInfo from '../Form/Purchase/cancel-deal-info'; -import { TProposalTypeInfo } from 'Types'; +import { TProposalTypeInfo, TTradeStore } from 'Types'; type TPurchaseFieldset = { basis: string; - buy_info: { error?: string }; + buy_info: TTradeStore['purchase_info']; currency: string; growth_rate: number; has_cancellation: boolean; @@ -119,6 +119,8 @@ const PurchaseFieldset = ({ is_vanilla={is_vanilla} should_fade={should_fade} type={type} + is_accumulator={is_accumulator} + growth_rate={growth_rate} /> )}
{ +const Info = observer(({ handleSelect, item, list }: TInfo) => { + const { + ui: { is_mobile }, + } = useStore(); const [selected_tab, setSelectedTab] = React.useState(TABS.DESCRIPTION); const contract_types: TContractType[] | undefined = getContractTypes(list, item)?.filter( (i: { value: TContractType['value'] }) => @@ -34,7 +38,7 @@ const Info = ({ handleSelect, item, list }: TInfo) => { const should_show_video = /accumulator|vanilla/i.test(item.value); const is_description_tab_selected = selected_tab === TABS.DESCRIPTION; const is_glossary_tab_selected = selected_tab === TABS.GLOSSARY; - const width = isMobile() ? '328' : '528'; + const width = is_mobile ? '328' : '528'; const scroll_bar_height = has_toggle_buttons ? '464px' : '560px'; const onClickGlossary = () => setSelectedTab(TABS.GLOSSARY); @@ -70,7 +74,7 @@ const Info = ({ handleSelect, item, list }: TInfo) => { left: `${is_description_tab_selected ? '-' : ''}${width}px`, transform: `translate3d(${is_description_tab_selected ? '' : '-'}${width}px, 0, 0)`, }} - height={isMobile() ? '' : scroll_bar_height} + height={is_mobile ? '' : scroll_bar_height} autohide={false} >
{ 'contract-type-info--has-toggle-buttons': has_toggle_buttons, })} style={{ - width: isMobile() ? '328px' : '528px', + width: is_mobile ? '328px' : '528px', }} > {cards} @@ -137,6 +141,6 @@ const Info = ({ handleSelect, item, list }: TInfo) => {
); -}; +}); export default Info; diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-info.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-info.spec.tsx index af3a320acde9..8a7d37057564 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-info.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-info.spec.tsx @@ -6,6 +6,15 @@ import userEvent from '@testing-library/user-event'; jest.mock('Assets/Trading/Categories/trade-categories-gif', () => jest.fn(() => 'TradeCategoriesGif')); jest.mock('Assets/Trading/Categories/trade-categories', () => jest.fn(() => 'TradeDescription')); jest.mock('../ContractTypeInfo/contract-type-glossary', () => jest.fn(() => 'TradeTypeGlossary')); +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), +})); const mocked_props: React.ComponentProps = { handleSelect: jest.fn(), diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-menu.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-menu.spec.tsx index 46de4a3b4ba2..9f405323c716 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-menu.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-menu.spec.tsx @@ -3,6 +3,16 @@ import { fireEvent, render, screen } from '@testing-library/react'; import ContractTypeMenu from '../ContractTypeMenu'; import ContractTypeWidget from '../contract-type-widget'; +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), +})); + describe('ContractTypeMenu', () => { const categories: React.ComponentProps['categories'] = [ { @@ -292,7 +302,7 @@ describe('ContractTypeMenu', () => { }); it('should render component when click on ', () => { - render(); + render(); const dt_contract_dropdown = screen.getByTestId('dt_contract_dropdown'); fireEvent.click(dt_contract_dropdown); diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-widget.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-widget.spec.tsx index 4e81e7dc06b2..153198722b0c 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-widget.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-widget.spec.tsx @@ -1,6 +1,17 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import ContractTypeWidget from '../contract-type-widget'; +import { useStore } from '@deriv/stores'; + +jest.mock('@deriv/stores', () => ({ + ...jest.requireActual('@deriv/stores'), + observer: jest.fn(x => x), + useStore: jest.fn(() => ({ + ui: { + is_mobile: false, + }, + })), +})); describe('', () => { const list = [ @@ -72,7 +83,12 @@ describe('', () => { }; it('should render component when click on ', () => { - render(); + (useStore as jest.Mock).mockReturnValue({ + ui: { + is_mobile: false, + }, + }); + render(); expect(screen.getByTestId('dt_contract_widget')).toBeInTheDocument(); }); }); diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.tsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.tsx index 7f5224568e3a..11a666819a3a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { isMobile } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; import { RudderStack } from '@deriv/analytics'; import ContractType from './contract-type'; @@ -7,14 +7,22 @@ import { getContractTypeCategoryIcons, findContractCategory } from '../../../Hel import { TContractCategory, TContractType, TList } from './types'; type TContractTypeWidget = { - name?: string; + name: string; value: TContractType['value']; list: TContractCategory[]; - onChange: (event: DeepPartial>) => void; + onChange: (e: { + target: { + name: string; + value: unknown; + }; + }) => Promise; languageChanged?: boolean; }; -const ContractTypeWidget = ({ name, value, list, onChange, languageChanged }: TContractTypeWidget) => { +const ContractTypeWidget = observer(({ name, value, list, onChange, languageChanged }: TContractTypeWidget) => { + const { + ui: { is_mobile }, + } = useStore(); const wrapper_ref = React.useRef(null); const [is_dialog_open, setDialogVisibility] = React.useState(); const [is_info_dialog_open, setInfoDialogVisibility] = React.useState(false); @@ -24,14 +32,14 @@ const ContractTypeWidget = ({ name, value, list, onChange, languageChanged }: TC const handleClickOutside = React.useCallback( (event: MouseEvent) => { - if (isMobile()) return; + if (is_mobile) return; if (wrapper_ref && !wrapper_ref.current?.contains(event.target as Node) && is_dialog_open) { setDialogVisibility(false); setInfoDialogVisibility(false); setItem({ ...item, value }); } }, - [item, value] + [item, value, is_mobile] ); React.useEffect(() => { @@ -276,6 +284,6 @@ const ContractTypeWidget = ({ name, value, list, onChange, languageChanged }: TC
); -}; +}); export default ContractTypeWidget; diff --git a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.js b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.js deleted file mode 100644 index 9568f8361b3f..000000000000 --- a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import TradingDatePicker from './trading-date-picker.jsx'; - -export default TradingDatePicker; diff --git a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.ts b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.ts new file mode 100644 index 000000000000..96d6e375f1b7 --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/index.ts @@ -0,0 +1,3 @@ +import TradingDatePicker from './trading-date-picker'; + +export default TradingDatePicker; 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.tsx similarity index 77% rename from packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.jsx rename to packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.tsx index 2d55815ca80b..45d50054710f 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.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; +import moment from 'moment'; import React from 'react'; import { DatePicker, Tooltip } from '@deriv/components'; import { isTimeValid, setTime, toMoment, useIsMounted, hasIntradayDurationUnit } from '@deriv/shared'; @@ -8,7 +8,19 @@ 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 }) => { +type TDatePickerOnChange = React.ComponentProps['onChange']; +type TMarketEvent = { + dates: string[]; + descrip: string; +}; +type TTradingDatePickerProps = { + id: string; + is_24_hours_contract?: boolean; + mode?: string; + name: string; +}; + +const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }: TTradingDatePickerProps) => { const { common } = useStore(); const { server_time } = common; const { @@ -25,14 +37,15 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => const isMounted = useIsMounted(); - const [disabled_days, setDisabledDays] = React.useState([]); - const [market_events, setMarketEvents] = React.useState([]); + const [disabled_days, setDisabledDays] = React.useState([]); + const [market_events, setMarketEvents] = React.useState([]); const [duration, setDuration] = React.useState(current_duration); - const [selected_date, setSelectedDate] = React.useState(); + const [selected_date, setSelectedDate] = React.useState(); React.useEffect(() => { onChangeCalendarMonth(); - }, [onChangeCalendarMonth]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); React.useEffect(() => { if (duration !== current_duration) { @@ -50,7 +63,7 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => const getMomentContractStartDateTime = () => { return setTime( toMoment(getMinDuration()), - isTimeValid(start_time) ? start_time : server_time.format('HH:mm:ss') + isTimeValid(start_time ?? '') ? start_time : server_time?.format('HH:mm:ss') ?? '' ); }; @@ -66,17 +79,16 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => }; const getMaxDateDuration = () => { + const max_daily_duration = start_date ? 24 * 3600 : getMaxDailyDuration(); return is_24_hours_contract - ? getMomentContractStartDateTime() - .clone() - .add(start_date ? 24 * 3600 : getMaxDailyDuration(), 'second') + ? getMomentContractStartDateTime().clone().add(max_daily_duration, 'second') : getMomentContractStartDateTime().clone().add(getMaxDailyDuration(), 'second'); }; const hasRangeSelection = () => mode === 'duration'; const getFooter = () => { - if (!hasRangeSelection()) return null; + if (!hasRangeSelection()) return ''; if (!duration) return localize('Minimum duration is 1 day'); if (+duration === 1) return localize('Duration: {{duration}} day', { duration }); @@ -89,19 +101,19 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => : selected_date || getMinDateExpiry(); }; - const onChangeDate = e => { + const onChangeDate: TDatePickerOnChange = e => { if (isMounted()) { if (hasRangeSelection()) { - setDuration(e.duration); - } else if (e.target.value) { - setSelectedDate(toMoment(e.target.value)); + setDuration(Number(e.duration)); + } else if (e.target?.value) { + setSelectedDate(toMoment(e.target?.value)); } } if (typeof onChange === 'function' && e.target) { onChange({ target: { - name: e.target.name, + name: e.target.name || '', value: hasRangeSelection() ? e.target.value : toMoment(e.target.value).format('YYYY-MM-DD'), }, }); @@ -109,11 +121,12 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => }; const onChangeCalendarMonth = React.useCallback( + // Do not move this callback up. It will cause infinite loop. async (e = toMoment().format('YYYY-MM-DD')) => { - const new_market_events = []; - let new_disabled_days = []; - + const new_market_events: TMarketEvent[] = []; + let new_disabled_days: number[] = []; const events = await ContractType.getTradingEvents(e, symbol); + // @ts-expect-error TODO: check if TS error is gone after contract-type is converted to TS events.forEach(evt => { const dates = evt.dates.split(', '); // convert dates str into array const idx = dates.indexOf('Fridays'); @@ -167,18 +180,11 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => disabled_days={disabled_days} keep_open readOnly={!hasRangeSelection()} - value={getDatepickerValue()} + value={getDatepickerValue() as string} />
); }); -TradingDatePicker.propTypes = { - id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - is_24_hours_contract: PropTypes.bool, - mode: PropTypes.string, - name: PropTypes.string, -}; - export default TradingDatePicker; diff --git a/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.tsx b/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.tsx index febf2f6cc8de..3010d38f6a34 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.tsx @@ -13,15 +13,12 @@ const CancelDealInfo = observer(({ proposal_info }: { proposal_info: TProposalTy const error = has_error ?? !id; const [is_row_layout, setIsRowLayout] = React.useState(false); - const ref = React.useRef(null); + const ref = React.useRef(null); React.useEffect(() => { if (ref.current) { - const el_height = ref.current.parentElement?.clientHeight; - if ( - el_height && - ((el_height > 21 && isDesktop()) || ((el_height > 21 || getDecimalPlaces(currency) > 2) && isMobile())) - ) { + const el_height = Number(ref.current.parentElement?.clientHeight); + if ((el_height > 21 && isDesktop()) || ((el_height > 21 || getDecimalPlaces(currency) > 2) && isMobile())) { setIsRowLayout(true); } else { setIsRowLayout(false); diff --git a/packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.jsx b/packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.tsx similarity index 77% rename from packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.jsx rename to packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.tsx index 209a7d98a52e..6c3a53f41e0e 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/Purchase/contract-info.tsx @@ -1,44 +1,23 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; -import { DesktopWrapper, Icon, MobileWrapper, Money, Popover, Text } from '@deriv/components'; +import { DesktopWrapper, MobileWrapper, Money, Popover, Text } from '@deriv/components'; import { Localize, localize } from '@deriv/translations'; import { getContractSubtype, getCurrencyDisplayCode, getLocalizedBasis, getGrowthRatePercentage } from '@deriv/shared'; +import { useTraderStore } from 'Stores/useTraderStores'; import CancelDealInfo from './cancel-deal-info'; +import ValueMovement from './value-movement'; +import { TProposalTypeInfo } from 'Types'; -export const ValueMovement = ({ - has_error_or_not_loaded, - proposal_info, - currency, - has_increased, - is_turbos, - is_vanilla, - value, - show_currency = true, -}) => ( -
-
- {!has_error_or_not_loaded && ( - - )} -
-
- {!has_error_or_not_loaded && has_increased !== null && has_increased ? ( - - ) : ( - - )} -
-
-); +type TContractInfo = Pick< + ReturnType, + 'basis' | 'growth_rate' | 'is_accumulator' | 'is_turbos' | 'is_vanilla' | 'is_multiplier' | 'currency' +> & { + has_increased?: boolean | null; + is_loading: boolean; + proposal_info: TProposalTypeInfo; + should_fade: boolean; + type: string; +}; const ContractInfo = ({ basis, @@ -53,7 +32,7 @@ const ContractInfo = ({ should_fade, proposal_info, type, -}) => { +}: TContractInfo) => { const localized_basis = getLocalizedBasis(); const stakeOrPayout = () => { switch (basis) { @@ -72,7 +51,7 @@ const ContractInfo = ({ }; const has_error_or_not_loaded = proposal_info.has_error || !proposal_info.id; - const basis_text = has_error_or_not_loaded ? stakeOrPayout() : proposal_info.obj_contract_basis.text; + const basis_text = has_error_or_not_loaded ? stakeOrPayout() : proposal_info?.obj_contract_basis?.text || ''; const { message, obj_contract_basis, stake } = proposal_info; const setHintMessage = () => { @@ -182,19 +161,4 @@ const ContractInfo = ({ ); }; -ContractInfo.propTypes = { - basis: PropTypes.string, - currency: PropTypes.string, - growth_rate: PropTypes.number, - has_increased: PropTypes.bool, - is_accumulator: PropTypes.bool, - is_multiplier: PropTypes.bool, - is_turbos: PropTypes.bool, - is_vanilla: PropTypes.bool, - is_loading: PropTypes.bool, - proposal_info: PropTypes.object, - should_fade: PropTypes.bool, - type: PropTypes.string, -}; - export default ContractInfo; diff --git a/packages/trader/src/Modules/Trading/Components/Form/Purchase/value-movement.tsx b/packages/trader/src/Modules/Trading/Components/Form/Purchase/value-movement.tsx new file mode 100644 index 000000000000..ff65e52dfc75 --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/Purchase/value-movement.tsx @@ -0,0 +1,50 @@ +import classNames from 'classnames'; +import React from 'react'; +import { Icon, Money } from '@deriv/components'; +import ContractInfo from './contract-info'; + +type TValueMovement = Partial< + Pick< + React.ComponentProps, + 'is_turbos' | 'is_vanilla' | 'currency' | 'has_increased' | 'proposal_info' + > +> & { + has_error_or_not_loaded: boolean; + value?: number | string; + show_currency?: boolean; +}; +const ValueMovement = ({ + has_error_or_not_loaded, + proposal_info, + currency, + has_increased, + is_turbos = false, + is_vanilla = false, + value, + show_currency = true, +}: TValueMovement) => ( +
+
+ {!has_error_or_not_loaded && ( + + )} +
+
+ {!has_error_or_not_loaded && has_increased !== null && has_increased ? ( + + ) : ( + + )} +
+
+); + +export default ValueMovement; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.js b/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.js deleted file mode 100644 index 47ae05b98d23..000000000000 --- a/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import TradingTimePicker from './trading-time-picker.jsx'; - -export default TradingTimePicker; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.ts b/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.ts new file mode 100644 index 000000000000..78ac285aad36 --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/TimePicker/index.ts @@ -0,0 +1,3 @@ +import TradingTimePicker from './trading-time-picker'; + +export default TradingTimePicker; 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.tsx similarity index 100% rename from packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.tsx diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/duration-range-text.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/duration-range-text.spec.tsx new file mode 100644 index 000000000000..13ea85a7c844 --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/duration-range-text.spec.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import DurationRangeText from '../duration-range-text'; + +const mocked_props = { + min: '1', + max: '1440', + duration_unit_text: 'minutes', +}; + +describe('', () => { + it('should render component with proper text', () => { + render(); + + expect(screen.getByText(/Range: 1 - 1,440 minutes/i)).toBeInTheDocument(); + }); +}); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/expiry-text.spec.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/expiry-text.spec.jsx new file mode 100644 index 000000000000..7b838a3df45b --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/__tests__/expiry-text.spec.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import ExpiryText from '../expiry-text'; + +const mocked_props = { + expiry_epoch: 1695427199, + has_error: false, +}; + +describe('', () => { + it('should render component with proper formatted date if has_error === false and fixed_date was not passed', () => { + render(); + + expect(screen.getByText(/Expiry: 22 Sep 2023/i)).toBeInTheDocument(); + }); + + it('should not render date if has_error === true', () => { + render(); + + expect(screen.queryByText(/Expiry: 22 Sep 2023/i)).not.toBeInTheDocument(); + }); + + it('should render fixed date if it was passed', () => { + render(); + + expect(screen.getByText(/Expiry: 20 September/i)).toBeInTheDocument(); + }); +}); 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 2c126fce7117..5dec629d54c9 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 @@ -3,11 +3,12 @@ import { PropTypes as MobxPropTypes } from 'mobx-react'; import PropTypes from 'prop-types'; import React from 'react'; import { Dropdown, ButtonToggle, InputField } from '@deriv/components'; -import { toMoment, hasIntradayDurationUnit } from '@deriv/shared'; +import { getDurationMinMaxValues, getUnitMap, hasIntradayDurationUnit, toMoment } from '@deriv/shared'; import RangeSlider from 'App/Components/Form/RangeSlider'; import TradingDatePicker from '../../DatePicker'; import TradingTimePicker from '../../TimePicker'; import ExpiryText from './expiry-text.jsx'; +import DurationRangeText from './duration-range-text'; import { observer, useStore } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; @@ -32,8 +33,9 @@ const AdvancedDuration = observer( }) => { const { ui } = useStore(); const { current_focus, setCurrentFocus } = ui; - const { contract_expiry_type, validation_errors } = useTraderStore(); + const { contract_expiry_type, duration_min_max, is_vanilla, validation_errors } = useTraderStore(); + const [min, max] = getDurationMinMaxValues(duration_min_max, contract_expiry_type, advanced_duration_unit); let is_24_hours_contract = false; if (expiry_type === 'endtime') { @@ -56,6 +58,9 @@ const AdvancedDuration = observer( const has_error = !!validation_errors?.duration?.length; + const { name_plural, name } = getUnitMap()[advanced_duration_unit]; + const duration_unit_text = name_plural ?? name; + return ( <> {expiry_list.length > 1 && ( @@ -96,9 +101,6 @@ const AdvancedDuration = observer( is_24_hours_contract={is_24_hours_contract} /> )} - {advanced_duration_unit === 'd' && ( - - )} {advanced_duration_unit !== 't' && advanced_duration_unit !== 'd' && ( )} + {is_vanilla && ( + + )} + {advanced_duration_unit === 'd' && ( + + )}
) : ( @@ -122,7 +130,6 @@ const AdvancedDuration = observer( id='dt_advanced_duration_datepicker' name='expiry_date' is_24_hours_contract={is_24_hours_contract} - value={expiry_date} /> { is_24_hours_contract && 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 f7ae5abb1536..65d2405e5f06 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 @@ -1,7 +1,10 @@ import React from 'react'; -import { Tabs, TickPicker, Numpad, RelativeDatepicker, Text } from '@deriv/components'; -import { isEmptyObject, addComma, getDurationMinMaxValues } from '@deriv/shared'; +import classNames from 'classnames'; +import { Tabs, TickPicker, Numpad, RelativeDatepicker } from '@deriv/components'; +import { isEmptyObject, addComma, getDurationMinMaxValues, getUnitMap } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; +import ExpiryText from './expiry-text.jsx'; +import DurationRangeText from './duration-range-text'; import { observer, useStore } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; import moment from 'moment'; @@ -112,6 +115,7 @@ const Numbers = observer( duration_unit: trade_duration_unit, basis: trade_basis, amount: trade_amount, + is_vanilla, onChangeMultiple, } = useTraderStore(); const { value: duration_unit } = duration_unit_option; @@ -187,18 +191,21 @@ const Numbers = observer( validateDuration(num); }; + const fixed_date = !has_error ? setExpiryDate(expiry_epoch, duration_values?.d_duration) : ''; + + const { name_plural, name } = getUnitMap()[duration_unit]; + const duration_unit_text = name_plural ?? name; + return (
- {show_expiry && ( - - - - )} +
+ {is_vanilla && } + {show_expiry && } +
( + + + +); + +export default DurationRangeText; 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 8ef7596439f6..eb20274ae761 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,6 +1,4 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; import { getDurationMinMaxValues } from '@deriv/shared'; import Duration from './duration.jsx'; import { observer, useStore } from '@deriv/stores'; @@ -195,18 +193,4 @@ const DurationWrapper = observer(() => { ); }); -DurationWrapper.propTypes = { - duration_d: PropTypes.number, - duration_h: PropTypes.number, - duration_m: PropTypes.number, - duration_s: PropTypes.number, - duration_unit: PropTypes.string, - duration_units_list: MobxPropTypes.arrayOrObservableArray, - getDurationFromUnit: PropTypes.func, - is_minimized: PropTypes.bool, - sessions: MobxPropTypes.arrayOrObservableArray, - start_time: PropTypes.string, - symbol: PropTypes.string, -}; - export default DurationWrapper; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/expiry-text.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/expiry-text.jsx index 82200999a6eb..ba94abb09533 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/expiry-text.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/expiry-text.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; -const ExpiryText = ({ expiry_epoch, has_error }) => { +const ExpiryText = ({ expiry_epoch, has_error, fixed_date }) => { const formatted_date = expiry_epoch && !has_error ? new Date(expiry_epoch * 1000) @@ -14,7 +14,7 @@ const ExpiryText = ({ expiry_epoch, has_error }) => { return ( - + ); }; 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 cf59ea773a0b..42ffac9e2b05 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,9 +1,11 @@ import React from 'react'; + import { Checkbox, Dropdown, Popover, PopoverMessageCheckbox } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; import { localize } from '@deriv/translations'; + import Fieldset from 'App/Components/Form/fieldset'; -import { onToggleCancellation, onChangeCancellationDuration } from 'Stores/Modules/Trading/Helpers/multiplier'; -import { observer, useStore } from '@deriv/stores'; +import { onChangeCancellationDuration,onToggleCancellation } from 'Stores/Modules/Trading/Helpers/multiplier'; import { useTraderStore } from 'Stores/useTraderStores'; const CancelDeal = observer(() => { 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.tsx similarity index 71% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.tsx index 3042c960b29c..29a4a14dd5c6 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.tsx @@ -1,6 +1,5 @@ import classNames from 'classnames'; import React from 'react'; -import PropTypes from 'prop-types'; import { Popover, Money, Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; import { observer } from '@deriv/stores'; @@ -9,8 +8,31 @@ import { useTraderStore } from 'Stores/useTraderStores'; const commission_tooltip_margin = 30; const stop_out_tooltip_margin = 160; +type TMultipliersInfo = { + amount?: number | string; + className: string; + commission_text_size?: string; + commission?: number | null; + is_tooltip_relative?: boolean; + should_show_tooltip?: boolean; + stop_out_text_size?: string; + stop_out?: number | null; + multiplier?: number; +}; + +type TPopoverPosition = React.ComponentProps['alignment']; + +type TTooltip_params = { alignment: TPopoverPosition; relative_render?: boolean; margin?: number; zIndex?: string }; + const MultipliersInfo = observer( - ({ className, commission_text_size, stop_out_text_size, is_tooltip_relative, should_show_tooltip, ...props }) => { + ({ + className, + commission_text_size, + stop_out_text_size, + is_tooltip_relative, + should_show_tooltip, + ...props + }: TMultipliersInfo) => { const trade = useTraderStore(); const { currency, has_stop_loss } = trade; const multiplier = props.multiplier ?? (trade.multiplier || 0); @@ -54,7 +76,7 @@ const MultipliersInfo = observer( ); - const getInfo = ({ text, message, margin }) => { + const getInfo = ({ + text, + message, + margin, + }: { + text: React.ReactNode; + message: React.ReactNode; + margin: number; + }) => { + const tooltip_params: TTooltip_params = is_tooltip_relative + ? { alignment: 'left', relative_render: true, margin } + : { alignment: 'top', zIndex: '9999' }; return should_show_tooltip ? ( - + {text} ) : ( @@ -110,12 +138,4 @@ const MultipliersInfo = observer( } ); -MultipliersInfo.propTypes = { - className: PropTypes.string, - commission_text_size: PropTypes.string, - is_tooltip_relative: PropTypes.bool, - should_show_tooltip: PropTypes.bool, - stop_out_text_size: PropTypes.string, -}; - export default MultipliersInfo; 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 9aec863c016d..d9d03da39f20 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 @@ -3,11 +3,11 @@ import classNames from 'classnames'; import { Money, Text, Popover } from '@deriv/components'; import { useTraderStore } from 'Stores/useTraderStores'; import { observer } from '@deriv/stores'; -import MultiplierAmountModal from 'Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx'; +import MultiplierAmountModal from 'Modules/Trading/Containers/Multiplier/multiplier-amount-modal'; import RadioGroupOptionsModal from 'Modules/Trading/Containers/radio-group-options-modal'; import MultipliersExpiration from 'Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx'; import MultipliersExpirationModal from 'Modules/Trading/Components/Form/TradeParams/Multiplier/expiration-modal.jsx'; -import MultipliersInfo from 'Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx'; +import MultipliersInfo from 'Modules/Trading/Components/Form/TradeParams/Multiplier/info'; import { localize, Localize } from '@deriv/translations'; import { getGrowthRatePercentage, getTickSizeBarrierPercentage } from '@deriv/shared'; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/barriers-list.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/barriers-list.spec.tsx index 44907c267788..5a21254fa22a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/barriers-list.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/barriers-list.spec.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import userEvent from '@testing-library/user-event'; +import { StoreProvider, mockStore } from '@deriv/stores'; import BarriersList from '../barriers-list'; const barrier_choices = ['16', '33', '40']; @@ -11,19 +12,26 @@ const mockHoverCallback = jest.fn(); const mockClickCrossCallback = jest.fn(); describe('', () => { + const mock_store = mockStore({ + ui: { + is_mobile: false, + }, + }); beforeEach(() => { render( - + + + ); }); it('all barrier options should be rendered', () => { diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/min-max-stake-info.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/min-max-stake-info.spec.tsx index a79f3796ce1f..e685c3c1c40c 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/min-max-stake-info.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/__tests__/min-max-stake-info.spec.tsx @@ -2,8 +2,10 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import MinMaxStakeInfo from '../min-max-stake-info'; +import { StoreProvider, mockStore } from '@deriv/stores'; describe('', () => { + const store = mockStore({}); const mock_props = { className: 'trade-container__stake-field', currency: 'USD', @@ -12,7 +14,11 @@ describe('', () => { }; it('should be rendered correctly with both Min. stake and Max. stake', () => { - render(); + render( + + + + ); [screen.getByText('Min. stake'), screen.getByText('Max. stake')].forEach(stake_text => { expect(stake_text).toBeInTheDocument(); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.tsx similarity index 72% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.tsx index 0d3ad0614154..448e3419ba38 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/allow-equals.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Popover, Checkbox } from '@deriv/components'; import { localize } from '@deriv/translations'; import { @@ -7,6 +6,22 @@ import { hasDurationForCallPutEqual, isRiseFallEqual, } from 'Stores/Modules/Trading/Helpers/allow-equals'; +import { useTraderStore } from 'Stores/useTraderStores'; + +type TTradeStore = Pick< + ReturnType, + | 'contract_start_type' + | 'contract_type' + | 'contract_types_list' + | 'duration_unit' + | 'expiry_type' + | 'has_equals_only' +>; + +type TAllowEquals = TTradeStore & { + onChange: (e: { target: { name: string; value: number } }) => Promise; + value: number; +}; const AllowEquals = ({ contract_start_type, @@ -17,7 +32,7 @@ const AllowEquals = ({ onChange, value, has_equals_only, -}) => { +}: TAllowEquals) => { const has_callputequal_duration = hasDurationForCallPutEqual( contract_types_list, duration_unit, @@ -28,10 +43,12 @@ const AllowEquals = ({ const has_allow_equals = isRiseFallEqual(contract_type) && (has_callputequal_duration || expiry_type === 'endtime') && has_callputequal; - const changeValue = e => { + const changeValue: React.ComponentProps['onChange'] = e => { e.persist(); - const { name, checked } = e.target; - onChange({ target: { name, value: Number(checked) } }); + if ('checked' in e.target) { + const { name, checked } = e.target; + onChange({ target: { name, value: Number(checked) } }); + } }; return ( @@ -61,15 +78,4 @@ const AllowEquals = ({ ); }; -AllowEquals.propTypes = { - contract_start_type: PropTypes.string, - contract_type: PropTypes.string, - contract_types_list: PropTypes.object, - duration_unit: PropTypes.string, - expiry_type: PropTypes.string, - has_equals_only: PropTypes.bool, - onChange: PropTypes.func, - value: PropTypes.number, -}; - export default AllowEquals; 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.tsx similarity index 83% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.tsx index 2e5439c3aff1..6a5e8b2cc6df 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.tsx @@ -7,6 +7,27 @@ import { Money, Numpad, Tabs } from '@deriv/components'; import { getDecimalPlaces, isEmptyObject } from '@deriv/shared'; import MinMaxStakeInfo from './min-max-stake-info'; +type TAmountMobile = Pick< + React.ComponentProps, + 'toggleModal' | 'duration_value' | 'duration_unit' | 'has_duration_error' | 'setAmountError' | 'setSelectedAmount' +> & { + amount_tab_idx?: number; + setAmountTabIdx?: React.ComponentProps['onTabItemClick']; + stake_value: string | number; + payout_value?: string | number; +}; + +type TBasis = { + basis: string; + duration_unit?: string; + duration_value?: number; + toggleModal: () => void; + has_duration_error?: boolean; + selected_basis?: string | number; + setSelectedAmount: (basis: string, num: string | number) => void; + setAmountError?: (has_error: boolean) => void; +}; + const Basis = observer( ({ basis, @@ -17,7 +38,7 @@ const Basis = observer( selected_basis, setSelectedAmount, setAmountError, - }) => { + }: TBasis) => { const { ui, client } = useStore(); const { addToast } = ui; const { currency } = client; @@ -26,22 +47,22 @@ const Basis = observer( is_turbos, is_vanilla, onChangeMultiple, + amount: trade_amount, + basis: trade_basis, + duration_unit: trade_duration_unit, + duration: trade_duration, stake_boundary, - trade_amount, - trade_basis, - trade_duration_unit, - trade_duration, } = useTraderStore(); const { min_stake, max_stake } = stake_boundary[contract_type.toUpperCase()] || {}; const user_currency_decimal_places = getDecimalPlaces(currency); - const onNumberChange = num => { + const onNumberChange = (num: number | string) => { 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 formatAmount = (value: number | string) => + !isNaN(+value) && value !== '' ? Number(value).toFixed(user_currency_decimal_places) : value; + const setBasisAndAmount = (amount: number | string) => { + const on_change_obj: Partial> = {}; // Check for any duration changes in Duration trade params Tab before sending onChange object if (duration_unit !== trade_duration_unit && !has_duration_error) @@ -50,7 +71,7 @@ const Basis = observer( if (amount !== trade_amount || basis !== trade_basis) { on_change_obj.basis = basis; - on_change_obj.amount = amount; + on_change_obj.amount = +amount; } if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); @@ -59,7 +80,7 @@ const Basis = observer( const zero_decimals = Number('0').toFixed(getDecimalPlaces(currency)); const min_amount = parseFloat(zero_decimals.toString().replace(/.$/, '1')); - const validateAmount = value => { + const validateAmount = (value: number | string) => { const localized_message = ; const min_max_stake_message = ( { + }: TAmountMobile) => { 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); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.tsx similarity index 88% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.tsx index 9352e4b03e24..ff841b941417 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.tsx @@ -1,29 +1,37 @@ import { AMOUNT_MAX_LENGTH, addComma, getDecimalPlaces } from '@deriv/shared'; import { ButtonToggle, Dropdown, InputField } from '@deriv/components'; import { Localize, localize } from '@deriv/translations'; - -import AllowEquals from './allow-equals.jsx'; +import AllowEquals from './allow-equals'; import Fieldset from 'App/Components/Form/fieldset'; import Multiplier from './Multiplier/multiplier.jsx'; -import MultipliersInfo from './Multiplier/info.jsx'; +import MultipliersInfo from './Multiplier/info'; import MinMaxStakeInfo from './min-max-stake-info'; -import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; import { useTraderStore } from 'Stores/useTraderStores'; import { observer, useStore } from '@deriv/stores'; +type TInput = { + amount: string | number; + currency: string; + current_focus: string | null; + error_messages?: string[]; + is_disabled?: boolean; + is_single_currency?: boolean; + onChange: (e: { target: { name: string; value: number | string } }) => void; + setCurrentFocus: (name: string | null) => void; +}; + export const Input = ({ amount, currency, current_focus, error_messages, - is_nativepicker, is_single_currency, is_disabled, onChange, setCurrentFocus, -}) => ( +}: TInput) => ( ); -const Amount = observer(({ is_minimized, is_nativepicker }) => { +const Amount = observer(({ is_minimized = false }: { is_minimized?: boolean }) => { const { ui, client } = useStore(); const { currencies_list, is_single_currency } = client; const { setCurrentFocus, current_focus } = ui; @@ -82,9 +89,7 @@ const Amount = observer(({ is_minimized, is_nativepicker }) => { if (is_minimized) { return (
- - {(basis_list.find(o => o.value === basis) || {}).text} - + {basis_list.find(o => o.value === basis)?.text}   { ); } - const error_messages = validation_errors.amount; + const error_messages = validation_errors?.amount; const getBasisList = () => basis_list.map(item => ({ text: item.text, value: item.value })); @@ -140,12 +145,10 @@ const Amount = observer(({ is_minimized, is_nativepicker }) => { current_focus={current_focus} error_messages={error_messages} is_single_currency={is_single_currency} - is_nativepicker={is_nativepicker} onChange={onChange} setCurrentFocus={setCurrentFocus} /> { current_focus={current_focus} error_messages={error_messages} is_single_currency={is_single_currency} - is_nativepicker={is_nativepicker} is_disabled={has_open_accu_contract} onChange={onChange} setCurrentFocus={setCurrentFocus} @@ -177,7 +179,7 @@ const Amount = observer(({ is_minimized, is_nativepicker }) => { duration_unit={duration_unit} expiry_type={expiry_type} onChange={onChange} - value={parseInt(is_equal)} + value={Number(is_equal)} has_equals_only={has_equals_only} /> {is_multiplier && ( @@ -197,9 +199,4 @@ const Amount = observer(({ is_minimized, is_nativepicker }) => { ); }); -Amount.propTypes = { - is_minimized: PropTypes.bool, - is_nativepicker: PropTypes.bool, -}; - 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.tsx similarity index 94% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.tsx index 7ca8412e989f..e8f19de41855 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.tsx @@ -1,15 +1,19 @@ import classNames from 'classnames'; -import PropTypes from 'prop-types'; import React from 'react'; import { DesktopWrapper, Icon, InputField, MobileWrapper, Modal, Text, usePrevious } from '@deriv/components'; import Fieldset from 'App/Components/Form/fieldset'; -import { ValueMovement } from '../Purchase/contract-info'; +import ValueMovement from '../Purchase/value-movement'; import { observer, useStore } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; import { localize } from '@deriv/translations'; import LabeledQuantityInputMobile from '../LabeledQuantityInputMobile'; -const Barrier = observer(({ is_minimized, is_absolute_only }) => { +type TBarrier = { + is_minimized?: boolean; + is_absolute_only?: boolean; +}; + +const Barrier = observer(({ is_minimized, is_absolute_only }: TBarrier) => { const { ui } = useStore(); const { current_focus, setCurrentFocus } = ui; const { @@ -25,11 +29,12 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { } = 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]; + let contract_info, has_spot_increased; + if (type_with_current_spot) contract_info = proposal_info?.[type_with_current_spot]; const current_spot = contract_info?.spot || ''; const current_barrier_price = contract_info?.barrier || ''; const previous_spot = usePrevious(current_spot); - const has_spot_increased = current_spot > previous_spot; + if (previous_spot) has_spot_increased = Number(current_spot) > previous_spot; const barrier_title = barrier_count === 1 ? localize('Barrier') : localize('Barriers'); const has_error_or_not_loaded = contract_info?.has_error || !contract_info?.id; @@ -49,7 +54,7 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { // TODO: Some contracts yet to be implemented in app.deriv.com allow only absolute barrier, hence the prop const is_absolute_barrier = is_day_duration || is_absolute_only; - const format = value => { + const format = (value: string) => { const float_value = parseFloat(value); let final_value; if (Math.sign(float_value) === -1) { @@ -86,7 +91,7 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { )} current_focus={current_focus} onChange={onChange} - error_messages={validation_errors.barrier_1 || []} + error_messages={validation_errors?.barrier_1 || []} is_float is_signed setCurrentFocus={setCurrentFocus} @@ -103,7 +108,7 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { classNameInput='trade-container__input' current_focus={current_focus} onChange={onChange} - error_messages={validation_errors.barrier_2} + error_messages={validation_errors?.barrier_2} is_float is_signed setCurrentFocus={setCurrentFocus} @@ -155,7 +160,7 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { current_focus={current_focus} onChange={onChange} error_messages={ - (barrier_count === 1 ? validation_errors.barrier_1 : validation_errors.barrier_2) || [] + (barrier_count === 1 ? validation_errors?.barrier_1 : validation_errors?.barrier_2) || [] } error_message_alignment='top' is_float @@ -219,9 +224,4 @@ const Barrier = observer(({ is_minimized, is_absolute_only }) => { ); }); -Barrier.propTypes = { - is_absolute_only: PropTypes.bool, - is_minimized: PropTypes.bool, -}; - export default Barrier; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barriers-list-body.tsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barriers-list-body.tsx index b109b2bf6d9b..a265bf645893 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barriers-list-body.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barriers-list-body.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { isMobile } from '@deriv/shared'; -import { Text, ThemedScrollbars } from '@deriv/components'; import classNames from 'classnames'; +import { Text, ThemedScrollbars } from '@deriv/components'; +import { observer, useStore } from '@deriv/stores'; export type TBarriersListBody = { barriers_list: string[]; @@ -12,57 +12,55 @@ export type TBarriersListBody = { subheader?: string; }; -const BarriersListBody = ({ - barriers_list, - className, - onClick, - onHover, - selected_item, - subheader, -}: TBarriersListBody) => { - const onMouseEnter = (barrier: string) => { - if (selected_item !== barrier && typeof onHover === 'function') { - onHover(barrier); - } - }; - return ( - - {subheader && ( - - {subheader} - - )} - -
    - {barriers_list.map(barrier => ( - onClick(barrier)} - onMouseEnter={() => onMouseEnter(barrier)} - onMouseLeave={() => typeof onHover === 'function' && onHover('')} - > - {barrier} - - ))} -
-
-
- ); -}; +const BarriersListBody = observer( + ({ barriers_list, className, onClick, onHover, selected_item, subheader }: TBarriersListBody) => { + const { + ui: { is_mobile }, + } = useStore(); + const onMouseEnter = (barrier: string) => { + if (selected_item !== barrier && typeof onHover === 'function') { + onHover(barrier); + } + }; + return ( + + {subheader && ( + + {subheader} + + )} + +
    + {barriers_list.map(barrier => ( + onClick(barrier)} + onMouseEnter={() => onMouseEnter(barrier)} + onMouseLeave={() => typeof onHover === 'function' && onHover('')} + > + {barrier} + + ))} +
+
+
+ ); + } +); export default React.memo(BarriersListBody); 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.tsx similarity index 80% rename from packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx rename to packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.tsx index 46edec68c99a..58930d65d309 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { isDesktop } from '@deriv/shared'; import { localize } from '@deriv/translations'; @@ -7,7 +6,11 @@ import Fieldset from 'App/Components/Form/fieldset'; import { observer } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; -const LastDigit = observer(({ is_minimized }) => { +type TLastDigit = { + is_minimized?: boolean; +}; + +const LastDigit = observer(({ is_minimized }: TLastDigit) => { const { onChange, last_digit } = useTraderStore(); if (is_minimized) { return
{`${localize('Last Digit')}: ${last_digit}`}
; @@ -29,10 +32,4 @@ const LastDigit = observer(({ is_minimized }) => { ); }); -LastDigit.propTypes = { - is_minimized: PropTypes.bool, - last_digit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - onChange: PropTypes.func, -}; - export default LastDigit; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/min-max-stake-info.tsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/min-max-stake-info.tsx index 8a842efeb757..24e3541fe651 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/min-max-stake-info.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/min-max-stake-info.tsx @@ -2,26 +2,29 @@ import classNames from 'classnames'; import React from 'react'; import { Money, Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; -import { isMobile } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; type TMinMaxStakeInfo = { className?: string; - min_stake: number; - max_stake: number; - currency: string; + min_stake?: number; + max_stake?: number; + currency?: string; }; -const MinMaxStakeInfo = ({ className, currency, max_stake, min_stake }: TMinMaxStakeInfo) => { +const MinMaxStakeInfo = observer(({ className, currency, max_stake, min_stake }: TMinMaxStakeInfo) => { + const { + ui: { is_mobile }, + } = useStore(); return (
- {!isNaN(min_stake) && - !isNaN(max_stake) && + {!isNaN(Number(min_stake)) && + !isNaN(Number(max_stake)) && ['Min', 'Max'].map(text => ( ); -}; +}); export default MinMaxStakeInfo; diff --git a/packages/trader/src/Modules/Trading/Components/Form/__tests__/form-layout.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/__tests__/form-layout.spec.tsx index aac71ab5a862..ccd867780c23 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/__tests__/form-layout.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/__tests__/form-layout.spec.tsx @@ -1,9 +1,11 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; -import FormLayout from '../form-layout'; import Loadable from 'react-loadable'; -import TraderProviders from '../../../../../trader-providers'; + import { mockStore } from '@deriv/stores'; +import { render, screen } from '@testing-library/react'; + +import TraderProviders from '../../../../../trader-providers'; +import FormLayout from '../form-layout'; Loadable.preloadAll(); diff --git a/packages/trader/src/Modules/Trading/Components/Form/__tests__/screen-large.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/__tests__/screen-large.spec.tsx index e55433a5e35b..1e9b5aaceec2 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/__tests__/screen-large.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/__tests__/screen-large.spec.tsx @@ -1,5 +1,7 @@ import React from 'react'; + import { render, screen } from '@testing-library/react'; + import ScreenLarge from '../screen-large'; jest.mock('App/Components/Elements/ContentLoader', () => ({ @@ -8,7 +10,7 @@ jest.mock('App/Components/Elements/ContentLoader', () => ({ })); jest.mock('../../../Containers/contract-type', () => jest.fn(() => 'MockedContractType')); jest.mock('../../../Containers/purchase', () => jest.fn(() => 'MockedPurchase')); -jest.mock('../../../Containers/trade-params.jsx', () => jest.fn(() => 'MockedTradeParams')); +jest.mock('../../../Containers/trade-params', () => jest.fn(() => 'MockedTradeParams')); const mock_props = { is_market_closed: false, diff --git a/packages/trader/src/Modules/Trading/Components/Form/screen-large.tsx b/packages/trader/src/Modules/Trading/Components/Form/screen-large.tsx index 6916fd8d0c97..cd917012fd3a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/screen-large.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/screen-large.tsx @@ -4,7 +4,7 @@ import { TradeParamsLoader } from 'App/Components/Elements/ContentLoader'; import Fieldset from 'App/Components/Form/fieldset'; import ContractType from '../../Containers/contract-type'; import Purchase from '../../Containers/purchase'; -import TradeParams from '../../Containers/trade-params.jsx'; +import TradeParams from '../../Containers/trade-params'; type TScreenLarge = { is_market_closed?: boolean; diff --git a/packages/trader/src/Modules/Trading/Components/Form/screen-small.tsx b/packages/trader/src/Modules/Trading/Components/Form/screen-small.tsx index 7181dd35f9b4..7b74cdf82420 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/screen-small.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/screen-small.tsx @@ -13,11 +13,11 @@ import { } from 'Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx'; import AccumulatorsAmountMobile from 'Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-amount-mobile'; import AccumulatorsInfoDisplay from 'Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display'; -import { BarrierMobile, LastDigitMobile } from 'Modules/Trading/Containers/trade-params-mobile.jsx'; +import { BarrierMobile, LastDigitMobile } from 'Modules/Trading/Containers/trade-params-mobile'; import ContractType from 'Modules/Trading/Containers/contract-type'; import MobileWidget from 'Modules/Trading/Components/Elements/mobile-widget.jsx'; import Purchase from 'Modules/Trading/Containers/purchase'; -import RiskManagementInfo from 'Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx'; +import RiskManagementInfo from 'Modules/Trading/Components/Elements/Multiplier/risk-management-info'; import TakeProfit from 'Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx'; import 'Sass/app/_common/mobile-widget.scss'; import classNames from 'classnames'; 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.tsx similarity index 74% rename from packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx rename to packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.tsx index 7818ffd8b8fa..4fa8a039600c 100644 --- a/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx +++ b/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.tsx @@ -3,28 +3,30 @@ import { Div100vhContainer, Modal, Money, Popover, usePreventIOSZoom } from '@de import { useIsMounted, WS } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; 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 AmountMobile from 'Modules/Trading/Components/Form/TradeParams/amount-mobile'; +import MultipliersInfo from 'Modules/Trading/Components/Form/TradeParams/Multiplier/info'; +import { observer } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; +import { TTradeStore } from 'Types'; -const MultiplierAmountModal = observer(({ is_open, toggleModal }) => { +type TToggleModal = () => void; +type TMultiplierAmountModal = { + is_open: boolean; + toggleModal: TToggleModal; +}; + +const MultiplierAmountModal = ({ is_open, toggleModal }: TMultiplierAmountModal) => { // Fix to prevent iOS from zooming in erratically on quick taps usePreventIOSZoom(); - const { - ui: { enableApp, disableApp }, - } = useStore(); return ( { ); -}); +}; export default MultiplierAmountModal; -const TradeParamsMobile = observer(({ toggleModal }) => { +const TradeParamsMobile = observer(({ toggleModal }: { toggleModal: TToggleModal }) => { const trade_store = useTraderStore(); - const { amount, currency, trade_stop_out } = trade_store; + const { amount, currency } = trade_store; - const [stake_value, setStakeValue] = React.useState(amount); - const [commission, setCommission] = React.useState(null); - const [stop_out, setStopOut] = React.useState(null); - const stake_ref = React.useRef(amount); + const [stake_value, setStakeValue] = React.useState(amount); + const [commission, setCommission] = React.useState(); + const [stop_out, setStopOut] = React.useState(); + const stake_ref = React.useRef(amount); const isMounted = useIsMounted(); React.useEffect(() => { if (stake_value === amount) return undefined; - const onProposalResponse = response => { + const onProposalResponse: TTradeStore['onProposalResponse'] = response => { const { proposal, echo_req, subscription } = response; if ( isMounted() && @@ -62,7 +64,7 @@ const TradeParamsMobile = observer(({ toggleModal }) => { Number(echo_req.amount) === Number(stake_ref.current) ) { setCommission(proposal.commission); - setStopOut(proposal.limit_order?.stop_out?.order_amount); + proposal.limit_order?.stop_out && setStopOut(proposal.limit_order.stop_out?.order_amount); } else if (subscription?.id) { WS.forget(subscription.id); } @@ -76,7 +78,7 @@ const TradeParamsMobile = observer(({ toggleModal }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [stake_value]); - const setSelectedAmount = (basis, stake) => { + const setSelectedAmount = (basis: string | undefined, stake: number | string) => { setStakeValue(stake); stake_ref.current = stake; }; @@ -89,14 +91,12 @@ const TradeParamsMobile = observer(({ toggleModal }) => { classNameBubble='dc-popover__trade-params' icon='info' id='dt_multiplier-stake__tooltip' - zIndex={9999} + zIndex='9999' is_bubble_hover_enabled message={ , - ]} + components={[]} /> } /> @@ -105,7 +105,6 @@ const TradeParamsMobile = observer(({ toggleModal }) => { toggleModal={toggleModal} amount_tab_idx={0} setSelectedAmount={setSelectedAmount} - setAmountError={() => {}} stake_value={stake_value} /> { +type TMultiplierOptions = { + toggleModal: () => void; +}; + +const MultiplierOptions = observer(({ toggleModal }: TMultiplierOptions) => { const trade_store = useTraderStore(); const { amount, multiplier, multiplier_range_list, onChange } = trade_store; - const [commission, setCommission] = React.useState(null); - const [stop_out, setStopOut] = React.useState(null); + const [commission, setCommission] = React.useState(); + const [stop_out, setStopOut] = React.useState(); const isMounted = useIsMounted(); React.useEffect(() => { if (!amount) return undefined; - const onProposalResponse = ({ echo_req, proposal, subscription }) => { + const onProposalResponse: TTradeStore['onProposalResponse'] = ({ echo_req, proposal, subscription }) => { if (isMounted() && proposal && echo_req.contract_type === 'MULTUP' && Number(echo_req.amount) === amount) { setCommission(proposal.commission); - setStopOut(proposal.limit_order?.stop_out?.order_amount); + proposal.limit_order?.stop_out && setStopOut(proposal.limit_order.stop_out?.order_amount); } else if (subscription?.id) { WS.forget(subscription.id); } 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.tsx similarity index 80% rename from packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx rename to packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.tsx index fb08c577353f..8f2e607fa300 100644 --- a/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx +++ b/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.tsx @@ -7,9 +7,19 @@ 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'; +import CancelDeal from 'Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile'; -const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { +type TRiskManagementDialog = { + is_open: boolean; + onClose: () => void; + toggleDialog: () => void; +}; +type TValidation_errors = { + take_profit: string[] | []; + stop_loss: string[] | []; +}; + +const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }: TRiskManagementDialog) => { const { is_turbos, take_profit, @@ -31,11 +41,11 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { }; const [state, setState] = React.useState(applied_risk_management_state); - const [validation_errors, setValidationErrors] = React.useState({}); + const [validation_errors, setValidationErrors] = React.useState>({}); const should_show_deal_cancellation = cancellation_range_list?.length > 0; - const getStateToCompare = _state => { + const getStateToCompare = (_state: typeof applied_risk_management_state) => { const props_to_pick = [ 'has_take_profit', 'has_stop_loss', @@ -52,7 +62,7 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { return isDeepEqual(getStateToCompare(state), getStateToCompare(applied_risk_management_state)); }; - const validate = new_state => { + const validate = (new_state: typeof applied_risk_management_state) => { setValidationErrors({ take_profit: new_state.has_take_profit && !new_state.take_profit @@ -63,15 +73,15 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { }); }; - const onChange = e => { + const onChange = (e: React.ChangeEvent) => { const { name, value } = e.target; const new_state = { ...state }; - new_state[name] = value; + new_state[name as 'take_profit' | 'stop_loss' | 'cancellation_duration'] = value; setState(new_state); validate(new_state); }; - const onChangeMultipleLocal = props => { + const onChangeMultipleLocal = (props: keyof typeof applied_risk_management_state) => { const new_state = { ...state }; Object.assign(new_state, props); setState(new_state); @@ -83,9 +93,9 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { toggleDialog(); }; - const resetAndClose = (...args) => { + const resetAndClose = () => { setState(applied_risk_management_state); - onClose(...args); + onClose(); }; return ( @@ -98,6 +108,7 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { height_offset='54px' > take_profit={state.take_profit} has_take_profit={state.has_take_profit} onChange={onChange} @@ -106,6 +117,7 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { /> {!is_turbos && ( stop_loss={state.stop_loss} has_stop_loss={state.has_stop_loss} onChange={onChange} @@ -119,7 +131,11 @@ const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { has_stop_loss={state.has_stop_loss} has_cancellation={state.has_cancellation} cancellation_duration={state.cancellation_duration} - onChangeMultiple={onChangeMultipleLocal} + onChangeMultiple={ + onChangeMultipleLocal as unknown as React.ComponentProps< + typeof CancelDeal + >['onChangeMultiple'] + } /> )}
diff --git a/packages/trader/src/Modules/Trading/Containers/__tests__/purchase.spec.tsx b/packages/trader/src/Modules/Trading/Containers/__tests__/purchase.spec.tsx index 1e2a0d93dd38..a80a845810a4 100644 --- a/packages/trader/src/Modules/Trading/Containers/__tests__/purchase.spec.tsx +++ b/packages/trader/src/Modules/Trading/Containers/__tests__/purchase.spec.tsx @@ -1,8 +1,10 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; + import { mockStore } from '@deriv/stores'; -import TraderProviders from '../../../../trader-providers'; import { TCoreStores } from '@deriv/stores/types'; +import { render, screen } from '@testing-library/react'; + +import TraderProviders from '../../../../trader-providers'; import Purchase from '../purchase'; const default_mock_store = { diff --git a/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.jsx b/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.jsx deleted file mode 100644 index a1f963ea7d70..000000000000 --- a/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.jsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { render, screen } from '@testing-library/react'; -import { mockStore } from '@deriv/stores'; -import TraderProviders from '../../../../trader-providers'; -import RadioGroupOptionsModal from '../radio-group-options-modal'; - -const default_mocked_props = { - is_open: true, - modal_title: 'tests title', - toggleModal: jest.fn(), -}; -const default_mock_store = { - modules: { - trade: { - accumulator_range_list: [1, 2, 3], - growth_rate: 0.03, - onChange: jest.fn(), - tick_size_barrier: 0, - proposal_info: {}, - }, - }, -}; - -jest.mock('Modules/Trading/Containers/Multiplier/multiplier-options', () => - jest.fn(() =>
MultiplierOptions component
) -); -jest.mock('Modules/Trading/Components/Form/RadioGroupWithInfoMobile', () => - jest.fn(props =>
RadioGroupWithInfoMobile component
) -); - -describe('', () => { - const mockRadioGroupOptionsModal = (mocked_store, mocked_props) => { - return ( - - - - ); - }; - beforeAll(() => { - ReactDOM.createPortal = jest.fn(component => { - return component; - }); - }); - - afterAll(() => { - ReactDOM.createPortal.mockClear(); - }); - - it('should render component with inside if modal_title !== Multiplier ', () => { - const mock_root_store = mockStore(default_mock_store); - render(mockRadioGroupOptionsModal(mock_root_store, default_mocked_props)); - - expect(screen.queryByText(/MultiplierOptions/i)).not.toBeInTheDocument(); - expect(screen.getByText(/RadioGroupWithInfoMobile/i)).toBeInTheDocument(); - }); - it('should render component with inside if modal_title === Multiplier ', () => { - const new_mock_props = { ...default_mocked_props, modal_title: 'Multiplier' }; - const mock_root_store = mockStore(default_mock_store); - render(mockRadioGroupOptionsModal(mock_root_store, new_mock_props)); - - expect(screen.getByText(/MultiplierOptions/i)).toBeInTheDocument(); - expect(screen.queryByText(/RadioGroupWithInfoMobile/i)).not.toBeInTheDocument(); - }); - it('has_error_or_not_loaded should be falsy if proposal_info includes proper information', () => { - const new_mock_store = { ...default_mocked_props }; - new_mock_store.modules = { - trade: { - accumulator_range_list: [1, 2, 3], - growth_rate: 0.03, - onChange: jest.fn(), - tick_size_barrier: 0, - proposal_info: { ACCU: { has_error: false, id: 'testid' } }, - }, - }; - const mock_root_store = mockStore(new_mock_store); - render(mockRadioGroupOptionsModal(mock_root_store, default_mocked_props)); - - expect(screen.getByText(/RadioGroupWithInfoMobile/i)).not.toHaveAttribute('data-test'); - }); -}); diff --git a/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.tsx b/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.tsx index cc8a706eed73..498f3a2549e8 100644 --- a/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.tsx +++ b/packages/trader/src/Modules/Trading/Containers/__tests__/radio-group-options-modal.spec.tsx @@ -4,7 +4,7 @@ import RadioGroupOptionsModal from '../radio-group-options-modal'; import { mockStore } from '@deriv/stores'; import TraderProviders from '../../../../trader-providers'; -jest.mock('../Multiplier/multiplier-options.jsx', () => jest.fn(() => 'mockedMultiplierOptions')); +jest.mock('../Multiplier/multiplier-options', () => jest.fn(() => 'mockedMultiplierOptions')); jest.mock('Modules/Trading/Components/Form/RadioGroupWithInfoMobile', () => jest.fn(() => 'MockedRadioGroupWithInfoMobile') ); diff --git a/packages/trader/src/Modules/Trading/Containers/purchase.tsx b/packages/trader/src/Modules/Trading/Containers/purchase.tsx index e6ae38d7edc7..20d4af5ab044 100644 --- a/packages/trader/src/Modules/Trading/Containers/purchase.tsx +++ b/packages/trader/src/Modules/Trading/Containers/purchase.tsx @@ -12,7 +12,7 @@ import AccumulatorsSellButton from '../Components/Form/TradeParams/Accumulator/a import PurchaseFieldset from 'Modules/Trading/Components/Elements/purchase-fieldset'; import { useTraderStore } from 'Stores/useTraderStores'; import { observer, useStore } from '@deriv/stores'; -import { TProposalTypeInfo } from 'Types'; +import { TTradeStore } from 'Types'; type TGetSupportedContractsKey = keyof ReturnType; @@ -48,14 +48,14 @@ const Purchase = observer(({ is_market_closed }: { is_market_closed?: boolean }) proposal_info, purchase_info, symbol, - validation_errors, + validation_errors = {}, trade_types, is_trade_enabled, has_open_accu_contract, } = useTraderStore(); const is_high_low = /^high_low$/.test(contract_type.toLowerCase()); - const isLoading = (info: TProposalTypeInfo | Record) => { + const isLoading = (info: TTradeStore['proposal_info'][string] | Record) => { const has_validation_error = Object.values(validation_errors).some(e => e.length); return !has_validation_error && !info?.has_error && !info.id; }; diff --git a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.tsx b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.tsx index 5fc7a59d04fe..98399f1669a0 100644 --- a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.tsx +++ b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.tsx @@ -3,7 +3,7 @@ import { Div100vhContainer, Modal, usePreventIOSZoom } from '@deriv/components'; import { localize } from '@deriv/translations'; import { useTraderStore } from 'Stores/useTraderStores'; import { getGrowthRatePercentage, getTickSizeBarrierPercentage, isEmptyObject } from '@deriv/shared'; -import MultiplierOptions from 'Modules/Trading/Containers/Multiplier/multiplier-options.jsx'; +import MultiplierOptions from 'Modules/Trading/Containers/Multiplier/multiplier-options'; import RadioGroupWithInfoMobile from 'Modules/Trading/Components/Form/RadioGroupWithInfoMobile'; import { observer } from '@deriv/stores'; @@ -36,7 +36,6 @@ const RadioGroupOptionsModal = observer(({ is_open, modal_title, toggleModal }: > {modal_title === localize('Multiplier') ? ( - // @ts-expect-error should be gone after MultiplierOptions is converted to typescript ) : ( void; +}; + +type TTradeParamsMobile = { + currency: string; + toggleModal: () => void; + isVisible: (component_key: string) => boolean; + setAmountTabIdx: (amount_tab_idx?: number) => void; + amount_tab_idx?: number; + setTradeParamTabIdx: (trade_param_tab_idx: number) => void; + trade_param_tab_idx: number; + setDurationTabIdx: (duration_tab_idx?: number) => void; + duration_unit: string; + duration_units_list: TTextValueStrings[]; + duration_value: number; + duration_tab_idx?: number; + has_amount_error: boolean; + has_duration_error: boolean; + // amount + setAmountError: (has_error: boolean) => void; + setSelectedAmount: (basis: string, selected_basis_value: string | number) => void; + stake_value: number; + payout_value: number; + // duration + setDurationError: (has_error: boolean) => void; + setSelectedDuration: (selected_duration_unit: string, selected_duration: number) => void; + t_duration: number; + s_duration: number; + m_duration: number; + h_duration: number; + d_duration: number; +}; + +type TReducer = Pick< + TTradeParamsMobile, + | 'trade_param_tab_idx' + | 'duration_tab_idx' + | 'amount_tab_idx' + | 'has_amount_error' + | 'has_duration_error' + | 't_duration' + | 's_duration' + | 'm_duration' + | 'h_duration' + | 'd_duration' + | 'stake_value' + | 'payout_value' +> & { curr_duration_unit: string; curr_duration_value: number }; + const DEFAULT_DURATION = Object.freeze({ t: 5, s: 15, @@ -20,21 +71,23 @@ const DEFAULT_DURATION = Object.freeze({ d: 1, }); -const reducer = (state, payload) => { +const reducer = (state: TReducer, payload: Partial) => { return { ...state, ...payload, }; }; -const makeGetDefaultDuration = (trade_duration, trade_duration_unit) => duration_unit => - trade_duration_unit === duration_unit ? trade_duration : DEFAULT_DURATION[duration_unit]; +const makeGetDefaultDuration = (trade_duration: number, trade_duration_unit: string) => (duration_unit: string) => + trade_duration_unit === duration_unit + ? trade_duration + : DEFAULT_DURATION[duration_unit as keyof typeof DEFAULT_DURATION]; -const TradeParamsModal = observer(({ is_open, toggleModal, tab_index }) => { - const { client, ui } = useStore(); +const TradeParamsModal = observer(({ is_open, toggleModal, tab_index }: TTradeParamsModal) => { + const { client } = useStore(); const { currency } = client; - const { enableApp, disableApp } = ui; - const { amount, form_components, duration, duration_unit, duration_units_list } = useTraderStore(); + 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), []); @@ -61,19 +114,20 @@ const TradeParamsModal = observer(({ is_open, toggleModal, tab_index }) => { React.useEffect(() => { setSelectedDuration(duration_unit, duration); - setDurationTabIdx(undefined); + setDurationTabIdx(); // duration and duration_unit can be changed in trade-store when contract type is changed }, [duration, duration_unit]); - const setTradeParamTabIdx = trade_param_tab_idx => dispatch({ trade_param_tab_idx }); + const setTradeParamTabIdx = (trade_param_tab_idx: number) => dispatch({ trade_param_tab_idx }); - const setDurationTabIdx = duration_tab_idx => dispatch({ duration_tab_idx }); + const setDurationTabIdx = (duration_tab_idx?: number) => dispatch({ duration_tab_idx }); - const setAmountTabIdx = amount_tab_idx => dispatch({ amount_tab_idx }); + const setAmountTabIdx = (amount_tab_idx?: number) => dispatch({ amount_tab_idx }); - const setSelectedAmount = (basis, selected_basis_value) => dispatch({ [`${basis}_value`]: selected_basis_value }); + const setSelectedAmount = (basis: string, selected_basis_value: string | number) => + dispatch({ [`${basis}_value`]: selected_basis_value }); - const setSelectedDuration = (selected_duration_unit, selected_duration) => { + const setSelectedDuration = (selected_duration_unit: string, selected_duration: number) => { dispatch({ [`${selected_duration_unit}_duration`]: selected_duration, curr_duration_unit: selected_duration_unit, @@ -81,26 +135,23 @@ const TradeParamsModal = observer(({ is_open, toggleModal, tab_index }) => { }); }; - const setAmountError = has_error => { + const setAmountError = (has_error: boolean) => { dispatch({ has_amount_error: has_error }); }; - const setDurationError = has_error => { + const setDurationError = (has_error: boolean) => { dispatch({ has_duration_error: has_error }); }; - const isVisible = component_key => form_components.includes(component_key); - + const isVisible = (component_key: string): boolean => form_components.includes(component_key); return ( } - disableApp={disableApp} toggleModal={toggleModal} - height='auto' + height={is_vanilla ? '53.8rem' : 'auto'} width='calc(100vw - 32px)' > @@ -172,7 +223,7 @@ const TradeParamsMobile = observer( m_duration, h_duration, d_duration, - }) => { + }: TTradeParamsMobile) => { const { basis_list, basis, expiry_epoch, is_turbos, is_vanilla } = useTraderStore(); const getDurationText = () => { const duration = duration_units_list.find(d => d.value === duration_unit); @@ -188,7 +239,7 @@ const TradeParamsMobile = observer( return ; }; - const getHeaderContent = tab_key => { + const getHeaderContent = (tab_key: string) => { switch (tab_key) { case 'duration': return ( @@ -229,9 +280,10 @@ const TradeParamsMobile = observer( onTabItemClick={setTradeParamTabIdx} top > - {isVisible('duration') && ( + {isVisible('duration') ? (
is migrated to TS toggleModal={toggleModal} amount_tab_idx={amount_tab_idx} duration_tab_idx={duration_tab_idx} @@ -249,8 +301,8 @@ const TradeParamsMobile = observer( expiry_epoch={expiry_epoch} />
- )} - {isVisible('amount') && ( + ) : null} + {isVisible('amount') ? (
- )} + ) : null} ); } @@ -273,10 +325,10 @@ const TradeParamsMobile = observer( export const LastDigitMobile = observer(() => { const { form_components } = useTraderStore(); - return form_components.includes('last_digit') && ; + return form_components.includes('last_digit') ? : null; }); export const BarrierMobile = observer(() => { const { form_components } = useTraderStore(); - return form_components.includes('barrier') && ; + return form_components.includes('barrier') ? : null; }); diff --git a/packages/trader/src/Modules/Trading/Containers/trade-params.jsx b/packages/trader/src/Modules/Trading/Containers/trade-params.tsx similarity index 85% rename from packages/trader/src/Modules/Trading/Containers/trade-params.jsx rename to packages/trader/src/Modules/Trading/Containers/trade-params.tsx index 6941ca692129..812ab12ab77a 100644 --- a/packages/trader/src/Modules/Trading/Containers/trade-params.jsx +++ b/packages/trader/src/Modules/Trading/Containers/trade-params.tsx @@ -1,12 +1,11 @@ -import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; -import Amount from 'Modules/Trading/Components/Form/TradeParams/amount.jsx'; -import Barrier from 'Modules/Trading/Components/Form/TradeParams/barrier.jsx'; +import Amount from 'Modules/Trading/Components/Form/TradeParams/amount'; +import Barrier from 'Modules/Trading/Components/Form/TradeParams/barrier'; import BarrierSelector from 'Modules/Trading/Components/Form/TradeParams/Turbos/barrier-selector'; import Duration from 'Modules/Trading/Components/Form/TradeParams/Duration'; -import LastDigit from 'Modules/Trading/Components/Form/TradeParams/last-digit.jsx'; -import CancelDeal from 'Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal.jsx'; +import LastDigit from 'Modules/Trading/Components/Form/TradeParams/last-digit'; +import CancelDeal from 'Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal'; import Accumulator from 'Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator'; import StopLoss from 'Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx'; import TakeProfit from 'Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx'; @@ -18,15 +17,22 @@ import { observer } from '@deriv/stores'; import { useTraderStore } from 'Stores/useTraderStores'; import Fieldset from 'App/Components/Form/fieldset'; -const TradeParams = observer(({ is_minimized }) => { +type TTradeParams = { + is_minimized?: boolean; +}; + +const TradeParams = observer(({ is_minimized = false }: TTradeParams) => { const { form_components } = useTraderStore(); - const isVisible = component_key => { + const isVisible = (component_key: string) => { return form_components.includes(component_key); }; return ( - {isVisible('duration') && } + {isVisible('duration') && ( + // @ts-expect-error: TODO: check if TS error is gone after is migrated to TS + + )} {isVisible('barrier') && } {isVisible('last_digit') && } {isVisible('accumulator') && } @@ -46,8 +52,5 @@ const TradeParams = observer(({ is_minimized }) => { ); }); -TradeParams.propTypes = { - is_minimized: PropTypes.bool, -}; export default TradeParams; diff --git a/packages/trader/src/Modules/Trading/Containers/trade.jsx b/packages/trader/src/Modules/Trading/Containers/trade.jsx index c01c0eed96ed..9b57197c5570 100644 --- a/packages/trader/src/Modules/Trading/Containers/trade.jsx +++ b/packages/trader/src/Modules/Trading/Containers/trade.jsx @@ -4,7 +4,7 @@ import { DesktopWrapper, Div100vhContainer, MobileWrapper, SwipeableWrapper } fr import { getDecimalPlaces, isDesktop, isMobile } from '@deriv/shared'; import ChartLoader from 'App/Components/Elements/chart-loader'; import PositionsDrawer from 'App/Components/Elements/PositionsDrawer'; -import MarketIsClosedOverlay from 'App/Components/Elements/market-is-closed-overlay.jsx'; +import MarketIsClosedOverlay from 'App/Components/Elements/market-is-closed-overlay'; import Test from './test.jsx'; import { ChartBottomWidgets, ChartTopWidgets, DigitsWidget } from './chart-widgets.jsx'; import FormLayout from '../Components/Form/form-layout'; @@ -300,7 +300,6 @@ const ChartTrade = observer(props => { wsSubscribe, active_symbols, has_alternative_source, - refToAddTick, } = useTraderStore(); const settings = { @@ -391,7 +390,6 @@ const ChartTrade = observer(props => { onExportLayout={exportLayout} shouldFetchTradingTimes={!end_epoch} hasAlternativeSource={has_alternative_source} - refToAddTick={refToAddTick} getMarketsOrder={getMarketsOrder} should_zoom_out_on_yaxis={is_accumulator} yAxisMargin={{ diff --git a/packages/trader/src/Modules/Trading/Helpers/contract-type.tsx b/packages/trader/src/Modules/Trading/Helpers/contract-type.tsx index aba9e38fee31..36dd8cf923f8 100644 --- a/packages/trader/src/Modules/Trading/Helpers/contract-type.tsx +++ b/packages/trader/src/Modules/Trading/Helpers/contract-type.tsx @@ -5,7 +5,7 @@ import { TContractType, TContractCategory, TList } from '../Components/Form/Cont type TContractTypesList = { [key: string]: { name: string; - categories: TContractType[]; + categories: DeepRequired; }; }; diff --git a/packages/trader/src/Stores/Modules/SmartChart/chart-barrier-store.ts b/packages/trader/src/Stores/Modules/SmartChart/chart-barrier-store.ts index 493dfe14a2b4..7f3e2adb9f0f 100644 --- a/packages/trader/src/Stores/Modules/SmartChart/chart-barrier-store.ts +++ b/packages/trader/src/Stores/Modules/SmartChart/chart-barrier-store.ts @@ -29,7 +29,7 @@ export class ChartBarrierStore { onChartBarrierChange: TOnChartBarrierChange | null; constructor( - high_barrier: string | number, + high_barrier?: string | number, low_barrier?: string | number, onChartBarrierChange: TOnChartBarrierChange = null, { color, line_style, not_draggable }: TChartBarrierStoreOptions = {} diff --git a/packages/trader/src/Stores/Modules/Trading/Actions/purchase.ts b/packages/trader/src/Stores/Modules/Trading/Actions/purchase.ts index f2a8062a8ebc..cc2b463fede0 100644 --- a/packages/trader/src/Stores/Modules/Trading/Actions/purchase.ts +++ b/packages/trader/src/Stores/Modules/Trading/Actions/purchase.ts @@ -1,11 +1,20 @@ -import { Buy, BuyContractRequest } from '@deriv/api-types'; +import { Buy, BuyContractResponse, BuyContractRequest } from '@deriv/api-types'; import { WS } from '@deriv/shared'; +type TResponse = BuyContractResponse & { + echo_req: Buy; + error?: { + code: string; + message: string; + details?: BuyContractResponse['buy'] & { field: string }; + }; +}; + export const processPurchase = async ( proposal_id: string, - price: BuyContractRequest['price'], - passthrough: BuyContractRequest['passthrough'] -): Promise => + price: string | number, + passthrough?: BuyContractRequest['passthrough'] +): Promise => WS.buy({ proposal_id, price, diff --git a/packages/trader/src/Stores/Modules/Trading/Actions/start-date.ts b/packages/trader/src/Stores/Modules/Trading/Actions/start-date.ts index 9be02fc3e422..62d9950f5e04 100644 --- a/packages/trader/src/Stores/Modules/Trading/Actions/start-date.ts +++ b/packages/trader/src/Stores/Modules/Trading/Actions/start-date.ts @@ -38,7 +38,6 @@ export const onChangeStartDate = async (store: TTradeStore) => { export const onChangeExpiry = async (store: TTradeStore) => { const { start_time, expiry_date, expiry_type, expiry_time, start_date, symbol, sessions } = store; - const trading_times = await ContractType.getTradingTimes(expiry_date, symbol); const obj_market_open_times = { market_open_times: trading_times.open }; const obj_market_close_times = { market_close_times: trading_times.close }; diff --git a/packages/trader/src/Stores/Modules/Trading/Constants/validation-rules.ts b/packages/trader/src/Stores/Modules/Trading/Constants/validation-rules.ts index 6911efae718e..cbd1835ba444 100644 --- a/packages/trader/src/Stores/Modules/Trading/Constants/validation-rules.ts +++ b/packages/trader/src/Stores/Modules/Trading/Constants/validation-rules.ts @@ -4,231 +4,208 @@ import { isSessionAvailable } from '../Helpers/start-date'; import { TTradeStore } from 'Types'; import type { TRuleOptions } from 'Utils/Validator/validator'; +type TValidationRules = { + [key: string]: { + rules?: Array[]; + trigger?: string; + }; +}; + const tradeSpecificBarrierCheck = (is_vanilla: boolean, input: number) => is_vanilla || input !== 0; -export const getValidationRules = () => - ({ - amount: { - rules: [ - ['req', { message: localize('Amount is a required field.') }], - ['number', { min: 0, type: 'float' }], - ], - }, - barrier_1: { - rules: [ - [ - 'req', - { - condition: (store: TTradeStore) => - store.barrier_count && store.form_components.indexOf('barrier') > -1, - message: localize('Barrier is a required field.'), - }, - ], - ['barrier', { condition: (store: TTradeStore) => store.barrier_count }], - [ - 'custom', - { - func: ( - value: TTradeStore['barrier_1'], - options: Partial, - store: TTradeStore, - inputs: Pick - ) => (store.barrier_count > 1 ? +value > +inputs.barrier_2 : true), - message: localize('Higher barrier must be higher than lower barrier.'), - }, - ], - [ - 'custom', - { - func: ( - value: TTradeStore['barrier_1'], - options: Partial, - store: TTradeStore, - inputs: Pick - ) => - /^[+-]/.test(inputs.barrier_1) - ? tradeSpecificBarrierCheck(store.is_vanilla, +inputs.barrier_1) - : true, - message: localize('Barrier cannot be zero.'), - }, - ], - ], - trigger: 'barrier_2', - }, - barrier_2: { - rules: [ - [ - 'req', - { - condition: (store: TTradeStore) => - store.barrier_count > 1 && store.form_components.indexOf('barrier') > -1, - message: localize('Barrier is a required field.'), - }, - ], - ['barrier', { condition: (store: TTradeStore) => store.barrier_count }], - [ - 'custom', - { - func: ( - value: TTradeStore['barrier_2'], - options: Partial, - store: TTradeStore, - inputs: Pick - ) => - (/^[+-]/g.test(inputs.barrier_1) && /^[+-]/g.test(value)) || - (/^(?![+-])/g.test(inputs.barrier_1) && /^(?![+-])/g.test(value)), - message: localize('Both barriers should be relative or absolute'), - }, - ], - [ - 'custom', - { - func: ( - value: TTradeStore['barrier_2'], - options: Partial, - store: TTradeStore, - inputs: Pick - ) => +inputs.barrier_1 > +value, - message: localize('Lower barrier must be lower than higher barrier.'), - }, - ], - ], - trigger: 'barrier_1', - }, - duration: { - rules: [['req', { message: localize('Duration is a required field.') }]], - }, - start_date: { - trigger: 'start_time', - }, - expiry_date: { - trigger: 'expiry_time', - }, - start_time: { - rules: [ - [ - 'custom', - { - func: (value: TTradeStore['start_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isTimeValid(value ?? ''), - message: localize('Please enter the start time in the format "HH:MM".'), - }, - ], - [ - 'custom', - { - func: (value: TTradeStore['start_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isHourValid(value ?? ''), - message: localize('Hour must be between 0 and 23.'), - }, - ], - [ - 'custom', - { - func: (value: TTradeStore['start_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isMinuteValid(value ?? ''), - message: localize('Minute must be between 0 and 59.'), - }, - ], - [ - 'custom', - { - func: ( - value: TTradeStore['start_time'], - options: Partial, - store: TTradeStore - ) => { - if (store.contract_start_type === 'spot') return true; - if (!isTimeValid(value ?? '')) return false; - const start_moment = toMoment(store.start_date); - const start_moment_clone = start_moment.clone(); - const [h, m] = value?.split(':') ?? []; - return isSessionAvailable( - store.sessions, - start_moment_clone.hour(+h).minute(+m), - start_moment - ); - }, - message: localize('Start time cannot be in the past.'), - }, - ], - ], - }, - expiry_time: { - rules: [ - [ - 'custom', - { - func: (value: TTradeStore['expiry_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isTimeValid(value ?? ''), - message: localize('Please enter the start time in the format "HH:MM".'), - }, - ], - [ - 'custom', - { - func: (value: TTradeStore['expiry_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isHourValid(value ?? ''), - message: localize('Hour must be between 0 and 23.'), - }, - ], - [ - 'custom', - { - func: (value: TTradeStore['expiry_time'], options: Partial, store: TTradeStore) => - store.contract_start_type === 'spot' || isMinuteValid(value ?? ''), - message: localize('Minute must be between 0 and 59.'), - }, - ], - [ - 'custom', - { - func: ( - value: TTradeStore['expiry_time'], - options: Partial, - store: TTradeStore - ) => { - if (store.contract_start_type === 'spot') return true; - if (!isTimeValid(value ?? '')) return false; - const start_moment = toMoment(store.start_date); - const start_moment_clone = start_moment.clone(); - const [h, m] = value?.split(':') ?? []; - return isSessionAvailable( - store.sessions, - start_moment_clone.hour(+h).minute(+m), - start_moment - ); - }, - message: localize('Expiry time cannot be in the past.'), - }, - ], +export const getValidationRules = (): TValidationRules => ({ + amount: { + rules: [ + ['req', { message: localize('Amount is a required field.') }], + ['number', { min: 0, type: 'float' }], + ], + }, + barrier_1: { + rules: [ + [ + 'req', + { + condition: store => !!store.barrier_count && store.form_components.indexOf('barrier') > -1, + message: localize('Barrier is a required field.'), + }, + ], + ['barrier', { condition: (store: TTradeStore) => !!store.barrier_count }], + [ + 'custom', + { + func: (value: TTradeStore['barrier_1'], options, store, inputs) => + Number(store?.barrier_count) > 1 ? +value > Number(inputs?.barrier_2) : true, + message: localize('Higher barrier must be higher than lower barrier.'), + }, ], - }, - ...getMultiplierValidationRules(), - } as const); + [ + 'custom', + { + func: (value: TTradeStore['barrier_1'], options, store, inputs) => + /^[+-]/.test(inputs?.barrier_1 ?? '') + ? tradeSpecificBarrierCheck(!!store?.is_vanilla, Number(inputs?.barrier_1)) + : true, + message: localize('Barrier cannot be zero.'), + }, + ], + ], + trigger: 'barrier_2', + }, + barrier_2: { + rules: [ + [ + 'req', + { + condition: store => store.barrier_count > 1 && store.form_components.indexOf('barrier') > -1, + message: localize('Barrier is a required field.'), + }, + ], + ['barrier', { condition: (store: TTradeStore) => !!store.barrier_count }], + [ + 'custom', + { + func: (value: TTradeStore['barrier_2'], options, store, inputs) => + (/^[+-]/g.test(inputs?.barrier_1 ?? '') && /^[+-]/g.test(value)) || + (/^(?![+-])/g.test(inputs?.barrier_1 ?? '') && /^(?![+-])/g.test(value)), + message: localize('Both barriers should be relative or absolute'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['barrier_2'], options, store, inputs) => + Number(inputs?.barrier_1) > +value, + message: localize('Lower barrier must be lower than higher barrier.'), + }, + ], + ], + trigger: 'barrier_1', + }, + duration: { + rules: [['req', { message: localize('Duration is a required field.') }]], + }, + start_date: { + trigger: 'start_time', + }, + expiry_date: { + trigger: 'expiry_time', + }, + start_time: { + rules: [ + [ + 'custom', + { + func: (value: TTradeStore['start_time'], options, store) => + store?.contract_start_type === 'spot' || isTimeValid(value ?? ''), + message: localize('Please enter the start time in the format "HH:MM".'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['start_time'], options, store) => + store?.contract_start_type === 'spot' || isHourValid(value ?? ''), + message: localize('Hour must be between 0 and 23.'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['start_time'], options, store) => + store?.contract_start_type === 'spot' || isMinuteValid(value ?? ''), + message: localize('Minute must be between 0 and 59.'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['start_time'], options, store) => { + if (store?.contract_start_type === 'spot') return true; + if (!isTimeValid(value ?? '')) return false; + const start_moment = toMoment(store?.start_date); + const start_moment_clone = start_moment.clone(); + const [h, m] = value?.split(':') ?? []; + return isSessionAvailable( + store?.sessions, + start_moment_clone.hour(+h).minute(+m), + start_moment + ); + }, + message: localize('Start time cannot be in the past.'), + }, + ], + ], + }, + expiry_time: { + rules: [ + [ + 'custom', + { + func: (value: TTradeStore['expiry_time'], options, store) => + store?.contract_start_type === 'spot' || isTimeValid(value ?? ''), + message: localize('Please enter the start time in the format "HH:MM".'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['expiry_time'], options, store) => + store?.contract_start_type === 'spot' || isHourValid(value ?? ''), + message: localize('Hour must be between 0 and 23.'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['expiry_time'], options, store) => + store?.contract_start_type === 'spot' || isMinuteValid(value ?? ''), + message: localize('Minute must be between 0 and 59.'), + }, + ], + [ + 'custom', + { + func: (value: TTradeStore['expiry_time'], options, store) => { + if (store?.contract_start_type === 'spot') return true; + if (!isTimeValid(value ?? '')) return false; + const start_moment = toMoment(store?.start_date); + const start_moment_clone = start_moment.clone(); + const [h, m] = value?.split(':') ?? []; + return isSessionAvailable( + store?.sessions, + start_moment_clone.hour(+h).minute(+m), + start_moment + ); + }, + message: localize('Expiry time cannot be in the past.'), + }, + ], + ], + }, + ...getMultiplierValidationRules(), +}); -export const getMultiplierValidationRules = () => - ({ - stop_loss: { - rules: [ - [ - 'req', - { - condition: (store: TTradeStore) => store.has_stop_loss && !store.stop_loss, - message: localize('Please enter a stop loss amount.'), - }, - ], - ], - }, - take_profit: { - rules: [ - [ - 'req', - { - condition: (store: TTradeStore) => store.has_take_profit && !store.take_profit, - message: localize('Please enter a take profit amount.'), - }, - ], +export const getMultiplierValidationRules = () => ({ + stop_loss: { + rules: [ + [ + 'req', + { + condition: (store: TTradeStore) => store.has_stop_loss && !store.stop_loss, + message: localize('Please enter a stop loss amount.'), + }, + ], + ], + }, + take_profit: { + rules: [ + [ + 'req', + { + condition: (store: TTradeStore) => store.has_take_profit && !store.take_profit, + message: localize('Please enter a take profit amount.'), + }, ], - }, - } as const); + ], + }, +}); diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/allow-equals.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/allow-equals.ts index 189936dfe2c9..8d2eb0bdbdbf 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/allow-equals.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/allow-equals.ts @@ -1,11 +1,10 @@ import { isEmptyObject, getPropertyValue } from '@deriv/shared'; import { ContractType } from 'Stores/Modules/Trading/Helpers/contract-type'; -import { PriceProposalRequest } from '@deriv/api-types'; import { TTradeStore } from 'Types'; type THasDurationForCallPutEqual = { contract_type_list: TTradeStore['contract_types_list']; - duration_unit: string; + duration_unit: TTradeStore['duration_unit']; contract_start_type: string; }; @@ -26,7 +25,6 @@ export const hasDurationForCallPutEqual = ( if (!contract_type_list || !duration_unit || !contract_start_type) return false; const contract_list = Object.keys(contract_type_list || {}).reduce((key, list) => { - // @ts-expect-error the key always exists in the object, hence can ignore the TS error. const item: THasDurationForCallPutEqual['contract_type_list']['Ups & Downs'] = contract_type_list[list]; return [...key, ...item.categories.map(contract => contract.value)]; }, []); diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/chart.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/chart.ts index c06061a0ab86..9f9d97eec88b 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/chart.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/chart.ts @@ -1,16 +1,11 @@ -type TPayload = { - data?: { - action: string; - chart_type_name?: string; - indicator_type_name?: string; - indicators_category_name?: string; - market_type_name?: string; - search_string?: string; - subform_name?: string; - tab_market_name?: string; - time_interval_name?: string; - }; - event_type: string; +import type { TEvents } from '@deriv/analytics'; + +export type TPayload = { + data: Omit< + Partial, + 'action' + > & { action: string }; + event_type: 'ce_chart_types_form' | 'ce_market_types_form' | 'ce_indicators_types_form'; }; type TStateChangeOption = { @@ -75,7 +70,7 @@ export const SUBFORM_NAME = { const getChartTypeFormAnalyticsData = (state: keyof typeof STATE_TYPES, option: TStateChangeOption = {}) => { const { chart_type_name = '', is_open, time_interval_name } = option; const chart_event_type = 'ce_chart_types_form'; - const payload = { + const payload: TPayload = { data: { action: '', chart_type_name, @@ -107,9 +102,9 @@ const getIndicatorTypeFormAnalyticsData = (state: keyof typeof STATE_TYPES, opti const indicators_subform = is_info_open ? SUBFORM_NAME.INDICATORS_INFO : SUBFORM_NAME.INDICATORS_TYPE; const info_open_close_action = is_info_open ? ACTION.INFO_OPEN : ACTION.INFO_CLOSE; const open_close_action = is_open ? ACTION.OPEN : ACTION.CLOSE; - const payload: TPayload = { + const payload = { event_type: indicators_event_type, - }; + } as TPayload; if ( (state === STATE_TYPES.INDICATOR_SEARCH && !option.search_string) || ((state === STATE_TYPES.INDICATOR_ADDED || @@ -183,9 +178,9 @@ const getMarketTypeFormAnalyticsData = (state: keyof typeof STATE_TYPES, option: const market_event_type = 'ce_market_types_form'; const favorites_action = is_favorite ? ACTION.ADD_TO_FAVORITES : ACTION.DELETE_FROM_FAVORITES; const open_close_action = is_open ? ACTION.OPEN : ACTION.CLOSE; - const payload: TPayload = { + const payload = { event_type: market_event_type, - }; + } as TPayload; if ( (state === STATE_TYPES.MARKET_SEARCH && !option.search_string) || (state === STATE_TYPES.FAVORITE_MARKETS_TOGGLE && !market_type_name) diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts index 35f9b6c9210f..1abb6f797d87 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts @@ -5,7 +5,6 @@ import { isTimeValid, minDate, toMoment, - shouldShowCancellation, getUnitMap, buildBarriersConfig, buildDurationConfig, @@ -159,7 +158,7 @@ export const ContractType = (() => { return trade_types; }; - const getArrayDefaultValue = (arr_new_values: Array, value: string | number) => + const getArrayDefaultValue = (arr_new_values: Array, value: T): T => arr_new_values.indexOf(value) !== -1 ? value : arr_new_values[0]; const getContractValues = (store: TTradeStore): TContractValues | Record => { @@ -172,7 +171,6 @@ export const ContractType = (() => { multiplier, start_date, cancellation_duration, - symbol, short_barriers, long_barriers, strike_price_choices, @@ -209,7 +207,7 @@ export const ContractType = (() => { const obj_accumulator_range_list = getAccumulatorRange(contract_type); const obj_barrier_choices = getBarrierChoices(contract_type, stored_barriers_data?.barrier_choices); const obj_multiplier_range_list = getMultiplierRange(contract_type, multiplier); - const obj_cancellation = getCancellation(contract_type, cancellation_duration, symbol); + const obj_cancellation = getCancellation(contract_type, cancellation_duration); const obj_expiry_type = getExpiryType(obj_duration_units_list.duration_units_list, expiry_type); const obj_equal = getEqualProps(contract_type); @@ -292,7 +290,7 @@ export const ContractType = (() => { }; const getDurationMinMax = (contract_type: string, contract_start_type: string, contract_expiry_type?: string) => { - let duration_min_max: TTradeStore['duration_min_max'] | TTradeStore['duration_min_max'][string] = + let duration_min_max: TTradeStore['duration_min_max'] = getPropertyValue(available_contract_types, [ contract_type, 'config', @@ -302,7 +300,12 @@ export const ContractType = (() => { ]) || {}; if (contract_expiry_type) { - duration_min_max = 'contract_expiry_type' in duration_min_max ? duration_min_max[contract_expiry_type] : {}; + duration_min_max = + 'contract_expiry_type' in duration_min_max + ? (duration_min_max as unknown as { [key: string]: TTradeStore['duration_min_max'] })[ + contract_expiry_type + ] + : {}; } return { duration_min_max }; @@ -579,7 +582,7 @@ export const ContractType = (() => { moment_obj.minute(Math.ceil(moment_obj.minute() / 5) * 5); const getTradeTypes = (contract_type: string) => ({ - trade_types: getPropertyValue(available_contract_types, [contract_type, 'config', 'trade_types']) as string[], + trade_types: getPropertyValue(available_contract_types, [contract_type, 'config', 'trade_types']), }); const getBarriers = (contract_type: string, expiry_type: string, stored_barrier_value?: string) => { @@ -631,7 +634,7 @@ export const ContractType = (() => { }; }; - const getCancellation = (contract_type: string, cancellation_duration: string, symbol: string) => { + const getCancellation = (contract_type: string, cancellation_duration: string) => { const arr_cancellation_range: string[] = getPropertyValue(available_contract_types, [contract_type, 'config', 'cancellation_range']) || []; @@ -644,7 +647,7 @@ export const ContractType = (() => { return `${duration} ${name}`; }; - const should_show_cancellation = shouldShowCancellation(symbol); + const should_show_cancellation = !!arr_cancellation_range.length; return { cancellation_duration: getArrayDefaultValue(arr_cancellation_range, cancellation_duration), diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/end-time.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/end-time.ts index c51b6b94325b..b25c05ed1c83 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/end-time.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/end-time.ts @@ -17,8 +17,8 @@ const getClosestTime = (time: moment.Moment | string, interval: number): moment. export const getSelectedTime = ( server_time: TTime['server_time'], selected_time: TTime['selected_time'], - market_open_times: TTime['market_open_times'], - market_close_times: TTime['market_close_times'] + market_open_times: moment.Moment[], + market_close_times: moment.Moment[] ) => { for (let i = 0; i < market_open_times.length; i++) { if (selected_time.isAfter(market_open_times[i]) && selected_time.isBefore(market_close_times[i])) { @@ -38,8 +38,8 @@ export const getSelectedTime = ( export const getBoundaries = ( server_time: TTime['server_time'], - market_open_times: TTime['market_open_times'], - market_close_times: TTime['market_close_times'] + market_open_times: moment.Moment[], + market_close_times: moment.Moment[] ) => { const boundaries = { start: market_open_times.map(open_time => diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/limit-orders.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/limit-orders.ts index 2020d20c37bb..a7a0183a7638 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/limit-orders.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/limit-orders.ts @@ -2,11 +2,10 @@ import { isMultiplierContract, BARRIER_COLORS, BARRIER_LINE_STYLES } from '@deri import { ChartBarrierStore } from '../../SmartChart/chart-barrier-store'; import { removeBarrier } from '../../SmartChart/Helpers/barriers'; import { useStore } from '@deriv/stores'; +import { getProposalInfo } from './proposal'; -const isLimitOrderBarrierSupported = ( - contract_type: string, - contract_info: ReturnType['portfolio']['all_positions'][0]['contract_info'] -) => isMultiplierContract(contract_type) && contract_info.limit_order; +const isLimitOrderBarrierSupported = (contract_type: string, contract_info: ReturnType) => + isMultiplierContract(contract_type) && contract_info.limit_order; export const LIMIT_ORDER_TYPES = { STOP_OUT: 'stop_out', @@ -18,14 +17,14 @@ type TBarrier = ChartBarrierStore & { key?: string }; type TSetLimitOrderBarriers = { barriers: TBarrier[]; - contract_type: string; - contract_info: Parameters[1]; + contract_type?: string; + contract_info?: ReturnType; is_over: boolean; }; export const setLimitOrderBarriers = ({ barriers, - contract_type, - contract_info = {}, + contract_type = '', + contract_info = {} as ReturnType, is_over, }: TSetLimitOrderBarriers) => { if (is_over && isLimitOrderBarrierSupported(contract_type, contract_info)) { @@ -53,7 +52,6 @@ export const setLimitOrderBarriers = ({ barrier.onChange({ high: obj_limit_order.value, - low: undefined, //TODO: wait until ChartBarrierStore is ts migrated and 'low' can be an optional parameter }); } else { const obj_barrier = { @@ -87,7 +85,7 @@ export const setLimitOrderBarriers = ({ */ export const getLimitOrder = ( contract_update: Pick< - ReturnType['contract_trade'], + ReturnType['contract_trade']['contracts'][number], | 'has_contract_update_stop_loss' | 'has_contract_update_take_profit' | 'contract_update_stop_loss' diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/logic.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/logic.ts index b586a0425592..e1cd547ee251 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/logic.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/logic.ts @@ -1,5 +1,5 @@ -import { TTradeStore } from 'Types'; +import { TContractInfo } from '@deriv/shared'; import ServerTime from '_common/base/server_time'; -export const isCancellationExpired = (contract_info: TTradeStore['proposal_info'][string]) => +export const isCancellationExpired = (contract_info: TContractInfo) => !!contract_info.cancellation?.date_expiry && contract_info.cancellation.date_expiry < ServerTime.get().unix(); diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.ts index 1e7fb6ad79d6..fdaa03c6c75b 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.ts @@ -3,7 +3,7 @@ import { TTradeStore } from 'Types'; type TData = Partial< Pick< TTradeStore, - 'cancellation_duration' | 'cancellation_price' | 'has_cancellation' | 'has_stop_loss' | 'has_take_profit' + 'cancellation_duration' | 'has_cancellation' | 'has_stop_loss' | 'has_take_profit' | 'stop_loss' | 'take_profit' > >; diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/preview-proposal.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/preview-proposal.ts index 38618549d597..526bb8ae11d5 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/preview-proposal.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/preview-proposal.ts @@ -1,16 +1,24 @@ import debounce from 'lodash.debounce'; import { isEmptyObject, WS } from '@deriv/shared'; import { createProposalRequests } from './proposal'; -import { PriceProposalResponse } from '@deriv/api-types'; +import { PriceProposalRequest, PriceProposalResponse } from '@deriv/api-types'; import { TTradeStore } from 'Types'; +type TResponse = Res & { + echo_req: Req; + error?: { + code: string; + message: string; + details?: Res[K] & { field: string }; + }; +}; export const requestPreviewProposal = debounce( - (store: TTradeStore, override = {}, onProposalResponse: (response: PriceProposalResponse) => void) => { + (store: TTradeStore, override = {}, onProposalResponse: TTradeStore['onProposalResponse']) => { const new_store = { ...store, ...override }; const requests = createProposalRequests(new_store); const subscription_map: { [key: string]: boolean } = {}; - const onResponse = (response: PriceProposalResponse) => { + const onResponse = (response: TResponse) => { if (response.error || !response.subscription) return; subscription_map[response.subscription.id] = true; diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/process.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/process.ts index 9c4afbcc970d..bab8b78af2da 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/process.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/process.ts @@ -23,7 +23,7 @@ const processInSequence = async ( }); }; -export const processTradeParams = async (store: TTradeStore, new_state: DeepPartial) => { +export const processTradeParams = async (store: TTradeStore, new_state: Partial) => { const functions = getMethodsList(store, new_state); await processInSequence(store, functions); diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/proposal.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/proposal.ts index 0ae9ff9fde8c..7231a2f97d9f 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/proposal.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/proposal.ts @@ -71,7 +71,7 @@ export const getProposalInfo = ( const is_stake = contract_basis?.value === 'stake'; - const price = is_stake ? stake : proposal[contract_basis?.value as keyof Proposal]; + const price = is_stake ? stake : (proposal[contract_basis?.value as keyof Proposal] as string | number); let has_increased = false; if (price !== undefined && price !== null) { diff --git a/packages/trader/src/Stores/Modules/Trading/trade-store.js b/packages/trader/src/Stores/Modules/Trading/trade-store.ts similarity index 82% rename from packages/trader/src/Stores/Modules/Trading/trade-store.js rename to packages/trader/src/Stores/Modules/Trading/trade-store.ts index d20856b83796..354405889ddf 100644 --- a/packages/trader/src/Stores/Modules/Trading/trade-store.js +++ b/packages/trader/src/Stores/Modules/Trading/trade-store.ts @@ -1,5 +1,4 @@ import * as Symbol from './Actions/symbol'; - import { WS, cloneObject, @@ -21,7 +20,6 @@ import { isTurbosContract, isVanillaContract, pickDefaultSymbol, - removeBarrier, resetEndTimeOnVolatilityIndices, showDigitalOptionsUnavailableError, showUnavailableLocationError, @@ -32,6 +30,7 @@ import { BARRIER_LINE_STYLES, } from '@deriv/shared'; import { RudderStack } from '@deriv/analytics'; +import type { TEvents } from '@deriv/analytics'; import { localize } from '@deriv/translations'; import { getValidationRules, getMultiplierValidationRules } from 'Stores/Modules/Trading/Constants/validation-rules'; import { ContractType } from 'Stores/Modules/Trading/Helpers/contract-type'; @@ -45,13 +44,136 @@ import { action, computed, makeObservable, observable, override, reaction, runIn import { createProposalRequests, getProposalErrorField, getProposalInfo } from './Helpers/proposal'; import { getHoveredColor } from './Helpers/barrier-utils'; import BaseStore from '../../base-store'; +import { TTextValueNumber, TTextValueStrings } from 'Types'; import { ChartBarrierStore } from '../SmartChart/chart-barrier-store'; import debounce from 'lodash.debounce'; import { setLimitOrderBarriers } from './Helpers/limit-orders'; -import { STATE_TYPES, getChartAnalyticsData } from './Helpers/chart'; +import type { TCoreStores } from '@deriv/stores/types'; +import { + ActiveSymbols, + ActiveSymbolsRequest, + Buy, + BuyContractResponse, + History, + PriceProposalRequest, + PriceProposalResponse, + ServerTimeRequest, + TickSpotData, + TicksHistoryRequest, + TicksHistoryResponse, + TicksStreamResponse, + TradingTimesRequest, +} from '@deriv/api-types'; +import { STATE_TYPES, TPayload, getChartAnalyticsData } from './Helpers/chart'; + +type TBarriers = Array< + ChartBarrierStore & { + hideOffscreenBarrier?: boolean; + isSingleBarrier?: boolean; + } +>; +type TChartLayout = { + adj: boolean; + aggregationType: string; + animation?: boolean; + candleWidth: number; + chartScale: string; + chartType: string; + crosshair: number; + extended: boolean; + flipped: boolean; + interval: number; + marketSessions: Partial>; + outliers: boolean; + panels: { + chart: { + chartName: string; + display: string; + index: number; + percent: number; + yAxis: { + name: string; + position: null; + }; + yaxisLHS: string[]; + yaxisRHS: string[]; + }; + }; + periodicity: number; + previousMaxTicks?: number; + range: Partial>; + setSpan: Partial>; + studies?: Partial>; + symbols: [ + { + interval: number; + periodicity: number; + setSpan: Partial>; + symbol: string; + symbolObject: ActiveSymbols[number]; + timeUnit: string; + } + ]; + timeUnit: string; + volumeUnderlay: boolean; +}; +type TChartStateChangeOption = { symbol: string | undefined; isClosed: boolean }; +type TContractDataForGTM = Omit, 'cancellation' | 'limit_order'> & + ReturnType & { + buy_price: number; + }; +type TPrevChartLayout = + | (TChartLayout & { + isDone?: VoidFunction; + is_used?: boolean; + }) + | null; +type TContractTypesList = { + [key: string]: { + name: string; + categories: TTextValueStrings[]; + }; +}; +type TDurationMinMax = { + [key: string]: { min: number; max: number }; +}; +type TResponse = Res & { + echo_req: Req; + error?: { + code: string; + message: string; + details?: Res[K] & { field: string }; + }; +}; +type TProposalInfo = { + [key: string]: ReturnType; +}; +type TStakeBoundary = Record< + string, + { + min_stake?: number; + max_stake?: number; + } +>; +type TTicksHistoryResponse = TicksHistoryResponse | TicksStreamResponse; +type TToastBoxListItem = { + component: JSX.Element | null; + contract_types: TTextValueStrings[]; + icon: string; + key: string; + label: string; +}; +type TToastBoxObject = { + key?: boolean; + buy_price?: string; + currency?: string; + contract_type?: string; + list?: Array; +}; +type TBarriersData = Record | { barrier: string; barrier_choices: string[] }; const store_name = 'trade_store'; -const g_subscribers_map = {}; // blame amin.m +const g_subscribers_map: Partial>> = {}; // blame amin.m export default class TradeStore extends BaseStore { // Control values @@ -62,53 +184,53 @@ export default class TradeStore extends BaseStore { has_equals_only = false; // Underlying - symbol; + symbol = ''; is_market_closed = false; previous_symbol = ''; - active_symbols = []; + active_symbols: ActiveSymbols = []; - form_components = []; + form_components: string[] = []; // Contract Type contract_expiry_type = ''; contract_start_type = ''; contract_type = ''; - contract_types_list = {}; - trade_types = {}; + contract_types_list: TContractTypesList = {}; + trade_types: { [key: string]: string } = {}; // Amount amount = 10; basis = ''; - basis_list = []; + basis_list: Array = []; currency = ''; - stake_boundary = {}; + stake_boundary: Partial = {}; // Duration duration = 5; - duration_min_max = {}; + duration_min_max: TDurationMinMax = {}; duration_unit = ''; - duration_units_list = []; - expiry_date = ''; - expiry_epoch = ''; - expiry_time = ''; - expiry_type = 'duration'; + duration_units_list: Array = []; + expiry_date: string | null = ''; + expiry_epoch: number | string = ''; + expiry_time: string | null = ''; + expiry_type: string | null = 'duration'; // Barrier barrier_1 = ''; barrier_2 = ''; barrier_count = 0; - barriers = []; + main_barrier: ChartBarrierStore | null = null; + barriers: TBarriers = []; hovered_barrier = ''; - main_barrier = null; - barrier_choices = []; + barrier_choices: string[] = []; // Start Time - start_date = Number(0); // Number(0) refers to 'now' - start_dates_list = []; - start_time = null; - sessions = []; + start_date = 0; // 0 refers to 'now' + start_dates_list: Array<{ text: string; value: number }> = []; + start_time: string | null = null; + sessions: Array<{ open: moment.Moment; close: moment.Moment }> = []; - market_open_times = []; + market_open_times: string[] = []; // End Date Time /** * An array that contains market closing time. @@ -116,68 +238,70 @@ export default class TradeStore extends BaseStore { * e.g. ["04:00:00", "08:00:00"] * */ - market_close_times = []; + market_close_times: string[] = []; // Last Digit last_digit = 5; is_mobile_digit_view_selected = false; // Purchase - proposal_info = {}; - purchase_info = {}; + proposal_info: TProposalInfo = {}; + purchase_info: Partial = {}; // Chart loader observables - is_chart_loading; + is_chart_loading?: boolean; should_show_active_symbols_loading = false; // Accumulator trade params - accumulator_range_list = []; + accumulator_range_list: number[] = []; growth_rate = 0.03; maximum_payout = 0; maximum_ticks = 0; - ticks_history_stats = {}; + ticks_history_stats: { + ticks_stayed_in?: number[]; + last_tick_epoch?: number; + } = {}; tick_size_barrier = 0; // Multiplier trade params - multiplier; - multiplier_range_list = []; - stop_loss; - take_profit; + multiplier = 0; + multiplier_range_list: TTextValueNumber[] = []; + stop_loss?: string; + take_profit?: string; has_stop_loss = false; has_take_profit = false; has_cancellation = false; - commission; - cancellation_price; - stop_out; - expiration; - hovered_contract_type; + commission?: string | number; + cancellation_price?: number; + stop_out?: number; + expiration?: number; + hovered_contract_type?: string | null; cancellation_duration = '60m'; - cancellation_range_list = []; + cancellation_range_list: Array = []; // Turbos trade params - long_barriers = {}; - short_barriers = {}; + long_barriers: TBarriersData = {}; + short_barriers: TBarriersData = {}; // Vanilla trade params - strike_price_choices = {}; + strike_price_choices: TBarriersData = {}; // Mobile is_trade_params_expanded = true; //Toastbox - contract_purchase_toast_box; + contract_purchase_toast_box?: TToastBoxObject; - addTickByProposal = () => null; debouncedProposal = debounce(this.requestProposal, 500); - proposal_requests = {}; + proposal_requests: Record> = {}; is_purchasing_contract = false; - initial_barriers; + initial_barriers?: { barrier_1: string; barrier_2: string }; is_initial_barrier_applied = false; should_skip_prepost_lifecycle = false; - constructor({ root_store }) { + constructor({ root_store }: { root_store: TCoreStores }) { const local_storage_properties = [ 'amount', 'currency', @@ -337,7 +461,6 @@ export default class TradeStore extends BaseStore { resetErrorServices: action.bound, resetPreviousSymbol: action.bound, setActiveSymbols: action.bound, - setAllowEqual: action.bound, setBarrierChoices: action.bound, setChartStatus: action.bound, setContractPurchaseToastbox: action.bound, @@ -347,14 +470,12 @@ export default class TradeStore extends BaseStore { setMarketStatus: action.bound, setMobileDigitView: action.bound, setPreviousSymbol: action.bound, - setPurchaseSpotBarrier: action.bound, setSkipPrePostLifecycle: action.bound, setStakeBoundary: action.bound, setTradeStatus: action.bound, show_digits_stats: computed, themeChangeListener: action.bound, updateBarrierColor: action.bound, - updateLimitOrderBarriers: action.bound, updateStore: action.bound, updateSymbol: action.bound, }); @@ -427,7 +548,7 @@ export default class TradeStore extends BaseStore { } ); when( - () => this.accumulator_range_list.length, + () => !!this.accumulator_range_list.length, () => this.setDefaultGrowthRate() ); } @@ -464,14 +585,14 @@ export default class TradeStore extends BaseStore { } } - setSkipPrePostLifecycle(should_skip) { + setSkipPrePostLifecycle(should_skip: boolean) { if (!!should_skip !== !!this.should_skip_prepost_lifecycle) { // to skip assignment if no change is made this.should_skip_prepost_lifecycle = should_skip; } } - setTradeStatus(status) { + setTradeStatus(status: boolean) { this.is_trade_enabled = status; } @@ -531,7 +652,7 @@ export default class TradeStore extends BaseStore { return; } - if (!active_symbols || !active_symbols.length) { + if (!active_symbols?.length) { await WS.wait('get_settings'); /* * This logic is related to EU country checks @@ -564,7 +685,9 @@ export default class TradeStore extends BaseStore { runInAction(() => { const contract_categories = ContractType.getContractCategories(); this.processNewValuesAsync({ - ...contract_categories, + ...(contract_categories as Pick & { + has_only_forward_starting_contracts: boolean; + }), ...ContractType.getContractType(contract_categories.contract_types_list, this.contract_type), }); this.processNewValuesAsync(ContractType.getContractValues(this)); @@ -603,7 +726,7 @@ export default class TradeStore extends BaseStore { ); } - async onChangeMultiple(values) { + async onChangeMultiple(values: Partial) { Object.keys(values).forEach(name => { if (!(name in this)) { throw new Error(`Invalid Argument: ${name}`); @@ -614,7 +737,7 @@ export default class TradeStore extends BaseStore { this.validateAllProperties(); // then run validation before sending proposal } - async onChange(e) { + async onChange(e: { target: { name: string; value: unknown } }) { const { name, value } = e.target; if (name === 'symbol' && value) { // set trade params skeleton and chart loader to true until processNewValuesAsync resolves @@ -627,7 +750,7 @@ export default class TradeStore extends BaseStore { } else if (name === 'currency') { // Only allow the currency dropdown change if client is not logged in if (!this.root_store.client.is_logged_in) { - this.root_store.client.selectCurrency(value); + this.root_store.client.selectCurrency(value as string); } } else if (name === 'expiry_date') { this.expiry_time = null; @@ -645,19 +768,15 @@ export default class TradeStore extends BaseStore { this.root_store.common.setSelectedContractType(this.contract_type); } - setHoveredBarrier(hovered_value) { + setHoveredBarrier(hovered_value: string) { this.hovered_barrier = hovered_value; } - setPreviousSymbol(symbol) { + setPreviousSymbol(symbol: string) { if (this.previous_symbol !== symbol) this.previous_symbol = symbol; } - setAllowEqual(is_equal) { - this.is_equal = is_equal; - } - - setIsTradeParamsExpanded(value) { + setIsTradeParamsExpanded(value: boolean) { this.is_trade_params_expanded = value; } @@ -665,7 +784,7 @@ export default class TradeStore extends BaseStore { this.setMarketStatus(isMarketClosed(this.active_symbols, this.previous_symbol)); await Symbol.onChangeSymbolAsync(this.previous_symbol); - await this.updateSymbol(this.symbol); + this.updateSymbol(this.symbol); this.setChartStatus(false); runInAction(() => { @@ -673,18 +792,18 @@ export default class TradeStore extends BaseStore { }); } - updateBarrierColor(is_dark_mode) { + updateBarrierColor(is_dark_mode: boolean) { if (this.main_barrier) { this.main_barrier.updateBarrierColor(is_dark_mode); } } - onHoverPurchase(is_over, contract_type) { + onHoverPurchase(is_over: boolean, contract_type?: string) { if (this.is_accumulator) return; if (this.is_purchase_enabled && this.main_barrier && !this.is_multiplier) { - this.main_barrier.updateBarrierShade(is_over, contract_type); + this.main_barrier.updateBarrierShade(is_over, contract_type ?? ''); } else if (!is_over && this.main_barrier && !this.is_multiplier) { - this.main_barrier.updateBarrierShade(false, contract_type); + this.main_barrier.updateBarrierShade(false, contract_type ?? ''); } this.hovered_contract_type = is_over ? contract_type : null; @@ -692,44 +811,7 @@ export default class TradeStore extends BaseStore { barriers: this.root_store.portfolio.barriers, is_over, contract_type, - contract_info: this.proposal_info[contract_type], - }); - } - - setPurchaseSpotBarrier(is_over, position) { - const key = 'PURCHASE_SPOT_BARRIER'; - if (!is_over) { - removeBarrier(this.root_store.portfolio.barriers, key); - return; - } - - let purchase_spot_barrier = this.root_store.portfolio.barriers.find(b => b.key === key); - if (purchase_spot_barrier) { - if (purchase_spot_barrier.high !== +position.contract_info.entry_spot) { - purchase_spot_barrier.onChange({ - high: position.contract_info.entry_spot, - }); - } - } else { - purchase_spot_barrier = new ChartBarrierStore(position.contract_info.entry_spot); - purchase_spot_barrier.key = key; - purchase_spot_barrier.draggable = false; - purchase_spot_barrier.hideOffscreenBarrier = true; - purchase_spot_barrier.isSingleBarrier = true; - purchase_spot_barrier.updateBarrierColor(this.root_store.ui.is_dark_mode_on); - this.barriers.push(purchase_spot_barrier); - this.root_store.portfolio.barriers.push(purchase_spot_barrier); - } - } - - updateLimitOrderBarriers(is_over, position) { - const contract_info = position.contract_info; - const { barriers } = this; - setLimitOrderBarriers({ - barriers, - contract_info, - contract_type: contract_info.contract_type, - is_over, + contract_info: this.proposal_info[contract_type ?? ''], }); } @@ -755,19 +837,18 @@ export default class TradeStore extends BaseStore { return this.root_store.portfolio.barriers && toJS(this.root_store.portfolio.barriers); } - setMainBarrier = proposal_info => { + setMainBarrier = (proposal_info: PriceProposalRequest) => { if (!proposal_info) { return; } - const { barrier, contract_type, high_barrier, low_barrier } = proposal_info; - + const { contract_type, barrier, barrier2 } = proposal_info; if (isBarrierSupported(contract_type)) { const color = this.root_store.ui.is_dark_mode_on ? BARRIER_COLORS.DARK_GRAY : BARRIER_COLORS.GRAY; // create barrier only when it's available in response this.main_barrier = new ChartBarrierStore( - this.hovered_barrier || barrier || high_barrier, - low_barrier, + this.hovered_barrier || barrier, + barrier2, this.onChartBarrierChange, { color: this.hovered_barrier ? getHoveredColor(contract_type) : color, @@ -783,14 +864,14 @@ export default class TradeStore extends BaseStore { onPurchase = debounce(this.processPurchase, 300); - processPurchase(proposal_id, price, type) { + processPurchase(proposal_id: string, price: string | number, type: string) { if (!this.is_purchase_enabled) return; if (proposal_id) { this.is_purchase_enabled = false; this.is_purchasing_contract = true; const is_tick_contract = this.duration_unit === 't'; processPurchase(proposal_id, price).then( - action(response => { + action((response: TResponse) => { if (!this.is_trade_component_mounted) { this.enablePurchase(); this.is_purchasing_contract = false; @@ -820,7 +901,7 @@ export default class TradeStore extends BaseStore { if (this.proposal_info[type] && this.proposal_info[type].id !== proposal_id) { throw new Error('Proposal ID does not match.'); } - const contract_data = { + const contract_data: TContractDataForGTM = { ...this.proposal_requests[type], ...this.proposal_info[type], buy_price: response.buy.buy_price, @@ -831,8 +912,8 @@ export default class TradeStore extends BaseStore { if (contract_id) { const shortcode = response.buy.shortcode; const { category, underlying } = extractInfoFromShortcode(shortcode); - const is_digit_contract = isDigitContractType(category.toUpperCase()); - const contract_type = category.toUpperCase(); + const is_digit_contract = isDigitContractType(category?.toUpperCase() ?? ''); + const contract_type = category?.toUpperCase(); this.root_store.contract_trade.addContract({ contract_id, start_time, @@ -886,10 +967,10 @@ export default class TradeStore extends BaseStore { const el_purchase_value = document.getElementsByClassName('trade-container__price-info'); const el_purchase_buttons = document.getElementsByClassName('btn-purchase'); [].forEach.bind(el_purchase_buttons, el => { - el.classList.add('btn-purchase--disabled'); + (el as HTMLButtonElement).classList.add('btn-purchase--disabled'); })(); [].forEach.bind(el_purchase_value, el => { - el.classList.add('trade-container__price-info--fade'); + (el as HTMLDivElement).classList.add('trade-container__price-info--fade'); })(); }; @@ -898,11 +979,11 @@ export default class TradeStore extends BaseStore { * @param {Object} new_state - new values to update the store with * @return {Object} returns the object having only those values that are updated */ - updateStore(new_state) { + updateStore(new_state: Partial) { Object.keys(cloneObject(new_state) || {}).forEach(key => { if (key === 'root_store' || ['validation_rules', 'validation_errors', 'currency'].indexOf(key) > -1) return; - if (JSON.stringify(this[key]) === JSON.stringify(new_state[key])) { - delete new_state[key]; + if (JSON.stringify(this[key as keyof this]) === JSON.stringify(new_state[key as keyof TradeStore])) { + delete new_state[key as keyof TradeStore]; } else { if (key === 'symbol') { this.is_purchase_enabled = false; @@ -913,7 +994,7 @@ export default class TradeStore extends BaseStore { new_state.start_date = parseInt(new_state.start_date); } - this[key] = new_state[key]; + this[key as 'currency'] = new_state[key as keyof TradeStore] as TradeStore['currency']; // validation is done in mobx intercept (base_store.js) // when barrier_1 is set, it is compared with store.barrier_2 (which is not updated yet) @@ -926,9 +1007,9 @@ export default class TradeStore extends BaseStore { } async processNewValuesAsync( - obj_new_values = {}, + obj_new_values: Partial = {}, is_changed_by_user = false, - obj_old_values = {}, + obj_old_values: Partial | null = {}, should_forget_first = true ) { // To switch to rise_fall_equal contract type when allow equal is checked on first page refresh or @@ -962,7 +1043,7 @@ export default class TradeStore extends BaseStore { savePreviousChartMode('', null); } - if (/\bduration\b/.test(Object.keys(obj_new_values))) { + if (/\bduration\b/.test(Object.keys(obj_new_values) as unknown as string)) { // TODO: fix this in input-field.jsx if (typeof obj_new_values.duration === 'string') { obj_new_values.duration = +obj_new_values.duration; @@ -974,27 +1055,27 @@ export default class TradeStore extends BaseStore { this.forgetAllProposal(); this.proposal_requests = {}; } - if (is_changed_by_user && /\bcurrency\b/.test(Object.keys(obj_new_values))) { + if (is_changed_by_user && /\bcurrency\b/.test(Object.keys(obj_new_values) as unknown as string)) { const prev_currency = obj_old_values?.currency || this.currency; const has_currency_changed = obj_new_values.currency !== prev_currency; const should_reset_stake = - isCryptocurrency(obj_new_values.currency) || + isCryptocurrency(obj_new_values.currency ?? '') || // For switch between fiat and crypto and vice versa - isCryptocurrency(obj_new_values.currency) !== isCryptocurrency(prev_currency); + isCryptocurrency(obj_new_values.currency ?? '') !== isCryptocurrency(prev_currency); if (has_currency_changed && should_reset_stake) { - obj_new_values.amount = obj_new_values.amount || getMinPayout(obj_new_values.currency); + obj_new_values.amount = obj_new_values.amount || getMinPayout(obj_new_values.currency ?? ''); } - this.currency = obj_new_values.currency; + this.currency = obj_new_values.currency ?? ''; } let has_only_forward_starting_contracts; if (Object.keys(obj_new_values).includes('symbol')) { this.setPreviousSymbol(this.symbol); - await Symbol.onChangeSymbolAsync(obj_new_values.symbol); - this.setMarketStatus(isMarketClosed(this.active_symbols, obj_new_values.symbol)); + await Symbol.onChangeSymbolAsync(obj_new_values.symbol ?? ''); + this.setMarketStatus(isMarketClosed(this.active_symbols, obj_new_values.symbol ?? '')); has_only_forward_starting_contracts = ContractType.getContractCategories().has_only_forward_starting_contracts; } @@ -1005,7 +1086,10 @@ export default class TradeStore extends BaseStore { const new_state = this.updateStore(cloneObject(obj_new_values)); - if (is_changed_by_user || /\b(symbol|contract_types_list)\b/.test(Object.keys(new_state))) { + if ( + is_changed_by_user || + /\b(symbol|contract_types_list)\b/.test(Object.keys(new_state) as unknown as string) + ) { this.updateStore({ // disable purchase button(s), clear contract info is_purchase_enabled: false, @@ -1030,7 +1114,7 @@ export default class TradeStore extends BaseStore { ...(!this.is_initial_barrier_applied ? this.initial_barriers : {}), }); this.is_initial_barrier_applied = true; - if (/\b(contract_type|currency)\b/.test(Object.keys(new_state))) { + if (/\b(contract_type|currency)\b/.test(Object.keys(new_state) as unknown as string)) { this.validateAllProperties(); } this.debouncedProposal(); @@ -1051,11 +1135,11 @@ export default class TradeStore extends BaseStore { return isDigitTradeType(this.contract_type); } - setMobileDigitView(bool) { + setMobileDigitView(bool: boolean) { this.is_mobile_digit_view_selected = bool; } - pushPurchaseDataToGtm(contract_data) { + pushPurchaseDataToGtm(contract_data: TContractDataForGTM) { const data = { event: 'buy_contract', bom_ui: 'new', @@ -1105,7 +1189,7 @@ export default class TradeStore extends BaseStore { } if (!isEmptyObject(requests)) { - this.proposal_requests = requests; + this.proposal_requests = requests as Record>; this.purchase_info = {}; Object.keys(this.proposal_requests).forEach(type => { WS.subscribeProposal(this.proposal_requests[type], this.onProposalResponse); @@ -1119,11 +1203,11 @@ export default class TradeStore extends BaseStore { if (length > 0) WS.forgetAll('proposal'); } - setMarketStatus(status) { + setMarketStatus(status: boolean) { this.is_market_closed = status; } - onProposalResponse(response) { + onProposalResponse(response: TResponse) { const { contract_type } = response.echo_req; const prev_proposal_info = getPropertyValue(this.proposal_info, contract_type) || {}; const obj_prev_contract_basis = getPropertyValue(prev_proposal_info, 'obj_contract_basis') || {}; @@ -1155,11 +1239,11 @@ export default class TradeStore extends BaseStore { if (this.is_accumulator && this.proposal_info?.ACCU) { const { barrier_spot_distance, - maximum_ticks, + maximum_ticks = 0, ticks_stayed_in, - tick_size_barrier, + tick_size_barrier = 0, last_tick_epoch, - maximum_payout, + maximum_payout = 0, high_barrier, low_barrier, spot_time, @@ -1189,10 +1273,9 @@ export default class TradeStore extends BaseStore { } if (this.hovered_contract_type === contract_type) { - this.addTickByProposal(response); setLimitOrderBarriers({ barriers: this.root_store.portfolio.barriers, - contract_info: this.proposal_info[this.hovered_contract_type], + contract_info: this.proposal_info[this.hovered_contract_type ?? ''], contract_type, is_over: true, }); @@ -1233,7 +1316,7 @@ export default class TradeStore extends BaseStore { if ((this.is_turbos || this.is_vanilla) && response.error.details?.barrier_choices) { const { barrier_choices, max_stake, min_stake } = response.error.details; this.setStakeBoundary(contract_type, min_stake, max_stake); - this.setBarrierChoices(barrier_choices); + this.setBarrierChoices(barrier_choices as string[]); if (!this.barrier_choices.includes(this.barrier_1)) { // Since on change of duration `proposal` API call is made which returns a new set of barrier values. // The new list is set and the mid value is assigned @@ -1250,8 +1333,8 @@ export default class TradeStore extends BaseStore { } else { this.validateAllProperties(); if (this.is_turbos || this.is_vanilla) { - const { max_stake, min_stake, barrier_choices } = response.proposal; - this.setBarrierChoices(barrier_choices); + const { max_stake, min_stake, barrier_choices } = response.proposal ?? {}; + this.setBarrierChoices(barrier_choices as string[]); this.setStakeBoundary(contract_type, min_stake, max_stake); } } @@ -1261,15 +1344,15 @@ export default class TradeStore extends BaseStore { } } - onChartBarrierChange(barrier_1, barrier_2) { + onChartBarrierChange(barrier_1: string, barrier_2?: string) { this.processNewValuesAsync({ barrier_1, barrier_2 }, true); } onAllowEqualsChange() { - this.processNewValuesAsync({ contract_type: parseInt(this.is_equal) ? 'rise_fall_equal' : 'rise_fall' }, true); + this.processNewValuesAsync({ contract_type: this.is_equal ? 'rise_fall_equal' : 'rise_fall' }, true); } - updateSymbol(underlying) { + updateSymbol(underlying: string) { if (!underlying) return; this.onChange({ target: { @@ -1287,7 +1370,7 @@ export default class TradeStore extends BaseStore { if (!this.validation_rules.duration) return; - const index = this.validation_rules.duration.rules.findIndex(item => item[0] === 'number'); + const index = this.validation_rules.duration.rules?.findIndex(item => item[0] === 'number'); const limits = this.duration_min_max[this.contract_expiry_type] || false; if (limits) { @@ -1296,10 +1379,10 @@ export default class TradeStore extends BaseStore { max: convertDurationLimit(+limits.max, this.duration_unit), }; - if (index > -1) { - this.validation_rules.duration.rules[index][1] = duration_options; + if (Number(index) > -1 && this.validation_rules.duration.rules) { + this.validation_rules.duration.rules[Number(index)][1] = duration_options; } else { - this.validation_rules.duration.rules.push(['number', duration_options]); + this.validation_rules.duration.rules?.push(['number', duration_options]); } this.validateProperty('duration', this.duration); } @@ -1352,11 +1435,11 @@ export default class TradeStore extends BaseStore { return Promise.resolve(); } - networkStatusChangeListener(is_online) { + networkStatusChangeListener(is_online: boolean) { this.setTradeStatus(is_online); } - themeChangeListener(is_dark_mode_on) { + themeChangeListener(is_dark_mode_on: boolean) { this.updateBarrierColor(is_dark_mode_on); } @@ -1371,6 +1454,7 @@ export default class TradeStore extends BaseStore { this.root_store.notifications.setShouldShowPopups(false); this.onPreSwitchAccount(this.preSwitchAccountListener); this.onSwitchAccount(this.accountSwitcherListener); + this.resetAccumulatorData(); this.onLogout(this.logoutListener); this.onClientInit(this.clientInitListener); this.onNetworkStatusChange(this.networkStatusChangeListener); @@ -1383,11 +1467,11 @@ export default class TradeStore extends BaseStore { }); } - setChartStatus(status) { + setChartStatus(status: boolean) { this.is_chart_loading = status; } - async initAccountCurrency(new_currency) { + async initAccountCurrency(new_currency: string) { if (this.currency === new_currency) return; await this.processNewValuesAsync({ currency: new_currency }, true, { currency: this.currency }, false); @@ -1416,13 +1500,14 @@ export default class TradeStore extends BaseStore { if (this.prev_chart_layout) { this.prev_chart_layout.is_used = false; } + this.clearContracts(); this.resetAccumulatorData(); if (this.is_vanilla) { this.setBarrierChoices([]); } } - prev_chart_layout = null; + prev_chart_layout: TPrevChartLayout = null; get chart_layout() { let layout = null; @@ -1433,38 +1518,41 @@ export default class TradeStore extends BaseStore { } get is_crypto_multiplier() { - return this.contract_type === 'multiplier' && /^cry/.test(this.symbol); + return this.contract_type === 'multiplier' && this.symbol.startsWith('cry'); } - exportLayout(layout) { + exportLayout(layout: TChartLayout) { delete layout.previousMaxTicks; // TODO: fix it in smartcharts this.prev_chart_layout = layout; - this.prev_chart_layout.isDone = () => { - this.prev_chart_layout.is_used = true; - this.setChartStatus(false); - }; + if (this.prev_chart_layout) { + this.prev_chart_layout.isDone = () => { + if (this.prev_chart_layout) this.prev_chart_layout.is_used = true; + this.setChartStatus(false); + }; + } } // ---------- WS ---------- - wsSubscribe = (req, callback) => { - const passthrough_callback = (...args) => { + wsSubscribe = (req: TicksHistoryRequest, callback: (response: TTicksHistoryResponse) => void) => { + const passthrough_callback = (...args: [TTicksHistoryResponse]) => { callback(...args); if (this.is_accumulator) { let current_spot_data = {}; if ('tick' in args[0]) { - const { epoch, quote, symbol } = args[0].tick; + const { epoch, quote, symbol } = args[0].tick as TickSpotData; if (this.symbol !== symbol) return; current_spot_data = { current_spot: quote, current_spot_time: epoch, }; } else if ('history' in args[0]) { - const { prices, times } = args[0].history; + const { prices, times } = args[0].history as History; const symbol = args[0].echo_req.ticks_history; if (this.symbol !== symbol) return; current_spot_data = { - current_spot: prices[prices.length - 1], - current_spot_time: times[times.length - 1], + current_spot: prices?.[prices?.length - 1], + current_spot_time: times?.[times?.length - 1], + prev_spot_time: times?.[times?.length - 2], }; } else { return; @@ -1479,21 +1567,21 @@ export default class TradeStore extends BaseStore { } }; - wsForget = req => { + wsForget = (req: TicksHistoryRequest) => { const key = JSON.stringify(req); if (g_subscribers_map[key]) { - g_subscribers_map[key].unsubscribe(); + g_subscribers_map[key]?.unsubscribe(); delete g_subscribers_map[key]; } // WS.forget('ticks_history', callback, match); }; - wsForgetStream = stream_id => { + wsForgetStream = (stream_id: string) => { WS.forgetStream(stream_id); }; - wsSendRequest = req => { - if (req.time) { + wsSendRequest = (req: TradingTimesRequest | ActiveSymbolsRequest | ServerTimeRequest) => { + if ('time' in req) { return ServerTime.timePromise().then(server_time => { if (server_time) { return { @@ -1504,16 +1592,16 @@ export default class TradeStore extends BaseStore { return WS.time(); }); } - if (req.active_symbols) { + if ('active_symbols' in req) { return WS.activeSymbols('brief'); } - if (req.trading_times) { + if ('trading_times' in req) { return WS.tradingTimes(req.trading_times); } return WS.storage.send(req); }; - chartStateChange(state, option) { + chartStateChange(state: string, option?: TChartStateChangeOption) { if ( state === STATE_TYPES.MARKET_STATE_CHANGE && this.is_trade_component_mounted && @@ -1522,20 +1610,16 @@ export default class TradeStore extends BaseStore { ) { this.prepareTradeStore(false); } - const { data, event_type } = getChartAnalyticsData(state, option); + const { data, event_type } = getChartAnalyticsData(state as keyof typeof STATE_TYPES, option) as TPayload; if (data) { RudderStack.track(event_type, { ...data, device_type: isMobile() ? 'mobile' : 'desktop', form_name: 'default', - }); + } as TEvents['ce_chart_types_form']); } } - refToAddTick = ref => { - this.addTickByProposal = ref; - }; - get has_alternative_source() { return this.is_multiplier && !!this.hovered_contract_type; } @@ -1556,23 +1640,26 @@ export default class TradeStore extends BaseStore { return isVanillaContract(this.contract_type); } - setContractPurchaseToastbox(response) { - const list = getAvailableContractTypes(this.contract_types_list, unsupported_contract_types_list); + setContractPurchaseToastbox(response: Buy) { + const list = getAvailableContractTypes( + this.contract_types_list, + unsupported_contract_types_list + ) as Array; - return (this.contract_purchase_toast_box = { + this.contract_purchase_toast_box = { key: true, buy_price: formatMoney(this.root_store.client.currency, response.buy_price, true, 0, 0), contract_type: this.contract_type, currency: getCurrencyDisplayCode(this.root_store.client.currency), list, - }); + }; } clearContractPurchaseToastBox() { this.contract_purchase_toast_box = undefined; } - async getFirstOpenMarket(markets_to_search) { + async getFirstOpenMarket(markets_to_search: string[]) { if (this.active_symbols?.length) { return findFirstOpenMarket(this.active_symbols, markets_to_search); } @@ -1584,7 +1671,11 @@ export default class TradeStore extends BaseStore { return findFirstOpenMarket(active_symbols, markets_to_search); } - setBarrierChoices(barrier_choices) { + setStakeBoundary(type: string, min_stake?: number, max_stake?: number) { + if (min_stake && max_stake) this.stake_boundary[type] = { min_stake, max_stake }; + } + + setBarrierChoices(barrier_choices: string[]) { this.barrier_choices = barrier_choices ?? []; if (this.is_turbos) { const stored_barriers_data = { barrier: this.barrier_1, barrier_choices }; @@ -1598,8 +1689,4 @@ export default class TradeStore extends BaseStore { this.strike_price_choices = { barrier: this.barrier_1, barrier_choices }; } } - - setStakeBoundary(type, min_stake, max_stake) { - if (min_stake && max_stake) this.stake_boundary[type] = { min_stake, max_stake }; - } } diff --git a/packages/trader/src/Stores/base-store.ts b/packages/trader/src/Stores/base-store.ts index 704efb2175f2..c66f6937d334 100644 --- a/packages/trader/src/Stores/base-store.ts +++ b/packages/trader/src/Stores/base-store.ts @@ -7,7 +7,7 @@ import { getValidationRules } from './Modules/Trading/Constants/validation-rules type TValidationRules = ReturnType | Record; type TBaseStoreOptions = { - root_store?: TCoreStores; + root_store: TCoreStores; local_storage_properties?: string[]; session_storage_properties?: string[]; validation_rules?: TValidationRules; @@ -33,21 +33,21 @@ export default class BaseStore { logout_listener: null | (() => Promise) = null; local_storage_properties: string[]; networkStatusChangeDisposer: null | (() => void) = null; - network_status_change_listener: null | ((is_online?: boolean) => void) = null; + network_status_change_listener: null | ((is_online: boolean) => void) = null; partial_fetch_time = 0; preSwitchAccountDisposer: null | (() => void) = null; pre_switch_account_listener: null | (() => Promise) = null; realAccountSignupEndedDisposer: null | (() => void) = null; real_account_signup_ended_listener: null | (() => Promise) = null; - root_store?: TCoreStores; + root_store: TCoreStores; session_storage_properties: string[]; store_name = ''; switchAccountDisposer: null | (() => void) = null; switch_account_listener: null | (() => Promise) = null; themeChangeDisposer: null | (() => void) = null; - theme_change_listener: null | ((is_dark_mode_on?: boolean) => void) = null; + theme_change_listener: null | ((is_dark_mode_on: boolean) => void) = null; validation_errors: { [key: string]: string[] } = {}; - validation_rules: TValidationRules = {}; + validation_rules: TValidationRules | Record = {}; /** * Constructor of the base class that gets properties' name of child which should be saved in storages * @@ -58,7 +58,7 @@ export default class BaseStore { * @property {Object} validation_rules - An object that contains the validation rules for each property of the store. * @property {String} store_name - Explicit store name for browser application storage (to bypass minification) */ - constructor(options: TBaseStoreOptions = {}) { + constructor(options = {} as TBaseStoreOptions) { makeObservable(this, { validation_errors: observable, validation_rules: observable, @@ -268,7 +268,7 @@ export default class BaseStore { * */ validateProperty(property: string, value: T[keyof T]) { - const validation_rules_for_property = this.validation_rules[property as keyof TValidationRules]; + const validation_rules_for_property = this.validation_rules[property] ?? {}; const trigger = 'trigger' in validation_rules_for_property ? validation_rules_for_property.trigger : undefined; const inputs = { [property]: value ?? this[property as keyof this] }; const validation_rules = { @@ -315,13 +315,13 @@ export default class BaseStore { this.switch_account_listener = listener; this.switchAccountDisposer = when( - () => !!this.root_store?.client.switch_broadcast, + () => !!this.root_store.client.switch_broadcast, () => { try { const result = this.switch_account_listener?.(); if (result?.then && typeof result.then === 'function') { result.then(() => { - this.root_store?.client.switchEndSignal(); + this.root_store.client.switchEndSignal(); this.onSwitchAccount(this.switch_account_listener); }); } else { @@ -343,13 +343,13 @@ export default class BaseStore { if (listener) { this.pre_switch_account_listener = listener; this.preSwitchAccountDisposer = when( - () => !!this.root_store?.client.pre_switch_broadcast, + () => !!this.root_store.client.pre_switch_broadcast, () => { try { const result = this.pre_switch_account_listener?.(); if (result?.then && typeof result.then === 'function') { result.then(() => { - this.root_store?.client.setPreSwitchAccount(false); + this.root_store.client.setPreSwitchAccount(false); this.onPreSwitchAccount(this.pre_switch_account_listener); }); } else { @@ -369,13 +369,13 @@ export default class BaseStore { onLogout(listener: null | (() => Promise)): void { this.logoutDisposer = when( - () => !!this.root_store?.client.has_logged_out, + () => !!this.root_store.client.has_logged_out, async () => { try { const result = this.logout_listener?.(); if (result?.then && typeof result.then === 'function') { result.then(() => { - this.root_store?.client.setLogout(false); + this.root_store.client.setLogout(false); this.onLogout(this.logout_listener); }); } else { @@ -395,13 +395,13 @@ export default class BaseStore { onClientInit(listener: null | (() => Promise)): void { this.clientInitDisposer = when( - () => !!this.root_store?.client.initialized_broadcast, + () => !!this.root_store.client.initialized_broadcast, async () => { try { const result = this.client_init_listener?.(); if (result?.then && typeof result.then === 'function') { result.then(() => { - this.root_store?.client.setInitialized(false); + this.root_store.client.setInitialized(false); this.onClientInit(this.client_init_listener); }); } else { @@ -419,9 +419,9 @@ export default class BaseStore { this.client_init_listener = listener; } - onNetworkStatusChange(listener: null | ((is_online?: boolean) => void)): void { + onNetworkStatusChange(listener: null | ((is_online: boolean) => void)): void { this.networkStatusChangeDisposer = reaction( - () => this.root_store?.common.is_network_online, + () => this.root_store.common.is_network_online, is_online => { try { this.network_status_change_listener?.(is_online); @@ -438,9 +438,9 @@ export default class BaseStore { this.network_status_change_listener = listener; } - onThemeChange(listener: null | ((is_dark_mode_on?: boolean) => void)): void { + onThemeChange(listener: null | ((is_dark_mode_on: boolean) => void)): void { this.themeChangeDisposer = reaction( - () => this.root_store?.ui.is_dark_mode_on, + () => this.root_store.ui.is_dark_mode_on, is_dark_mode_on => { try { this.theme_change_listener?.(is_dark_mode_on); @@ -459,13 +459,13 @@ export default class BaseStore { onRealAccountSignupEnd(listener: null | (() => Promise)): void { this.realAccountSignupEndedDisposer = when( - () => !!this.root_store?.ui.has_real_account_signup_ended, + () => !!this.root_store.ui.has_real_account_signup_ended, () => { try { const result = this.real_account_signup_ended_listener?.(); if (result?.then && typeof result.then === 'function') { result.then(() => { - this.root_store?.ui.setRealAccountSignupEnd(false); + this.root_store.ui.setRealAccountSignupEnd(false); this.onRealAccountSignupEnd(this.real_account_signup_ended_listener); }); } else { @@ -545,7 +545,7 @@ export default class BaseStore { assertHasValidCache(loginid: string, ...reactions: VoidFunction[]): void { // account was changed when this was unmounted. - if (this.root_store?.client.loginid !== loginid) { + if (this.root_store.client.loginid !== loginid) { reactions.forEach(act => act()); this.partial_fetch_time = 0; } diff --git a/packages/trader/src/Stores/useTraderStores.tsx b/packages/trader/src/Stores/useTraderStores.tsx index ff5ab4b5becd..5e4db0cd77c2 100644 --- a/packages/trader/src/Stores/useTraderStores.tsx +++ b/packages/trader/src/Stores/useTraderStores.tsx @@ -1,128 +1,8 @@ import React from 'react'; import { useStore } from '@deriv/stores'; import TradeStore from './Modules/Trading/trade-store'; -import moment from 'moment'; -type TTextValueStrings = { - text: string; - value: string; -}; - -type TContractTypesList = { - name: string; - categories: TTextValueStrings[]; -}; - -type TContractCategoriesList = { - Multipliers: TContractTypesList; - 'Ups & Downs': TContractTypesList; - 'Highs & Lows': TContractTypesList; - 'Ins & Outs': TContractTypesList; - 'Look Backs': TContractTypesList; - Digits: TContractTypesList; - Vanillas: TContractTypesList; - Accumulators: TContractTypesList; -}; - -type TToastBoxListItem = { - contract_category: string; - contract_types: [ - { - text: string; - value: string; - } - ]; -}; - -type TToastBoxObject = { - key?: boolean; - buy_price?: number; - currency?: string; - contract_type?: string; - list?: TToastBoxListItem[]; -}; - -type TOverrideTradeStore = Omit< - TradeStore, - | 'accumulator_range_list' - | 'barriers' - | 'basis_list' - | 'cancellation_price' - | 'cancellation_range_list' - | 'clearContractPurchaseToastBox' - | 'contract_purchase_toast_box' - | 'contract_types_list' - | 'duration_min_max' - | 'duration_units_list' - | 'expiry_date' - | 'expiry_time' - | 'expiry_type' - | 'form_components' - | 'market_close_times' - | 'market_open_times' - | 'multiplier_range_list' - | 'multiplier' - | 'sessions' - | 'setIsTradeParamsExpanded' - | 'start_dates_list' - | 'start_time' - | 'symbol' - | 'take_profit' - | 'proposal_info' - | 'trade_types' - | 'ticks_history_stats' -> & { - accumulator_range_list?: number[]; - basis_list: Array; - cancellation_price?: number; - cancellation_range_list: Array; - clearContractPurchaseToastBox: () => void; - contract_purchase_toast_box: TToastBoxObject; - contract_types_list: TContractCategoriesList; - duration_min_max: { - [key: string]: { min: number; max: number }; - }; - duration_units_list: Array; - expiry_date: string | null; - expiry_time: string | null; - expiry_type: string | null; - form_components: string[]; - long_barriers: Record | { barrier: string; barrier_choices: string[] }; - market_open_times: string[]; - market_close_times: string[]; - multiplier: number; - multiplier_range_list: number[]; - proposal_info: { - [key: string]: { - has_error?: boolean; - id: string; - has_increased?: boolean; - message?: string; - cancellation?: { - ask_price: number; - date_expiry: number; - }; - growth_rate?: number; - returns?: string; - stake: string; - }; - }; - sessions: Array<{ open: moment.Moment; close: moment.Moment }>; - setIsTradeParamsExpanded: (value: boolean) => void; - short_barriers: Record | { barrier: string; barrier_choices: string[] }; - strike_price_choices: Record | { barrier: string; barrier_choices: string[] }; - start_dates_list: Array<{ text: string; value: number }>; - start_time?: string | null; - symbol: string; - take_profit?: string; - ticks_history_stats: { - ticks_stayed_in?: number[]; - last_tick_epoch?: number; - }; - trade_types: { [key: string]: string }; -}; - -const TraderStoreContext = React.createContext(null); +const TraderStoreContext = React.createContext(null); export const TraderStoreProvider = ({ children }: React.PropsWithChildren) => { const { modules } = useStore(); diff --git a/packages/trader/src/Types/common-prop.type.ts b/packages/trader/src/Types/common-prop.type.ts index bc38b04c55e2..d2252c3012d8 100644 --- a/packages/trader/src/Types/common-prop.type.ts +++ b/packages/trader/src/Types/common-prop.type.ts @@ -1,19 +1,16 @@ import { useTraderStore } from 'Stores/useTraderStores'; -export type TProposalTypeInfo = { - has_error?: boolean; - id: string; - has_increased?: boolean; - message?: string; - cancellation?: { - ask_price: number; - date_expiry: number; - }; - growth_rate?: number; - returns?: string; - stake: string; +export type TTextValueStrings = { + text: string; + value: string; +}; +export type TTextValueNumber = { + text: string; + value: number; }; +export type TProposalTypeInfo = TTradeStore['proposal_info'][string]; + export type TError = { error?: { code?: string; diff --git a/packages/trader/src/Utils/Validator/validator.ts b/packages/trader/src/Utils/Validator/validator.ts index c0a840093d41..4adf2224591b 100644 --- a/packages/trader/src/Utils/Validator/validator.ts +++ b/packages/trader/src/Utils/Validator/validator.ts @@ -1,4 +1,5 @@ import { Errors, getPreBuildDVRs, template } from '@deriv/shared'; + import { getValidationRules } from 'Stores/Modules/Trading/Constants/validation-rules'; import { TTradeStore } from 'Types'; @@ -6,8 +7,8 @@ type TOptions = { [key: string]: unknown; decimals?: string | number; is_required?: boolean; - max?: number | string; - min?: number | string; + max?: number | string | null; + min?: number | string | null; name1?: string; name2?: string; regex?: RegExp; @@ -17,9 +18,14 @@ type TOptions = { type TInitPreBuildDVRs = ReturnType; export type TRuleOptions = { - func: (value: string | number, options?: TOptions, store?: TTradeStore, inputs?: unknown) => boolean; - condition: (store: TTradeStore) => boolean; - message: string; + func?: ( + value: T, + options?: TOptions, + store?: TTradeStore, + inputs?: Pick + ) => boolean | { is_ok: boolean; message: string }; + condition?: (store: TTradeStore) => boolean; + message?: string; } & TOptions; type TRule = string | Array; @@ -30,13 +36,13 @@ type TValidationResult = { }; class Validator { - input: Partial; + input: Pick; rules: Partial; store: TTradeStore; errors: Errors; error_count: number; - constructor(input: Partial, rules: Partial, store: TTradeStore) { + constructor(input: Pick, rules: Partial, store: TTradeStore) { this.input = input; this.rules = rules; this.store = store; @@ -99,8 +105,8 @@ class Validator { let is_valid, error_message; if (ruleObject.name === 'number') { - const { is_ok, message }: TValidationResult = ruleObject.validator( - this.input[attribute as keyof TTradeStore], + const { is_ok, message } = ruleObject.validator( + this.input[attribute as keyof TTradeStore] as string, ruleObject.options, this.store, this.input @@ -109,7 +115,7 @@ class Validator { error_message = message; } else { is_valid = ruleObject.validator( - this.input[attribute as keyof TTradeStore], + this.input[attribute as keyof TTradeStore] as string, ruleObject.options, this.store, this.input @@ -152,12 +158,7 @@ class Validator { : ( getPreBuildDVRs() as unknown as { [key: string]: { - func: ( - value: string | number, - options?: TRuleOptions, - store?: TTradeStore, - inputs?: unknown - ) => boolean | { is_ok: boolean; message: string }; + func: TRuleOptions['func']; }; } )[rule_object_name].func, diff --git a/packages/trader/src/sass/app/modules/trading-mobile.scss b/packages/trader/src/sass/app/modules/trading-mobile.scss index 3d1541ea7b01..2205e3048990 100644 --- a/packages/trader/src/sass/app/modules/trading-mobile.scss +++ b/packages/trader/src/sass/app/modules/trading-mobile.scss @@ -358,6 +358,9 @@ } } } + &-keypad:has(.range-text-container) { + padding: 0.4rem 1.6rem 1.6rem; + } } &__header { @include mobile { diff --git a/packages/trader/src/sass/app/modules/trading.scss b/packages/trader/src/sass/app/modules/trading.scss index bebc896d2417..c9016e10bf34 100644 --- a/packages/trader/src/sass/app/modules/trading.scss +++ b/packages/trader/src/sass/app/modules/trading.scss @@ -965,16 +965,30 @@ } } -.expiry-text-container { - margin-top: 0.4rem; +.expiry-text-container, +.range-text-container { + margin-top: 0.5rem; - &--mobile { + @include mobile { margin: 0 0 0.8rem; position: relative; top: -0.8rem; } } +.text-container--vanilla { + min-height: 5rem; + padding-top: 0.5rem; + display: flex; + flex-direction: column; + align-items: center; + + .expiry-text-container, + .range-text-container { + top: 0; + } +} + /** @define dc-collapsible */ @include mobile { .dc-collapsible { diff --git a/packages/translations/crowdin/messages.json b/packages/translations/crowdin/messages.json index 76dfd133e3a8..809d501e4b82 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","2091451":"Deriv Bot - your automated trading partner","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.","9488203":"Deriv Bot 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'.","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","49404821":"If you buy a \"<0>{{trade_type}}\" option, you receive a payout at expiry if the final price is {{payout_status}} the strike price. Otherwise, your “<0>{{trade_type}}” option will expire worthless.","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","56764670":"Deriv Bot 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.","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","67923436":"No, Deriv Bot will stop running when your web browser is closed.","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.","76925355":"Check your bot’s performance","77945356":"Trade on the go with our mobile app.","77982950":"Vanilla options allow you to predict an upward (bullish) or downward (bearish) direction of the underlying asset by purchasing a \"Call\" or a \"Put\".","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","117056711":"We’re updating our site","117318539":"Password should have lower and uppercase English letters with numbers.","118158064":"2. Use a logic block to check if current profit/loss exceeds maximum loss. If it does, set trade again to false to prevent the bot from running another cycle.","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","133284316":"Supported formats: JPEG, JPG, PNG, PDF and GIF only","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","149616444":"cTrader Demo","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 }}","157871994":"Link expired","158355408":"Some services may be temporarily unavailable.","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","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","176327749":"- Android: Tap the account, open <0>Options, and tap <0>Delete.","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","196810983":"If the duration is more than 24 hours, the Cut-off time and Expiry date will apply instead.","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","203108063":"Congratulations, you have successfully created your {{category}} <0>{{platform}} <1>{{type}} account. ","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.","203924654":"Hit the <0>Start button to begin and follow the tutorial.","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.","212871086":"Coming soon on mobile","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","220019594":"Need more help? Contact us through live chat for assistance.","220186645":"Text Is empty","220232017":"demo CFDs","221261209":"A Deriv account will allow you to fund (and withdraw from) your CFDs account(s).","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.","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 }}","246428134":"Step-by-step guides","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.","248153700":"Reset your password","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.","262095250":"If you select <0>\"Put\", you’ll earn a payout if the final price is below the strike price at expiry. Otherwise, you won’t receive a payout.","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","280021988":"Use these shortcuts","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","295173783":"Long/Short","296017162":"Back to Bot","301441673":"Select your citizenship/nationality as it appears on your passport or other government-issued ID.","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.","310234308":"Close all your positions.","312142140":"Save new limits?","312300092":"Trims the spaces within a given string or text.","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.","321457615":"Oops, something went wrong!","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)","347217485":"Trouble accessing Deriv MT5 on your mobile?","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","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","377231893":"Deriv Bot is unavailable in the EU","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.","398816980":"Launch {{platform_name_trader}} in seconds the next time you want to trade.","401339495":"Verify address","401345454":"Head to the Tutorials tab to do so.","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)","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.","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","419496000":"Your contract is closed automatically when your profit is more than or equals to this amount. This block can only be used with the multipliers trade type.","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:","431267979":"Here’s a quick guide on how to use Deriv Bot on the go.","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.","436534334":"<0>We've sent you an email.","437138731":"Create a new {{platform}} password","437453244":"Choose your preferred cryptocurrency","437485293":"File type not supported","437904704":"Maximum open positions","438067535":"Over $500,000","439398769":"This strategy is currently not compatible with Deriv Bot.","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:","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/>","483551811":"Your <0>payout is the sum of your inital stake and profit.","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","498562439":"or","499522484":"1. for \"string\": 1325.68 USD","500215405":"Server maintenance starts at 01:00 GMT every Sunday and may last up to 2 hours. You may experience service disruption during this time.","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","511679687":"Accumulators allow you to express a view on the range of movement of an index and grow your stake exponentially at a fixed <0>growth rate.","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","530953413":"Authorised applications","531114081":"3. Contract Type","531675669":"Euro","535041346":"Max. total stake per day","537788407":"Other CFDs Platform","538017420":"0.5 pips","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","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","558262475":"On your MT5 mobile app, delete your existing Deriv account:","558866810":"Run your bot","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?","575702000":"Remember, selfies, pictures of houses, or non-related images will be rejected.","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","592087722":"Employment status is required.","593459109":"Try a different currency","594937260":"Derived - BVI","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.","603899222":"Distance to current spot","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.","617910072":"Use your Deriv account email and password to login into the {{ platform }} platform.","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)","624668261":"You’ve just stopped the bot. Any open contracts can be viewed on the <0>Reports page.","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","647745382":"Input List {{ input_list }}","648035589":"Other CFD Platforms","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.","656296740":"While “Deal cancellation” is active:","656893085":"Timestamp","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","681808253":"Previous spot price","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?","687193018":"Slippage risk","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.","692354762":"Please enter your {{document_name}}. {{example_format}}","693396140":"Deal cancellation (expired)","694035561":"Trade options multipliers","696870196":"- Open time: the opening time stamp","697630556":"This market is presently closed.","698037001":"National Identity Number","699159918":"1. Filing complaints","699646180":"A minimum deposit value of <0>{{minimum_deposit}} {{currency}} is required. Otherwise, the funds will be lost and cannot be recovered.","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)","702561961":"Change theme","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.","706960383":"We’ll offer to buy your contract at this price should you choose to sell it before its expiry. This is based on several factors, such as the current spot price, duration, etc. However, we won’t offer a contract value if the remaining duration is below 60 seconds.","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.","724526379":"Learn more with our tutorials","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.","743623600":"Reference","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","751468800":"Start now","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","762926186":"A quick strategy is a ready-made strategy that you can use in Deriv Bot. There are 3 quick strategies you can choose from: Martingale, D'Alembert, and Oscar's Grind.","764366329":"Trading limits","766317539":"Language","770171141":"Go to {{hostname}}","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","792164271":"This is when your contract will expire based on the Duration or End time you’ve selected.","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.","812430133":"Spot price on the previous tick.","812775047":"below the barrier","814827314":"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.","815925952":"This block is mandatory. Only one copy of this block is allowed. It is added to the canvas by default when you open Deriv Bot.","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","821163626":"Server maintenance occurs every first Saturday of the month from 7 to 10 GMT time. You may experience service disruption during this time.","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","830703311":"My profile","830993327":"No current transactions available","832053636":"Document submission","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","835336137":"View Detail","835350845":"Add another word or two. Uncommon words are better.","836097457":"I am interested in trading but have very little experience.","837063385":"Do not send other currencies to this address.","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","840672750":"If this doesn’t work, uninstall and re-install the MT5 app. Then redo steps <0>2 and <0>3.","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 }}","848083350":"Your payout is equal to the <0>payout per point multiplied by the difference between the final price and the strike price. You will only earn a profit if your payout is higher than your initial stake.","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","869068127":"The cashier is temporarily down due to maintenance. It will be available as soon as the maintenance is complete.","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.","875101277":"If I close my web browser, will Deriv Bot continue to run?","875532284":"Restart process on a different device","876086855":"Complete the financial assessment form","876292912":"Exit","879014472":"Reached maximum number of decimals","879647892":"You may sell the contract up until 60 seconds before expiry. If you do, we’ll pay you the <0>contract value.","881963105":"(XAUUSD, XAGUSD)","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.","898904393":"Barrier:","900646972":"page.","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","909272635":"Financial - SVG","910888293":"Too many attempts","911048905":"(BTCUSD, ETHUSD)","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","922313275":"You're back online","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.","938947787":"Withdrawal {{currency}}","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","948176566":"New!","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","958430760":"In/Out","959031082":"set {{ variable }} to MACD Array {{ dropdown }} {{ dummy }}","960201789":"3. Sell conditions","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","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?","988064913":"4. Come back to Deriv Bot and add the Notify Telegram block to the workspace. Paste the Telegram API token and chat ID into the block fields accordingly.","988361781":"You have no trading activity yet.","988934465":"When prompted, you must enable camera access to continue","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 }}","997276809":"I confirm that the name and date of birth above match my chosen identity document","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.","1011424042":"{{text}}. stake<0/>","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}}.","1026289179":"Trade on the go","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","1033076894":"- current profit/loss: Use this variable to store the cumulative profit or loss while your bot is running. Set the initial value to 0.","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","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","1043790274":"There was an error","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","1050063303":"Videos on Deriv Bot","1050128247":"I confirm that I have verified the payment agent’s transfer information.","1050844889":"Reports","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.","1058804653":"Expiry","1060231263":"When are you required to pay an initial margin?","1061308507":"Purchase {{ contract_type }}","1062423382":"Explore the video guides and FAQs to build your bot in the tutorials tab.","1062536855":"Equals","1065275078":"cTrader is only available on desktop for now.","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","1087112394":"You must select the strike price before entering the contract.","1088031284":"Strike:","1088138125":"Tick {{current_tick}} - ","1089085289":"Mobile number","1089436811":"Tutorials","1089687322":"Stop your current bot?","1090041864":"The {{block_type}} block is mandatory and cannot be deleted/disabled.","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.","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.","1117281935":"Sell conditions (optional)","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","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.","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","1171961126":"trade parameters","1172524677":"CFDs Demo","1174542625":"- Find the chat ID property in the response, and copy the value of the id property","1174689133":"3. Set your trade parameters and hit Run.","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.","1192708099":"Duration unit","1195393249":"Notify {{ notification_type }} with sound: {{ notification_sound }} {{ input_message }}","1196006480":"Profit threshold","1196683606":"Deriv MT5 CFDs demo 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.","1208714859":"For Short:","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","1239752061":"In your cryptocurrency wallet, make sure to select the <0>{{network_name}} network when you transfer funds to Deriv.","1239760289":"Complete your trading assessment","1239940690":"Restarts the bot when an error is encountered.","1240027773":"Please Log in","1240688917":"Glossary","1241238585":"You may transfer between your Deriv fiat, cryptocurrency, and {{platform_name_mt5}} accounts.","1242288838":"Hit the checkbox above to choose your document.","1242994921":"Click here to start building your Deriv Bot.","1243064300":"Local","1243287470":"Transaction status","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","1253531007":"Confirmed","1254565203":"set {{ variable }} to create list with","1255827200":"You can also import or build your bot using any of these shortcuts.","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":"","1269296089":"Let's build a Bot!","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","1291997417":"Contracts will expire at exactly 23:59:59 GMT on your selected expiry date.","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","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","1309133590":"Earn a range of payouts by correctly predicting market movements with <0>options, or get the upside of CFDs without risking more than your initial stake with <1>multipliers.","1309186223":"- current stake: 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.","1310483610":"Results for \"{{ search_term }}\"","1311680770":"payout","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.","1323941798":"Short","1323996051":"Profile","1324922837":"2. The new variable will appear as a block under Set variable.","1325514262":"(licence no. MB/18/0024)","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","1340286510":"The bot has stopped, but your trade may still be running. You can check it on the Reports page.","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","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 }}","1356373528":"Run Deriv EZ on your browser","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","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","1375884086":"Financial, legal, or government document: recent bank statement, affidavit, or government-issued letter.","1376329801":"Last 60 days","1378419333":"Ether","1380349261":"Range","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.","1400732866":"View from camera","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.","1411373212":"Strong passwords contain at least 8 characters. combine uppercase and lowercase letters, numbers, and symbols.","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","1415513655":"Download cTrader on your phone to trade with the Deriv cTrader account","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","1434767075":"Get started on Deriv Bot","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}}","1469133110":"cTrader Windows app","1469150826":"Take Profit","1469764234":"Cashier Error","1469814942":"- Division","1470319695":"Returns either True or False","1471008053":"Deriv Bot isn't quite ready for real accounts","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","1488548367":"Upload again","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.","1509559328":"cTrader","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.","1513771077":"We're processing your withdrawal.","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","1527664853":"Your payout is equal to the payout per point multiplied by the difference between the final price and the strike price.","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","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","1555345325":"User Guide","1557426040":"Demo Derived SVG","1557682012":"Account Settings","1557904289":"We accept only these types of documents as proof of your address. The document must be recent (issued within last 6 months) and include your name and address:","1558972889":"set {{ variable }} to Simple Moving Average {{ dummy }}","1559220089":"Options and multipliers trading platform.","1560302445":"Copied","1562374116":"Students","1562982636":"Re-add your MT5 account using the same log in credentials.","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}})","1566717687":"We also provide a guide on the Tutorial tab to show you how you can build and execute a simple strategy.","1567076540":"Only use an address for which you have proof of residence - ","1567745852":"Bot name","1569624004":"Dismiss alert","1570484627":"Ticks list","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.","1574989243":"- trade again: Use this variable to stop trading when your loss limit is reached. Set the initial value to true.","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.","1598443642":"Transaction hash","1602894348":"Create a password","1604916224":"Absolute","1605222432":"I have no knowledge and experience in trading at all.","1605292429":"Max. total loss","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 }}","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.","1628981793":"Can I trade cryptocurrencies on Deriv Bot?","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.","1635628424":"An envelope with your name and address.","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.","1644636153":"Transaction hash: <0>{{value}}","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","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","1676549796":"Dynamic Leverage","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","1702339739":"Common mistakes","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.","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","1743679873":"If you select <0>\"Call\", you’ll earn a <1>payout if the <1>final price is above the <1>strike price at <1>expiry. Otherwise, you won’t receive a payout.","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","1768293340":"Contract value","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","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","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","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.","1856755117":"Pending action required","1856932069":"For Long:","1858251701":"minute","1859308030":"Give feedback","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","1865525612":"No recent transactions.","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","1871377550":"Do you offer pre-built trading bots on Deriv Bot?","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","1877832150":"# from end","1878172674":"No, we don't. However, you'll find quick strategies on Deriv Bot that'll help you build your own trading bot for free.","1879042430":"Appropriateness Test, WARNING:","1879412976":"Profit amount: <0>{{profit}}","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":"#","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.","1893869876":"(lots)","1894667135":"Please verify your proof of address","1898670234":"{{formatted_opening_time}} (GMT) on {{opening_day}},<0> {{opening_date}}.","1899898605":"Maximum size: 8MB","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.","1906213000":"Our system will finish any Deriv Bot trades that are running, and Deriv Bot will not place any new trades.","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","1908023954":"Sorry, an error occurred while processing your request.","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.","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*","1926987784":"- iOS: Swipe left on the account and tap <0>Delete.","1928930389":"GBP/NOK","1929309951":"Employment Status","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.","1938327673":"Deriv {{platform}} <0>{{is_demo}}","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","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","1973060793":"- maximum loss: Use this variable to store your maximum loss limit. You can assign any amount you want, but it must be a positive number.","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.","1986498784":"BTC/LTC","1987080350":"Demo","1987447369":"Your cashier is locked","1988153223":"Email address","1988302483":"Take profit:","1988601220":"Duration value","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.","1997313835":"Your stake will continue to grow as long as the current spot price remains within a specified <0>range from the <0>previous spot price. Otherwise, you lose your stake and the trade is terminated.","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. ","1999346412":"For faster verification, input the same address here as in your proof of address document (see section below)","2001222130":"Check your spam or junk folder. If it's not there, try resending the email.","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.","2010759971":"Uploads successful","2010866561":"Returns the total profit/loss","2011609940":"Please input number greater than 0","2011808755":"Purchase Time","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.","2021161151":"
Watch this video to learn how to build a trading bot on Deriv Bot. Also, check out this blog post on building a trading bot.","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","2029641956":"CFDCompareAccounts","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}}","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","2046577663":"Import or choose your bot","2048110615":"Email address*","2048134463":"File size exceeded.","2049386104":"We need you to submit these in order to get this account:","2050170533":"Tick list","2051558666":"View transaction history","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","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.","2070518923":"Import your bot or tap Quick Strategies to choose from the ready-to-use bot templates.","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.","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","2090650973":"The spot price may change by the time your order reaches our servers. When this happens, your payout may be affected.","2091671594":"Status","2093675079":"- Close: the closing price","2096014107":"Apply","2096456845":"Date of birth*","2096603244":"Derived - Vanuatu","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","2104364680":"Please switch to your demo account to run your Deriv Bot.","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","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","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","2147244655":"How do I import my own trading bot into Deriv Bot?","-1232613003":"<0>Verification failed. <1>Why?","-2029508615":"<0>Need verification.<1>Verify now","-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","-1823540512":"Personal details","-849320995":"Assessments","-773766766":"Email and passwords","-1466827732":"Self exclusion","-1498206510":"Account limits","-241588481":"Login history","-966136867":"Connected apps","-213009361":"Two-factor authentication","-526636259":"Error 404","-1227878799":"Speculative","-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.","-1120954663":"First name*","-1659980292":"First name","-962979523":"Your {{ field_name }} as in your identity document","-1416797980":"Please enter your {{ field_name }} as in your official identity documents.","-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","-1702919018":"Second line of address (optional)","-1315410953":"State/Province","-2040322967":"Citizenship","-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.","-946282997":"Additional information","-1315571766":"Place of birth","-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","-1387062433":"Account opening reason","-222283483":"Account opening reason*","-1113902570":"Details","-71696502":"Previous","-1541554430":"Next","-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}}","-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","-2145244263":"This field is required","-884768257":"You should enter 0-35 characters.","-1784470716":"State is not in a proper format","-1699820408":"Please enter a {{field_name}} under {{max_number}} characters.","-1575567374":"postal/ZIP code","-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.","-1174064217":"Mr","-855506127":"Ms","-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.","-1024240099":"Address","-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.","-179005984":"Save","-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}}","-839094775":"Back","-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","-1725454783":"Failed","-506510414":"Date and time","-1708927037":"IP address","-619126443":"Use the <0>Deriv password to log in to {{brand_website_name}} and {{platform_name_trader}}.","-623760979":"Use the <0>Deriv password to log in to {{brand_website_name}}, {{platform_name_trader}} and {{platform_name_go}}.","-459147994":"Use the <0>Deriv password to log in to {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} and {{platform_name_ctrader}}.","-80717068":"Apps you have linked to your <0>Deriv 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!","-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.","-612174191":"First line of address is required","-242734402":"Only {{max}} characters, please.","-378415317":"State is required","-1497654315":"Our accounts and services are unavailable for the Jersey postal code.","-755626951":"Complete your address details","-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","-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.","-212167954":"Tax Identification Number is not properly formatted.","-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.","-477761028":"Voter ID","-1466346630":"CPF","-1030759620":"Government Officers","-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","-138380129":"Total withdrawal allowed","-854023608":"To increase limit please verify your identity","-1500958859":"Verify","-1502578110":"Your account is fully authenticated and your withdrawal limits have been lifted.","-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.","-190838815":"We need this for verification. If the information you provide is fake or inaccurate, you won’t be able to deposit and withdraw.","-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","-1076138910":"Trade","-1666909852":"Payments","-488597603":"Trading information","-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.","-184202848":"Upload file","-1447142373":"Click here to upload.","-863586176":"Drag and drop a file or click to browse your files.","-723198394":"File size should be 8MB or less","-1948369500":"File uploaded is not supported","-1040865880":"Drop files here..","-1100235269":"Industry of employment","-684388823":"Estimated net worth","-509054266":"Anticipated annual turnover","-601903492":"Forex trading experience","-1012699451":"CFD trading experience","-1588485629":"Example","-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","-1176889260":"Please select a document type.","-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:","-155705811":"A clear colour photo or scanned image","-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","-705047643":"Sorry, an error occured. Please select another file.","-1664309884":"Tap here to 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.","-1265833982":"Accept","-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.","-818898181":"Name in document doesn’t match your Deriv profile.","-310316375":"Address in document doesn’t match address you entered above.","-485368404":"Document issued more than 6-months ago.","-367016488":"Blurry document. All information must be clear and visible.","-1957076143":"Cropped document. All information must be clear and visible.","-1515286538":"Please enter your document number. ","-1694758788":"Enter your document number","-1458676679":"You should enter 2-50 characters.","-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","-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.","-39038029":"Trading experience","-1894668798":"Other trading instruments experience","-1026468600":"Other trading instruments frequency","-1743024217":"Select Language","-1822545742":"Ether Classic","-1334641066":"Litecoin","-1214036543":"US Dollar","-1782590355":"No currency has been set for this account","-536187647":"Confirm revoke access?","-1357606534":"Permission","-570222048":"Revoke access","-1526404112":"Utility bill: electricity, water, gas, or landline phone bill.","-537552700":"Home rental agreement: valid and current agreement.","-890084320":"Save and submit","-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","-1255879419":"Trader's Hub","-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","-674118045":"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.","-145462920":"Deriv cTrader","-982095728":"Get","-1277942366":"Total assets","-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.","-1173266642":"This account offers CFDs on a feature-rich trading platform.","-1290112064":"Deriv EZ","-1453519913":"Trade CFDs on an easy-to-get-started platform with all your favourite assets.","-2051096382":"Earn a range of payouts by correctly predicting market movements with <0>options, or get the\n upside of CFDs without risking more than your initial stake with <1>multipliers.","-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","-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","-33612390":"<0>EU statutory disclaimer: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.","-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}}","-1975494965":"Cashier","-42592103":"Deposit cryptocurrencies","-60779216":"Withdrawals are temporarily unavailable due to system maintenance. You can make your withdrawals when the maintenance is complete.","-520142572":"Cashier is currently down for maintenance","-1552080215":"Please check back in a few minutes.<0>Thank you for your patience.","-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","-2024290965":"Confirmations","-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","-1838982691":"UNKNOWN","-532693866":"Something went wrong. Please refresh the page and try again.","-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","-1059419768":"Notes","-285921910":"Learn more about <0>payment methods.","-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","-1787304306":"Deriv P2P","-174976899":"P2P verification","-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","-1236567184":"This is your <0>{{regulation}}{{currency}} account {{loginid}}.","-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","-197251450":"Don't want to trade in {{currency_code}}? You can open another cryptocurrency account.","-91824739":"Deposit {{currency}}","-523804269":"{{amount}} {{currency}} on {{date}}","-494847428":"Address: <0>{{value}}","-1117977576":"Confirmations: <0>{{value}}","-1935946851":"View more","-1744490898":"Unfortunately, we cannot retrieve the information at this time. ","-515809216":"Send only {{currency_name}} ({{currency_code}}) to this address.","-1589407981":"To avoid loss of funds:","-1042704302":"Make sure to copy your Deriv account address correctly into your crypto wallet.","-80329359":"<0>Note: You’ll receive an email when your deposit start being processed.","-2108344100":"Looking for a way to buy cryptocurrencies? <0>Try Fiat onramp.","-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.","-314177745":"Unfortunately, we couldn't get the address since our server was down. Please click Refresh to reload the address or try again later.","-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.","-1866405488":"Deriv cTrader accounts","-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","-1155970854":"You have reached the maximum daily transfers. Please try again tomorrow.","-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.","-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.","-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.","-590765322":"Unfortunately, this trading platform is not available for EU Deriv account. Please switch to a non-EU account to continue trading.","-2110207996":"Deriv Bot is unavailable for this account","-971295844":"Switch to another account","-1194079833":"Deriv Bot is not available for EU clients","-1223145005":"Loss amount: {{profit}}","-1206212388":"Welcome back! Your messages have been restored. You are using your {{current_currency}} account.","-1724342053":"You are using your {{current_currency}} account.","-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.","-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","-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","-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","-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","-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","-1842451303":"Welcome to Deriv Bot!","-1391310674":"Check out these guides and FAQs to learn more about building your bot:","-2066779239":"FAQs","-280324365":"What is Deriv Bot?","-1016171176":"Asset","-621128676":"Trade type","-447853970":"Loss threshold","-507620484":"Unsaved","-764102808":"Google Drive","-555886064":"Won","-529060972":"Lost","-1696412885":"Import","-320197558":"Sort blocks","-1566369363":"Zoom out","-1285759343":"Search","-1291088318":"Purchase conditions","-112876186":"Analysis","-1769584466":"Stats","-1133736197":"Utility","-1682372359":"Text","-907562847":"Lists","-1646497683":"Loops","-251326965":"Miscellaneous","-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.","-1150107517":"Connect","-1150390589":"Last modified","-1393876942":"Your bots:","-767342552":"Enter your bot name, choose to save on your computer or Google Drive, and hit ","-1372891985":"Save.","-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","-683790172":"Now, <0>run the bot to test out the strategy.","-1127164953":"Hi! Hit <0>Start for a quick tour.","-358288026":"Note: You can also find this tutorial in the <0>Tutorials tab.","-1793577405":"Build from scratch","-358753028":"Create your bot using our drag-and-drop blocks or click Quick Strategy to choose from the ready-to-use bot templates.","-1212601535":"Monitor the market","-21136101":"See how your bot is doing in real-time.","-631097919":"Click <0>Run when you want to start trading, and click <0>Stop when you want to stop.","-1999747212":"Want to retake the tour?","-129587613":"Got it, thanks!","-782992165":"Step 1 :","-1207872534":"First, set the <0>Trade parameters block.","-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","-1109392787":"Learn how to build your bot from scratch using a simple strategy.","-1263822623":"You can 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.","-563921656":"Bot Builder guide","-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","-1778025545":"You’ve successfully imported a bot.","-1519425996":"No results found \"{{ faq_search_value }}\"","-155173714":"Let’s build a bot!","-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?","-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.","-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.","-1720444288":"How do I control my losses with Deriv Bot?","-1142295124":"There are several ways to control your losses with Deriv Bot. Here’s a simple example of how you can implement loss control in your strategy:","-986689483":"1. Create the following variables:","-269910127":"3. Update current profit/loss with the profit from the last contract. If the last contract was lost, the value of current profit/loss will be negative.","-1565344891":"Can I run Deriv Bot 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.","-213872712":"No, we don't offer cryptocurrencies on Deriv Bot.","-2147346223":"In which countries is Deriv Bot available?","-352345777":"What are the most popular strategies for automated trading?","-552392096":"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 Deriv Bot.","-418247251":"Download your journal.","-2123571162":"Download","-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.","-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.","-24780060":"When you’re ready to trade, hit ","-2147110353":". You’ll be able to track your bot’s performance here.","-2140412463":"Buy price","-1299484872":"Account","-2004386410":"Win","-266502731":"Transactions detailed summary","-1717650468":"Online","-1309011360":"Open positions","-1597214874":"Trade table","-1929724703":"Compare CFD accounts","-883103549":"Account deactivated","-1837059346":"Buy / Sell","-1845037007":"Advertiser's page","-494667560":"Orders","-679691613":"My ads","-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","-291535132":"Swap-Free Demo","-1472945832":"Swap-Free SVG","-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","-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","-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.","-493564794":"Please complete your financial assessment.","-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.","-2136953532":"Scheduled cashier maintenance","-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.","-420930276":"Follow these simple instructions to fix it.","-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.","-402093392":"Add Deriv Account","-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","-1323441180":"I hereby confirm that my request for opening an account with Deriv to trade OTC products issued and offered exclusively outside Brazil was initiated by me. I fully understand that Deriv is not regulated by CVM and by approaching Deriv I intend to set up a relation with a foreign company.","-1396326507":"Unfortunately, {{website_name}} is not available in your country.","-1019903756":"Synthetic","-288996254":"Unavailable","-735306327":"Manage accounts","-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","-2061807537":"Something’s not right","-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?","-1342699195":"Total profit/loss:","-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.","-1825471709":"A whole new trading experience on a powerful yet easy to use platform.","-981017278":"Automated trading at your fingertips. No coding needed.","-778309978":"The link you clicked has expired. Ensure to click the link in the latest email in your inbox. Alternatively, enter your email below and click <0>Resend email for a new link.","-336222114":"Follow these simple steps to fix it:","-1064116456":"Search for the broker <0>Deriv Holdings (Guernsey) Limited and select it.","-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+","-523602297":"Forex majors","-1303090739":"Up to 1:1500","-19213603":"Metals","-1728334460":"Up to 1:300","-646902589":"(US_30, US_100, US_500)","-1835174654":"1:30","-1647612934":"Spreads from","-1587894214":"about verifications needed.","-466784048":"Regulator/EDR","-1920034143":"Synthetics, Baskets and Derived FX","-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.","-931599668":"ETF","-651501076":"Derived - SVG","-865172869":"Financial - BVI","-1851765767":"Financial - Vanuatu","-558597854":"Financial - Labuan","-2052425142":"Swap-Free - SVG","-1192904361":"Deriv X Demo","-1269597956":"MT5 Platform","-239789243":"(License no. SIBA/L/18/1114)","-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","-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","-1769852749":"N/A","-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.","-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.","-1922462747":"Trader's hub","-700260448":"demo","-1769158315":"real","-2015785957":"Compare CFDs {{demo_title}} 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.","-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","-1318070255":"EUR/GBP","-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","-941636117":"MetaTrader 5 Linux app","-637537305":"Download {{ platform }} on your phone to trade with the {{ platform }} {{ account }} account","-678964540":"to","-206829624":"(1:x)","-616293830":"Enjoy dynamic leverage of <0>up to 1:1500 when trading selected instruments in the forex, commodities, cryptocurrencies, and stock indices markets. Our dynamic leverage adjusts automatically to your trading position, based on asset type and trading volume.","-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","-21438174":"Add your Deriv cTrader account under Deriv (SVG) LLC (company no. 273 LLC 2020).","-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).","-271828350":"Get more out of Deriv MT5 Financial","-2125860351":"Choose a jurisdiction for your Deriv MT5 CFDs 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","-525896186":"Download Deriv GO on your phone to trade with the Deriv EZ account","-1547458328":"Run cTrader on your browser","-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.","-35790392":"Scan the QR code to download {{Deriv}} {{ platform }}.","-1282933308":"Not {{barrier}}","-968190634":"Equals {{barrier}}","-1747377543":"Under {{barrier}}","-256210543":"Trading is unavailable at this time.","-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.","-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","-2035315547":"Low barrier","-1551639437":"No history","-1214703885":"You have yet to update either take profit or stop loss","-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","-1043795232":"Recent positions","-1511825574":"Profit/Loss:","-726626679":"Potential profit/loss:","-338379841":"Indicative price:","-1572796316":"Purchase price:","-447037544":"Buy price:","-1694314813":"Contract value:","-153220091":"{{display_value}} Tick","-802374032":"Hour","-2039780875":"Purchase confirmation","-1672470173":"Require confirmation before purchasing a contract","-1342661765":"Lock contract purchase buttons","-1382749084":"Go back to trading","-1231210510":"Tick","-1239477911":"second","-1585766960":"min","-1652791614":"mins","-1977959027":"hours","-442488432":"day","-337314714":"days","-8998663":"Digit: {{last_digit}} ","-1435392215":"About deal cancellation","-2017825013":"Got it","-1192773792":"Don't show this again","-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","-338707425":"Minimum duration is 1 day","-1003473648":"Duration: {{duration}} day","-740702998":"<0>{{title}} {{message}}","-1669741470":"The payout at expiry is equal to the payout per point multiplied by the difference between the final price and the strike price.","-1527492178":"Purchase Locked","-725375562":"You can lock/unlock the purchase button from the Settings menu","-774638412":"Stake must be between {{min_stake}} {{currency}} and {{max_stake}} {{currency}}","-1358367903":"Stake","-434270664":"Current Price","-1956787775":"Barrier Price:","-1513281069":"Barrier 2","-390994177":"Should be between {{min}} and {{max}}","-1804019534":"Expiry: {{date}}","-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","-2131851017":"Growth rate","-1763848396":"Put","-194424366":"above","-857660728":"Strike Prices","-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","-439389714":"We’re working on it","-770929448":"Go to {{platform_name_smarttrader}}","-347156282":"Submit Proof","-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.","-1738427539":"Purchase","-1937372493":"You can close your trade anytime. However, be aware of <0>slippage risk<0/>.","-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.","-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.","-1192494358":"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.","-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.","-1576967286":"This product allows you to express a strong bullish or bearish view on an underlying asset.","-610471235":"If you think the market price will rise continuously for a specific period, choose <0>Long. You will get a payout at the expiry time if the market price doesn’t touch or cross below the barrier. Your payout will grow proportionally to the distance between the market price and the barrier if the barrier is not breached. You will start making a profit when the payout is higher than your stake. If the market price ever crosses the barrier, there won’t be a payout.","-454245976":"If you think the market price will drop continuously for a specific period, choose <0>Short. You will get a payout at the expiry time if the market price doesn’t touch or cross above the barrier. Your payout will grow proportionally to the distance between the market price and the barrier if the barrier is not breached. You will start making a profit when the payout is higher than your stake. If the market price ever crosses the barrier, there won’t be a payout.","-351875097":"Number of ticks","-729830082":"View less","-1790089996":"NEW!","-993480898":"Accumulators","-45873457":"NEW","-1422269966":"You can choose a growth rate with values of 1%, 2%, 3%, 4%, and 5%.","-1186791513":"Payout is the sum of your initial stake and profit.","-1682624802":"It is a percentage of the previous spot price. The percentage rate is based on your choice of the index and the growth rate.","-1221049974":"Final price","-1247327943":"This is the spot price of the last tick at expiry.","-878534036":"If you select \"Call\", you’ll earn a payout if the final price is above the strike price at expiry. Otherwise, you won’t receive a payout.","-1587076792":"If you select \"Put\", you’ll earn a payout if the final price is below the strike price at expiry. Otherwise, you won’t receive a payout.","-1482134885":"We calculate this based on the strike price and duration you’ve selected.","-1890561510":"Cut-off time","-565990678":"Your contract will expire on this date (in GMT), based on the End time you’ve selected.","-127118348":"Choose {{contract_type}}","-543478618":"Try checking your spelling or use a different term","-700280380":"Deal cancel. fee","-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.","-438655760":"<0>Note: You can close your trade anytime. Be aware of slippage risk.","-1683683754":"Long","-1046859144":"<0>{{title}} You will get a payout if the market price stays {{price_position}} and doesn't touch or cross the barrier. Otherwise, your payout will be zero.","-1815023694":"above the barrier","-243332856":"Last digit stats for latest 1000 ticks for {{ underlying_name }}","-1572548510":"Ups & Downs","-71301554":"Ins & Outs","-952298801":"Look Backs","-763273340":"Digits","-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","-1072292603":"No Change","-1631669591":"string","-1768939692":"number","-795152863":"green","-1640576332":"blue","-804983649":"yellow","-94281841":"red","-1242470654":"Earned money","-841561409":"Put Spread","-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","-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.","-462715374":"Untitled Bot","-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","-985351204":"Trade again","-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.","-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 }}","-1374685318":"Your contract is closed automatically when your loss is more than or equals to this amount. This block can only be used with the multipliers trade type.","-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","-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","-1919680487":"workspace","-1703118772":"The {{block_type}} block is misplaced from {{missing_space}}.","-1785726890":"purchase conditions","-538215347":"Net deposits","-280147477":"All transactions","-137444201":"Buy","-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","-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.","-1226595254":"Turbos","-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","-113940416":"Current stake:","-1999539705":"Deal cancel. fee:","-155989831":"Decrement value","-1167474366":"Tick ","-2027409966":"Initial stake:","-1525144993":"Payout limit:","-1669418686":"AUD/CAD","-1548588249":"AUD/CHF","-1552890620":"AUD/JPY","-681231560":"AUD/PLN","-64938413":"AUD/USD","-1430522808":"EUR/AUD","-2020477069":"EUR/CAD","-1201853162":"EUR/CHF","-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","-1715390759":"I want to do this later","-2092611555":"Sorry, this app is unavailable in your current location.","-1488537825":"If you have an account, log in to continue.","-1603581277":"minutes","-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","2091451":"Deriv Bot - your automated trading partner","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.","9488203":"Deriv Bot 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'.","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","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","49404821":"If you buy a \"<0>{{trade_type}}\" option, you receive a payout at expiry if the final price is {{payout_status}} the strike price. Otherwise, your “<0>{{trade_type}}” option will expire worthless.","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","56764670":"Deriv Bot 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.","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","67923436":"No, Deriv Bot will stop running when your web browser is closed.","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.","74836780":"{{currency_code}} Wallet","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.","76925355":"Check your bot’s performance","77945356":"Trade on the go with our mobile app.","77982950":"Vanilla options allow you to predict an upward (bullish) or downward (bearish) direction of the underlying asset by purchasing a \"Call\" or a \"Put\".","81091424":"To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.","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.","93939827":"Cryptocurrency accounts","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.","110822969":"One Wallet for all your transactions","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","117056711":"We’re updating our site","117318539":"Password should have lower and uppercase English letters with numbers.","118158064":"2. Use a logic block to check if current profit/loss exceeds maximum loss. If it does, set trade again to false to prevent the bot from running another cycle.","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","133284316":"Supported formats: JPEG, JPG, PNG, PDF and GIF only","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","149616444":"cTrader Demo","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 }}","157871994":"Link expired","158355408":"Some services may be temporarily unavailable.","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","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","176327749":"- Android: Tap the account, open <0>Options, and tap <0>Delete.","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","196810983":"If the duration is more than 24 hours, the Cut-off time and Expiry date will apply instead.","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","203108063":"Congratulations, you have successfully created your {{category}} <0>{{platform}} <1>{{type}} account. ","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.","203924654":"Hit the <0>Start button to begin and follow the tutorial.","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.","212871086":"Coming soon on mobile","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","220019594":"Need more help? Contact us through live chat for assistance.","220186645":"Text Is empty","220232017":"demo CFDs","221261209":"A Deriv account will allow you to fund (and withdraw from) your CFDs account(s).","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.","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 }}","246428134":"Step-by-step guides","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.","248153700":"Reset your password","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","256123827":"What happens to my trading accounts","256602726":"If you close your account:","258026201":"<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.","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.","262095250":"If you select <0>\"Put\", you’ll earn a payout if the final price is below the strike price at expiry. Otherwise, you won’t receive a payout.","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","280021988":"Use these shortcuts","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","285909860":"Demo {{currency}} Wallet","287934290":"Are you sure you want to cancel this transaction?","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","295173783":"Long/Short","296017162":"Back to Bot","301441673":"Select your citizenship/nationality as it appears on your passport or other government-issued ID.","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.","310234308":"Close all your positions.","312142140":"Save new limits?","312300092":"Trims the spaces within a given string or text.","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.","321457615":"Oops, something went wrong!","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.","346214602":"A better way to manage your funds","347029309":"Forex: standard/micro","347039138":"Iterate (2)","347217485":"Trouble accessing Deriv MT5 on your mobile?","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","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","377231893":"Deriv Bot is unavailable in the EU","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.","398816980":"Launch {{platform_name_trader}} in seconds the next time you want to trade.","401339495":"Verify address","401345454":"Head to the Tutorials tab to do so.","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:","403608958":"Select a trading account or a Wallet","404743411":"Total deposits","406359555":"Contract details","406497323":"Sell your active contract if needed (optional)","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.","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","419496000":"Your contract is closed automatically when your profit is more than or equals to this amount. This block can only be used with the multipliers trade type.","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:","431267979":"Here’s a quick guide on how to use Deriv Bot on the go.","431654991":"<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.","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.","436534334":"<0>We've sent you an email.","437138731":"Create a new {{platform}} password","437453244":"Choose your preferred cryptocurrency","437485293":"File type not supported","437904704":"Maximum open positions","438067535":"Over $500,000","439398769":"This strategy is currently not compatible with Deriv Bot.","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:","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/>","483551811":"Your <0>payout is the sum of your inital stake and profit.","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","498562439":"or","499522484":"1. for \"string\": 1325.68 USD","500215405":"Server maintenance starts at 01:00 GMT every Sunday and may last up to 2 hours. You may experience service disruption during this time.","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","511679687":"Accumulators allow you to express a view on the range of movement of an index and grow your stake exponentially at a fixed <0>growth rate.","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","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","530864956":"Deriv Apps","530953413":"Authorised applications","531114081":"3. Contract Type","531675669":"Euro","535041346":"Max. total stake per day","537788407":"Other CFDs Platform","538017420":"0.5 pips","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","549479175":"Deriv Multipliers","549799607":"Go to LiveChat","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.","551550548":"Your balance has been reset to 10,000.00 USD.","551569133":"Learn more about trading limits","554135844":"Edit","554410233":"This is a top-10 common password","554777712":"Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.","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","558262475":"On your MT5 mobile app, delete your existing Deriv account:","558866810":"Run your bot","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?","575702000":"Remember, selfies, pictures of houses, or non-related images will be rejected.","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","592087722":"Employment status is required.","593459109":"Try a different currency","594937260":"Derived - BVI","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.","603899222":"Distance to current spot","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.","617910072":"Use your Deriv account email and password to login into the {{ platform }} platform.","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)","624668261":"You’ve just stopped the bot. Any open contracts can be viewed on the <0>Reports page.","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.","635884758":"Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.","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.","645902266":"EUR/NZD","647039329":"Proof of address required","647745382":"Input List {{ input_list }}","648035589":"Other CFD Platforms","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.","656296740":"While “Deal cancellation” is active:","656893085":"Timestamp","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","672731171":"Non-EU USD accounts","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","681808253":"Previous spot price","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?","687193018":"Slippage risk","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.","692354762":"Please enter your {{document_name}}. {{example_format}}","693396140":"Deal cancellation (expired)","694035561":"Trade options multipliers","694089159":"Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.","696870196":"- Open time: the opening time stamp","697630556":"This market is presently closed.","698037001":"National Identity Number","699159918":"1. Filing complaints","699646180":"A minimum deposit value of <0>{{minimum_deposit}} {{currency}} is required. Otherwise, the funds will be lost and cannot be recovered.","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)","702561961":"Change theme","705262734":"Your Wallets are ready","705299518":"Next, upload the page of your passport that contains your photo.","706727320":"Binary options trading frequency","706755289":"This block performs trigonometric functions.","706960383":"We’ll offer to buy your contract at this price should you choose to sell it before its expiry. This is based on several factors, such as the current spot price, duration, etc. However, we won’t offer a contract value if the remaining duration is below 60 seconds.","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","722797282":"EU-regulated USD accounts","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.","724526379":"Learn more with our tutorials","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","742570452":"<0>Deriv P2P is unavailable in Wallets at this time.","742676532":"Trade CFDs on forex, derived indices, cryptocurrencies, and commodities with high leverage.","743623600":"Reference","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","751468800":"Start now","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","762926186":"A quick strategy is a ready-made strategy that you can use in Deriv Bot. There are 3 quick strategies you can choose from: Martingale, D'Alembert, and Oscar's Grind.","764366329":"Trading limits","766317539":"Language","770171141":"Go to {{hostname}}","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","782563319":"Add more Wallets","783974693":"Avoid recent years","784311461":"Exponential Moving Average (EMA)","784583814":"Linked to your computer","785969488":"Jump 75 Index","787727156":"Barrier","788005234":"NA","792164271":"This is when your contract will expire based on the Duration or End time you’ve selected.","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.","812430133":"Spot price on the previous tick.","812775047":"below the barrier","814827314":"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.","815925952":"This block is mandatory. Only one copy of this block is allowed. It is added to the canvas by default when you open Deriv Bot.","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","821163626":"Server maintenance occurs every first Saturday of the month from 7 to 10 GMT time. You may experience service disruption during this time.","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","830703311":"My profile","830993327":"No current transactions available","832053636":"Document submission","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","835336137":"View Detail","835350845":"Add another word or two. Uncommon words are better.","836097457":"I am interested in trading but have very little experience.","837063385":"Do not send other currencies to this address.","837066896":"Your document is being reviewed, please check back in 1-3 days.","839805709":"To smoothly verify you, we need a better photo","840672750":"If this doesn’t work, uninstall and re-install the MT5 app. Then redo steps <0>2 and <0>3.","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 }}","848083350":"Your payout is equal to the <0>payout per point multiplied by the difference between the final price and the strike price. You will only earn a profit if your payout is higher than your initial stake.","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","869068127":"The cashier is temporarily down due to maintenance. It will be available as soon as the maintenance is complete.","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.","875101277":"If I close my web browser, will Deriv Bot continue to run?","875532284":"Restart process on a different device","876086855":"Complete the financial assessment form","876292912":"Exit","879014472":"Reached maximum number of decimals","879647892":"You may sell the contract up until 60 seconds before expiry. If you do, we’ll pay you the <0>contract value.","881963105":"(XAUUSD, XAGUSD)","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.","898904393":"Barrier:","900646972":"page.","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","909272635":"Financial - SVG","910888293":"Too many attempts","911048905":"(BTCUSD, ETHUSD)","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","922313275":"You're back online","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.","938947787":"Withdrawal {{currency}}","938988777":"High barrier","943535887":"Please close your positions in the following Deriv MT5 account(s):","944499219":"Max. open positions","945532698":"Contract sold","945753712":"Back to Trader’s Hub","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.","947046137":"Your withdrawal will be processed within 24 hours","947363256":"Create list","947758334":"City is required","947914894":"Top up  <0>","948156236":"Create {{type}} password","948176566":"New!","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","958430760":"In/Out","959031082":"set {{ variable }} to MACD Array {{ dropdown }} {{ dummy }}","960201789":"3. Sell conditions","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","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?","988064913":"4. Come back to Deriv Bot and add the Notify Telegram block to the workspace. Paste the Telegram API token and chat ID into the block fields accordingly.","988361781":"You have no trading activity yet.","988934465":"When prompted, you must enable camera access to continue","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 }}","997276809":"I confirm that the name and date of birth above match my chosen identity document","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.","1011424042":"{{text}}. stake<0/>","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}}.","1026289179":"Trade on the go","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","1033076894":"- current profit/loss: Use this variable to store the cumulative profit or loss while your bot is running. Set the initial value to 0.","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","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","1043790274":"There was an error","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","1050063303":"Videos on Deriv Bot","1050128247":"I confirm that I have verified the payment agent’s transfer information.","1050844889":"Reports","1052779010":"You are on your demo account","1052921318":"{{currency}} Wallet","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.","1058804653":"Expiry","1060231263":"When are you required to pay an initial margin?","1061308507":"Purchase {{ contract_type }}","1062423382":"Explore the video guides and FAQs to build your bot in the tutorials tab.","1062536855":"Equals","1065275078":"cTrader is only available on desktop for now.","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","1087112394":"You must select the strike price before entering the contract.","1088031284":"Strike:","1088138125":"Tick {{current_tick}} - ","1089085289":"Mobile number","1089436811":"Tutorials","1089687322":"Stop your current bot?","1090041864":"The {{block_type}} block is mandatory and cannot be deleted/disabled.","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.","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.","1113221217":"MT5 Swap-free","1113292761":"Less than 8MB","1114679006":"You have successfully created your bot using a simple strategy.","1117281935":"Sell conditions (optional)","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","1134879544":"Example of a document with glare","1138126442":"Forex: standard","1139483178":"Enable stack","1141383005":"Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.","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.","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","1171961126":"trade parameters","1172524677":"CFDs Demo","1174542625":"- Find the chat ID property in the response, and copy the value of the id property","1174689133":"3. Set your trade parameters and hit Run.","1174748431":"Payment channel","1175183064":"Vanuatu","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с.","1183448523":"<0>We're setting up your Wallets","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.","1192708099":"Duration unit","1195393249":"Notify {{ notification_type }} with sound: {{ notification_sound }} {{ input_message }}","1196006480":"Profit threshold","1196683606":"Deriv MT5 CFDs demo 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\".","1204834928":"We'll connect your existing USD trading account(s) to your new USD Wallet ","1206227936":"How to mask your card?","1206821331":"Armed Forces","1207152000":"Choose a template and set your trade parameters.","1208714859":"For Short:","1208729868":"Ticks","1208903663":"Invalid token","1209914202":"Get a Wallet, add funds, trade","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","1226027513":"Transfer from","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","1233376285":"Options & multipliers","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","1239752061":"In your cryptocurrency wallet, make sure to select the <0>{{network_name}} network when you transfer funds to Deriv.","1239760289":"Complete your trading assessment","1239940690":"Restarts the bot when an error is encountered.","1240027773":"Please Log in","1240688917":"Glossary","1241238585":"You may transfer between your Deriv fiat, cryptocurrency, and {{platform_name_mt5}} accounts.","1242288838":"Hit the checkbox above to choose your document.","1242994921":"Click here to start building your Deriv Bot.","1243064300":"Local","1243287470":"Transaction status","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","1253531007":"Confirmed","1254565203":"set {{ variable }} to create list with","1255827200":"You can also import or build your bot using any of these shortcuts.","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":"","1269296089":"Let's build a Bot!","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","1283807218":"Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.","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: ","1291997417":"Contracts will expire at exactly 23:59:59 GMT on your selected expiry date.","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","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","1309133590":"Earn a range of payouts by correctly predicting market movements with <0>options, or get the upside of CFDs without risking more than your initial stake with <1>multipliers.","1309186223":"- current stake: 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.","1310483610":"Results for \"{{ search_term }}\"","1311680770":"payout","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.","1323941798":"Short","1323996051":"Profile","1324922837":"2. The new variable will appear as a block under Set variable.","1325514262":"(licence no. MB/18/0024)","1327181172":"Financial Vanuatu","1327494533":"{{sell_value}} (Sell)","1329136554":"Jump 200 Index","1329325646":"The content of this block is called on every tick","1330479159":"Ready to upgrade?","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","1340286510":"The bot has stopped, but your trade may still be running. You can check it on the Reports page.","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","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 }}","1356373528":"Run Deriv EZ on your browser","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","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","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","1375884086":"Financial, legal, or government document: recent bank statement, affidavit, or government-issued letter.","1376329801":"Last 60 days","1378419333":"Ether","1380349261":"Range","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.","1400732866":"View from camera","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.","1411373212":"Strong passwords contain at least 8 characters. combine uppercase and lowercase letters, numbers, and symbols.","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","1415513655":"Download cTrader on your phone to trade with the Deriv cTrader account","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","1434767075":"Get started on Deriv Bot","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.","1435368624":"Get one Wallet, get several {{dash}} your choice","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}}","1469133110":"cTrader Windows app","1469150826":"Take Profit","1469764234":"Cashier Error","1469814942":"- Division","1470319695":"Returns either True or False","1471008053":"Deriv Bot isn't quite ready for real accounts","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","1481860194":"Your new Wallet(s)","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","1488548367":"Upload again","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.","1506251760":"Wallets","1509559328":"cTrader","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.","1513771077":"We're processing your withdrawal.","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","1527664853":"Your payout is equal to the payout per point multiplied by the difference between the final price and the strike price.","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","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","1555345325":"User Guide","1557426040":"Demo Derived SVG","1557682012":"Account Settings","1557904289":"We accept only these types of documents as proof of your address. The document must be recent (issued within last 6 months) and include your name and address:","1558972889":"set {{ variable }} to Simple Moving Average {{ dummy }}","1559220089":"Options and multipliers trading platform.","1560302445":"Copied","1562374116":"Students","1562982636":"Re-add your MT5 account using the same log in credentials.","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}})","1566717687":"We also provide a guide on the Tutorial tab to show you how you can build and execute a simple strategy.","1567076540":"Only use an address for which you have proof of residence - ","1567745852":"Bot name","1569624004":"Dismiss alert","1570484627":"Ticks list","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.","1574989243":"- trade again: Use this variable to stop trading when your loss limit is reached. Set the initial value to true.","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","1577879664":"<0>Your Wallets are ready","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.","1598443642":"Transaction hash","1602894348":"Create a password","1604916224":"Absolute","1605222432":"I have no knowledge and experience in trading at all.","1605292429":"Max. total loss","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 }}","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.","1628981793":"Can I trade cryptocurrencies on Deriv Bot?","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.","1635628424":"An envelope with your name and address.","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.","1644636153":"Transaction hash: <0>{{value}}","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.","1645315784":"{{display_currency_code}} Wallet","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.","1650963565":"Introducing Wallets","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","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","1666783057":"Upgrade now","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.","1676549796":"Dynamic Leverage","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","1702339739":"Common mistakes","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","1709293836":"Wallet balance","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.","1720968545":"Upload passport photo page from your computer","1723069433":"Your new Wallet","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","1743679873":"If you select <0>\"Call\", you’ll earn a <1>payout if the <1>final price is above the <1>strike price at <1>expiry. Otherwise, you won’t receive a payout.","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","1768293340":"Contract value","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","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","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.","1844458194":"You can only transfers funds from the {{account}} to the linked {{wallet}}.","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","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.","1856755117":"Pending action required","1856932069":"For Long:","1858251701":"minute","1859308030":"Give feedback","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","1865525612":"No recent transactions.","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","1871377550":"Do you offer pre-built trading bots on Deriv Bot?","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","1877832150":"# from end","1878172674":"No, we don't. However, you'll find quick strategies on Deriv Bot that'll help you build your own trading bot for free.","1879042430":"Appropriateness Test, WARNING:","1879412976":"Profit amount: <0>{{profit}}","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":"#","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.","1893869876":"(lots)","1894667135":"Please verify your proof of address","1898670234":"{{formatted_opening_time}} (GMT) on {{opening_day}},<0> {{opening_date}}.","1899898605":"Maximum size: 8MB","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.","1906213000":"Our system will finish any Deriv Bot trades that are running, and Deriv Bot will not place any new trades.","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","1908023954":"Sorry, an error occurred while processing your request.","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.","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*","1926987784":"- iOS: Swipe left on the account and tap <0>Delete.","1928930389":"GBP/NOK","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.","1938327673":"Deriv {{platform}} <0>{{is_demo}}","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","1948044825":"MT5 Derived","1948092185":"GBP/CAD","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","1973060793":"- maximum loss: Use this variable to store your maximum loss limit. You can assign any amount you want, but it must be a positive number.","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.","1986498784":"BTC/LTC","1987080350":"Demo","1987447369":"Your cashier is locked","1988153223":"Email address","1988302483":"Take profit:","1988601220":"Duration value","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.","1997313835":"Your stake will continue to grow as long as the current spot price remains within a specified <0>range from the <0>previous spot price. Otherwise, you lose your stake and the trade is terminated.","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. ","1999346412":"For faster verification, input the same address here as in your proof of address document (see section below)","2001222130":"Check your spam or junk folder. If it's not there, try resending the email.","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.","2010759971":"Uploads successful","2010866561":"Returns the total profit/loss","2011609940":"Please input number greater than 0","2011808755":"Purchase Time","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.","2020104747":"Filter","2020545256":"Close your account?","2021037737":"Please update your details to continue.","2021161151":"Watch this video to learn how to build a trading bot on Deriv Bot. Also, check out this blog post on building a trading bot.","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}}","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","2046577663":"Import or choose your bot","2048110615":"Email address*","2048134463":"File size exceeded.","2049386104":"We need you to submit these in order to get this account:","2050170533":"Tick list","2051558666":"View transaction history","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","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","2066419724":"Trading accounts linked with {{wallet}}","2067903936":"Driving licence","2070002739":"Don’t accept","2070345146":"When opening a leveraged CFD trade.","2070518923":"Import your bot or tap Quick Strategies to choose from the ready-to-use bot templates.","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}}","2080906200":"I understand and agree to upgrade to Wallets.","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.","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","2090650973":"The spot price may change by the time your order reaches our servers. When this happens, your payout may be affected.","2091671594":"Status","2093675079":"- Close: the closing price","2096014107":"Apply","2096456845":"Date of birth*","2096603244":"Derived - Vanuatu","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","2104364680":"Please switch to your demo account to run your Deriv Bot.","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","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","2119449126":"Example output of the below example will be:","2119710534":"FAQ","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","2147244655":"How do I import my own trading bot into Deriv Bot?","-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","-1823540512":"Personal details","-849320995":"Assessments","-773766766":"Email and passwords","-1466827732":"Self exclusion","-1498206510":"Account limits","-241588481":"Login history","-966136867":"Connected apps","-213009361":"Two-factor authentication","-526636259":"Error 404","-1227878799":"Speculative","-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.","-1120954663":"First name*","-1659980292":"First name","-962979523":"Your {{ field_name }} as in your identity document","-1416797980":"Please enter your {{ field_name }} as in your official identity documents.","-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","-1702919018":"Second line of address (optional)","-1315410953":"State/Province","-2040322967":"Citizenship","-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.","-946282997":"Additional information","-1315571766":"Place of birth","-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","-1387062433":"Account opening reason","-222283483":"Account opening reason*","-1113902570":"Details","-71696502":"Previous","-1541554430":"Next","-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.⁤","-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.","-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","-2145244263":"This field is required","-884768257":"You should enter 0-35 characters.","-1784470716":"State is not in a proper format","-1699820408":"Please enter a {{field_name}} under {{max_number}} characters.","-1575567374":"postal/ZIP code","-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.","-1174064217":"Mr","-855506127":"Ms","-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.","-1024240099":"Address","-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.","-179005984":"Save","-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}}","-839094775":"Back","-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","-1725454783":"Failed","-506510414":"Date and time","-1708927037":"IP address","-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!","-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.","-612174191":"First line of address is required","-242734402":"Only {{max}} characters, please.","-378415317":"State is required","-1497654315":"Our accounts and services are unavailable for the Jersey postal code.","-755626951":"Complete your address details","-1461267236":"Please choose your currency","-1027595143":"Less than $25,000","-40491332":"$25,000 - $50,000","-1139806939":"$50,001 - $100,000","-996132458":"Construction","-915003867":"Health","-1430012453":"Information & Communications Technology","-987824916":"Science & Engineering","-146630682":"Social & Cultural","-761306973":"Manufacturing","-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","-1030759620":"Government Officers","-2137323480":"Company Ownership","-1590574533":"Divorce Settlement","-1667683002":"Inheritance","-1237843731":"Investment Income","-777506574":"Sale of Property","-654781670":"Primary","-1717373258":"Secondary","-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","-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.","-212167954":"Tax Identification Number is not properly formatted.","-621555159":"Identity information","-204765990":"Terms of use","-477761028":"Voter ID","-1466346630":"CPF","-739367071":"Employed","-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","-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","-138380129":"Total withdrawal allowed","-854023608":"To increase limit please verify your identity","-1500958859":"Verify","-1502578110":"Your account is fully authenticated and your withdrawal limits have been lifted.","-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.","-594456225":"Second line of address","-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","-1076138910":"Trade","-1666909852":"Payments","-488597603":"Trading information","-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.","-184202848":"Upload file","-1447142373":"Click here to upload.","-863586176":"Drag and drop a file or click to browse your files.","-723198394":"File size should be 8MB or less","-1948369500":"File uploaded is not supported","-1040865880":"Drop files here..","-1100235269":"Industry of employment","-684388823":"Estimated net worth","-509054266":"Anticipated annual turnover","-1588485629":"Example","-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","-1176889260":"Please select a document type.","-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:","-155705811":"A clear colour photo or scanned image","-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","-705047643":"Sorry, an error occured. Please select another file.","-1664309884":"Tap here to 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.","-1265833982":"Accept","-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.","-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.","-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.","-1125193491":"Add account","-2068229627":"I am not a PEP, and I have not been a PEP in the last 12 months.","-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}}","-428335668":"You will need to set a password to complete the process.","-1232613003":"<0>Verification failed. <1>Why?","-2029508615":"<0>Need verification.<1>Verify now","-818898181":"Name in document doesn’t match your Deriv profile.","-310316375":"Address in document doesn’t match address you entered above.","-485368404":"Document issued more than 6-months ago.","-367016488":"Blurry document. All information must be clear and visible.","-1957076143":"Cropped document. All information must be clear and visible.","-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.","-1515286538":"Please enter your document number. ","-1694758788":"Enter your document number","-1458676679":"You should enter 2-50 characters.","-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","-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.","-39038029":"Trading experience","-601903492":"Forex trading experience","-1012699451":"CFD trading experience","-1894668798":"Other trading instruments experience","-1026468600":"Other trading instruments frequency","-1743024217":"Select Language","-1822545742":"Ether Classic","-1334641066":"Litecoin","-1214036543":"US Dollar","-1782590355":"No currency has been set for this account","-536187647":"Confirm revoke access?","-1357606534":"Permission","-570222048":"Revoke access","-80717068":"Apps you have linked to your <0>Deriv password:","-340060402":"Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.","-619126443":"Use the <0>Deriv password to log in to {{brand_website_name}} and {{platform_name_trader}}.","-623760979":"Use the <0>Deriv password to log in to {{brand_website_name}}, {{platform_name_trader}} and {{platform_name_go}}.","-459147994":"Use the <0>Deriv password to log in to {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} and {{platform_name_ctrader}}.","-1526404112":"Utility bill: electricity, water, gas, or landline phone bill.","-537552700":"Home rental agreement: valid and current agreement.","-890084320":"Save and submit","-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","-1186807402":"Transfer","-224804428":"Transactions","-470018967":"Reset balance","-693105141":"MT5 Financial","-1290112064":"Deriv EZ","-145462920":"Deriv cTrader","-882362166":"Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.","-1186915014":"Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.","-1533139744":"Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.","-549933762":"Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.","-714679884":"Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.","-794619351":"Deposit and withdraw funds via authorised, independent payment agents.","-1856204727":"Reset","-213142918":"Deposits and withdrawals temporarily unavailable ","-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","-674118045":"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.","-982095728":"Get","-124150034":"Reset balance to 10,000.00 USD","-677271147":"Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.","-1829666875":"Transfer funds","-1504456361":"CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.","-33612390":"<0>EU statutory disclaimer: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.","-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.","-1320592007":"Upgrade to Wallets","-1283678015":"This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.","-417529381":"Your current trading account(s)","-1842223244":"This is how we link your accounts with your new Wallet.","-437170875":"Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.","-2055865877":"Non-EU regulation","-643108528":"Non-EU and EU regulation","-979459594":"Buy/Sell","-494667560":"Orders","-679691613":"My ads","-1002556560":"We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.","-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.","-1173266642":"This account offers CFDs on a feature-rich trading platform.","-1453519913":"Trade CFDs on an easy-to-get-started platform with all your favourite assets.","-2051096382":"Earn a range of payouts by correctly predicting market movements with <0>options, or get the\n upside of CFDs without risking more than your initial stake with <1>multipliers.","-623025665":"Balance: {{balance}} {{currency}}","-473300321":"To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.","-596618970":"Other CFDs","-2006676463":"Account information","-1078378070":"Trade with leverage and tight spreads for better returns on trades. <0>Learn more","-1989682739":"Get the upside of CFDs without risking more than your initial stake with <0>multipliers.","-2102073579":"{{balance}} {{currency}}","-2082307900":"You have insufficient fund in the selected wallet, please reset your virtual balance","-1483251744":"Amount you send","-536126207":"Amount you receive","-486580863":"Transfer to","-71189928":"<0>Wallets<1> — the best way to organise your funds","-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","-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","-542766473":"During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.","-327352856":"Your open positions won't be affected and you can continue trading.","-747378570":"You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.","-917391116":"A new way to manage your funds","-35169107":"One Wallet, one currency","-2069339099":"Keep track of your trading funds in one place","-1615726661":"A Wallet for each currency to focus your funds","-132463075":"How it works","-1215197245":"Simply add your funds and trade","-1325660250":"Get a Wallet for the currency you want","-1643530462":"Add funds to your Wallet via your favourite payment method","-557603541":"Move funds to your trading account to start trading","-1200921647":"We'll link them","-1370356153":"We'll connect your existing trading accounts of the same currency to your new Wallet","-2125046510":"For example, all your USD trading account(s) will be linked to your USD Wallet","-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}}","-1975494965":"Cashier","-42592103":"Deposit cryptocurrencies","-60779216":"Withdrawals are temporarily unavailable due to system maintenance. You can make your withdrawals when the maintenance is complete.","-520142572":"Cashier is currently down for maintenance","-1552080215":"Please check back in a few minutes.<0>Thank you for your patience.","-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","-2024290965":"Confirmations","-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","-1838982691":"UNKNOWN","-532693866":"Something went wrong. Please refresh the page and try again.","-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","-1059419768":"Notes","-285921910":"Learn more about <0>payment methods.","-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","-1787304306":"Deriv P2P","-174976899":"P2P verification","-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","-1236567184":"This is your <0>{{regulation}}{{currency}} account {{loginid}}.","-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","-197251450":"Don't want to trade in {{currency_code}}? You can open another cryptocurrency account.","-91824739":"Deposit {{currency}}","-523804269":"{{amount}} {{currency}} on {{date}}","-494847428":"Address: <0>{{value}}","-1117977576":"Confirmations: <0>{{value}}","-1935946851":"View more","-1744490898":"Unfortunately, we cannot retrieve the information at this time. ","-515809216":"Send only {{currency_name}} ({{currency_code}}) to this address.","-1589407981":"To avoid loss of funds:","-1042704302":"Make sure to copy your Deriv account address correctly into your crypto wallet.","-80329359":"<0>Note: You’ll receive an email when your deposit start being processed.","-2108344100":"Looking for a way to buy cryptocurrencies? <0>Try Fiat onramp.","-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.","-314177745":"Unfortunately, we couldn't get the address since our server was down. Please click Refresh to reload the address or try again later.","-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.","-1866405488":"Deriv cTrader accounts","-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","-1155970854":"You have reached the maximum daily transfers. Please try again tomorrow.","-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.","-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","-259633143":"Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.","-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.","-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.","-590765322":"Unfortunately, this trading platform is not available for EU Deriv account. Please switch to a non-EU account to continue trading.","-2110207996":"Deriv Bot is unavailable for this account","-971295844":"Switch to another account","-1194079833":"Deriv Bot is not available for EU clients","-1223145005":"Loss amount: {{profit}}","-1206212388":"Welcome back! Your messages have been restored. You are using your {{current_currency}} account.","-1724342053":"You are using your {{current_currency}} account.","-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.","-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","-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","-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","-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","-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","-1842451303":"Welcome to Deriv Bot!","-1391310674":"Check out these guides and FAQs to learn more about building your bot:","-2066779239":"FAQs","-280324365":"What is Deriv Bot?","-1016171176":"Asset","-621128676":"Trade type","-447853970":"Loss threshold","-155173714":"Let’s build a bot!","-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?","-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.","-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.","-1720444288":"How do I control my losses with Deriv Bot?","-1142295124":"There are several ways to control your losses with Deriv Bot. Here’s a simple example of how you can implement loss control in your strategy:","-986689483":"1. Create the following variables:","-269910127":"3. Update current profit/loss with the profit from the last contract. If the last contract was lost, the value of current profit/loss will be negative.","-1565344891":"Can I run Deriv Bot 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.","-213872712":"No, we don't offer cryptocurrencies on Deriv Bot.","-2147346223":"In which countries is Deriv Bot available?","-352345777":"What are the most popular strategies for automated trading?","-552392096":"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 Deriv Bot.","-507620484":"Unsaved","-764102808":"Google Drive","-555886064":"Won","-529060972":"Lost","-1696412885":"Import","-320197558":"Sort blocks","-1566369363":"Zoom out","-1285759343":"Search","-1291088318":"Purchase conditions","-112876186":"Analysis","-1769584466":"Stats","-1133736197":"Utility","-1682372359":"Text","-907562847":"Lists","-1646497683":"Loops","-251326965":"Miscellaneous","-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.","-1150107517":"Connect","-1150390589":"Last modified","-1393876942":"Your bots:","-767342552":"Enter your bot name, choose to save on your computer or Google Drive, and hit ","-1372891985":"Save.","-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","-683790172":"Now, <0>run the bot to test out the strategy.","-1127164953":"Hi! Hit <0>Start for a quick tour.","-358288026":"Note: You can also find this tutorial in the <0>Tutorials tab.","-1793577405":"Build from scratch","-358753028":"Create your bot using our drag-and-drop blocks or click Quick Strategy to choose from the ready-to-use bot templates.","-1212601535":"Monitor the market","-21136101":"See how your bot is doing in real-time.","-631097919":"Click <0>Run when you want to start trading, and click <0>Stop when you want to stop.","-1999747212":"Want to retake the tour?","-129587613":"Got it, thanks!","-782992165":"Step 1 :","-1207872534":"First, set the <0>Trade parameters block.","-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","-1109392787":"Learn how to build your bot from scratch using a simple strategy.","-1263822623":"You can 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.","-563921656":"Bot Builder guide","-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","-1778025545":"You’ve successfully imported a bot.","-1519425996":"No results found \"{{ faq_search_value }}\"","-418247251":"Download your journal.","-2123571162":"Download","-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.","-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.","-24780060":"When you’re ready to trade, hit ","-2147110353":". You’ll be able to track your bot’s performance here.","-2140412463":"Buy price","-1299484872":"Account","-2004386410":"Win","-266502731":"Transactions detailed summary","-1717650468":"Online","-1309011360":"Open positions","-1597214874":"Trade table","-1929724703":"Compare CFD accounts","-883103549":"Account deactivated","-1837059346":"Buy / Sell","-1845037007":"Advertiser's page","-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","-291535132":"Swap-Free Demo","-1472945832":"Swap-Free SVG","-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","-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","-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.","-493564794":"Please complete your financial assessment.","-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","-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.","-2136953532":"Scheduled cashier maintenance","-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.","-822813736":"We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.","-420930276":"Follow these simple instructions to fix it.","-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.","-1998049070":"If you agree to our use of cookies, click on Accept. For more information, <0>see our policy.","-402093392":"Add Deriv Account","-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","-1591792668":"Account Limits","-34495732":"Regulatory information","-1496158755":"Go to Deriv.com","-1323441180":"I hereby confirm that my request for opening an account with Deriv to trade OTC products issued and offered exclusively outside Brazil was initiated by me. I fully understand that Deriv is not regulated by CVM and by approaching Deriv I intend to set up a relation with a foreign company.","-1396326507":"Unfortunately, {{website_name}} is not available in your country.","-1019903756":"Synthetic","-288996254":"Unavailable","-735306327":"Manage accounts","-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","-2061807537":"Something’s not right","-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?","-1342699195":"Total profit/loss:","-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.","-1825471709":"A whole new trading experience on a powerful yet easy to use platform.","-981017278":"Automated trading at your fingertips. No coding needed.","-583559763":"Menu","-778309978":"The link you clicked has expired. Ensure to click the link in the latest email in your inbox. Alternatively, enter your email below and click <0>Resend email for a new link.","-336222114":"Follow these simple steps to fix it:","-1064116456":"Search for the broker <0>Deriv Holdings (Guernsey) Limited and select it.","-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+","-523602297":"Forex majors","-1303090739":"Up to 1:1500","-19213603":"Metals","-1728334460":"Up to 1:300","-646902589":"(US_30, US_100, US_500)","-1835174654":"1:30","-1647612934":"Spreads from","-1587894214":"about verifications needed.","-466784048":"Regulator/EDR","-1920034143":"Synthetics, Baskets and Derived FX","-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.","-931599668":"ETF","-651501076":"Derived - SVG","-865172869":"Financial - BVI","-1851765767":"Financial - Vanuatu","-558597854":"Financial - Labuan","-2052425142":"Swap-Free - SVG","-1192904361":"Deriv X Demo","-1269597956":"MT5 Platform","-239789243":"(License no. SIBA/L/18/1114)","-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","-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","-1769852749":"N/A","-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.","-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.","-1922462747":"Trader's hub","-700260448":"demo","-1769158315":"real","-2015785957":"Compare CFDs {{demo_title}} 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.","-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","-1318070255":"EUR/GBP","-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","-941636117":"MetaTrader 5 Linux app","-637537305":"Download {{ platform }} on your phone to trade with the {{ platform }} {{ account }} account","-678964540":"to","-206829624":"(1:x)","-616293830":"Enjoy dynamic leverage of <0>up to 1:1500 when trading selected instruments in the forex, commodities, cryptocurrencies, and stock indices markets. Our dynamic leverage adjusts automatically to your trading position, based on asset type and trading volume.","-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","-21438174":"Add your Deriv cTrader account under Deriv (SVG) LLC (company no. 273 LLC 2020).","-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).","-271828350":"Get more out of Deriv MT5 Financial","-2125860351":"Choose a jurisdiction for your Deriv MT5 CFDs 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","-525896186":"Download Deriv GO on your phone to trade with the Deriv EZ account","-1547458328":"Run cTrader on your browser","-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.","-35790392":"Scan the QR code to download {{Deriv}} {{ platform }}.","-1282933308":"Not {{barrier}}","-968190634":"Equals {{barrier}}","-1747377543":"Under {{barrier}}","-1043795232":"Recent positions","-1511825574":"Profit/Loss:","-726626679":"Potential profit/loss:","-338379841":"Indicative price:","-1572796316":"Purchase price:","-447037544":"Buy price:","-1694314813":"Contract value:","-153220091":"{{display_value}} Tick","-802374032":"Hour","-2039780875":"Purchase confirmation","-1672470173":"Require confirmation before purchasing a contract","-1342661765":"Lock contract purchase buttons","-1382749084":"Go back to trading","-1231210510":"Tick","-1239477911":"second","-1585766960":"min","-1652791614":"mins","-1977959027":"hours","-442488432":"day","-337314714":"days","-8998663":"Digit: {{last_digit}} ","-1435392215":"About deal cancellation","-2017825013":"Got it","-1192773792":"Don't show this again","-902712434":"Deal cancellation","-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","-338707425":"Minimum duration is 1 day","-1003473648":"Duration: {{duration}} day","-1527492178":"Purchase Locked","-725375562":"You can lock/unlock the purchase button from the Settings menu","-390994177":"Should be between {{min}} and {{max}}","-1804019534":"Expiry: {{date}}","-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","-2131851017":"Growth rate","-1763848396":"Put","-194424366":"above","-857660728":"Strike Prices","-1358367903":"Stake","-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.","-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.","-28115241":"{{platform_name_trader}} is not available for this account","-453920758":"Go to {{platform_name_mt5}} dashboard","-402175529":"History","-988484646":"Deal cancellation (executed)","-444882676":"Deal cancellation (active)","-13423018":"Reference ID","-2035315547":"Low barrier","-1551639437":"No history","-1214703885":"You have yet to update either take profit or stop loss","-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}}","-347156282":"Submit Proof","-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.","-1738427539":"Purchase","-1937372493":"You can close your trade anytime. However, be aware of <0>slippage risk<0/>.","-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.","-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.","-1192494358":"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.","-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.","-1576967286":"This product allows you to express a strong bullish or bearish view on an underlying asset.","-610471235":"If you think the market price will rise continuously for a specific period, choose <0>Long. You will get a payout at the expiry time if the market price doesn’t touch or cross below the barrier. Your payout will grow proportionally to the distance between the market price and the barrier if the barrier is not breached. You will start making a profit when the payout is higher than your stake. If the market price ever crosses the barrier, there won’t be a payout.","-454245976":"If you think the market price will drop continuously for a specific period, choose <0>Short. You will get a payout at the expiry time if the market price doesn’t touch or cross above the barrier. Your payout will grow proportionally to the distance between the market price and the barrier if the barrier is not breached. You will start making a profit when the payout is higher than your stake. If the market price ever crosses the barrier, there won’t be a payout.","-351875097":"Number of ticks","-729830082":"View less","-1669741470":"The payout at expiry is equal to the payout per point multiplied by the difference between the final price and the strike price.","-740702998":"<0>{{title}} {{message}}","-1790089996":"NEW!","-993480898":"Accumulators","-45873457":"NEW","-1422269966":"You can choose a growth rate with values of 1%, 2%, 3%, 4%, and 5%.","-1186791513":"Payout is the sum of your initial stake and profit.","-1682624802":"It is a percentage of the previous spot price. The percentage rate is based on your choice of the index and the growth rate.","-1221049974":"Final price","-1247327943":"This is the spot price of the last tick at expiry.","-878534036":"If you select \"Call\", you’ll earn a payout if the final price is above the strike price at expiry. Otherwise, you won’t receive a payout.","-1587076792":"If you select \"Put\", you’ll earn a payout if the final price is below the strike price at expiry. Otherwise, you won’t receive a payout.","-1482134885":"We calculate this based on the strike price and duration you’ve selected.","-1890561510":"Cut-off time","-565990678":"Your contract will expire on this date (in GMT), based on the End time you’ve selected.","-127118348":"Choose {{contract_type}}","-543478618":"Try checking your spelling or use a different term","-700280380":"Deal cancel. fee","-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.","-438655760":"<0>Note: You can close your trade anytime. Be aware of slippage risk.","-774638412":"Stake must be between {{min_stake}} {{currency}} and {{max_stake}} {{currency}}","-434270664":"Current Price","-1956787775":"Barrier Price:","-1513281069":"Barrier 2","-1683683754":"Long","-1046859144":"<0>{{title}} You will get a payout if the market price stays {{price_position}} and doesn't touch or cross the barrier. Otherwise, your payout will be zero.","-1815023694":"above the barrier","-243332856":"Last digit stats for latest 1000 ticks for {{ underlying_name }}","-1572548510":"Ups & Downs","-71301554":"Ins & Outs","-952298801":"Look Backs","-763273340":"Digits","-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","-1072292603":"No Change","-1631669591":"string","-1768939692":"number","-795152863":"green","-1640576332":"blue","-804983649":"yellow","-94281841":"red","-1242470654":"Earned money","-841561409":"Put Spread","-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","-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.","-462715374":"Untitled Bot","-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","-985351204":"Trade again","-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.","-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 }}","-1374685318":"Your contract is closed automatically when your loss is more than or equals to this amount. This block can only be used with the multipliers trade type.","-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","-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","-1919680487":"workspace","-1703118772":"The {{block_type}} block is misplaced from {{missing_space}}.","-1785726890":"purchase conditions","-538215347":"Net deposits","-280147477":"All transactions","-137444201":"Buy","-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","-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.","-1226595254":"Turbos","-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","-113940416":"Current stake:","-1999539705":"Deal cancel. fee:","-155989831":"Decrement value","-1167474366":"Tick ","-2027409966":"Initial stake:","-1525144993":"Payout limit:","-1669418686":"AUD/CAD","-1548588249":"AUD/CHF","-1552890620":"AUD/JPY","-681231560":"AUD/PLN","-64938413":"AUD/USD","-1430522808":"EUR/AUD","-2020477069":"EUR/CAD","-1201853162":"EUR/CHF","-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","-1715390759":"I want to do this later","-2092611555":"Sorry, this app is unavailable in your current location.","-1488537825":"If you have an account, log in to continue.","-1603581277":"minutes","-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 60d9670d066e..404b9ef05ddc 100644 --- a/packages/translations/src/translations/ach.json +++ b/packages/translations/src/translations/ach.json @@ -24,7 +24,6 @@ "27731356": "crwdns1774585:0crwdne1774585:0", "27830635": "crwdns1258981:0crwdne1258981:0", "28581045": "crwdns1258983:0crwdne1258983:0", - "30801950": "crwdns1258985:0{{legal_entity_name}}crwdne1258985:0", "33433576": "crwdns1258987:0crwdne1258987:0", "35089987": "crwdns1258989:0crwdne1258989:0", "41737927": "crwdns1258993:0crwdne1258993:0", @@ -60,11 +59,13 @@ "72500774": "crwdns1259045:0crwdne1259045:0", "73086872": "crwdns1259047:0crwdne1259047:0", "73326375": "crwdns1259049:0crwdne1259049:0", + "74836780": "crwdns3172710:0{{currency_code}}crwdne3172710:0", "74963864": "crwdns1259051:0crwdne1259051:0", "76916358": "crwdns1259053:0crwdne1259053:0", "76925355": "crwdns2925303:0crwdne2925303:0", "77945356": "crwdns1719349:0crwdne1719349:0", "77982950": "crwdns2301169:0crwdne2301169:0", + "81091424": "crwdns3172712:0crwdne3172712:0", "81450871": "crwdns1259055:0crwdne1259055:0", "82839270": "crwdns1259057:0crwdne1259057:0", "83202647": "crwdns1259059:0crwdne1259059:0", @@ -76,6 +77,7 @@ "90266322": "crwdns1259067:0crwdne1259067:0", "91993812": "crwdns1259069:0crwdne1259069:0", "93154671": "crwdns2101723:0crwdne2101723:0", + "93939827": "crwdns3172714:0crwdne3172714:0", "96381225": "crwdns1259071:0crwdne1259071:0", "98473502": "crwdns1259073:0crwdne1259073:0", "98972777": "crwdns1259075:0crwdne1259075:0", @@ -83,6 +85,7 @@ "102226908": "crwdns1259079:0crwdne1259079:0", "108916570": "crwdns1259083:0{{duration}}crwdne1259083:0", "109073671": "crwdns1259085:0crwdne1259085:0", + "110822969": "crwdns3172716:0crwdne3172716:0", "111215238": "crwdns1259089:0crwdne1259089:0", "111718006": "crwdns1259091:0crwdne1259091:0", "111931529": "crwdns1259093:0crwdne1259093:0", @@ -215,7 +218,9 @@ "251882697": "crwdns1335101:0crwdne1335101:0", "254912581": "crwdns1259301:0crwdne1259301:0", "256031314": "crwdns1259303:0crwdne1259303:0", + "256123827": "crwdns3172718:0crwdne3172718:0", "256602726": "crwdns1259305:0crwdne1259305:0", + "258026201": "crwdns3172720:0crwdne3172720:0", "258448370": "crwdns1259309:0crwdne1259309:0", "258912192": "crwdns1335103:0crwdne1335103:0", "260069181": "crwdns1259311:0crwdne1259311:0", @@ -250,8 +255,8 @@ "284527272": "crwdns1259357:0crwdne1259357:0", "284772879": "crwdns1259359:0crwdne1259359:0", "284809500": "crwdns2080539:0crwdne2080539:0", + "285909860": "crwdns3172722:0{{currency}}crwdne3172722:0", "287934290": "crwdns1259361:0crwdne1259361:0", - "289898640": "crwdns1259363:0crwdne1259363:0", "291744889": "crwdns2101739:0crwdne2101739:0", "291817757": "crwdns1308099:0crwdne1308099:0", "292491635": "crwdns1259365:0crwdne1259365:0", @@ -299,6 +304,7 @@ "344418897": "crwdns1259441:0{{brand_website_name}}crwdne1259441:0", "345320063": "crwdns1259443:0crwdne1259443:0", "345818851": "crwdns2154555:0crwdne2154555:0", + "346214602": "crwdns3172724:0crwdne3172724:0", "347029309": "crwdns1259447:0crwdne1259447:0", "347039138": "crwdns1259449:0crwdne1259449:0", "347217485": "crwdns2694273:0crwdne2694273:0", @@ -353,6 +359,7 @@ "401345454": "crwdns2925309:0crwdne2925309:0", "402343402": "crwdns1259537:0{{platform}}crwdne1259537:0", "403456289": "crwdns1259539:0crwdne1259539:0", + "403608958": "crwdns3172726:0crwdne3172726:0", "404743411": "crwdns1259541:0crwdne1259541:0", "406359555": "crwdns1259543:0crwdne1259543:0", "406497323": "crwdns1259545:0crwdne1259545:0", @@ -373,6 +380,7 @@ "427617266": "crwdns1259567:0crwdne1259567:0", "428709688": "crwdns1259569:0crwdne1259569:0", "431267979": "crwdns2621365:0crwdne2621365:0", + "431654991": "crwdns3172728:0crwdne3172728:0", "432273174": "crwdns2154493:0crwdne2154493:0", "432508385": "crwdns1259573:0{{ currency }}crwdnd1259573:0{{ take_profit }}crwdne1259573:0", "432519573": "crwdns1259575:0crwdne1259575:0", @@ -453,12 +461,12 @@ "518955798": "crwdns1259699:0crwdne1259699:0", "520136698": "crwdns1259701:0crwdne1259701:0", "521872670": "crwdns1259703:0crwdne1259703:0", - "522283618": "crwdns1259705:0crwdne1259705:0", "522703281": "crwdns1259707:0crwdne1259707:0", "523123321": "crwdns1259709:0crwdne1259709:0", "524459540": "crwdns2101753:0crwdne2101753:0", "527329988": "crwdns1259711:0crwdne1259711:0", "529056539": "crwdns1259713:0crwdne1259713:0", + "530864956": "crwdns3172730:0crwdne3172730:0", "530953413": "crwdns1259717:0crwdne1259717:0", "531114081": "crwdns1259719:0crwdne1259719:0", "531675669": "crwdns1259721:0crwdne1259721:0", @@ -473,10 +481,13 @@ "543915570": "crwdns1259737:0crwdne1259737:0", "545476424": "crwdns1259739:0crwdne1259739:0", "549479175": "crwdns1259743:0crwdne1259743:0", + "549799607": "crwdns3172732:0crwdne3172732:0", "550589723": "crwdns2225569:0{{growth_rate}}crwdnd2225569:0{{tick_size_barrier}}crwdne2225569:0", + "551550548": "crwdns3172734:0crwdne3172734:0", "551569133": "crwdns1259745:0crwdne1259745:0", "554135844": "crwdns2101755:0crwdne2101755:0", "554410233": "crwdns1259747:0crwdne1259747:0", + "554777712": "crwdns3172736:0crwdne3172736:0", "555351771": "crwdns1259749:0crwdne1259749:0", "555881991": "crwdns1935203:0crwdne1935203:0", "556264438": "crwdns1259753:0crwdne1259753:0", @@ -552,6 +563,7 @@ "629395043": "crwdns2225571:0crwdne2225571:0", "632398049": "crwdns1259865:0crwdne1259865:0", "634219491": "crwdns1259867:0crwdne1259867:0", + "635884758": "crwdns3172738:0crwdne3172738:0", "636219628": "crwdns1259869:0crwdne1259869:0", "639382772": "crwdns1259871:0crwdne1259871:0", "640596349": "crwdns1259873:0crwdne1259873:0", @@ -562,7 +574,6 @@ "642546661": "crwdns1259883:0crwdne1259883:0", "642995056": "crwdns1259885:0crwdne1259885:0", "644150241": "crwdns1259889:0crwdne1259889:0", - "645016681": "crwdns1259891:0crwdne1259891:0", "645902266": "crwdns1259893:0crwdne1259893:0", "647039329": "crwdns1555137:0crwdne1555137:0", "647745382": "crwdns1259897:0{{ input_list }}crwdne1259897:0", @@ -592,6 +603,7 @@ "665872465": "crwdns1259937:0crwdne1259937:0", "666724936": "crwdns1419881:0crwdne1419881:0", "672008428": "crwdns1259941:0crwdne1259941:0", + "672731171": "crwdns3172740:0crwdne3172740:0", "673915530": "crwdns1259943:0crwdne1259943:0", "674973192": "crwdns1259945:0crwdne1259945:0", "676159329": "crwdns1259947:0crwdne1259947:0", @@ -613,6 +625,7 @@ "692354762": "crwdns3031239:0{{document_name}}crwdnd3031239:0{{example_format}}crwdne3031239:0", "693396140": "crwdns1259969:0crwdne1259969:0", "694035561": "crwdns2925239:0crwdne2925239:0", + "694089159": "crwdns3172742:0crwdne3172742:0", "696870196": "crwdns1259971:0crwdne1259971:0", "697630556": "crwdns1259973:0crwdne1259973:0", "698037001": "crwdns1935205:0crwdne1935205:0", @@ -624,8 +637,8 @@ "701647434": "crwdns1259985:0crwdne1259985:0", "702451070": "crwdns1935207:0crwdne1935207:0", "702561961": "crwdns2363145:0crwdne2363145:0", + "705262734": "crwdns3172744:0crwdne3172744:0", "705299518": "crwdns1259987:0crwdne1259987:0", - "706413212": "crwdns1787777:0{{regulation}}crwdnd1787777:0{{currency}}crwdnd1787777:0{{loginid}}crwdne1787777:0", "706727320": "crwdns1259989:0crwdne1259989:0", "706755289": "crwdns1259991:0crwdne1259991:0", "706960383": "crwdns2301181:0crwdne2301181:0", @@ -644,6 +657,7 @@ "720293140": "crwdns1260015:0crwdne1260015:0", "720519019": "crwdns1260017:0crwdne1260017:0", "721011817": "crwdns1260019:0crwdne1260019:0", + "722797282": "crwdns3172746:0crwdne3172746:0", "723045653": "crwdns1260021:0crwdne1260021:0", "723961296": "crwdns1260023:0crwdne1260023:0", "724203548": "crwdns1260025:0crwdne1260025:0", @@ -656,6 +670,7 @@ "734390964": "crwdns1260035:0crwdne1260035:0", "734881840": "crwdns1260037:0crwdne1260037:0", "742469109": "crwdns1719373:0crwdne1719373:0", + "742570452": "crwdns3172748:0crwdne3172748:0", "742676532": "crwdns1260039:0crwdne1260039:0", "743623600": "crwdns2783083:0crwdne2783083:0", "744110277": "crwdns1260041:0crwdne1260041:0", @@ -689,6 +704,7 @@ "775706054": "crwdns2101761:0crwdne2101761:0", "776085955": "crwdns1260099:0crwdne1260099:0", "781924436": "crwdns1260101:0crwdne1260101:0", + "782563319": "crwdns3172750:0crwdne3172750:0", "783974693": "crwdns1260103:0crwdne1260103:0", "784311461": "crwdns1260105:0crwdne1260105:0", "784583814": "crwdns1260107:0crwdne1260107:0", @@ -725,6 +741,7 @@ "818447476": "crwdns1260155:0crwdne1260155:0", "820877027": "crwdns1260157:0crwdne1260157:0", "821163626": "crwdns2981015:0crwdne2981015:0", + "822915673": "crwdns3172752:0crwdne3172752:0", "823186089": "crwdns1260159:0crwdne1260159:0", "824797920": "crwdns1260161:0crwdne1260161:0", "825042307": "crwdns1935463:0crwdne1935463:0", @@ -747,7 +764,6 @@ "836097457": "crwdns1335119:0crwdne1335119:0", "837063385": "crwdns2783109:0crwdne2783109:0", "837066896": "crwdns1260189:0crwdne1260189:0", - "839618971": "crwdns1260191:0crwdne1260191:0", "839805709": "crwdns1260193:0crwdne1260193:0", "840672750": "crwdns2694277:0crwdne2694277:0", "841434703": "crwdns1260195:0crwdne1260195:0", @@ -844,9 +860,9 @@ "943535887": "crwdns1260343:0crwdne1260343:0", "944499219": "crwdns1260345:0crwdne1260345:0", "945532698": "crwdns1260347:0crwdne1260347:0", + "945753712": "crwdns3172754:0crwdne3172754:0", "946204249": "crwdns1260349:0crwdne1260349:0", "946841802": "crwdns1260351:0crwdne1260351:0", - "946944859": "crwdns1260353:0crwdne1260353:0", "947046137": "crwdns1260355:0crwdne1260355:0", "947363256": "crwdns1260357:0crwdne1260357:0", "947758334": "crwdns1260361:0crwdne1260361:0", @@ -950,6 +966,7 @@ "1050128247": "crwdns1260523:0crwdne1260523:0", "1050844889": "crwdns1260525:0crwdne1260525:0", "1052779010": "crwdns1260529:0crwdne1260529:0", + "1052921318": "crwdns3172756:0{{currency}}crwdne3172756:0", "1053153674": "crwdns1260531:0crwdne1260531:0", "1053159279": "crwdns1260533:0crwdne1260533:0", "1053556481": "crwdns1990141:0crwdne1990141:0", @@ -1010,6 +1027,7 @@ "1110102997": "crwdns1260609:0crwdne1260609:0", "1112582372": "crwdns1260611:0crwdne1260611:0", "1113119682": "crwdns1260613:0crwdne1260613:0", + "1113221217": "crwdns3172758:0crwdne3172758:0", "1113292761": "crwdns1260615:0crwdne1260615:0", "1114679006": "crwdns2101789:0crwdne2101789:0", "1117281935": "crwdns2716407:0crwdne2716407:0", @@ -1036,6 +1054,7 @@ "1134879544": "crwdns1260651:0crwdne1260651:0", "1138126442": "crwdns1600219:0crwdne1600219:0", "1139483178": "crwdns1260653:0crwdne1260653:0", + "1141383005": "crwdns3172760:0crwdne3172760:0", "1143730031": "crwdns1260655:0{{ direction_type }}crwdne1260655:0", "1144028300": "crwdns1260657:0crwdne1260657:0", "1145927365": "crwdns1260659:0crwdne1260659:0", @@ -1066,7 +1085,6 @@ "1174689133": "crwdns3109828:0crwdne3109828:0", "1174748431": "crwdns1260699:0crwdne1260699:0", "1175183064": "crwdns1260701:0crwdne1260701:0", - "1176926166": "crwdns1260703:0crwdne1260703:0", "1177396776": "crwdns1260705:0crwdne1260705:0", "1177723589": "crwdns1260707:0crwdne1260707:0", "1178582280": "crwdns1260709:0crwdne1260709:0", @@ -1077,6 +1095,7 @@ "1181396316": "crwdns1260719:0crwdne1260719:0", "1181770592": "crwdns1260721:0crwdne1260721:0", "1183007646": "crwdns1260723:0crwdne1260723:0", + "1183448523": "crwdns3172762:0crwdne3172762:0", "1184968647": "crwdns2101799:0crwdne2101799:0", "1188316409": "crwdns1260725:0crwdne1260725:0", "1188980408": "crwdns1260727:0crwdne1260727:0", @@ -1094,12 +1113,14 @@ "1201773643": "crwdns1260751:0crwdne1260751:0", "1203297580": "crwdns1260753:0crwdne1260753:0", "1204223111": "crwdns1260755:0crwdne1260755:0", + "1204834928": "crwdns3172764:0crwdne3172764:0", "1206227936": "crwdns1445499:0crwdne1445499:0", "1206821331": "crwdns1260757:0crwdne1260757:0", "1207152000": "crwdns2101801:0crwdne2101801:0", "1208714859": "crwdns2738421:0crwdne2738421:0", "1208729868": "crwdns1260759:0crwdne1260759:0", "1208903663": "crwdns1260761:0crwdne1260761:0", + "1209914202": "crwdns3172766:0crwdne3172766:0", "1211912982": "crwdns1260763:0crwdne1260763:0", "1214893428": "crwdns1260765:0crwdne1260765:0", "1216408337": "crwdns1260767:0crwdne1260767:0", @@ -1112,6 +1133,7 @@ "1222521778": "crwdns1260779:0crwdne1260779:0", "1222544232": "crwdns1260781:0crwdne1260781:0", "1225150022": "crwdns1260783:0crwdne1260783:0", + "1226027513": "crwdns3172768:0crwdne3172768:0", "1227074958": "crwdns1260785:0crwdne1260785:0", "1227240509": "crwdns1260787:0crwdne1260787:0", "1228534821": "crwdns1260789:0crwdne1260789:0", @@ -1121,6 +1143,7 @@ "1232291311": "crwdns1260797:0crwdne1260797:0", "1232353969": "crwdns1260799:0crwdne1260799:0", "1233300532": "crwdns1260801:0crwdne1260801:0", + "1233376285": "crwdns3172770:0crwdne3172770:0", "1234292259": "crwdns1260803:0crwdne1260803:0", "1234764730": "crwdns1445503:0crwdne1445503:0", "1235426525": "crwdns1260805:0crwdne1260805:0", @@ -1166,6 +1189,7 @@ "1281045211": "crwdns1260863:0crwdne1260863:0", "1281290230": "crwdns1260865:0crwdne1260865:0", "1282951921": "crwdns1260867:0crwdne1260867:0", + "1283807218": "crwdns3172772:0crwdne3172772:0", "1284522768": "crwdns1260869:0crwdne1260869:0", "1286094280": "crwdns1260873:0crwdne1260873:0", "1286507651": "crwdns1260875:0crwdne1260875:0", @@ -1173,7 +1197,6 @@ "1289146554": "crwdns1719397:0crwdne1719397:0", "1289646209": "crwdns1260879:0crwdne1260879:0", "1290525720": "crwdns1260881:0crwdne1260881:0", - "1291887623": "crwdns1260883:0crwdne1260883:0", "1291997417": "crwdns2301199:0crwdne2301199:0", "1292188546": "crwdns1308105:0crwdne1308105:0", "1292891860": "crwdns1260885:0crwdne1260885:0", @@ -1214,6 +1237,7 @@ "1327494533": "crwdns1260953:0{{sell_value}}crwdne1260953:0", "1329136554": "crwdns1260955:0crwdne1260955:0", "1329325646": "crwdns1260957:0crwdne1260957:0", + "1330479159": "crwdns3172774:0crwdne3172774:0", "1331199417": "crwdns1260959:0crwdne1260959:0", "1331367811": "crwdns1260961:0crwdne1260961:0", "1332168410": "crwdns1260963:0crwdne1260963:0", @@ -1257,7 +1281,6 @@ "1367023655": "crwdns1261027:0crwdne1261027:0", "1367488817": "crwdns1261029:0crwdne1261029:0", "1367990698": "crwdns1261031:0crwdne1261031:0", - "1369709538": "crwdns1261033:0crwdne1261033:0", "1370647009": "crwdns1774613:0crwdne1774613:0", "1371193412": "crwdns1261035:0crwdne1261035:0", "1371555192": "crwdns1261037:0crwdne1261037:0", @@ -1319,6 +1342,7 @@ "1434767075": "crwdns2301447:0crwdne2301447:0", "1434976996": "crwdns1261135:0crwdne1261135:0", "1435363248": "crwdns1261137:0crwdne1261137:0", + "1435368624": "crwdns3172776:0{{dash}}crwdne3172776:0", "1435380105": "crwdns1261139:0crwdne1261139:0", "1437396005": "crwdns1261141:0crwdne1261141:0", "1438247001": "crwdns1261143:0crwdne1261143:0", @@ -1369,6 +1393,7 @@ "1476301886": "crwdns1261217:0crwdne1261217:0", "1478030986": "crwdns1261219:0crwdne1261219:0", "1480915523": "crwdns1719407:0crwdne1719407:0", + "1481860194": "crwdns3172778:0crwdne3172778:0", "1481977420": "crwdns1261221:0crwdne1261221:0", "1483470662": "crwdns2102217:0crwdne2102217:0", "1484336612": "crwdns1261223:0crwdne1261223:0", @@ -1389,6 +1414,7 @@ "1505420815": "crwdns1261253:0crwdne1261253:0", "1505898522": "crwdns1261255:0crwdne1261255:0", "1505927599": "crwdns1935469:0crwdne1935469:0", + "1506251760": "crwdns3172780:0crwdne3172780:0", "1509559328": "crwdns2981021:0crwdne2981021:0", "1509570124": "crwdns1261257:0{{buy_value}}crwdne1261257:0", "1509678193": "crwdns1261259:0crwdne1261259:0", @@ -1419,7 +1445,7 @@ "1542742708": "crwdns2154505:0crwdne2154505:0", "1544642951": "crwdns1261307:0crwdne1261307:0", "1547148381": "crwdns1445507:0crwdne1445507:0", - "1548765374": "crwdns1261309:0crwdne1261309:0", + "1548765374": "crwdns3121876:0crwdne3121876:0", "1549098835": "crwdns1261311:0crwdne1261311:0", "1551172020": "crwdns1261313:0crwdne1261313:0", "1552162519": "crwdns1361663:0crwdne1361663:0", @@ -1449,6 +1475,7 @@ "1577480486": "crwdns1261345:0crwdne1261345:0", "1577527507": "crwdns1261347:0crwdne1261347:0", "1577612026": "crwdns1261349:0crwdne1261349:0", + "1577879664": "crwdns3172782:0crwdne3172782:0", "1579839386": "crwdns1361665:0crwdne1361665:0", "1580498808": "crwdns1261353:0crwdne1261353:0", "1584109614": "crwdns1261355:0crwdne1261355:0", @@ -1502,9 +1529,11 @@ "1644703962": "crwdns1925315:0crwdne1925315:0", "1644864436": "crwdns1787789:0crwdne1787789:0", "1644908559": "crwdns1261443:0crwdne1261443:0", + "1645315784": "crwdns3172784:0{{display_currency_code}}crwdne3172784:0", "1647186767": "crwdns1261445:0crwdne1261445:0", "1648938920": "crwdns1781115:0crwdne1781115:0", "1649239667": "crwdns2101833:0crwdne2101833:0", + "1650963565": "crwdns3172786:0crwdne3172786:0", "1651513020": "crwdns1261447:0crwdne1261447:0", "1651951220": "crwdns1261449:0crwdne1261449:0", "1652366857": "crwdns1261451:0crwdne1261451:0", @@ -1522,13 +1551,13 @@ "1665272539": "crwdns1261475:0crwdne1261475:0", "1665738338": "crwdns1261477:0crwdne1261477:0", "1665756261": "crwdns1261479:0crwdne1261479:0", + "1666783057": "crwdns3172788:0crwdne3172788:0", "1668138872": "crwdns1261483:0crwdne1261483:0", "1670016002": "crwdns1261485:0{{ multiplier }}crwdne1261485:0", "1670426231": "crwdns1261487:0crwdne1261487:0", "1671232191": "crwdns1261489:0crwdne1261489:0", "1674163852": "crwdns2738425:0crwdne2738425:0", "1675030608": "crwdns1261491:0crwdne1261491:0", - "1675289747": "crwdns1787779:0crwdne1787779:0", "1676549796": "crwdns2886899:0crwdne2886899:0", "1677027187": "crwdns1261493:0crwdne1261493:0", "1677990284": "crwdns1261495:0crwdne1261495:0", @@ -1556,6 +1585,7 @@ "1703091957": "crwdns1890417:0crwdne1890417:0", "1704656659": "crwdns1335145:0crwdne1335145:0", "1708413635": "crwdns1261529:0{{currency_name}}crwdnd1261529:0{{currency}}crwdne1261529:0", + "1709293836": "crwdns3172790:0crwdne3172790:0", "1709401095": "crwdns1600233:0crwdne1600233:0", "1709859601": "crwdns1261531:0crwdne1261531:0", "1710662619": "crwdns1261533:0crwdne1261533:0", @@ -1570,6 +1600,7 @@ "1719248689": "crwdns1261547:0crwdne1261547:0", "1720451994": "crwdns1261549:0{{minimum_fee}}crwdnd1261549:0{{currency}}crwdne1261549:0", "1720968545": "crwdns1261551:0crwdne1261551:0", + "1723069433": "crwdns3172792:0crwdne3172792:0", "1723589564": "crwdns1261557:0crwdne1261557:0", "1724696797": "crwdns1261559:0crwdne1261559:0", "1725958461": "crwdns1445513:0crwdne1445513:0", @@ -1698,6 +1729,7 @@ "1842266423": "crwdns1261763:0crwdne1261763:0", "1842862156": "crwdns1261765:0crwdne1261765:0", "1843658716": "crwdns1261767:0crwdne1261767:0", + "1844458194": "crwdns3172794:0{{account}}crwdnd3172794:0{{wallet}}crwdne3172794:0", "1845892898": "crwdns1261769:0{{min_stake}}crwdnd1261769:0{{max_payout}}crwdne1261769:0", "1846266243": "crwdns1261771:0crwdne1261771:0", "1846587187": "crwdns1261773:0crwdne1261773:0", @@ -1792,7 +1824,6 @@ "1924765698": "crwdns1261929:0crwdne1261929:0", "1926987784": "crwdns2694281:0crwdne2694281:0", "1928930389": "crwdns1261935:0crwdne1261935:0", - "1929309951": "crwdns1261937:0crwdne1261937:0", "1929694162": "crwdns1261939:0crwdne1261939:0", "1930899934": "crwdns1261941:0crwdne1261941:0", "1931659123": "crwdns1261943:0crwdne1261943:0", @@ -1807,6 +1838,7 @@ "1943440862": "crwdns1261955:0crwdne1261955:0", "1944204227": "crwdns1261957:0crwdne1261957:0", "1947527527": "crwdns1261959:0crwdne1261959:0", + "1948044825": "crwdns3172796:0crwdne3172796:0", "1948092185": "crwdns1261961:0crwdne1261961:0", "1949719666": "crwdns1261963:0crwdne1261963:0", "1950413928": "crwdns1261965:0crwdne1261965:0", @@ -1875,6 +1907,7 @@ "2014536501": "crwdns1445519:0crwdne1445519:0", "2014590669": "crwdns117834:0{{variable_name}}crwdnd117834:0{{variable_name}}crwdne117834:0", "2017672013": "crwdns167277:0crwdne167277:0", + "2020104747": "crwdns3172798:0crwdne3172798:0", "2020545256": "crwdns731510:0crwdne731510:0", "2021037737": "crwdns160410:0crwdne160410:0", "2021161151": "crwdns2301459:0crwdne2301459:0", @@ -1885,7 +1918,6 @@ "2027696535": "crwdns80765:0crwdne80765:0", "2028163119": "crwdns162640:0crwdne162640:0", "2029237955": "crwdns838626:0crwdne838626:0", - "2029641956": "crwdns2886865:0crwdne2886865:0", "2030018735": "crwdns69614:0crwdne69614:0", "2030045667": "crwdns125100:0crwdne125100:0", "2033648953": "crwdns70492:0crwdne70492:0", @@ -1919,6 +1951,7 @@ "2063812316": "crwdns69624:0crwdne69624:0", "2063890788": "crwdns89400:0crwdne89400:0", "2065278286": "crwdns170732:0crwdne170732:0", + "2066419724": "crwdns3172800:0{{wallet}}crwdne3172800:0", "2067903936": "crwdns876450:0crwdne876450:0", "2070002739": "crwdns123872:0crwdne123872:0", "2070345146": "crwdns1742107:0crwdne1742107:0", @@ -1931,6 +1964,7 @@ "2074713563": "crwdns1990157:0crwdne1990157:0", "2080553498": "crwdns85001:0crwdne85001:0", "2080829530": "crwdns125104:0{{sold_for}}crwdne125104:0", + "2080906200": "crwdns3172802:0crwdne3172802:0", "2082533832": "crwdns762990:0crwdne762990:0", "2084693624": "crwdns69630:0crwdne69630:0", "2085387371": "crwdns164955:0crwdne164955:0", @@ -1966,7 +2000,6 @@ "2115223095": "crwdns69644:0crwdne69644:0", "2117165122": "crwdns85013:0crwdne85013:0", "2117489390": "crwdns117844:0{{ remaining }}crwdne117844:0", - "2118315870": "crwdns80785:0crwdne80785:0", "2119449126": "crwdns85015:0crwdne85015:0", "2119710534": "crwdns2101869:0crwdne2101869:0", "2121227568": "crwdns162642:0crwdne162642:0", @@ -1992,8 +2025,6 @@ "2146698770": "crwdns2101871:0crwdne2101871:0", "2146892766": "crwdns124358:0crwdne124358:0", "2147244655": "crwdns2301463:0crwdne2301463:0", - "-1232613003": "crwdns1787773:0crwdne1787773:0", - "-2029508615": "crwdns1787775:0crwdne1787775:0", "-931052769": "crwdns156670:0crwdne156670:0", "-1004605898": "crwdns156678:0crwdne156678:0", "-1938142055": "crwdns156672:0crwdne156672:0", @@ -2141,18 +2172,9 @@ "-179726573": "crwdns1445555:0crwdne1445555:0", "-813779897": "crwdns1445557:0crwdne1445557:0", "-638756912": "crwdns1445559:0crwdne1445559:0", - "-2073934245": "crwdns121006:0crwdne121006:0", - "-1166068675": "crwdns496900:0{{legal_entity_name}}crwdne496900:0", - "-975118358": "crwdns496902:0{{legal_entity_name}}crwdne496902:0", - "-680528873": "crwdns496904:0{{legal_entity_name}}crwdne496904:0", - "-1125193491": "crwdns81393:0crwdne81393:0", - "-2068229627": "crwdns81631:0crwdne81631:0", "-684271315": "crwdns81133:0crwdne81133:0", "-740157281": "crwdns1335213:0crwdne1335213:0", "-1720468017": "crwdns1335195:0crwdne1335195:0", - "-186841084": "crwdns1220177:0crwdne1220177:0", - "-907403572": "crwdns1220179:0{{identifier_title}}crwdne1220179:0", - "-1850792730": "crwdns162088:0{{identifier_title}}crwdne162088:0", "-307865807": "crwdns1335199:0crwdne1335199:0", "-690100729": "crwdns1335201:0crwdne1335201:0", "-2010628430": "crwdns1335203:0crwdne1335203:0", @@ -2206,11 +2228,6 @@ "-1725454783": "crwdns124162:0crwdne124162:0", "-506510414": "crwdns124158:0crwdne124158:0", "-1708927037": "crwdns124160:0crwdne124160:0", - "-619126443": "crwdns2981025:0{{brand_website_name}}crwdnd2981025:0{{platform_name_trader}}crwdne2981025:0", - "-623760979": "crwdns2981027:0{{brand_website_name}}crwdnd2981027:0{{platform_name_trader}}crwdnd2981027:0{{platform_name_go}}crwdne2981027:0", - "-459147994": "crwdns2981029:0{{brand_website_name}}crwdnd2981029:0{{platform_name_go}}crwdnd2981029:0{{platform_name_trader}}crwdnd2981029:0{{platform_name_smarttrader}}crwdnd2981029:0{{platform_name_dbot}}crwdnd2981029:0{{platform_name_ctrader}}crwdne2981029:0", - "-80717068": "crwdns1220181:0crwdne1220181:0", - "-9570380": "crwdns1047718:0{{platform_name_dxtrade}}crwdnd1047718:0{{platform_name_dxtrade}}crwdne1047718:0", "-2131200819": "crwdns1918507:0crwdne1918507:0", "-200487676": "crwdns121240:0crwdne121240:0", "-1840392236": "crwdns121242:0crwdne121242:0", @@ -2240,44 +2257,37 @@ "-378415317": "crwdns123922:0crwdne123922:0", "-1497654315": "crwdns169125:0crwdne169125:0", "-755626951": "crwdns81603:0crwdne81603:0", - "-584911871": "crwdns159390:0crwdne159390:0", "-1461267236": "crwdns81601:0crwdne81601:0", - "-1352330125": "crwdns159392:0crwdne159392:0", "-1027595143": "crwdns80991:0crwdne80991:0", "-40491332": "crwdns80993:0crwdne80993:0", "-1139806939": "crwdns80995:0crwdne80995:0", - "-626752657": "crwdns80933:0crwdne80933:0", - "-532014689": "crwdns80935:0crwdne80935:0", - "-1001024004": "crwdns80937:0crwdne80937:0", - "-790513277": "crwdns123926:0crwdne123926:0", - "-580085300": "crwdns123928:0crwdne123928:0", - "-654781670": "crwdns80987:0crwdne80987:0", - "-1717373258": "crwdns80989:0crwdne80989:0", "-996132458": "crwdns80951:0crwdne80951:0", "-915003867": "crwdns80953:0crwdne80953:0", "-1430012453": "crwdns80955:0crwdne80955:0", "-987824916": "crwdns80957:0crwdne80957:0", "-146630682": "crwdns80959:0crwdne80959:0", "-761306973": "crwdns80961:0crwdne80961:0", - "-739367071": "crwdns80949:0crwdne80949:0", - "-1156937070": "crwdns80997:0crwdne80997:0", - "-315534569": "crwdns80999:0crwdne80999:0", - "-2068544539": "crwdns80939:0crwdne80939:0", - "-531314998": "crwdns80941:0crwdne80941:0", - "-1235114522": "crwdns80943:0crwdne80943:0", - "-1298056749": "crwdns80945:0crwdne80945:0", - "-449943381": "crwdns80947:0crwdne80947:0", "-1631552645": "crwdns80963:0crwdne80963:0", "-474864470": "crwdns80965:0crwdne80965:0", "-1129355784": "crwdns80967:0crwdne80967:0", "-1242914994": "crwdns80969:0crwdne80969:0", "-1317824715": "crwdns80971:0crwdne80971:0", "-1592729751": "crwdns80973:0crwdne80973:0", + "-1030759620": "crwdns80975:0crwdne80975:0", "-2137323480": "crwdns80977:0crwdne80977:0", "-1590574533": "crwdns80979:0crwdne80979:0", "-1667683002": "crwdns80981:0crwdne80981:0", "-1237843731": "crwdns80983:0crwdne80983:0", "-777506574": "crwdns80985:0crwdne80985:0", + "-654781670": "crwdns80987:0crwdne80987:0", + "-1717373258": "crwdns80989:0crwdne80989:0", + "-1156937070": "crwdns80997:0crwdne80997:0", + "-315534569": "crwdns80999:0crwdne80999:0", + "-2068544539": "crwdns80939:0crwdne80939:0", + "-531314998": "crwdns80941:0crwdne80941:0", + "-1235114522": "crwdns80943:0crwdne80943:0", + "-1298056749": "crwdns80945:0crwdne80945:0", + "-449943381": "crwdns80947:0crwdne80947:0", "-1161338910": "crwdns165647:0crwdne165647:0", "-1161818065": "crwdns163606:0crwdne163606:0", "-1281693513": "crwdns165649:0crwdne165649:0", @@ -2287,28 +2297,14 @@ "-212167954": "crwdns2925237:0crwdne2925237:0", "-621555159": "crwdns838630:0crwdne838630:0", "-204765990": "crwdns81607:0crwdne81607:0", - "-231863107": "crwdns70248:0crwdne70248:0", - "-870902742": "crwdns1335155:0crwdne1335155:0", - "-1929477717": "crwdns1335157:0crwdne1335157:0", - "-1540148863": "crwdns1335159:0crwdne1335159:0", - "-922751756": "crwdns1335161:0crwdne1335161:0", - "-542986255": "crwdns1335163:0crwdne1335163:0", - "-1337206552": "crwdns1335165:0crwdne1335165:0", - "-456863190": "crwdns1419857:0crwdne1419857:0", - "-1314683258": "crwdns1335169:0crwdne1335169:0", - "-1546090184": "crwdns1335171:0crwdne1335171:0", - "-1636427115": "crwdns1335173:0crwdne1335173:0", - "-800221491": "crwdns1335175:0crwdne1335175:0", - "-811839563": "crwdns1335177:0crwdne1335177:0", - "-1185193552": "crwdns1335179:0crwdne1335179:0", - "-1046354": "crwdns1335181:0crwdne1335181:0", - "-1842858448": "crwdns1335183:0crwdne1335183:0", - "-860053164": "crwdns1742109:0crwdne1742109:0", - "-1250327770": "crwdns1742111:0crwdne1742111:0", - "-1222388581": "crwdns1742113:0crwdne1742113:0", "-477761028": "crwdns1935221:0crwdne1935221:0", "-1466346630": "crwdns1935223:0crwdne1935223:0", - "-1030759620": "crwdns80975:0crwdne80975:0", + "-739367071": "crwdns80949:0crwdne80949:0", + "-626752657": "crwdns80933:0crwdne80933:0", + "-532014689": "crwdns80935:0crwdne80935:0", + "-1001024004": "crwdns80937:0crwdne80937:0", + "-790513277": "crwdns123926:0crwdne123926:0", + "-580085300": "crwdns123928:0crwdne123928:0", "-612752984": "crwdns157242:0crwdne157242:0", "-1598263601": "crwdns157244:0crwdne157244:0", "-1411635770": "crwdns160222:0crwdne160222:0", @@ -2326,10 +2322,7 @@ "-1500958859": "crwdns160970:0crwdne160970:0", "-1502578110": "crwdns81257:0crwdne81257:0", "-1662154767": "crwdns124010:0crwdne124010:0", - "-190838815": "crwdns159394:0crwdne159394:0", - "-223216785": "crwdns159396:0crwdne159396:0", "-594456225": "crwdns81619:0crwdne81619:0", - "-1940457555": "crwdns159398:0crwdne159398:0", "-1964954030": "crwdns124012:0crwdne124012:0", "-516397235": "crwdns762992:0crwdne762992:0", "-989216986": "crwdns762994:0crwdne762994:0", @@ -2371,8 +2364,6 @@ "-1100235269": "crwdns81193:0crwdne81193:0", "-684388823": "crwdns81195:0crwdne81195:0", "-509054266": "crwdns124014:0crwdne124014:0", - "-601903492": "crwdns124016:0crwdne124016:0", - "-1012699451": "crwdns124018:0crwdne124018:0", "-1588485629": "crwdns3109826:0crwdne3109826:0", "-1117345066": "crwdns167293:0crwdne167293:0", "-651192353": "crwdns167295:0crwdne167295:0", @@ -2394,11 +2385,11 @@ "-1088324715": "crwdns1092150:0crwdne1092150:0", "-329713179": "crwdns70290:0crwdne70290:0", "-1176889260": "crwdns167285:0crwdne167285:0", - "-1926456107": "crwdns167299:0crwdne167299:0", - "-555047589": "crwdns167301:0crwdne167301:0", - "-841187054": "crwdns167303:0crwdne167303:0", + "-1926456107": "crwdns3121878:0crwdne3121878:0", + "-555047589": "crwdns3121880:0crwdne3121880:0", + "-841187054": "crwdns3121882:0crwdne3121882:0", "-2097808873": "crwdns167305:0crwdne167305:0", - "-228284848": "crwdns167307:0crwdne167307:0", + "-228284848": "crwdns3121884:0crwdne3121884:0", "-1391934478": "crwdns167313:0crwdne167313:0", "-118547687": "crwdns167315:0crwdne167315:0", "-200989771": "crwdns81301:0crwdne81301:0", @@ -2464,12 +2455,40 @@ "-142444667": "crwdns1308111:0crwdne1308111:0", "-742748008": "crwdns171204:0crwdne171204:0", "-84068414": "crwdns171206:0crwdne171206:0", + "-975118358": "crwdns496902:0{{legal_entity_name}}crwdne496902:0", + "-2073934245": "crwdns121006:0crwdne121006:0", + "-1125193491": "crwdns81393:0crwdne81393:0", + "-2068229627": "crwdns81631:0crwdne81631:0", + "-186841084": "crwdns1220177:0crwdne1220177:0", + "-907403572": "crwdns1220179:0{{identifier_title}}crwdne1220179:0", + "-1850792730": "crwdns162088:0{{identifier_title}}crwdne162088:0", "-428335668": "crwdns162086:0crwdne162086:0", + "-1232613003": "crwdns1787773:0crwdne1787773:0", + "-2029508615": "crwdns1787775:0crwdne1787775:0", "-818898181": "crwdns2956331:0crwdne2956331:0", "-310316375": "crwdns2956333:0crwdne2956333:0", "-485368404": "crwdns2956335:0crwdne2956335:0", "-367016488": "crwdns2956337:0crwdne2956337:0", "-1957076143": "crwdns2956339:0crwdne2956339:0", + "-231863107": "crwdns70248:0crwdne70248:0", + "-870902742": "crwdns1335155:0crwdne1335155:0", + "-1929477717": "crwdns1335157:0crwdne1335157:0", + "-1540148863": "crwdns1335159:0crwdne1335159:0", + "-922751756": "crwdns1335161:0crwdne1335161:0", + "-542986255": "crwdns1335163:0crwdne1335163:0", + "-1337206552": "crwdns1335165:0crwdne1335165:0", + "-456863190": "crwdns1419857:0crwdne1419857:0", + "-1314683258": "crwdns1335169:0crwdne1335169:0", + "-1546090184": "crwdns1335171:0crwdne1335171:0", + "-1636427115": "crwdns1335173:0crwdne1335173:0", + "-800221491": "crwdns1335175:0crwdne1335175:0", + "-811839563": "crwdns1335177:0crwdne1335177:0", + "-1185193552": "crwdns1335179:0crwdne1335179:0", + "-1046354": "crwdns1335181:0crwdne1335181:0", + "-1842858448": "crwdns1335183:0crwdne1335183:0", + "-860053164": "crwdns1742109:0crwdne1742109:0", + "-1250327770": "crwdns1742111:0crwdne1742111:0", + "-1222388581": "crwdns1742113:0crwdne1742113:0", "-1515286538": "crwdns167287:0crwdne167287:0", "-1694758788": "crwdns1935225:0crwdne1935225:0", "-1458676679": "crwdns81199:0crwdne81199:0", @@ -2479,6 +2498,8 @@ "-1437017790": "crwdns81191:0crwdne81191:0", "-70342544": "crwdns160976:0crwdne160976:0", "-39038029": "crwdns124020:0crwdne124020:0", + "-601903492": "crwdns124016:0crwdne124016:0", + "-1012699451": "crwdns124018:0crwdne124018:0", "-1894668798": "crwdns124406:0crwdne124406:0", "-1026468600": "crwdns124408:0crwdne124408:0", "-1743024217": "crwdns1600241:0crwdne1600241:0", @@ -2489,6 +2510,11 @@ "-536187647": "crwdns124120:0crwdne124120:0", "-1357606534": "crwdns124122:0crwdne124122:0", "-570222048": "crwdns124124:0crwdne124124:0", + "-80717068": "crwdns1220181:0crwdne1220181:0", + "-340060402": "crwdns3121280:0crwdne3121280:0", + "-619126443": "crwdns2981025:0{{brand_website_name}}crwdnd2981025:0{{platform_name_trader}}crwdne2981025:0", + "-623760979": "crwdns2981027:0{{brand_website_name}}crwdnd2981027:0{{platform_name_trader}}crwdnd2981027:0{{platform_name_go}}crwdne2981027:0", + "-459147994": "crwdns2981029:0{{brand_website_name}}crwdnd2981029:0{{platform_name_go}}crwdnd2981029:0{{platform_name_trader}}crwdnd2981029:0{{platform_name_smarttrader}}crwdnd2981029:0{{platform_name_dbot}}crwdnd2981029:0{{platform_name_ctrader}}crwdne2981029:0", "-1526404112": "crwdns2956341:0crwdne2956341:0", "-537552700": "crwdns2956343:0crwdne2956343:0", "-890084320": "crwdns81291:0crwdne81291:0", @@ -2510,11 +2536,20 @@ "-362324454": "crwdns838740:0crwdne838740:0", "-1071336803": "crwdns1600251:0crwdne1600251:0", "-820028470": "crwdns163524:0crwdne163524:0", - "-1255879419": "crwdns1925317:0crwdne1925317:0", + "-1186807402": "crwdns81525:0crwdne81525:0", + "-224804428": "crwdns70304:0crwdne70304:0", + "-470018967": "crwdns158028:0crwdne158028:0", + "-693105141": "crwdns3172804:0crwdne3172804:0", + "-1290112064": "crwdns1490907:0crwdne1490907:0", + "-145462920": "crwdns2981031:0crwdne2981031:0", + "-882362166": "crwdns3172806:0crwdne3172806:0", + "-1186915014": "crwdns3172808:0crwdne3172808:0", + "-1533139744": "crwdns3172810:0crwdne3172810:0", + "-549933762": "crwdns3172812:0crwdne3172812:0", + "-714679884": "crwdns3172814:0crwdne3172814:0", + "-794619351": "crwdns3172816:0crwdne3172816:0", "-1856204727": "crwdns70326:0crwdne70326:0", "-213142918": "crwdns1719465:0crwdne1719465:0", - "-224804428": "crwdns70304:0crwdne70304:0", - "-1186807402": "crwdns81525:0crwdne81525:0", "-1308346982": "crwdns1060504:0crwdne1060504:0", "-1145604233": "crwdns1742069:0crwdne1742069:0", "-328128497": "crwdns118044:0crwdne118044:0", @@ -2525,15 +2560,29 @@ "-81256466": "crwdns1719471:0crwdne1719471:0", "-699372497": "crwdns1719473:0crwdne1719473:0", "-1884966862": "crwdns1719475:0crwdne1719475:0", - "-145462920": "crwdns2981031:0crwdne2981031:0", "-982095728": "crwdns1719467:0crwdne1719467:0", + "-124150034": "crwdns3172818:0crwdne3172818:0", + "-677271147": "crwdns3172820:0crwdne3172820:0", + "-1829666875": "crwdns3172822:0crwdne3172822:0", + "-1504456361": "crwdns3172824:0crwdne3172824:0", + "-33612390": "crwdns2301239:0crwdne2301239:0", "-1277942366": "crwdns81505:0crwdne81505:0", + "-1255879419": "crwdns1925317:0crwdne1925317:0", "-493788773": "crwdns1719485:0crwdne1719485:0", "-673837884": "crwdns1719487:0crwdne1719487:0", "-230566990": "crwdns1719491:0crwdne1719491:0", "-846812148": "crwdns1719493:0crwdne1719493:0", + "-1320592007": "crwdns3172826:0crwdne3172826:0", + "-1283678015": "crwdns3172828:0crwdne3172828:0", + "-417529381": "crwdns3172830:0crwdne3172830:0", + "-1842223244": "crwdns3172832:0crwdne3172832:0", + "-437170875": "crwdns3172834:0crwdne3172834:0", "-2055865877": "crwdns1719495:0crwdne1719495:0", "-643108528": "crwdns1719497:0crwdne1719497:0", + "-979459594": "crwdns3172836:0crwdne3172836:0", + "-494667560": "crwdns2408577:0crwdne2408577:0", + "-679691613": "crwdns2408579:0crwdne2408579:0", + "-1002556560": "crwdns3172838:0crwdne3172838:0", "-172898036": "crwdns1719499:0crwdne1719499:0", "-1665192032": "crwdns1742051:0crwdne1742051:0", "-744999940": "crwdns118062:0crwdne118062:0", @@ -2543,9 +2592,20 @@ "-318106501": "crwdns1600265:0crwdne1600265:0", "-1328701106": "crwdns1600245:0crwdne1600245:0", "-1173266642": "crwdns2981033:0crwdne2981033:0", - "-1290112064": "crwdns1490907:0crwdne1490907:0", "-1453519913": "crwdns2352001:0crwdne2352001:0", "-2051096382": "crwdns2925233:0crwdne2925233:0", + "-623025665": "crwdns3172840:0{{balance}}crwdnd3172840:0{{currency}}crwdne3172840:0", + "-473300321": "crwdns3172842:0{{fiat_wallet_currency}}crwdnd3172842:0{{currency}}crwdnd3172842:0{{fiat_wallet_currency}}crwdne3172842:0", + "-596618970": "crwdns3172844:0crwdne3172844:0", + "-2006676463": "crwdns3172846:0crwdne3172846:0", + "-1078378070": "crwdns3172848:0crwdne3172848:0", + "-1989682739": "crwdns3172850:0crwdne3172850:0", + "-2102073579": "crwdns3172852:0{{balance}}crwdnd3172852:0{{currency}}crwdne3172852:0", + "-2082307900": "crwdns3172854:0crwdne3172854:0", + "-1483251744": "crwdns3172856:0crwdne3172856:0", + "-536126207": "crwdns3172858:0crwdne3172858:0", + "-486580863": "crwdns3172860:0crwdne3172860:0", + "-71189928": "crwdns3172862:0crwdne3172862:0", "-2146691203": "crwdns1719525:0crwdne1719525:0", "-249184528": "crwdns1719527:0crwdne1719527:0", "-1505234170": "crwdns1925319:0crwdne1925319:0", @@ -2556,7 +2616,21 @@ "-951876657": "crwdns1719537:0crwdne1719537:0", "-1945421757": "crwdns1719539:0crwdne1719539:0", "-1965920446": "crwdns81503:0crwdne81503:0", - "-33612390": "crwdns2301239:0crwdne2301239:0", + "-542766473": "crwdns3172864:0crwdne3172864:0", + "-327352856": "crwdns3172866:0crwdne3172866:0", + "-747378570": "crwdns3172868:0crwdne3172868:0", + "-917391116": "crwdns3172870:0crwdne3172870:0", + "-35169107": "crwdns3172872:0crwdne3172872:0", + "-2069339099": "crwdns3172874:0crwdne3172874:0", + "-1615726661": "crwdns3172876:0crwdne3172876:0", + "-132463075": "crwdns3172878:0crwdne3172878:0", + "-1215197245": "crwdns3172880:0crwdne3172880:0", + "-1325660250": "crwdns3172882:0crwdne3172882:0", + "-1643530462": "crwdns3172884:0crwdne3172884:0", + "-557603541": "crwdns3172886:0crwdne3172886:0", + "-1200921647": "crwdns3172888:0crwdne3172888:0", + "-1370356153": "crwdns3172890:0crwdne3172890:0", + "-2125046510": "crwdns3172892:0crwdne3172892:0", "-2021135479": "crwdns81511:0crwdne81511:0", "-1870909526": "crwdns160420:0crwdne160420:0", "-582721696": "crwdns169119:0{{format_min_withdraw_amount}}crwdnd169119:0{{format_max_withdraw_amount}}crwdnd169119:0{{currency}}crwdne169119:0", @@ -2703,6 +2777,7 @@ "-1707299138": "crwdns165865:0{{currency_symbol}}crwdne165865:0", "-38063175": "crwdns165869:0{{account_text}}crwdne165869:0", "-705272444": "crwdns160476:0crwdne160476:0", + "-259633143": "crwdns3172894:0crwdne3172894:0", "-2024958619": "crwdns160432:0crwdne160432:0", "-130833284": "crwdns168547:0crwdne168547:0", "-1531269493": "crwdns165887:0crwdne165887:0", @@ -2859,6 +2934,30 @@ "-1016171176": "crwdns2620885:0crwdne2620885:0", "-621128676": "crwdns2620887:0crwdne2620887:0", "-447853970": "crwdns2620889:0crwdne2620889:0", + "-155173714": "crwdns2101979:0crwdne2101979:0", + "-1919212468": "crwdns2101983:0crwdne2101983:0", + "-1520558271": "crwdns2101985:0crwdne2101985:0", + "-980360663": "crwdns2101987:0crwdne2101987:0", + "-1493168314": "crwdns2101989:0crwdne2101989:0", + "-1680391945": "crwdns2101993:0crwdne2101993:0", + "-1177914473": "crwdns2101995:0crwdne2101995:0", + "-271986909": "crwdns2101997:0crwdne2101997:0", + "-1149045595": "crwdns2102001:0crwdne2102001:0", + "-288041546": "crwdns2102003:0crwdne2102003:0", + "-2127548288": "crwdns2102005:0crwdne2102005:0", + "-1311297611": "crwdns2102007:0crwdne2102007:0", + "-1549564044": "crwdns2102009:0crwdne2102009:0", + "-1127331928": "crwdns2102011:0crwdne2102011:0", + "-1720444288": "crwdns2301471:0crwdne2301471:0", + "-1142295124": "crwdns2301473:0crwdne2301473:0", + "-986689483": "crwdns2102017:0crwdne2102017:0", + "-269910127": "crwdns2925341:0crwdne2925341:0", + "-1565344891": "crwdns2301475:0crwdne2301475:0", + "-90192474": "crwdns2102029:0crwdne2102029:0", + "-213872712": "crwdns2301477:0crwdne2301477:0", + "-2147346223": "crwdns2301479:0crwdne2301479:0", + "-352345777": "crwdns2102037:0crwdne2102037:0", + "-552392096": "crwdns2301481:0crwdne2301481:0", "-507620484": "crwdns122660:0crwdne122660:0", "-764102808": "crwdns89506:0crwdne89506:0", "-555886064": "crwdns70286:0crwdne70286:0", @@ -2937,30 +3036,6 @@ "-1823621139": "crwdns123896:0crwdne123896:0", "-1778025545": "crwdns2101885:0crwdne2101885:0", "-1519425996": "crwdns2101977:0{{ faq_search_value }}crwdne2101977:0", - "-155173714": "crwdns2101979:0crwdne2101979:0", - "-1919212468": "crwdns2101983:0crwdne2101983:0", - "-1520558271": "crwdns2101985:0crwdne2101985:0", - "-980360663": "crwdns2101987:0crwdne2101987:0", - "-1493168314": "crwdns2101989:0crwdne2101989:0", - "-1680391945": "crwdns2101993:0crwdne2101993:0", - "-1177914473": "crwdns2101995:0crwdne2101995:0", - "-271986909": "crwdns2101997:0crwdne2101997:0", - "-1149045595": "crwdns2102001:0crwdne2102001:0", - "-288041546": "crwdns2102003:0crwdne2102003:0", - "-2127548288": "crwdns2102005:0crwdne2102005:0", - "-1311297611": "crwdns2102007:0crwdne2102007:0", - "-1549564044": "crwdns2102009:0crwdne2102009:0", - "-1127331928": "crwdns2102011:0crwdne2102011:0", - "-1720444288": "crwdns2301471:0crwdne2301471:0", - "-1142295124": "crwdns2301473:0crwdne2301473:0", - "-986689483": "crwdns2102017:0crwdne2102017:0", - "-269910127": "crwdns2925341:0crwdne2925341:0", - "-1565344891": "crwdns2301475:0crwdne2301475:0", - "-90192474": "crwdns2102029:0crwdne2102029:0", - "-213872712": "crwdns2301477:0crwdne2301477:0", - "-2147346223": "crwdns2301479:0crwdne2301479:0", - "-352345777": "crwdns2102037:0crwdne2102037:0", - "-552392096": "crwdns2301481:0crwdne2301481:0", "-418247251": "crwdns125122:0crwdne125122:0", "-2123571162": "crwdns838744:0crwdne838744:0", "-870004399": "crwdns117766:0{{longcode}}crwdnd117766:0{{transaction_id}}crwdne117766:0", @@ -2998,8 +3073,6 @@ "-883103549": "crwdns123904:0crwdne123904:0", "-1837059346": "crwdns2408573:0crwdne2408573:0", "-1845037007": "crwdns2408575:0crwdne2408575:0", - "-494667560": "crwdns2408577:0crwdne2408577:0", - "-679691613": "crwdns2408579:0crwdne2408579:0", "-821418875": "crwdns81433:0crwdne81433:0", "-679102561": "crwdns80823:0crwdne80823:0", "-430118939": "crwdns123914:0crwdne123914:0", @@ -3082,7 +3155,6 @@ "-430041639": "crwdns1092164:0crwdne1092164:0", "-87177461": "crwdns168069:0crwdne168069:0", "-904632610": "crwdns158026:0crwdne158026:0", - "-470018967": "crwdns158028:0crwdne158028:0", "-156611181": "crwdns168063:0crwdne168063:0", "-1925176811": "crwdns168043:0crwdne168043:0", "-980696193": "crwdns168045:0crwdne168045:0", @@ -3107,12 +3179,12 @@ "-577279362": "crwdns1555149:0crwdne1555149:0", "-197134911": "crwdns1555151:0crwdne1555151:0", "-152823394": "crwdns1555153:0crwdne1555153:0", + "-822813736": "crwdns3172896:0crwdne3172896:0", "-420930276": "crwdns2694283:0crwdne2694283:0", "-2142540205": "crwdns1490909:0crwdne1490909:0", "-482715448": "crwdns1490911:0crwdne1490911:0", "-2072411961": "crwdns1490913:0crwdne1490913:0", "-384887227": "crwdns1490915:0crwdne1490915:0", - "-448961363": "crwdns1787781:0crwdne1787781:0", "-1998049070": "crwdns123964:0crwdne123964:0", "-402093392": "crwdns838642:0crwdne838642:0", "-1721181859": "crwdns123966:0{{deriv_account}}crwdne123966:0", @@ -3125,7 +3197,6 @@ "-650505513": "crwdns123978:0crwdne123978:0", "-1823504435": "crwdns81485:0crwdne81485:0", "-1954045170": "crwdns81487:0crwdne81487:0", - "-583559763": "crwdns89670:0crwdne89670:0", "-1591792668": "crwdns1361671:0crwdne1361671:0", "-34495732": "crwdns1361673:0crwdne1361673:0", "-1496158755": "crwdns1361675:0crwdne1361675:0", @@ -3259,6 +3330,7 @@ "-818926350": "crwdns124116:0crwdne124116:0", "-1825471709": "crwdns89660:0crwdne89660:0", "-981017278": "crwdns89662:0crwdne89662:0", + "-583559763": "crwdns89670:0crwdne89670:0", "-778309978": "crwdns2738165:0crwdne2738165:0", "-336222114": "crwdns2694285:0crwdne2694285:0", "-1064116456": "crwdns2694287:0crwdne2694287:0", @@ -3415,22 +3487,6 @@ "-1282933308": "crwdns117860:0{{barrier}}crwdne117860:0", "-968190634": "crwdns117862:0{{barrier}}crwdne117862:0", "-1747377543": "crwdns117864:0{{barrier}}crwdne117864:0", - "-256210543": "crwdns81079:0crwdne81079:0", - "-1150099396": "crwdns1308113:0crwdne1308113:0", - "-28115241": "crwdns496942:0{{platform_name_trader}}crwdne496942:0", - "-453920758": "crwdns496944:0{{platform_name_mt5}}crwdne496944:0", - "-402175529": "crwdns89548:0crwdne89548:0", - "-902712434": "crwdns89522:0crwdne89522:0", - "-988484646": "crwdns89550:0crwdne89550:0", - "-444882676": "crwdns89552:0crwdne89552:0", - "-13423018": "crwdns70594:0crwdne70594:0", - "-2035315547": "crwdns69764:0crwdne69764:0", - "-1551639437": "crwdns89554:0crwdne89554:0", - "-1214703885": "crwdns89556:0crwdne89556:0", - "-504849554": "crwdns160182:0crwdne160182:0", - "-59803288": "crwdns160184:0crwdne160184:0", - "-1278109940": "crwdns160186:0crwdne160186:0", - "-694105443": "crwdns160188:0crwdne160188:0", "-1043795232": "crwdns120656:0crwdne120656:0", "-1511825574": "crwdns70276:0crwdne70276:0", "-726626679": "crwdns70278:0crwdne70278:0", @@ -3455,21 +3511,15 @@ "-1435392215": "crwdns124768:0crwdne124768:0", "-2017825013": "crwdns124770:0crwdne124770:0", "-1192773792": "crwdns89638:0crwdne89638:0", + "-902712434": "crwdns89522:0crwdne89522:0", "-1280319153": "crwdns125212:0crwdne125212:0", "-471757681": "crwdns124772:0crwdne124772:0", "-843831637": "crwdns89524:0crwdne89524:0", "-771725194": "crwdns124776:0crwdne124776:0", "-338707425": "crwdns81109:0crwdne81109:0", "-1003473648": "crwdns117900:0{{duration}}crwdne117900:0", - "-740702998": "crwdns2738433:0{{title}}crwdnd2738433:0{{message}}crwdne2738433:0", - "-1669741470": "crwdns2341237:0crwdne2341237:0", "-1527492178": "crwdns81417:0crwdne81417:0", "-725375562": "crwdns81419:0crwdne81419:0", - "-774638412": "crwdns3031433:0{{min_stake}}crwdnd3031433:0{{currency}}crwdnd3031433:0{{max_stake}}crwdnd3031433:0{{currency}}crwdne3031433:0", - "-1358367903": "crwdns69662:0crwdne69662:0", - "-434270664": "crwdns2080563:0crwdne2080563:0", - "-1956787775": "crwdns2080565:0crwdne2080565:0", - "-1513281069": "crwdns121004:0crwdne121004:0", "-390994177": "crwdns89650:0{{min}}crwdnd89650:0{{max}}crwdne89650:0", "-1804019534": "crwdns2341239:0{{date}}crwdne2341239:0", "-2055106024": "crwdns117292:0crwdne117292:0", @@ -3484,6 +3534,7 @@ "-1763848396": "crwdns1781087:0crwdne1781087:0", "-194424366": "crwdns1781095:0crwdne1781095:0", "-857660728": "crwdns1781103:0crwdne1781103:0", + "-1358367903": "crwdns69662:0crwdne69662:0", "-1386326276": "crwdns81059:0crwdne81059:0", "-1418742026": "crwdns81061:0crwdne81061:0", "-92007689": "crwdns81063:0crwdne81063:0", @@ -3491,6 +3542,21 @@ "-1975910372": "crwdns81067:0crwdne81067:0", "-866277689": "crwdns81069:0crwdne81069:0", "-1455298001": "crwdns81075:0crwdne81075:0", + "-256210543": "crwdns81079:0crwdne81079:0", + "-1150099396": "crwdns1308113:0crwdne1308113:0", + "-28115241": "crwdns496942:0{{platform_name_trader}}crwdne496942:0", + "-453920758": "crwdns496944:0{{platform_name_mt5}}crwdne496944:0", + "-402175529": "crwdns89548:0crwdne89548:0", + "-988484646": "crwdns89550:0crwdne89550:0", + "-444882676": "crwdns89552:0crwdne89552:0", + "-13423018": "crwdns70594:0crwdne70594:0", + "-2035315547": "crwdns69764:0crwdne69764:0", + "-1551639437": "crwdns89554:0crwdne89554:0", + "-1214703885": "crwdns89556:0crwdne89556:0", + "-504849554": "crwdns160182:0crwdne160182:0", + "-59803288": "crwdns160184:0crwdne160184:0", + "-1278109940": "crwdns160186:0crwdne160186:0", + "-694105443": "crwdns160188:0crwdne160188:0", "-439389714": "crwdns120644:0crwdne120644:0", "-770929448": "crwdns496946:0{{platform_name_smarttrader}}crwdne496946:0", "-347156282": "crwdns1807479:0crwdne1807479:0", @@ -3537,6 +3603,8 @@ "-454245976": "crwdns2738439:0crwdne2738439:0", "-351875097": "crwdns1822843:0crwdne1822843:0", "-729830082": "crwdns2363141:0crwdne2363141:0", + "-1669741470": "crwdns2341237:0crwdne2341237:0", + "-740702998": "crwdns2738433:0{{title}}crwdnd2738433:0{{message}}crwdne2738433:0", "-1790089996": "crwdns89532:0crwdne89532:0", "-993480898": "crwdns1822835:0crwdne1822835:0", "-45873457": "crwdns157388:0crwdne157388:0", @@ -3557,6 +3625,10 @@ "-690963898": "crwdns2225585:0crwdne2225585:0", "-511541916": "crwdns2225587:0crwdne2225587:0", "-438655760": "crwdns3030605:0crwdne3030605:0", + "-774638412": "crwdns3031433:0{{min_stake}}crwdnd3031433:0{{currency}}crwdnd3031433:0{{max_stake}}crwdnd3031433:0{{currency}}crwdne3031433:0", + "-434270664": "crwdns2080563:0crwdne2080563:0", + "-1956787775": "crwdns2080565:0crwdne2080565:0", + "-1513281069": "crwdns121004:0crwdne121004:0", "-1683683754": "crwdns2738429:0crwdne2738429:0", "-1046859144": "crwdns2738441:0{{title}}crwdnd2738441:0{{price_position}}crwdne2738441:0", "-1815023694": "crwdns2738443:0crwdne2738443:0", diff --git a/packages/translations/src/translations/ar.json b/packages/translations/src/translations/ar.json index 31c769109be4..5514097bcc56 100644 --- a/packages/translations/src/translations/ar.json +++ b/packages/translations/src/translations/ar.json @@ -24,7 +24,6 @@ "27731356": "تم تعطيل حسابك مؤقتًا. يرجى الاتصال بنا عبر <0>الدردشة الحية لتمكين عمليات الإيداع والسحب مرة أخرى.", "27830635": "شركة ديريف (V) المحدودة", "28581045": "أضف حساب MT5 حقيقي", - "30801950": "سيتم فتح حسابك لدى {{legal_entity_name}} ، تنظمها هيئة مالطا للألعاب ، وسيخضع لقوانين مالطا.", "33433576": "يرجى استخدام المحفظة الإلكترونية لسحب أموالك.", "35089987": "قم بتحميل الجزء الأمامي والخلفي من رخصة القيادة الخاصة بك.", "41737927": "شكرًا لك", @@ -60,11 +59,13 @@ "72500774": "يرجى ملء الإقامة الضريبية.", "73086872": "لقد استثنيت نفسك من التداول", "73326375": "الأدنى هو أدنى نقطة وصل إليها السوق خلال فترة العقد.", + "74836780": "{{currency_code}} Wallet", "74963864": "تحت", "76916358": "لقد وصلت إلى حد السحب.<0/> يرجى تحميل إثبات الهوية والعنوان لرفع الحد لمواصلة السحب.", "76925355": "تحقق من أداء الروبوت الخاص بك", "77945356": "تداول أثناء التنقل باستخدام تطبيق الهاتف المحمول الخاص بنا.", "77982950": "تتيح لك خيارات الفانيلا التنبؤ بالاتجاه التصاعدي (الصعودي) أو الهبوطي (الهبوطي) للأصل الأساسي عن طريق شراء «Call» أو «Put».", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "لم نتمكن من العثور على هذه الصفحة", "82839270": "قم بتحميل صفحة جواز السفر الخاص بك التي تحتوي على صورتك الشخصية.", "83202647": "كتلة الانهيار", @@ -76,6 +77,7 @@ "90266322": "2. ابدأ محادثة مع روبوت Telegram الذي تم إنشاؤه حديثًا وتأكد من إرسال بعض الرسائل إليه قبل المتابعة إلى الخطوة التالية. (على سبيل المثال Hello Bot!)", "91993812": "استراتيجية مارتينجال هي تقنية تداول كلاسيكية تم استخدامها لأكثر من مائة عام ، وقد اشتهر بها عالم الرياضيات الفرنسي بول بيير ليفي في القرن الثامن عشر.", "93154671": "1. اضغط على Reset في الجزء السفلي من لوحة الإحصائيات.", + "93939827": "Cryptocurrency accounts", "96381225": "فشل التحقق من الهوية", "98473502": "نحن لسنا ملزمين بإجراء اختبار الملاءمة، ولا نقدم لك أي تحذيرات بشأن المخاطر.", "98972777": "عنصر عشوائي", @@ -83,6 +85,7 @@ "102226908": "لا يمكن ترك الحقل فارغًا", "108916570": "المدة: {{duration}} يوم", "109073671": "يرجى استخدام المحفظة الإلكترونية التي استخدمتها للودائع سابقًا. تأكد من أن المحفظة الإلكترونية تدعم السحب. راجع قائمة المحافظ الإلكترونية التي تدعم عمليات السحب <0>هنا.", + "110822969": "One Wallet for all your transactions", "111215238": "ابتعد عن الضوء المباشر", "111718006": "تاريخ الانتهاء", "111931529": "الحد الأقصى لإجمالي الحصة على مدى 7 أيام", @@ -215,7 +218,9 @@ "251882697": "شكرًا لك! تم تسجيل ردك في نظامنا.<0/><0/> الرجاء النقر فوق «موافق» للمتابعة.", "254912581": "تشبه هذه الكتلة EMA، إلا أنها تمنحك خط EMA بالكامل استنادًا إلى قائمة الإدخال والفترة المحددة.", "256031314": "الأعمال النقدية", + "256123827": "What happens to my trading accounts", "256602726": "إذا قمت بإغلاق حسابك:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "تقييم التداول", "260069181": "حدث خطأ أثناء محاولة تحميل عنوان URL", @@ -250,8 +255,8 @@ "284527272": "مضاد للوضع", "284772879": "عقد", "284809500": "حساب مالي تجريبي", + "285909860": "Demo {{currency}} Wallet", "287934290": "هل تريد بالتأكيد إلغاء هذه المعاملة؟", - "289898640": "شروط الاستخدام", "291744889": "<0>1. معايير التجارة: <0>", "291817757": "انتقل إلى مجتمع Deriv الخاص بنا وتعرف على واجهات برمجة التطبيقات ورموز API وطرق استخدام واجهات برمجة تطبيقات Deriv والمزيد.", "292491635": "إذا اخترت «إيقاف الخسارة» وحددت مبلغًا للحد من خسارتك، فسيتم إغلاق مركزك تلقائيًا عندما تكون خسارتك أكثر من أو تساوي هذا المبلغ. قد تكون خسارتك أكثر من المبلغ الذي أدخلته اعتمادًا على سعر السوق عند الإغلاق.", @@ -299,6 +304,7 @@ "344418897": "تساعدك حدود التداول والاستبعاد الذاتي هذه على التحكم في مقدار المال والوقت الذي تقضيه على {{brand_website_name}} وممارسة <0>التداول المسؤول.", "345320063": "طابع زمني غير صالح", "345818851": "عذرًا، حدث خطأ داخلي. اضغط على مربع الاختيار أعلاه للمحاولة مرة أخرى.", + "346214602": "A better way to manage your funds", "347029309": "الفوركس: قياسي/مايكرو", "347039138": "التكرار (2)", "347217485": "هل تواجه مشكلة في الوصول إلى Deriv MT5 على هاتفك المحمول؟", @@ -353,6 +359,7 @@ "401345454": "انتقل إلى علامة تبويب البرامج التعليمية للقيام بذلك.", "402343402": "نظرًا لوجود مشكلة على الخادم الخاص بنا، فإن بعض حسابات {{platform}} الخاصة بك غير متوفرة في الوقت الحالي. يرجى التحمل معنا وشكرًا لك على سعة صدرك.", "403456289": "صيغة SMA هي:", + "403608958": "Select a trading account or a Wallet", "404743411": "إجمالي الودائع", "406359555": "تفاصيل العقد", "406497323": "قم ببيع عقدك النشط إذا لزم الأمر (اختياري)", @@ -373,6 +380,7 @@ "427617266": "بيتكوين", "428709688": "الفاصل الزمني المفضل لديك بين كل تقرير:", "431267979": "إليك دليل سريع حول كيفية استخدام Deriv Bot أثناء التنقل.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "جني الأرباح: {{ currency }} {{ take_profit }}", "432519573": "تم تحميل المستند", @@ -453,12 +461,12 @@ "518955798": "7. قم بالتشغيل مرة واحدة في البداية", "520136698": "مؤشر بوم 500", "521872670": "عنصر", - "522283618": "تجربة تداول الخيارات الرقمية", "522703281": "قابلة للقسمة على", "523123321": "- 10 إلى قوة الرقم المعطى \n", "524459540": "كيف أقوم بإنشاء متغيرات؟", "527329988": "هذه اعلى 100 كلمة مرور اكثر استخداماً", "529056539": "خيارات", + "530864956": "Deriv Apps", "530953413": "التطبيقات المعتمدة", "531114081": "3. نوع العقد", "531675669": "يورو", @@ -473,10 +481,13 @@ "543915570": "الفوركس والأسهم ومؤشرات الأسهم والعملات المشفرة والمؤشرات الاصطناعية", "545476424": "إجمالي عمليات السحب", "549479175": "المضاعفات من Deriv", + "549799607": "Go to LiveChat", "550589723": "ستنمو حصتك بنسبة {{growth_rate}}% لكل علامة طالما ظل السعر الفوري الحالي في حدود ±{{tick_size_barrier}} من السعر الفوري السابق.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "تعرف على المزيد حول حدود التداول", "554135844": "تعديل", "554410233": "هذه هي أفضل 10 كلمات مرور شائعة", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "بعد تحديد معايير التجارة وخيارات التداول، قد ترغب في توجيه الروبوت الخاص بك لشراء العقود عند استيفاء شروط محددة. للقيام بذلك، يمكنك استخدام الكتل الشرطية وكتل المؤشرات لمساعدة الروبوت الخاص بك على اتخاذ القرارات.", "555881991": "قسيمة رقم الهوية الوطنية", "556264438": "فترة زمنية", @@ -552,6 +563,7 @@ "629395043": "جميع معدلات النمو", "632398049": "تقوم هذه الكتلة بتعيين قيمة فارغة لعنصر أو بيان.", "634219491": "لم تقدم رَقَم التعريف الضريبي الخاص بك. هذه المعلومات ضرورية للمتطلبات القانونية والتنظيمية. يرجى الانتقال إلى <0>التفاصيل الشخصية في إعدادات حسابك، و أملأ أحدث رَقَم تعريف ضريبي.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>ج. إذا لم يتم العثور على فرصة للتسوية، ستنتقل الشكوى إلى مرحلة التحديد الذي ستتعامل معها لجنة فض المنازعات", "639382772": "يرجى تحميل نوع الملف المدعوم.", "640596349": "لم تتلق أي إشعارات حتى الآن", @@ -562,7 +574,6 @@ "642546661": "قم بتحميل نسخة احتياطية من الترخيص من جهاز الكمبيوتر الخاص بك", "642995056": "البريد الإلكتروني", "644150241": "عدد العقود التي فزت بها منذ آخر مرة قمت فيها بمسح الإحصائيات الخاصة بك.", - "645016681": "تكرار التداول في الأدوات المالية الأخرى", "645902266": "يورو/دولار نيوزيلندي", "647039329": "مطلوب إثبات العنوان ", "647745382": "قائمة الإدخال {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "في المثال أدناه، يتم تحديد سعر الافتتاح، والذي يتم تعيينه بعد ذلك لمتغير يسمى «op».", "666724936": "يرجى إدخال رقم هوية صالح.", "672008428": "Zcach/دولار أمريكي", + "672731171": "Non-EU USD accounts", "673915530": "السلطة القضائية واختيار القانون", "674973192": "استخدم كلمة المرور هذه لتسجيل الدخول إلى حسابات Deriv MT5 الخاصة بك على تطبيقات الحاسوب والويب والجوال.", "676159329": "تعذر التبديل إلى الحساب الافتراضي.", @@ -613,6 +625,7 @@ "692354762": "الرجاء إدخال الخاص بك {{document_name}}. {{example_format}}", "693396140": "إلغاء الصفقة (منتهية الصلاحية)", "694035561": "مضاعفات خيارات التجارة", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- وقت الفتح: طابع وقت الافتتاح", "697630556": "هذا السوق مغلق حاليًا.", "698037001": "رقم الهوية الوطنية", @@ -624,8 +637,8 @@ "701647434": "ابحث عن سلسلة", "702451070": "بطاقة الهوية الوطنية (بدون صورة)", "702561961": "تغيير الموضوع", + "705262734": "Your Wallets are ready", "705299518": "بعد ذلك، قم بتحميل صفحة جواز سفرك التي تحتوي على صورتك.", - "706413212": "للوصول إلى الصراف (الكاشير)، أنت الآن في حساب {{regulation}} {{currency}} ({{loginid}}) الخاص بك.", "706727320": "تردد تداول الخيارات الثنائية", "706755289": "تؤدي هذه المجموعة المهام مثلثية.", "706960383": "سنعرض شراء عقدك بهذا السعر إذا اخترت بيعه قبل انتهاء صلاحيته. يعتمد هذا على عدة عوامل، مثل السعر الفوري الحالي والمدة وما إلى ذلك، ومع ذلك، لن نقدم قيمة العقد إذا كانت المدة المتبقية أقل من 60 ثانية.", @@ -644,6 +657,7 @@ "720293140": "تسجيل خروج", "720519019": "إعادة تعيين كلمة المرور الخاصة بي", "721011817": "- ارفع الرقم الأول إلى قوة الرقم الثاني", + "722797282": "EU-regulated USD accounts", "723045653": "ستقوم بتسجيل الدخول إلى حساب Deriv الخاص بك باستخدام عنوان البريد الإلكتروني هذا.", "723961296": "إدارة كلمة المرور", "724203548": "يمكنك إرسال شكواك إلى <0>حل النزاعات عبر الإنترنت (ODR) التابعة للمفوضية الأوروبية. هذا لا ينطبق على عملاء المملكة المتحدة.", @@ -656,6 +670,7 @@ "734390964": "رصيد غير كافٍ", "734881840": "خاطئ", "742469109": "إعادة ضبط الرصيد", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "تداول العقود مقابل الفروقات على الفوركس والمؤشرات المشتقة والعملات المشفرة والسلع برافعة مالية عالية.", "743623600": "مرجع", "744110277": "مصفوفة بولينجر باندز (BBA)", @@ -689,6 +704,7 @@ "775706054": "هل تبيعون بوتات التداول؟", "776085955": "الإستراتيجيات", "781924436": "انتشار المكالمات/انتشار البيع", + "782563319": "Add more Wallets", "783974693": "تجنب السنوات الأخيرة", "784311461": "متوسط المتحرك الأسي (EMA)", "784583814": "مرتبط بجهاز الكمبيوتر الخاص بك", @@ -725,6 +741,7 @@ "818447476": "تبديل الحساب؟", "820877027": "يرجى التحقق من إثبات هويتك", "821163626": "تتم صيانة الخادم كل أول سبت من الشهر من الساعة 7 إلى 10 بتوقيت جرينتش. قد تواجه انقطاع الخدمة خلال هذا الوقت.", + "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": "كتلة يمكن أن تحتوي على نص.", "824797920": "هل القائمة فارغة؟", "825042307": "دعونا نحاول مرة أخرى", @@ -747,7 +764,6 @@ "836097457": "أنا مهتم بالتداول ولكن لدي خبرة قليلة جدًا.", "837063385": "لا ترسل عملات أخرى إلى هذا العنوان.", "837066896": "يتم مراجعة المستند الخاص بك، يرجى التحقق مرة أخرى في غضون 1-3 أيام.", - "839618971": "عنوان", "839805709": "للتحقق منك بسلاسة، نحتاج إلى صورة أفضل", "840672750": "إذا لم ينجح ذلك، فقم بإلغاء تثبيت تطبيق MT5 وإعادة تثبيته. ثم أعد الخطوتين <0>2 و <0>3.", "841434703": "تعطيل المكدس", @@ -844,9 +860,9 @@ "943535887": "يرجى إغلاق مراكزك في حساب (حسابات) ديريف MT5 التالي:", "944499219": "الحد الأقصى للمراكز المفتوحة", "945532698": "تم بيع العقد", + "945753712": "Back to Trader’s Hub", "946204249": "اقرأ", "946841802": "تشير الشمعة البيضاء (أو الخضراء) إلى أن سعر الفتح أقل من سعر الإغلاق. يمثل هذه حركة صعودية لسعر السوق.", - "946944859": "اضغط على الزر أدناه وسنرسل لك بريدًا إلكترونيًا يحتوي على رابط .اضغط فوق هذا الارتباط للتحقق من طلب السحب الخاص بك.", "947046137": "ستتم عملية السحب الخاصة بك في غضون 24 ساعة", "947363256": "إنشاء قائمة", "947758334": "المدينة مطلوبة", @@ -950,6 +966,7 @@ "1050128247": "أؤكد أنني تحققت من معلومات تحويل وكيل الدفع.", "1050844889": "تقارير", "1052779010": "أنت على حسابك التجريبي", + "1052921318": "{{currency}} Wallet", "1053153674": "مؤشر جمب/ القفز 50", "1053159279": "مستوى التعليم", "1053556481": "بمجرد تقديم شكواك، سنرسل لك رسالة تأكيد بالبريد الإلكتروني لتأكيد استلامنا لها.", @@ -1010,6 +1027,7 @@ "1110102997": "بيان", "1112582372": "مدة الفاصل الزمني", "1113119682": "تمنحك هذه المجموعة قيمة الشمعة المحددة من قائمة الشموع.", + "1113221217": "MT5 Swap-free", "1113292761": "أقل من 8 ميجابايت", "1114679006": "لقد نجحت في إنشاء الروبوت الخاص بك باستخدام استراتيجية بسيطة.", "1117281935": "شروط البيع (اختياري)", @@ -1036,6 +1054,7 @@ "1134879544": "مثال لوثيقة ذات وهج", "1138126442": "الفوركس: قياسي", "1139483178": "تفعيل الكتل ", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "الاتجاه هو {{ direction_type }}", "1144028300": "مصفوفة مؤشر القوة النسبية (RSIA)", "1145927365": "قم بتشغيل الكتل بالداخل بعد عدد معين من الثواني", @@ -1066,7 +1085,6 @@ "1174689133": "3. قم بتعيين معايير التداول الخاصة بك واضغط على Run.", "1174748431": "قناة الدفع", "1175183064": "فانواتو/Vanuatu", - "1176926166": "خبرة في تداول الأدوات المالية الأخرى", "1177396776": "إذا اخترت «Asian Fall»، ستربح بالعائد إذا كانت العلامة الأخيرة أقل من متوسط العلامات.", "1177723589": "لا توجد معاملات لعرضها", "1178582280": "عدد العقود التي فقدتها منذ آخر مرة مسحت فيها إحصائياتك.", @@ -1077,6 +1095,7 @@ "1181396316": "تمنحك هذه المجموعة رقمًا عشوائيًا من داخل نطاق محدد", "1181770592": "الربح/الخسارة من البيع", "1183007646": "- نوع العقد: اسم نوع العقد مثل Rise، Fall، Touch، No Touch، إلخ.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "أغلق عقدك الآن أو استمر في تشغيله. إذا قررت الاستمرار في تشغيله، يمكنك التحقق منه وإغلاقه لاحقًا على ", "1188316409": "لتلقي أموالك، اتصل بوكيل الدفع بالتفاصيل أدناه", "1188980408": "5 دقائق", @@ -1094,12 +1113,14 @@ "1201773643": "رقمية", "1203297580": "يرسل هذا الحظر رسالة إلى قناة تليجرام", "1204223111": "في هذا المثال، يتم تعيين الأسعار المفتوحة من قائمة الشموع لمتغير يسمى «candle_list».", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "كيف تخفي بطاقتك؟", "1206821331": "القوات المسلحة", "1207152000": "اختر قالبًا وقم بتعيين معايير التداول الخاصة بك.", "1208714859": "لفترة قصيرة:", "1208729868": "القراد", "1208903663": "عملة غير صالحة", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "يتم بدء تشغيل البوت", "1214893428": "إنشاء الحساب غير متاح حاليًا على الهاتف المحمول. يرجى تسجيل الدخول باستخدام جهاز الكمبيوتر الخاص بك لإنشاء حساب جديد.", "1216408337": "العاملون لحسابهم الخاص", @@ -1112,6 +1133,7 @@ "1222521778": "من الصعب إجراء عمليات الإيداع والسحب.", "1222544232": "لقد أرسلنا لك بريدًا إلكترونيًا", "1225150022": "عدد الأصول", + "1226027513": "Transfer from", "1227074958": "كسر عشوائي", "1227240509": "تقليل المساحات", "1228534821": "قد لا يتم دعم بعض العملات من قبل وكلاء الدفع في بلدك.", @@ -1121,6 +1143,7 @@ "1232291311": "الحد الأقصى للسحب المتبقي", "1232353969": "من 0 إلى 5 معاملات خلال الـ 12 شهرًا الماضية", "1233300532": "الدفع", + "1233376285": "Options & multipliers", "1234292259": "مصدر الثروة", "1234764730": "قم بتحميل لقطة شاشة لاسمك وعنوان بريدك الإلكتروني من قسم التفاصيل الشخصية.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "يقوم بفرز العناصر في قائمة معينة، حسب قيمتها الرقمية أو الأبجدية، إما بترتيب تصاعدي أو تنازلي.", "1281290230": "اختار", "1282951921": "أونلي داونز", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "إذا تم اختيار «الخسارة»، فسوف يتم إرجاع «صحيح» إذا لم تنجح عملية التداول الأخيرة الخاصة بك. وإلا، فسوف تقوم بإرجاع سلسلة فارغة.", "1286094280": "سحب", "1286507651": "أغلق شاشة التحقق من الهوية", @@ -1173,7 +1197,6 @@ "1289146554": "لجنة الخدمات المالية لجزر فيرجن البريطانية", "1289646209": "نداء الهامش", "1290525720": "مثال: ", - "1291887623": "تردد تداول الخيارات الرقمية", "1291997417": "ستنتهي العقود في تمام الساعة 23:59:59 بتوقيت جرينتش في تاريخ انتهاء الصلاحية المحدد.", "1292188546": "إعادة تعيين كلمة مرور مستثمر Deriv MT5", "1292891860": "قم ابلاغ/اشعار تيليجرام", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (بيع)", "1329136554": "مؤشر القفز (Jump) 200", "1329325646": "يتم استدعاء محتوى هذه المجموعة في كل علامة", + "1330479159": "Ready to upgrade?", "1331199417": "يرجى إدخال التنسيق الصحيح. ", "1331367811": "رقم حساب العميل", "1332168410": "تعرف على المزيد", @@ -1257,7 +1281,6 @@ "1367023655": "لضمان عدم تجاوز خسارتك لحصتك، سيتم إغلاق عقدك تلقائيًا عندما تساوي خسارتك<0/>.", "1367488817": "4. شروط إعادة تشغيل التداول", "1367990698": "مؤشر التقلب 10", - "1369709538": "شروط الاستخدام الخاصة بنا", "1370647009": "استمتع بحدود يومية أعلى", "1371193412": "إلغاء", "1371555192": "اختر وكيل الدفع المفضل لديك وأدخل مبلغ السحب. إذا لم يكن وكيل الدفع الخاص بك مدرجًا، <0>فابحث عنه باستخدام رقم حسابه.", @@ -1319,6 +1342,7 @@ "1434767075": "ابدأ باستخدام Deriv Bot", "1434976996": "إعلان", "1435363248": "تقوم هذه المجموعة بتحويل عدد الثواني منذ عصر Unix إلى صيغة التاريخ والوقت مثل 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "الحد الأدنى للإيداع", "1437396005": "إضافة تعليق", "1438247001": "يحصل العميل المحترف على درجة أقل من حماية العميل بسبب ما يلي.", @@ -1369,6 +1393,7 @@ "1476301886": "على غرار SMA، تمنحك هذه الكتلة سطر SMA بأكمله الذي يحتوي على قائمة بجميع القيم لفترة معينة.", "1478030986": "قم بإنشاء أو حذف رموز API للتداول والسحب", "1480915523": "تخطي", + "1481860194": "Your new Wallet(s)", "1481977420": "الرجاء مساعدتنا في التحقق من طلب السحب الخاص بك.", "1483470662": "انقر فوق «فتح» لبدء التداول بحسابك", "1484336612": "تُستخدم هذه الكتلة إما لإنهاء حلقة أو متابعتها، ويمكن وضعها في أي مكان داخل كتلة الحلقة.", @@ -1389,6 +1414,7 @@ "1505420815": "لم يتم العثور على وكلاء دفع لبحثك", "1505898522": "تحميل المكدس", "1505927599": "تعرضت خوادمنا لعثرة. دعونا نحدث للمضي قدمًا.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (شراء)", "1509678193": "التعليم", @@ -1419,7 +1445,7 @@ "1542742708": "المواد التركيبية والفوركس والأسهم ومؤشرات الأسهم والسلع والعملات المشفرة", "1544642951": "إذا اخترت «Only Ups»، فستفوز بالعائد إذا ارتفعت العلامات المتتالية تباعًا بعد نقطة الدخول. لا يتم دفع أي عائد إذا سقطت أي علامة أو كانت مساوية لأي من العلامات السابقة.", "1547148381": "هذا الملف كبير جدًا (يُسمح فقط بما يصل إلى 8 ميغابايت). يرجى تحميل ملف آخر.", - "1548765374": "فشل التحقق من رقم المستند / الوثيقة", + "1548765374": "Verification of document number failed", "1549098835": "إجمالي عمليات السحب", "1551172020": "سلة الدولار الأسترالي", "1552162519": "عرض عملية الإعداد", @@ -1449,6 +1475,7 @@ "1577480486": "ستنتهي صلاحية رابط الهاتف المحمول الخاص بك في غضون ساعة واحدة", "1577527507": "مطلوب سبب فتح الحساب.", "1577612026": "اختر الملف", + "1577879664": "<0>Your Wallets are ready", "1579839386": "متجر التطبيقات", "1580498808": "تم العثور على وجوه متعددة", "1584109614": "قائمة سلاسل القراد", @@ -1502,9 +1529,11 @@ "1644703962": "هل تبحث عن حسابات عقود الفروقات/CFD ؟ الانتقال إلى Trader's Hub", "1644864436": "ستحتاج إلى توثيق حسابك قبل أن تطلب أن تصبح عميلًا محترفًا. <0>قم بمصادقة حسابي", "1644908559": "رمز الرقم مطلوب.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "واجه البوت خطأ أثناء التشغيل.", "1648938920": "هولندا 25", "1649239667": "2. ضمن قائمة Blocks، سترى قائمة بالفئات. يتم تجميع الكتل ضمن هذه الفئات. اختر الكتلة التي تريدها واسحبها إلى مساحة العمل.", + "1650963565": "Introducing Wallets", "1651513020": "عرض الوقت المتبقي لكل فاصل زمني", "1651951220": "التكرارات مثل «abcabcabc» يصعب تخمينها قليلاً فقط من «abc»", "1652366857": "الحصول على وإزالة", @@ -1522,13 +1551,13 @@ "1665272539": "تذكر: لا يمكنك تسجيل الدخول إلى حسابك حتى التاريخ المحدد.", "1665738338": "الرصيد", "1665756261": "انتقل إلى الدردشة المباشرة", + "1666783057": "Upgrade now", "1668138872": "تعديل إعدادات الحساب", "1670016002": "المضاعف: {{ multiplier }}", "1670426231": "وقت النهاية", "1671232191": "لقد قمت بتعيين الحدود التالية:", "1674163852": "يمكنك تحديد انتهاء العقد من خلال تحديد المدة أو وقت الانتهاء.", "1675030608": "لإنشاء هذا الحساب أولاً، نحتاج منك إعادة إرسال إثبات العنوان الخاص بك.", - "1675289747": "تم التحويل إلى الحساب الحقيقي", "1676549796": "الرافعة الديناميكية", "1677027187": "الفوركس", "1677990284": "تطبيقاتي", @@ -1556,6 +1585,7 @@ "1703091957": "نقوم بجمع معلومات حول عملك كجزء من التزامات العناية الواجبة لدينا، كما هو مطلوب بموجب تشريعات مكافحة غسيل الأموال.", "1704656659": "ما مدى خبرتك في تداول CFD؟", "1708413635": "لحساب {{currency_name}} ({{currency}}) الخاص بك", + "1709293836": "Wallet balance", "1709401095": "تداول العقود مقابل الفروقات على Deriv X مع الأسواق المالية والمؤشرات المشتقة الخاصة بنا.", "1709859601": "وقت الخروج الفوري", "1710662619": "إذا كان لديك التطبيق،قم بتشغيله لبدء التداول.", @@ -1570,6 +1600,7 @@ "1719248689": "يورو/جنيه استرليني/ دولار", "1720451994": "سنقوم بفرض رسوم تحويل بنسبة 2٪ أو {{minimum_fee}} {{currency}}، أيهما أعلى، للتحويلات بين حسابات Deriv fiat وحسابات Deriv المشفرة.", "1720968545": "قم بتحميل صفحة صورة جواز السفر من جهاز الكمبيوتر الخاص بك", + "1723069433": "Your new Wallet", "1723589564": "يمثل الحد الأقصى لعدد العقود المعلقة في محفظتك. يتم احتساب كل سطر في محفظتك لصفقة واحدة مفتوحة. بمجرد الوصول إلى الحد الأقصى، لن تتمكن من فتح صفقات جديدة دون إغلاق مركز موجود أولاً.", "1724696797": "أنت مقيد بحساب فيات واحد فقط.", "1725958461": "رقم الحساب", @@ -1698,6 +1729,7 @@ "1842266423": "تراجع", "1842862156": "مرحبًا بك في لوحة معلومات Deriv X", "1843658716": "إذا اخترت «Only Downs»، فستفوز بالعائد إذا انخفضت العلامات المتتالية تباعًا بعد نقطة الدخول. لا يتم دفع أي عائد إذا ارتفعت أي علامة أو كانت مساوية لأي من العلامات السابقة.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(الحد الأدنى: {{min_stake}} - الحد الأقصى: {{max_payout}})", "1846266243": "هذه الميزة غير متاحة للحسابات التجريبية.", "1846587187": "لم تختر بلد إقامتك", @@ -1792,7 +1824,6 @@ "1924765698": "مكان الولادة*", "1926987784": "- iOS: مرر لليسار على الحساب وانقر فوق <0>حذف.", "1928930389": "جنيه استرليني/كرونة", - "1929309951": "حالة التوظيف", "1929694162": "قارن الحسابات", "1930899934": "تيذر/Tether", "1931659123": "اركض على كل علامة", @@ -1807,6 +1838,7 @@ "1943440862": "يحسب قائمة بولينجر باندز (BB) من قائمة ذات فترة", "1944204227": "تقوم هذه الكتلة بإرجاع رصيد الحساب الجاري.", "1947527527": "1. تم إرسال هذا الرابط بواسطتك", + "1948044825": "MT5 Derived", "1948092185": "جنيه إسترليني/دولار كندي", "1949719666": "فيما يلي الأسباب المحتملة:", "1950413928": "إرسال وثائق الهوية", @@ -1875,6 +1907,7 @@ "2014536501": "رقم البطاقة", "2014590669": "المتغير '{{variable_name}}' ليس له قيمة. يرجى تعيين قيمة للمتغير '{{variable_name}}' للإخطار.", "2017672013": "يرجى تحديد بلد إصدار المستند.", + "2020104747": "Filter", "2020545256": "هل تريد إغلاق حسابك؟", "2021037737": "يرجى تحديث البيانات الخاصة بك للمتابعة.", "2021161151": "شاهد هذا الفيديو لمعرفة كيفية إنشاء روبوت تداول على Deriv Bot. أيضا ، تحقق من منشور المدونة هذا حول إنشاء روبوت تداول.", @@ -1885,7 +1918,6 @@ "2027696535": "المعلومات الضريبية", "2028163119": "إيوس مقابل الدولار", "2029237955": "لابوان", - "2029641956": "مقارنة حسابات CFD", "2030018735": "RSI هي أداة تحليل فني تساعدك على تحديد اتجاه السوق. سوف يمنحك قيمة من 0 إلى 100. تعني قيمة مؤشر القوة النسبية البالغة 70 وما فوق أن الأصل في منطقة ذروة الشراء وقد ينعكس الاتجاه الحالي، في حين أن القيمة 30 أو أقل تعني أن الأصل في منطقة ذروة البيع.", "2030045667": "رسالة", "2033648953": "تمنحك هذه الكتلة قيمة الشمعة المحددة لفترة زمنية محددة.", @@ -1919,6 +1951,7 @@ "2063812316": "بيان نصي", "2063890788": "أُلغيت", "2065278286": "سبريد", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "رخصة قيادة", "2070002739": "لا تقبل", "2070345146": "عند فتح تداول CFD برافعة مالية.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. تقديم شكوى", "2080553498": "3. احصل على معرف الدردشة باستخدام واجهة برمجة تطبيقات Telegram REST (اقرأ المزيد: https://core.telegram.org/bots/api#getupdates)", "2080829530": "بيعت مقابل: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "نعم، احذف", "2084693624": "يقوم بتحويل سلسلة تمثل سلسلة تاريخ/وقت إلى ثوانٍ منذ Epoch. مثال: 2019-01-01 21:03:45 بتوقيت غرينتش+0800 سيتم تحويله إلى 1546347825. يعد تعويض الوقت والمنطقة الزمنية اختياريًا.", "2085387371": "يجب أن تكون الأرقام والحروف والأحرف الخاصة., '-", @@ -1966,7 +2000,6 @@ "2115223095": "خسارة", "2117165122": "1. قم بإنشاء روبوت Telegram واحصل على رمز Telegram API الخاص بك. اقرأ المزيد عن كيفية إنشاء روبوتات في تيليجرام هنا: https://core.telegram.org/bots#6-botfather", "2117489390": "تحديث تلقائي في {{ remaining }} ثانية", - "2118315870": "أين تعيش؟", "2119449126": "سيكون الناتج النموذجي للمثال أدناه:", "2119710534": "التعليمات", "2121227568": "نيو/دولار أمريكي", @@ -1992,8 +2025,6 @@ "2146698770": "نصيحة احترافية: يمكنك أيضًا النقر فوق الكتلة المطلوبة وسحبها", "2146892766": "تجربة تداول الخيارات الثنائية", "2147244655": "كيف يمكنني استيراد روبوت التداول الخاص بي إلى Deriv Bot؟", - "-1232613003": "<0>فشلت عملية التحقق. <1>لماذا؟", - "-2029508615": "<0>تحتاج إلى التحقق. <1>تحقق الآن", "-931052769": "إرسال التحقق", "-1004605898": "نصائح", "-1938142055": "المستندات التي تم تحميلها", @@ -2141,18 +2172,9 @@ "-179726573": "لقد تلقينا إثبات الملكية الخاص بك.", "-813779897": "تم اجتياز إثبات الملكية.", "-638756912": "قم بإلغاء الأرقام من 7 إلى 12 من رقم البطاقة الذي يظهر على الجزء الأمامي من بطاقة الخصم/الائتمان الخاصة بك.", - "-2073934245": "خدمات التداول المالي المقدمة على هذا الموقع مناسبة فقط للعملاء الذين يقبلون إمكانية خسارة جميع الأموال التي يستثمرونها والذين يفهمون ولديهم خبرة في المخاطر التي ينطوي عليها شراء العقود المالية. تنطوي المعاملات في العقود المالية على درجة عالية من المخاطر. إذا انتهت صلاحية العقود التي اشتريتها باعتبارها عديمة القيمة، فسوف تفقد كل استثماراتك، بما في ذلك علاوة العقد.", - "-1166068675": "سيتم فتح حسابك بـ {{legal_entity_name}}، وتنظمه لجنة الألعاب في المملكة المتحدة (UKGC)، وسيخضع لقوانين جزيرة آيل أوف مان.", - "-975118358": "سيتم فتح حسابك بـ {{legal_entity_name}}، وتنظمه هيئة الخدمات المالية المالطية (MFSA)، وسيخضع لقوانين مالطا.", - "-680528873": "سيتم فتح حسابك بـ {{legal_entity_name}} وسيخضع لقوانين ساموا.", - "-1125193491": "إضافة حساب", - "-2068229627": "أنا لست PEP، ولم أكن PEP في الأشهر الـ 12 الماضية.", "-684271315": "حسنا", "-740157281": "تقييم تجربة التداول", "-1720468017": "عند تقديم خدماتنا لك، يتعين علينا الحصول على معلومات منك لتقييم ما إذا كان منتج أو خدمة معينة مناسبة لك.", - "-186841084": "تغيير البريد الإلكتروني لتسجيل الدخول", - "-907403572": "لتغيير عنوان بريدك الإلكتروني، ستحتاج أولاً إلى إلغاء ربط عنوان بريدك الإلكتروني بحساب {{identifier_title}} الخاص بك.", - "-1850792730": "إلغاء الارتباط من {{identifier_title}}", "-307865807": "تحذير من تحمل المخاطر", "-690100729": "نعم، أنا أفهم المخاطر.", "-2010628430": "تنطوي العقود مقابل الفروقات والأدوات المالية الأخرى على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. يجب عليك التفكير فيما إذا كنت تفهم كيفية عمل العقود مقابل الفروقات والأدوات المالية الأخرى وما إذا كنت قادرًا على تحمل المخاطر العالية لخسارة أموالك.<0/><0/> للمتابعة، يجب أن تؤكد أنك تفهم أن رأس مالك معرض للخطر.", @@ -2206,11 +2228,6 @@ "-1725454783": "فشلت", "-506510414": "التاريخ والوقت", "-1708927037": "عنوان IP", - "-619126443": "استخدم كلمة <0>مرور Deriv لتسجيل الدخول إلى {{brand_website_name}} و {{platform_name_trader}}.", - "-623760979": "استخدم <0>كلمة مرور Deriv لتسجيل الدخول إلى {{brand_website_name}}, {{platform_name_trader}} و. {{platform_name_go}}", - "-459147994": "استخدم <0>كلمة مرور Deriv لتسجيل الدخول إلى {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}} {{platform_name_smarttrader}}, {{platform_name_dbot}} و. {{platform_name_ctrader}}", - "-80717068": "التطبيقات التي ربطتها <0>بكلمة مرور Deriv الخاصة بك:", - "-9570380": "استخدم كلمة المرور {{platform_name_dxtrade}} لتسجيل الدخول إلى حسابات {{platform_name_dxtrade}} الخاصة بك على الويب وتطبيقات الهاتف المحمول.", "-2131200819": "تعطيل", "-200487676": "تفعيل", "-1840392236": "هذا ليس الرمز الصحيح. يرجى المحاولة مرة أخرى.", @@ -2240,44 +2257,37 @@ "-378415317": "الدولة مطلوبة", "-1497654315": "حساباتنا وخدماتنا غير متوفرة للرمز البريدي لجيرسي.", "-755626951": "أكمل تفاصيل عنوانك", - "-584911871": "اختر عملة المحفظة", "-1461267236": "يرجى اختيار عملتك", - "-1352330125": "عملة", "-1027595143": "أقل من 25,000 دولار", "-40491332": "25,000 دولار - 50,000 دولار", "-1139806939": "50,001 دولار - 100,000 دولار", - "-626752657": "0-1 سنة", - "-532014689": "من سنة إلى سنتين", - "-1001024004": "أكثر من 3 سنوات", - "-790513277": "6-10 معاملات في الأشهر الـ 12 الماضية", - "-580085300": "11-39 معاملة في الأشهر الـ 12 الماضية", - "-654781670": "اساسي", - "-1717373258": "ثانوي", "-996132458": "أعمال البناء", "-915003867": "الصحة", "-1430012453": "تقنية المعلومات والاتصالات", "-987824916": "العلوم والهندسة", "-146630682": "الاجتماعية والثقافية", "-761306973": "التصنيع", - "-739367071": "موظف", - "-1156937070": "500,001 دولار - 1,000,000 دولار", - "-315534569": "أكثر من مليون دولار", - "-2068544539": "موظف براتب", - "-531314998": "الاستثمارات وأرباح الأسهم", - "-1235114522": "راتب تقاعد", - "-1298056749": "مزايا الدولة", - "-449943381": "الادخار والميراث", "-1631552645": "المحترفون", "-474864470": "عمال العناية الشخصية والمبيعات والخدمة", "-1129355784": "عمال الزراعة والغابات ومصايد الأسماك", "-1242914994": "عمال الحرف والمعادن والكهرباء والإلكترونيات", "-1317824715": "عمال النظافة والمساعدون", "-1592729751": "عمال التعدين والبناء والتصنيع والنقل", + "-1030759620": "مسؤولون حكوميون", "-2137323480": "ملكية الشركة", "-1590574533": "تسوية الطلاق", "-1667683002": "الميراث", "-1237843731": "دخل الاستثمار", "-777506574": "بيع الممتلكات", + "-654781670": "اساسي", + "-1717373258": "ثانوي", + "-1156937070": "500,001 دولار - 1,000,000 دولار", + "-315534569": "أكثر من مليون دولار", + "-2068544539": "موظف براتب", + "-531314998": "الاستثمارات وأرباح الأسهم", + "-1235114522": "راتب تقاعد", + "-1298056749": "مزايا الدولة", + "-449943381": "الادخار والميراث", "-1161338910": "الاسم الأول مطلوب.", "-1161818065": "يجب أن يكون الاسم الأخير بين 2 و 50 حرفًا.", "-1281693513": "تاريخ الميلاد مطلوب.", @@ -2287,28 +2297,14 @@ "-212167954": "لم يتم تنسيق رقم التعريف الضريبي بشكل صحيح.", "-621555159": "معلومات الهوية", "-204765990": "شروط الاستخدام", - "-231863107": "لا", - "-870902742": "ما مقدار المعرفة والخبرة التي لديك فيما يتعلق بالتداول عبر الإنترنت؟", - "-1929477717": "لديّ درجة أكاديمية وشهادة مهنية و/أو خبرة عمل تتعلق بالخدمات المالية.", - "-1540148863": "لقد حضرت الندوات والتدريب و/أو ورش العمل المتعلقة بالتداول.", - "-922751756": "أقل من عام", - "-542986255": "لا شيء", - "-1337206552": "حسب فهمك، يتيح لك تداول CFD ما يلي:", - "-456863190": "ضع مركزًا على حركة سعر الأصل حيث تكون النتيجة عائدًا ثابتًا أو لا شيء على الإطلاق.", - "-1314683258": "قم باستثمار طويل الأجل لتحقيق ربح مضمون.", - "-1546090184": "كيف تؤثر الرافعة المالية على تداول CFD؟", - "-1636427115": "تساعد الرافعة المالية على تخفيف المخاطر.", - "-800221491": "الرافعة المالية تضمن الأرباح.", - "-811839563": "تتيح لك الرافعة المالية فتح صفقات كبيرة مقابل جزء بسيط من قيمة التداول، مما قد يؤدي إلى زيادة الربح أو الخسارة.", - "-1185193552": "أغلق تداولك تلقائيًا عندما تكون الخسارة مساوية أو أكثر من مبلغ محدد، طالما أن هناك سيولة كافية في السوق.", - "-1046354": "أغلق تداولك تلقائيًا عندما يكون الربح مساويًا أو أكثر من مبلغ محدد، طالما أن هناك سيولة كافية في السوق.", - "-1842858448": "حقق ربحًا مضمونًا من تجارتك.", - "-860053164": "عند تداول المضاعفات.", - "-1250327770": "عند شراء أسهم شركة.", - "-1222388581": "كل ما سبق.", "-477761028": "بطاقة هوية الناخب", "-1466346630": "CPF", - "-1030759620": "مسؤولون حكوميون", + "-739367071": "موظف", + "-626752657": "0-1 سنة", + "-532014689": "من سنة إلى سنتين", + "-1001024004": "أكثر من 3 سنوات", + "-790513277": "6-10 معاملات في الأشهر الـ 12 الماضية", + "-580085300": "11-39 معاملة في الأشهر الـ 12 الماضية", "-612752984": "هذه هي الحدود الافتراضية التي نطبقها على حساباتك.", "-1598263601": "لمعرفة المزيد حول حدود التداول وكيفية تطبيقها، يرجى الانتقال إلى <0>مركز المساعدة.", "-1411635770": "تعرف على المزيد حول حدود الحساب", @@ -2326,10 +2322,7 @@ "-1500958859": "تحقق", "-1502578110": "تم مصادقة حسابك بالكامل وتم رفع حدود السحب الخاصة بك.", "-1662154767": "فاتورة مرافق حديثة (مثل الكهرباء أو الماء أو الغاز أو الهاتف الأرضي أو الإنترنت) أو كشف حساب مصرفي أو خطاب صادر عن جهة حكومية باسمك وهذا العنوان.", - "-190838815": "نحن بحاجة إلى هذا للتحقق. إذا كانت المعلومات التي تقدمها مزيفة أو غير دقيقة، فلن تتمكن من الإيداع والسحب.", - "-223216785": "السطر الثاني من العنوان*", "-594456225": "السطر الثاني من العنوان", - "-1940457555": "الرمز البريدي*", "-1964954030": "الرمز البريدي", "-516397235": "كن حذرًا مع من تشارك هذا الرمز المميز. يمكن لأي شخص لديه هذا الرمز تنفيذ الإجراءات التالية نيابة عن حسابك", "-989216986": "إضافة حسابات", @@ -2371,8 +2364,6 @@ "-1100235269": "صناعة التوظيف", "-684388823": "القيمة الصافية المقدرة", "-509054266": "حجم المبيعات السنوي المتوقع", - "-601903492": "تجربة تداول الفوركس", - "-1012699451": "تجربة تداول CFD", "-1588485629": "مثال", "-1117345066": "اختر نوع المستند", "-651192353": "العينة:", @@ -2394,11 +2385,11 @@ "-1088324715": "سنراجع مستنداتك ونخطرك بحالتها في غضون 1-3 أيام عمل.", "-329713179": "حسنا", "-1176889260": "يرجى تحديد نوع المستند.", - "-1926456107": "انتهت صلاحية المعرف الذي أرسلته.", - "-555047589": "يبدو أن وثيقة الهوية الخاصة بك قد انتهت صلاحيتها. يرجى المحاولة مرة أخرى باستخدام مستند صالح.", - "-841187054": "حاول مرة أخرى", + "-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": "لم نتمكن من التحقق من هويتك بالتفاصيل التي قدمتها. ", - "-228284848": "لم نتمكن من التحقق من هويتك بالتفاصيل التي قدمتها.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "تم التحقق من هويتك. ستحتاج أيضًا إلى تقديم إثبات لعنوانك.", "-118547687": "تم اجتياز التحقق من الهوية", "-200989771": "انتقل إلى التفاصيل الشخصية", @@ -2464,12 +2455,40 @@ "-142444667": "يرجى النقر على الرابط الموجود في البريد الإلكتروني لتغيير كلمة مرور Deriv MT5 الخاصة بك.", "-742748008": "تحقق من بريدك الإلكتروني وانقر فوق الارتباط الموجود في البريد الإلكتروني للمتابعة.", "-84068414": "لم تحصل بعد على البريد الإلكتروني؟ يرجى الاتصال بنا عبر <0>الدردشة الحية.", + "-975118358": "سيتم فتح حسابك بـ {{legal_entity_name}}، وتنظمه هيئة الخدمات المالية المالطية (MFSA)، وسيخضع لقوانين مالطا.", + "-2073934245": "خدمات التداول المالي المقدمة على هذا الموقع مناسبة فقط للعملاء الذين يقبلون إمكانية خسارة جميع الأموال التي يستثمرونها والذين يفهمون ولديهم خبرة في المخاطر التي ينطوي عليها شراء العقود المالية. تنطوي المعاملات في العقود المالية على درجة عالية من المخاطر. إذا انتهت صلاحية العقود التي اشتريتها باعتبارها عديمة القيمة، فسوف تفقد كل استثماراتك، بما في ذلك علاوة العقد.", + "-1125193491": "إضافة حساب", + "-2068229627": "أنا لست PEP، ولم أكن PEP في الأشهر الـ 12 الماضية.", + "-186841084": "تغيير البريد الإلكتروني لتسجيل الدخول", + "-907403572": "لتغيير عنوان بريدك الإلكتروني، ستحتاج أولاً إلى إلغاء ربط عنوان بريدك الإلكتروني بحساب {{identifier_title}} الخاص بك.", + "-1850792730": "إلغاء الارتباط من {{identifier_title}}", "-428335668": "ستحتاج إلى تعيين كلمة مرور لإكمال العملية.", + "-1232613003": "<0>فشلت عملية التحقق. <1>لماذا؟", + "-2029508615": "<0>تحتاج إلى التحقق. <1>تحقق الآن", "-818898181": "لا يتطابق الاسم في المستند مع ملف تعريف Deriv الخاص بك.", "-310316375": "لا يتطابق العنوان في المستند مع العنوان الذي أدخلته أعلاه.", "-485368404": "وثيقة صدرت منذ أكثر من 6 أشهر.", "-367016488": "مستند غير واضح. يجب أن تكون جميع المعلومات واضحة ومرئية.", "-1957076143": "مستند تم اقتصاصه. يجب أن تكون جميع المعلومات واضحة ومرئية.", + "-231863107": "لا", + "-870902742": "ما مقدار المعرفة والخبرة التي لديك فيما يتعلق بالتداول عبر الإنترنت؟", + "-1929477717": "لديّ درجة أكاديمية وشهادة مهنية و/أو خبرة عمل تتعلق بالخدمات المالية.", + "-1540148863": "لقد حضرت الندوات والتدريب و/أو ورش العمل المتعلقة بالتداول.", + "-922751756": "أقل من عام", + "-542986255": "لا شيء", + "-1337206552": "حسب فهمك، يتيح لك تداول CFD ما يلي:", + "-456863190": "ضع مركزًا على حركة سعر الأصل حيث تكون النتيجة عائدًا ثابتًا أو لا شيء على الإطلاق.", + "-1314683258": "قم باستثمار طويل الأجل لتحقيق ربح مضمون.", + "-1546090184": "كيف تؤثر الرافعة المالية على تداول CFD؟", + "-1636427115": "تساعد الرافعة المالية على تخفيف المخاطر.", + "-800221491": "الرافعة المالية تضمن الأرباح.", + "-811839563": "تتيح لك الرافعة المالية فتح صفقات كبيرة مقابل جزء بسيط من قيمة التداول، مما قد يؤدي إلى زيادة الربح أو الخسارة.", + "-1185193552": "أغلق تداولك تلقائيًا عندما تكون الخسارة مساوية أو أكثر من مبلغ محدد، طالما أن هناك سيولة كافية في السوق.", + "-1046354": "أغلق تداولك تلقائيًا عندما يكون الربح مساويًا أو أكثر من مبلغ محدد، طالما أن هناك سيولة كافية في السوق.", + "-1842858448": "حقق ربحًا مضمونًا من تجارتك.", + "-860053164": "عند تداول المضاعفات.", + "-1250327770": "عند شراء أسهم شركة.", + "-1222388581": "كل ما سبق.", "-1515286538": "يرجى إدخال رقم المستند الخاص بك. ", "-1694758788": "أدخل رقم المستند", "-1458676679": "يجب إدخال 2-50 حرفًا.", @@ -2479,6 +2498,8 @@ "-1437017790": "معلومات مالية", "-70342544": "نحن ملزمون قانونًا بطلب معلوماتك المالية.", "-39038029": "تجربة التداول", + "-601903492": "تجربة تداول الفوركس", + "-1012699451": "تجربة تداول CFD", "-1894668798": "تجربة أدوات التداول الأخرى", "-1026468600": "تردد أدوات التداول الأخرى", "-1743024217": "حدد اللغة", @@ -2489,6 +2510,11 @@ "-536187647": "تأكيد إلغاء الوصول؟", "-1357606534": "الإذن", "-570222048": "إلغاء الوصول", + "-80717068": "التطبيقات التي ربطتها <0>بكلمة مرور Deriv الخاصة بك:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "استخدم كلمة <0>مرور Deriv لتسجيل الدخول إلى {{brand_website_name}} و {{platform_name_trader}}.", + "-623760979": "استخدم <0>كلمة مرور Deriv لتسجيل الدخول إلى {{brand_website_name}}, {{platform_name_trader}} و. {{platform_name_go}}", + "-459147994": "استخدم <0>كلمة مرور Deriv لتسجيل الدخول إلى {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}} {{platform_name_smarttrader}}, {{platform_name_dbot}} و. {{platform_name_ctrader}}", "-1526404112": "فاتورة المرافق: فاتورة الكهرباء أو الماء أو الغاز أو الهاتف الأرضي.", "-537552700": "اتفاقية تأجير المنزل: اتفاقية سارية وحالية.", "-890084320": "الحفظ والإرسال", @@ -2510,11 +2536,20 @@ "-362324454": "السلع", "-1071336803": "منصة", "-820028470": "الخيارات والمضاعفات", - "-1255879419": "Trader's Hub", + "-1186807402": "تحويل", + "-224804428": "المعاملات", + "-470018967": "إعادة ضبط الرصيد", + "-693105141": "MT5 Financial", + "-1290112064": "مشتق EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "إعادة الضبط", "-213142918": "عمليات الإيداع والسحب غير متاحة مؤقتًا ", - "-224804428": "المعاملات", - "-1186807402": "تحويل", "-1308346982": "مشتقة", "-1145604233": "تداول العقود مقابل الفروقات على MT5 باستخدام المؤشرات المشتقة التي تحاكي حركات السوق في العالم الحقيقي.", "-328128497": "المالية", @@ -2525,15 +2560,29 @@ "-81256466": "تحتاج إلى حساب Deriv لإنشاء حساب CFD.", "-699372497": "تداول برافعة مالية وفروق أسعار ضيقة للحصول على عوائد أفضل على الصفقات الناجحة. <0>تعرف على المزيد", "-1884966862": "احصل على المزيد من حسابات Deriv MT5 بأنواع واختصاصات مختلفة.", - "-145462920": "Deriv cTrader", "-982095728": "احصل على", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>إخلاء المسؤولية القانوني للاتحاد الأوروبي: العقود مقابل الفروقات هي أدوات معقدة وتنطوي على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. <0>73% من حسابات مستثمري التجزئة تخسر المال عند تداول العقود مقابل الفروقات مع هذا المزود. يجب أن تفكر فيما إذا كنت تفهم كيفية عمل العقود مقابل الفروقات وما إذا كنت تستطيع تحمل المخاطر العالية المتمثلة في خسارة أموالك.", "-1277942366": "إجمالي الأصول", + "-1255879419": "Trader's Hub", "-493788773": "خارج الاتحاد الأوروبي", "-673837884": "الاتحاد الأوروبي", "-230566990": "المستندات التالية التي قدمتها لم تجتاز الشيكات الخاصة بنا:", "-846812148": "إثبات العنوان.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "تنظيم خارج الاتحاد الأوروبي", "-643108528": "تنظيم خارج الاتحاد الأوروبي والاتحاد الأوروبي", + "-979459594": "Buy/Sell", + "-494667560": "الطلبات", + "-679691613": "إعلاناتي", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "كرية5236585", "-1665192032": "حساب المضاعفات", "-744999940": "حساب مشتق", @@ -2543,9 +2592,20 @@ "-318106501": "تداول العقود مقابل الفروقات على MT5 باستخدام المواد الاصطناعية والسلال والعملات الأجنبية المشتقة.", "-1328701106": "تداول العقود مقابل الفروقات على MT5 مع العملات الأجنبية والأسهم ومؤشرات الأسهم والمواد التركيبية والعملات المشفرة والسلع.", "-1173266642": "يقدم هذا الحساب العقود مقابل الفروقات على منصة تداول غنية بالميزات.", - "-1290112064": "مشتق EZ", "-1453519913": "تداول العقود مقابل الفروقات على منصة سهلة البدء مع جميع الأصول المفضلة لديك.", "-2051096382": "اربح مجموعة من العوائد من خلال التنبؤ بشكل صحيح بحركات السوق باستخدام <0>الخيارات، أو احصل على الجانب\n الإيجابي من العقود مقابل الفروقات دون المخاطرة بأكثر من حصتك الأولية مع <1>المضاعفات.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "اختيار التنظيم", "-249184528": "يمكنك إنشاء حسابات حقيقية بموجب لوائح الاتحاد الأوروبي أو خارج الاتحاد الأوروبي. انقر فوق <0><0/>الرمز لمعرفة المزيد حول هذه الحسابات.", "-1505234170": "جولة مركز المتداول", @@ -2556,7 +2616,21 @@ "-951876657": "قم بتعبئة حسابك", "-1945421757": "بمجرد أن يكون لديك حساب، انقر فوق «الإيداع» أو «التحويل» لإضافة أموال إلى الحساب", "-1965920446": "ابدأ التداول", - "-33612390": "<0>إخلاء المسؤولية القانوني للاتحاد الأوروبي: العقود مقابل الفروقات هي أدوات معقدة وتنطوي على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. <0>73% من حسابات مستثمري التجزئة تخسر المال عند تداول العقود مقابل الفروقات مع هذا المزود. يجب أن تفكر فيما إذا كنت تفهم كيفية عمل العقود مقابل الفروقات وما إذا كنت تستطيع تحمل المخاطر العالية المتمثلة في خسارة أموالك.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "هذا الحقل مطلوب.", "-1870909526": "لا يمكن للخادم الخاص بنا استرداد العنوان.", "-582721696": "مبلغ السحب الحالي المسموح به هو {{format_min_withdraw_amount}} إلى {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "عنوان المحفظة {{currency_symbol}} الخاص بك", "-38063175": "{{account_text}} محفظة", "-705272444": "قم بتحميل إثبات الهوية للتحقق من هويتك", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "هذا لحماية حسابك من عمليات السحب غير المصرح بها.", "-130833284": "يرجى ملاحظة أن حدود السحب القصوى والدنيا ليست ثابتة. وهي تتغير بسبب التقلبات العالية للعملات المشفرة.", "-1531269493": "سنرسل لك بريدًا إلكترونيًا بمجرد معالجة معاملتك.", @@ -2859,6 +2934,30 @@ "-1016171176": "الأصول", "-621128676": "أنواع التجارة", "-447853970": "عتبة الخسارة", + "-155173714": "دعونا نبني روبوتًا!", + "-1919212468": "3. يمكنك أيضًا البحث عن الكتل التي تريدها باستخدام شريط البحث الموجود أعلى الفئات.", + "-1520558271": "لمزيد من المعلومات، راجع منشور المدونة هذا حول أساسيات بناء روبوت تداول.", + "-980360663": "3. اختر الكتلة التي تريدها واسحبها إلى مساحة العمل.", + "-1493168314": "ماهي الاستراتيجية السريعة؟", + "-1680391945": "استخدام استراتيجية سريعة", + "-1177914473": "كيف يمكنني حفظ استراتيجيتي؟", + "-271986909": "في Bot Builder، اضغط على Save على شريط الأدوات في الأعلى لتنزيل برنامج الروبوت الخاص بك. قم بتسمية البوت الخاص بك، واختر تنزيل البوت الخاص بك على جهازك أو Google Drive. سيتم تنزيل البوت الخاص بك كملف XML.", + "-1149045595": "1. بعد الضغط على استيراد ، حدد محلي وانقر فوق متابعة.", + "-288041546": "2. حدد ملف XML الخاص بك واضغط على افتح.", + "-2127548288": "3. سيتم تحميل الروبوت الخاص بك وفقًا لذلك.", + "-1311297611": "1. بعد الضغط على استيراد، حدد Google Drive وانقر فوق استمر.", + "-1549564044": "كيف يمكنني إعادة تعيين مساحة العمل؟", + "-1127331928": "في Bot Builder، اضغط على Reset على شريط الأدوات في الأعلى. سيؤدي ذلك إلى مسح مساحة العمل. يرجى ملاحظة أنه سيتم فقدان أي تغييرات غير محفوظة.", + "-1720444288": "كيف أتحكم في خسائري باستخدام Deriv Bot؟", + "-1142295124": "هناك عدة طرق للتحكم في خسائرك باستخدام Deriv Bot. فيما يلي مثال بسيط لكيفية تنفيذ التحكم في الخسارة في استراتيجيتك:", + "-986689483": "1. قم بإنشاء المتغيرات التالية:", + "-269910127": "3. قم بتحديث الربح/الخسارة الحالية مع الربح من العقد الأخير. في حالة فقدان العقد الأخير، ستكون قيمة الربح/الخسارة الحالية سلبية.", + "-1565344891": "هل يمكنني تشغيل Deriv Bot على علامات تبويب متعددة في متصفح الويب الخاص بي؟", + "-90192474": "نعم، يمكنك ذلك. ومع ذلك، هناك حدود لحسابك، مثل الحد الأقصى لعدد المراكز المفتوحة والحد الأقصى للدفعات الإجمالية على المراكز المفتوحة. لذلك، ضع هذه الحدود في الاعتبار عند فتح صفقات متعددة. يمكنك العثور على مزيد من المعلومات حول هذه الحدود في إعدادات > حدود الحساب.", + "-213872712": "لا، نحن لا نقدم العملات المشفرة على Deriv Bot.", + "-2147346223": "في أي البلدان يتوفر Deriv Bot؟", + "-352345777": "ما هي الاستراتيجيات الأكثر شيوعًا للتداول الآلي؟", + "-552392096": "ثلاثة من الاستراتيجيات الأكثر استخدامًا في التداول الآلي هي Martingale و D'Alembert و Oscar's Grind - يمكنك العثور عليها جميعًا جاهزة وتنتظرك في Deriv Bot.", "-507620484": "لم يتم حفظها", "-764102808": "جوجل درايف", "-555886064": "فاز", @@ -2937,30 +3036,6 @@ "-1823621139": "إستراتيجية سريعة", "-1778025545": "لقد نجحت في استيراد روبوت.", "-1519425996": "لم يتم العثور على نتائج \"{{ faq_search_value }}»", - "-155173714": "دعونا نبني روبوتًا!", - "-1919212468": "3. يمكنك أيضًا البحث عن الكتل التي تريدها باستخدام شريط البحث الموجود أعلى الفئات.", - "-1520558271": "لمزيد من المعلومات، راجع منشور المدونة هذا حول أساسيات بناء روبوت تداول.", - "-980360663": "3. اختر الكتلة التي تريدها واسحبها إلى مساحة العمل.", - "-1493168314": "ماهي الاستراتيجية السريعة؟", - "-1680391945": "استخدام استراتيجية سريعة", - "-1177914473": "كيف يمكنني حفظ استراتيجيتي؟", - "-271986909": "في Bot Builder، اضغط على Save على شريط الأدوات في الأعلى لتنزيل برنامج الروبوت الخاص بك. قم بتسمية البوت الخاص بك، واختر تنزيل البوت الخاص بك على جهازك أو Google Drive. سيتم تنزيل البوت الخاص بك كملف XML.", - "-1149045595": "1. بعد الضغط على استيراد ، حدد محلي وانقر فوق متابعة.", - "-288041546": "2. حدد ملف XML الخاص بك واضغط على افتح.", - "-2127548288": "3. سيتم تحميل الروبوت الخاص بك وفقًا لذلك.", - "-1311297611": "1. بعد الضغط على استيراد، حدد Google Drive وانقر فوق استمر.", - "-1549564044": "كيف يمكنني إعادة تعيين مساحة العمل؟", - "-1127331928": "في Bot Builder، اضغط على Reset على شريط الأدوات في الأعلى. سيؤدي ذلك إلى مسح مساحة العمل. يرجى ملاحظة أنه سيتم فقدان أي تغييرات غير محفوظة.", - "-1720444288": "كيف أتحكم في خسائري باستخدام Deriv Bot؟", - "-1142295124": "هناك عدة طرق للتحكم في خسائرك باستخدام Deriv Bot. فيما يلي مثال بسيط لكيفية تنفيذ التحكم في الخسارة في استراتيجيتك:", - "-986689483": "1. قم بإنشاء المتغيرات التالية:", - "-269910127": "3. قم بتحديث الربح/الخسارة الحالية مع الربح من العقد الأخير. في حالة فقدان العقد الأخير، ستكون قيمة الربح/الخسارة الحالية سلبية.", - "-1565344891": "هل يمكنني تشغيل Deriv Bot على علامات تبويب متعددة في متصفح الويب الخاص بي؟", - "-90192474": "نعم، يمكنك ذلك. ومع ذلك، هناك حدود لحسابك، مثل الحد الأقصى لعدد المراكز المفتوحة والحد الأقصى للدفعات الإجمالية على المراكز المفتوحة. لذلك، ضع هذه الحدود في الاعتبار عند فتح صفقات متعددة. يمكنك العثور على مزيد من المعلومات حول هذه الحدود في إعدادات > حدود الحساب.", - "-213872712": "لا، نحن لا نقدم العملات المشفرة على Deriv Bot.", - "-2147346223": "في أي البلدان يتوفر Deriv Bot؟", - "-352345777": "ما هي الاستراتيجيات الأكثر شيوعًا للتداول الآلي؟", - "-552392096": "ثلاثة من الاستراتيجيات الأكثر استخدامًا في التداول الآلي هي Martingale و D'Alembert و Oscar's Grind - يمكنك العثور عليها جميعًا جاهزة وتنتظرك في Deriv Bot.", "-418247251": "قم بتنزيل دفتر يومياتك.", "-2123571162": "تنزيل", "-870004399": "<0>تم شراؤها: {{longcode}} (المعرف: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "تم إلغاء تنشيط الحساب", "-1837059346": "بيع / شراء", "-1845037007": "صفحة المعلن", - "-494667560": "الطلبات", - "-679691613": "إعلاناتي", "-821418875": "التاجر", "-679102561": "تفاصيل العقد", "-430118939": "سياسة الشكاوى", @@ -3082,7 +3155,6 @@ "-430041639": "لم يجتاز إثبات العنوان اختبارات التحقق الخاصة بنا، وقد وضعنا بعض القيود على حسابك. يرجى إعادة تقديم إثبات العنوان الخاص بك.", "-87177461": "يرجى الانتقال إلى إعدادات حسابك وإكمال تفاصيلك الشخصية لتمكين الإيداع.", "-904632610": "أعد ضبط رصيدك", - "-470018967": "إعادة ضبط الرصيد", "-156611181": "يرجى إكمال التقييم المالي في إعدادات حسابك لفتحه.", "-1925176811": "غير قادر على معالجة عمليات السحب في الوقت الحالي", "-980696193": "عمليات السحب غير متاحة مؤقتًا بسبب صيانة النظام. يمكنك إجراء عمليات سحب عند اكتمال الصيانة.", @@ -3107,12 +3179,12 @@ "-577279362": "يرجى تقديم إثبات الهوية الخاص بك للتحقق من حسابك ومتابعة التداول.", "-197134911": "انتهت صلاحية إثبات الهوية", "-152823394": "انتهت صلاحية إثبات الهوية الخاص بك. يرجى تقديم إثبات هوية جديد للتحقق من حسابك ومتابعة التداول.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "اتبع هذه التعليمات البسيطة لإصلاحها.", "-2142540205": "يبدو أن العنوان في المستند الخاص بك لا يتطابق مع العنوان الموجود في ملف تعريف Deriv الخاص بك. يرجى تحديث تفاصيلك الشخصية الآن بالعنوان الصحيح.", "-482715448": "انتقل إلى التفاصيل الشخصية", "-2072411961": "تم التحقق من إثبات العنوان الخاص بك", "-384887227": "قم بتحديث العنوان في ملف التعريف الخاص بك.", - "-448961363": "خارج الاتحاد الأوروبي", "-1998049070": "إذا كنت توافق على استخدامنا لملفات تعريف الارتباط، فانقر فوق قبول. لمزيد من المعلومات، <0>راجع سياستنا.", "-402093392": "إضافة حساب Deriv", "-1721181859": "ستحتاج إلى حساب {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "شاشة كاملة", "-1823504435": "عرض الإشعارات", "-1954045170": "لم يتم تخصيص عملة", - "-583559763": "قائمة طعام", "-1591792668": "حدود الحساب", "-34495732": "معلومات تنظيمية", "-1496158755": "انتقل إلى Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "تقبل اللجنة المالية الطعون لمدة 45 يومًا بعد تاريخ الحادث وفقط بعد أن يحاول المتداول حل المشكلة مع الشركة مباشرة.", "-1825471709": "تجربة تداول جديدة بالكامل على منصة قوية وسهلة الاستخدام.", "-981017278": "التداول الآلي في متناول يدك. لا حاجة للترميز.", + "-583559763": "قائمة طعام", "-778309978": "انتهت صلاحية الرابط الذي نقرت عليه. تأكد من النقر فوق الارتباط الموجود في أحدث بريد إلكتروني في صندوق الوارد الخاص بك. بدلاً من ذلك، أدخل بريدك الإلكتروني أدناه وانقر فوق <0>إعادة إرسال البريد الإلكتروني للحصول على رابط جديد.", "-336222114": "اتبع هذه الخطوات البسيطة لإصلاحها:", "-1064116456": "ابحث عن الوسيط <0>Deriv Holdings (غيرنسي) المحدودة وحدده.", @@ -3415,22 +3487,6 @@ "-1282933308": "ملاحظة {{barrier}}", "-968190634": "يساوي {{barrier}}", "-1747377543": "أقل من {{barrier}}", - "-256210543": "التداول غير متاح في الوقت الحالي.", - "-1150099396": "نحن نعمل على توفير هذا لك قريبًا. إذا كان لديك حساب آخر، فانتقل إلى هذا الحساب لمتابعة التداول. يمكنك إضافة مشتق MT5 فاينانشال.", - "-28115241": "{{platform_name_trader}} غير متاح لهذا الحساب", - "-453920758": "انتقل إلى لوحة معلومات {{platform_name_mt5}}", - "-402175529": "التاريخ", - "-902712434": "إلغاء الصفقة", - "-988484646": "إلغاء الصفقة (تم تنفيذه)", - "-444882676": "إلغاء الصفقة (نشط)", - "-13423018": "معرف المرجع", - "-2035315547": "حاجز منخفض", - "-1551639437": "لا يوجد تاريخ", - "-1214703885": "لا يزال يتعين عليك تحديث أمر جني الأرباح أو إيقاف الخسارة", - "-504849554": "سيتم إعادة فتحه في", - "-59803288": "في هذه الأثناء، جرب المؤشرات الاصطناعية الخاصة بنا. إنها تحاكي تقلبات السوق الحقيقية وهي مفتوحة على مدار الساعة طوال أيام الأسبوع.", - "-1278109940": "شاهد الأسواق المفتوحة", - "-694105443": "هذا السوق مغلق", "-1043795232": "المناصب الأخيرة", "-1511825574": "الربح/الخسارة:", "-726626679": "الربح/الخسارة المحتملة:", @@ -3455,21 +3511,15 @@ "-1435392215": "حول إلغاء الصفقة", "-2017825013": "حصلت عليه", "-1192773792": "لا تظهر هذا مرة أخرى", + "-902712434": "إلغاء الصفقة", "-1280319153": "قم بإلغاء تداولك في أي وقت ضمن إطار زمني محدد. يتم تشغيله تلقائيًا إذا وصلت تجارتك إلى مستوى الإيقاف ضمن الإطار الزمني المختار.", "-471757681": "إدارة المخاطر", "-843831637": "إيقاف الخسارة", "-771725194": "إلغاء الصفقة", "-338707425": "الحد الأدنى للمدة هو يوم واحد", "-1003473648": "المدة: {{duration}} يوم", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "العائد عند انتهاء الصلاحية يساوي العائد لكل نقطة مضروبًا بالفرق بين السعر النهائي وسعر التنفيذ.", "-1527492178": "تم تأمين عملية الشراء", "-725375562": "يمكنك قفل/إلغاء قفل زر الشراء من قائمة الإعدادات", - "-774638412": "يجب أن تكون الحصة بين {{min_stake}} {{currency}} و {{max_stake}} {{currency}}", - "-1358367903": "حصة", - "-434270664": "السعر الحالي", - "-1956787775": "سعر الحاجز:", - "-1513281069": "الحاجز 2", "-390994177": "يجب أن تكون بين {{min}} و {{max}}", "-1804019534": "انتهاء الصلاحية: {{date}}", "-2055106024": "التبديل بين إعدادات المدة المتقدمة والبسيطة", @@ -3484,6 +3534,7 @@ "-1763848396": "ضع", "-194424366": "فوق", "-857660728": "أسعار الإضراب", + "-1358367903": "حصة", "-1386326276": "الحاجز هو حقل مطلوب.", "-1418742026": "يجب أن يكون الحاجز الأعلى أعلى من الحاجز السفلي.", "-92007689": "يجب أن يكون الحاجز السفلي أقل من الحاجز الأعلى.", @@ -3491,6 +3542,21 @@ "-1975910372": "يجب أن تكون الدقيقة بين 0 و59.", "-866277689": "لا يمكن أن يكون وقت انتهاء الصلاحية في الماضي.", "-1455298001": "الآن", + "-256210543": "التداول غير متاح في الوقت الحالي.", + "-1150099396": "نحن نعمل على توفير هذا لك قريبًا. إذا كان لديك حساب آخر، فانتقل إلى هذا الحساب لمتابعة التداول. يمكنك إضافة مشتق MT5 فاينانشال.", + "-28115241": "{{platform_name_trader}} غير متاح لهذا الحساب", + "-453920758": "انتقل إلى لوحة معلومات {{platform_name_mt5}}", + "-402175529": "التاريخ", + "-988484646": "إلغاء الصفقة (تم تنفيذه)", + "-444882676": "إلغاء الصفقة (نشط)", + "-13423018": "معرف المرجع", + "-2035315547": "حاجز منخفض", + "-1551639437": "لا يوجد تاريخ", + "-1214703885": "لا يزال يتعين عليك تحديث أمر جني الأرباح أو إيقاف الخسارة", + "-504849554": "سيتم إعادة فتحه في", + "-59803288": "في هذه الأثناء، جرب المؤشرات الاصطناعية الخاصة بنا. إنها تحاكي تقلبات السوق الحقيقية وهي مفتوحة على مدار الساعة طوال أيام الأسبوع.", + "-1278109940": "شاهد الأسواق المفتوحة", + "-694105443": "هذا السوق مغلق", "-439389714": "نحن نعمل على ذلك", "-770929448": "انتقل إلى {{platform_name_smarttrader}}", "-347156282": "إرسال إثبات", @@ -3537,6 +3603,8 @@ "-454245976": "إذا كنت تعتقد أن سعر السوق سينخفض باستمرار لفترة محددة، فاختر <0>البيع. ستحصل على عائد في وقت انتهاء الصلاحية إذا لم يلمس سعر السوق الحاجز أو يتجاوزه. ستنمو عائداتك بشكل متناسب مع المسافة بين سعر السوق والحاجز إذا لم يتم اختراق الحاجز. سوف تبدأ في تحقيق ربح عندما يكون العائد أعلى من حصتك. إذا تجاوز سعر السوق الحاجز في أي وقت، فلن يكون هناك عائد.", "-351875097": "عدد القراد", "-729830082": "عرض أقل", + "-1669741470": "العائد عند انتهاء الصلاحية يساوي العائد لكل نقطة مضروبًا بالفرق بين السعر النهائي وسعر التنفيذ.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "جديد!", "-993480898": "مراكم", "-45873457": "جديد", @@ -3557,6 +3625,10 @@ "-690963898": "سيتم إغلاق عقدك تلقائيًا عندما يصل العائد إلى هذا المبلغ.", "-511541916": "سيتم إغلاق عقدك تلقائيًا عند الوصول إلى هذا العدد من العلامات.", "-438655760": "<0>ملاحظة: يمكنك إغلاق تداولك في أي وقت. كن على دراية بمخاطر الانزلاق.", + "-774638412": "يجب أن تكون الحصة بين {{min_stake}} {{currency}} و {{max_stake}} {{currency}}", + "-434270664": "السعر الحالي", + "-1956787775": "سعر الحاجز:", + "-1513281069": "الحاجز 2", "-1683683754": "طويل", "-1046859144": "<0>{{title}} ستحصل على عائد إذا بقي سعر السوق {{price_position}} ولم يلمس الحاجز أو يتجاوزه. وإلا، سيكون العائد الخاص بك صفرًا.", "-1815023694": "فوق الحاجز", diff --git a/packages/translations/src/translations/bn.json b/packages/translations/src/translations/bn.json index 39eed6f6501c..bfb355c16631 100644 --- a/packages/translations/src/translations/bn.json +++ b/packages/translations/src/translations/bn.json @@ -24,7 +24,6 @@ "27731356": "আপনার অ্যাকাউন্ট সাময়িকভাবে নিষ্ক্রিয় করা আছে। পুনরায় আমানত এবং উত্তোলন সক্রিয় করতে অনুগ্রহ করে <0>লাইভ চ্যাটের মাধ্যমে আমাদের সাথে যোগাযোগ করুন।", "27830635": "ডেরিভ (ভি) লিমিটেড", "28581045": "একটি রিয়েল MT5 অ্যাকাউন্ট যোগ করুন", - "30801950": "আপনার অ্যাকাউন্ট {{legal_entity_name}}দিয়ে খোলা হবে, মাল্টা গেমিং কর্তৃপক্ষ দ্বারা নিয়ন্ত্রিত, এবং মাল্টা আইন সাপেক্ষে হবে।", "33433576": "আপনার তহবিল উত্তোলনের জন্য একটি ই-ওয়ালেট ব্যবহার করুন।", "35089987": "আপনার ড্রাইভিং লাইসেন্সের সামনে এবং পিছনে আপলোড করুন।", "41737927": "আপনাকে ধন্যবাদ", @@ -60,11 +59,13 @@ "72500774": "অনুগ্রহ করে ট্যাক্স বাসস্থান পূরণ করুন।", "73086872": "আপনি ট্রেডিং থেকে নিজেকে বাদ দিয়েছেন", "73326375": "কম চুক্তি সময়কালে বাজারে পৌঁছেছেন সর্বনিম্ন পয়েন্ট।", + "74836780": "{{currency_code}} Wallet", "74963864": "অধীনে", "76916358": "আপনি উইথড্রয়াল লিমিটে<0/> পৌঁছেছেন৷ আপনার উইথড্রয়াল চালিয়ে যাওয়ার জন্য দয়া করে আপনার পরিচয়ের প্রমাণ এবং ঠিকানা আপলোড করুন।", "76925355": "আপনার বটের পারফরম্যান্স পরীক্ষা করুন", "77945356": "আমাদের মোবাইল অ্যাপের সাথে ট্রেড করুন।", "77982950": "ভ্যানিলা বিকল্পগুলি আপনাকে “কল” বা “পুট” ক্রয় করে অন্তর্নিহিত সম্পত্তির ঊর্ধ্বমুখী (বুলিশ) বা নিম্নগামী (বিয়ারিশ) দিকনির্দেশনা দিতে দেয়।", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "আমরা সেই পৃষ্ঠাটি খুঁজে পাইনি", "82839270": "আপনার পাসপোর্টের পৃষ্ঠাটি আপলোড করুন যা আপনার ফটো ধারণ করে।", "83202647": "ব্লক সঙ্কুচিত করুন", @@ -76,6 +77,7 @@ "90266322": "2। আপনার নতুন তৈরি টেলিগ্রাম বটের সাথে একটি চ্যাট শুরু করুন এবং পরবর্তী ধাপে এগিয়ে যাওয়ার আগে এটি কিছু বার্তা পাঠাতে ভুলবেন না। (উদাঃ হ্যালো বোট!)", "91993812": "Martingale কৌশল একটি ক্লাসিক ট্রেডিং কৌশল যা একটি শত বছর ধরে ব্যবহার করা হয়েছে, 18 শতকের ফরাসি গণিতবিদ পল পিয়ের লেভি দ্বারা জনপ্রিয়।", "93154671": "1। পরিসংখ্যান প্যানেলের নীচে রিসেট হিট করুন।", + "93939827": "Cryptocurrency accounts", "96381225": "আইডি যাচাইকরণ ব্যর্থ", "98473502": "আমরা একটি উপযুক্ততা পরীক্ষা পরিচালনা করতে বাধ্য নই, এবং আপনাকে কোন ঝুঁকি সতর্কবার্তা প্রদান করতে বাধ্য নই।", "98972777": "র্যান্ডম আইটেম", @@ -83,6 +85,7 @@ "102226908": "ক্ষেত্র ফাঁকা হতে পারে না", "108916570": "স্থিতিকাল: {{duration}} দিন", "109073671": "অনুগ্রহ করে একটি ই-ওয়ালেট ব্যবহার করুন যা আপনি পূর্বে ডিপোজিটের জন্য ব্যবহার করেছেন। নিশ্চিত করুন যে ই-ওয়ালেট উত্তোলন সমর্থন করে। ই-ওয়ালেটের তালিকা <0>এখানে দেখুন যা তোলার জন্য সমর্থন করে।", + "110822969": "One Wallet for all your transactions", "111215238": "সরাসরি আলো থেকে দূরে সরে যান", "111718006": "সমাপ্তির তারিখ", "111931529": "সর্বোচ্চ। 7 দিনের মধ্যে মোট পণ", @@ -215,7 +218,9 @@ "251882697": "আপনাকে ধন্যবাদ! আপনার প্রতিক্রিয়া আমাদের সিস্টেমে রেকর্ড করা হয়েছে। চালিয়ে যেতে<0/><0/> অনুগ্রহ করে 'ওকে' ক্লিক করুন।", "254912581": "এই ব্লকটি EMA এর অনুরূপ, ব্যতীত এটি আপনাকে ইনপুট তালিকা এবং প্রদত্ত সময়ের উপর ভিত্তি করে সম্পূর্ণ EMA লাইন দেয়।", "256031314": "নগদ ব্যবসা", + "256123827": "What happens to my trading accounts", "256602726": "আপনি যদি আপনার অ্যাকাউন্ট বন্ধ করেন:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "ট্রেডিং অ্যাসেসমেন্ট", "260069181": "ইউআরএল লোড করার চেষ্টা করার সময় একটি ত্রুটি দেখা দিয়েছে", @@ -250,8 +255,8 @@ "284527272": "অ্যান্টিমোড", "284772879": "কন্ট্রাক্ট", "284809500": "আর্থিক ডেমো", + "285909860": "Demo {{currency}} Wallet", "287934290": "আপনি কি নিশ্চিতরূপে এই লেনদেন বাতিল করতে চান?", - "289898640": "ব্যবহারের শর্তাবলী", "291744889": "<0>1। ট্রেড প্যারামিটার: <0>", "291817757": "আমাদের Deriv সম্প্রদায় যান এবং API গুলি, API টোকেন, Deriv API গুলি ব্যবহার করার উপায় এবং আরও অনেক কিছু সম্পর্কে শিখুন।", "292491635": "আপনি যদি “স্টপ লস” নির্বাচন করেন এবং আপনার ক্ষতি সীমাবদ্ধ করার জন্য একটি পরিমাণ নির্দিষ্ট করেন, আপনার ক্ষতি এই পরিমাণের চেয়ে বেশি বা সমান হলে আপনার অবস্থান স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। ক্লোজিং এ মার্কেট প্রাইসের উপর নির্ভর করে আপনার ক্ষতি আপনার প্রবেশ করা পরিমাণের চেয়েও বেশি হতে পারে।", @@ -299,6 +304,7 @@ "344418897": "এই ট্রেডিং সীমা এবং স্ব-বর্জন আপনাকে {{brand_website_name}} এ ব্যয় করা অর্থের পরিমাণ নিয়ন্ত্রণ করতে এবং <0>দায়িত্বশীল ট্রেডিং অনুশীলন করতে সহায়তা করে।", "345320063": "অবৈধ টাইমস্ট্যাম্প", "345818851": "দুঃখিত, একটি অভ্যন্তরীণ ত্রুটি ঘটেছে। আবার চেষ্টা করতে উপরের চেকবক্স হিট করুন।", + "346214602": "A better way to manage your funds", "347029309": "ফরেক্স: স্ট্যান্ডার্ড/মাইক্রো", "347039138": "পুনরাবৃত্তি (2)", "347217485": "আপনার মোবাইলে Deriv MT5 অ্যাক্সেস করতে সমস্যা?", @@ -353,6 +359,7 @@ "401345454": "এটি করার জন্য টিউটোরিয়াল ট্যাবে যান।", "402343402": "আমাদের সার্ভারে একটি সমস্যা থাকার কারণে, আপনার {{platform}} অ্যাকাউন্টের কিছু মুহূর্তে অনুপলব্ধ। দয়া করে আমাদের সাথে থাকুন এবং আপনার ধৈর্যের জন্য আপনাকে ধন্যবাদ।", "403456289": "এসএমএ জন্য সূত্র হল:", + "403608958": "Select a trading account or a Wallet", "404743411": "মোট ডিপোজিট", "406359555": "চুক্তির বিবরণ", "406497323": "প্রয়োজন হলে আপনার সক্রিয় চুক্তি বিক্রি করুন (ঐচ্ছিক)", @@ -373,6 +380,7 @@ "427617266": "বিটকয়েন", "428709688": "প্রতিটি প্রতিবেদনের মধ্যে আপনার পছন্দের সময় ব্যবধান:", "431267979": "এখানে যেতে Deriv বট ব্যবহার কিভাবে একটি দ্রুত গাইড।", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "টেক লাভ: {{ currency }} {{ take_profit }}", "432519573": "ডকুমেন্ট আপলোড করা হয়েছে", @@ -453,12 +461,12 @@ "518955798": "7। আরম্ভে একবার চালান", "520136698": "বুম ৫০০ ইনডেক্স", "521872670": "পদ", - "522283618": "ডিজিটাল অপশন ট্রেডিং অভিজ্ঞতা", "522703281": "দ্বারা বিভাজ্য", "523123321": "- একটি প্রদত্ত নম্বরের ক্ষমতায় 10", "524459540": "কিভাবে ভেরিয়েবল তৈরি করবো?", "527329988": "এটি একটি টপ-১০০ সাধারণ পাসওয়ার্ড", "529056539": "অপশন", + "530864956": "Deriv Apps", "530953413": "অনুমোদিত অ্যাপ্লিকেশন", "531114081": "3। চুক্তির ধরন", "531675669": "ইউরো", @@ -473,10 +481,13 @@ "543915570": "ফরেক্স, স্টক, স্টক সূচক, ক্রিপ্টোকুয়ার্বিক্স, সিন্থেটিক সূচক", "545476424": "মোট অর্থ উত্তোলন", "549479175": "ডেরিভ মাল্টিপ্লেয়ার", + "549799607": "Go to LiveChat", "550589723": "যতক্ষণ বর্তমান স্পট মূল্য আগের স্পট মূল্য থেকে ±{{tick_size_barrier}} এর মধ্যে থাকবে ততক্ষণ আপনার স্টক প্রতি টিকটিকিতে {{growth_rate}}% বৃদ্ধি পাবে।", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "ট্রেডিং সীমা সম্পর্কে আরও জানুন", "554135844": "সম্পাদনা", "554410233": "এটি একটি টপ-১০ সাধারণ পাসওয়ার্ড", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "ট্রেড প্যারামিটার এবং ট্রেড অপশন সংজ্ঞায়িত করার পরে, আপনি নির্দিষ্ট শর্ত পূরণ করা হয় যখন চুক্তি ক্রয় করার জন্য আপনার বট নির্দেশ করতে পারেন। যে কাজ করার জন্য আপনি ব্যবহার করতে পারেন শর্তাধীন ব্লক এবং সূচক ব্লক সাহায্য করার জন্য আপনার বট সিদ্ধান্ত নিতে।", "555881991": "জাতীয় পরিচয় নম্বর স্লিপ", "556264438": "সময়ের ব্যবধান", @@ -552,6 +563,7 @@ "629395043": "সকল বৃদ্ধির হার", "632398049": "এই ব্লক একটি আইটেম বা বিবৃতি একটি নাল মান নির্ধারণ করে।", "634219491": "আপনি আপনার ট্যাক্স সনাক্তকরণ নম্বর প্রদান করেননি। এই তথ্য আইনি এবং নিয়ন্ত্রক প্রয়োজনীয়তা জন্য প্রয়োজনীয়। অনুগ্রহ করে আপনার অ্যাকাউন্ট সেটিংসে <0>ব্যক্তিগত বিবরণে যান, এবং আপনার সর্বশেষ কর সনাক্তকরণ নম্বর পূরণ করুন।", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>গ) নিষ্পত্তির সুযোগ না পাওয়া গেলে অভিযোগটি ডিআরসি কর্তৃক পরিচালিত সংকল্প পর্যায়ে অগ্রসর হবে।", "639382772": "অনুগ্রহ করে সমর্থিত ফাইল টাইপ আপলোড করুন।", "640596349": "আপনি এখনও কোন বিজ্ঞপ্তি পাবেন", @@ -562,7 +574,6 @@ "642546661": "আপনার কম্পিউটার থেকে লাইসেন্স ফেরত আপলোড করুন", "642995056": "ই-মেইল", "644150241": "আপনি শেষ আপনার পরিসংখ্যান সাফ করার পরে আপনি কতগুলি চুক্তি জিতেছেন।", - "645016681": "অন্যান্য আর্থিক ইন্সট্রুমেন্টে ট্রেডিং ফ্রিকোয়েন্সি", "645902266": "ইউরো/এনজেডিডি", "647039329": "ঠিকানার প্রমাণ প্রয়োজন", "647745382": "ইনপুট তালিকা {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "নীচের উদাহরণে, উদ্বোধনী মূল্য নির্বাচন করা হয়, যা পরে “op” নামক একটি চলকের জন্য বরাদ্দ করা হয়।", "666724936": "অনুগ্রহ করে একটি বৈধ ID নম্বর দিন।", "672008428": "জেসি/ইউএসডি", + "672731171": "Non-EU USD accounts", "673915530": "এখতিয়ার এবং আইনের পছন্দ", "674973192": "ডেস্কটপ, ওয়েব এবং মোবাইল অ্যাপ্লিকেশানগুলিতে আপনার Deriv MT5 অ্যাকাউন্টে লগ ইন করতে এই পাসওয়ার্ডটি ব্যবহার করুন।", "676159329": "ডিফল্ট অ্যাকাউন্টে পরিবর্তন করা যায়নি।", @@ -613,6 +625,7 @@ "692354762": "দয়া করে আপনার প্রবেশ করান {{document_name}}। {{example_format}}", "693396140": "চুক্তি বাতিল (মেয়াদ শেষ)", "694035561": "ট্রেড অপশন মাল্টিপ্লেয়ার", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- খোলা সময়: খোলার সময় স্ট্যাম্প", "697630556": "এই মার্কেটটি বর্তমানে বন্ধ আছে।", "698037001": "জাতীয় পরিচয়পত্র সংখ্যা", @@ -624,8 +637,8 @@ "701647434": "স্ট্রিং এর জন্য অনুসন্ধান", "702451070": "জাতীয় পরিচয় পত্র (ছবি নেই)", "702561961": "থীম পরিবর্তন করো", + "705262734": "Your Wallets are ready", "705299518": "পরবর্তী, আপনার পাসপোর্টের পৃষ্ঠাটি আপলোড করুন যা আপনার ফটোতে রয়েছে।", - "706413212": "ক্যাশিয়ার অ্যাক্সেস করতে, আপনি এখন আপনার {{regulation}} {{currency}} ({{loginid}}) অ্যাকাউন্টে আছেন।", "706727320": "বাইনারি অপশন ট্রেডিং ফ্রিকোয়েন্সি", "706755289": "এই ব্লকটি ত্রিকোণমিতিক কার্যাবলী সম্পাদন করে।", "706960383": "আমরা এই মূল্য আপনার চুক্তি কিনতে প্রস্তাব করব আপনি তার মেয়াদ শেষ হওয়ার আগে এটি বিক্রি চয়ন করা উচিত। এটি বিভিন্ন কারণের উপর ভিত্তি করে তৈরি, যেমন বর্তমান স্পট মূল্য, সময়কাল, ইত্যাদি যাইহোক, অবশিষ্ট সময়কাল 60 সেকেন্ডের নীচে থাকলে আমরা একটি চুক্তি মূল্য অফার করব না।", @@ -644,6 +657,7 @@ "720293140": "লগ আউট", "720519019": "আমার পাসওয়ার্ড রিসেট করুন", "721011817": "- দ্বিতীয় নম্বরের ক্ষমতায় প্রথম সংখ্যাটি উত্থাপন করুন", + "722797282": "EU-regulated USD accounts", "723045653": "আপনি এই ইমেল ঠিকানা দিয়ে আপনার Deriv অ্যাকাউন্টে লগ ইন করবেন।", "723961296": "পাসওয়ার্ড নিয়ন্ত্রণ করুন", "724203548": "আপনি আপনার অভিযোগ <0>ইউরোপীয় কমিশনের অনলাইন বিরোধ নিষ্পত্তি (ওডিআর) প্ল্যাটফর্মে পাঠাতে পারেন। এটি যুক্তরাজ্যের ক্লায়েন্টদের ক্ষেত্রে প্রযোজ্য নয়।", @@ -656,6 +670,7 @@ "734390964": "অপর্যাপ্ত ভারসাম্য", "734881840": "মিথ্যা", "742469109": "ব্যালেন্স রিসেট করুন", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "উচ্চ লিভারেজ সহ ফরেক্স, উদ্ভূত সূচক, ক্রিপ্টোকুয়ার্বিক্স এবং কমোডিটিতে CFD ট্রেড করুন।", "743623600": "রেফারেন্স", "744110277": "বলিঙ্গার ব্যান্ডস অ্যারে (BBA)", @@ -689,6 +704,7 @@ "775706054": "আপনি কি ট্রেডিং বট বিক্রি করেন?", "776085955": "কৌশলগুলো", "781924436": "স্প্রেড/পুট স্প্রেড কল করুন", + "782563319": "Add more Wallets", "783974693": "সাম্প্রতিক বছরগুলো এড়িয়ে চলুন", "784311461": "এক্সপোনেনশিয়াল মুভিং এভারেজ (EMA)", "784583814": "আপনার কম্পিউটারের সাথে সংযুক্ত", @@ -725,6 +741,7 @@ "818447476": "অ্যাকাউন্ট পরিবর্তন করা হবে?", "820877027": "অনুগ্রহ করে আপনার পরিচয়ের প্রমাণ যাচাই করুন", "821163626": "সার্ভার রক্ষণাবেক্ষণ মাসের প্রথম শনিবার 7 থেকে 10 জিএমটি সময় পর্যন্ত ঘটে। আপনি এই সময় পরিষেবা বিঘ্ন সম্মুখীন হতে পারে।", + "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": "একটি ব্লক যা পাঠ্য ধারণ করতে পারে।", "824797920": "তালিকা কি ফাঁকা?", "825042307": "আবার চেষ্টা করা যাক", @@ -747,7 +764,6 @@ "836097457": "আমি ট্রেডিং আগ্রহী কিন্তু খুব সামান্য অভিজ্ঞতা আছে।", "837063385": "এই ঠিকানায় অন্যান্য মুদ্রা পাঠাবেন না।", "837066896": "আপনার নথিটি পর্যালোচনা করা হচ্ছে, দয়া করে 1-3 দিনের মধ্যে আবার চেক করুন।", - "839618971": "ঠিকানা", "839805709": "আপনাকে মসৃণভাবে যাচাই করতে, আমাদের আরও ভাল ফটো দরকার", "840672750": "যদি এটি কাজ না করে, তাহলে MT5 অ্যাপটি আনইনস্টল করুন এবং পুনরায় ইনস্টল করুন। তারপর পদক্ষেপ <0>2 এবং <0>3 পুনরায় করুন", "841434703": "স্ট্যাক নিষ্ক্রিয় করো", @@ -844,9 +860,9 @@ "943535887": "অনুগ্রহ করে নিম্নলিখিত Deriv MT5 অ্যাকাউন্টে আপনার অবস্থানগুলি বন্ধ করুন:", "944499219": "সর্বোচ্চ ওপেন পজিশন", "945532698": "কন্ট্রাক্ট বিক্রিত", + "945753712": "Back to Trader’s Hub", "946204249": "পড়ুন", "946841802": "একটি সাদা (বা সবুজ) মোমবাতি ইঙ্গিত করে যে, ওপেন প্রাইস ক্লোজ প্রাইসের চেয়ে কম। এটি বাজার মূল্যের একটি ঊর্ধ্বমুখী আন্দোলন প্রতিনিধিত্ব করে।", - "946944859": "নীচের বোতামটি হিট করুন এবং আমরা আপনাকে একটি লিঙ্ক সহ একটি ইমেল পাঠাব। আপনার উইথড্রয়াল অনুরোধ যাচাই করতে এই লিঙ্কে ক্লিক করুন।", "947046137": "আপনার উইথড্রয়াল ২৪ ঘন্টার মধ্যে প্রসেস করা হবে", "947363256": "তালিকা তৈরি করো", "947758334": "শহর প্রয়োজন", @@ -950,6 +966,7 @@ "1050128247": "আমি নিশ্চিত করছি যে আমি পেমেন্ট এজেন্টের স্থানান্তর তথ্য যাচাই করেছি।", "1050844889": "প্রতিবেদন", "1052779010": "আপনি আপনার ডেমো অ্যাকাউন্টে আছেন", + "1052921318": "{{currency}} Wallet", "1053153674": "জাম্প 50 ইনডেক্স", "1053159279": "শিক্ষার স্তর", "1053556481": "আপনি একবার আপনার অভিযোগ জমা দিলে, আমরা আপনাকে একটি স্বীকারোক্তি ইমেল পাঠিয়ে দেব যে আমরা এটি পেয়েছি কিনা তা নিশ্চিত করতে।", @@ -1010,6 +1027,7 @@ "1110102997": "বিবৃতি", "1112582372": "ব্যবধান সময়কাল", "1113119682": "এই ব্লকটি আপনাকে মোমবাতি তালিকা থেকে নির্বাচিত মোমবাতি মান প্রদান করে।", + "1113221217": "MT5 Swap-free", "1113292761": "8 মেগাবাইটের কম", "1114679006": "আপনি একটি সহজ কৌশল ব্যবহার করে সফলভাবে আপনার বট তৈরি করেছেন।", "1117281935": "বিক্রয় শর্তাবলী (ঐচ্ছিক)", @@ -1036,6 +1054,7 @@ "1134879544": "একদৃষ্টি সঙ্গে একটি নথি উদাহরণ", "1138126442": "ফরেক্স: স্ট্যান্ডার্ড", "1139483178": "স্ট্যাক সক্রিয় করো", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "নির্দেশনা হল {{ direction_type }}", "1144028300": "আপেক্ষিক শক্তি সূচক অ্যারে (RSIA)", "1145927365": "নির্দিষ্ট সংখ্যক সেকেন্ডের পরে ব্লক ভিতরে চালান", @@ -1066,7 +1085,6 @@ "1174689133": "3। আপনার ট্রেড প্যারামিটার সেট করুন এবং Run হিট করুন।", "1174748431": "পেমেন্ট চ্যানেল", "1175183064": "ভানুয়াতু", - "1176926166": "অন্যান্য আর্থিক ইন্সট্রুমেন্টে ট্রেড করার অভিজ্ঞতা", "1177396776": "আপনি যদি “এশিয়ান পতন” নির্বাচন করেন, তাহলে শেষ টিকটিকগুলির গড় থেকে কম হলে আপনি পেউটি জিতবেন।", "1177723589": "প্রদর্শন করার জন্য কোন লেনদেন নেই", "1178582280": "আপনি শেষ আপনার পরিসংখ্যান সাফ করার পরে আপনি হারিয়ে গেছে চুক্তি সংখ্যা।", @@ -1077,6 +1095,7 @@ "1181396316": "এই ব্লকটি আপনাকে একটি সেট পরিসরের মধ্যে থেকে একটি র্যান্ডম নম্বর দেয়", "1181770592": "বিক্রয় থেকে মুনাফা/ক্ষতি", "1183007646": "- চুক্তির ধরন: চুক্তির প্রকারের নাম যেমন রাইজ, পতন, টাচ, নো টাচ ইত্যাদি।", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "এখন আপনার চুক্তি বন্ধ করুন বা এটি চলমান রাখুন। আপনি এটি চলমান রাখা সিদ্ধান্ত নিতে হলে, আপনি চেক এবং পরে এটি বন্ধ করতে পারেন ", "1188316409": "আপনার তহবিল পেতে, নীচের বিবরণ সহ পেমেন্ট এজেন্টের সাথে যোগাযোগ করুন", "1188980408": "৫ মিনিট", @@ -1094,12 +1113,14 @@ "1201773643": "সাংখ্যিক", "1203297580": "এই ব্লকটি একটি টেলিগ্রাম চ্যানেলে একটি বার্তা পাঠায়।", "1204223111": "এই উদাহরণে, মোমবাতি তালিকা থেকে খোলা দাম “candle_list” নামক একটি চলকের জন্য বরাদ্দ করা হয়।", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "কিভাবে আপনার কার্ড মাস্ক?", "1206821331": "সশস্ত্র বাহিনী", "1207152000": "একটি টেমপ্লেট নির্বাচন করুন এবং আপনার ট্রেড প্যারামিটার সেট করুন।", "1208714859": "সংক্ষিপ্ত জন্য:", "1208729868": "টিকটিক্স", "1208903663": "অবৈধ টোকেন", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "বট চালু হচ্ছে", "1214893428": "অ্যাকাউন্ট তৈরি বর্তমানে মোবাইলের জন্য অনুপলব্ধ। একটি নতুন অ্যাকাউন্ট তৈরি করতে অনুগ্রহ করে আপনার কম্পিউটার দিয়ে লগ ইন করুন।", "1216408337": "স্ব-নিযুক্ত", @@ -1112,6 +1133,7 @@ "1222521778": "আমানত এবং তোলার কাজ করা কঠিন।", "1222544232": "আমরা আপনাকে একটি ইমেল পাঠিয়েছি", "1225150022": "সম্পদের সংখ্যা", + "1226027513": "Transfer from", "1227074958": "র্যান্ডম ভগ্নাংশ", "1227240509": "ফাঁকা স্থান ছাঁটাই", "1228534821": "কিছু মুদ্রা আপনার দেশে পেমেন্ট এজেন্ট দ্বারা সমর্থিত নাও হতে পারে।", @@ -1121,6 +1143,7 @@ "1232291311": "সর্বোচ্চ উইথড্রয়াল অবশিষ্ট", "1232353969": "গত 12 মাসে 0-5 লেনদেন", "1233300532": "পরিশোধ", + "1233376285": "Options & multipliers", "1234292259": "সম্পদের উৎস", "1234764730": "ব্যক্তিগত বিবরণ বিভাগ থেকে আপনার নাম এবং ইমেল ঠিকানা একটি স্ক্রিনশট আপলোড করুন।", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "একটি প্রদত্ত তালিকাতে আইটেমগুলি তাদের সংখ্যাসূচক বা বর্ণানুক্রমিক মান দ্বারা, ঊর্ধ্বমুখী বা সাজানো ক্রমে সাজানো।", "1281290230": "নির্বাচন করুন", "1282951921": "শুধুমাত্র ডাউনস", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "যদি “ক্ষতি” নির্বাচন করা হয়, তাহলে আপনার শেষ ট্রেড অসফল হলে এটি “সত্য” ফিরে আসবে। অন্যথায়, এটি একটি খালি স্ট্রিং ফিরিয়ে দেবে।", "1286094280": "প্রত্যাহার", "1286507651": "পরিচয় যাচাইকরণ পর্দা বন্ধ করো", @@ -1173,7 +1197,6 @@ "1289146554": "ব্রিটিশ ভার্জিন দ্বীপপুঞ্জ আর্থিক সেবা কমিশন", "1289646209": "মার্জিন কল", "1290525720": "উদাহরণ: ", - "1291887623": "ডিজিটাল অপশন ট্রেডিং ফ্রিকোয়েন্সি", "1291997417": "চুক্তির মেয়াদ শেষ হয়ে যাবে ঠিক 23:৫৯:৫৯ জিএমটি তে আপনার নির্বাচিত মেয়াদ শেষ হয়ে যাবে।", "1292188546": "Deriv MT5 বিনিয়োগকারী পাসওয়ার্ড রিসেট করুন", "1292891860": "টেলিগ্রাম অবহিত", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (বিক্রয়)", "1329136554": "জাম্প 200 ইনডেক্স", "1329325646": "এই ব্লকের বিষয়বস্তু প্রতিটি টিক বলা হয়", + "1330479159": "Ready to upgrade?", "1331199417": "অনুগ্রহ করে সঠিক বিন্যাসটি লিখুন। ", "1331367811": "ক্লায়েন্ট অ্যাকাউন্ট নম্বর", "1332168410": "আরও জানুন", @@ -1257,7 +1281,6 @@ "1367023655": "আপনার ক্ষতি আপনার পণ অতিক্রম না নিশ্চিত করার জন্য, আপনার ক্ষতি সমান যখন আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ করা হবে<0/>।", "1367488817": "4। ট্রেডিং শর্তাবলী পুনরায় চালু করুন", "1367990698": "ভোলাটিলিটি 10 ইনডেক্স", - "1369709538": "আমাদের ব্যবহারের শর্তাবলী", "1370647009": "উচ্চতর দৈনিক সীমা উপভোগ করুন", "1371193412": "বাতিল", "1371555192": "আপনার পছন্দের পেমেন্ট এজেন্ট নির্বাচন করুন এবং আপনার উইথড্রয়াল অ্যামাউন্টটি লিখুন। যদি আপনার পেমেন্ট এজেন্ট তালিকাভুক্ত না হয়, তাহলে <0>তাদের অ্যাকাউন্ট নম্বর ব্যবহার করে তাদের সন্ধান করুন।", @@ -1319,6 +1342,7 @@ "1434767075": "Deriv Bot শুরু করুন", "1434976996": "ঘোষণা", "1435363248": "এই ব্লকটি ইউনিক্স যুগ থেকে সেকেন্ডের সংখ্যাকে তারিখ এবং সময় বিন্যাসে রূপান্তরিত করে যেমন- ২০৯০-08:01 00:00:00।", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "সর্বনিম্ন ডিপোজিট", "1437396005": "মন্তব্য যোগ করুন", "1438247001": "একটি পেশাদারী ক্লায়েন্ট নিম্নলিখিত কারণে ক্লায়েন্ট সুরক্ষা একটি নিম্ন ডিগ্রী পায়।", @@ -1369,6 +1393,7 @@ "1476301886": "SMA অনুরূপ, এই ব্লক আপনি একটি নির্দিষ্ট সময়ের জন্য সমস্ত মান একটি তালিকা ধারণকারী সমগ্র SMA লাইন দেয়।", "1478030986": "ট্রেডিং এবং তোলার জন্য API টোকেন তৈরি বা মুছুন", "1480915523": "লাফালাফি", + "1481860194": "Your new Wallet(s)", "1481977420": "অনুগ্রহ করে আপনার প্রত্যাহারের অনুরোধ যাচাই করতে আমাদের সাহায্য করুন।", "1483470662": "আপনার অ্যাকাউন্টে ট্রেডিং শুরু করতে 'ওপেন' ক্লিক করুন", "1484336612": "এই ব্লকটি একটি লুপ বন্ধ বা চালিয়ে যেতে ব্যবহৃত হয় এবং একটি লুপ ব্লকের মধ্যে কোথাও স্থাপন করা যেতে পারে।", @@ -1389,6 +1414,7 @@ "1505420815": "আপনার অনুসন্ধানের জন্য কোন পেমেন্ট এজেন্ট পাওয়া যায়নি", "1505898522": "স্ট্যাক ডাউনলোড", "1505927599": "আমাদের সার্ভার একটি বাঁক আঘাত। চলুন শুরু করা যাক সরানোর জন্য রিফ্রেশ।", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (কিনুন)", "1509678193": "শিক্ষা", @@ -1419,7 +1445,7 @@ "1542742708": "সিনথেটিক্স, ফরেক্স, স্টক, স্টক সূচক, কমোডিটি এবং ক্রিপ্টোকুয়ার্বিক্স", "1544642951": "আপনি যদি “শুধুমাত্র আপগুলি” নির্বাচন করেন, তাহলে এন্ট্রি স্পটের পরে ধারাবাহিকভাবে টিক বৃদ্ধি পেলে আপনি পেআউট জিতবেন। কোন টিক পড়ে গেলে বা পূর্ববর্তী টিকটিকগুলির সমান না হলে পরিশোধ করা হয় না।", "1547148381": "ফাইলটি খুব বড় (শুধুমাত্র 8 মেগাবাইট পর্যন্ত অনুমোদিত)। অনুগ্রহ করে অন্য ফাইল আপলোড করুন।", - "1548765374": "নথির নম্বর যাচাই করতে ব্যর্থ", + "1548765374": "Verification of document number failed", "1549098835": "মোট প্রত্যাহার", "1551172020": "অস্ট্রেলিয়ান ডলার বাস্কেট", "1552162519": "অনবোর্ডিং দেখুন", @@ -1449,6 +1475,7 @@ "1577480486": "আপনার মোবাইল লিঙ্কের মেয়াদ শেষ হবে এক ঘন্টার মধ্যে", "1577527507": "অ্যাকাউন্ট খোলার কারণ প্রয়োজন বোধ করা হয়।", "1577612026": "একটি ফোল্ডার নির্বাচন করুন", + "1577879664": "<0>Your Wallets are ready", "1579839386": "অ্যাপস্টোর", "1580498808": "একাধিক মুখ পাওয়া গেছে", "1584109614": "টিক- এর স্ট্রিং তালিকা", @@ -1502,9 +1529,11 @@ "1644703962": "CFD অ্যাকাউন্ট খুঁজছেন? ট্রেডার'স হাব এ যান", "1644864436": "পেশাদার ক্লায়েন্ট হবার অনুরোধ করার আগে আপনাকে আপনার অ্যাকাউন্ট <0>প্রমাণীকরণ করতে হবে।", "1644908559": "ডিজিট কোড প্রয়োজন।", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "চলমান অবস্থায় বটটি একটি ত্রুটির সম্মুখীন হয়েছিল।", "1648938920": "নেদারল্যান্ডস ২৫", "1649239667": "2। ব্লক মেনুএর অধীনে, আপনি বিভাগগুলির একটি তালিকা দেখতে পাবেন। ব্লক এই বিভাগের মধ্যে গোষ্ঠীভুক্ত করা হয়। আপনি চান ব্লক চয়ন করুন এবং কর্মক্ষেত্রে তাদের টেনে আনুন।", + "1650963565": "Introducing Wallets", "1651513020": "প্রতিটি ব্যবধানের জন্য অবশিষ্ট সময় প্রদর্শন করা হবে", "1651951220": "“abcabc” এর মত পুনরাবৃত্তি “abc” এর চেয়ে অনুমান করা সামান্য কঠিন", "1652366857": "পেতে এবং অপসারণ", @@ -1522,13 +1551,13 @@ "1665272539": "মনে রাখবেন: নির্বাচিত তারিখ পর্যন্ত আপনি আপনার অ্যাকাউন্টে লগ ইন করতে পারবেন না।", "1665738338": "ব্যালেন্স", "1665756261": "লাইভ চ্যাটে যান", + "1666783057": "Upgrade now", "1668138872": "অ্যাকাউন্ট সেটিংস পরিবর্তন করুন", "1670016002": "গুণক: {{ multiplier }}", "1670426231": "সমাপ্তির সময়", "1671232191": "আপনি নিম্নলিখিত সীমা সেট করেছেন:", "1674163852": "আপনি সময়কাল বা শেষ সময় নির্ধারণ করে আপনার চুক্তির মেয়াদ শেষ নির্ধারণ করতে পারেন।", "1675030608": "এই অ্যাকাউন্টটি তৈরি করতে প্রথমে আপনাকে আপনার ঠিকানার প্রমাণ পুনরায় জমা দিতে হবে।", - "1675289747": "রিয়েল অ্যাকাউন্টে স্যুইচ করা হয়েছে", "1676549796": "ডাইনামিক লিভারেজ", "1677027187": "ফরেক্স", "1677990284": "আমার অ্যাপস", @@ -1556,6 +1585,7 @@ "1703091957": "মানি লন্ডারিং বিরোধী আইন অনুসারে আমাদের যথাযথ অধ্যবসায় বাধ্যবাধকতার অংশ হিসাবে আমরা আপনার কর্মসংস্থান সম্পর্কে তথ্য সংগ্রহ করি।", "1704656659": "CFD ট্রেডিং এ আপনার কত অভিজ্ঞতা আছে?", "1708413635": "আপনার {{currency_name}} ({{currency}}) অ্যাকাউন্টের জন্য", + "1709293836": "Wallet balance", "1709401095": "আর্থিক বাজার এবং আমাদের ডেরিভেড সূচকগুলির সাথে Deriv X এ CFD ট্রেড করুন।", "1709859601": "স্পট টাইম প্রস্থান করুন", "1710662619": "আপনার যদি অ্যাপটি থাকে, তাহলে ট্রেডিং শুরু করার জন্য এটি চালু করুন।", @@ -1570,6 +1600,7 @@ "1719248689": "ইউরো/জিবিপি/ইউএসডি", "1720451994": "আপনার Deriv fiat এবং Deriv ক্রিপ্টোকুরেন্স অ্যাকাউন্টগুলির মধ্যে স্থানান্তরের জন্য আমরা 2% ট্রান্সফার ফি বা {{minimum_fee}} {{currency}}চার্জ করব, যেটি উচ্চতর হবে।", "1720968545": "আপনার কম্পিউটার থেকে পাসপোর্ট ফটো পৃষ্ঠা আপলোড করুন", + "1723069433": "Your new Wallet", "1723589564": "আপনার পোর্টফোলিও মধ্যে অসামান্য চুক্তি সর্বোচ্চ সংখ্যা প্রতিনিধিত্ব করে। আপনার পোর্টফোলিওর প্রতিটি লাইন এক ওপেন পজিশনের জন্য গণনা করে। সর্বোচ্চ পৌঁছে গেলে, আপনি প্রথমে বিদ্যমান পজিশন বন্ধ না করে নতুন পজিশন খুলতে পারবেন না।", "1724696797": "আপনি শুধুমাত্র একটি ফায়াত অ্যাকাউন্টে সীমাবদ্ধ।", "1725958461": "অ্যাকাউন্ট নম্বর", @@ -1698,6 +1729,7 @@ "1842266423": "পিছনে", "1842862156": "আপনার Deriv X ড্যাশবোর্ডে স্বাগতম", "1843658716": "আপনি যদি “শুধুমাত্র ডাউনস” নির্বাচন করেন, তাহলে এন্ট্রি স্পটের পরে পরপর টিকটিগুলি ক্রমান্বয়ে পড়ে গেলে আপনি পেউটি জয় করেন। কোন টিক যদি বৃদ্ধি পায় বা পূর্ববর্তী টিকটিকগুলির সমান হয় তবে পরিশোধ করা হবে না।", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(সর্বনিম্ন: {{min_stake}} - সর্বোচ্চ: {{max_payout}})", "1846266243": "এই বৈশিষ্ট্যটি ডেমো অ্যাকাউন্টের জন্য উপলব্ধ নয়।", "1846587187": "আপনি আপনার বসবাসের দেশ নির্বাচন করেননি", @@ -1792,7 +1824,6 @@ "1924765698": "জন্মের স্থান*", "1926987784": "- iOS: অ্যাকাউন্টে বাম দিকে সোয়াইপ করুন এবং <0>মুছুন আলতো চাপুন।", "1928930389": "জিপি/এনওকে", - "1929309951": "কর্মসংস্থানের অবস্থা", "1929694162": "অ্যাকাউন্ট তুলনা করুন", "1930899934": "শিকল", "1931659123": "প্রতিটি টিক উপর চালান", @@ -1807,6 +1838,7 @@ "1943440862": "একটি নির্দিষ্ট সময়ের সাথে একটি তালিকা থেকে বলিঙ্গার ব্যান্ডস (বিবি) তালিকা গণনা করে", "1944204227": "এই ব্লক বর্তমান অ্যাকাউন্ট ব্যালেন্স ফেরত দেয়।", "1947527527": "1। এই লিঙ্কটি আপনার দ্বারা পাঠানো হয়েছে", + "1948044825": "MT5 Derived", "1948092185": "GBP/কানাডিয়ান", "1949719666": "এখানে সম্ভাব্য কারণগুলি রয়েছে:", "1950413928": "পরিচয় দস্তাবেজ জমা দিন", @@ -1875,6 +1907,7 @@ "2014536501": "কার্ড নাম্বার", "2014590669": "পরিবর্তনশীল '{{variable_name}}' এর কোন মান নেই। অবহিত করার জন্য অনুগ্রহ করে পরিবর্তনশীল '{{variable_name}}' এর মান নির্ধারণ করুন।", "2017672013": "দয়া করে ডকুমেন্ট ইস্যু করার দেশ নির্বাচন করুন।", + "2020104747": "Filter", "2020545256": "আপনার অ্যাকাউন্ট বন্ধ করবেন?", "2021037737": "অবিরত করার জন্য অনুগ্রহ করে আপনার বিস্তারিত আপডেট করুন।", "2021161151": "এই ভিডিওটি দেখুন Deriv Bot- এ একটি ট্রেডিং বট কিভাবে তৈরি করবেন তা শিখতে। এছাড়াও, একটি ট্রেডিং বট নির্মাণের উপর এই ব্লগ পোস্ট চেক আউট।", @@ -1885,7 +1918,6 @@ "2027696535": "কর সংক্রান্ত তথ্য", "2028163119": "ইওএস/ইউএসডি", "2029237955": "লাবুয়ান", - "2029641956": "সিএফডি অ্যাকাউন্ট তুলনা করুন", "2030018735": "আরএসআই একটি প্রযুক্তিগত বিশ্লেষণ সরঞ্জাম যা আপনাকে বাজারের প্রবণতা সনাক্ত করতে সহায়তা করে। এটি আপনাকে 0 থেকে 100 এর একটি মান দেবে। একটি RSI মান 70 এবং তার উপরে মানে যে সম্পদ অতিরিক্ত কেনা হয় এবং বর্তমান প্রবণতা বিপরীত হতে পারে, যখন 30 এবং নীচের মান মানে সম্পদ oversold হয়।", "2030045667": "বার্তা", "2033648953": "এই ব্লক আপনাকে একটি নির্বাচিত সময় ব্যবধানের জন্য নির্দিষ্ট মোমবাতি মান দেয়।", @@ -1919,6 +1951,7 @@ "2063812316": "টেক্সট স্টেটমেন্ট", "2063890788": "বাতিল করা হয়েছে", "2065278286": "স্প্রেড", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "ড্রাইভিং লাইসেন্স", "2070002739": "গ্রহণ করা হবে না", "2070345146": "লিভারেজড CFD ট্রেড খোলার সময়।", @@ -1931,6 +1964,7 @@ "2074713563": "4.2। একটি অভিযোগ দাখিল", "2080553498": "3। টেলিগ্রাম রিস্ট এপিআই ব্যবহার করে চ্যাট আইডি পান (আরও পড়ুন: https://core.telegram.org/bots/api#getupdates)", "2080829530": "বিক্রি হয়েছে: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "হ্যাঁ, মুছে ফেলুন", "2084693624": "যুগ থেকে সেকেন্ডের মধ্যে একটি তারিখ/সময় স্ট্রিং প্রতিনিধিত্বকারী একটি স্ট্রিং রূপান্তর করে। উদাহরণ: ১৯০১-০১:০১ ২১:০৩:৪৫ জিএমটি +০৮০০ ১৫৪৬৩৪৭৮২৫ তে রূপান্তরিত হবে। সময় এবং সময় অঞ্চল অফসেট ঐচ্ছিক।", "2085387371": "সংখ্যা, অক্ষর, এবং বিশেষ অক্ষর হতে হবে।, '-", @@ -1966,7 +2000,6 @@ "2115223095": "ক্ষতি", "2117165122": "1। একটি টেলিগ্রাম বট তৈরি করুন এবং আপনার টেলিগ্রাম API টোকেন পান। আরও পড়ুন কিভাবে তৈরি করতে বট মধ্যে টেলিগ্রাম এখানে: https://core.telegram.org/bots#6-botfather", "2117489390": "{{ remaining }} সেকেন্ডে স্বয়ংক্রিয় আপডেট", - "2118315870": "তুমি কোথায় থাকো?", "2119449126": "নীচের উদাহরণের উদাহরণ আউটপুট হবে:", "2119710534": "প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী", "2121227568": "নিও-ইউএসডি", @@ -1992,8 +2025,6 @@ "2146698770": "প্রো টিপ: আপনি পছন্দসই ব্লকটি ক্লিক করে টেনে আনতে পারেন", "2146892766": "বাইনারি অপশন ট্রেডিং অভিজ্ঞতা", "2147244655": "আমি কিভাবে ডেরিভ বোটে আমার নিজস্ব ট্রেডিং বট আমদানি করব?", - "-1232613003": "<0>যাচাইকরণ ব্যর্থ হয়েছে, <1>কেন?", - "-2029508615": "<0>যাচাইকরণ প্রয়োজন। এখনই <1>যাচাই করুন", "-931052769": "যাচাইকরণ জমা দিন", "-1004605898": "টিপস", "-1938142055": "ডকুমেন্টস আপলোড করা হয়েছে", @@ -2141,18 +2172,9 @@ "-179726573": "আমরা আপনার মালিকানা প্রমাণ পেয়েছি।", "-813779897": "মালিকানা যাচাইয়ের প্রমাণ পাস", "-638756912": "আপনার ডেবিট/ক্রেডিট কার্ডের সামনে দেখানো কার্ডের নম্বরের 7 থেকে 12 নম্বর ব্ল্যাক আউট করুন।", - "-2073934245": "এই সাইটে প্রদত্ত আর্থিক ট্রেডিং পরিষেবাগুলি কেবলমাত্র গ্রাহকদের জন্য উপযুক্ত, যারা তাদের বিনিয়োগ করা সমস্ত অর্থ হারানোর সম্ভাবনা গ্রহণ করে এবং যারা আর্থিক চুক্তি ক্রয়ের সাথে জড়িত ঝুঁকির অভিজ্ঞতা অর্জন করে। আর্থিক চুক্তির লেনদেন উচ্চ মাত্রার ঝুঁকি বহন করে। যদি আপনি যে চুক্তিগুলি ক্রয় করেন সেগুলি মূল্যহীন হিসাবে মেয়াদ শেষ হয়ে যায়, তাহলে আপনি আপনার সমস্ত বিনিয়োগ হারাবেন, যার মধ্যে রয়েছে চুক্তি প্রিমিয়াম।", - "-1166068675": "আপনার অ্যাকাউন্ট {{legal_entity_name}}দিয়ে খোলা হবে, যা ইউকে গেমিং কমিশন (ইউকেজিসি) দ্বারা নিয়ন্ত্রিত হবে এবং আইল অফ ম্যানের আইন সাপেক্ষে থাকবে।", - "-975118358": "আপনার অ্যাকাউন্ট {{legal_entity_name}}দিয়ে খোলা হবে, মাল্টা ফাইন্যান্সিয়াল সার্ভিসেস অথরিটি (এমএফএসএ) দ্বারা নিয়ন্ত্রিত হবে এবং মাল্টা আইন সাপেক্ষে হবে।", - "-680528873": "আপনার অ্যাকাউন্ট {{legal_entity_name}} দিয়ে খোলা হবে এবং সামোয়ার আইন সাপেক্ষে হবে।", - "-1125193491": "অ্যাকাউন্ট যোগ করুন", - "-2068229627": "আমি একটি PEP নই, এবং আমি গত 12 মাসে একটি PEP হয়েছে না।", "-684271315": "ঠিক আছে", "-740157281": "ট্রেডিং অভিজ্ঞতার মূল্যায়ন", "-1720468017": "আপনাকে আমাদের পরিষেবা প্রদানের ক্ষেত্রে, প্রদত্ত পণ্য বা পরিষেবা আপনার জন্য উপযুক্ত কিনা তা মূল্যায়ন করার জন্য আমাদের আপনার কাছ থেকে তথ্য সংগ্রহ করতে হবে।", - "-186841084": "আপনার লগইন ইমেইল পরিবর্তন করুন", - "-907403572": "আপনার ইমেল ঠিকানা পরিবর্তন করতে, আপনাকে প্রথমে আপনার {{identifier_title}} অ্যাকাউন্ট থেকে আপনার ইমেল ঠিকানা আনলিঙ্ক করতে হবে।", - "-1850792730": "{{identifier_title}}থেকে আনলিংক করুন", "-307865807": "ঝুঁকি সহনশীলতা সতর্কবার্তা", "-690100729": "হ্যাঁ, আমি ঝুঁকি বুঝতে।", "-2010628430": "CFD এবং অন্যান্য আর্থিক ইন্সট্রুমেন্টগুলি লিভারেজের কারণে দ্রুত অর্থ হারানোর একটি উচ্চ ঝুঁকি নিয়ে আসে। সিএফডি এবং অন্যান্য আর্থিক ইন্সট্রুমেন্টগুলি কীভাবে কাজ করে তা আপনি বুঝতে পারেন কি না এবং আপনার অর্থ হারানোর উচ্চ ঝুঁকি নিতে পারেন কিনা তা বিবেচনা করা উচিত৷ চালিয়ে যেতে, আপনাকে অবশ্যই নিশ্চিত<0/><0/> করতে হবে যে আপনি বুঝতে পারেন যে আপনার মূলধন ঝুঁকিতে রয়েছে।", @@ -2206,11 +2228,6 @@ "-1725454783": "ব্যর্থ", "-506510414": "তারিখ এবং সময়", "-1708927037": "আইপি ঠিকানা", - "-619126443": "{{brand_website_name}} এবং {{platform_name_trader}} এ লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার করুন", - "-623760979": "লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার করুন {{brand_website_name}}, {{platform_name_trader}} এবং {{platform_name_go}}।", - "-459147994": "{{brand_website_name}},,, {{platform_name_go}}, {{platform_name_trader}} {{platform_name_dbot}} এবং {{platform_name_ctrader}}লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার {{platform_name_smarttrader}}করুন।", - "-80717068": "আপনি আপনার <0>Deriv পাসওয়ার্ড লিঙ্ক করেছেন এমন অ্যাপ্লিকেশনগুলি:", - "-9570380": "ওয়েব এবং মোবাইল অ্যাপে আপনার {{platform_name_dxtrade}} টি অ্যাকাউন্টে লগ ইন করতে {{platform_name_dxtrade}} পাসওয়ার্ড ব্যবহার করুন।", "-2131200819": "নিষ্ক্রিয় করো", "-200487676": "সক্রিয় করো", "-1840392236": "এটা ঠিক কোড না। অনুগ্রহ করে আবার চেষ্টা করুন।", @@ -2240,44 +2257,37 @@ "-378415317": "রাষ্ট্রের প্রয়োজন", "-1497654315": "জার্সি পোস্টাল কোডের জন্য আমাদের অ্যাকাউন্ট এবং পরিষেবাগুলি অনুপলব্ধ।", "-755626951": "আপনার ঠিকানার বিস্তারিত বিবরণ পূরণ করুন", - "-584911871": "ওয়ালেট মুদ্রা নির্বাচন করুন", "-1461267236": "অনুগ্রহ করে আপনার মুদ্রা নির্বাচন করুন", - "-1352330125": "মুদ্রা", "-1027595143": "২৫,০০০ ডলারেরও কম", "-40491332": "$২৫,০০০ - ৫০,০০০ ডলার", "-1139806939": "৫০,০০১ - ১০০,০০০ ডলার", - "-626752657": "0-1 বছর", - "-532014689": "1-2 বছর", - "-1001024004": "3 বছর ধরে", - "-790513277": "গত 12 মাসে 6-10 লেনদেন", - "-580085300": "গত 12 মাসে 11-39 লেনদেন", - "-654781670": "প্রাথমিক", - "-1717373258": "মাধ্যমিক", "-996132458": "নির্মাণ", "-915003867": "স্বাস্থ্য", "-1430012453": "তথ্য ও যোগাযোগ প্রযুক্তি", "-987824916": "বিজ্ঞান ও প্রকৌশল", "-146630682": "সামাজিক ও সাংস্কৃতিক", "-761306973": "ম্যানুফ্যাকচারিং", - "-739367071": "নিযুক্ত", - "-1156937070": "$৫০০০১ - $১,০০,০০০", - "-315534569": "$১,০০,০০০ এরও বেশি", - "-2068544539": "বেতনভোগী কর্মচারী", - "-531314998": "বিনিয়োগ ও লভ্যাংশ", - "-1235114522": "পেনশন", - "-1298056749": "রাষ্ট্রীয় সুবিধাসমূহ", - "-449943381": "সঞ্চয় ও উত্তরাধিকার", "-1631552645": "প্রফেশনাল", "-474864470": "পার্সোনাল কেয়ার, সেলস অ্যান্ড সার্ভিস ওয়ার্কার্স", "-1129355784": "কৃষি, বনজ ও মৎস্য শ্রমিক", "-1242914994": "ক্র্যাফট, মেটাল, বৈদ্যুতিক ও ইলেকট্রনিক্স ওয়ার্কার্স", "-1317824715": "ক্লিনার এবং হেল্পার", "-1592729751": "খনি, নির্মাণ, উত্পাদন ও পরিবহন শ্রমিক", + "-1030759620": "সরকারি কর্মকর্তা", "-2137323480": "কোম্পানির মালিকানা", "-1590574533": "বিবাহবিচ্ছেদ নিষ্পত্তি", "-1667683002": "উত্তরাধিকার", "-1237843731": "বিনিয়োগের আয়", "-777506574": "সম্পত্তি বিক্রয়", + "-654781670": "প্রাথমিক", + "-1717373258": "মাধ্যমিক", + "-1156937070": "$৫০০০১ - $১,০০,০০০", + "-315534569": "$১,০০,০০০ এরও বেশি", + "-2068544539": "বেতনভোগী কর্মচারী", + "-531314998": "বিনিয়োগ ও লভ্যাংশ", + "-1235114522": "পেনশন", + "-1298056749": "রাষ্ট্রীয় সুবিধাসমূহ", + "-449943381": "সঞ্চয় ও উত্তরাধিকার", "-1161338910": "প্রথম নাম প্রয়োজন।", "-1161818065": "শেষ নাম 2 এবং 50 অক্ষরের মধ্যে হওয়া উচিত।", "-1281693513": "জন্ম তারিখ প্রয়োজন।", @@ -2287,28 +2297,14 @@ "-212167954": "কর সনাক্তকরণ নম্বর সঠিকভাবে ফরম্যাট করা হয় না।", "-621555159": "পরিচয় সংক্রান্ত তথ্য", "-204765990": "ব্যবহারের শর্তাবলী", - "-231863107": "না", - "-870902742": "অনলাইন ট্রেডিং সম্পর্কিত আপনার কত জ্ঞান এবং অভিজ্ঞতা আছে?", - "-1929477717": "আমি একটি একাডেমিক ডিগ্রী, পেশাদারী সার্টিফিকেশন, এবং/অথবা আর্থিক সেবা সম্পর্কিত কাজের অভিজ্ঞতা আছে।", - "-1540148863": "আমি ট্রেডিং সম্পর্কিত সেমিনার, প্রশিক্ষণ, এবং/অথবা কর্মশালায় অংশগ্রহণ করেছি।", - "-922751756": "এক বছরেরও কম", - "-542986255": "কোনোটিই না", - "-1337206552": "আপনার বোঝার ক্ষেত্রে, CFD ট্রেডিং আপনাকে", - "-456863190": "একটি অ্যাসেটের মূল্য চলাচলের উপর একটি পজিশন রাখুন যেখানে ফলাফলটি একটি নির্দিষ্ট রিটার্ন বা কিছুই না।", - "-1314683258": "একটি নিশ্চিত মুনাফা জন্য একটি দীর্ঘমেয়াদী বিনিয়োগ করুন।", - "-1546090184": "লিভারেজ CFD ট্রেডিং কিভাবে প্রভাবিত করে?", - "-1636427115": "লিভারেজ ঝুঁকি কমানোর জন্য সাহায্য করে।", - "-800221491": "লিভারেজ লাভের নিশ্চয়তা দেয়।", - "-811839563": "লিভারেজ আপনাকে ট্রেড মূল্যের একটি ভগ্নাংশের জন্য বড় পজিশন খুলতে দেয়, যার ফলে মুনাফা বা ক্ষতি বৃদ্ধি হতে পারে।", - "-1185193552": "আপনার ট্রেড স্বয়ংক্রিয়ভাবে বন্ধ করুন যখন ক্ষতির পরিমাণ নির্দিষ্ট পরিমাণের সমান বা তার বেশি হয়, যতক্ষণ মার্কেট পর্যাপ্ত লিকুইডিটি থাকে।", - "-1046354": "যখন মুনাফা নির্দিষ্ট পরিমাণের সমান বা তার বেশি হয়, ততক্ষণ পর্যন্ত পর্যাপ্ত মার্কেট লিকুইডিটি থাকে তখন স্বয়ংক্রিয়ভাবে আপনার ট্রেড বন্ধ করুন।", - "-1842858448": "আপনার ট্রেডের উপর নিশ্চিত মুনাফা করুন।", - "-860053164": "যখন মাল্টিপ্লেয়ার ট্রেডিং।", - "-1250327770": "একটি কোম্পানির শেয়ার ক্রয় করার সময়", - "-1222388581": "উপরের সবগুলো।", "-477761028": "ভোটার আইডি", "-1466346630": "সিপিএফ", - "-1030759620": "সরকারি কর্মকর্তা", + "-739367071": "নিযুক্ত", + "-626752657": "0-1 বছর", + "-532014689": "1-2 বছর", + "-1001024004": "3 বছর ধরে", + "-790513277": "গত 12 মাসে 6-10 লেনদেন", + "-580085300": "গত 12 মাসে 11-39 লেনদেন", "-612752984": "এগুলি ডিফল্ট সীমা যা আমরা আপনার অ্যাকাউন্টে প্রযোজ্য।", "-1598263601": "ট্রেডিং লিমিট এবং সেগুলো কিভাবে প্রয়োগ করে সে সম্পর্কে আরও জানতে অনুগ্রহ করে হেল্প <0>সেন্টারে যান।", "-1411635770": "অ্যাকাউন্ট সীমা সম্পর্কে আরও জানুন", @@ -2326,10 +2322,7 @@ "-1500958859": "যাচাই", "-1502578110": "আপনার অ্যাকাউন্ট পুরোপুরি প্রমাণীকৃত এবং আপনার উইথড্রয়াল লিমিট উঠিয়ে নেওয়া হয়েছে।", "-1662154767": "একটি সাম্প্রতিক ইউটিলিটি বিল (যেমন বিদ্যুৎ, পানি, গ্যাস, ল্যান্ডলাইন, বা ইন্টারনেট), ব্যাংক স্টেটমেন্ট, বা আপনার নাম এবং এই ঠিকানা সহ সরকার কর্তৃক প্রদত্ত চিঠি।", - "-190838815": "যাচাইয়ের জন্য আমাদের এই প্রয়োজন। আপনার প্রদত্ত তথ্য যদি নকল বা ভুল হয়, তাহলে আপনি জমা ও উত্তোলন করতে পারবেন না।", - "-223216785": "ঠিকানার দ্বিতীয় লাইন*", "-594456225": "ঠিকানার দ্বিতীয় লাইন", - "-1940457555": "ডাক/জিপ কোড*", "-1964954030": "ডাক/জিপ কোড", "-516397235": "আপনি এই টোকেন ভাগ যারা সতর্ক থাকুন। এই টোকেন সহ যে কেউ আপনার অ্যাকাউন্টের পক্ষ থেকে নিম্নলিখিত কর্ম সঞ্চালন করতে পারেন:", "-989216986": "অ্যাকাউন্ট যোগ করুন", @@ -2371,8 +2364,6 @@ "-1100235269": "কর্মসংস্থান শিল্প", "-684388823": "আনুমানিক নিট মূল্য", "-509054266": "প্রত্যাশিত বার্ষিক টার্নওভার", - "-601903492": "ফরেক্স ট্রেডিং অভিজ্ঞতা", - "-1012699451": "CFD ট্রেডিং অভিজ্ঞতা", "-1588485629": "উদাহরণ", "-1117345066": "নথির ধরন বেছে নিন", "-651192353": "নমুনা:", @@ -2394,11 +2385,11 @@ "-1088324715": "আমরা আপনার দস্তাবেজগুলি পর্যালোচনা করব এবং 1 - 3 কার্যদিবসের মধ্যে এটির স্থিতি সম্পর্কে আপনাকে অবহিত করব।", "-329713179": "আচ্ছা", "-1176889260": "অনুগ্রহ করে একটি নথির ধরন নির্বাচন করুন।", - "-1926456107": "আপনার জমা দেওয়া আইডি মেয়াদ শেষ হয়ে গেছে।", - "-555047589": "মনে হচ্ছে আপনার পরিচয় দস্তাবেজের মেয়াদ শেষ হয়ে গেছে। অনুগ্রহ করে একটি বৈধ নথি ব্যবহার করে পুনরায় চেষ্টা করুন।", - "-841187054": "পুনরায় চেষ্টা করুন", + "-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": "আপনার প্রদত্ত বিবরণ দিয়ে আমরা আপনার আইডি যাচাই করতে পারছি না। ", - "-228284848": "আপনার প্রদত্ত বিবরণ দিয়ে আমরা আপনার আইডি যাচাই করতে পারছি না।", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "আপনার আইডি যাচাই করা হয়েছে। আপনাকে আপনার ঠিকানা প্রমাণও জমা দিতে হবে।", "-118547687": "আইডি যাচাইকরণ পাস", "-200989771": "ব্যক্তিগত বিবরণ যান", @@ -2464,12 +2455,40 @@ "-142444667": "আপনার Deriv MT5 পাসওয়ার্ড পরিবর্তন করতে ইমেলের লিঙ্কে ক্লিক করুন।", "-742748008": "আপনার ইমেইল চেক করুন এবং এগিয়ে যাওয়ার জন্য ইমেলের লিঙ্কটি ক্লিক করুন।", "-84068414": "এখনো ইমেইল পাওয়া যায়নি? <0>লাইভ চ্যাটের মাধ্যমে আমাদের সাথে যোগাযোগ করুন।", + "-975118358": "আপনার অ্যাকাউন্ট {{legal_entity_name}}দিয়ে খোলা হবে, মাল্টা ফাইন্যান্সিয়াল সার্ভিসেস অথরিটি (এমএফএসএ) দ্বারা নিয়ন্ত্রিত হবে এবং মাল্টা আইন সাপেক্ষে হবে।", + "-2073934245": "এই সাইটে প্রদত্ত আর্থিক ট্রেডিং পরিষেবাগুলি কেবলমাত্র গ্রাহকদের জন্য উপযুক্ত, যারা তাদের বিনিয়োগ করা সমস্ত অর্থ হারানোর সম্ভাবনা গ্রহণ করে এবং যারা আর্থিক চুক্তি ক্রয়ের সাথে জড়িত ঝুঁকির অভিজ্ঞতা অর্জন করে। আর্থিক চুক্তির লেনদেন উচ্চ মাত্রার ঝুঁকি বহন করে। যদি আপনি যে চুক্তিগুলি ক্রয় করেন সেগুলি মূল্যহীন হিসাবে মেয়াদ শেষ হয়ে যায়, তাহলে আপনি আপনার সমস্ত বিনিয়োগ হারাবেন, যার মধ্যে রয়েছে চুক্তি প্রিমিয়াম।", + "-1125193491": "অ্যাকাউন্ট যোগ করুন", + "-2068229627": "আমি একটি PEP নই, এবং আমি গত 12 মাসে একটি PEP হয়েছে না।", + "-186841084": "আপনার লগইন ইমেইল পরিবর্তন করুন", + "-907403572": "আপনার ইমেল ঠিকানা পরিবর্তন করতে, আপনাকে প্রথমে আপনার {{identifier_title}} অ্যাকাউন্ট থেকে আপনার ইমেল ঠিকানা আনলিঙ্ক করতে হবে।", + "-1850792730": "{{identifier_title}}থেকে আনলিংক করুন", "-428335668": "প্রক্রিয়াটি সম্পূর্ণ করার জন্য আপনাকে একটি পাসওয়ার্ড সেট করতে হবে।", + "-1232613003": "<0>যাচাইকরণ ব্যর্থ হয়েছে, <1>কেন?", + "-2029508615": "<0>যাচাইকরণ প্রয়োজন। এখনই <1>যাচাই করুন", "-818898181": "নথিতে থাকা নামের সাথে আপনার ডেরিভ প্রোফাইলের সাথে মিল নেই।", "-310316375": "ডকুমেন্টের ঠিকানার সাথে আপনি উপরে প্রবেশ করানো ঠিকানার সাথে মিলবে না।", "-485368404": "ডকুমেন্টটি 6 মাস আগে জারি করা হয়েছে।", "-367016488": "ঝাপসা ডকুমেন্ট। সমস্ত তথ্য স্পষ্ট এবং দৃশ্যমান হতে হবে।", "-1957076143": "ক্রপ করা ডকুমেন্ট। সমস্ত তথ্য স্পষ্ট এবং দৃশ্যমান হতে হবে।", + "-231863107": "না", + "-870902742": "অনলাইন ট্রেডিং সম্পর্কিত আপনার কত জ্ঞান এবং অভিজ্ঞতা আছে?", + "-1929477717": "আমি একটি একাডেমিক ডিগ্রী, পেশাদারী সার্টিফিকেশন, এবং/অথবা আর্থিক সেবা সম্পর্কিত কাজের অভিজ্ঞতা আছে।", + "-1540148863": "আমি ট্রেডিং সম্পর্কিত সেমিনার, প্রশিক্ষণ, এবং/অথবা কর্মশালায় অংশগ্রহণ করেছি।", + "-922751756": "এক বছরেরও কম", + "-542986255": "কোনোটিই না", + "-1337206552": "আপনার বোঝার ক্ষেত্রে, CFD ট্রেডিং আপনাকে", + "-456863190": "একটি অ্যাসেটের মূল্য চলাচলের উপর একটি পজিশন রাখুন যেখানে ফলাফলটি একটি নির্দিষ্ট রিটার্ন বা কিছুই না।", + "-1314683258": "একটি নিশ্চিত মুনাফা জন্য একটি দীর্ঘমেয়াদী বিনিয়োগ করুন।", + "-1546090184": "লিভারেজ CFD ট্রেডিং কিভাবে প্রভাবিত করে?", + "-1636427115": "লিভারেজ ঝুঁকি কমানোর জন্য সাহায্য করে।", + "-800221491": "লিভারেজ লাভের নিশ্চয়তা দেয়।", + "-811839563": "লিভারেজ আপনাকে ট্রেড মূল্যের একটি ভগ্নাংশের জন্য বড় পজিশন খুলতে দেয়, যার ফলে মুনাফা বা ক্ষতি বৃদ্ধি হতে পারে।", + "-1185193552": "আপনার ট্রেড স্বয়ংক্রিয়ভাবে বন্ধ করুন যখন ক্ষতির পরিমাণ নির্দিষ্ট পরিমাণের সমান বা তার বেশি হয়, যতক্ষণ মার্কেট পর্যাপ্ত লিকুইডিটি থাকে।", + "-1046354": "যখন মুনাফা নির্দিষ্ট পরিমাণের সমান বা তার বেশি হয়, ততক্ষণ পর্যন্ত পর্যাপ্ত মার্কেট লিকুইডিটি থাকে তখন স্বয়ংক্রিয়ভাবে আপনার ট্রেড বন্ধ করুন।", + "-1842858448": "আপনার ট্রেডের উপর নিশ্চিত মুনাফা করুন।", + "-860053164": "যখন মাল্টিপ্লেয়ার ট্রেডিং।", + "-1250327770": "একটি কোম্পানির শেয়ার ক্রয় করার সময়", + "-1222388581": "উপরের সবগুলো।", "-1515286538": "দয়া করে আপনার ডকুমেন্ট নাম্বার দিন। ", "-1694758788": "আপনার ডকুমেন্ট নম্বর লিখুন", "-1458676679": "আপনি 2-50 অক্ষর লিখতে হবে।", @@ -2479,6 +2498,8 @@ "-1437017790": "আর্থিক তথ্য", "-70342544": "আমরা আপনার আর্থিক তথ্য জানতে আইনত বাধ্য।", "-39038029": "ট্রেডিং অভিজ্ঞতা", + "-601903492": "ফরেক্স ট্রেডিং অভিজ্ঞতা", + "-1012699451": "CFD ট্রেডিং অভিজ্ঞতা", "-1894668798": "অন্যান্য ট্রেডিং ইন্সট্রুমেন্টের অভিজ্ঞতা", "-1026468600": "অন্যান্য ট্রেডিং ইন্সট্রুমেন্ট ফ্রিকোয়েন্সি", "-1743024217": "ভাষা নির্বাচন করুন", @@ -2489,6 +2510,11 @@ "-536187647": "প্রবেশাধিকার প্রত্যাহার নিশ্চিত করা হবে?", "-1357606534": "অনুমতি", "-570222048": "অ্যাক্সেস প্রত্যাহার করা হবে", + "-80717068": "আপনি আপনার <0>Deriv পাসওয়ার্ড লিঙ্ক করেছেন এমন অ্যাপ্লিকেশনগুলি:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "{{brand_website_name}} এবং {{platform_name_trader}} এ লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার করুন", + "-623760979": "লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার করুন {{brand_website_name}}, {{platform_name_trader}} এবং {{platform_name_go}}।", + "-459147994": "{{brand_website_name}},,, {{platform_name_go}}, {{platform_name_trader}} {{platform_name_dbot}} এবং {{platform_name_ctrader}}লগ ইন করতে <0>Deriv পাসওয়ার্ড ব্যবহার {{platform_name_smarttrader}}করুন।", "-1526404112": "ইউটিলিটি বিল: বিদ্যুৎ, পানি, গ্যাস বা ল্যান্ডলাইন ফোন বিল।", "-537552700": "হোম ভাড়া চুক্তি: বৈধ এবং বর্তমান চুক্তি।", "-890084320": "সংরক্ষণ করুন এবং জমা দিন", @@ -2510,11 +2536,20 @@ "-362324454": "পণ্যদ্রব্য", "-1071336803": "প্ল্যাটফর্ম", "-820028470": "অপশন এবং মাল্টিপ্লেয়ার", - "-1255879419": "ট্রেডার'স হাব", + "-1186807402": "ট্রান্সফার", + "-224804428": "লেনদেন", + "-470018967": "ব্যালেন্স রিসেট করুন", + "-693105141": "MT5 Financial", + "-1290112064": "ডেরিভ ইজেড", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "রিসেট", "-213142918": "আমানত এবং তোলার সাময়িকভাবে অনুপলব্ধ ", - "-224804428": "লেনদেন", - "-1186807402": "ট্রান্সফার", "-1308346982": "উদ্ভূত", "-1145604233": "রিয়েল ওয়ার্ল্ড মার্কেট মুভমেন্ট অনুকরন করে এমন ডেরিভড ইন্ডিকেসের সাথে MT5 তে CFD ট্রেড করুন।", "-328128497": "আর্থিক", @@ -2525,15 +2560,29 @@ "-81256466": "একটি CFD অ্যাকাউন্ট তৈরি করতে আপনার একটি Deriv অ্যাকাউন্ট প্রয়োজন।", "-699372497": "সফল ট্রেডগুলিতে ভাল রিটার্নের জন্য লিভারেজ এবং টাইট স্প্রেডের সাথে ট্রেড <0>করুন।", "-1884966862": "বিভিন্ন ধরনের এবং এখতিয়ার সহ আরও Deriv MT5 অ্যাকাউন্ট পান।", - "-145462920": "Deriv cTrader", "-982095728": "পান", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>EU সংবিধিবদ্ধ দাবিত্যাগ: CFD জটিল ইন্সট্রুমেন্ট এবং লিভারেজের কারণে দ্রুত অর্থ হারানোর একটি উচ্চ ঝুঁকি নিয়ে আসে। <0>৭৩% রিটেইল ইনভেস্টর অ্যাকাউন্ট এই প্রোভাইডারের সাথে CFD ট্রেড করার সময় অর্থ হারায়। সিএফডি কিভাবে কাজ করে তা আপনি বুঝতে পারেন কি না এবং আপনার অর্থ হারানোর উচ্চ ঝুঁকি নিতে পারছেন কিনা তা বিবেচনা করা উচিত।", "-1277942366": "মোট সম্পদ", + "-1255879419": "ট্রেডার'স হাব", "-493788773": "অ-ইইউ", "-673837884": "ইইউ", "-230566990": "আপনার জমা দেওয়া নিম্নোক্ত নথিগুলি আমাদের চেকগুলি পাস করেনি:", "-846812148": "ঠিকানার প্রমাণ।", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "অ-ইইউ প্রবিধান", "-643108528": "অ-ইইউ এবং ইইউ নিয়ন্ত্রণ", + "-979459594": "Buy/Sell", + "-494667560": "অর্ডার", + "-679691613": "আমার বিজ্ঞাপন", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "সিআর 5236585", "-1665192032": "মাল্টিপ্লেয়ার অ্যাকাউন্ট", "-744999940": "একাউন্ট আহরণ করুন", @@ -2543,9 +2592,20 @@ "-318106501": "সিনথেটিক, বাস্কেট এবং ডেরিভড FX এর সাথে MT5 এ CFD ট্রেড করুন।", "-1328701106": "ফরেক্স, স্টক, স্টক ইনডেক্স, সিনথেটিক, ক্রিপ্টোকুয়ার্বিক্স এবং কমোডিটির সাথে MT5 এ CFD ট্রেড করুন।", "-1173266642": "এই অ্যাকাউন্টটি একটি বৈশিষ্ট্যসমৃদ্ধ ট্রেডিং প্ল্যাটফর্মে CFD অফার করে।", - "-1290112064": "ডেরিভ ইজেড", "-1453519913": "সহজে শুরু করা প্ল্যাটফর্মে আপনার প্রিয় অ্যাসেটের সাথে CFD ট্রেড করুন।", "-2051096382": "<0>বিকল্পগুলি দিয়ে সঠিকভাবে বাজারের গতিবিধি ভবিষ্যদ্বাণী করে বিভিন্ন পেআউট উপার্জন করুন, অথবা <1>মাল্টিপ্লায়ারদের সাথে আপনার প্রাথমিক অংশীদারিত্বের চেয়ে বেশি ঝুঁকি না নিয়েই CFD-এর উর্ধ্বগতি পান।.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "প্রবিধান পছন্দ", "-249184528": "আপনি ইইউ বা অ-ইইউ নিয়ন্ত্রণের অধীনে প্রকৃত অ্যাকাউন্ট তৈরি করতে পারেন। <0>এই অ্যাকাউন্টগুলি সম্পর্কে আরও জানতে<0/> আইকনে ক্লিক করুন।", "-1505234170": "ট্রেডার'স হাব ট্যুর", @@ -2556,7 +2616,21 @@ "-951876657": "আপনার অ্যাকাউন্ট টপ-আপ করুন", "-1945421757": "একাউন্ট থাকলে অ্যাকাউন্টে অর্থ যোগ করতে 'ডিপোজিট' বা 'ট্রান্সফার' এ ক্লিক করুন", "-1965920446": "ট্রেডিং শুরু করুন", - "-33612390": "<0>EU সংবিধিবদ্ধ দাবিত্যাগ: CFD জটিল ইন্সট্রুমেন্ট এবং লিভারেজের কারণে দ্রুত অর্থ হারানোর একটি উচ্চ ঝুঁকি নিয়ে আসে। <0>৭৩% রিটেইল ইনভেস্টর অ্যাকাউন্ট এই প্রোভাইডারের সাথে CFD ট্রেড করার সময় অর্থ হারায়। সিএফডি কিভাবে কাজ করে তা আপনি বুঝতে পারেন কি না এবং আপনার অর্থ হারানোর উচ্চ ঝুঁকি নিতে পারছেন কিনা তা বিবেচনা করা উচিত।", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "এই ক্ষেত্রটি প্রয়োজন।", "-1870909526": "আমাদের সার্ভার একটি ঠিকানা উদ্ধার করতে পারে না।", "-582721696": "বর্তমান অনুমোদিত প্রত্যাহারের পরিমাণ {{format_min_withdraw_amount}} থেকে {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "আপনার {{currency_symbol}} ওয়ালেট ঠিকানা", "-38063175": "{{account_text}} মানিব্যাগ", "-705272444": "আপনার পরিচয় যাচাই করার জন্য একটি পরিচয় প্রমাণ আপলোড করুন", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "এটি আপনার অ্যাকাউন্টকে অননুমোদিত তোলার হাত থেকে রক্ষা করতে।", "-130833284": "অনুগ্রহ করে মনে রাখবেন যে আপনার সর্বোচ্চ এবং সর্বনিম্ন উইথড্রয়াল লিমিট ঠিক নয়। ক্রিপ্টোকুরেন্সের উচ্চ অস্থিতিশীলতার কারণে তারা পরিবর্তন করে।", "-1531269493": "আপনার লেনদেন প্রক্রিয়া হয়ে গেলে আমরা আপনাকে একটি ইমেল পাঠাব।", @@ -2859,6 +2934,30 @@ "-1016171176": "অ্যাসেট", "-621128676": "ট্রেডের ধরণ", "-447853970": "ক্ষতি থ্রেশহোল্ড", + "-155173714": "চলুন শুরু করা যাক একটি বট নির্মাণ!", + "-1919212468": "3। আপনি বিভাগগুলির উপরে অনুসন্ধান বার ব্যবহার করে আপনি যে ব্লকগুলি চান সেগুলিও অনুসন্ধান করতে পারেন।", + "-1520558271": "আরো তথ্যের জন্য, একটি ট্রেডিং বট নির্মাণের মূলসূত্র উপর এই ব্লগ পোস্ট দেখুন।", + "-980360663": "3। আপনি চান ব্লক চয়ন করুন এবং কর্মক্ষেত্রে এটি টেনে আনুন।", + "-1493168314": "একটি দ্রুত কৌশল কি?", + "-1680391945": "একটি দ্রুত কৌশল ব্যবহার করে", + "-1177914473": "কিভাবে আমার কৌশল সংরক্ষণ করবো?", + "-271986909": "Bot বিল্ডারএ, আপনার বট ডাউনলোড করতে উপরের টুলবারে Save হিট করুন। আপনার বট একটি নাম দিন, এবং আপনার ডিভাইস বা Google ড্রাইভে আপনার বট ডাউনলোড করার জন্য চয়ন করুন। আপনার বট একটি এক্সএমএল ফাইল হিসাবে ডাউনলোড করা হবে।", + "-1149045595": "1। আমদানিআঘাত করার পরে, স্থানীয় নির্বাচন করুন এবং চালিয়ে যানক্লিক করুন।", + "-288041546": "2. আপনার XML ফাইলটি নির্বাচন করুন এবং ওপেন টিপুন।", + "-2127548288": "3। আপনার বট সেই অনুযায়ী লোড করা হবে।", + "-1311297611": "1। আঘাত করার পরে আমদানি, Google ড্রাইভ নির্বাচন করুন এবং চালিয়ে যানক্লিক করুন।", + "-1549564044": "আমি কিভাবে কর্মক্ষেত্র পুনরায় সেট করবো?", + "-1127331928": "বট বিল্ডারএ, উপরের টুলবারে রিসেট হিট করুন। এটি কর্মক্ষেত্র পরিষ্কার করবে। অনুগ্রহ করে মনে রাখবেন যে কোন অসংরক্ষিত পরিবর্তন হারিয়ে যাবে।", + "-1720444288": "আমি কিভাবে Deriv বট সঙ্গে আমার ক্ষতি নিয়ন্ত্রণ করতে পারি?", + "-1142295124": "Deriv বট সঙ্গে আপনার ক্ষতি নিয়ন্ত্রণ করার বিভিন্ন উপায় আছে। এখানে একটি সহজ উদাহরণ আছে কিভাবে আপনি আপনার কৌশল ক্ষতি নিয়ন্ত্রণ বাস্তবায়ন করতে পারেন:", + "-986689483": "1। নিম্নলিখিত ভেরিয়েবলগুলি তৈরি করুন:", + "-269910127": "3। সর্বশেষ চুক্তি থেকে মুনাফা সহ বর্তমান মুনাফা/ক্ষতি আপডেট করুন। যদি শেষ চুক্তি হারিয়ে যায়, তবে বর্তমান মুনাফা/ক্ষতির মান নেতিবাচক হবে।", + "-1565344891": "আমি কি আমার ওয়েব ব্রাউজারে একাধিক ট্যাবে Deriv Bot চালাতে পারি?", + "-90192474": "হ্যাঁ, তুমি পারবে। যাইহোক, আপনার অ্যাকাউন্টে সীমা আছে, যেমন সর্বাধিক সংখ্যক ওপেন পজিশন এবং ওপেন পজিশনগুলিতে সর্বাধিক সমষ্টিগত অর্থ প্রদান। সুতরাং, একাধিক পজিশন খোলার সময় এই সীমাগুলি মনে রাখবেন। আপনি এই সীমা সম্পর্কে আরও তথ্য সেটিংস > অ্যাকাউন্ট সীমাএ পেতে পারেন।", + "-213872712": "না, আমরা Deriv Bot এ ক্রিপ্টোকুয়ার্বিক্স অফার করি না।", + "-2147346223": "কোন দেশে ডেরিভ বট পাওয়া যায়?", + "-352345777": "অটোমেটেড ট্রেডিংয়ের জন্য সবচেয়ে জনপ্রিয় কৌশল কি?", + "-552392096": "স্বয়ংক্রিয় ট্রেডিংয়ের সবচেয়ে বেশি ব্যবহৃত কৌশলগুলির মধ্যে তিনটি হল মার্টিংগেল, ডি'আলেমবার্ট, এবং অস্কারের গ্রিন্ড - আপনি ডেরিভ বোটে তাদের জন্য প্রস্তুত এবং আপনার জন্য অপেক্ষা করতে পারেন।", "-507620484": "অসংরক্ষিত", "-764102808": "গুগল ড্রাইভ", "-555886064": "ওন", @@ -2937,30 +3036,6 @@ "-1823621139": "দ্রুত কৌশল", "-1778025545": "আপনি সফলভাবে একটি বট আমদানি করেছেন।", "-1519425996": "কোনো ফলাফল পাওয়া যায়নি \"{{ faq_search_value }}”", - "-155173714": "চলুন শুরু করা যাক একটি বট নির্মাণ!", - "-1919212468": "3। আপনি বিভাগগুলির উপরে অনুসন্ধান বার ব্যবহার করে আপনি যে ব্লকগুলি চান সেগুলিও অনুসন্ধান করতে পারেন।", - "-1520558271": "আরো তথ্যের জন্য, একটি ট্রেডিং বট নির্মাণের মূলসূত্র উপর এই ব্লগ পোস্ট দেখুন।", - "-980360663": "3। আপনি চান ব্লক চয়ন করুন এবং কর্মক্ষেত্রে এটি টেনে আনুন।", - "-1493168314": "একটি দ্রুত কৌশল কি?", - "-1680391945": "একটি দ্রুত কৌশল ব্যবহার করে", - "-1177914473": "কিভাবে আমার কৌশল সংরক্ষণ করবো?", - "-271986909": "Bot বিল্ডারএ, আপনার বট ডাউনলোড করতে উপরের টুলবারে Save হিট করুন। আপনার বট একটি নাম দিন, এবং আপনার ডিভাইস বা Google ড্রাইভে আপনার বট ডাউনলোড করার জন্য চয়ন করুন। আপনার বট একটি এক্সএমএল ফাইল হিসাবে ডাউনলোড করা হবে।", - "-1149045595": "1। আমদানিআঘাত করার পরে, স্থানীয় নির্বাচন করুন এবং চালিয়ে যানক্লিক করুন।", - "-288041546": "2. আপনার XML ফাইলটি নির্বাচন করুন এবং ওপেন টিপুন।", - "-2127548288": "3। আপনার বট সেই অনুযায়ী লোড করা হবে।", - "-1311297611": "1। আঘাত করার পরে আমদানি, Google ড্রাইভ নির্বাচন করুন এবং চালিয়ে যানক্লিক করুন।", - "-1549564044": "আমি কিভাবে কর্মক্ষেত্র পুনরায় সেট করবো?", - "-1127331928": "বট বিল্ডারএ, উপরের টুলবারে রিসেট হিট করুন। এটি কর্মক্ষেত্র পরিষ্কার করবে। অনুগ্রহ করে মনে রাখবেন যে কোন অসংরক্ষিত পরিবর্তন হারিয়ে যাবে।", - "-1720444288": "আমি কিভাবে Deriv বট সঙ্গে আমার ক্ষতি নিয়ন্ত্রণ করতে পারি?", - "-1142295124": "Deriv বট সঙ্গে আপনার ক্ষতি নিয়ন্ত্রণ করার বিভিন্ন উপায় আছে। এখানে একটি সহজ উদাহরণ আছে কিভাবে আপনি আপনার কৌশল ক্ষতি নিয়ন্ত্রণ বাস্তবায়ন করতে পারেন:", - "-986689483": "1। নিম্নলিখিত ভেরিয়েবলগুলি তৈরি করুন:", - "-269910127": "3। সর্বশেষ চুক্তি থেকে মুনাফা সহ বর্তমান মুনাফা/ক্ষতি আপডেট করুন। যদি শেষ চুক্তি হারিয়ে যায়, তবে বর্তমান মুনাফা/ক্ষতির মান নেতিবাচক হবে।", - "-1565344891": "আমি কি আমার ওয়েব ব্রাউজারে একাধিক ট্যাবে Deriv Bot চালাতে পারি?", - "-90192474": "হ্যাঁ, তুমি পারবে। যাইহোক, আপনার অ্যাকাউন্টে সীমা আছে, যেমন সর্বাধিক সংখ্যক ওপেন পজিশন এবং ওপেন পজিশনগুলিতে সর্বাধিক সমষ্টিগত অর্থ প্রদান। সুতরাং, একাধিক পজিশন খোলার সময় এই সীমাগুলি মনে রাখবেন। আপনি এই সীমা সম্পর্কে আরও তথ্য সেটিংস > অ্যাকাউন্ট সীমাএ পেতে পারেন।", - "-213872712": "না, আমরা Deriv Bot এ ক্রিপ্টোকুয়ার্বিক্স অফার করি না।", - "-2147346223": "কোন দেশে ডেরিভ বট পাওয়া যায়?", - "-352345777": "অটোমেটেড ট্রেডিংয়ের জন্য সবচেয়ে জনপ্রিয় কৌশল কি?", - "-552392096": "স্বয়ংক্রিয় ট্রেডিংয়ের সবচেয়ে বেশি ব্যবহৃত কৌশলগুলির মধ্যে তিনটি হল মার্টিংগেল, ডি'আলেমবার্ট, এবং অস্কারের গ্রিন্ড - আপনি ডেরিভ বোটে তাদের জন্য প্রস্তুত এবং আপনার জন্য অপেক্ষা করতে পারেন।", "-418247251": "আপনার জার্নাল ডাউনলোড করুন।", "-2123571162": "ডাউনলোড", "-870004399": "<0>কেনা: {{longcode}} (আইডি: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "অ্যাকাউন্ট নিষ্ক্রিয়", "-1837059346": "কিনতে / বিক্রয়", "-1845037007": "বিজ্ঞাপনদাতার পৃষ্ঠা", - "-494667560": "অর্ডার", - "-679691613": "আমার বিজ্ঞাপন", "-821418875": "ট্রেডার", "-679102561": "চুক্তির বিবরণ", "-430118939": "অভিযোগের নীতি", @@ -3082,7 +3155,6 @@ "-430041639": "আপনার ঠিকানা প্রমাণ আমাদের যাচাইকরণ চেকগুলি পাস করেনি এবং আমরা আপনার অ্যাকাউন্টে কিছু সীমাবদ্ধতা রেখেছি। অনুগ্রহ করে আপনার ঠিকানা প্রমাণ পুনরায় জমা দিন।", "-87177461": "অনুগ্রহ করে আপনার অ্যাকাউন্ট সেটিংসে যান এবং আমানত সক্ষম করার জন্য আপনার ব্যক্তিগত বিবরণ পূরণ করুন।", "-904632610": "আপনার ব্যালেন্স রিসেট করুন", - "-470018967": "ব্যালেন্স রিসেট করুন", "-156611181": "এটি আনলক করতে অনুগ্রহ করে আপনার অ্যাকাউন্ট সেটিংসে আর্থিক মূল্যায়ন সম্পূর্ণ করুন।", "-1925176811": "এই মুহুর্তে তোলার প্রক্রিয়া করতে অক্ষম", "-980696193": "সিস্টেম রক্ষণাবেক্ষণের কারণে অর্থ উত্তোলন সাময়িকভাবে অনুপলব্ধ। রক্ষণাবেক্ষণ সম্পূর্ণ হলে আপনি অর্থ উত্তোলন করতে পারেন।", @@ -3107,12 +3179,12 @@ "-577279362": "আপনার অ্যাকাউন্ট যাচাই করতে এবং ট্রেডিং চালিয়ে যেতে অনুগ্রহ করে আপনার পরিচয় প্রমাণ জমা দিন।", "-197134911": "আপনার পরিচয়ের প্রমাণের মেয়াদ শেষ হয়ে গেছে", "-152823394": "আপনার পরিচয়ের প্রমাণ মেয়াদ শেষ হয়ে গেছে। আপনার অ্যাকাউন্ট যাচাই করতে এবং ট্রেডিং চালিয়ে যেতে অনুগ্রহ করে একটি নতুন পরিচয় প্রমাণ জমা দিন।", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "এটি ঠিক করতে এই সহজ নির্দেশাবলী অনুসরণ করুন।", "-2142540205": "মনে হচ্ছে আপনার ডকুমেন্টের ঠিকানাটি আপনার ডেরিভ প্রোফাইলের ঠিকানাটির সাথে মেলে না। অনুগ্রহ করে আপনার ব্যক্তিগত বিবরণ সঠিক ঠিকানা দিয়ে আপডেট করুন।", "-482715448": "ব্যক্তিগত বিবরণে যান", "-2072411961": "আপনার ঠিকানা প্রমাণ যাচাই করা হয়েছে", "-384887227": "আপনার প্রোফাইলে ঠিকানা আপডেট করুন।", - "-448961363": "অ-ইইউ", "-1998049070": "আপনি যদি আমাদের কুকিজ ব্যবহারে সম্মত হন, তবে Accept এ ক্লিক করুন। আরও তথ্যের জন্য, <0>আমাদের নীতি দেখুন।", "-402093392": "ডেরিভ অ্যাকাউন্ট যোগ করুন", "-1721181859": "আপনি একটি {{deriv_account}} অ্যাকাউন্ট প্রয়োজন হবে", @@ -3125,7 +3197,6 @@ "-650505513": "ফুল স্ক্রীণ", "-1823504435": "বিজ্ঞপ্তি দেখুন", "-1954045170": "কোন কারেন্সি বরাদ্দ করা হয়নি", - "-583559763": "মেনু", "-1591792668": "অ্যাকাউন্ট লিমিট", "-34495732": "রেগুলেটরি তথ্য", "-1496158755": "ডেরিভেটিভ ডটকম এ যান", @@ -3259,6 +3330,7 @@ "-818926350": "আর্থিক কমিশন ঘটনার তারিখের 45 দিনের জন্য আপিল গ্রহণ করে এবং ব্যবসায়ী সরাসরি কোম্পানির সাথে সমস্যা সমাধানের চেষ্টা করার পরেই।", "-1825471709": "একটি শক্তিশালী কিন্তু সহজে ব্যবহার করা প্ল্যাটফর্মের উপর একটি সম্পূর্ণ নতুন ট্রেডিং অভিজ্ঞতা।", "-981017278": "আপনার নখদর্পণে অটোমেটেড ট্রেডিং। কোন কোডিং প্রয়োজন নেই।", + "-583559763": "মেনু", "-778309978": "আপনার ক্লিক করা লিঙ্কটি মেয়াদ শেষ হয়ে গেছে। আপনার ইনবক্সে থাকা সর্বশেষ ইমেইলের লিঙ্কটি ক্লিক করুন। বিকল্পভাবে, নীচের আপনার ইমেল লিখুন এবং একটি নতুন <0>লিঙ্কের জন্য ইমেল পুনরায় পাঠান ক্লিক করুন।", "-336222114": "এটি ঠিক করতে এই সহজ পদক্ষেপগুলি অনুসরণ করুন:", "-1064116456": "ব্রোকার <0>ডেরিভ হোল্ডিংস (গুয়ের্নসি) লিমিটেডের জন্য অনুসন্ধান করুন এবং এটি নির্বাচন করুন।", @@ -3415,22 +3487,6 @@ "-1282933308": "{{barrier}}না", "-968190634": "{{barrier}}এর সমান", "-1747377543": "{{barrier}}এর নিচে", - "-256210543": "এই সময়ে ট্রেডিং অনুপলব্ধ।", - "-1150099396": "আমরা শীঘ্রই আপনার জন্য এই উপলব্ধ আছে কাজ করছি। যদি আপনার অন্য অ্যাকাউন্ট থাকে, তাহলে ট্রেডিং চালিয়ে যেতে সেই অ্যাকাউন্টে যান। আপনি একটি Deriv MT5 আর্থিক যোগ করতে পারেন।", - "-28115241": "{{platform_name_trader}} এই অ্যাকাউন্টের জন্য উপলব্ধ নয়", - "-453920758": "{{platform_name_mt5}} ড্যাশবোর্ডে যান", - "-402175529": "ইতিহাস", - "-902712434": "চুক্তি বাতিল", - "-988484646": "চুক্তি বাতিল (মৃত্যুদন্ড কার্যকর)", - "-444882676": "চুক্তি বাতিল (সক্রিয়)", - "-13423018": "রেফারেন্স আইডি", - "-2035315547": "নিম্ন বাধা", - "-1551639437": "কোন ইতিহাস নেই", - "-1214703885": "আপনি এখনও আপডেট করতে পারেন মুনাফা বা স্টপ লস", - "-504849554": "এটি পুনরায় খোলা হবে", - "-59803288": "ইতিমধ্যে, আমাদের সিন্থেটিক সূচকগুলি চেষ্টা করুন। তারা বাস্তব-বাজারের অস্থিতিশীলতার অনুকরণ করে এবং 24/7 খোলা থাকে।", - "-1278109940": "ওপেন মার্কেট দেখুন", - "-694105443": "এই মার্কেট বন্ধ", "-1043795232": "সাম্প্রতিক অবস্থান", "-1511825574": "মুনাফা/ক্ষতি:", "-726626679": "সম্ভাব্য মুনাফা/ক্ষতি:", @@ -3455,21 +3511,15 @@ "-1435392215": "চুক্তি বাতিল সম্পর্কে", "-2017825013": "পেয়েছি এটা।", "-1192773792": "এটা আবার দেখাবে না", + "-902712434": "চুক্তি বাতিল", "-1280319153": "নির্বাচিত সময়সীমার মধ্যে যে কোন সময় আপনার ট্রেড বাতিল করুন। আপনার ট্রেড নির্বাচিত টাইম-ফ্রেমের মধ্যে স্টপ আউট লেভেলে পৌঁছালে স্বয়ংক্রিয়ভাবে ট্রিগার হয়।", "-471757681": "ঝুঁকি ব্যবস্থাপনা", "-843831637": "স্টপ লস", "-771725194": "চুক্তি বাতিলকরণ", "-338707425": "ন্যূনতম সময়কাল 1 দিন", "-1003473648": "স্থিতিকাল: {{duration}} দিন", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "মেয়াদ শেষ হওয়ার সময়ে পরিশোধ চূড়ান্ত মূল্য এবং স্ট্রাইক মূল্যের মধ্যে পার্থক্য দ্বারা গুণিত প্রতি পয়েন্ট পরিশোধের সমান।", "-1527492178": "ক্রয় লকড", "-725375562": "আপনি সেটিংস মেনু থেকে ক্রয় বোতামটি লক/আনলক করতে পারেন", - "-774638412": "স্টেক {{min_stake}} {{currency}} এবং মধ্যে হতে হবে {{max_stake}} {{currency}}", - "-1358367903": "পণ", - "-434270664": "বর্তমান মূল্য", - "-1956787775": "ব্যারিয়ার মূল্য:", - "-1513281069": "ব্যারিয়ার ২", "-390994177": "{{min}} এবং {{max}}এর মধ্যে হওয়া উচিত", "-1804019534": "মেয়াদ উত্তীর্ন: {{date}}", "-2055106024": "উন্নত এবং সহজ সময়কাল সেটিংসের মধ্যে টগল করুন", @@ -3484,6 +3534,7 @@ "-1763848396": "রাখুন", "-194424366": "উপরে", "-857660728": "স্ট্রাইক দাম", + "-1358367903": "পণ", "-1386326276": "ব্যারিয়ার একটি প্রয়োজনীয় ক্ষেত্র।", "-1418742026": "উচ্চ বাধা কম বাধা বেশী হতে হবে।", "-92007689": "নিম্ন বাধা উচ্চ বাধা থেকে কম হতে হবে।", @@ -3491,6 +3542,21 @@ "-1975910372": "মিনিট ০ থেকে ৫৯ এর মধ্যে হতে হবে।", "-866277689": "মেয়াদ শেষের সময় অতীতে হতে পারে না।", "-1455298001": "এখনই", + "-256210543": "এই সময়ে ট্রেডিং অনুপলব্ধ।", + "-1150099396": "আমরা শীঘ্রই আপনার জন্য এই উপলব্ধ আছে কাজ করছি। যদি আপনার অন্য অ্যাকাউন্ট থাকে, তাহলে ট্রেডিং চালিয়ে যেতে সেই অ্যাকাউন্টে যান। আপনি একটি Deriv MT5 আর্থিক যোগ করতে পারেন।", + "-28115241": "{{platform_name_trader}} এই অ্যাকাউন্টের জন্য উপলব্ধ নয়", + "-453920758": "{{platform_name_mt5}} ড্যাশবোর্ডে যান", + "-402175529": "ইতিহাস", + "-988484646": "চুক্তি বাতিল (মৃত্যুদন্ড কার্যকর)", + "-444882676": "চুক্তি বাতিল (সক্রিয়)", + "-13423018": "রেফারেন্স আইডি", + "-2035315547": "নিম্ন বাধা", + "-1551639437": "কোন ইতিহাস নেই", + "-1214703885": "আপনি এখনও আপডেট করতে পারেন মুনাফা বা স্টপ লস", + "-504849554": "এটি পুনরায় খোলা হবে", + "-59803288": "ইতিমধ্যে, আমাদের সিন্থেটিক সূচকগুলি চেষ্টা করুন। তারা বাস্তব-বাজারের অস্থিতিশীলতার অনুকরণ করে এবং 24/7 খোলা থাকে।", + "-1278109940": "ওপেন মার্কেট দেখুন", + "-694105443": "এই মার্কেট বন্ধ", "-439389714": "আমরা এটা কাজ করছি", "-770929448": "{{platform_name_smarttrader}}এ যান", "-347156282": "প্রমাণ জমা দিন", @@ -3537,6 +3603,8 @@ "-454245976": "যদি আপনি মনে করেন যে বাজারের দাম নির্দিষ্ট সময়ের জন্য ক্রমাগত কমে যাবে, তাহলে <0>শর্ট বেছে নিন। যদি বাজার মূল্য বাধা অতিক্রম না করে বা অতিক্রম না করে তবে মেয়াদ শেষ হওয়ার সময় আপনি একটি অর্থ প্রদান পাবেন। আপনার পরিশোধ বাজার মূল্য এবং বাধা মধ্যে দূরত্ব আনুপাতিকভাবে বৃদ্ধি হবে যদি বাধা লঙ্ঘন না হয়। আপনি একটি মুনাফা উপার্জন শুরু হবে যখন পেআউট আপনার পণ বেশী হয়। যদি বাজার মূল্য কখনও বাধা অতিক্রম করে, তাহলে একটি অর্থ প্রদান করা হবে না।", "-351875097": "টিকটিকি সংখ্যা", "-729830082": "কম দেখুন", + "-1669741470": "মেয়াদ শেষ হওয়ার সময়ে পরিশোধ চূড়ান্ত মূল্য এবং স্ট্রাইক মূল্যের মধ্যে পার্থক্য দ্বারা গুণিত প্রতি পয়েন্ট পরিশোধের সমান।", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "নতুন!", "-993480898": "অ্যাকুমিলেটর", "-45873457": "নতুন", @@ -3557,6 +3625,10 @@ "-690963898": "আপনার পেমেন্ট এই পরিমাণ পৌঁছে যখন আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।", "-511541916": "আপনার চুক্তি স্বয়ংক্রিয়ভাবে ticks এই সংখ্যা পৌঁছানোর পরে বন্ধ করা হবে।", "-438655760": "<0>দ্রষ্টব্য: আপনি যে কোন সময় আপনার ট্রেড বন্ধ করতে পারবেন। স্লিপেজ ঝুঁকি সম্পর্কে সচেতন থাকুন।", + "-774638412": "স্টেক {{min_stake}} {{currency}} এবং মধ্যে হতে হবে {{max_stake}} {{currency}}", + "-434270664": "বর্তমান মূল্য", + "-1956787775": "ব্যারিয়ার মূল্য:", + "-1513281069": "ব্যারিয়ার ২", "-1683683754": "লং", "-1046859144": "<0>{{title}} বাজার মূল্য {{price_position}} থাকে এবং বাধা স্পর্শ বা অতিক্রম না করলে আপনি একটি অর্থ প্রদান পাবেন। অন্যথায়, আপনার পরিশোধ শূন্য হবে।", "-1815023694": "বাধা উপরে", diff --git a/packages/translations/src/translations/de.json b/packages/translations/src/translations/de.json index 58cca7aab89a..ff689c570184 100644 --- a/packages/translations/src/translations/de.json +++ b/packages/translations/src/translations/de.json @@ -24,7 +24,6 @@ "27731356": "Ihr Konto ist vorübergehend deaktiviert. Bitte kontaktieren Sie uns per <0>Live-Chat, um wieder Ein- und Auszahlungen zu ermöglichen.", "27830635": "Deriv (V) Ltd.", "28581045": "Fügen Sie ein echtes MT5-Konto hinzu", - "30801950": "Ihr Konto wird mit {{legal_entity_name}}eröffnet, wird von der Malta Gaming Authority reguliert und unterliegt den maltesischen Gesetzen.", "33433576": "Bitte verwenden Sie ein E-Wallet, um Ihr Geld abzuheben.", "35089987": "Laden Sie die Vorder- und Rückseite Ihres Führerscheins hoch.", "41737927": "Danke", @@ -60,11 +59,13 @@ "72500774": "Bitte geben Sie den steuerlichen Wohnsitz ein.", "73086872": "Sie haben sich selbst vom Handel ausgeschlossen", "73326375": "Das Tief ist der tiefste Punkt, den der Markt während der Vertragslaufzeit jemals erreicht hat.", + "74836780": "{{currency_code}} Wallet", "74963864": "Unter", "76916358": "Sie haben das Auszahlungslimit erreicht.<0/> Bitte laden Sie Ihren Identitäts- und Adressnachweis hoch, um das Limit aufzuheben und Ihre Auszahlung fortzusetzen.", "76925355": "Überprüfen Sie die Leistung Ihres Bots", "77945356": "Handeln Sie unterwegs mit unserer mobilen App.", "77982950": "Mit Vanilla-Optionen können Sie eine Aufwärts- (bullish) oder Abwärtsbewegung (bearish) des Basiswerts vorhersagen, indem Sie einen \"Call\" oder einen \"Put\" kaufen.", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Wir konnten diese Seite nicht finden", "82839270": "Laden Sie die Seite Ihres Reisepasses hoch, die Ihr Foto enthält.", "83202647": "Block zusammenklappen", @@ -76,6 +77,7 @@ "90266322": "2. Starte einen Chat mit deinem neu erstellten Telegram-Bot und stelle sicher, dass du ihm einige Nachrichten sendest, bevor du mit dem nächsten Schritt fortfährst. (z. B. Hello Bot!)", "91993812": "Die Martingale-Strategie ist eine klassische Handelstechnik, die seit mehr als hundert Jahren angewendet wird und im 18. Jahrhundert vom französischen Mathematiker Paul Pierre Levy populär gemacht wurde.", "93154671": "1. Klicken Sie unten im Statistikfenster auf Zurücksetzen.", + "93939827": "Cryptocurrency accounts", "96381225": "Die ID-Überprüfung ist fehlgeschlagen", "98473502": "Wir sind nicht verpflichtet, einen Angemessenheitstest durchzuführen und Sie auch nicht vor Risiken zu warnen.", "98972777": "zufälliger Artikel", @@ -83,6 +85,7 @@ "102226908": "Das Feld darf nicht leer sein", "108916570": "Dauer: {{duration}} Tage", "109073671": "Bitte verwenden Sie ein E-Wallet, das Sie zuvor für Einzahlungen verwendet haben. Stellen Sie sicher, dass das E-Wallet die Auszahlung unterstützt. Die Liste der E-Wallets, die Auszahlungen unterstützen, <0>finden Sie hier.", + "110822969": "One Wallet for all your transactions", "111215238": "Entfernen Sie sich von direktem Licht", "111718006": "Enddatum", "111931529": "Maximaler Gesamteinsatz über 7 Tage", @@ -215,7 +218,9 @@ "251882697": "Danke! Ihre Antwort wurde in unserem System aufgezeichnet.<0/><0/> Bitte klicken Sie auf „OK“, um fortzufahren.", "254912581": "Dieser Block ähnelt EMA, außer dass er Ihnen die gesamte EMA-Zeile basierend auf der Eingabeliste und dem angegebenen Zeitraum anzeigt.", "256031314": "Geschäft mit Bargeld", + "256123827": "What happens to my trading accounts", "256602726": "Wenn du dein Konto schließt:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Bewertung des Handels", "260069181": "Beim Versuch, die URL zu laden, ist ein Fehler aufgetreten", @@ -250,8 +255,8 @@ "284527272": "Antimode", "284772879": "Vertrag", "284809500": "Finanzielle Demo", + "285909860": "Demo {{currency}} Wallet", "287934290": "Möchten Sie diese Transaktion wirklich stornieren?", - "289898640": "NUTZUNGSBEDINGUNGEN", "291744889": "<0>1. Handelsparameter: <0>", "291817757": "Besuchen Sie unsere Deriv-Community und erfahren Sie mehr über APIs, API-Token, Möglichkeiten zur Verwendung von Deriv-APIs und mehr.", "292491635": "Wenn Sie „Stop Loss“ wählen und einen Betrag angeben, um Ihren Verlust zu begrenzen, wird Ihre Position automatisch geschlossen, wenn Ihr Verlust diesen Betrag übersteigt oder diesem Betrag entspricht. Ihr Verlust kann je nach Marktpreis bei Handelsschluss höher sein als der Betrag, den Sie eingegeben haben.", @@ -299,6 +304,7 @@ "344418897": "Diese Handelslimits und der Selbstausschluss helfen Ihnen dabei, den Geldbetrag und die Zeit, die Sie für {{brand_website_name}} ausgeben, zu kontrollieren und <0>verantwortungsbewusst zu handeln.", "345320063": "Ungültiger Zeitstempel", "345818851": "Entschuldigung, ein interner Fehler ist aufgetreten. Klicken Sie auf das obige Kontrollkästchen, um es erneut zu versuchen.", + "346214602": "A better way to manage your funds", "347029309": "Forex: Standard/Mikro", "347039138": "Iterieren (2)", "347217485": "Haben Sie Probleme mit dem Zugriff auf Deriv MT5 auf Ihrem Handy?", @@ -353,6 +359,7 @@ "401345454": "Gehen Sie dazu auf den Tab Tutorials.", "402343402": "Aufgrund eines Problems auf unserem Server sind einige Ihrer {{platform}}-Konten im Moment nicht verfügbar. Bitte haben Sie Geduld mit uns und vielen Dank für Ihre Geduld.", "403456289": "Die Formel für SMA lautet:", + "403608958": "Select a trading account or a Wallet", "404743411": "Einlagen insgesamt", "406359555": "Angaben zum Vertrag", "406497323": "Verkaufen Sie bei Bedarf Ihren aktiven Vertrag (optional)", @@ -373,6 +380,7 @@ "427617266": "Bitcoins", "428709688": "Ihr bevorzugtes Zeitintervall zwischen den einzelnen Berichten:", "431267979": "Hier finden Sie eine kurze Anleitung, wie Sie Deriv Bot unterwegs verwenden können.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Gewinnmitnahme: {{ currency }} {{ take_profit }}", "432519573": "Dokument wurde hochgeladen", @@ -453,12 +461,12 @@ "518955798": "7. Beim Start einmal ausführen", "520136698": "Boom 500 Index", "521872670": "Artikel", - "522283618": "Erfahrung im Handel mit digitalen Optionen", "522703281": "teilbar durch", "523123321": "- 10 hoch mit einer bestimmten Zahl", "524459540": "Wie erstelle ich Variablen?", "527329988": "Dies ist ein der 100 häufigsten Passwörter", "529056539": "Optionen", + "530864956": "Deriv Apps", "530953413": "Autorisierte Anwendungen", "531114081": "3. Art des Vertrags", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, Aktien, Aktienindizes, Kryptowährungen, synthetische Indizes", "545476424": "Auszahlungen insgesamt", "549479175": "Multiplikatoren ableiten", + "549799607": "Go to LiveChat", "550589723": "Ihr Einsatz steigt um {{growth_rate}}% pro Tick, solange der aktuelle Kassakurs innerhalb von ±{{tick_size_barrier}} gegenüber dem vorherigen Kassakurs bleibt.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Erfahren Sie mehr über Handelslimits", "554135844": "Bearbeiten", "554410233": "Dies ist ein der 10 häufigsten Passwörter", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Nachdem Sie Handelsparameter und Handelsoptionen definiert haben, möchten Sie Ihren Bot möglicherweise anweisen, Kontrakte zu kaufen, wenn bestimmte Bedingungen erfüllt sind. Dazu können Sie Bedingungsblöcke und Indikatorblöcke verwenden, um Ihrem Bot zu helfen, Entscheidungen zu treffen.", "555881991": "Zettel mit der nationalen Identifikationsnummer", "556264438": "Zeitintervall", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "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.", "639382772": "Bitte laden Sie den unterstützten Dateityp hoch.", "640596349": "Sie haben noch keine Benachrichtigungen erhalten", @@ -562,7 +574,6 @@ "642546661": "Laden Sie die Rückseite der Lizenz von Ihrem Computer hoch", "642995056": "E-Mail", "644150241": "Die Anzahl der Verträge, die du gewonnen hast, seit du deine Statistiken das letzte Mal gelöscht hast.", - "645016681": "Handelshäufigkeit mit anderen Finanzinstrumenten", "645902266": "EUR/NZD", "647039329": "Adressnachweis erforderlich", "647745382": "Eingabeliste {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "Im folgenden Beispiel wird der Eröffnungskurs ausgewählt, der dann einer Variablen namens „op“ zugewiesen wird.", "666724936": "Bitte geben Sie eine gültige Identifikationsnummer ein.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Gerichtsstand und Rechtswahl", "674973192": "Verwenden Sie dieses Passwort, um sich in Ihren Deriv MT5-Konten in den Desktop-, Web- und mobilen Apps anzumelden.", "676159329": "Konnte nicht zum Standardkonto wechseln.", @@ -613,6 +625,7 @@ "692354762": "Bitte geben Sie Ihre {{document_name}}ein. {{example_format}}", "693396140": "Stornierung des Deals (abgelaufen)", "694035561": "Multiplikatoren für Handelsoptionen", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Öffnungszeit: der Öffnungszeitstempel", "697630556": "Dieser Markt ist derzeit geschlossen.", "698037001": "Nationale Identifikationsnummer", @@ -624,8 +637,8 @@ "701647434": "Suche nach einer Zeichenfolge", "702451070": "Personalausweis (kein Foto)", "702561961": "Thema ändern", + "705262734": "Your Wallets are ready", "705299518": "Laden Sie als Nächstes die Seite Ihres Reisepasses hoch, die Ihr Foto enthält.", - "706413212": "Um auf den Kassierer zuzugreifen, befinden Sie sich jetzt in Ihrem Konto {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Häufigkeit des Handels mit binären Optionen", "706755289": "Dieser Block führt trigonometrische Funktionen aus.", "706960383": "Wir bieten Ihnen an, Ihren Kontrakt zu diesem Preis zu kaufen, wenn Sie ihn vor Ablauf der Laufzeit verkaufen möchten. Dies hängt von verschiedenen Faktoren ab, wie dem aktuellen Spotpreis, der Laufzeit usw. Wir bieten jedoch keinen Kontraktwert an, wenn die verbleibende Laufzeit unter 60 Sekunden liegt.", @@ -644,6 +657,7 @@ "720293140": "Abmelden", "720519019": "Setze mein Passwort zurück", "721011817": "- Potenziere die erste Zahl mit der zweiten Zahl", + "722797282": "EU-regulated USD accounts", "723045653": "Sie melden sich mit dieser E-Mail-Adresse bei Ihrem Deriv-Konto an.", "723961296": "Passwort verwalten", "724203548": "Sie können Ihre Beschwerde an die <0>Online-Streitbeilegungsplattform (ODR) der Europäischen Kommission senden. Dies gilt nicht für britische Kunden.", @@ -656,6 +670,7 @@ "734390964": "Unzureichendes Gleichgewicht", "734881840": "falsch", "742469109": "Reset Balance", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Handeln Sie CFDs auf Devisen, abgeleitete Indizes, Kryptowährungen und Rohstoffe mit hoher Hebelwirkung.", "743623600": "Referenz", "744110277": "Bollinger Bands Array (BBA)", @@ -689,6 +704,7 @@ "775706054": "Verkaufen Sie Handelsbots?", "776085955": "Strategien", "781924436": "Spread anrufen/Spread Put", + "782563319": "Add more Wallets", "783974693": "Vermeiden Sie die letzten Jahre", "784311461": "Exponentieller gleitender Durchschnitt (EMA)", "784583814": "Mit Ihrem Computer verbunden", @@ -725,6 +741,7 @@ "818447476": "Konto wechseln?", "820877027": "Bitte überprüfen Sie Ihren Identitätsnachweis", "821163626": "Die Serverwartung findet jeden ersten Samstag im Monat von 7 bis 10 Uhr GMT-Zeit statt. Während dieser Zeit kann es zu Serviceunterbrechungen kommen.", + "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": "Ein Block, der Text enthalten kann.", "824797920": "Ist die Liste leer?", "825042307": "Versuchen wir es noch einmal", @@ -747,7 +764,6 @@ "836097457": "Ich interessiere mich für den Handel, habe aber sehr wenig Erfahrung.", "837063385": "Senden Sie keine anderen Währungen an diese Adresse.", "837066896": "Ihr Dokument wird überprüft. Bitte versuchen Sie es in 1-3 Tagen erneut.", - "839618971": "ADRESSE", "839805709": "Um Sie reibungslos verifizieren zu können, benötigen wir ein besseres Foto", "840672750": "Wenn dies nicht funktioniert, deinstallieren Sie die MT5-App und installieren Sie sie erneut. Wiederholen Sie dann die Schritte <0>2 und <0>3.", "841434703": "Stapel deaktivieren", @@ -844,9 +860,9 @@ "943535887": "Bitte schließen Sie Ihre Positionen in den folgenden Deriv MT5-Konten:", "944499219": "Max. offene Stellen", "945532698": "Vertrag verkauft", + "945753712": "Back to Trader’s Hub", "946204249": "Lesen", "946841802": "Eine weiße (oder grüne) Kerze zeigt an, dass der Eröffnungskurs unter dem Schlusskurs liegt. Dies entspricht einer Aufwärtsbewegung des Marktpreises.", - "946944859": "Klicken Sie auf die Schaltfläche unten und wir senden Ihnen eine E-Mail mit einem Link. Klicken Sie auf diesen Link, um Ihre Auszahlungsanfrage zu überprüfen.", "947046137": "Ihre Auszahlung wird innerhalb von 24 Stunden bearbeitet", "947363256": "Liste erstellen", "947758334": "Stadt ist erforderlich", @@ -950,6 +966,7 @@ "1050128247": "Ich bestätige, dass ich die Überweisungsinformationen des Zahlungsagenten überprüft habe.", "1050844889": "Berichte", "1052779010": "Sie sind auf Ihrem Demo-Konto", + "1052921318": "{{currency}} Wallet", "1053153674": "Jump 50 Index", "1053159279": "Bildungsniveau", "1053556481": "Sobald Sie Ihre Beschwerde eingereicht haben, senden wir Ihnen eine Bestätigungs-E-Mail, um zu bestätigen, dass wir sie erhalten haben.", @@ -1010,6 +1027,7 @@ "1110102997": "Aussage", "1112582372": "Dauer des Intervalls", "1113119682": "Dieser Block gibt Ihnen den ausgewählten Kerzenwert aus einer Liste von Kerzen.", + "1113221217": "MT5 Swap-free", "1113292761": "Weniger als 8 MB", "1114679006": "Sie haben Ihren Bot erfolgreich mit einer einfachen Strategie erstellt.", "1117281935": "Verkaufsbedingungen (optional)", @@ -1036,6 +1054,7 @@ "1134879544": "Beispiel für ein Dokument mit Blendung", "1138126442": "Devisenhandel: Standard", "1139483178": "Stapel aktivieren", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Richtung ist {{ direction_type }}", "1144028300": "Array für den relativen Stärkeindex (RSIA)", "1145927365": "Lasse die Blöcke nach einer bestimmten Anzahl von Sekunden im Inneren laufen", @@ -1066,7 +1085,6 @@ "1174689133": "3. Legen Sie Ihre Handelsparameter fest und klicken Sie auf Run.", "1174748431": "Zahlungskanal", "1175183064": "Vanuatu", - "1176926166": "Erfahrung mit dem Handel mit anderen Finanzinstrumenten", "1177396776": "Wenn Sie „Asian Fall“ wählen, gewinnen Sie die Auszahlung, wenn das letzte Häkchen unter dem Durchschnitt der Zecken liegt.", "1177723589": "Es gibt keine anzuzeigenden Transaktionen", "1178582280": "Die Anzahl der Verträge, die Sie seit dem letzten Löschen Ihrer Statistiken verloren haben.", @@ -1077,6 +1095,7 @@ "1181396316": "Dieser Block gibt dir eine Zufallszahl aus einem festgelegten Bereich", "1181770592": "Gewinn/Verlust aus dem Verkauf", "1183007646": "- Vertragstyp: Der Name des Vertragstyps wie Rise, Fall, Touch, No Touch usw.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Schließen Sie jetzt Ihren Vertrag ab oder lassen Sie ihn laufen. Wenn Sie sich dafür entscheiden, es am Laufen zu halten, können Sie es später auf der ", "1188316409": "Um Ihr Geld zu erhalten, wenden Sie sich mit den unten angegebenen Daten an den Zahlungsagenten", "1188980408": "5 Minuten", @@ -1094,12 +1113,14 @@ "1201773643": "numerisch", "1203297580": "Dieser Block sendet eine Nachricht an einen Telegram-Kanal.", "1204223111": "In diesem Beispiel werden die Eröffnungspreise aus einer Kerzenliste einer Variablen namens „candle_list“ zugewiesen.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Wie maskiere ich meine Karte?", "1206821331": "Streitkräfte", "1207152000": "Wählen Sie eine Vorlage und legen Sie Ihre Handelsparameter fest.", "1208714859": "Kurz gesagt:", "1208729868": "Zecken", "1208903663": "Ungültiges Token", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Bot startet", "1214893428": "Die Kontoerstellung ist derzeit für Mobilgeräte nicht verfügbar. Bitte melden Sie sich mit Ihrem Computer an, um ein neues Konto zu erstellen.", "1216408337": "Selbstständig", @@ -1112,6 +1133,7 @@ "1222521778": "Ein- und Auszahlungen sind schwierig.", "1222544232": "Wir haben dir eine E-Mail geschickt", "1225150022": "Anzahl der Vermögenswerte", + "1226027513": "Transfer from", "1227074958": "zufälliger Bruchteil", "1227240509": "Leerzeichen kürzen", "1228534821": "Einige Währungen werden möglicherweise von den Zahlungsagenten in Ihrem Land nicht unterstützt.", @@ -1121,6 +1143,7 @@ "1232291311": "Maximale verbleibende Auszahlung", "1232353969": "0-5 Transaktionen in den letzten 12 Monaten", "1233300532": "Auszahlung", + "1233376285": "Options & multipliers", "1234292259": "Quelle des Reichtums", "1234764730": "Laden Sie einen Screenshot Ihres Namens und Ihrer E-Mail-Adresse aus dem Bereich „Persönliche Daten“ hoch.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Sortiert die Elemente in einer bestimmten Liste nach ihrem numerischen oder alphabetischen Wert in aufsteigender oder absteigender Reihenfolge.", "1281290230": "Wählen", "1282951921": "Nur Downs", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Wenn „Verlust“ ausgewählt ist, wird „Wahr“ zurückgegeben, wenn Ihr letzter Handel nicht erfolgreich war. Andernfalls wird eine leere Zeichenfolge zurückgegeben.", "1286094280": "Abheben", "1286507651": "Bildschirm zur Identitätsprüfung schließen", @@ -1173,7 +1197,6 @@ "1289146554": "Finanzdienstleistungskommission der Britischen Jungferninseln", "1289646209": "Margin Call", "1290525720": "Beispiel: ", - "1291887623": "Häufigkeit des Handels mit digitalen Optionen", "1291997417": "Die Kontrakte laufen genau um 23:59:59 GMT an dem von Ihnen gewählten Verfallsdatum aus.", "1292188546": "Setzen Sie das Deriv MT5-Investorenpasswort zurück", "1292891860": "Telegram benachrichtigen", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Verkauf)", "1329136554": "Jump 200 Index", "1329325646": "Der Inhalt dieses Blocks wird bei jedem Tick aufgerufen.", + "1330479159": "Ready to upgrade?", "1331199417": "Bitte geben Sie das richtige Format ein. ", "1331367811": "Kontonummer des Kunden", "1332168410": "Erfahren Sie mehr", @@ -1257,7 +1281,6 @@ "1367023655": "Um sicherzustellen, dass Ihr Verlust Ihren Einsatz nicht übersteigt, wird Ihr Kontrakt automatisch geschlossen, wenn Ihr Verlust gleich ist<0/>.", "1367488817": "4. Starten Sie die Handelsbedingungen neu", "1367990698": "Volatilitätsindex 10", - "1369709538": "Unsere Nutzungsbedingungen", "1370647009": "Genießen Sie höhere Tageslimits", "1371193412": "Stornieren", "1371555192": "Wählen Sie Ihre bevorzugte Zahlungsstelle und geben Sie Ihren Auszahlungsbetrag ein. Wenn Ihr Zahlungsagent nicht aufgeführt ist, <0>suchen Sie anhand seiner Kontonummer nach ihm.", @@ -1319,6 +1342,7 @@ "1434767075": "Starten Sie mit Deriv Bot", "1434976996": "Ankündigung", "1435363248": "Dieser Block konvertiert die Anzahl der Sekunden seit der Unix-Epoche in ein Datums- und Uhrzeitformat wie 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Mindesteinzahlung", "1437396005": "Kommentar hinzufügen", "1438247001": "Ein professioneller Kunde erhält aus folgenden Gründen ein geringeres Maß an Kundenschutz.", @@ -1369,6 +1393,7 @@ "1476301886": "Ähnlich wie bei SMA erhalten Sie in diesem Block die gesamte SMA-Zeile, die eine Liste aller Werte für einen bestimmten Zeitraum enthält.", "1478030986": "API-Token für Handel und Auszahlungen erstellen oder löschen", "1480915523": "Überspringen", + "1481860194": "Your new Wallet(s)", "1481977420": "Bitte helfen Sie uns, Ihre Auszahlungsanfrage zu überprüfen.", "1483470662": "Klicken Sie auf „Öffnen“, um mit dem Handel mit Ihrem Konto zu beginnen", "1484336612": "Dieser Block wird verwendet, um eine Schleife zu beenden oder fortzusetzen, und kann an einer beliebigen Stelle innerhalb eines Loop-Blocks platziert werden.", @@ -1389,6 +1414,7 @@ "1505420815": "Für Ihre Suche wurden keine Zahlungsagenten gefunden", "1505898522": "Stapel herunterladen", "1505927599": "Unsere Server sind auf eine Unebenheit gestoßen. Lassen Sie uns eine Erfrischung machen, um weiterzumachen.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Kaufen)", "1509678193": "Bildung", @@ -1419,7 +1445,7 @@ "1542742708": "Kunststoffe, Devisen, Aktien, Aktienindizes, Rohstoffe und Kryptowährungen", "1544642951": "Wenn Sie „Nur Ups“ wählen, gewinnen Sie die Auszahlung, wenn aufeinanderfolgende Ticks nach dem Startpunkt nacheinander steigen. Keine Auszahlung, wenn ein Tick fällt oder einem der vorherigen Ticks entspricht.", "1547148381": "Diese Datei ist zu groß (nur bis zu 8 MB erlaubt). Bitte laden Sie eine weitere Datei hoch.", - "1548765374": "Überprüfung der Dokumentennummer ist fehlgeschlagen", + "1548765374": "Überprüfung der Dokumentennummer fehlgeschlagen", "1549098835": "Insgesamt zurückgezogen", "1551172020": "AUD Korb", "1552162519": "Onboarding ansehen", @@ -1449,6 +1475,7 @@ "1577480486": "Ihr mobiler Link läuft in einer Stunde ab", "1577527507": "Der Grund für die Kontoeröffnung ist erforderlich.", "1577612026": "Wählen Sie einen Ordner", + "1577879664": "<0>Your Wallets are ready", "1579839386": "Appstore", "1580498808": "Mehrere Gesichter gefunden", "1584109614": "Ticks Zeichenkettenliste", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Der Bot ist beim Ausführen auf einen Fehler gestoßen.", "1648938920": "Niederlande 25", "1649239667": "2. Unter dem Menü Blöckesiehst du eine Liste von Kategorien. Blöcke sind innerhalb dieser Kategorien gruppiert. Wählen Sie den gewünschten Block aus und ziehen Sie ihn in den Arbeitsbereich.", + "1650963565": "Introducing Wallets", "1651513020": "Restzeit für jedes Intervall anzeigen", "1651951220": "Wiederholungen wie „abcabcabc“ sind nur geringfügig schwieriger zu erraten als „abc“", "1652366857": "holen und entfernen", @@ -1522,13 +1551,13 @@ "1665272539": "Denken Sie daran: Sie können sich bis zum ausgewählten Datum nicht in Ihr Konto einloggen.", "1665738338": "Saldo", "1665756261": "Gehe zum Live-Chat", + "1666783057": "Upgrade now", "1668138872": "Kontoeinstellungen ändern", "1670016002": "Multiplikator: {{ multiplier }}", "1670426231": "Endzeit", "1671232191": "Sie haben die folgenden Grenzwerte festgelegt:", "1674163852": "Sie können den Ablauf Ihres Vertrags bestimmen, indem Sie die Dauer oder die Endzeit festlegen.", "1675030608": "Um dieses Konto zu erstellen, müssen Sie zuerst Ihren Adressnachweis erneut einreichen.", - "1675289747": "Auf echtes Konto umgestellt", "1676549796": "Dynamische Hebelwirkung", "1677027187": "Devisenmarkt", "1677990284": "Meine Apps", @@ -1556,6 +1585,7 @@ "1703091957": "Wir erheben Informationen über Ihre Anstellung im Rahmen unserer Sorgfaltspflichten, wie es die Gesetze zur Bekämpfung der Geldwäsche vorschreiben.", "1704656659": "Wie viel Erfahrung haben Sie im CFD-Handel?", "1708413635": "Für dein {{currency_name}} ({{currency}}) -Konto", + "1709293836": "Wallet balance", "1709401095": "Handeln Sie CFDs auf Deriv X mit den Finanzmärkten und unseren abgeleiteten Indizes.", "1709859601": "Spot-Time verlassen", "1710662619": "Wenn Sie die App haben, starten Sie sie, um mit dem Handel zu beginnen.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Für Überweisungen zwischen Ihren Deriv-Fiat- und Deriv-Kryptowährungskonten erheben wir eine Überweisungsgebühr von 2% oder {{minimum_fee}} {{currency}}, je nachdem, welcher Betrag höher ist.", "1720968545": "Laden Sie die Passbildseite von Ihrem Computer hoch", + "1723069433": "Your new Wallet", "1723589564": "Stellt die maximale Anzahl ausstehender Verträge in Ihrem Portfolio dar. Jede Zeile in Ihrem Portfolio zählt für eine offene Position. Sobald das Maximum erreicht ist, können Sie keine neuen Positionen eröffnen, ohne zuerst eine bestehende Position zu schließen.", "1724696797": "Sie sind auf nur ein Fiat-Konto beschränkt.", "1725958461": "Kontonummer", @@ -1698,6 +1729,7 @@ "1842266423": "zurück", "1842862156": "Willkommen in Ihrem Deriv X-Dashboard", "1843658716": "Wenn du „Nur Downs“ auswählst, gewinnst du die Auszahlung, wenn aufeinanderfolgende Ticks nacheinander nach dem Startpunkt fallen. Keine Auszahlung, wenn ein Tick steigt oder einem der vorherigen Ticks entspricht.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min: {{min_stake}} - maximal: {{max_payout}})", "1846266243": "Diese Funktion ist für Demo-Konten nicht verfügbar.", "1846587187": "Sie haben Ihr Wohnsitzland nicht ausgewählt", @@ -1792,7 +1824,6 @@ "1924765698": "Geburtsort*", "1926987784": "- iOS: Wischen Sie auf dem Konto nach links und tippen Sie auf <0>Löschen.", "1928930389": "GBP/NOK", - "1929309951": "Beschäftigungsstatus", "1929694162": "Konten vergleichen", "1930899934": "Leine", "1931659123": "Lauf bei jeder Zecke", @@ -1807,6 +1838,7 @@ "1943440862": "Berechnet die Bollinger Bands (BB) -Liste aus einer Liste mit einem Punkt", "1944204227": "Dieser Block gibt den aktuellen Kontostand zurück.", "1947527527": "1. Dieser Link wurde von Ihnen gesendet", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Hier sind die möglichen Gründe:", "1950413928": "Ausweisdokumente einreichen", @@ -1875,6 +1907,7 @@ "2014536501": "Nummer der Karte", "2014590669": "Die Variable '{{variable_name}}' hat keinen Wert. Bitte geben Sie einen Wert für die Variable '{{variable_name}}' ein, um eine Benachrichtigung zu erhalten.", "2017672013": "Bitte wählen Sie das Land aus, in dem das Dokument ausgestellt wurde.", + "2020104747": "Filter", "2020545256": "Dein Konto schließen?", "2021037737": "Bitte aktualisieren Sie Ihre Daten, um fortzufahren.", "2021161151": "Sehen Sie sich dieses Video an, um zu erfahren, wie Sie einen Trading Bot auf Deriv Bot erstellen. Lesen Sie auch diesen Blog-Beitrag über die Erstellung eines Trading-Bots.", @@ -1885,7 +1918,6 @@ "2027696535": "Steuerliche Informationen", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI ist ein technisches Analysetool, mit dem Sie den Markttrend identifizieren können. Sie erhalten einen Wert von 0 bis 100. Ein RSI-Wert von 70 und höher bedeutet, dass der Vermögenswert überkauft ist und sich der aktuelle Trend umkehren kann, während ein Wert von 30 und darunter bedeutet, dass der Vermögenswert überverkauft ist.", "2030045667": "Nachricht", "2033648953": "Dieser Block gibt Ihnen den angegebenen Kerzenwert für ein ausgewähltes Zeitintervall.", @@ -1919,6 +1951,7 @@ "2063812316": "Erklärung in Textform", "2063890788": "Abgesagt", "2065278286": "Verteilen", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Führerschein", "2070002739": "Akzeptiere nicht", "2070345146": "Bei der Eröffnung eines gehebelten CFD-Handels.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Einreichung einer Beschwerde", "2080553498": "3. Holen Sie sich die Chat-ID mithilfe der Telegram-REST-API (lesen Sie mehr: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Verkauft für: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Ja, löschen", "2084693624": "Konvertiert eine Zeichenfolge, die eine Datums-/Uhrzeit-Zeichenfolge darstellt, in Sekunden seit Epoche. Beispiel: 2019-01-01 21:03:45 GMT+0800 wird in 1546347825 umgewandelt. Zeit- und Zeitzonenversatz sind optional.", "2085387371": "Muss aus Zahlen, Buchstaben und Sonderzeichen bestehen., '-", @@ -1966,7 +2000,6 @@ "2115223095": "Verlust", "2117165122": "1. Erstelle einen Telegramm-Bot und erhalte dein Telegram-API-Token. Lesen Sie hier mehr darüber, wie Sie Bots in Telegram erstellen: https://core.telegram.org/bots#6-botfather", "2117489390": "Automatisches Update in {{ remaining }} Sekunden", - "2118315870": "Wo wohnst du?", "2119449126": "Die Beispielausgabe des folgenden Beispiels wird wie folgt aussehen:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Profi-Tipp: Sie können den gewünschten Block auch anklicken und herausziehen", "2146892766": "Erfahrung im Handel mit binären Optionen", "2147244655": "Wie importiere ich meinen eigenen Handelsbot in Deriv Bot?", - "-1232613003": "Die <0>Überprüfung ist fehlgeschlagen. <1>Warum?", - "-2029508615": "<0>Bestätigung erforderlich. <1>Jetzt verifizieren", "-931052769": "Überprüfung einreichen", "-1004605898": "Tipps", "-1938142055": "Hochgeladene Dokumente", @@ -2141,18 +2172,9 @@ "-179726573": "Wir haben Ihren Eigentumsnachweis erhalten.", "-813779897": "Die Überprüfung des Eigentumsnachweises wurde bestanden.", "-638756912": "Schwärzen Sie die Ziffern 7 bis 12 der Kartennummer auf der Vorderseite Ihrer Debit-/Kreditkarte aus.", - "-2073934245": "Die auf dieser Website angebotenen Finanzhandelsdienstleistungen sind nur für Kunden geeignet, die die Möglichkeit akzeptieren, das gesamte von ihnen investierte Geld zu verlieren, und die das mit dem Kauf von Finanzkontrakten verbundene Risiko verstehen und Erfahrung damit haben. Transaktionen in Finanzkontrakten sind mit einem hohen Risiko verbunden. Wenn die von Ihnen gekauften Verträge als wertlos ablaufen, verlieren Sie Ihre gesamte Investition, einschließlich der Vertragsprämie.", - "-1166068675": "Ihr Konto wird mit {{legal_entity_name}}eröffnet, wird von der UK Gaming Commission (UKGC) reguliert und unterliegt den Gesetzen der Isle of Man.", - "-975118358": "Ihr Konto wird bei {{legal_entity_name}} eröffnet, das von der Malta Financial Services Authority (MFSA) reguliert wird und den Gesetzen Maltas unterliegt.", - "-680528873": "Ihr Konto wird mit {{legal_entity_name}} eröffnet und unterliegt den Gesetzen von Samoa.", - "-1125193491": "Konto hinzufügen", - "-2068229627": "Ich bin kein PEP und ich war in den letzten 12 Monaten kein PEP.", "-684271315": "OK", "-740157281": "Bewertung der Handelserfahrung", "-1720468017": "Um Ihnen unsere Dienstleistungen anbieten zu können, müssen wir Informationen von Ihnen einholen, um beurteilen zu können, ob ein bestimmtes Produkt oder eine bestimmte Dienstleistung für Sie geeignet ist.", - "-186841084": "Ändere deine Login-E-Mail", - "-907403572": "Um Ihre E-Mail-Adresse zu ändern, müssen Sie zunächst die Verknüpfung Ihrer E-Mail-Adresse mit Ihrem {{identifier_title}}-Konto aufheben.", - "-1850792730": "Unlink von {{identifier_title}}", "-307865807": "Warnung zur Risikotoleranz", "-690100729": "Ja, ich verstehe das Risiko.", "-2010628430": "CFDs und andere Finanzinstrumente bergen aufgrund der Hebelwirkung ein hohes Risiko, schnell Geld zu verlieren. Sie sollten sich überlegen, ob Sie verstehen, wie CFDs und andere Finanzinstrumente funktionieren, und ob Sie es sich leisten können, das hohe Risiko einzugehen, Ihr Geld zu verlieren.<0/><0/> Um fortzufahren, müssen Sie bestätigen, dass Sie verstehen, dass Ihr Kapital gefährdet ist.", @@ -2206,11 +2228,6 @@ "-1725454783": "Gescheitert", "-506510414": "Datum und Uhrzeit", "-1708927037": "IP-Adresse", - "-619126443": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}} und {{platform_name_trader}}anzumelden.", - "-623760979": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}}, {{platform_name_trader}} und {{platform_name_go}}anzumelden.", - "-459147994": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} und {{platform_name_ctrader}}anzumelden.", - "-80717068": "Apps, die Sie mit Ihrem <0>Deriv-Passwort verknüpft haben:", - "-9570380": "Verwenden Sie das {{platform_name_dxtrade}}-Passwort, um sich bei Ihren {{platform_name_dxtrade}}-Konten im Web und in den mobilen Apps anzumelden.", "-2131200819": "Deaktivieren", "-200487676": "Aktiviere", "-1840392236": "Das ist nicht der richtige Code. Bitte versuchen Sie es erneut.", @@ -2240,44 +2257,37 @@ "-378415317": "Staat ist erforderlich", "-1497654315": "Unsere Konten und Dienste sind für die Postleitzahl von Jersey nicht verfügbar.", "-755626951": "Vervollständigen Sie Ihre Adressdaten", - "-584911871": "Wählen Sie die Wallet-Währung", "-1461267236": "Bitte wählen Sie Ihre Währung", - "-1352330125": "WÄHRUNG", "-1027595143": "Weniger als 25.000$", "-40491332": "25.000$ bis 50.000$", "-1139806939": "$50.001 - $100.000", - "-626752657": "0-1 Jahr", - "-532014689": "1—2 Jahre", - "-1001024004": "Über 3 Jahre", - "-790513277": "6-10 Transaktionen in den letzten 12 Monaten", - "-580085300": "11-39 Transaktionen in den letzten 12 Monaten", - "-654781670": "Primär", - "-1717373258": "Sekundär", "-996132458": "Konstruktion", "-915003867": "Gesundheit", "-1430012453": "Informations- und Kommunikationstechnologie", "-987824916": "Wissenschaft und Technik", "-146630682": "Sozial und Kulturell", "-761306973": "Herstellung", - "-739367071": "Angestellt", - "-1156937070": "500,001$ — 1.000.000$", - "-315534569": "Über 1.000.000$", - "-2068544539": "Festangestellter Mitarbeiter", - "-531314998": "Investitionen und Dividenden", - "-1235114522": "Altersvorsorge", - "-1298056749": "Staatliche Leistungen", - "-449943381": "Ersparnisse und Erbschaft", "-1631552645": "Berufstätige", "-474864470": "Personal Care-, Vertriebs- und Servicemitarbeiter", "-1129355784": "Arbeiter in der Land-, Forst- und Fischereiwirtschaft", "-1242914994": "Handwerks-, Metall-, Elektro- und Elektronikarbeiter", "-1317824715": "Reinigungskräfte und Helfer", "-1592729751": "Bergbau-, Bau-, Produktions- und Transportarbeiter", + "-1030759620": "Regierungsbeamte", "-2137323480": "Eigentum des Unternehmens", "-1590574533": "Scheidungsvereinbarung", "-1667683002": "Erbschaft", "-1237843731": "Erträge aus Kapitalanlagen", "-777506574": "Verkauf von Immobilien", + "-654781670": "Primär", + "-1717373258": "Sekundär", + "-1156937070": "500,001$ — 1.000.000$", + "-315534569": "Über 1.000.000$", + "-2068544539": "Festangestellter Mitarbeiter", + "-531314998": "Investitionen und Dividenden", + "-1235114522": "Altersvorsorge", + "-1298056749": "Staatliche Leistungen", + "-449943381": "Ersparnisse und Erbschaft", "-1161338910": "Vorname ist erforderlich.", "-1161818065": "Der Nachname sollte zwischen 2 und 50 Zeichen lang sein.", "-1281693513": "Geburtsdatum ist erforderlich.", @@ -2287,28 +2297,14 @@ "-212167954": "Die Steueridentifikationsnummer ist nicht richtig formatiert.", "-621555159": "Informationen zur Identität", "-204765990": "Nutzungsbedingungen", - "-231863107": "Nein", - "-870902742": "Wie viel Wissen und Erfahrung haben Sie in Bezug auf den Online-Handel?", - "-1929477717": "Ich habe einen akademischen Abschluss, eine Berufszertifizierung und/oder Berufserfahrung im Bereich Finanzdienstleistungen.", - "-1540148863": "Ich habe Seminare, Schulungen und/oder Workshops zum Thema Handel besucht.", - "-922751756": "Weniger als ein Jahr", - "-542986255": "Keine", - "-1337206552": "Nach Ihrem Verständnis ermöglicht Ihnen der CFD-Handel:", - "-456863190": "Platzieren Sie eine Position in der Preisbewegung eines Vermögenswerts, bei der das Ergebnis eine feste Rendite oder gar nichts ist.", - "-1314683258": "Tätigen Sie eine langfristige Investition mit einem garantierten Gewinn.", - "-1546090184": "Wie wirkt sich die Hebelwirkung auf den CFD-Handel aus?", - "-1636427115": "Hebelwirkung hilft, Risiken zu mindern.", - "-800221491": "Leverage garantiert Gewinne.", - "-811839563": "Mit der Hebelwirkung können Sie große Positionen für einen Bruchteil des Handelswerts eröffnen, was zu einem höheren Gewinn oder Verlust führen kann.", - "-1185193552": "Schließen Sie Ihren Handel automatisch, wenn der Verlust einem bestimmten Betrag entspricht oder diesen übersteigt, sofern eine ausreichende Marktliquidität vorhanden ist.", - "-1046354": "Schließen Sie Ihren Handel automatisch, wenn der Gewinn einem bestimmten Betrag entspricht oder diesen übersteigt, sofern eine ausreichende Marktliquidität vorhanden ist.", - "-1842858448": "Erzielen Sie mit Ihrem Handel einen garantierten Gewinn.", - "-860053164": "Beim Handel mit Multiplikatoren.", - "-1250327770": "Beim Kauf von Aktien eines Unternehmens.", - "-1222388581": "All das oben Genannte.", "-477761028": "Wählerausweis", "-1466346630": "CPF", - "-1030759620": "Regierungsbeamte", + "-739367071": "Angestellt", + "-626752657": "0-1 Jahr", + "-532014689": "1—2 Jahre", + "-1001024004": "Über 3 Jahre", + "-790513277": "6-10 Transaktionen in den letzten 12 Monaten", + "-580085300": "11-39 Transaktionen in den letzten 12 Monaten", "-612752984": "Dies sind Standardlimits, die wir für Ihre Konten anwenden.", "-1598263601": "Um mehr über Handelslimits und deren Anwendung zu erfahren, besuchen Sie bitte das <0>Hilfecenter.", "-1411635770": "Erfahren Sie mehr über Kontolimits", @@ -2326,10 +2322,7 @@ "-1500958859": "verifizieren", "-1502578110": "Ihr Konto ist vollständig authentifiziert und Ihre Auszahlungslimits wurden aufgehoben.", "-1662154767": "eine aktuelle Stromrechnung (z. B. Strom, Wasser, Gas, Festnetz oder Internet), ein Kontoauszug oder ein von der Regierung ausgestelltes Schreiben mit Ihrem Namen und dieser Adresse.", - "-190838815": "Wir benötigen das zur Überprüfung. Wenn die von Ihnen angegebenen Informationen falsch oder ungenau sind, können Sie keine Ein- und Auszahlungen vornehmen.", - "-223216785": "Zweite Adresszeile*", "-594456225": "Zweite Adresszeile", - "-1940457555": "Post-/PLZ*", "-1964954030": "Post-/PLZ", "-516397235": "Sei vorsichtig, mit wem du dieses Token teilst. Jeder mit diesem Token kann die folgenden Aktionen in Ihrem Konto ausführen", "-989216986": "Konten hinzufügen", @@ -2371,8 +2364,6 @@ "-1100235269": "Branche der Beschäftigung", "-684388823": "Geschätztes Nettovermögen", "-509054266": "Erwarteter Jahresumsatz", - "-601903492": "Erfahrung im Forex-Handel", - "-1012699451": "Erfahrung im CFD-Handel", "-1588485629": "Beispiel", "-1117345066": "Wählen Sie den Dokumenttyp", "-651192353": "Beispiel:", @@ -2395,10 +2386,10 @@ "-329713179": "Okay", "-1176889260": "Bitte wählen Sie einen Dokumenttyp aus.", "-1926456107": "Die von Ihnen angegebene ID ist abgelaufen.", - "-555047589": "Es sieht so aus, als ob Ihr Ausweis abgelaufen ist. Bitte versuchen Sie es erneut mit einem gültigen Dokument.", - "-841187054": "Versuchen Sie es erneut", + "-555047589": "Es sieht so aus, als ob Ihr Ausweisdokument abgelaufen ist. Bitte versuchen Sie es erneut mit einem gültigen Dokument.", + "-841187054": "Erneut versuchen", "-2097808873": "Wir konnten Ihre ID mit den von Ihnen angegebenen Daten nicht überprüfen. ", - "-228284848": "Wir konnten Ihre ID mit den von Ihnen angegebenen Daten nicht überprüfen.", + "-228284848": "Wir waren nicht in der Lage, Ihre ID anhand der von Ihnen angegebenen Daten zu überprüfen.", "-1391934478": "Ihre ID ist verifiziert. Sie müssen auch einen Adressnachweis vorlegen.", "-118547687": "Ausweisüberprüfung bestanden", "-200989771": "Gehe zu den persönlichen Daten", @@ -2464,12 +2455,40 @@ "-142444667": "Bitte klicken Sie auf den Link in der E-Mail, um Ihr Deriv MT5-Passwort zu ändern.", "-742748008": "Überprüfe deine E-Mail und klicke auf den Link in der E-Mail, um fortzufahren.", "-84068414": "Hast du die E-Mail immer noch nicht bekommen? Bitte kontaktieren Sie uns per <0>Live-Chat.", + "-975118358": "Ihr Konto wird bei {{legal_entity_name}} eröffnet, das von der Malta Financial Services Authority (MFSA) reguliert wird und den Gesetzen Maltas unterliegt.", + "-2073934245": "Die auf dieser Website angebotenen Finanzhandelsdienstleistungen sind nur für Kunden geeignet, die die Möglichkeit akzeptieren, das gesamte von ihnen investierte Geld zu verlieren, und die das mit dem Kauf von Finanzkontrakten verbundene Risiko verstehen und Erfahrung damit haben. Transaktionen in Finanzkontrakten sind mit einem hohen Risiko verbunden. Wenn die von Ihnen gekauften Verträge als wertlos ablaufen, verlieren Sie Ihre gesamte Investition, einschließlich der Vertragsprämie.", + "-1125193491": "Konto hinzufügen", + "-2068229627": "Ich bin kein PEP und ich war in den letzten 12 Monaten kein PEP.", + "-186841084": "Ändere deine Login-E-Mail", + "-907403572": "Um Ihre E-Mail-Adresse zu ändern, müssen Sie zunächst die Verknüpfung Ihrer E-Mail-Adresse mit Ihrem {{identifier_title}}-Konto aufheben.", + "-1850792730": "Unlink von {{identifier_title}}", "-428335668": "Sie müssen ein Passwort festlegen, um den Vorgang abzuschließen.", + "-1232613003": "Die <0>Überprüfung ist fehlgeschlagen. <1>Warum?", + "-2029508615": "<0>Bestätigung erforderlich. <1>Jetzt verifizieren", "-818898181": "Der Name im Dokument stimmt nicht mit Ihrem Deriv-Profil überein.", "-310316375": "Die Adresse im Dokument stimmt nicht mit der Adresse überein, die Sie oben eingegeben haben.", "-485368404": "Das Dokument wurde vor mehr als 6 Monaten ausgestellt.", "-367016488": "Unscharfes Dokument. Alle Informationen müssen klar und deutlich sichtbar sein.", "-1957076143": "Beschnittenes Dokument. Alle Informationen müssen klar und deutlich sichtbar sein.", + "-231863107": "Nein", + "-870902742": "Wie viel Wissen und Erfahrung haben Sie in Bezug auf den Online-Handel?", + "-1929477717": "Ich habe einen akademischen Abschluss, eine Berufszertifizierung und/oder Berufserfahrung im Bereich Finanzdienstleistungen.", + "-1540148863": "Ich habe Seminare, Schulungen und/oder Workshops zum Thema Handel besucht.", + "-922751756": "Weniger als ein Jahr", + "-542986255": "Keine", + "-1337206552": "Nach Ihrem Verständnis ermöglicht Ihnen der CFD-Handel:", + "-456863190": "Platzieren Sie eine Position in der Preisbewegung eines Vermögenswerts, bei der das Ergebnis eine feste Rendite oder gar nichts ist.", + "-1314683258": "Tätigen Sie eine langfristige Investition mit einem garantierten Gewinn.", + "-1546090184": "Wie wirkt sich die Hebelwirkung auf den CFD-Handel aus?", + "-1636427115": "Hebelwirkung hilft, Risiken zu mindern.", + "-800221491": "Leverage garantiert Gewinne.", + "-811839563": "Mit der Hebelwirkung können Sie große Positionen für einen Bruchteil des Handelswerts eröffnen, was zu einem höheren Gewinn oder Verlust führen kann.", + "-1185193552": "Schließen Sie Ihren Handel automatisch, wenn der Verlust einem bestimmten Betrag entspricht oder diesen übersteigt, sofern eine ausreichende Marktliquidität vorhanden ist.", + "-1046354": "Schließen Sie Ihren Handel automatisch, wenn der Gewinn einem bestimmten Betrag entspricht oder diesen übersteigt, sofern eine ausreichende Marktliquidität vorhanden ist.", + "-1842858448": "Erzielen Sie mit Ihrem Handel einen garantierten Gewinn.", + "-860053164": "Beim Handel mit Multiplikatoren.", + "-1250327770": "Beim Kauf von Aktien eines Unternehmens.", + "-1222388581": "All das oben Genannte.", "-1515286538": "Bitte geben Sie Ihre Dokumentennummer ein. ", "-1694758788": "Geben Sie Ihre Dokumentennummer ein", "-1458676679": "Sie sollten 2-50 Zeichen eingeben.", @@ -2479,6 +2498,8 @@ "-1437017790": "Finanzielle Informationen", "-70342544": "Wir sind gesetzlich verpflichtet, Sie nach Ihren Finanzinformationen zu fragen.", "-39038029": "Handelserfahrung", + "-601903492": "Erfahrung im Forex-Handel", + "-1012699451": "Erfahrung im CFD-Handel", "-1894668798": "Erfahrung mit anderen Handelsinstrumenten", "-1026468600": "Häufigkeit anderer Handelsinstrumente", "-1743024217": "Sprache wählen", @@ -2489,6 +2510,11 @@ "-536187647": "Zugriff bestätigen?", "-1357606534": "Erlaubnis", "-570222048": "Zugriff entziehen", + "-80717068": "Apps, die Sie mit Ihrem <0>Deriv-Passwort verknüpft haben:", + "-340060402": "Ihr Deriv X-Passwort dient zum Einloggen in Ihre Deriv X-Konten im Web und in den mobilen Apps.", + "-619126443": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}} und {{platform_name_trader}}anzumelden.", + "-623760979": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}}, {{platform_name_trader}} und {{platform_name_go}}anzumelden.", + "-459147994": "Verwenden Sie das <0>Deriv-Passwort, um sich bei {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} und {{platform_name_ctrader}}anzumelden.", "-1526404112": "Rechnung eines Versorgungsunternehmens: Strom-, Wasser-, Gas- oder Festnetztelefonrechnung.", "-537552700": "Wohnungsmietvertrag: gültiger und aktueller Vertrag.", "-890084320": "Speichern und abschicken", @@ -2510,11 +2536,20 @@ "-362324454": "Rohstoffe", "-1071336803": "Plattform", "-820028470": "Options & Multipliers", - "-1255879419": "Trader's Hub", + "-1186807402": "Übertragung", + "-224804428": "Transaktionen", + "-470018967": "Saldo zurücksetzen", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Zurücksetzen", "-213142918": "Ein- und Auszahlungen sind vorübergehend nicht verfügbar ", - "-224804428": "Transaktionen", - "-1186807402": "Übertragung", "-1308346982": "Abgeleitet", "-1145604233": "Handeln Sie CFDs auf MT5 mit abgeleiteten Indizes, die reale Marktbewegungen simulieren.", "-328128497": "Finanziell", @@ -2525,15 +2560,29 @@ "-81256466": "Sie benötigen ein Deriv-Konto, um ein CFD-Konto zu erstellen.", "-699372497": "Traden Sie mit Hebelwirkung und engen Spreads, um bei erfolgreichen Trades bessere Renditen zu erzielen. <0>Erfahren Sie mehr", "-1884966862": "Holen Sie sich mehr Deriv MT5-Konten mit unterschiedlichem Typ und unterschiedlicher Gerichtsbarkeit.", - "-145462920": "Deriv cTrader", "-982095728": "Holen", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Gesetzlicher Haftungsausschluss der EU: CFDs sind komplexe Instrumente und bergen aufgrund der Hebelwirkung ein hohes Risiko, schnell Geld zu verlieren. <0>73% der Konten von Privatanlegern verlieren Geld, wenn sie mit CFDs bei diesem Anbieter handeln. Sie sollten sich überlegen, ob Sie verstehen, wie CFDs funktionieren, und ob Sie es sich leisten können, das hohe Risiko einzugehen, Ihr Geld zu verlieren.", "-1277942366": "Aktiva insgesamt", + "-1255879419": "Trader's Hub", "-493788773": "Nicht-EU", "-673837884": "EU", "-230566990": "Die folgenden Dokumente, die Sie eingereicht haben, haben unsere Prüfungen nicht bestanden:", "-846812148": "Adressnachweis.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Regulierung außerhalb der EU", "-643108528": "Nicht-EU- und EU-Vorschriften", + "-979459594": "Buy/Sell", + "-494667560": "Bestellungen", + "-679691613": "Meine Anzeigen", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Multiplikatorkonto", "-744999940": "Konto ableiten", @@ -2543,9 +2592,20 @@ "-318106501": "Handeln Sie CFDs auf MT5 mit synthetischen Produkten, Körben und abgeleiteten Devisen.", "-1328701106": "Handeln Sie CFDs auf MT5 mit Devisen, Aktien, Aktienindizes, Kunststoffen, Kryptowährungen und Rohstoffen.", "-1173266642": "Dieses Konto bietet CFDs auf einer funktionsreichen Handelsplattform.", - "-1290112064": "Deriv EZ", "-1453519913": "Handeln Sie CFDs auf einer einfach zu bedienenden Plattform mit all Ihren Lieblingswerten.", "-2051096382": "Verdienen Sie eine Reihe von Auszahlungen, indem Sie mit <0>Optionen Marktbewegungen richtig vorhersagen, oder nutzen Sie die Vorteile von CFDs, ohne mehr als Ihren ursprünglichen Einsatz zu riskieren, mit <1>Multiplikatoren.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Wahl der Verordnung", "-249184528": "Sie können echte Konten gemäß EU- oder Nicht-EU-Vorschriften erstellen. Klicken Sie auf das <0><0/>Symbol, um mehr über diese Konten zu erfahren.", "-1505234170": "Trader's Hub-Tour", @@ -2556,7 +2616,21 @@ "-951876657": "Laden Sie Ihr Konto auf", "-1945421757": "Sobald Sie ein Konto haben, klicken Sie auf „Einzahlung“ oder „Überweisung“, um Geld auf ein Konto einzuzahlen", "-1965920446": "Starten Sie den Handel", - "-33612390": "<0>Gesetzlicher Haftungsausschluss der EU: CFDs sind komplexe Instrumente und bergen aufgrund der Hebelwirkung ein hohes Risiko, schnell Geld zu verlieren. <0>73% der Konten von Privatanlegern verlieren Geld, wenn sie mit CFDs bei diesem Anbieter handeln. Sie sollten sich überlegen, ob Sie verstehen, wie CFDs funktionieren, und ob Sie es sich leisten können, das hohe Risiko einzugehen, Ihr Geld zu verlieren.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Dieses Feld ist erforderlich.", "-1870909526": "Unser Server kann keine Adresse abrufen.", "-582721696": "Der aktuell zulässige Abhebungsbetrag ist {{format_min_withdraw_amount}} bis {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Deine {{currency_symbol}} Wallet-Adresse", "-38063175": "{{account_text}} Brieftasche", "-705272444": "Laden Sie einen Identitätsnachweis hoch, um Ihre Identität zu überprüfen", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Dies dient dazu, Ihr Konto vor unbefugten Abhebungen zu schützen.", "-130833284": "Bitte beachten Sie, dass Ihre maximalen und minimalen Auszahlungslimits nicht festgelegt sind. Sie ändern sich aufgrund der hohen Volatilität der Kryptowährung.", "-1531269493": "Wir senden Ihnen eine E-Mail, sobald Ihre Transaktion bearbeitet wurde.", @@ -2859,6 +2934,30 @@ "-1016171176": "Vermögenswert", "-621128676": "Handelsart", "-447853970": "Verlustschwelle", + "-155173714": "Lass uns einen Bot bauen!", + "-1919212468": "3. Sie können auch über die Suchleiste über den Kategorien nach den gewünschten Blöcken suchen.", + "-1520558271": "Weitere Informationen finden Sie in diesem Blogbeitrag über die Grundlagen des Aufbaus eines Trading-Bots.", + "-980360663": "3. Wählen Sie den gewünschten Block aus und ziehen Sie ihn in den Arbeitsbereich.", + "-1493168314": "Was ist eine schnelle Strategie?", + "-1680391945": "Mit einer schnellen Strategie", + "-1177914473": "Wie speichere ich meine Strategie?", + "-271986909": "In Bot Builderklicken Sie oben in der Werkzeugleiste auf Speichern , um Ihren Bot herunterzuladen. Geben Sie Ihrem Bot einen Namen und wählen Sie aus, ob Sie Ihren Bot auf Ihr Gerät oder Google Drive herunterladen möchten. Ihr Bot wird als XML-Datei heruntergeladen.", + "-1149045595": "1. Nachdem Sie auf Importieren geklickt haben, wählen Sie Lokal und klicken Sie auf Weiter.\n", + "-288041546": "2. Wählen Sie Ihre XML-Datei und klicken Sie auf Auswählen .", + "-2127548288": "3. Ihr Bot wird entsprechend geladen.", + "-1311297611": "1. Nachdem Sie auf Importieren geklickt haben, wählen Sie Google Drive aus und klicken Sie auf Weiter.", + "-1549564044": "Wie setze ich den Workspace zurück?", + "-1127331928": "Klicken Sie im Bot Builder oben in der Symbolleiste auf Zurücksetzen. Dadurch wird der Arbeitsbereich geleert. Bitte beachten Sie, dass alle nicht gespeicherten Änderungen verloren gehen.", + "-1720444288": "Wie kann ich meine Verluste mit Deriv Bot kontrollieren?", + "-1142295124": "Es gibt mehrere Möglichkeiten, Ihre Verluste mit Deriv Bot zu kontrollieren. Hier ein einfaches Beispiel dafür, wie Sie die Verlustkontrolle in Ihre Strategie integrieren können:", + "-986689483": "1. Erstellen Sie die folgenden Variablen:", + "-269910127": "3. Aktualisieren Sie den current profit/loss mit dem Gewinn aus dem letzten Vertrag. Wenn der letzte Kontrakt verloren ging, ist der Wert des current profit/loss Negativ.", + "-1565344891": "Kann ich Deriv Bot auf mehreren Registerkarten in meinem Webbrowser ausführen?", + "-90192474": "Ja, Sie können. Allerdings gibt es für Ihr Konto Beschränkungen, wie z. B. die maximale Anzahl offener Positionen und maximale Gesamtauszahlungen für offene Positionen. Beachten Sie also diese Limits, wenn Sie mehrere Positionen eröffnen. Weitere Informationen zu diesen Limits finden Sie unter Einstellungen > Kontolimits.\n", + "-213872712": "Nein, wir bieten keine Kryptowährungen auf Deriv Bot an.", + "-2147346223": "In welchen Ländern ist Deriv Bot verfügbar?", + "-352345777": "Was sind die beliebtesten Strategien für den automatisierten Handel?", + "-552392096": "Drei der am häufigsten verwendeten Strategien im automatisierten Handel sind Martingale, D'Alembert und Oscar's Grind - Sie finden sie alle fertig und warten auf Sie in Deriv Bot.", "-507620484": "Nicht gespeichert", "-764102808": "Google Drive", "-555886064": "Gewonnen", @@ -2937,30 +3036,6 @@ "-1823621139": "Schnelle Strategie", "-1778025545": "Sie haben erfolgreich einen Bot importiert.", "-1519425996": "Keine Ergebnisse gefunden \"{{ faq_search_value }}“", - "-155173714": "Lass uns einen Bot bauen!", - "-1919212468": "3. Sie können auch über die Suchleiste über den Kategorien nach den gewünschten Blöcken suchen.", - "-1520558271": "Weitere Informationen finden Sie in diesem Blogbeitrag über die Grundlagen des Aufbaus eines Trading-Bots.", - "-980360663": "3. Wählen Sie den gewünschten Block aus und ziehen Sie ihn in den Arbeitsbereich.", - "-1493168314": "Was ist eine schnelle Strategie?", - "-1680391945": "Mit einer schnellen Strategie", - "-1177914473": "Wie speichere ich meine Strategie?", - "-271986909": "In Bot Builderklicken Sie oben in der Werkzeugleiste auf Speichern , um Ihren Bot herunterzuladen. Geben Sie Ihrem Bot einen Namen und wählen Sie aus, ob Sie Ihren Bot auf Ihr Gerät oder Google Drive herunterladen möchten. Ihr Bot wird als XML-Datei heruntergeladen.", - "-1149045595": "1. Nachdem Sie auf Importieren geklickt haben, wählen Sie Lokal und klicken Sie auf Weiter.\n", - "-288041546": "2. Wählen Sie Ihre XML-Datei und klicken Sie auf Auswählen .", - "-2127548288": "3. Ihr Bot wird entsprechend geladen.", - "-1311297611": "1. Nachdem Sie auf Importieren geklickt haben, wählen Sie Google Drive aus und klicken Sie auf Weiter.", - "-1549564044": "Wie setze ich den Workspace zurück?", - "-1127331928": "Klicken Sie im Bot Builder oben in der Symbolleiste auf Zurücksetzen. Dadurch wird der Arbeitsbereich geleert. Bitte beachten Sie, dass alle nicht gespeicherten Änderungen verloren gehen.", - "-1720444288": "Wie kann ich meine Verluste mit Deriv Bot kontrollieren?", - "-1142295124": "Es gibt mehrere Möglichkeiten, Ihre Verluste mit Deriv Bot zu kontrollieren. Hier ein einfaches Beispiel dafür, wie Sie die Verlustkontrolle in Ihre Strategie integrieren können:", - "-986689483": "1. Erstellen Sie die folgenden Variablen:", - "-269910127": "3. Aktualisieren Sie den current profit/loss mit dem Gewinn aus dem letzten Vertrag. Wenn der letzte Kontrakt verloren ging, ist der Wert des current profit/loss Negativ.", - "-1565344891": "Kann ich Deriv Bot auf mehreren Registerkarten in meinem Webbrowser ausführen?", - "-90192474": "Ja, Sie können. Allerdings gibt es für Ihr Konto Beschränkungen, wie z. B. die maximale Anzahl offener Positionen und maximale Gesamtauszahlungen für offene Positionen. Beachten Sie also diese Limits, wenn Sie mehrere Positionen eröffnen. Weitere Informationen zu diesen Limits finden Sie unter Einstellungen > Kontolimits.\n", - "-213872712": "Nein, wir bieten keine Kryptowährungen auf Deriv Bot an.", - "-2147346223": "In welchen Ländern ist Deriv Bot verfügbar?", - "-352345777": "Was sind die beliebtesten Strategien für den automatisierten Handel?", - "-552392096": "Drei der am häufigsten verwendeten Strategien im automatisierten Handel sind Martingale, D'Alembert und Oscar's Grind - Sie finden sie alle fertig und warten auf Sie in Deriv Bot.", "-418247251": "Laden Sie Ihr Journal herunter.", "-2123571162": "Herunterladen", "-870004399": "<0>Gekauft: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Konto deaktiviert", "-1837059346": "Kaufen/Verkaufen", "-1845037007": "Seite des Werbetreibenden", - "-494667560": "Bestellungen", - "-679691613": "Meine Anzeigen", "-821418875": "Händler", "-679102561": "Einzelheiten des Vertrags", "-430118939": "Richtlinie für Beschwerden", @@ -3082,7 +3155,6 @@ "-430041639": "Ihr Adressnachweis hat unsere Überprüfungsprüfungen nicht bestanden und wir haben einige Einschränkungen für Ihr Konto vorgenommen. Bitte reichen Sie Ihren Adressnachweis erneut ein.", "-87177461": "Bitte gehen Sie zu Ihren Kontoeinstellungen und geben Sie Ihre persönlichen Daten ein, um Einzahlungen zu ermöglichen.", "-904632610": "Setze dein Guthaben zurück", - "-470018967": "Saldo zurücksetzen", "-156611181": "Bitte vervollständigen Sie die finanzielle Bewertung in Ihren Kontoeinstellungen, um es zu entsperren.", "-1925176811": "Auszahlungen können derzeit nicht bearbeitet werden", "-980696193": "Auszahlungen sind aufgrund von Systemwartungsarbeiten vorübergehend nicht verfügbar. Sie können Auszahlungen vornehmen, wenn die Wartung abgeschlossen ist.", @@ -3107,12 +3179,12 @@ "-577279362": "Bitte reichen Sie Ihren Identitätsnachweis ein, um Ihr Konto zu verifizieren und den Handel fortzusetzen.", "-197134911": "Ihr Identitätsnachweis ist abgelaufen", "-152823394": "Ihr Identitätsnachweis ist abgelaufen. Bitte reichen Sie einen neuen Identitätsnachweis ein, um Ihr Konto zu verifizieren und den Handel fortzusetzen.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Folgen Sie diesen einfachen Anweisungen, um das Problem zu beheben.", "-2142540205": "Es scheint, dass die Adresse in Ihrem Dokument nicht mit der Adresse in Ihrem Deriv-Profil übereinstimmt. Bitte aktualisieren Sie jetzt Ihre persönlichen Daten mit der richtigen Adresse.", "-482715448": "Gehe zu den persönlichen Daten", "-2072411961": "Ihr Adressnachweis wurde verifiziert", "-384887227": "Aktualisiere die Adresse in deinem Profil.", - "-448961363": "Nicht-EU", "-1998049070": "Wenn Sie der Verwendung von Cookies zustimmen, klicken Sie auf Akzeptieren. Weitere Informationen finden <0>Sie in unseren Richtlinien.", "-402093392": "Deriv-Konto hinzufügen", "-1721181859": "Sie benötigen ein {{deriv_account}} Konto", @@ -3125,7 +3197,6 @@ "-650505513": "Vollbild", "-1823504435": "Benachrichtigungen anzeigen", "-1954045170": "Keine Währung zugewiesen", - "-583559763": "Menu", "-1591792668": "Konto-Limits", "-34495732": "Regulatorische Informationen", "-1496158755": "Gehe zu Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "Die Finanzkommission akzeptiert Einsprüche innerhalb von 45 Tagen nach dem Datum des Vorfalls und erst, nachdem der Händler versucht hat, das Problem direkt mit dem Unternehmen zu lösen.", "-1825471709": "Ein völlig neues Handelserlebnis auf einer leistungsstarken und dennoch benutzerfreundlichen Plattform.", "-981017278": "Automatisierter Handel an Ihren Fingerspitzen. Keine Codierung erforderlich.", + "-583559763": "Menu", "-778309978": "Der Link, auf den Sie geklickt haben, ist abgelaufen. Stellen Sie sicher, dass Sie den Link in der neuesten E-Mail in Ihrem Posteingang anklicken. Alternativ können Sie Ihre E-Mail unten eingeben und auf <0>E-Mail senden klicken, um einen neuen Link zu erhalten.", "-336222114": "Folgen Sie diesen einfachen Schritten, um das Problem zu beheben:", "-1064116456": "Suchen Sie nach dem Broker <0>Deriv Holdings (Guernsey) Limited und wählen Sie ihn aus.", @@ -3415,22 +3487,6 @@ "-1282933308": "Nicht {{barrier}}", "-968190634": "Entspricht {{barrier}}", "-1747377543": "Unter {{barrier}}", - "-256210543": "Der Handel ist derzeit nicht verfügbar.", - "-1150099396": "Wir arbeiten daran, dies bald für Sie verfügbar zu haben. Wenn Sie ein anderes Konto haben, wechseln Sie zu diesem Konto, um den Handel fortzusetzen. Sie können einen Deriv MT5 Financial hinzufügen.", - "-28115241": "{{platform_name_trader}} ist für dieses Konto nicht verfügbar", - "-453920758": "Gehe zum Dashboard {{platform_name_mt5}}", - "-402175529": "Geschichte", - "-902712434": "Stornierung des Deals", - "-988484646": "Stornierung des Deals (ausgeführt)", - "-444882676": "Stornierung des Deals (aktiv)", - "-13423018": "Referenz-ID", - "-2035315547": "Niedrige Barriere", - "-1551639437": "Keine Geschichte", - "-1214703885": "Sie müssen noch entweder Take Profit oder Stop Loss aktualisieren", - "-504849554": "Es wird am wiedereröffnet", - "-59803288": "In der Zwischenzeit probieren Sie unsere synthetischen Indizes aus. Sie simulieren die reale Marktvolatilität und sind rund um die Uhr geöffnet.", - "-1278109940": "Offene Märkte ansehen", - "-694105443": "Dieser Markt ist geschlossen", "-1043795232": "Aktuelle Positionen", "-1511825574": "Gewinn/Verlust:", "-726626679": "Potenzieller Gewinn/Verlust:", @@ -3455,21 +3511,15 @@ "-1435392215": "Über die Stornierung des Deals", "-2017825013": "Ich hab's", "-1192773792": "Zeig das nicht noch einmal", + "-902712434": "Stornierung des Deals", "-1280319153": "Stornieren Sie Ihren Handel jederzeit innerhalb eines ausgewählten Zeitrahmens. Wird automatisch ausgelöst, wenn Ihr Trade innerhalb des gewählten Zeitrahmens das Stop-Out-Level erreicht.", "-471757681": "Risikomanagement", "-843831637": "Stoppen Sie den Verlust", "-771725194": "Stornierung des Deals", "-338707425": "Die Mindestdauer beträgt 1 Tag", "-1003473648": "Dauer: {{duration}} Tage", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Die Auszahlung bei Fälligkeit entspricht der Auszahlung pro Punkt multipliziert mit der Differenz zwischen dem Endpreis und dem Ausübungspreis.", "-1527492178": "Kauf gesperrt", "-725375562": "Sie können die Kaufschaltfläche im Einstellungsmenü sperren/entsperren", - "-774638412": "Die Einsätze müssen zwischen {{min_stake}} {{currency}} und {{max_stake}} {{currency}}liegen.", - "-1358367903": "Pfahl", - "-434270664": "Aktueller Preis", - "-1956787775": "Barrierepreis:", - "-1513281069": "Barriere 2", "-390994177": "Sollte zwischen {{min}} und {{max}}liegen", "-1804019534": "Verfalldatum: {{date}}", "-2055106024": "Zwischen erweiterten und einfachen Dauer-Einstellungen umschalten", @@ -3484,6 +3534,7 @@ "-1763848396": "Stellen", "-194424366": "über", "-857660728": "Basispreise", + "-1358367903": "Pfahl", "-1386326276": "Barriere ist ein Pflichtfeld.", "-1418742026": "Eine höhere Barriere muss höher sein als eine niedrigere Barriere.", "-92007689": "Die untere Barriere muss niedriger als die höhere Barriere sein.", @@ -3491,6 +3542,21 @@ "-1975910372": "Die Minute muss zwischen 0 und 59 liegen.", "-866277689": "Die Ablaufzeit kann nicht in der Vergangenheit liegen.", "-1455298001": "Jetzt", + "-256210543": "Der Handel ist derzeit nicht verfügbar.", + "-1150099396": "Wir arbeiten daran, dies bald für Sie verfügbar zu haben. Wenn Sie ein anderes Konto haben, wechseln Sie zu diesem Konto, um den Handel fortzusetzen. Sie können einen Deriv MT5 Financial hinzufügen.", + "-28115241": "{{platform_name_trader}} ist für dieses Konto nicht verfügbar", + "-453920758": "Gehe zum Dashboard {{platform_name_mt5}}", + "-402175529": "Geschichte", + "-988484646": "Stornierung des Deals (ausgeführt)", + "-444882676": "Stornierung des Deals (aktiv)", + "-13423018": "Referenz-ID", + "-2035315547": "Niedrige Barriere", + "-1551639437": "Keine Geschichte", + "-1214703885": "Sie müssen noch entweder Take Profit oder Stop Loss aktualisieren", + "-504849554": "Es wird am wiedereröffnet", + "-59803288": "In der Zwischenzeit probieren Sie unsere synthetischen Indizes aus. Sie simulieren die reale Marktvolatilität und sind rund um die Uhr geöffnet.", + "-1278109940": "Offene Märkte ansehen", + "-694105443": "Dieser Markt ist geschlossen", "-439389714": "Wir arbeiten daran", "-770929448": "Gehe zu {{platform_name_smarttrader}}", "-347156282": "Nachweis einreichen", @@ -3537,6 +3603,8 @@ "-454245976": "Wenn Sie glauben, dass der Marktpreis für einen bestimmten Zeitraum kontinuierlich fallen wird, wählen Sie <0>Short. Sie erhalten eine Auszahlung zum Verfallszeitpunkt, wenn der Marktpreis die Barriere nicht berührt oder überschreitet. Ihre Auszahlung wächst proportional zum Abstand zwischen dem Marktpreis und der Barriere, wenn die Barriere nicht durchbrochen wird. Sie machen einen Gewinn, wenn die Auszahlung höher ist als Ihr Einsatz. Wenn der Marktpreis die Barriere jemals überschreitet, gibt es keine Auszahlung.", "-351875097": "Anzahl der Zecken", "-729830082": "Weniger ansehen", + "-1669741470": "Die Auszahlung bei Fälligkeit entspricht der Auszahlung pro Punkt multipliziert mit der Differenz zwischen dem Endpreis und dem Ausübungspreis.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NEU!", "-993480898": "Akkumulatoren", "-45873457": "NEU", @@ -3557,6 +3625,10 @@ "-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.", "-438655760": "<0>Hinweis: Sie können Ihren Handel jederzeit schließen. Seien Sie sich des Slippage-Risikos bewusst.", + "-774638412": "Die Einsätze müssen zwischen {{min_stake}} {{currency}} und {{max_stake}} {{currency}}liegen.", + "-434270664": "Aktueller Preis", + "-1956787775": "Barrierepreis:", + "-1513281069": "Barriere 2", "-1683683754": "Lang", "-1046859144": "<0>{{title}} Sie erhalten eine Auszahlung, wenn der Marktpreis {{price_position}} bleibt und die Barriere nicht berührt oder überschreitet. Andernfalls ist Ihre Auszahlung gleich null.", "-1815023694": "über der Barriere", diff --git a/packages/translations/src/translations/es.json b/packages/translations/src/translations/es.json index 1bff0da6416a..542f4042e943 100644 --- a/packages/translations/src/translations/es.json +++ b/packages/translations/src/translations/es.json @@ -24,7 +24,6 @@ "27731356": "Su cuenta está desactivada temporalmente. Contáctenos a través del <0>live chat para volver a habilitar los depósitos y retiros.", "27830635": "Deriv (V) Ltd", "28581045": "Añadir una cuenta MT5 real", - "30801950": "Su cuenta se abrirá con {{legal_entity_name}}, regulada por la Autoridad de Juegos de Malta, y estará sujeta a las leyes de Malta.", "33433576": "Por favor, utilice una billetera electrónica para retirar sus fondos.", "35089987": "Suba el anverso y el reverso de su carné de conducir.", "41737927": "Gracias", @@ -60,11 +59,13 @@ "72500774": "Por favor complete la residencia fiscal.", "73086872": "Se ha autoexcluido del trading", "73326375": "El mínimo corresponde al menor punto alcanzado por el mercado durante el período del contrato.", + "74836780": "{{currency_code}} Wallet", "74963864": "Bajo", "76916358": "Ha alcanzado el límite de retiro. <0/> Suba su prueba de identidad y domicilio para levantar el límite y continuar con su retiro.", - "76925355": "Comprueba el rendimiento de tu bot", + "76925355": "Comprueba el rendimiento de su bot", "77945356": "Opere desde cualquier lugar con nuestra aplicación móvil.", "77982950": "Las opciones vanilla le permiten predecir una dirección ascendente (alcista) o descendente (bajista) del activo subyacente mediante la compra de un \"Call\" o un \"Put\".", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "No pudimos encontrar la página", "82839270": "Suba la página de su pasaporte que contiene la foto.", "83202647": "Bloque de colapso", @@ -76,6 +77,7 @@ "90266322": "2. Inicie una conversación con su recién creado bot de Telegram y asegúrese de enviarle algunos mensajes antes de continuar con el siguiente paso. (por ejemplo, ¡Hola Bot!)", "91993812": "La Estrategia Martingala es una técnica comercial clásica que se ha utilizado durante más de cien años, popularizada por el matemático francés Paul Pierre Levy en el siglo XVIII.", "93154671": "1. Haga clic en Restablecer en la parte inferior del panel de estadísticas.", + "93939827": "Cryptocurrency accounts", "96381225": "Fallo en la verificación de identificación", "98473502": "No estamos obligados a llevar a cabo una prueba de idoneidad ni a brindarle ningún tipo de advertencia con respecto a los riesgos.", "98972777": "artículo aleatorio", @@ -83,6 +85,7 @@ "102226908": "El campo no puede estar vacío", "108916570": "Duración: {{duration}} días", "109073671": "Por favor, utilice la billetera electrónica que ha usado para depósitos anteriormente. Asegúrese de que su billetera electrónica admite retiros. Puede consultar la lista de billeteras electrónicas que admiten retiros <0>aquí.", + "110822969": "One Wallet for all your transactions", "111215238": "Aléjese de la luz directa", "111718006": "Fecha final", "111931529": "Inversión máx. total durante 7 días", @@ -91,7 +94,7 @@ "116005488": "Indicadores", "117056711": "Estamos actualizando nuestro sitio", "117318539": "La contraseña debe tener letras minúsculas y mayúsculas del alfabeto inglés, con números.", - "118158064": "2. Utilice un bloque lógico para comprobar si la ganancia/pérdida actual supera la pérdida máxima.Si es así, vuelve a establecer el comercio en falso para evitar que el bot ejecute otro ciclo.", + "118158064": "2. Utilice un bloque lógico para comprobar si la ganancia/pérdida actual supera la pérdida máxima.Si es así, establezca la operación nuevamente en falso para evitar que el bot ejecute otro ciclo.", "118586231": "Número de documento (documento de identidad, pasaporte)", "119261701": "Predicción:", "119446122": "No ha seleccionado el tipo de contrato", @@ -185,7 +188,7 @@ "220019594": "¿Necesita más ayuda? Póngase en contacto con nosotros a través de live chat para obtener ayuda.", "220186645": "El texto esta vacío", "220232017": "demo de CFD", - "221261209": "Una cuenta Deriv le permitirá financiar (y retirar fondos de) su(s) cuenta(s) de CFDs.", + "221261209": "Una cuenta Deriv le permitirá financiar (y retirar fondos de) su(s) cuenta(s) de CFD.", "223120514": "En este ejemplo, cada punto de la línea SMA es un promedio aritmético de precios de cierre de los últimos 50 días.", "223607908": "Estadísticas del último dígito para los últimos 1000 ticks para {{underlying_name}}", "224650827": "IOT/USD", @@ -215,7 +218,9 @@ "251882697": "¡Gracias! Su respuesta se ha registrado en nuestro sistema.<0/><0/> Haga clic en «OK» para continuar.", "254912581": "Este bloque es similar al EMA, excepto que le da la línea EMA completa basada en la lista de entrada y el período dado.", "256031314": "Negocio de efectivo", + "256123827": "What happens to my trading accounts", "256602726": "Si cierra su cuenta:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Evaluación de trading", "260069181": "Se ha producido un error al intentar cargar la URL", @@ -242,7 +247,7 @@ "275116637": "Deriv X", "277469417": "El tiempo de exclusión no puede ser mayor a cinco años.", "278684544": "obtener sublista desde # desde el final", - "280021988": "Usa estos atajos", + "280021988": "Utilice estos atajos", "282319001": "Revise su foto", "282564053": "A continuación, necesitaremos su prueba de domicilio.", "283830551": "Su dirección no coincide con la de su perfil", @@ -250,8 +255,8 @@ "284527272": "antimoda", "284772879": "Contrato", "284809500": "Demo financiera", + "285909860": "Demo {{currency}} Wallet", "287934290": "¿Está seguro de que quiere cancelar esta transacción?", - "289898640": "TÉRMINOS DE USO", "291744889": "<0>1. Parámetros de operación:<0>", "291817757": "Visite nuestra comunidad Deriv y obtenga información sobre las API, los tokens de API, las formas de usar las API de Deriv y mucho más.", "292491635": "Si selecciona \"Stop loss\" y especifica una cantidad para limitar su pérdida, su posición se cerrará automáticamente cuando su pérdida sea mayor o igual a esta cantidad. Su pérdida puede ser mayor que la cantidad que ingresó dependiendo del precio de mercado al cierre.", @@ -272,7 +277,7 @@ "316694303": "¿La vela es negra?", "318865860": "cerrar", "318984807": "Este bloque repite las instrucciones que contiene durante un número específico de veces.", - "321457615": "Ups, algo salió mal!", + "321457615": "¡Ups, algo salió mal!", "323179846": "El intervalo de tiempo para cada vela se puede configurar de un minuto a un día.", "323209316": "Seleccione una estrategia de Deriv Bot", "323360883": "Cestas", @@ -299,6 +304,7 @@ "344418897": "Estos límites de trading y la autoexclusión le ayudan a controlar la cantidad de dinero y el tiempo que gasta en {{brand_website_name}} y a ejercer un <0>trading responsable.", "345320063": "Marca temporal inválida", "345818851": "Lo sentimos, se ha producido un error interno. Pulse la casilla de verificación anterior para volver a intentarlo.", + "346214602": "A better way to manage your funds", "347029309": "Forex: estándar/micro", "347039138": "Iterar (2)", "347217485": "¿Problemas para acceder a Deriv MT5 en su móvil?", @@ -350,9 +356,10 @@ "396801529": "Para empezar a operar, recargue fondos de su cuenta Deriv a esta cuenta.", "398816980": "Inicie {{platform_name_trader}} en segundos la próxima vez que desee operar.", "401339495": "Verificar la dirección", - "401345454": "Dirígete a la pestaña Tutoriales para hacerlo.", + "401345454": "Diríjase a la pestaña Tutoriales para hacerlo.", "402343402": "Debido a un problema en nuestro servidor, algunas de sus cuentas {{platform}} no están disponibles en este momento. Por favor, tenga paciencia y gracias por su cooperación.", "403456289": "La fórmula para la SMA es:", + "403608958": "Select a trading account or a Wallet", "404743411": "Total de depósitos", "406359555": "Detalles del contrato", "406497323": "Venda su contrato activo si es necesario (opcional)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Su intervalo de tiempo preferido entre cada informe:", "431267979": "Aquí tiene una guía rápida sobre cómo usar Deriv Bot portátil.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Take Profit: {{ currency }} {{ take_profit }}", "432519573": "Documento subido", @@ -453,12 +461,12 @@ "518955798": "7. Ejecutar una vez al iniciar", "520136698": "Índice Boom 500", "521872670": "item", - "522283618": "Experiencia en trading con opciones digitales", "522703281": "divisible por", "523123321": "- 10 a la potencia de un número dado", "524459540": "¿Cómo creo variables?", "527329988": "Esta es una de las 100 contraseñas más comunes", "529056539": "Opciones", + "530864956": "Deriv Apps", "530953413": "Aplicaciones autorizadas", "531114081": "3. Tipo de contrato", "531675669": "Euro", @@ -473,15 +481,18 @@ "543915570": "Forex, acciones, índices bursátiles, criptomonedas, índices sintéticos", "545476424": "Total de retiros", "549479175": "Multiplicadores de Deriv", + "549799607": "Go to LiveChat", "550589723": "Su inversión aumentará un {{growth_rate}}% por tick siempre y cuando el precio spot actual se mantenga dentro de ±{{tick_size_barrier}} con respecto al precio spot anterior.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Aprenda más sobre los límites de trading", "554135844": "Editar", "554410233": "Esta es una de las 10 contraseñas más comunes", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Después de definir los parámetros y las opciones comerciales, es posible que desee indicarle a su bot que compre contratos cuando se cumplan condiciones específicas. Para hacerlo, puede usar bloques condicionales e indicadores para ayudar a su bot a tomar decisiones.", "555881991": "Boleta del número de identidad nacional", "556264438": "Intervalo de tiempo", "558262475": "En su aplicación móvil de MT5, elimine su cuenta de Deriv existente:", - "558866810": "Ejecuta tu bot", + "558866810": "Ejecute su bot", "559224320": "Nuestra clásica herramienta de “arrastrar y soltar” para crear robots de trading, con gráficos de trading emergentes, para usuarios avanzados.", "561982839": "Cambie su moneda", "562599414": "Este bloque devuelve el precio de compra para el tipo de operación seleccionada. Este bloque solo se puede usar en el bloque raíz \"Condiciones de compra\".", @@ -497,7 +508,7 @@ "571921777": "Nivel de protección de fondos", "572576218": "Idiomas", "573173477": "¿La vela {{ input_candle }} es negra?", - "575702000": "Recuerde que se rechazarán los selfies, las fotos de casas o las imágenes no relacionadas.", + "575702000": "Recuerde que se rechazarán las selfies, las fotos de casas o las imágenes no relacionadas.", "576355707": "Seleccione su país y su ciudadanía:", "577215477": "cuente con {{ variable }} desde {{ start_number }} hasta {{ end_number }} por {{ step_size }}", "577779861": "Retirar", @@ -515,7 +526,7 @@ "588609216": "Repetir tour", "592087722": "Se requiere el estado laboral.", "593459109": "Prueba con una moneda diferente", - "594937260": "Derivado - BVI", + "594937260": "Derivados - BVI", "595080994": "Ejemplo: CR123456789", "595136687": "Guardar estrategia", "597089493": "Aquí es donde puede decidir vender su contrato antes que caduque. Solo se permite una copia de este bloque.", @@ -541,7 +552,7 @@ "619407328": "¿Está seguro de que desea desvincularse de {{identifier_title}}?", "623192233": "Complete la <0>Prueba de idoneidad para acceder a su cajero.", "623542160": "Conjunto de la Media Móvil Exponencial (EMAA)", - "624668261": "Acabas de detener al robot. Todos los contratos pendientes se pueden ver en la página de <0>informes.", + "624668261": "Acaba de detener el bot. Cualquier contrato abierto puede verse en la página de <0>Informes.", "625571750": "Punto de entrada:", "626175020": "Multiplicador de desviación estándar ascendente {{ input_number }}", "626809456": "Reenviar", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "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.", "639382772": "Suba un tipo de archivo compatible.", "640596349": "Aún no ha recibido una notificación", @@ -562,7 +574,6 @@ "642546661": "Suba la parte trasera de la licencia de conducir desde su computadora", "642995056": "Correo electrónico", "644150241": "La cantidad de contratos que ha ganado desde la última vez que borró sus estadísticas.", - "645016681": "Frecuencia de trading en otros instrumentos financieros", "645902266": "EUR/NZD", "647039329": "Se requiere prueba de domicilio", "647745382": "Lista de entrada {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "En el siguiente ejemplo, se selecciona el precio de apertura, que luego se asigna a una variable llamada \"op\".", "666724936": "Por favor, ingrese un número de ID válido.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Jurisdicción y legislación elegida", "674973192": "Utilice esta contraseña para acceder a sus cuentas de Deriv MT5 en la aplicación de escritorio, web y móvil.", "676159329": "No se pudo cambiar a la cuenta predeterminada.", @@ -613,19 +625,20 @@ "692354762": "Por favor, introduzca su {{document_name}}. {{example_format}}", "693396140": "Cancelación del contrato (expirado)", "694035561": "Multiplicadores de opciones de comercio", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Tiempo de apertura: marca temporal de apertura", "697630556": "Este mercado está actualmente cerrado.", "698037001": "Número nacional de identidad", "699159918": "1. Presentación de quejas", - "699646180": "Se requiere un depósito mínimo de <0>{{minimum_deposit}} {{currency}} es necesario. De lo contrario, los fondos se perderán y no podrán recuperarse.", + "699646180": "Un depósito mínimo de <0>{{minimum_deposit}} {{currency}} es necesario. De lo contrario, los fondos se perderán y no podrán recuperarse.", "700259824": "Moneda de la cuenta", "701034660": "Todavía estamos procesando su solicitud de retiro. <0 />Espere a que se complete la transacción antes de desactivar su cuenta.", "701462190": "Punto de entrada", "701647434": "Buscar cadena", "702451070": "Documento nacional de identidad (sin foto)", "702561961": "Cambiar tema", + "705262734": "Your Wallets are ready", "705299518": "A continuación, suba la página de su pasaporte que contiene la foto.", - "706413212": "Para acceder al cajero, ahora se encuentra en su cuenta {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Frecuencia de operación con opciones binarias", "706755289": "Este bloque realiza funciones trigonométricas.", "706960383": "Le ofreceremos comprar su contrato a este precio si decide venderlo antes de su vencimiento. Esto se basa en varios factores, como el precio spot actual, la duración, etc. Sin embargo, no ofreceremos un valor de contrato si la duración restante es inferior a 60 segundos.", @@ -644,6 +657,7 @@ "720293140": "Salir", "720519019": "Restablecer mi contraseña", "721011817": "- Eleve el primer número a la potencia del segundo número", + "722797282": "EU-regulated USD accounts", "723045653": "Accederás a tu cuenta de Deriv con esta dirección de correo electrónico.", "723961296": "Administrar contraseña", "724203548": "Puede enviar su queja a la plataforma de <0>Resolución de disputas en línea de la Comisión Europea (ODR). Esto no se aplica a los clientes del Reino Unido.", @@ -656,6 +670,7 @@ "734390964": "Saldo insuficiente", "734881840": "falso", "742469109": "Reiniciar saldo", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Opere con CFD en forex, índices derivados, criptomonedas y materias primas con un alto apalancamiento.", "743623600": "Referencia", "744110277": "Conjunto de Bandas de Bollinger (BBA)", @@ -689,6 +704,7 @@ "775706054": "¿Ud vende bots de trading?", "776085955": "Estrategias", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "Evita los últimos años", "784311461": "Media móvil exponencial (EMA)", "784583814": "Vinculado a su computadora", @@ -725,6 +741,7 @@ "818447476": "¿Cambiar de cuenta?", "820877027": "Verifique su prueba de identidad", "821163626": "El mantenimiento del servidor tiene lugar cada primer sábado de mes de 7 a 10 hora GMT. Es posible que experimente interrupciones del servicio durante este tiempo.", + "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": "Un bloque que puede contener texto.", "824797920": "¿La lista está vacía?", "825042307": "Intentemos nuevamente", @@ -745,9 +762,8 @@ "835336137": "Ver detalle", "835350845": "Agregue unas palabras más. Las palabras poco comunes son mejores.", "836097457": "Estoy interesado en el trading, pero tengo muy poca experiencia.", - "837063385": "No envíe otras divisas a esta dirección.", + "837063385": "No envíe otras monedas a esta dirección.", "837066896": "Su documento se está revisado, vuelva a consultarnos en 1-3 días.", - "839618971": "DIRECCIÓN", "839805709": "Para verificarlo sin problemas, necesitamos una mejor foto", "840672750": "Si esto no funciona, desinstale y vuelva a instalar la aplicación MT5. A continuación, vuelva a realizar los pasos <0>2 y <0>3.", "841434703": "Deshabilitar stack", @@ -814,7 +830,7 @@ "905564365": "CFD en MT5", "906049814": "Revisaremos sus documentos y le avisaremos de su estado en un plazo de 5 minutos.", "907680782": "Fallo en la verificación de la prueba de titularidad", - "909272635": "Financiero - SVG", + "909272635": "Financiera - SVG", "910888293": "Demasiados intentos", "911048905": "(BTCUSD, ETHUSD)", "912406629": "Siga los siguientes pasos:", @@ -844,9 +860,9 @@ "943535887": "Cierre sus posiciones en las siguientes cuentas Deriv MT5:", "944499219": "Posiciones máx. abiertas", "945532698": "Contrato vendido", + "945753712": "Back to Trader’s Hub", "946204249": "Lectura", "946841802": "Una vela blanca (o verde) indica que el precio de apertura es más bajo que el precio de cierre. Esto representa un movimiento al alza del precio de mercado.", - "946944859": "Pulse el botón de abajo y le enviaremos un correo electrónico con un enlace. Haga clic en ese enlace para verificar su solicitud de retiro.", "947046137": "Su retiro se procesará en 24 horas", "947363256": "Crear lista", "947758334": "Se requiere la ciudad", @@ -924,7 +940,7 @@ "1031731167": "Libra esterlina", "1032173180": "Deriv", "1032907147": "AUD/NZD", - "1033076894": "- ganancia/pérdida actual: usa esta variable para almacenar las ganancias o pérdidas acumuladas mientras tu bot está funcionando. Establezca el valor inicial en 0.", + "1033076894": "- ganancia/pérdida actual: usa esta variable para almacenar las ganancias o pérdidas acumuladas mientras su bot está funcionando. Establezca el valor inicial en 0.", "1035893169": "Borrar", "1036116144": "Especular sobre el movimiento del precio de un activo sin poseerlo realmente.", "1036867749": "Aquí se define la duración deseada, la inversión, la predicción y / o la(s) barrera(s) para el contrato.", @@ -950,6 +966,7 @@ "1050128247": "Confirmo que he verificado la información de transferencia del agente de pago.", "1050844889": "Informes", "1052779010": "Está en su cuenta demo", + "1052921318": "{{currency}} Wallet", "1053153674": "Índice Jump 50", "1053159279": "Nivel de educación", "1053556481": "Una vez que envíe su queja, le enviaremos un correo electrónico de confirmación para asegurarle que la hemos recibido.", @@ -963,7 +980,7 @@ "1058804653": "Expiración", "1060231263": "¿Cuándo se le exige pagar un margen inicial?", "1061308507": "Compre {{ contract_type }}", - "1062423382": "Consulta las videoguías y las preguntas frecuentes para crear tu bot en la pestaña de tutoriales.", + "1062423382": "Consulta las video-guías y las preguntas frecuentes para crear su bot en la pestaña de tutoriales.", "1062536855": "Iguales", "1065275078": "Por ahora, cTrader sólo está disponible en el escritorio.", "1065353420": "+110", @@ -989,7 +1006,7 @@ "1089085289": "Número de móvil", "1089436811": "Tutoriales", "1089687322": "¿Detener tu bot actual?", - "1090041864": "El {{block_type}} bloqueo es obligatorio y no se puede eliminar/deshabilitar.", + "1090041864": "El bloque {{block_type}} es obligatorio y no se puede eliminar/deshabilitar.", "1095295626": "<0>• El Árbitro de Servicios Financieros determinará si la queja puede aceptarse y si se ajusta a la ley.", "1096078516": "Revisaremos sus documentos y le avisaremos de su estado en un plazo de 3 días.", "1096175323": "Necesitará una cuenta Deriv", @@ -1010,6 +1027,7 @@ "1110102997": "Extracto", "1112582372": "Duración del intervalo", "1113119682": "Este bloque le da el valor de vela seleccionado de una lista de velas.", + "1113221217": "MT5 Swap-free", "1113292761": "Menos de 8MB", "1114679006": "Ha creado correctamente su bot con una estrategia sencilla.", "1117281935": "Condiciones de venta (opcional)", @@ -1036,6 +1054,7 @@ "1134879544": "Ejemplo de un documento con reflejo", "1138126442": "Forex: estándar", "1139483178": "Habilitar stack", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "La dirección es {{ direction_type }}", "1144028300": "Conjunto de índice de fuerza relativa (RSIA)", "1145927365": "Ejecuta los bloques dentro tras un número determinado de segundos", @@ -1066,7 +1085,6 @@ "1174689133": "3. Establezca los parámetros de su operación y pulse Ejecutar.", "1174748431": "Canal de pago", "1175183064": "Vanuatu", - "1176926166": "Experiencia en operación con otros instrumentos financieros", "1177396776": "Si selecciona \"Asiáticas - Baja\", ganará el pago si el último tick es inferior a la media de los ticks.", "1177723589": "No hay transacciones para mostrar", "1178582280": "La cantidad de contratos que ha perdido desde la última vez que borró sus estadísticas.", @@ -1077,6 +1095,7 @@ "1181396316": "Este bloque le da un número aleatorio dentro de un rango establecido", "1181770592": "Ganancia / pérdida de la venta", "1183007646": "- Tipo de contrato: el nombre del tipo de contrato como Alza, Baja, Toca, No Toca, etс.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Cierre su contrato ahora o manténgalo en funcionamiento. Si decide mantenerlo en funcionamiento, puede comprobarlo y cerrarlo más adelante en ", "1188316409": "Para recibir sus fondos, póngase en contacto con el agente de pagos con los detalles que se indican", "1188980408": "5 minutos", @@ -1094,12 +1113,14 @@ "1201773643": "numérico", "1203297580": "Este bloque envía un mensaje a un canal de Telegram.", "1204223111": "En este ejemplo, los precios abiertos de una lista de velas se asignan a una variable llamada \"candle_list\".", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "¿Cómo ocultar su tarjeta?", "1206821331": "Fuerzas armadas", "1207152000": "Elija una plantilla y defina sus parámetros operativos.", "1208714859": "Para abreviar:", "1208729868": "Ticks", "1208903663": "Token inválido", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "El bot está arrancando", "1214893428": "La creación de cuenta no está disponible actualmente para dispositivos móviles. Inicie sesión en su computadora para crear una cuenta nueva.", "1216408337": "Autónomo", @@ -1112,6 +1133,7 @@ "1222521778": "Hacer depósitos y retiros es difícil.", "1222544232": "Le hemos enviado un correo electrónico", "1225150022": "Número de activos", + "1226027513": "Transfer from", "1227074958": "fracción aleatoria", "1227240509": "Recortar espacios", "1228534821": "Es posible que los agentes de pago de su país no admitan algunas monedas.", @@ -1121,12 +1143,13 @@ "1232291311": "Retiro máximo restante", "1232353969": "0-5 transacciones en los últimos 12 meses", "1233300532": "Pago", + "1233376285": "Options & multipliers", "1234292259": "Origen del patrimonio", "1234764730": "Suba una captura de pantalla de su nombre y dirección de correo electrónico desde la sección de datos personales.", "1235426525": "50%", "1237330017": "Jubilado", "1238311538": "Administrador", - "1239752061": "En su cartera de criptomonedas, asegúrese de seleccionar la <0> red{{network_name}} cuando transfiera fondos a Deriv.", + "1239752061": "En su billetera de criptomonedas, asegúrese de seleccionar la <0>red {{network_name}} cuando transfiera fondos a Deriv.", "1239760289": "Complete su evaluación de trading", "1239940690": "Reinicia el bot cuando se encuentra un error.", "1240027773": "Por favor inicie sesión", @@ -1145,7 +1168,7 @@ "1252669321": "Importar desde Google Drive", "1253531007": "Confirmado", "1254565203": "establecer {{ variable }} para crear lista con", - "1255827200": "También puedes importar o crear tu bot con cualquiera de estos atajos.", + "1255827200": "También puede importar o crear su bot con cualquiera de estos atajos.", "1255909792": "último", "1255963623": "Hasta la fecha/hora {{ input_timestamp }} {{ dummy }}", "1258097139": "¿Qué podemos hacer para mejorar?", @@ -1166,6 +1189,7 @@ "1281045211": "Ordena los elementos de una lista determinada, por su valor numérico o alfabético, en orden ascendente o descendente.", "1281290230": "Seleccionar", "1282951921": "Solo Abajo", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Si se selecciona \"Pérdida\", devolverá \"Verdadero\" si su última operación no tuvo éxito. De lo contrario, devolverá una cadena vacía.", "1286094280": "Retirar", "1286507651": "Cerrar la pantalla de verificación de identidad", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Llamada de margen", "1290525720": "Ejemplo: ", - "1291887623": "Frecuencia de trading con opciones digitales", "1291997417": "Los contratos vencerán exactamente a las 23:59:59 GMT de la fecha de vencimiento seleccionada.", "1292188546": "Restablecer la contraseña de inversor de Deriv MT5", "1292891860": "Notificar a Telegram", @@ -1196,7 +1219,7 @@ "1309017029": "Habilitar esto le permite guardar sus bloques como una colección que se puede integrar fácilmente en otros bots.", "1309044871": "Devuelve el valor del último tick en formato de cadena", "1309133590": "Obtenga una variedad de pagos al predecir correctamente los movimientos del mercado con <0>las opciones, o saque provecho de los CFD sin arriesgar más de lo que apostó inicialmente con los <1>multiplicadores.", - "1309186223": "- apuesta actual: utilice esta variable para almacenar el importe apostado utilizado en el último contrato. Puedes asignar la cantidad que desees, pero debe ser un número positivo.", + "1309186223": "-Inversión actual: utilice esta variable para almacenar el importe invertido utilizado en el último contrato. Puede asignar la cantidad que desee, pero debe ser un número positivo.", "1310483610": "Resultados para \"{{ search_term }}\"", "1311680770": "pago", "1313167179": "Por favor inicie sesión", @@ -1206,7 +1229,7 @@ "1322804930": "Reinicie el proceso en la última versión de Google Chrome", "1323327633": "Nuestro proceso de quejas comprende los siguientes 4 pasos:", "1323476617": "Cambia la capitalización de una cadena de texto a mayúsculas, minúsculas, mayúsculas y minúsculas en el título.", - "1323941798": "Cortos", + "1323941798": "Corto", "1323996051": "Perfil", "1324922837": "2. La nueva variable aparecerá como un bloque en Establecer variable.", "1325514262": "(licencia Nº MB/18/0024)", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Vender)", "1329136554": "Índice Jump 200", "1329325646": "El contenido de este bloque aparece en cada tick", + "1330479159": "Ready to upgrade?", "1331199417": "Ingrese el formato correcto. ", "1331367811": "Número de cuenta de cliente", "1332168410": "Aprenda más", @@ -1257,7 +1281,6 @@ "1367023655": "Para garantizar que su pérdida no exceda su inversión, su contrato se cerrará automáticamente cuando su pérdida sea igual a <0/>.", "1367488817": "4. Restablecer las condiciones del contrato", "1367990698": "Índice de volatilidad 10", - "1369709538": "Nuestros Términos de uso", "1370647009": "Disfrute de límites diarios más altos", "1371193412": "Cancelar", "1371555192": "Elija su agente de pago preferido e introduzca el importe del retiro. Si su agente de pagos no aparece en la lista, <0>búsquelo con su número de cuenta.", @@ -1319,6 +1342,7 @@ "1434767075": "Comience a utilizar Deriv Bot", "1434976996": "Anuncio", "1435363248": "Este bloque convierte el número de segundos desde el Epoch Unix a un formato de fecha y hora como 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Depósito mínimo", "1437396005": "Agregar comentario", "1438247001": "Un cliente profesional recibe un menor grado de protección al cliente debido a lo siguiente.", @@ -1357,7 +1381,7 @@ "1468308734": "Este bloque repite instrucciones siempre que una condición dada sea verdadera", "1468419186": "Deriv actualmente admite retiros de Tether USDT a la billetera Omni. Para garantizar una transacción exitosa, ingrese una dirección de billetera compatible con los tokens que desea retirar. <0>Más información", "1468937050": "Opere en {{platform_name_trader}}", - "1469133110": "Aplicación cTrader para Windows", + "1469133110": "aplicación de cTrader para Windows", "1469150826": "Take Profit", "1469764234": "Error de cajero", "1469814942": "- División", @@ -1369,6 +1393,7 @@ "1476301886": "Similar a SMA, este bloque le brinda toda la línea de SMA que contiene una lista de todos los valores para un período determinado.", "1478030986": "Crear o eliminar tokens API para operaciones y retiros", "1480915523": "Saltar", + "1481860194": "Your new Wallet(s)", "1481977420": "Por favor, ayúdenos a verificar su solicitud de retiro.", "1483470662": "Haga clic en 'Abrir' para empezar a operar con su cuenta", "1484336612": "Este bloque se usa para terminar o continuar un ciclo, y se puede colocar en cualquier lugar dentro de un bloque de ciclo.", @@ -1389,6 +1414,7 @@ "1505420815": "No se ha encontrado ningún agente de pago para su búsqueda", "1505898522": "Descargar montón", "1505927599": "Nuestros servidores tuvieron una interrupción. Refresque para continuar.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Comprar)", "1509678193": "Educación", @@ -1396,7 +1422,7 @@ "1510357015": "Se requiere residencia fiscal.", "1510735345": "Este bloque le proporciona una lista de los últimos dígitos de los últimos 1000 valores de tick.", "1512469749": "En el ejemplo anterior, se supone que la variable candle_open_price se procesa en algún lugar dentro de otros bloques.", - "1513771077": "Estamos procesando su retirada.", + "1513771077": "Estamos procesando su retiro.", "1516559721": "Seleccione solo un archivo", "1516676261": "Depositar", "1516834467": "\"Consiga\" las cuentas que quiere", @@ -1444,11 +1470,12 @@ "1572982976": "Servidor", "1573429525": "Call/Put", "1573533094": "Su documento está pendiente de verificación.", - "1574989243": "- volver a operar: utilice esta variable para dejar de operar cuando alcance su límite de pérdidas. Establezca el valor inicial en verdadero.", + "1574989243": "- volver a operar: utilice esta variable para dejar de operar cuando alcance su límite de pérdidas. Establezca el valor inicial en verdadero.", "1575556189": "Tether en la blockchain Ethereum, como el token ERC20, es una capa de transporte más nueva, que ahora hace que Tether esté disponible en los contratos inteligentes de Ethereum. Como token ERC20 estándar, también se puede enviar a cualquier dirección Ethereum.", "1577480486": "Su enlace móvil caducará en una hora", "1577527507": "Se requiere el motivo de apertura de la cuenta.", "1577612026": "Seleccione una carpeta", + "1577879664": "<0>Your Wallets are ready", "1579839386": "App store", "1580498808": "Varias caras encontradas", "1584109614": "Lista de cadenas de ticks", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "El bot encontró un error mientras se ejecutaba.", "1648938920": "Netherlands 25", "1649239667": "2. En el Menú de bloques, verá una lista de categorías. Los bloques se agrupan dentro de estas categorías. Elija el bloque que quiera y arrástrelo al espacio de trabajo.", + "1650963565": "Introducing Wallets", "1651513020": "Mostrar el tiempo restante para cada intervalo", "1651951220": "Las repeticiones como \"abcabcabc\" son solo un poco más difíciles de adivinar que \"abc\"", "1652366857": "obtener y eliminar", @@ -1522,13 +1551,13 @@ "1665272539": "Recuerde: no puede iniciar sesión en su cuenta hasta la fecha seleccionada.", "1665738338": "Balance", "1665756261": "Ir al chat en vivo", + "1666783057": "Upgrade now", "1668138872": "Modificar los ajustes de cuenta", "1670016002": "Multiplicador: {{ multiplier }}", "1670426231": "Hora de finalización", "1671232191": "Ha establecido los siguientes límites:", "1674163852": "Puede determinar el vencimiento de su contrato fijando la duración o la hora de finalización.", "1675030608": "Para crear esta cuenta, primero necesitamos que vuelva a enviar su prueba de domicilio.", - "1675289747": "Cambiar a cuenta real", "1676549796": "Apalancamiento dinámico", "1677027187": "Forex", "1677990284": "Mis apps", @@ -1556,6 +1585,7 @@ "1703091957": "Recopilamos información sobre su empleo como parte de nuestras obligaciones de diligencia debida, tal y como exige la legislación contra el blanqueo de capitales.", "1704656659": "¿Cuánta experiencia tiene en el trafing con CFD?", "1708413635": "Para su cuenta {{currency_name}} ({{currency}})", + "1709293836": "Wallet balance", "1709401095": "Opere CFD en Deriv X con los mercados financieros y nuestros índices derivados.", "1709859601": "Tiempo del punto de salida", "1710662619": "Si tiene la app, ejecútela para comenzar a operar.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Cobraremos una tarifa de transferencia del 2% o {{minimum_fee}} {{currency}}, lo que sea mayor, por las transferencias entre sus cuentas de criptomoneda Deriv y Deriv fiat.", "1720968545": "Suba la página con la foto de pasaporte desde su computadora", + "1723069433": "Your new Wallet", "1723589564": "Representa el número máximo de contratos pendientes en su cartera. Cada línea de su cartera cuenta una posición abierta. Una vez que se alcanza el máximo no podrá abrir nuevas posiciones sin cerrar las posiciones existentes primero.", "1724696797": "Está limitado/a a una sola cuenta fiat.", "1725958461": "Número de cuenta", @@ -1698,6 +1729,7 @@ "1842266423": "reverso", "1842862156": "Bienvenidos a su panel de Deriv X", "1843658716": "Si selecciona \"Solo Abajo\", gana el pago si los ticks consecutivos caen sucesivamente después del precio de entrada. No se gana el pago si algún tick sube o es igual a cualquier de los ticks anteriores.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(mín: {{min_stake}} - máx: {{max_payout}})", "1846266243": "Esta función no está disponible para cuentas demo.", "1846587187": "No ha seleccionado su país de residencia", @@ -1765,7 +1797,7 @@ "1906213000": "Nuestro sistema terminará cualquier operación de Deriv Bot que esté en curso, y Deriv Bot no colocará ninguna nueva operación.", "1906639368": "Si es la primera vez que intenta crear una contraseña, o si la ha olvidado, reiníciela.", "1907884620": "Agregue una cuenta real de juegos de Deriv", - "1908023954": "Lo sentimos, ha ocurrido un error al procesar tu solicitud.", + "1908023954": "Lo sentimos, ha ocurrido un error al procesar su solicitud.", "1908239019": "Asegúrese de que todo el documento esté en la foto", "1908686066": "Advertencia sobre la prueba de idoneidad", "1909647105": "TRX/USD", @@ -1792,7 +1824,6 @@ "1924765698": "Lugar de nacimiento*", "1926987784": "- iOS: Deslice el dedo hacia la izquierda sobre la cuenta y pulse <0>Eliminar.", "1928930389": "GBP/NOK", - "1929309951": "Situación laboral", "1929694162": "Comparar cuentas", "1930899934": "Tether", "1931659123": "Corre en cada tick", @@ -1807,6 +1838,7 @@ "1943440862": "Calcula la lista de Bandas de Bollinger (BB) a partir de una lista con un período", "1944204227": "Este bloque devuelve el saldo de la cuenta corriente.", "1947527527": "1. Este enlace fue enviado por usted", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Aquí están las posibles razones:", "1950413928": "Enviar documentos de identidad", @@ -1826,7 +1858,7 @@ "1968368585": "Estado laboral", "1970060713": "Has eliminado correctamente un bot.", "1971898712": "Agregar o administrar cuenta", - "1973060793": "- pérdida máxima: utilice esta variable para almacenar su límite máximo de pérdida. Puedes asignar la cantidad que desees, pero debe ser un número positivo.", + "1973060793": "- pérdida máxima: utilice esta variable para almacenar su límite máximo de pérdida. Puedes asignar la cantidad que desees, pero debe ser un número positivo.", "1973536221": "Aún no tiene posiciones abiertas.", "1973564194": "Está limitado a una cuenta fiat. No podrá cambiar la moneda de su cuenta si ya hizo su primer depósito o creó una cuenta real {{dmt5_label}} o de {{platform_name_dxtrade}}.", "1973910243": "Gestione sus cuentas", @@ -1863,7 +1895,7 @@ "1997138507": "Si el último tick es igual a la media de los ticks, no recibirá el premio.", "1997313835": "Su inversión seguirá creciendo mientras el precio spot actual se mantenga dentro de un <0>rango especificado con respecto al <0>precio spot anterior. De lo contrario, perderá su inversión y la operación se dará por terminada.", "1998199587": "También puede excluirse por completo durante un período específico. Si, en cualquier momento, decide volver a operar, debe ponerse en contacto con nuestro servicio de Atención al Cliente para eliminar esta autoexclusión. Habrá un período de reflexión de 24 horas antes de que pueda reanudar las operaciones. ", - "1999346412": "Para una verificación más rápida, introduzca aquí la misma dirección que en su documento de comprobante de domicilio (véase la sección siguiente)", + "1999346412": "Para una verificación más rápida, introduzca aquí la misma dirección que en su documento de comprobante de domicilio (véa la sección siguiente)", "2001222130": "Revise su carpeta de correo no deseado o basura. Si no está allí, intente reenviar el correo electrónico.", "2004792696": "Si es residente del Reino Unido, para autoexcluirse de todas las empresas de juegos online con licencia en Gran Bretaña, visite <0>www.gamstop.co.uk.", "2007028410": "mercado, tipo de operación, tipo de contrato", @@ -1875,6 +1907,7 @@ "2014536501": "Número de tarjeta", "2014590669": "La variable '{{variable_name}}' no tiene valor. Establezca un valor para la variable '{{variable_name}}' para notificar.", "2017672013": "Seleccione el país de emisión del documento.", + "2020104747": "Filter", "2020545256": "¿Cerrar su cuenta?", "2021037737": "Actualice sus detalles para continuar.", "2021161151": "Vea este vídeo para aprender a construir un bot de trading en Deriv Bot. Además, echa un vistazo a esta entrada del blog sobre la construcción de un bot de trading.", @@ -1885,7 +1918,6 @@ "2027696535": "Información tributaria", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "Compare cuentas de CFD", "2030018735": "RSI es una herramienta de análisis técnico que lo ayuda a identificar la tendencia del mercado. Le dará un valor de 0 a 100. Un valor RSI de 70 o más significa que el activo está sobrecomprado y la tendencia actual puede revertirse, mientras que un valor de 30 o menos significa que el activo está sobrevendido.", "2030045667": "Mensaje", "2033648953": "Este bloque le proporciona el valor de vela especificado para un intervalo de tiempo seleccionado.", @@ -1901,7 +1933,7 @@ "2042115724": "Suba una captura de pantalla de su cuenta y de la página de datos personales con su nombre, número de cuenta, número de teléfono y dirección de correo electrónico.", "2044086432": "El cierre es el último tick en o antes de la hora de finalización. Si seleccionó una hora de finalización específica, la hora de finalización es la hora seleccionada.", "2046273837": "Último tick", - "2046577663": "Importa o elige tu bot", + "2046577663": "Importe o elija su bot", "2048110615": "Dirección de correo electrónico*", "2048134463": "Se ha excedido el tamaño del archivo.", "2049386104": "Necesitamos que nos envíe lo siguiente para obtener esta cuenta:", @@ -1919,10 +1951,11 @@ "2063812316": "Bloque de texto", "2063890788": "Cancelado", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Carné de conducir", "2070002739": "No aceptar", "2070345146": "Al abrir una operación de CFD apalancada.", - "2070518923": "Importa tu bot o toca Estrategias rápidas para elegir entre las plantillas de bots listas para usar.", + "2070518923": "Importe su bot o toque Estrategias Rápidas para elegir entre las plantillas de bots listas para usar.", "2070752475": "Información regulatoria", "2071043849": "Navegar", "2073813664": "CFD, Opciones o Multiplicadores", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Presentación de una queja", "2080553498": "3. Obtenga la ID de chat utilizando la API REST de Telegram (lea más: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Vendido por: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Sí, borrar", "2084693624": "Convierte una cadena que representa una cadena de fecha/hora en segundos desde el Epoch. Ejemplo: 2019-01-01 21:03:45 GMT + 0800 se convertirá a 1546347825. La hora y el desplazamiento de zona horaria son opcionales.", "2085387371": "Deben ser números, letras y caracteres especiales. , '-", @@ -1939,12 +1973,12 @@ "2086792088": "Ambas barreras deben ser relativas o absolutas", "2088735355": "Su sesión y límites de inicio de sesión", "2089581483": "Expira el", - "2090650973": "El precio al contado puede cambiar en el momento en que su orden llega a nuestros servidores. Cuando esto ocurra, su pago puede verse afectado.", + "2090650973": "El precio spot puede cambiar en el momento en que su orden llega a nuestros servidores. Cuando esto ocurra, su pago puede verse afectado.", "2091671594": "Estado", "2093675079": "- Cerrar: el precio de cierre", "2096014107": "Aplicar", "2096456845": "Fecha de nacimiento*", - "2096603244": "Derivado - Vanuatu", + "2096603244": "Derivados - Vanuatu", "2097170986": "Sobre Tether (Omni)", "2097365786": "Una copia de su documento de identidad (documento de identidad, pasaporte)", "2097381850": "Calcula la Media Móvil Simple (SMA) a partir de una lista con un período", @@ -1966,7 +2000,6 @@ "2115223095": "Pérdida", "2117165122": "1. Cree un bot de Telegram y obtenga su token API de Telegram. Lea más sobre cómo crear bots en Telegram aquí: https://core.telegram.org/bots#6-botfather", "2117489390": "Actualización automática en {{ remaining }} segundos", - "2118315870": "¿Dónde vive?", "2119449126": "Un posible resultado del siguiente ejemplo será:", "2119710534": "Preguntas Frecuentes", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Consejo profesional: también puedes hacer clic en el bloque deseado y arrastrarlo hacia afuera", "2146892766": "Experiencia en trading con opciones binarias", "2147244655": "¿Cómo puedo importar mi propio bot de trading en Deriv Bot?", - "-1232613003": "<0>Verificación fallida. <1>¿Por qué?", - "-2029508615": "<0>Necesita verificación. <1>Verificar ahora", "-931052769": "Enviar verificación", "-1004605898": "Consejos", "-1938142055": "Documentos subidos", @@ -2141,18 +2172,9 @@ "-179726573": "Hemos recibido su prueba de titularidad.", "-813779897": "Se ha superado la verificación de la prueba de titularidad.", "-638756912": "Oculte los dígitos del 7 al 12 del número de la tarjeta que aparece en la parte frontal de su tarjeta de débito/crédito.", - "-2073934245": "Los servicios del trading financiero ofrecidos en este sitio solo son adecuados para clientes que aceptan la posibilidad de perder todo el dinero que invierten y que entienden y tienen experiencia del riesgo involucrado en la compra de contratos financieros. Las transacciones en contratos financieros conllevan un alto grado de riesgo. Si los contratos que compró expiran sin valor, perderá toda su inversión, que incluye la prima del contrato.", - "-1166068675": "Su cuenta se abrirá con {{legal_entity_name}}, regulada por la Comisión de Juego del Reino Unido (UKGC), y estará sujeta a las leyes de la Isla de Man.", - "-975118358": "Su cuenta se abrirá con {{legal_entity_name}}, regulada por la Autoridad de Servicios Financieros de Malta, y estará sujeta a las leyes de Malta.", - "-680528873": "Se abrirá tu cuenta con {{legal_entity_name}} y estará sujeta a la jurisdicción y a las leyes de Samoa.", - "-1125193491": "Añadir cuenta", - "-2068229627": "No soy una PEP, y no he sido una PEP en los últimos 12 meses.", "-684271315": "OK", "-740157281": "Evaluación de la experiencia de trading", "-1720468017": "Al proporcionarle nuestros servicios, debemos obtener información sobre usted para evaluar si un producto o servicio determinado es apropiado para usted.", - "-186841084": "Cambie su correo de inicio de sesión", - "-907403572": "Para cambiar su dirección de correo electrónico, primero tendrá que desvincular su dirección de correo electrónico de su cuenta {{identifier_title}}.", - "-1850792730": "Desvincular de {{identifier_title}}", "-307865807": "Advertencia de tolerancia al riesgo", "-690100729": "Sí, entiendo el riesgo.", "-2010628430": "Los CFD y otros instrumentos financieros conllevan un alto riesgo de perder dinero rápidamente debido al apalancamiento. Debe considerar si comprende cómo funcionan los CFD y otros instrumentos financieros y si puede darse el lujo de correr el elevado riesgo de perder su dinero.<0/><0/> Para continuar, debe confirmar que comprende que su capital está en riesgo.", @@ -2206,11 +2228,6 @@ "-1725454783": "Fallado", "-506510414": "Fecha y hora", "-1708927037": "Dirección IP", - "-619126443": "Utilice su <0>contraseña Deriv para iniciar sesión en {{brand_website_name}} y {{platform_name_trader}}.", - "-623760979": "Utilice la <0>contraseña Deriv para acceder a {{brand_website_name}}, {{platform_name_trader}} y {{platform_name_go}}.", - "-459147994": "Utilice la <0>contraseña Deriv para acceder a {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} y {{platform_name_ctrader}}.", - "-80717068": "Aplicaciones que ha vinculado a su <0>contraseña de Deriv:", - "-9570380": "Use la contraseña {{platform_name_dxtrade}} para iniciar sesión en sus cuentas {{platform_name_dxtrade}} en la web y en aplicaciones móviles.", "-2131200819": "Desactivar", "-200487676": "Activar", "-1840392236": "Ese no es el código correcto. Inténtelo de nuevo.", @@ -2240,44 +2257,37 @@ "-378415317": "Se requiere el estado", "-1497654315": "Nuestras cuentas y servicios no están disponibles para el código postal de Jersey.", "-755626951": "Complete sus datos personales", - "-584911871": "Seleccionar la moneda de la billetera", "-1461267236": "Por favor elija su moneda", - "-1352330125": "MONEDA", "-1027595143": "Menos de 25.000 $", "-40491332": "25.000 $ - 50.000 $", "-1139806939": "50.001 $ - 100.000 $", - "-626752657": "0-1 año", - "-532014689": "1-2 años", - "-1001024004": "Más de 3 años", - "-790513277": "6-10 transacciones en los úlitmos 12 meses", - "-580085300": "11-39 transacciones en los úlitmos 12 meses", - "-654781670": "Primario", - "-1717373258": "Secundario", "-996132458": "Construcción", "-915003867": "Salud", "-1430012453": "Tecnología de la Información y Comunicaciones", "-987824916": "Ciencia e Ingeniería", "-146630682": "Social y Cultural", "-761306973": "Producción", - "-739367071": "Empleado", - "-1156937070": "500.001 $ - 1.000.000 $", - "-315534569": "Más de 1.000.000 $", - "-2068544539": "Empleado asalariado", - "-531314998": "Inversiones y dividendos", - "-1235114522": "Pensión", - "-1298056749": "Beneficios de Estado", - "-449943381": "Ahorros y herencias", "-1631552645": "Profesionales", "-474864470": "Trabajadores de cuidado personal, ventas y servicios", "-1129355784": "Trabajadores agrícolas, forestales y pesqueros", "-1242914994": "Trabajadores de artesanía, industria metalúrgica, eléctrica y electrónica", "-1317824715": "Personal de limpieza y asistentes", "-1592729751": "Trabajadores de la minería, construcción, manufactura y transporte", + "-1030759620": "Funcionarios de gobierno", "-2137323480": "Propiedad de la empresa", "-1590574533": "Acuerdo de divorcio", "-1667683002": "Herencia", "-1237843731": "Ingreso de inversión", "-777506574": "Venta de propiedad", + "-654781670": "Primario", + "-1717373258": "Secundario", + "-1156937070": "500.001 $ - 1.000.000 $", + "-315534569": "Más de 1.000.000 $", + "-2068544539": "Empleado asalariado", + "-531314998": "Inversiones y dividendos", + "-1235114522": "Pensión", + "-1298056749": "Beneficios de Estado", + "-449943381": "Ahorros y herencias", "-1161338910": "Se requiere el nombre.", "-1161818065": "El apellido debe tener entre 2 y 50 caracteres.", "-1281693513": "Se requiere fecha de nacimiento.", @@ -2287,28 +2297,14 @@ "-212167954": "El número de identificación fiscal no tiene el formato correcto.", "-621555159": "Información de identidad", "-204765990": "Términos de uso", - "-231863107": "No", - "-870902742": "¿Cuántos conocimientos y experiencia tiene en relación al trading en línea?", - "-1929477717": "Tengo un título académico, una certificación profesional y/o experiencia laboral relacionada con los servicios financieros.", - "-1540148863": "He asistido a seminarios, capacitaciones y/o talleres relacionados con el trading.", - "-922751756": "Menos de un año", - "-542986255": "Ninguna", - "-1337206552": "En su opinión, el trading con CFD le permite", - "-456863190": "Coloque una posición sobre el movimiento del precio de un activo en la que el resultado sea una rentabilidad fija o nada en absoluto.", - "-1314683258": "Realizar una inversión a largo plazo para obtener beneficios garantizados.", - "-1546090184": "¿Cómo afecta el apalancamiento al trading con CFD?", - "-1636427115": "El apalancamiento le ayuda a mitigar el riesgo.", - "-800221491": "El apalancamiento garantiza las ganancias.", - "-811839563": "El apalancamiento le permite abrir posiciones grandes por una fracción del valor de la operación, lo que puede resultar en un aumento de las ganancias o pérdidas.", - "-1185193552": "Cerrar su operación automáticamente cuando la pérdida sea igual o superior a una cantidad específica, siempre que haya una liquidez de mercado adecuada.", - "-1046354": "Cerrar su operación automáticamente cuando el beneficio sea igual o superior a una cantidad específica, siempre que haya una liquidez de mercado adecuada.", - "-1842858448": "Obtener un beneficio garantizado en su operación.", - "-860053164": "Al operar con multiplicadores.", - "-1250327770": "Al comprar acciones de una empresa.", - "-1222388581": "Todas las anteriores.", "-477761028": "ID de votante", "-1466346630": "CPF", - "-1030759620": "Funcionarios de gobierno", + "-739367071": "Empleado", + "-626752657": "0-1 año", + "-532014689": "1-2 años", + "-1001024004": "Más de 3 años", + "-790513277": "6-10 transacciones en los úlitmos 12 meses", + "-580085300": "11-39 transacciones en los úlitmos 12 meses", "-612752984": "Estos son límites predeterminados que aplicamos a sus cuentas.", "-1598263601": "Para obtener más información sobre los límites comerciales y cómo se aplican, visite el <0>Centro de ayuda.", "-1411635770": "Aprenda más sobre los límites de cuenta", @@ -2326,10 +2322,7 @@ "-1500958859": "Verificar", "-1502578110": "Su cuenta está totalmente autenticada y su límite de retiro ha sido aumentado.", "-1662154767": "una factura reciente de servicios públicos (por ejemplo, electricidad, agua, gas, teléfono fijo o internet), extracto bancario o carta emitida por el gobierno con su nombre y esta dirección.", - "-190838815": "Necesitamos esto para la verificación. Si la información que proporciona es falsa o inexacta, no podrá depositar ni retirar.", - "-223216785": "Segunda línea de dirección*", "-594456225": "Segunda línea de dirección", - "-1940457555": "Código postal*", "-1964954030": "Código postal", "-516397235": "Tenga cuidado de con quién comparte este token. Cualquier persona con este token puede realizar las siguientes acciones en nombre de su cuenta", "-989216986": "Añadir cuentas", @@ -2362,7 +2355,7 @@ "-1959484303": "Criptomonedas", "-561724665": "Está limitado/a a una sola cuenta fiat", "-2087317410": "¡Algo salió mal!", - "-184202848": "Cargar archivo", + "-184202848": "Subir archivo", "-1447142373": "Haga clic aquí para subir.", "-863586176": "Arrastre y suelte un archivo o haga clic para examinar sus archivos.", "-723198394": "El tamaño del archivo debe ser de 8MB o menos", @@ -2371,8 +2364,6 @@ "-1100235269": "Sector laboral", "-684388823": "Valor neto estimado", "-509054266": "Volumen de negocios anual anticipado", - "-601903492": "Experiencia en operación con Forex", - "-1012699451": "Experiencia de operación con CFD", "-1588485629": "Ejemplo", "-1117345066": "Elija el tipo de documento", "-651192353": "Ejemplo:", @@ -2394,11 +2385,11 @@ "-1088324715": "Revisaremos sus documentos y le avisaremos de su estado en un plazo de 1 a 3 días laborables.", "-329713179": "Ok", "-1176889260": "Seleccione un tipo de documento.", - "-1926456107": "La identificación que envió caducó.", - "-555047589": "Parece que su documento de identidad ha caducado. Vuelva a intentarlo con un documento válido.", + "-1926456107": "El documento de identidad que ha enviado ha expirado.", + "-555047589": "Parece que su documento de identidad ha expirado. Por favor, inténtelo de nuevo con un documento válido.", "-841187054": "Intentar de nuevo", "-2097808873": "No pudimos verificar su identidad con los detalles que proporcionó. ", - "-228284848": "No pudimos verificar su identidad con los detalles que proporcionó.", + "-228284848": "No hemos podido verificar su identidad con los detalles que nos ha facilitado.", "-1391934478": "Su identidad está verificada. También deberá presentar una prueba de su domicilio.", "-118547687": "Verificación de identidad aprobada", "-200989771": "Ir a detalles personales", @@ -2464,12 +2455,40 @@ "-142444667": "Haga clic en el enlace del correo electrónico para cambiar su contraseña Deriv MT5.", "-742748008": "Compruebe su correo electrónico y haga clic en el enlace del mismo para continuar.", "-84068414": "¿Todavía no ha recibido el correo electrónico? Contáctenos a través del <0>chat en vivo.", + "-975118358": "Su cuenta se abrirá con {{legal_entity_name}}, regulada por la Autoridad de Servicios Financieros de Malta, y estará sujeta a las leyes de Malta.", + "-2073934245": "Los servicios del trading financiero ofrecidos en este sitio solo son adecuados para clientes que aceptan la posibilidad de perder todo el dinero que invierten y que entienden y tienen experiencia del riesgo involucrado en la compra de contratos financieros. Las transacciones en contratos financieros conllevan un alto grado de riesgo. Si los contratos que compró expiran sin valor, perderá toda su inversión, que incluye la prima del contrato.", + "-1125193491": "Añadir cuenta", + "-2068229627": "No soy una PEP, y no he sido una PEP en los últimos 12 meses.", + "-186841084": "Cambie su correo de inicio de sesión", + "-907403572": "Para cambiar su dirección de correo electrónico, primero tendrá que desvincular su dirección de correo electrónico de su cuenta {{identifier_title}}.", + "-1850792730": "Desvincular de {{identifier_title}}", "-428335668": "Deberá establecer una contraseña para completar el proceso.", - "-818898181": "El nombre en el documento no coincide con su perfil Deriv.", + "-1232613003": "<0>Verificación fallida. <1>¿Por qué?", + "-2029508615": "<0>Necesita verificación. <1>Verificar ahora", + "-818898181": "El nombre en el documento no coincide con su perfil de Deriv.", "-310316375": "La dirección del documento no coincide con la dirección que introdujo anteriormente.", - "-485368404": "Documento expedido hace más de 6 meses.", + "-485368404": "Documento emitido hace más de 6 meses.", "-367016488": "Documento borroso. Toda la información debe ser clara y visible.", "-1957076143": "Documento recortado. Toda la información debe ser clara y visible.", + "-231863107": "No", + "-870902742": "¿Cuántos conocimientos y experiencia tiene en relación al trading en línea?", + "-1929477717": "Tengo un título académico, una certificación profesional y/o experiencia laboral relacionada con los servicios financieros.", + "-1540148863": "He asistido a seminarios, capacitaciones y/o talleres relacionados con el trading.", + "-922751756": "Menos de un año", + "-542986255": "Ninguna", + "-1337206552": "En su opinión, el trading con CFD le permite", + "-456863190": "Coloque una posición sobre el movimiento del precio de un activo en la que el resultado sea una rentabilidad fija o nada en absoluto.", + "-1314683258": "Realizar una inversión a largo plazo para obtener beneficios garantizados.", + "-1546090184": "¿Cómo afecta el apalancamiento al trading con CFD?", + "-1636427115": "El apalancamiento le ayuda a mitigar el riesgo.", + "-800221491": "El apalancamiento garantiza las ganancias.", + "-811839563": "El apalancamiento le permite abrir posiciones grandes por una fracción del valor de la operación, lo que puede resultar en un aumento de las ganancias o pérdidas.", + "-1185193552": "Cerrar su operación automáticamente cuando la pérdida sea igual o superior a una cantidad específica, siempre que haya una liquidez de mercado adecuada.", + "-1046354": "Cerrar su operación automáticamente cuando el beneficio sea igual o superior a una cantidad específica, siempre que haya una liquidez de mercado adecuada.", + "-1842858448": "Obtener un beneficio garantizado en su operación.", + "-860053164": "Al operar con multiplicadores.", + "-1250327770": "Al comprar acciones de una empresa.", + "-1222388581": "Todas las anteriores.", "-1515286538": "Ingrese su número de documento. ", "-1694758788": "Ingrese su número de documento", "-1458676679": "Debería ingresar de 2 a 50 caracteres.", @@ -2479,6 +2498,8 @@ "-1437017790": "Información financiera", "-70342544": "Estamos legalmente obligados a solicitar su información financiera.", "-39038029": "Experiencia de operación", + "-601903492": "Experiencia en operación con Forex", + "-1012699451": "Experiencia de operación con CFD", "-1894668798": "Experiencia en otros instrumentos comerciales", "-1026468600": "Frecuencia de otros instrumentos comerciales", "-1743024217": "Seleccionar idioma", @@ -2489,6 +2510,11 @@ "-536187647": "¿Confirmar la suspención de acceso?", "-1357606534": "Permiso", "-570222048": "Revocar el acceso", + "-80717068": "Aplicaciones que ha vinculado a su <0>contraseña de Deriv:", + "-340060402": "Su contraseña Deriv X es para iniciar sesión en sus cuentas Deriv X en la web y aplicaciones móviles.", + "-619126443": "Utilice su <0>contraseña Deriv para iniciar sesión en {{brand_website_name}} y {{platform_name_trader}}.", + "-623760979": "Utilice la <0>contraseña Deriv para acceder a {{brand_website_name}}, {{platform_name_trader}} y {{platform_name_go}}.", + "-459147994": "Utilice la <0>contraseña Deriv para acceder a {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} y {{platform_name_ctrader}}.", "-1526404112": "Factura de servicios públicos: factura de electricidad, agua, gas o teléfono fijo.", "-537552700": "Contrato de alquiler de vivienda: contrato válido y vigente.", "-890084320": "Guardar y enviar", @@ -2510,11 +2536,20 @@ "-362324454": "Materias primas", "-1071336803": "Plataforma", "-820028470": "Opciones y Multiplicadores", - "-1255879419": "Trader's Hub", + "-1186807402": "Transferir", + "-224804428": "Transacciones", + "-470018967": "Reiniciar saldo", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Restablecer", "-213142918": "Los depósitos y retiros no están disponibles temporalmente ", - "-224804428": "Transacciones", - "-1186807402": "Transferir", "-1308346982": "Derivada", "-1145604233": "Opere con CFD en MT5 con índices derivados que simulan los movimientos del mercado en el mundo real.", "-328128497": "Financiera", @@ -2525,15 +2560,29 @@ "-81256466": "Necesita una cuenta Deriv para crear una cuenta de CFD.", "-699372497": "Opere con apalancamiento y spreads ajustados para obtener mejores rendimientos en operaciones exitosas. <0>Saber más", "-1884966862": "Obtenga más cuentas Deriv MT5 de diferentes tipos y jurisdicciones.", - "-145462920": "Deriv cTrader", "-982095728": "Obtener", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Exención de responsabilidad legal de la UE: Los CFDs son instrumentos complejos e implican un alto riesgo de perder dinero rápidamente debido al apalancamiento. <0>El 73% de las cuentas de inversores minoristas pierden dinero cuando operan con CFD con este proveedor. Debe considerar si entiende cómo funcionan los CFD y si puede permitirse el riesgo de perder su dinero.", "-1277942366": "Total de activos", + "-1255879419": "Trader's Hub", "-493788773": "Fuera de la UE", "-673837884": "UE", "-230566990": "Los siguientes documentos que presentó no pasaron nuestras comprobaciones:", "-846812148": "Prueba de domicilio.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Reglamento extracomunitario", "-643108528": "Regulación comunitario y extracomunitario", + "-979459594": "Buy/Sell", + "-494667560": "Ordenes", + "-679691613": "Mis anuncios", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Cuenta de multiplicadores", "-744999940": "Cuenta Deriv", @@ -2542,10 +2591,21 @@ "-1814994113": "CFD <0>{{compare_accounts_title}}", "-318106501": "Opere con CFD en MT5 con nuestros sintéticos, cestas y FX derivadas.", "-1328701106": "Opere con CFD en MT5 en forex, acciones, índices bursátiles, sintéticos, criptomonedas y materias primas.", - "-1173266642": "Esta cuenta ofrece CFD en una plataforma de negociación rica en funciones.", - "-1290112064": "Deriv EZ", + "-1173266642": "Esta cuenta ofrece CFD en una plataforma de operaciones rica en funciones.", "-1453519913": "Opere con CFDs en una plataforma fácil de usar con todos sus activos favoritos.", "-2051096382": "Obtenga una variedad de pagos al predecir correctamente los movimientos del mercado con <0>las opciones, o saque provecho de los CFD sin arriesgar más de lo que apostó inicialmente con los <1>multiplicadores.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Elección del reglamento", "-249184528": "Puede crear cuentas reales según la normativa comunitaria o extracomunitaria. Haga clic en el <0><0/>icono para obtener más información sobre estas cuentas.", "-1505234170": "Tour por el Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Recargue su cuenta", "-1945421757": "Una vez que tenga una cuenta, haga clic en \"Depositar\" o \"Transferir\" para añadir fondos a una cuenta", "-1965920446": "Comience a operar", - "-33612390": "<0>Exención de responsabilidad legal de la UE: Los CFDs son instrumentos complejos e implican un alto riesgo de perder dinero rápidamente debido al apalancamiento. <0>El 73% de las cuentas de inversores minoristas pierden dinero cuando operan con CFD con este proveedor. Debe considerar si entiende cómo funcionan los CFD y si puede permitirse el riesgo de perder su dinero.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Este campo es obligatorio.", "-1870909526": "Nuestro servidor no puede recuperar una dirección.", "-582721696": "La cantidad de retiro permitido actualmente es de {{format_min_withdraw_amount}} a {{format_max_withdraw_amount}} {{currency}}", @@ -2607,7 +2681,7 @@ "-379487596": "{{selected_percentage}}% del saldo disponible ({{format_amount}} {{currency__display_code}})", "-1957498244": "más", "-1059419768": "Notas", - "-285921910": "Más información sobre los <0>métodos de pago.", + "-285921910": "Aprenda más sobre los <0>métodos de pago.", "-316545835": "Asegúrese de que <0>todos los datos sean <0>correctos antes de realizar la transferencia.", "-949073402": "Confirmo que he verificado la información de transferencia del cliente.", "-1752211105": "Transferir ahora", @@ -2622,14 +2696,14 @@ "-1525882769": "No se ha podido realizar su retiro. Le hemos enviado un correo electrónico con más información.", "-298601922": "Su retiro se ha realizado con éxito.", "-1463156905": "Aprenda más sobre los métodos de pago", - "-1236567184": "Esta es su <0>{{regulation}}{{currency}} cuenta {{loginid}}.", + "-1236567184": "Esta es su cuenta <0>{{regulation}}{{currency}} {{loginid}}.", "-1547606079": "Aceptamos las siguientes criptomonedas:", "-1517325716": "Deposite a través de los siguientes métodos de pago:", "-639677539": "Comprar criptomonedas", "-1560098002": "Comprar criptomonedas a través de fiat onramp", "-541870313": "Depositar a través de agentes de pago", "-197251450": "¿No quiere comerciar en {{currency_code}}? Puede abrir otra cuenta de criptomoneda.", - "-91824739": "Depósito {{currency}}", + "-91824739": "Depositar {{currency}}", "-523804269": "{{amount}} {{currency}} el {{date}}", "-494847428": "Dirección: <0>{{value}}", "-1117977576": "Confirmaciones: <0>{{value}}", @@ -2637,9 +2711,9 @@ "-1744490898": "Lamentablemente, no podemos recuperar la información en este momento. ", "-515809216": "Envíe solo {{currency_name}} ({{currency_code}}) a esta dirección.", "-1589407981": "Para evitar la pérdida de fondos:", - "-1042704302": "Asegúrese de copiar correctamente la dirección de su cuenta Deriv en su criptobilletera.", - "-80329359": "<0>Nota: Recibirá un correo electrónico cuando se empiece a procesar su ingreso.", - "-2108344100": "¿Busca una forma de comprar criptodivisas? <0>Pruebe Fiat onramp.", + "-1042704302": "Asegúrese de copiar correctamente la dirección de su cuenta Deriv en su billetera de cripto.", + "-80329359": "<0>Nota: Recibirá un correo electrónico cuando se empiece a procesar su depósito.", + "-2108344100": "¿Busca una forma de comprar criptomonedas? <0>Pruebe Fiat onramp.", "-598073640": "Sobre Tether (Ethereum)", "-275902914": "Tether en Ethereum (eUSDT)", "-1188009792": "Tether en Omni Layer (USDT)", @@ -2703,6 +2777,7 @@ "-1707299138": "La dirección de su monedero {{currency_symbol}}", "-38063175": "{{account_text}} billetera", "-705272444": "Adjunte una prueba de identidad para verificación", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Esto es para proteger su cuenta de retiros no autorizados.", "-130833284": "Tenga en cuenta que sus límites de retiro máximo y mínimo no son fijos. Cambian debido a la alta volatilidad de las criptomonedas.", "-1531269493": "Le enviaremos un correo electrónico una vez que su transacción haya sido procesada.", @@ -2859,6 +2934,30 @@ "-1016171176": "Activo", "-621128676": "Tipo de operación", "-447853970": "Umbral de pérdida", + "-155173714": "¡Construyamos un bot!", + "-1919212468": "3. También puede buscar los bloques que desee utilizando la barra de búsqueda situada encima de las categorías.", + "-1520558271": "Para más información, revise este artículo del blog sobre los fundamentos de la construcción de un bot de trading.", + "-980360663": "3. Elija el bloque que desee y arrástrelo al espacio de trabajo.", + "-1493168314": "¿Qué es una estrategia rápida?", + "-1680391945": "Usar una estrategia rápida", + "-1177914473": "¿Cómo puedo guardar mi estrategia?", + "-271986909": "En Bot Builder, haga clic en Guardar en la barra de herramientas de la parte superior para descargar su bot. Dele un nombre a su bot y elija descargarlo en su dispositivo o en Google Drive. El bot se descargará como un archivo XML.", + "-1149045595": "1. Tras pulsar Importar, seleccione Local y haga clic en Continuar.", + "-288041546": "2. Seleccione su archivo XML y pulse Abrir.", + "-2127548288": "3. Su bot se cargará consecuentemente.", + "-1311297611": "1. Después de pulsar Importar, seleccione Google Drive y haga clic en Continuar.", + "-1549564044": "¿Cómo reinicio el espacio de trabajo?", + "-1127331928": "En Bot Builder, pulse Reiniciar en la parte superior de la barra de herramientas. Esto despejará el espacio de trabajo. Tenga en cuenta que los cambios que no se hayan guardado se perderán.", + "-1720444288": "¿Cómo controlo mis pérdidas con Deriv Bot?", + "-1142295124": "Hay varias formas de controlar sus pérdidas con Deriv Bot. He aquí un ejemplo sencillo de cómo puede implementar el control de pérdidas en su estrategia:", + "-986689483": "1. Cree las siguientes variables:", + "-269910127": "3. Actualice la ganancia/pérdida actual con la ganancia del último contrato. Si ha perdido en el último contrato, el valor de la aganancia/pérdida actual será negativo.", + "-1565344891": "¿Puedo ejecutar Deriv Bot en varias pestañas de mi navegador web?", + "-90192474": "Sí, puede. Sin embargo, su cuenta tiene límites, como el número máximo de posiciones abiertas y los pagos totales máximos de las posiciones abiertas. Por lo tanto, tenga en cuenta estos límites al abrir varias posiciones. Puede encontrar más información sobre estos límites en Ajustes > Límites de cuenta.", + "-213872712": "No, no ofrecemos criptomonedas en Deriv Bot.", + "-2147346223": "¿En qué países está disponible Deriv Bot?", + "-352345777": "¿Cuáles son las estrategias más populares para las operaciones automatizadas?", + "-552392096": "Tres de las estrategias más utilizadas en el trading automatizado son Martingale, D'Alembert y Oscar's Grind - puede encontrarlas todas listas y esperándole en Deriv Bot.", "-507620484": "No guardado", "-764102808": "Google Drive", "-555886064": "Ganado", @@ -2900,9 +2999,9 @@ "-1127164953": "¡Hola! Presiona <0>Comenzar para un recorrido rápido.", "-358288026": "Nota: También puede encontrar este tutorial en la pestaña <0>Tutoriales.", "-1793577405": "Construir desde cero", - "-358753028": "Crea tu bot con nuestros bloques de arrastrar y soltar o haz clic en Estrategia rápida para elegir entre las plantillas de bots listas para usar.", + "-358753028": "Cree su bot con nuestros bloques de arrastrar y soltar o haga clic en Estrategia Rápida para elegir entre las plantillas de bots listas para usar.", "-1212601535": "Supervise el mercado", - "-21136101": "Comprueba el rendimiento de tu bot en tiempo real.", + "-21136101": "Compruebe el rendimiento de su bot en tiempo real.", "-631097919": "Haga clic en <0>Ejecutar cuando desee empezar a operar y haga clic en <0>Detener cuando desee dejar de operar.", "-1999747212": "¿Desea volver a hacer el tour?", "-129587613": "¡Entiendo, gracias!", @@ -2937,30 +3036,6 @@ "-1823621139": "Estrategia rápida", "-1778025545": "Ha importado correctamente un bot.", "-1519425996": "No se han encontrado resultados \"{{ faq_search_value }}\"", - "-155173714": "¡Construyamos un bot!", - "-1919212468": "3. También puede buscar los bloques que desee utilizando la barra de búsqueda situada encima de las categorías.", - "-1520558271": "Para más información, revise este artículo del blog sobre los fundamentos de la construcción de un bot de trading.", - "-980360663": "3. Elija el bloque que desee y arrástrelo al espacio de trabajo.", - "-1493168314": "¿Qué es una estrategia rápida?", - "-1680391945": "Usar una estrategia rápida", - "-1177914473": "¿Cómo puedo guardar mi estrategia?", - "-271986909": "En Bot Builder, haga clic en Guardar en la barra de herramientas de la parte superior para descargar su bot. Dele un nombre a su bot y elija descargarlo en su dispositivo o en Google Drive. El bot se descargará como un archivo XML.", - "-1149045595": "1. Tras pulsar Importar, seleccione Local y haga clic en Continuar.", - "-288041546": "2. Seleccione su archivo XML y pulse Abrir.", - "-2127548288": "3. Su bot se cargará consecuentemente.", - "-1311297611": "1. Después de pulsar Importar, seleccione Google Drive y haga clic en Continuar.", - "-1549564044": "¿Cómo reinicio el espacio de trabajo?", - "-1127331928": "En Bot Builder, pulse Reiniciar en la parte superior de la barra de herramientas. Esto despejará el espacio de trabajo. Tenga en cuenta que los cambios que no se hayan guardado se perderán.", - "-1720444288": "¿Cómo controlo mis pérdidas con Deriv Bot?", - "-1142295124": "Hay varias formas de controlar sus pérdidas con Deriv Bot. He aquí un ejemplo sencillo de cómo puede implementar el control de pérdidas en su estrategia:", - "-986689483": "1. Cree las siguientes variables:", - "-269910127": "3. Actualice la ganancia/pérdida actual con la ganancia del último contrato. Si se perdió el último contrato, el valor de la ganancia/pérdida actual será negativo.", - "-1565344891": "¿Puedo ejecutar Deriv Bot en varias pestañas de mi navegador web?", - "-90192474": "Sí, puede. Sin embargo, su cuenta tiene límites, como el número máximo de posiciones abiertas y los pagos totales máximos de las posiciones abiertas. Por lo tanto, tenga en cuenta estos límites al abrir varias posiciones. Puede encontrar más información sobre estos límites en Ajustes > Límites de cuenta.", - "-213872712": "No, no ofrecemos criptomonedas en Deriv Bot.", - "-2147346223": "¿En qué países está disponible Deriv Bot?", - "-352345777": "¿Cuáles son las estrategias más populares para las operaciones automatizadas?", - "-552392096": "Tres de las estrategias más utilizadas en el trading automatizado son Martingale, D'Alembert y Oscar's Grind - puede encontrarlas todas listas y esperándole en Deriv Bot.", "-418247251": "Descargar su diario.", "-2123571162": "Descargar", "-870004399": "<0>Comprado: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Cuenta desactivada", "-1837059346": "Comprar / Vender", "-1845037007": "Página del anunciante", - "-494667560": "Ordenes", - "-679691613": "Mis anuncios", "-821418875": "Trader", "-679102561": "Detalles del contrato", "-430118939": "Política de quejas", @@ -3082,7 +3155,6 @@ "-430041639": "Su prueba de domicilio no ha superado nuestras comprobaciones de verificación y hemos impuesto algunas restricciones a su cuenta. Vuelva a enviar su prueba de domicilio.", "-87177461": "Vaya a la configuración de su cuenta y complete los datos personales para permitir los depósitos.", "-904632610": "Reinicie su saldo", - "-470018967": "Reiniciar saldo", "-156611181": "Complete la evaluación financiera en la configuración de su cuenta para desbloquearla.", "-1925176811": "No se pueden procesar retiros en este momento", "-980696193": "Los retiros no están disponibles temporalmente debido al mantenimiento del sistema. Puede hacer retiros cuando se complete el mantenimiento.", @@ -3107,12 +3179,12 @@ "-577279362": "Envíe su prueba de identidad para verificar su cuenta y seguir operando.", "-197134911": "Su prueba de identidad está caducada", "-152823394": "Su prueba de identidad está caducada. Envíe una nueva prueba de identidad para verificar su cuenta y seguir operando.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Siga estas sencillas instrucciones para solucionarlo.", "-2142540205": "Parece que la dirección en su documento no coincide con la dirección en su perfil Deriv. Actualice sus datos personales con la dirección correcta.", "-482715448": "Ir a Datos personales", "-2072411961": "Su prueba de domicilio ha sido verificada", "-384887227": "Actualice la dirección en su perfil.", - "-448961363": "no perteneciente a la UE", "-1998049070": "Si acepta nuestro uso de cookies, haga clic en Aceptar. Para obtener más información, <0>consulte nuestra política.", "-402093392": "Añadir cuenta Deriv", "-1721181859": "Necesitará una cuenta de {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Pantalla completa", "-1823504435": "Ver notificaciones", "-1954045170": "Ninguna moneda seleccionada", - "-583559763": "Menú", "-1591792668": "Límites de la cuenta", "-34495732": "Información reglamentaria", "-1496158755": "Ir a Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "La Comisión Financiera acepta apelaciones durante los 45 días posteriores a la fecha del incidente y solo después de que el trader haya tratado de resolver el problema directamente con la empresa.", "-1825471709": "Una experiencia de operaciones completamente nueva en una plataforma potente pero fácil de usar.", "-981017278": "Operaciones automatizadas a tu alcance. No se necesita conocimiento de codificación.", + "-583559763": "Menú", "-778309978": "El enlace que ha pulsado ha expirado. Asegúrese de hacer clic en el enlace del último correo electrónico que haya recibido. Como alternativa, introduzca su correo electrónico a continuación y haga clic en <0>Reenviar correo electrónico para obtener un nuevo enlace.", "-336222114": "Siga estos sencillos pasos para solucionarlo:", "-1064116456": "Busque el bróker <0>Deriv Holdings (Guernsey) Limited y selecciónelo.", @@ -3313,12 +3385,12 @@ "-435524000": "Verificación fallida. Vuelva a enviarlo durante la creación de la cuenta.", "-1385099152": "Su documento está verificado.", "-931599668": "ETF", - "-651501076": "Derivado: SVG", - "-865172869": "Financiero - BVI", - "-1851765767": "Finanzas - Vanuatu", - "-558597854": "Finanzas - Labuan", - "-2052425142": "Sin intercambio - SVG", - "-1192904361": "Demostración de Deriv X", + "-651501076": "Derivados - SVG", + "-865172869": "Financiera - BVI", + "-1851765767": "Financiera - Vanuatu", + "-558597854": "Financiera - Labuan", + "-2052425142": "Sin swaps - SVG", + "-1192904361": "Demo de Deriv X", "-1269597956": "Plataforma MT5", "-239789243": "(Número de licencia SIBA/L/18/1114)", "-1434036215": "Financiera demo", @@ -3351,7 +3423,7 @@ "-1922462747": "Trader's hub", "-700260448": "demo", "-1769158315": "real", - "-2015785957": "Compare las cuentas de CFDs ( {{demo_title}} )", + "-2015785957": "Compare las cuentas de CFD {{demo_title}}", "-673424733": "Cuenta demo", "-1986258847": "El mantenimiento del servidor empieza a las 01:00 GMT todos los domingos. Este proceso puede durar hasta 2 horas en completarse. El servicio puede ser interrumpido durante este tiempo.", "-1199152768": "Explore nuestras otras plataformas.", @@ -3393,17 +3465,17 @@ "-637537305": "Descargue {{ platform }} en su teléfono para operar con la cuenta {{ platform }} {{ account }}", "-678964540": "a", "-206829624": "(1:x)", - "-616293830": "Disfrute de un apalancamiento dinámico de <0>hasta 1:1500 al operar con instrumentos seleccionados en los mercados de divisas, materias primas, criptomonedas e índices bursátiles. Nuestro apalancamiento dinámico se ajusta automáticamente a su posición de negociación, según el tipo de activo y el volumen de operaciones.", + "-616293830": "Disfrute de un apalancamiento dinámico de <0>hasta 1:1500 al operar con instrumentos seleccionados en los mercados de divisas, materias primas, criptomonedas e índices bursátiles. Nuestro apalancamiento dinámico se ajusta automáticamente a su posición, según el tipo de activo y el volumen de operaciones.", "-2042845290": "Su contraseña de inversionista ha sido cambiada.", "-1882295407": "Su contraseña sido cambiada.", "-254497873": "Use esta contraseña para otorgar acceso de visualización a otro usuario. Aunque puedan ver su cuenta de operaciones, no podrán operar ni realizar ninguna otra acción.", "-161656683": "Actual contraseña de inversor", "-374736923": "Nueva contraseña de inversor", "-1793894323": "Crear o restablecer la contraseña de inversor", - "-21438174": "Añada su cuenta Deriv cTrader bajo Deriv (SVG) LLC (número de empresa 273 LLC 2020).", + "-21438174": "Añada su cuenta Deriv cTrader bajo Deriv (SVG) LLC (número de compañía 273 LLC 2020).", "-2026018074": "Añada su cuenta Deriv MT5 <0>{{account_type_name}} en Deriv (SVG) LLC (número de empresa 273 LLC 2020).", "-162320753": "Añada su cuenta Deriv MT5 <0>{{account_type_name}} en Deriv (BVI) Ltd, regulada por la Comisión de Servicios Financieros de las Islas Vírgenes Británicas (núm. de licencia SIBA/L/18/114).", - "-271828350": "Saque más provecho de Deriv MT5 Financial", + "-271828350": "Obtenga más de Deriv MT5 Financiera", "-2125860351": "Elija una jurisdicción para su cuenta Deriv MT5 CFD", "-450424792": "Necesita una cuenta real (moneda fiduciaria o criptomoneda) en Deriv para crear una cuenta Deriv MT5 real.", "-1760596315": "Crear una cuenta Deriv", @@ -3415,22 +3487,6 @@ "-1282933308": "No {{barrier}}", "-968190634": "Iguales a {{barrier}}", "-1747377543": "Debajo de {{barrier}}", - "-256210543": "No se puede operar en este momento.", - "-1150099396": "Estamos trabajando para tenerlo disponible pronto. Si tiene otra cuenta, cambie a esa cuenta para continuar operando. Puede agregar una Financiera Deriv MT5.", - "-28115241": "{{platform_name_trader}} no está disponible para esta cuenta", - "-453920758": "Ir al panel de control de {{platform_name_mt5}}", - "-402175529": "Historial", - "-902712434": "Cancelación del contrato", - "-988484646": "Cancelación del contrato (ejecutado)", - "-444882676": "Cancelación del contrato (activo)", - "-13423018": "ID de Referencia", - "-2035315547": "Barrera inferior", - "-1551639437": "Sin historial", - "-1214703885": "Aún tiene que actualizar el take profit o el stop loss", - "-504849554": "Se volverá a abrir a las", - "-59803288": "Mientras tanto, pruebe nuestros índices sintéticos que simulan la volatilidad del mercado real y están abiertos las 24 horas del día, los 7 días de la semana.", - "-1278109940": "Ver mercados abiertos", - "-694105443": "Este mercado está cerrado", "-1043795232": "Posiciones recientes", "-1511825574": "Ganancia/Pérdida:", "-726626679": "Ganancia/pérdida potencial:", @@ -3455,21 +3511,15 @@ "-1435392215": "Acerca de la cancelación del contrato", "-2017825013": "Entendido", "-1192773792": "No volver a mostrar esto", + "-902712434": "Cancelación del contrato", "-1280319153": "Cancela sus operaciones en cualquier momento dentro de un período de tiempo dado. Se ejecuta automáticamente si su operación alcanza el nivel de stop out durante un período determinado.", "-471757681": "Gestión de riesgos", "-843831637": "Stop loss", "-771725194": "Cancelación del contrato", "-338707425": "La duración mínima es de 1 día", "-1003473648": "Duración: {{duration}} día", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "El pago al vencimiento es igual al pago por punto multiplicado por la diferencia entre el precio final y el precio de ejercicio.", "-1527492178": "Compra bloqueada", "-725375562": "Puede bloquear / desbloquear el botón de compra desde el menú Configuración", - "-774638412": "La apuesta debe estar entre {{min_stake}} {{currency}} y {{max_stake}} {{currency}}", - "-1358367903": "Inversión", - "-434270664": "Precio actual", - "-1956787775": "Precio de Barrera:", - "-1513281069": "Barrera 2", "-390994177": "Debe estar entre {{min}} y {{max}}", "-1804019534": "Expiración: {{date}}", "-2055106024": "Alternar entre la configuración de duración avanzada y simple", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "por encima", "-857660728": "Precio de ejecución", + "-1358367903": "Inversión", "-1386326276": "La barrera es un campo obligatorio.", "-1418742026": "La barrera superior debe ser superior a la barrera inferior.", "-92007689": "La barrera inferior debe ser inferior a la barrera superior.", @@ -3491,6 +3542,21 @@ "-1975910372": "Los minutos deben ser entre 0 y 59.", "-866277689": "La hora de expiración no puede estar en el pasado.", "-1455298001": "Ahora", + "-256210543": "No se puede operar en este momento.", + "-1150099396": "Estamos trabajando para tenerlo disponible pronto. Si tiene otra cuenta, cambie a esa cuenta para continuar operando. Puede agregar una Financiera Deriv MT5.", + "-28115241": "{{platform_name_trader}} no está disponible para esta cuenta", + "-453920758": "Ir al panel de control de {{platform_name_mt5}}", + "-402175529": "Historial", + "-988484646": "Cancelación del contrato (ejecutado)", + "-444882676": "Cancelación del contrato (activo)", + "-13423018": "ID de Referencia", + "-2035315547": "Barrera inferior", + "-1551639437": "Sin historial", + "-1214703885": "Aún tiene que actualizar el take profit o el stop loss", + "-504849554": "Se volverá a abrir a las", + "-59803288": "Mientras tanto, pruebe nuestros índices sintéticos que simulan la volatilidad del mercado real y están abiertos las 24 horas del día, los 7 días de la semana.", + "-1278109940": "Ver mercados abiertos", + "-694105443": "Este mercado está cerrado", "-439389714": "Estamos trabajando en ello", "-770929448": "Ir a {{platform_name_smarttrader}}", "-347156282": "Enviar prueba", @@ -3537,6 +3603,8 @@ "-454245976": "Si cree que el precio de mercado caerá continuamente durante un período específico, elija <0>Short. Recibirás un pago en el momento de vencimiento si el precio de mercado no toca o cruza la barrera. Su pago aumentará proporcionalmente a la distancia entre el precio de mercado y la barrera si no se supera la barrera. Comenzará a obtener ganancias cuando el pago sea superior a su inversión. Si el precio de mercado alguna vez cruza la barrera, no habrá ningún pago.", "-351875097": "Número de ticks", "-729830082": "Ver menos", + "-1669741470": "El pago al vencimiento es igual al pago por punto multiplicado por la diferencia entre el precio final y el precio de ejercicio.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NUEVO!", "-993480898": "Acumuladores", "-45873457": "NUEVO", @@ -3557,6 +3625,10 @@ "-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 ticks.", "-438655760": "<0>Nota: Puede cerrar su operación en cualquier momento. Sea consciente del riesgo de deslizamiento.", + "-774638412": "La apuesta debe estar entre {{min_stake}} {{currency}} y {{max_stake}} {{currency}}", + "-434270664": "Precio actual", + "-1956787775": "Precio de Barrera:", + "-1513281069": "Barrera 2", "-1683683754": "Larga", "-1046859144": "<0>{{title}} Recibirá un pago si el precio de mercado se mantiene en {{price_position}} y no toca ni cruza la barrera. De lo contrario, el pago será cero.", "-1815023694": "encima de la barrera", diff --git a/packages/translations/src/translations/fr.json b/packages/translations/src/translations/fr.json index a6e0b0030d85..8591ea2f775c 100644 --- a/packages/translations/src/translations/fr.json +++ b/packages/translations/src/translations/fr.json @@ -24,7 +24,6 @@ "27731356": "Votre compte est temporairement désactivé. Veuillez nous contacter via <0>le chat en direct pour réactiver les dépôts et les retraits.", "27830635": "Deriv (V) Ltd", "28581045": "Ajouter un compte réel MT5", - "30801950": "Votre compte sera ouvert auprès de {{legal_entity_name}}, réglementé par la Malta Gaming Authority, et sera soumis aux lois de Malte.", "33433576": "Veuillez utiliser un portefeuille électronique pour retirer vos fonds.", "35089987": "Téléchargez le recto et le verso de votre permis de conduire.", "41737927": "Merci", @@ -60,11 +59,13 @@ "72500774": "Veuillez renseigner la résidence fiscale.", "73086872": "Vous vous êtes auto-exclu pour trader", "73326375": "Le plus bas est le point le plus bas jamais atteint par le marché pendant la durée du contrat.", + "74836780": "{{currency_code}} Wallet", "74963864": "En dessous", "76916358": "Vous avez atteint la limite de retrait.<0/>Veuillez télécharger vos justificatifs d'identité et de domicile pour lever la limite et poursuivre votre retrait.", "76925355": "Vérifiez les performances de votre bot", "77945356": "Tradez où que vous soyez grâce à notre application mobile.", "77982950": "Les options Vanilla vous permettent de prédire l'évolution à la hausse (haussière) ou à la baisse (baissière) de l'actif sous-jacent en achetant un contrat de type « Call » ou « Put ».", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Nous n'avons pas pu trouver cette page", "82839270": "Téléchargez la page de votre passeport avec votre photo.", "83202647": "Réduire le bloc", @@ -76,6 +77,7 @@ "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. Cliquez sur Réinitialiser en bas du panneau des statistiques.", + "93939827": "Cryptocurrency accounts", "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", @@ -83,6 +85,7 @@ "102226908": "Case à remplir", "108916570": "Durée: {{duration}} jours", "109073671": "Veuillez utiliser un portefeuille électronique que vous avez déjà utilisé pour vos dépôts. Assurez-vous que le portefeuille électronique prend en charge les retraits. Consultez la liste des portefeuilles électroniques qui prennent en charge les retraits <0>ici.", + "110822969": "One Wallet for all your transactions", "111215238": "Éloignez-vous de la lumière directe", "111718006": "Date de fin", "111931529": "Max. mise totale sur 7 jours", @@ -215,7 +218,9 @@ "251882697": "Merci ! Votre réponse a été enregistrée dans notre système.<0/><0/> Cliquez sur « OK » pour continuer.", "254912581": "Ce bloc est similaire à EMA, sauf qu'il vous donne la ligne EMA entière basée sur la liste d'entrée et la période donnée.", "256031314": "Trésorerie entreprise", + "256123827": "What happens to my trading accounts", "256602726": "Si vous fermez votre compte :", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Évaluation des transactions", "260069181": "Une erreur est survenue lors de la tentative de chargement de l'URL", @@ -250,8 +255,8 @@ "284527272": "contraire", "284772879": "Contrat", "284809500": "Démo financière", + "285909860": "Demo {{currency}} Wallet", "287934290": "Êtes-vous certain de vouloir annuler cette transaction ?", - "289898640": "CONDITIONS D'UTILISATION", "291744889": "<0>1. Paramètres de trading : <0>", "291817757": "Visitez notre communauté Deriv et découvrez les API, les jetons d'API, les façons d'utiliser les API Deriv, et bien plus encore.", "292491635": "Si vous sélectionnez «Stop loss» et spécifiez un montant pour limiter votre perte, votre position sera clôturée automatiquement lorsque votre perte est supérieure ou égale à ce montant. Votre perte peut être supérieure au montant que vous avez entré en fonction du prix du marché à la clôture.", @@ -299,6 +304,7 @@ "344418897": "Ces limites de trading et l'auto-exclusion vous aident à contrôler le montant d'argent et le temps que vous passez sur {{brand_website_name}} et à pratiquer un <0>trading responsable.", "345320063": "Horodatage non valide", "345818851": "Désolé, une erreur interne s'est produite. Cliquez sur la case à cocher ci-dessus pour réessayer.", + "346214602": "A better way to manage your funds", "347029309": "Forex : standard/micro", "347039138": "Itérer (2)", "347217485": "Vous n'arrivez pas à accéder à Deriv MT5 sur votre mobile ?", @@ -353,6 +359,7 @@ "401345454": "Pour ce faire, rendez-vous dans l'onglet Tutoriels.", "402343402": "En raison d'un problème sur notre serveur, certains de vos comptes {{platform}} ne sont pas disponibles pour le moment. Merci de votre patience.", "403456289": "La formule pour SMA est la suivante:", + "403608958": "Select a trading account or a Wallet", "404743411": "Dépôts Totaux", "406359555": "Détails du contrat", "406497323": "Vendez votre contrat actif si nécessaire (facultatif)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Votre intervalle de temps préféré entre chaque rapport:", "431267979": "Voici un guide rapide sur comment utiliser Deriv Bot lorsque vous êtes en déplacement.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Take Profit: {{ currency }} {{ take_profit }}", "432519573": "Document téléchargé", @@ -453,12 +461,12 @@ "518955798": "7. Exécuter une fois au démarrage", "520136698": "Indice Boom 500", "521872670": "élément", - "522283618": "Expérience de trading d’options numériques", "522703281": "divisible par", "523123321": "- 10 à la puissance d'un nombre donné", "524459540": "Comment créer des variables ?", "527329988": "Ceci est un mot de passe commun parmi les 100 premiers", "529056539": "Options", + "530864956": "Deriv Apps", "530953413": "Applications autorisées", "531114081": "3. Type de Contrat", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, actions, indices boursiers, cryptomonnaies, indices synthétiques", "545476424": "Retraits Totaux", "549479175": "Multiplicateurs Deriv", + "549799607": "Go to LiveChat", "550589723": "Votre mise augmentera de {{growth_rate}}% par tick tant que le cours au comptant actuel reste inférieur de ±{{tick_size_barrier}} par rapport au cours au comptant précédent.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "En savoir plus sur les limites de trading", "554135844": "Édition", "554410233": "Ceci est un mot de passe commun parmi les 10 premiers", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Après avoir défini les paramètres du trade et les options du trade, vous pouvez demander à votre bot d'acheter des contrats lorsque des conditions spécifiques sont remplies. Pour ce faire, vous pouvez utiliser des blocs conditionnels et des blocs d'indicateurs pour aider votre bot à prendre des décisions.", "555881991": "Carte d'identité nationale", "556264438": "Intervalle de temps", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "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.", "639382772": "Veuillez télécharger le type de fichier pris en charge.", "640596349": "Vous n'avez pas encore reçu de notifications", @@ -562,7 +574,6 @@ "642546661": "Télécharger le dos du permis de conduire depuis votre ordinateur", "642995056": "Email", "644150241": "Le nombre de contrats que vous avez gagnés depuis la dernière fois que vous avez effacé vos statistiques.", - "645016681": "Fréquence de négociation d'autres instruments financiers", "645902266": "EUR/NZD", "647039329": "Justificatif d'adresse requis", "647745382": "Liste d'entrée {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "Dans l'exemple ci-dessous, le prix d'ouverture est sélectionné, qui est ensuite affecté à une variable appelée \"op\".", "666724936": "Veuillez saisir un numéro d'identification valide.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Compétence et choix de la loi", "674973192": "Utilisez ce mot de passe pour vous connecter à vos comptes Deriv MT5 sur les applications de bureau, web et mobile.", "676159329": "Impossible de basculer vers le compte par défaut.", @@ -604,7 +616,7 @@ "684282133": "Instruments de trading", "685391401": "Si vous ne parvenez pas à vous connecter, faites-le nous savoir via <0>chat", "686312916": "Comptes de trading", - "686387939": "Comment remettre à zéro mon journal de transactions?", + "686387939": "Comment effacer mon journal de transactions ?", "687193018": "Risque de dérapage", "687212287": "Le montant est un champ obligatoire.", "688510664": "Vous avez {{two_fa_status}} 2FA sur cet appareil. Vous serez déconnecté de votre compte sur les autres appareils (le cas échéant). Utilisez votre mot de passe et un code 2FA pour vous reconnecter.", @@ -612,7 +624,8 @@ "691956534": "<0>Vous avez ajouté un compte {{currency}}. <0> Effectuez un dépôt maintenant pour commencer à trader.", "692354762": "Veuillez saisir votre {{document_name}}. {{example_format}}", "693396140": "Offre annulation (expiré)", - "694035561": "Multiplicateurs d'options commerciales", + "694035561": "Multiplicateurs d'options de trading", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Heure d'ouverture: l'horodatage d'ouverture", "697630556": "Ce marché est actuellement fermé.", "698037001": "Numéro d'identité national", @@ -624,8 +637,8 @@ "701647434": "Rechercher une chaîne", "702451070": "Carte d'identité nationale (pas de photo)", "702561961": "Changer de thème", + "705262734": "Your Wallets are ready", "705299518": "Ensuite, téléchargez la page de votre passeport avec votre photo.", - "706413212": "Pour accéder à la caisse, vous êtes maintenant dans votre compte {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Fréquence de trading d’options binaires", "706755289": "Ce bloc remplit des fonctions trigonométriques.", "706960383": "Nous vous proposerons d'acheter votre contrat à ce prix si vous décidez de le vendre avant son expiration. Ce prix est basé sur plusieurs facteurs, tels que le prix au comptant actuel, la durée, etc. Toutefois, nous ne proposerons pas de valeur de contrat si la durée restante est inférieure à 60 secondes.", @@ -644,18 +657,20 @@ "720293140": "Déconnexion", "720519019": "Réinitialiser mon mot de passe", "721011817": "- Élever le premier nombre à la puissance du deuxième nombre", + "722797282": "EU-regulated USD accounts", "723045653": "Vous vous connecterez à votre compte Deriv avec cette adresse e-mail.", "723961296": "Paramétrer le mot de passe", "724203548": "Vous pouvez envoyer votre plainte à la <0>plate-forme de règlement en ligne des litiges (RLL) de la Commission européenne. Cela ne s'applique pas aux clients britanniques.", "724526379": "Apprenez-en plus grâce à nos tutoriels", "728042840": "Pour continuer à trader avec nous, veuillez confirmer votre lieu de résidence.", "728824018": "Indice Espagne", - "729651741": "Choisissez une photo", + "729651741": "Choisir une photo", "730473724": "Ce bloc effectue l'opération logique \"ET\" ou \"OU\" avec les valeurs données.", "731382582": "BNB/USD", "734390964": "Solde insuffisant", "734881840": "faux", "742469109": "Réinitialiser le solde", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Tradez des CFD sur le forex, les indices dérivés, les cryptomonnaies et les matières premières avec un effet de levier élevé.", "743623600": "Référence", "744110277": "Tableau des Bandes de Bollinger", @@ -678,7 +693,7 @@ "761576760": "Financez votre compte pour commencer à trader.", "762185380": "<0>Multipliez les retours sur investissement en <0>ne risquant que ce que vous investissez.", "762871622": "{{remaining_time}}s", - "762926186": "Une stratégie rapide est une stratégie prête à l'emploi que vous pouvez utiliser dans Deriv Bot. Vous avez le choix entre 3 stratégies rapides : Martingale, D'Alembert et Oscar's Grind.", + "762926186": "Une stratégie rapide est une stratégie prête à l'emploi que vous pouvez utiliser sur Deriv Bot. Vous avez le choix entre 3 stratégies rapides : Martingale, D'Alembert et Oscar's Grind.", "764366329": "Limites de trading", "766317539": "Langue", "770171141": "Aller sur {{hostname}}", @@ -689,6 +704,7 @@ "775706054": "Vendez-vous des robots de trading ?", "776085955": "Stratégies", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "Évitez les dernières années", "784311461": "Moyenne Mobile Exponentielle (MME)", "784583814": "Lié à votre ordinateur", @@ -699,7 +715,7 @@ "792622364": "Protection contre les soldes négatifs", "793526589": "Pour déposer une réclamation concernant notre service, envoyez un e-mail à <0>complaints@deriv.com et énoncez votre réclamation en détail. Veuillez soumettre toutes les captures d'écran pertinentes de votre trading ou de votre système pour une meilleure compréhension.", "793531921": "Notre société est l'une des sociétés de commerce en ligne les plus anciennes et les plus réputées au monde. Nous nous engageons à traiter nos clients équitablement et à leur fournir un excellent service. <0/><1/> Veuillez nous faire part de vos commentaires sur la manière dont nous pouvons améliorer nos services. Soyez assuré que vous serez entendu, apprécié et traité équitablement à tout moment.", - "793826881": "Ceci est votre page d'accueil personnelle pour Deriv", + "793826881": "Il s'agit de votre page d'accueil personnelle pour Deriv", "794682658": "Copiez le lien sur votre téléphone", "795859446": "Mot de passe enregistré", "797007873": "Suivez ces étapes pour récupérer l'accès à la caméra:", @@ -725,6 +741,7 @@ "818447476": "Changer de compte ?", "820877027": "Veuillez vérifier votre preuve d'identité", "821163626": "La maintenance du serveur a lieu tous les premiers samedis du mois de 7 à 10 heures (heure GMT). Il se peut que le service soit interrompu pendant cette période.", + "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": "Un bloc qui peut contenir du texte.", "824797920": "La liste est-elle vide?", "825042307": "Essayons encore", @@ -742,12 +759,11 @@ "832721563": "Si vous sélectionnez \"Low Tick\", vous gagnez le paiement si le tick sélectionné est le plus bas parmi les cinq ticks suivants.", "834966953": "1551661986 secondes depuis le 01 janv.1970 (UTC) se traduit par 03/04/2019 à 1h13 (UTC).", "835058671": "Prix ​​d'achat total", - "835336137": "Voir le détail", + "835336137": "Afficher les informations", "835350845": "Ajoutez un ou deux mots supplémentaires. Les mots peu courants sont meilleurs.", - "836097457": "Je suis intéressé par le trading mais j'ai très peu d'expérience.", + "836097457": "Je m'intéresse au trading mais j'ai très peu d'expérience.", "837063385": "N'envoyez pas d'autres devises à cette adresse.", "837066896": "Votre document est en cours de revue, merci de vérifier de nouveau dans 1 à 3 jours.", - "839618971": "ADRESSE", "839805709": "Pour vérifier votre compte, nous avons besoin d'une meilleure photo", "840672750": "Si cela ne fonctionne pas, désinstallez et réinstallez l'application MT5. Recommencez ensuite les étapes <0>2 et <0>3.", "841434703": "Désactiver la pile", @@ -776,12 +792,12 @@ "865642450": "2. Connecté depuis un autre navigateur", "866496238": "Assurez-vous que les détails de votre licence sont lisibles, sans flou ni éblouissement", "868826608": "Exclu de {{brand_website_name}} jusqu'à", - "869068127": "La caisse est temporairement indisponible pour cause de maintenance. Elle sera disponible dès que la maintenance sera terminée.", + "869068127": "La caisse est temporairement indisponible en raison de la maintenance. Elle sera disponible dès que la maintenance sera terminée.", "869823595": "Fonction", "869993298": "Retrait Minimum", "872549975": "Il vous reste {{number}} virements pour aujourd'hui.", "872661442": "Etes-vous sûr de vouloir mettre à jour l'email de <0>{{prev_email}} à <1>{{changed_email}} ?", - "872721776": "2. Sélectionnez votre fichier XML et appuyez sur Sélectionnez.", + "872721776": "2. Sélectionnez votre fichier XML et appuyez sur Sélectionner.", "872817404": "Heure du point d'entrée", "873166343": "1. «Log» affiche un message régulier.", "874461655": "Scannez le code QR avec votre téléphone", @@ -804,7 +820,7 @@ "893975500": "Vous n'avez pas de bots récents", "894191608": "<0>c. Nous devons accorder le règlement dans les 28 jours suivant la prise de décision.", "898457777": "Vous avez ajouté un compte Deriv Financier.", - "898904393": "Barrière:", + "898904393": "Barrière :", "900646972": "page.", "902045490": "3 minutes", "903429103": "Dans la liste des bougies, lisez {{ candle_property }} # depuis la fin {{ input_number }}", @@ -817,14 +833,14 @@ "909272635": "Financier - SVG", "910888293": "Trop de tentatives", "911048905": "(BTCUSD, ETHUSD)", - "912406629": "Suivez ces étapes :", + "912406629": "Suivez les étapes suivantes :", "912967164": "Importer depuis votre ordinateur", "915735109": "Retour à {{platform_name}}", "918447723": "Réel", "920125517": "Ajouter un compte démo", "921901739": "- les coordonnées du compte bancaire lié à votre compte", "922313275": "Vous êtes de nouveau en ligne", - "924046954": "Téléchargez un document indiquant votre nom et votre numéro de compte bancaire ou les détails de votre compte.", + "924046954": "Partagez un document où figurent votre nom et votre numéro de compte bancaire ou les coordonnées de votre compte.", "926813068": "Fixe/Variable", "929608744": "Vous ne pouvez pas effectuer de retraits", "930346117": "La capitalisation n'aide pas beaucoup", @@ -844,15 +860,15 @@ "943535887": "Veuillez fermer vos positions dans le compte Deriv MT5 suivant:", "944499219": "Max. positions ouvertes", "945532698": "Contrats vendus", + "945753712": "Back to Trader’s Hub", "946204249": "Lire", "946841802": "Une bougie blanche (ou verte) indique que le prix d'ouverture est inférieur au prix de clôture. Cela représente un mouvement à la hausse du prix du marché.", - "946944859": "Cliquez sur le bouton ci-dessous et nous vous enverrons un e-mail avec un lien. Cliquez sur ce lien pour vérifier votre demande de retrait.", "947046137": "Votre retrait sera traité dans les 24 heures", "947363256": "Créer une liste", "947758334": "Ville/Village est requis", "947914894": "Recharger  <0>", "948156236": "Créer le mot de passe {{type}}", - "948176566": "Nouveau !", + "948176566": "Nouveautés !", "948545552": "150+", "949859957": "Envoyer", "952927527": "Réglementée par la Malta Financial Services Authority (MFSA) (licence nº IS/70156)", @@ -862,7 +878,7 @@ "958430760": "Zone In/Out", "959031082": "définir {{ variable }} sur MACD Array {{ dropdown }} {{ dummy }}", "960201789": "3. Conditions de vente", - "961266215": "140+", + "961266215": "+140", "961327418": "Mon ordinateur", "961692401": "Bot", "966457287": "définir {{ variable }} sur la moyenne mobile exponentielle {{ dummy }}", @@ -873,7 +889,7 @@ "975950139": "Pays de résidence", "977929335": "Allez aux paramètres de mon compte", "981138557": "Rediriger", - "981568830": "Vous avez choisi de vous exclure du trading sur notre site jusqu'à {{exclude_until}}. Si vous ne parvenez pas à effectuer une opération ou à effectuer un dépôt après votre période d'auto-exclusion, veuillez nous contacter via <0>le chat en direct.", + "981568830": "Vous avez choisi de vous exclure du trading sur notre site jusqu'à {{exclude_until}}. Si vous ne parvenez pas à effectuer une transaction ou à effectuer un dépôt après votre période d'auto-exclusion, veuillez nous contacter via <0>le chat en direct.", "981965437": "Scannez le QR code ci-dessous avec votre application 2FA. Nous recommandons <0>Authy ou <1>Google Authenticator.", "982146443": "WhatsApp", "982402892": "Première ligne de l’adresse", @@ -883,7 +899,7 @@ "988064913": "4. Revenez sur Deriv Bot et ajoutez le bloc Notify Telegram à l'espace de travail. Collez le jeton de l'API Telegram et l'ID du chat dans les champs du bloc.", "988361781": "Vous n'avez pas encore d'activité commerciale.", "988934465": "Lorsque vous y êtes invité, vous devez activer l'accès à la caméra pour continuer", - "990739582": "170+", + "990739582": "+170", "992294492": "Votre code postal n'est pas valide", "992677950": "Déconnexion sur d'autres appareils", "993827052": "Le choix de cette juridiction vous donnera accès à un compte Financier STP. Vos transactions iront directement sur le marché et auront des spreads plus serrés.", @@ -914,7 +930,7 @@ "1024205076": "Opération logique", "1025887996": "Protection de Solde Négatif", "1026046972": "Veuillez entrer un montant de paiement inférieur à {{max_payout}}.", - "1026289179": "Trade où que vous soyez", + "1026289179": "Tradez où que vous soyez", "1027098103": "L'effet de levier vous donne la possibilité de trader une position plus importante en utilisant votre capital existant. L'effet de levier varie selon les différents symboles.", "1028211549": "Tous les champs sont requis", "1028758659": "Nationalité*", @@ -924,14 +940,14 @@ "1031731167": "Livre Sterling", "1032173180": "Deriv", "1032907147": "AUD/NZD", - "1033076894": "- profits/pertes actuels : utilisez cette variable pour enregistrer les profits ou pertes cumulés pendant que votre bot est en cours d'exécution. Définissez la valeur initiale sur 0.", + "1033076894": "- Profits/pertes actuels : utilisez cette variable pour enregistrer les profits ou les pertes cumulés pendant que votre bot est en cours d'exécution. Définissez la valeur initiale sur 0.", "1035893169": "Supprimer", - "1036116144": "Spéculez sur l'évolution du prix d'un actif sans le posséder réellement.", + "1036116144": "Spéculez sur le mouvement du prix d'un actif sans en être réellement propriétaire.", "1036867749": "La durée, la mise, la prévision et/ou les barrières souhaités pour le contrat sont définis ici.", "1038575777": "Modifier le mot de passe", "1039428638": "Réglementation européenne", "1039755542": "Utilisez quelques mots, évitez les phrases courantes", - "1040472990": "1. Accédez à Bot Builder.", + "1040472990": "1. Accéder à Bot Builder.", "1040677897": "Pour continuer le trading, vous devez également soumettre une preuve d'adresse.", "1041001318": "Ce bloc effectue les opérations suivantes sur une liste donnée: somme, minimum, maximum, moyenne, médiane, mode, antimode, écart-type, élément aléatoire.", "1041620447": "Si vous ne parvenez pas à scanner le code QR, vous pouvez entrer manuellement ce code à la place :", @@ -950,9 +966,10 @@ "1050128247": "Je confirme avoir vérifié les informations de l'agent de paiement.", "1050844889": "Rapports", "1052779010": "Vous êtes sur votre compte démo", + "1052921318": "{{currency}} Wallet", "1053153674": "Indice de saut 50", "1053159279": "Niveau de formation", - "1053556481": "Une fois que vous aurez soumis votre plainte, nous vous enverrons un e-mail de confirmation pour confirmer que nous l'avons bien reçue.", + "1053556481": "Une fois que vous aurez soumis votre plainte, nous vous enverrons un accusé de réception par courrier électronique pour confirmer que nous l'avons bien reçue.", "1055313820": "Aucun document détecté", "1056381071": "Retour au trade", "1056821534": "Êtes vous sûr?", @@ -969,29 +986,29 @@ "1065353420": "110 et +", "1065498209": "Itérer (1)", "1066235879": "Pour transférer des fonds, vous devrez créer un deuxième compte.", - "1066459293": "4.3. Accuser réception de votre plainte", + "1066459293": "4.3. Réception de votre plainte", "1069347258": "Le lien de vérification que vous avez utilisé est invalide ou a expiré. Veuillez en demander un nouveau.", "1069576070": "Achat bloqué", "1070624871": "Vérifier le statut de la vérification du justificatif de domicile", - "1073261747": "Vérification", + "1073261747": "Vérifications", "1076006913": "Bénéfice/perte sur les derniers {{item_count}} contrats", "1077515534": "Date au", - "1078221772": "Levier vous empêche d'ouvrir des positions importantes.", + "1078221772": "L'effet de levier vous empêche d'ouvrir des positions importantes.", "1080068516": "Action", "1080990424": "Confirmer", "1082158368": "*Solde financier maximum du compte", "1082406746": "Veuillez entrer un montant d'investissement qui soit au moins égal à {{min_stake}}.", "1083781009": "Numéro d'identification fiscale*", "1083826534": "Activer le bloc", - "1087112394": "Vous devez sélectionner le prix d'exercice avant d'entrer dans le contrat.", - "1088031284": "Le prix d'exercice:", + "1087112394": "Vous devez sélectionner le prix d'exercice avant d'ouvrir la position.", + "1088031284": "Prix d'exercice :", "1088138125": "Tick {{current_tick}} - ", - "1089085289": "Numéro de portable", + "1089085289": "Numéro de téléphone portable", "1089436811": "Tutoriels", "1089687322": "Arrêter votre bot actuel ?", - "1090041864": "Le {{block_type}} blocage est obligatoire et ne peut pas être supprimé/désactivé.", + "1090041864": "Le blocage {{block_type}} est obligatoire et ne peut être supprimé/désactivé.", "1095295626": "<0>• L'arbitre des services financiers déterminera si la plainte peut être acceptée et si elle est conforme à la loi.", - "1096078516": "Nous examinerons vos documents et reviendrons vers vous dans un délai dans le 3 jours.", + "1096078516": "Nous examinerons vos documents et reviendrons vers vous dans un délai de trois (3) jours.", "1096175323": "Vous aurez besoin d'un compte Deriv", "1098147569": "Achetez des matières premières ou des actions d'une entreprise.", "1098622295": "\"i\" commence par la valeur 1, et il sera augmenté de 2 à chaque itération. La boucle se répétera jusqu'à ce que «i» atteigne la valeur 12, puis la boucle se termine.", @@ -1010,6 +1027,7 @@ "1110102997": "Relevé", "1112582372": "Durée du l'intervalle", "1113119682": "Ce bloc vous donne la valeur de bougie sélectionnée dans une liste de bougies.", + "1113221217": "MT5 Swap-free", "1113292761": "Moins de 8 Mo", "1114679006": "Vous avez réussi à créer votre bot à l'aide d'une stratégie simple.", "1117281935": "Conditions de vente (facultatives)", @@ -1025,8 +1043,8 @@ "1126934455": "La longueur du nom du token doit être comprise entre 2 et 32 ​​caractères.", "1127149819": "Soyes sur§", "1127224297": "Désolé pour l'interruption", - "1128139358": "Combien de transactions CFD avez-vous effectuées au cours des 12 derniers mois ?", - "1128321947": "Suprimez tout", + "1128139358": "Combien de transactions sur CFD avez-vous effectuées au cours des 12 derniers mois ?", + "1128321947": "Effacer tout", "1128404172": "Annuler", "1129124569": "Si vous sélectionnez \"Under\", vous gagnerez le paiement si le dernier chiffre du dernier tick est inférieur à votre prédiction.", "1129842439": "Veuillez saisir un montant de profit.", @@ -1036,6 +1054,7 @@ "1134879544": "Exemple de document avec reflets", "1138126442": "Forex : standard", "1139483178": "Activer la pile", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Direction est {{ direction_type }}", "1144028300": "Tableau de Relative Strength Index", "1145927365": "Exécutez les blocs à l'intérieur après un nombre donné de secondes", @@ -1060,13 +1079,12 @@ "1169201692": "Créer le mot de passe {{platform}}", "1170228717": "Restez sur {{platform_name_trader}}", "1171765024": "Étape 3", - "1171961126": "paramètres du trade", + "1171961126": "paramètres de trading", "1172524677": "Démo de CFD", "1174542625": "- Recherchez la propriété ID de chat dans la réponse et copiez la valeur de la propriété id", "1174689133": "3. Définissez les paramètres de votre transaction et cliquez sur Lancer.", "1174748431": "Canal de paiement", "1175183064": "Vanuatu", - "1176926166": "Expérience de trading avec d'autres instruments financiers", "1177396776": "Si vous sélectionnez \"Asiatique Baisse\", vous gagnerez le paiement si le dernier tick est inférieur à la moyenne des ticks.", "1177723589": "Il n'y a aucune transaction à afficher", "1178582280": "Le nombre de contrats que vous avez perdus depuis la dernière fois que vous avez effacé vos statistiques.", @@ -1077,7 +1095,8 @@ "1181396316": "Ce bloc vous donne un nombre aléatoire dans une plage définie", "1181770592": "Bénéfice/perte sur vente", "1183007646": "- Type de contrat: le nom du type de contrat tel que Rise, Fall, Touch, No Touch, etc.", - "1184968647": "Concluez votre contrat dès maintenant ou maintenez-le en cours. Si vous décidez de le maintenir en cours d'exécution, vous pouvez le vérifier et le fermer ultérieurement sur ", + "1183448523": "<0>We're setting up your Wallets", + "1184968647": "Fermez votre contrat dès maintenant ou maintenez-le en cours. Si vous décidez de le maintenir en cours d'exécution, vous pouvez le vérifier et le fermer ultérieurement sur ", "1188316409": "Pour recevoir vos fonds, contactez l'agent de paiement en utilisant les informations ci-dessous", "1188980408": "5 minutes", "1189249001": "4.1. Qu'est-ce qui est considéré comme une plainte ?", @@ -1087,19 +1106,21 @@ "1192708099": "Unité de durée", "1195393249": "Notifier {{ notification_type }} avec un son: {{ notification_sound }} {{ input_message }}", "1196006480": "Seuil de profit", - "1196683606": "Compte démo Deriv MT5 CFD", + "1196683606": "Compte démo Deriv MT5 pour CFD", "1198368641": "Relative Strength Index (RSI)", "1199281499": "Liste des derniers chiffres", "1201533528": "Contrats gagnés", "1201773643": "numérique", "1203297580": "Ce bloc envoie un message au réseau social Telegram.", "1204223111": "Dans cet exemple, les prix ouverts d'une liste de bougies sont affectés à une variable appelée \"candle_list\".", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Comment masquer votre carte ?", "1206821331": "Forces armées", - "1207152000": "Choisissez un modèle et définissez vos paramètres commerciaux.", + "1207152000": "Choisissez un modèle et définissez vos paramètres de trading.", "1208714859": "En bref :", "1208729868": "Ticks", "1208903663": "Token invalide", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Le robot se met en marche", "1214893428": "La création de compte n'est actuellement pas disponible pour mobile. Veuillez vous connecter avec votre ordinateur pour créer un nouveau compte.", "1216408337": "Travailleur indépendant", @@ -1112,6 +1133,7 @@ "1222521778": "Faire des dépôts et des retraits est difficile.", "1222544232": "Nous vous avons envoyé un email", "1225150022": "Nombre d'actifs", + "1226027513": "Transfer from", "1227074958": "fraction aléatoire", "1227240509": "Ajuster les espaces", "1228534821": "Certaines devises peuvent ne pas être prises en charge par les agents de paiement dans votre pays.", @@ -1121,6 +1143,7 @@ "1232291311": "Retrait maximum restant", "1232353969": "0 à 5 transactions au cours des 12 derniers mois", "1233300532": "Paiement", + "1233376285": "Options & multipliers", "1234292259": "Source de richesse", "1234764730": "Téléchargez une capture d'écran de votre nom et de votre adresse e-mail depuis la section des informations personnelles.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Trie les éléments d'une liste donnée, par leur valeur numérique ou alphabétique, dans l'ordre croissant ou décroissant.", "1281290230": "Sélectionner", "1282951921": "Que des Descentes", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Si «Perte» est sélectionné, il retournera «Vrai» si votre dernière transaction a échoué. Sinon, il renverra une chaîne vide.", "1286094280": "Retrait", "1286507651": "Fermer l'écran de vérification d'identité", @@ -1173,7 +1197,6 @@ "1289146554": "Commission des services financiers des îles Vierges britanniques", "1289646209": "Appel de marge", "1290525720": "Exemple : ", - "1291887623": "Fréquence de trading des options numériques", "1291997417": "Les contrats expireront exactement à 23:59:59 GMT à la date d'expiration que vous avez choisie.", "1292188546": "Réinitialiser le mot de passe investisseur de Deriv MT5", "1292891860": "Notifier Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Vendre)", "1329136554": "Indice de saut 200", "1329325646": "Le contenu de ce bloc est appelé à chaque tick", + "1330479159": "Ready to upgrade?", "1331199417": "Veuillez saisir le format correct. ", "1331367811": "Numéro de compte du client", "1332168410": "En savoir plus", @@ -1257,7 +1281,6 @@ "1367023655": "Pour vous assurer que votre perte ne dépasse pas votre mise, votre contrat sera automatiquement clôturé lorsque votre perte sera égale à <0/>.", "1367488817": "4. Redémarrez les conditions de trading", "1367990698": "Indice de Volatilité 10", - "1369709538": "Nos conditions générales d'utilisation", "1370647009": "Bénéficier de limites journalières plus élevées", "1371193412": "Annuler", "1371555192": "Choisissez votre agent de paiement préféré et saisissez le montant de votre retrait. Si votre agent de paiement ne figure pas dans la liste, <0>recherchez-le à l'aide de son numéro de compte.", @@ -1319,6 +1342,7 @@ "1434767075": "Commencez à utiliser Deriv Bot", "1434976996": "Annonce", "1435363248": "Ce bloc convertit le nombre de secondes depuis l'époque Unix en un format de date et d'heure tel que 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Dépôt minimum", "1437396005": "Ajouter un commentaire", "1438247001": "Un client professionnel reçoit un moindre degré de protection du client en raison de ce qui suit.", @@ -1369,6 +1393,7 @@ "1476301886": "Semblable à SMA, ce bloc vous donne la ligne SMA entière contenant une liste de toutes les valeurs pour une période donnée.", "1478030986": "Créer ou supprimer des jetons API pour le trading et les retraits", "1480915523": "Ignorer", + "1481860194": "Your new Wallet(s)", "1481977420": "Veuillez nous aider à vérifier votre demande de retrait.", "1483470662": "Cliquez sur « Ouvrir » pour commencer à trader avec votre compte", "1484336612": "Ce bloc est utilisé pour terminer ou continuer une boucle et peut être placé n'importe où dans un bloc de boucle.", @@ -1389,6 +1414,7 @@ "1505420815": "Aucun agent de paiement n'a été trouvé pour votre recherche", "1505898522": "Télécharger la pile", "1505927599": "Nos serveurs se sont heurtés à un problème. Actualisons pour passer à autre chose.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Acheter)", "1509678193": "Éducation", @@ -1419,7 +1445,7 @@ "1542742708": "Synthétiques, Forex, Stocks, Indices boursiers, Matières premières et Cryptomonnaies", "1544642951": "Si vous sélectionnez \"Only Ups\", vous gagnez le paiement si des ticks consécutifs augmentent successivement après le point d'entrée. Aucun paiement si un tick tombe ou est égal à l'un des ticks précédents.", "1547148381": "Ce fichier est trop volumineux (seuls 8 Mb sont autorisés). Chargez un autre fichier.", - "1548765374": "La vérification du numéro du document a échoué", + "1548765374": "Verification of document number failed", "1549098835": "Total retiré", "1551172020": "Panier AUD", "1552162519": "Afficher l'intégration", @@ -1449,6 +1475,7 @@ "1577480486": "Votre lien mobile expirera dans une heure", "1577527507": "La raison de l'ouverture du compte est requise.", "1577612026": "Sélectionnez un dossier", + "1577879664": "<0>Your Wallets are ready", "1579839386": "App Store", "1580498808": "Plusieurs visages trouvés", "1584109614": "Liste des chaînes de ticks", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Le bot a rencontré une erreur lors de l'exécution.", "1648938920": "Netherlands 25", "1649239667": "2. Dans le menu Blocks, vous verrez une liste de catégories. Les blocs sont regroupés dans ces catégories. Choisissez le bloc de votre choix et faites-le glisser vers l'espace de travail.", + "1650963565": "Introducing Wallets", "1651513020": "Afficher le temps restant pour chaque intervalle", "1651951220": "Les répétitions comme \"abcabcabc\" ne sont que légèrement plus difficiles à deviner que \"abc\"", "1652366857": "obtenir et supprimer", @@ -1522,13 +1551,13 @@ "1665272539": "N'oubliez pas: vous ne pouvez pas vous connecter à votre compte avant la date sélectionnée.", "1665738338": "Solde", "1665756261": "Allez sur le chat en direct", + "1666783057": "Upgrade now", "1668138872": "Modifier les paramètres du compte", "1670016002": "Multiplicateur: {{ multiplier }}", "1670426231": "Heure de fin", "1671232191": "Vous avez défini les limites suivantes:", "1674163852": "Vous pouvez déterminer l'expiration de votre contrat en fixant la durée ou l'heure de fin.", "1675030608": "Pour créer ce compte, vous devez d'abord renvoyer votre justificatif de domicile.", - "1675289747": "Passer au compte réel", "1676549796": "Levier dynamique", "1677027187": "Forex", "1677990284": "Mes apps", @@ -1556,6 +1585,7 @@ "1703091957": "Nous recueillons des informations sur votre emploi dans le cadre de nos obligations de diligence raisonnable, comme l’exige la législation contre le blanchiment d’argent.", "1704656659": "Quelle est votre expérience dans le trading de CFD ?", "1708413635": "Pour votre compte {{currency_name}} ({{currency}})", + "1709293836": "Wallet balance", "1709401095": "Tradez des CFD sur Deriv X avec les marchés financiers et nos indices Dérivés.", "1709859601": "Heure du Point de Sortie", "1710662619": "Si vous avez l'application, lancez-la pour commencer à trader.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Nous facturons des frais de transfert de 2 % ou de {{minimum_fee}} {{currency}}, le montant le plus élevé étant retenu, pour les transferts entre vos comptes Deriv fiat et Deriv cryptomonnaie.", "1720968545": "Téléchargez la photo de votre passeport depuis votre ordinateur", + "1723069433": "Your new Wallet", "1723589564": "Représente le nombre maximum de contrats en cours dans votre portefeuille. Chaque ligne de votre portefeuille compte pour une position ouverte. Une fois le maximum atteint, vous ne pourrez plus ouvrir de nouvelles positions sans fermer d'abord une position existante.", "1724696797": "Vous êtes limité à un seul compte fiat.", "1725958461": "Numéro de compte", @@ -1680,7 +1711,7 @@ "1821818748": "Entrez le numéro de référence du permis de conduire", "1823177196": "Le plus populaire", "1824193700": "Ce bloc vous donne le dernier chiffre de la dernière valeur de tick.", - "1824292864": "D'achat", + "1824292864": "Call", "1827607208": "Fichier non téléchargé.", "1828370654": "Intégration", "1830520348": "Mot de passe {{platform_name_dxtrade}}", @@ -1698,6 +1729,7 @@ "1842266423": "retour", "1842862156": "Bienvenue sur votre tableau de bord Deriv X", "1843658716": "Si vous sélectionnez \"Only Downs\", vous gagnez le paiement si des ticks consécutifs tombent successivement après le point d'entrée. Aucun paiement si un tick augmente ou est égal à l'un des ticks précédents.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min: {{min_stake}} - max: {{max_payout}})", "1846266243": "Cette fonctionnalité n'est pas disponible pour les comptes de démonstration.", "1846587187": "Vous n'avez pas sélectionné votre pays de résidence", @@ -1792,7 +1824,6 @@ "1924765698": "Lieu de naissance*", "1926987784": "- iOS : Glissez vers la gauche sur le compte et touchez <0>Supprimer.", "1928930389": "GBP/NOK", - "1929309951": "Statut d’emploi", "1929694162": "Comparez les comptes", "1930899934": "Tether", "1931659123": "Exécuter à chaque tick", @@ -1807,6 +1838,7 @@ "1943440862": "Calcule la liste des Bandes de Bolliger (BB) à partir d'une liste avec une période", "1944204227": "Ce bloc renvoie le solde du compte courant.", "1947527527": "1. Ce lien a été envoyé par vous", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Voici les raisons possibles:", "1950413928": "Soumettre les documents d'identité", @@ -1875,6 +1907,7 @@ "2014536501": "Numéro de carte", "2014590669": "La variable '{{variable_name}}' n'a pas de valeur. Veuillez définir une valeur pour la variable '{{variable_name}}' pour notifier.", "2017672013": "Veuillez sélectionner le pays de délivrance du document.", + "2020104747": "Filter", "2020545256": "Fermer votre compte ?", "2021037737": "Veuillez mettre à jour vos coordonnées pour continuer.", "2021161151": "Regardez cette vidéo pour apprendre à construire un robot de trading sur Deriv Bot. Consultez également cet article de blog sur la création d'un robot de trading.", @@ -1885,7 +1918,6 @@ "2027696535": "Informations fiscales", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "Comptes de comparaison CFD", "2030018735": "RSI est un outil d'analyse technique qui vous aide à identifier la tendance du marché. Il vous donnera une valeur de 0 à 100. Une valeur RSI de 70 et plus signifie que l'actif est suracheté et que la tendance actuelle peut s'inverser, tandis qu'une valeur de 30 et moins signifie que l'actif est survendu.", "2030045667": "Message", "2033648953": "Ce bloc vous donne la valeur de bougie spécifiée pour un intervalle de temps sélectionné.", @@ -1919,6 +1951,7 @@ "2063812316": "Relevé en texte", "2063890788": "Annulé", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Permis de conduire", "2070002739": "N'accepte pas", "2070345146": "Lors de l'ouverture d'une transaction CFD à effet de levier.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Dépôt d'une plainte", "2080553498": "3. Obtenez l'ID de discussion à l'aide de l'API Telegram REST (en savoir plus: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Vendu pour: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Oui, supprimer", "2084693624": "Convertit une chaîne représentant une chaîne de date/heure en secondes depuis Epoch. Exemple: 2019-01-01 21:03:45 GMT + 0800 sera converti en 1546347825. L'heure et le décalage du fuseau horaire sont facultatifs.", "2085387371": "Doit être des chiffres, des lettres et des caractères spéciaux. , '-", @@ -1966,7 +2000,6 @@ "2115223095": "Perte", "2117165122": "1. Créez un bot Telegram et obtenez votre jeton d'API Telegram. En savoir plus sur la façon de créer des bots dans Telegram ici: https://core.telegram.org/bots#6-botfather", "2117489390": "Mise à jour automatique dans {{ remaining }} secondes", - "2118315870": "Où habitez-vous?", "2119449126": "Un exemple de sortie de l'exemple ci-dessous sera:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Conseil de pro : vous pouvez également cliquer et faire glisser le bloc souhaité", "2146892766": "Expérience de trading d’options binaires", "2147244655": "Comment puis-je importer mon propre robot de trading dans Deriv Bot ?", - "-1232613003": "<0>La vérification a échou. <1>Pourquoi?", - "-2029508615": "<0>Besoin de vérification.<1>Vérifier maintenant", "-931052769": "Soumettre la demande de vérification", "-1004605898": "Conseils", "-1938142055": "Documents téléchargés", @@ -2141,18 +2172,9 @@ "-179726573": "Nous avons reçu votre preuve de propriété.", "-813779897": "La vérification de la preuve de propriété a été réussie.", "-638756912": "Cache les chiffres 7 à 12 du numéro de carte qui apparaît au recto de votre carte de débit/crédit.", - "-2073934245": "Les services de trading financier proposés sur ce site ne conviennent qu'aux clients qui acceptent la possibilité de perdre tout l'argent qu'ils investissent et qui comprennent et ont une expérience du risque lié à l'achat de contrats financiers. Les transactions sur contrats financiers comportent un degré de risque élevé. Si les contrats que vous avez achetés expirent comme sans valeur, vous perdrez tout votre investissement, qui comprend la prime du contrat.", - "-1166068675": "Votre compte sera ouvert auprès de {{legal_entity_name}}, réglementé par la UK Gaming Commission (UKGC), et sera soumis aux lois de l'île de Man.", - "-975118358": "Votre compte sera ouvert auprès de {{legal_entity_name}}, réglementé par la Malta Financial Services Authority (MFSA), et sera soumis aux lois de Malte.", - "-680528873": "Votre compte sera ouvert avec {{legal_entity_name}}, et sera soumis aux lois de Samoa.", - "-1125193491": "Ajouter un compte", - "-2068229627": "Je ne suis pas un PEP et je n'ai pas été un PEP au cours des 12 derniers mois.", "-684271315": "OK", "-740157281": "Évaluation de l'expérience commerciale", "-1720468017": "Lorsque nous vous fournissons nos services, nous sommes tenus d'obtenir des informations vous concernant afin d'évaluer si un produit ou un service donné vous convient.", - "-186841084": "Modifier votre adresse e-mail de connexion", - "-907403572": "Pour modifier votre adresse e-mail, vous devez d'abord dissocier votre adresse e-mail de votre compte {{identifier_title}} .", - "-1850792730": "Se déconnecter de {{identifier_title}}", "-307865807": "Avertissement de tolérance au risque", "-690100729": "Oui, je comprends le risque.", "-2010628430": "Les CFD et autres instruments financiers présentent un risque élevé de perdre de l'argent rapidement en raison de l'effet de levier. Vous devez vous demander si vous comprenez le fonctionnement des CFD et autres instruments financiers et si vous pouvez vous permettre de prendre le risque élevé de perdre votre argent.<0/><0/> Pour continuer, vous devez confirmer que vous comprenez que votre capital est en danger.", @@ -2206,11 +2228,6 @@ "-1725454783": "Échec", "-506510414": "Date et heure", "-1708927037": "Adresse IP", - "-619126443": "Utilisez le <0>Mot de passe Deriv pour vous connecter à {{brand_website_name}} et {{platform_name_trader}}.", - "-623760979": "Utilisez le <0>mot de passe Deriv pour vous connecter à {{brand_website_name}}, {{platform_name_trader}} et {{platform_name_go}}.", - "-459147994": "Utilisez le <0>mot de passe Deriv pour vous connecter à {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} et {{platform_name_ctrader}}.", - "-80717068": "Applications que vous avez associées à votre mot de <0>passe Deriv :", - "-9570380": "Utilisez le mot de passe {{platform_name_dxtrade}} pour vous connecter à votre compte {{platform_name_dxtrade}} sur le web et l'application mobile.", "-2131200819": "Désactiver", "-200487676": "Activé", "-1840392236": "Ce n'est pas le bon code. Veuillez réessayer.", @@ -2240,44 +2257,37 @@ "-378415317": "Pays est requis", "-1497654315": "Nos comptes et services ne sont pas disponibles pour le code postal de Jersey.", "-755626951": "Complétez vos coordonnées", - "-584911871": "Sélectionnez la devise du portefeuille", "-1461267236": "Veuillez choisir votre devise", - "-1352330125": "DEVISE", "-1027595143": "Moins de 25 000 $", "-40491332": "$25 000 - $50 000", "-1139806939": "50,000 $ - 100,000 $", - "-626752657": "0-1 an", - "-532014689": "1-2 ans", - "-1001024004": "Plus de 3 ans", - "-790513277": "6 à 10 transactions au cours des 12 derniers mois", - "-580085300": "11 à 39 transactions au cours des 12 derniers mois", - "-654781670": "Primaire", - "-1717373258": "Secondaire", "-996132458": "Construction", "-915003867": "Santé", "-1430012453": "Technologie de l'Information et de la communication", "-987824916": "Science et Ingénierie", "-146630682": "Social et Culture", "-761306973": "Fabrication", - "-739367071": "Employé", - "-1156937070": "500 001 $ - 1 000 000 $", - "-315534569": "Plus de 1 000 000 $", - "-2068544539": "Employé salarié", - "-531314998": "Investissements et dividendes", - "-1235114522": "Pension", - "-1298056749": "Allocations Gouvernementales", - "-449943381": "Épargne & héritage", "-1631552645": "Professionnels", "-474864470": "Employés de l'aide aux personnes âgées, vente et service", "-1129355784": "Agriculture, foresterie et pêche", "-1242914994": "Artisanat, métallurgie, électricité, électronique", "-1317824715": "Ménage et aide à la personne", "-1592729751": "Employés des mines, de la construction, de l'industrie manufacturière et du Transport", + "-1030759620": "Agents de l’État", "-2137323480": "Propriété de la société", "-1590574533": "Règlement de divorce", "-1667683002": "Héritage", "-1237843731": "Revenus de placements", "-777506574": "Vente d’un bien", + "-654781670": "Primaire", + "-1717373258": "Secondaire", + "-1156937070": "500 001 $ - 1 000 000 $", + "-315534569": "Plus de 1 000 000 $", + "-2068544539": "Employé salarié", + "-531314998": "Investissements et dividendes", + "-1235114522": "Pension", + "-1298056749": "Allocations Gouvernementales", + "-449943381": "Épargne & héritage", "-1161338910": "Le prénom est requis.", "-1161818065": "Le nom de famille doit comprendre entre 2 et 50 caractères.", "-1281693513": "La date de naissance est requise.", @@ -2287,28 +2297,14 @@ "-212167954": "Le numéro d'identification fiscale n'est pas correctement formaté.", "-621555159": "Informations d'identité", "-204765990": "Conditions d'utilisation", - "-231863107": "Non", - "-870902742": "Quelles sont vos connaissances et votre expérience en matière de trading en ligne ?", - "-1929477717": "J'ai un diplôme universitaire, une certification professionnelle et/ou une expérience professionnelle liée aux services financiers.", - "-1540148863": "J'ai participé à des séminaires, des formations et/ou des ateliers liés au trading.", - "-922751756": "Moins d'un an", - "-542986255": "Aucun", - "-1337206552": "Selon vous, le trading de CFD vous permet de", - "-456863190": "Placez une position sur le mouvement du prix d'un actif dont le résultat est un rendement fixe ou rien du tout.", - "-1314683258": "Faites un investissement à long terme pour un bénéfice garanti.", - "-1546090184": "Comment l'effet de levier affecte-t-il le trading de CFD ?", - "-1636427115": "Levier contribue à atténuer les risques.", - "-800221491": "Levier garantit les bénéfices.", - "-811839563": "Levier vous permet d'ouvrir des positions importantes pour une fraction de la valeur de la transaction, ce qui peut entraîner une augmentation des profits ou des pertes.", - "-1185193552": "Clôturez automatiquement votre transaction lorsque la perte est égale ou supérieure à un montant spécifié, à condition que la liquidité du marché soit suffisante.", - "-1046354": "Clôturez automatiquement votre transaction lorsque le bénéfice est égal ou supérieur à un montant spécifié, à condition que la liquidité du marché soit suffisante.", - "-1842858448": "Réalisez un bénéfice garanti sur votre transaction.", - "-860053164": "Lorsque vous tradez des multiplicateurs.", - "-1250327770": "Lors de l'achat d'actions d'une entreprise.", - "-1222388581": "Tout ce qui précède.", "-477761028": "Identification de l'électeur", "-1466346630": "CPF", - "-1030759620": "Agents de l’État", + "-739367071": "Employé", + "-626752657": "0-1 an", + "-532014689": "1-2 ans", + "-1001024004": "Plus de 3 ans", + "-790513277": "6 à 10 transactions au cours des 12 derniers mois", + "-580085300": "11 à 39 transactions au cours des 12 derniers mois", "-612752984": "Ce sont des limites par défaut que nous appliquons à vos comptes.", "-1598263601": "Pour en savoir plus sur les limites de trading et leur application, veuillez consulter le <0>Centre d'aide.", "-1411635770": "En savoir plus sur les limites de compte", @@ -2326,10 +2322,7 @@ "-1500958859": "Vérifier", "-1502578110": "Votre compte est entièrement authentifié et vos limites de retrait ont été levées.", "-1662154767": "une facture de services publics récente (par exemple, électricité, eau, gaz, ligne fixe ou Internet), relevé bancaire ou lettre du gouvernement avec votre nom et cette adresse.", - "-190838815": "Nous en avons besoin pour vérification. Si les informations que vous fournissez sont fausses ou inexactes, vous ne pourrez pas effectuer de dépôt ni de retrait.", - "-223216785": "Deuxième ligne d'adresse*", "-594456225": "Deuxième ligne d'adresse", - "-1940457555": "Code postal*", "-1964954030": "Code postal", "-516397235": "Faites attention avec qui vous partagez ce jeton. Toute personne possédant ce jeton peut effectuer les actions suivantes au titre de votre compte", "-989216986": "Ajouter des comptes", @@ -2371,8 +2364,6 @@ "-1100235269": "Secteur d’emploi", "-684388823": "Valeur nette estimée", "-509054266": "Chiffre d'affaire anticipé annuel", - "-601903492": "Expérience du trading sur le Forex", - "-1012699451": "Expérience de trading CFD", "-1588485629": "Exemple ", "-1117345066": "Choisissez le type de document", "-651192353": "Exemple:", @@ -2394,11 +2385,11 @@ "-1088324715": "Nous examinerons vos documents et vous informerons de leur statut dans un délai de 1 à 3 jours ouvrés.", "-329713179": "Ok", "-1176889260": "Veuillez sélectionner un type de document.", - "-1926456107": "Le document que vous avez soumis a expiré.", - "-555047589": "Il semble que votre document d'identité ait expiré. Veuillez réessayer avec un document valide.", - "-841187054": "Réessayez", + "-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": "Nous n'avons pas été en mesure de vérifier votre identité d'après les détails saisis. ", - "-228284848": "Nous n'avons pas été en mesure de vérifier votre identité d'après les détails saisis.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "Votre identité est vérifiée. Vous devrez également fournir un justificatif de domicile.", "-118547687": "La vérification de l'identité a échoué", "-200989771": "Aller aux détails personnels", @@ -2464,12 +2455,40 @@ "-142444667": "Veuillez cliquer sur le lien reçu par email afin de modifier votre mot de passe Deriv MT5.", "-742748008": "Vérifiez vos emails et cliquez sur le lien dans l'email afin de continuer.", "-84068414": "Vous n'avez toujours pas reçu l'email ? Veuillez nous contacter via <0>le chat en direct.", + "-975118358": "Votre compte sera ouvert auprès de {{legal_entity_name}}, réglementé par la Malta Financial Services Authority (MFSA), et sera soumis aux lois de Malte.", + "-2073934245": "Les services de trading financier proposés sur ce site ne conviennent qu'aux clients qui acceptent la possibilité de perdre tout l'argent qu'ils investissent et qui comprennent et ont une expérience du risque lié à l'achat de contrats financiers. Les transactions sur contrats financiers comportent un degré de risque élevé. Si les contrats que vous avez achetés expirent comme sans valeur, vous perdrez tout votre investissement, qui comprend la prime du contrat.", + "-1125193491": "Ajouter un compte", + "-2068229627": "Je ne suis pas un PEP et je n'ai pas été un PEP au cours des 12 derniers mois.", + "-186841084": "Modifier votre adresse e-mail de connexion", + "-907403572": "Pour modifier votre adresse e-mail, vous devez d'abord dissocier votre adresse e-mail de votre compte {{identifier_title}} .", + "-1850792730": "Se déconnecter de {{identifier_title}}", "-428335668": "Vous allez devoir créer un mot de passe afin de compléter le processus.", + "-1232613003": "<0>La vérification a échou. <1>Pourquoi?", + "-2029508615": "<0>Besoin de vérification.<1>Vérifier maintenant", "-818898181": "Le nom figurant dans le document ne correspond pas à votre profil Deriv.", "-310316375": "L'adresse du document ne correspond pas à l'adresse que vous avez indiquée ci-dessus.", "-485368404": "Document délivré il y a plus de 6 mois.", "-367016488": "Document flou. Toutes les informations doivent être claires et visibles.", "-1957076143": "Document recadré. Toutes les informations doivent être claires et visibles.", + "-231863107": "Non", + "-870902742": "Quelles sont vos connaissances et votre expérience en matière de trading en ligne ?", + "-1929477717": "J'ai un diplôme universitaire, une certification professionnelle et/ou une expérience professionnelle liée aux services financiers.", + "-1540148863": "J'ai participé à des séminaires, des formations et/ou des ateliers liés au trading.", + "-922751756": "Moins d'un an", + "-542986255": "Aucun", + "-1337206552": "Selon vous, le trading de CFD vous permet de", + "-456863190": "Placez une position sur le mouvement du prix d'un actif dont le résultat est un rendement fixe ou rien du tout.", + "-1314683258": "Faites un investissement à long terme pour un bénéfice garanti.", + "-1546090184": "Comment l'effet de levier affecte-t-il le trading de CFD ?", + "-1636427115": "Levier contribue à atténuer les risques.", + "-800221491": "Levier garantit les bénéfices.", + "-811839563": "Levier vous permet d'ouvrir des positions importantes pour une fraction de la valeur de la transaction, ce qui peut entraîner une augmentation des profits ou des pertes.", + "-1185193552": "Clôturez automatiquement votre transaction lorsque la perte est égale ou supérieure à un montant spécifié, à condition que la liquidité du marché soit suffisante.", + "-1046354": "Clôturez automatiquement votre transaction lorsque le bénéfice est égal ou supérieur à un montant spécifié, à condition que la liquidité du marché soit suffisante.", + "-1842858448": "Réalisez un bénéfice garanti sur votre transaction.", + "-860053164": "Lorsque vous tradez des multiplicateurs.", + "-1250327770": "Lors de l'achat d'actions d'une entreprise.", + "-1222388581": "Tout ce qui précède.", "-1515286538": "Veuillez entrer le numéro de votre document. ", "-1694758788": "Entrez votre numéro de document", "-1458676679": "Vous devez saisir 2 à 50 caractères.", @@ -2479,6 +2498,8 @@ "-1437017790": "Informations financières", "-70342544": "Nous sommes légalement tenus de vous demander vos informations financières.", "-39038029": "Expérience de trading", + "-601903492": "Expérience du trading sur le Forex", + "-1012699451": "Expérience de trading CFD", "-1894668798": "Expérience d'autres instruments de trading", "-1026468600": "Fréquence des autres instruments de trading", "-1743024217": "Sélectionnez la langue", @@ -2489,6 +2510,11 @@ "-536187647": "Confirmer la révocation de l'accès?", "-1357606534": "Permission", "-570222048": "Révoquer l'accès", + "-80717068": "Applications que vous avez associées à votre mot de <0>passe Deriv :", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Utilisez le <0>Mot de passe Deriv pour vous connecter à {{brand_website_name}} et {{platform_name_trader}}.", + "-623760979": "Utilisez le <0>mot de passe Deriv pour vous connecter à {{brand_website_name}}, {{platform_name_trader}} et {{platform_name_go}}.", + "-459147994": "Utilisez le <0>mot de passe Deriv pour vous connecter à {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} et {{platform_name_ctrader}}.", "-1526404112": "Factures de services: électricité, eau, gaz ou téléphone fixe.", "-537552700": "Contrat de location : contrat valide et en vigueur.", "-890084320": "Sauvegarder et soumettre", @@ -2510,11 +2536,20 @@ "-362324454": "Matières premières", "-1071336803": "Plateforme", "-820028470": "Options & Multiplicateurs", - "-1255879419": "Trader's Hub", + "-1186807402": "Transfert", + "-224804428": "Transactions", + "-470018967": "Réinitialisez la balance", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Réinitialiser", "-213142918": "Dépôts et retraits temporairement indisponibles ", - "-224804428": "Transactions", - "-1186807402": "Transfert", "-1308346982": "Dérivés", "-1145604233": "Tradez des CFD sur MT5 avec des indices Dérivés qui simulent les mouvements réels du marché.", "-328128497": "Financier", @@ -2525,15 +2560,29 @@ "-81256466": "Vous avez besoin d'un compte Deriv pour créer un compte CFD.", "-699372497": "Tradez avec un effet de levier et des spreads serrés pour obtenir de meilleurs rendements sur les transactions réussies. <0>En savoir plus", "-1884966862": "Obtenez plus de comptes Deriv MT5 avec un type et une juridiction différents.", - "-145462920": "Deriv cTrader", "-982095728": "Obtenir", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Clause de non-responsabilité statutaire de l'UE: les CFD sont des instruments complexes et comportent un risque élevé de perte rapide d'argent en raison de l'effet de levier. <0>73% des comptes d'investisseurs particuliers perdent de l'argent en négociant des CFD avec ce fournisseur. Vous devez vous demander si vous comprenez le fonctionnement des CFD et si vous pouvez vous permettre de prendre le risque élevé de perdre votre argent.", "-1277942366": "Total des actifs", + "-1255879419": "Trader's Hub", "-493788773": "Hors UE", "-673837884": "UE", "-230566990": "Les documents suivants que vous avez soumis n'ont pas passé nos contrôles :", "-846812148": "Preuve de domicile.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Réglementation hors UE", "-643108528": "Réglementation hors UE et UE", + "-979459594": "Buy/Sell", + "-494667560": "Ordres", + "-679691613": "Mes annonces", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Compte multiplicateurs", "-744999940": "Compte Deriv", @@ -2543,9 +2592,20 @@ "-318106501": "Tradez des CFD sur MT5 avec des produits synthétiques, des paniers et des dérivées FX.", "-1328701106": "Tradez des CFD sur MT5 avec le forex, les actions, les indices boursiers, les matières synthétiques, les cryptomonnaies et les matières premières.", "-1173266642": "Ce compte propose des CFD sur une plateforme de trading riche en fonctionnalités.", - "-1290112064": "Deriv EZ", "-1453519913": "Négociez des CFD sur une plateforme facile à prendre en main avec tous vos actifs préférés.", "-2051096382": "Obtenez une gamme de paiements en prédisant correctement les mouvements du marché grâce aux <0>options, ou profitez des avantages des CFD sans risquer plus que votre mise initiale avec les <1>multiplicateurs.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Choix de la réglementation", "-249184528": "Vous pouvez créer des comptes réels conformément à la réglementation européenne ou non européenne. Cliquez sur l'<0><0/>icône pour en savoir plus sur ces comptes.", "-1505234170": "Visite du Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Rechargez votre compte", "-1945421757": "Une fois que vous avez un compte, cliquez sur Deposit Déposer » ou « Transférer » pour ajouter des fonds à un compte", "-1965920446": "Commencer à trader", - "-33612390": "<0>Clause de non-responsabilité statutaire de l'UE: les CFD sont des instruments complexes et comportent un risque élevé de perte rapide d'argent en raison de l'effet de levier. <0>73% des comptes d'investisseurs particuliers perdent de l'argent en négociant des CFD avec ce fournisseur. Vous devez vous demander si vous comprenez le fonctionnement des CFD et si vous pouvez vous permettre de prendre le risque élevé de perdre votre argent.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Ce champ est requis.", "-1870909526": "Notre serveur ne peut pas récupérer une adresse.", "-582721696": "Le montant actuel du retrait autorisé est de {{format_min_withdraw_amount}} à {{format_max_withdraw_amount}}{{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Votre adresse de portefeuille {{currency_symbol}}", "-38063175": "portefeuille {{account_text}}", "-705272444": "Téléchargez une preuve d'identité pour vérifier votre identité", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Ceci afin de protéger votre compte contre les retraits non autorisés.", "-130833284": "Veuillez noter que vos limites de retrait maximales et minimales ne sont pas fixes. Elles changent en raison de la grande volatilité des crypto-monnaies.", "-1531269493": "Nous vous enverrons un email une fois que votre transaction aura été traitée.", @@ -2859,6 +2934,30 @@ "-1016171176": "Actif", "-621128676": "Type de trade", "-447853970": "Seuil de perte", + "-155173714": "Construisons un bot !", + "-1919212468": "3. Vous pouvez également rechercher les blocs que vous souhaitez à l'aide de la barre de recherche située au-dessus des catégories.", + "-1520558271": "Pour plus d’informations, consultez cet article de blog sur les bases de la création d’un bot de trading.", + "-980360663": "3. Choisissez le bloc de votre choix et faites-le glisser vers l'espace de travail.", + "-1493168314": "Qu'est-ce qu'une stratégie rapide ?", + "-1680391945": "Utiliser une stratégie rapide", + "-1177914473": "Comment enregistrer ma stratégie?", + "-271986909": "Dans Bot Builder, cliquez sur Enregistrer dans la barre d'outils en haut pour télécharger votre bot. Donnez un nom à votre robot et choisissez de le télécharger sur votre appareil ou sur Google Drive. Votre bot sera téléchargé sous forme de fichier XML.", + "-1149045595": "1. Après avoir cliqué sur Importer, sélectionnez Local et cliquez sur Continuer.", + "-288041546": "2. Sélectionnez votre fichier XML et appuyez sur Ouvrir.", + "-2127548288": "3. Votre bot sera chargé en conséquence.", + "-1311297611": "1. Après avoir cliqué sur Importer, sélectionnez Google Drive et cliquez sur Continuer.", + "-1549564044": "Comment réinitialiser l'espace de travail?", + "-1127331928": "Dans Bot Builder, cliquez sur Reset dans la barre d'outils en haut. Cela effacera l'espace de travail. Veuillez noter que toutes les modifications non enregistrées seront perdues.", + "-1720444288": "Comment puis-je contrôler mes pertes avec Deriv Bot ?", + "-1142295124": "Il y a plusieurs façons de contrôler vos pertes avec Deriv Bot. Voici un exemple simple de la façon dont vous pouvez mettre en œuvre le contrôle des pertes dans votre stratégie :", + "-986689483": "1. Créez les variables suivantes:", + "-269910127": "3. Mettez à jour le profit/perte actuel avec le profit du dernier contrat. Si le dernier contrat a été perdu, la valeur du profit/perte actuel sera négative.", + "-1565344891": "Puis-je faire fonctionner Deriv Bot sur plusieurs onglets dans mon navigateur web ?", + "-90192474": "Oui, tu peux. Cependant, votre compte est soumis à des limites, telles que le nombre maximum de positions ouvertes et le maximum de paiements cumulés sur les positions ouvertes. Gardez donc ces limites à l'esprit lorsque vous ouvrez plusieurs positions. Vous trouverez plus d'informations sur ces limites dans Paramètres > Limites du compte.", + "-213872712": "Non, nous ne proposons pas de crypto-monnaies sur Deriv Bot.", + "-2147346223": "Dans quels pays Deriv Bot est-il disponible ?", + "-352345777": "Quelles sont les stratégies les plus populaires pour le trading automatisé ?", + "-552392096": "Trois des stratégies les plus utilisées dans le trading automatisé sont Martingale, D'Alembert, et Oscar's Grind - vous pouvez les trouver toutes prêtes dans Deriv Bot.", "-507620484": "Non enregistré", "-764102808": "Google Drive", "-555886064": "Gagné", @@ -2937,30 +3036,6 @@ "-1823621139": "Stratégie rapide", "-1778025545": "Vous avez importé un bot avec succès.", "-1519425996": "Aucun résultat trouvé « {{ faq_search_value }} »", - "-155173714": "Construisons un bot !", - "-1919212468": "3. Vous pouvez également rechercher les blocs que vous souhaitez à l'aide de la barre de recherche située au-dessus des catégories.", - "-1520558271": "Pour plus d’informations, consultez cet article de blog sur les bases de la création d’un bot de trading.", - "-980360663": "3. Choisissez le bloc de votre choix et faites-le glisser vers l'espace de travail.", - "-1493168314": "Qu'est-ce qu'une stratégie rapide ?", - "-1680391945": "Utiliser une stratégie rapide", - "-1177914473": "Comment enregistrer ma stratégie?", - "-271986909": "Dans Bot Builder, cliquez sur Enregistrer dans la barre d'outils en haut pour télécharger votre bot. Donnez un nom à votre robot et choisissez de le télécharger sur votre appareil ou sur Google Drive. Votre bot sera téléchargé sous forme de fichier XML.", - "-1149045595": "1. Après avoir cliqué sur Importer, sélectionnez Local et cliquez sur Continuer.", - "-288041546": "2. Sélectionnez votre fichier XML et appuyez sur Ouvrir.", - "-2127548288": "3. Votre bot sera chargé en conséquence.", - "-1311297611": "1. Après avoir cliqué sur Importer, sélectionnez Google Drive et cliquez sur Continuer.", - "-1549564044": "Comment réinitialiser l'espace de travail?", - "-1127331928": "Dans Bot Builder, cliquez sur Reset dans la barre d'outils en haut. Cela effacera l'espace de travail. Veuillez noter que toutes les modifications non enregistrées seront perdues.", - "-1720444288": "Comment puis-je contrôler mes pertes avec Deriv Bot ?", - "-1142295124": "Il y a plusieurs façons de contrôler vos pertes avec Deriv Bot. Voici un exemple simple de la façon dont vous pouvez mettre en œuvre le contrôle des pertes dans votre stratégie :", - "-986689483": "1. Créez les variables suivantes:", - "-269910127": "3. Mettez à jour le profit/perte actuel avec le profit du dernier contrat. Si le dernier contrat a été perdu, la valeur du profit/perte actuel sera négative.", - "-1565344891": "Puis-je faire fonctionner Deriv Bot sur plusieurs onglets dans mon navigateur web ?", - "-90192474": "Oui, tu peux. Cependant, votre compte est soumis à des limites, telles que le nombre maximum de positions ouvertes et le maximum de paiements cumulés sur les positions ouvertes. Gardez donc ces limites à l'esprit lorsque vous ouvrez plusieurs positions. Vous trouverez plus d'informations sur ces limites dans Paramètres > Limites du compte.", - "-213872712": "Non, nous ne proposons pas de crypto-monnaies sur Deriv Bot.", - "-2147346223": "Dans quels pays Deriv Bot est-il disponible ?", - "-352345777": "Quelles sont les stratégies les plus populaires pour le trading automatisé ?", - "-552392096": "Trois des stratégies les plus utilisées dans le trading automatisé sont Martingale, D'Alembert, et Oscar's Grind - vous pouvez les trouver toutes prêtes dans Deriv Bot.", "-418247251": "Téléchargez votre journal.", "-2123571162": "Télécharger", "-870004399": "<0>Acheté: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Compte désactivé", "-1837059346": "Achat / Vente", "-1845037007": "Page de l'annonceur", - "-494667560": "Ordres", - "-679691613": "Mes annonces", "-821418875": "Trader", "-679102561": "Détails du contrat", "-430118939": "Politique de réclamations", @@ -3082,7 +3155,6 @@ "-430041639": "Votre justificatif de domicile n'a pas passé la vérification et nous avons mis en place certaines restrictions sur votre compte. Veuillez renvoyer un justificatif de domicile.", "-87177461": "Veuillez vous rendre dans les paramètres de votre compte et compléter vos données personnelles pour permettre les dépôts.", "-904632610": "Réinitialisez votre balance", - "-470018967": "Réinitialisez la balance", "-156611181": "Veuillez remplir l'évaluation financière dans les paramètres de votre compte pour le débloquer.", "-1925176811": "Impossible de traiter les retraits en ce moment", "-980696193": "Les retraits sont temporairement indisponibles en raison d'une maintenance du système. Vous pourrez effectuer des retraits lorsque la maintenance sera terminée.", @@ -3107,12 +3179,12 @@ "-577279362": "Veuillez soumettre votre preuve d'identité pour vérifier votre compte et continuer à trader.", "-197134911": "Votre preuve d'identité est expirée", "-152823394": "Votre preuve d'identité a expiré. Veuillez soumettre une nouvelle preuve d'identité pour vérifier votre compte et continuer à trader.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Suivez ces instructions simples pour y remédier.", "-2142540205": "Il semble que l'adresse dans votre document ne corresponde pas à l'adresse dans votre profil Deriv. Veuillez mettre à jour vos détails personnelles avec l'adresse correcte.", "-482715448": "Aller aux Détails personnels", "-2072411961": "Votre justificatif de domicile a été vérifié", "-384887227": "Mettez à jour l'adresse dans votre profil.", - "-448961363": "non-EU", "-1998049070": "Si vous acceptez notre utilisation des cookies, cliquez sur Accepter. Pour plus d'informations, <0>consultez notre politique.", "-402093392": "Ajouter un compte Deriv", "-1721181859": "Vous aurez besoin d'un compte {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Plein écran", "-1823504435": "Afficher les notifications", "-1954045170": "Pas de devise attribuée", - "-583559763": "Menu", "-1591792668": "Limites du Compte", "-34495732": "Informations réglementaires", "-1496158755": "Allez sur Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "La Commission financière accepte les appels pendant 45 jours après la date de l'incident et seulement après que le commerçant a essayé de résoudre le problème directement avec l'entreprise.", "-1825471709": "Une toute nouvelle expérience de trading sur une plateforme puissante mais facile à utiliser.", "-981017278": "Trading automatisé à portée de main. Aucun codage nécessaire.", + "-583559763": "Menu", "-778309978": "Le lien sur lequel vous avez cliqué a expiré. Assurez-vous de cliquer sur le lien figurant dans le dernier e-mail de votre boîte de réception. Vous pouvez également saisir votre adresse e-mail ci-dessous et cliquer sur <0>Renvoyer l'e-mail pour obtenir un nouveau lien.", "-336222114": "Suivez ces étapes simples pour y remédier :", "-1064116456": "Recherchez le courtier <0>Deriv Holdings (Guernsey) Limited et sélectionnez-le.", @@ -3415,22 +3487,6 @@ "-1282933308": "Pas {{barrier}}", "-968190634": "Egal {{barrier}}", "-1747377543": "Sous {{barrier}}", - "-256210543": "Le Trading n’est pas disponible en ce moment.", - "-1150099396": "Nous travaillons pour que cela soit disponible pour vous bientôt. Si vous avez un autre compte, passez à ce compte pour continuer à trader. Vous pouvez ajouter un Deriv MT5 Financial.", - "-28115241": "{{platform_name_trader}} n'est pas disponible pour ce compte", - "-453920758": "Aller sur le tableau de bord {{platform_name_mt5}}", - "-402175529": "Historique", - "-902712434": "Offre annulation", - "-988484646": "Offre annulation (réalisée)", - "-444882676": "Offre annulation (active)", - "-13423018": "ID de référence", - "-2035315547": "Barrière inférieure", - "-1551639437": "Pas d'historique", - "-1214703885": "Vous n'avez pas encore mis à jour soit le take profit, soit le stop loss", - "-504849554": "Il sera rouvert à", - "-59803288": "En attendant, essayez nos indices synthétiques. Elles simulent les movements du marché réel et sont ouvertes 24 heures sur 24, 7 jours sur 7.", - "-1278109940": "Voir les marchés ouverts", - "-694105443": "Ce marché est fermé", "-1043795232": "Positions récentes", "-1511825574": "Profits/pertes:", "-726626679": "Bénéfice/Perte Potentielle:", @@ -3455,21 +3511,15 @@ "-1435392215": "A propos de l'offre annulation", "-2017825013": "C'est compris", "-1192773792": "Ne plus jamais afficher ça", + "-902712434": "Offre annulation", "-1280319153": "Annulez votre transaction à tout moment dans un laps de temps choisi. Déclenché automatiquement si votre transaction atteint le niveau d'arrêt dans le laps de temps choisi.", "-471757681": "Gestion des risques", "-843831637": "Stop loss", "-771725194": "Offre annulation", "-338707425": "La durée minimale est de 1 jour", "-1003473648": "Durée: {{duration}} jour", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Le paiement à l'échéance est égal au paiement par point multiplié par la différence entre le prix final et le prix d'exercice.", "-1527492178": "Achat bloqué", "-725375562": "Vous pouvez verrouiller/déverrouiller le bouton d'achat à partir du menu Paramètres", - "-774638412": "L'enjeu doit être compris entre {{min_stake}} {{currency}} et {{max_stake}} {{currency}}", - "-1358367903": "Mise", - "-434270664": "Prix actuel", - "-1956787775": "Prix de Barrière :", - "-1513281069": "Barrière 2", "-390994177": "Doit être compris entre {{min}} et {{max}}", "-1804019534": "Expiration : {{date}}", "-2055106024": "Basculer entre les paramètres de durée avancés et simples", @@ -3481,9 +3531,10 @@ "-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.", "-339236213": "Multiplicateur", "-2131851017": "Taux de croissance", - "-1763848396": "De vente", + "-1763848396": "Put", "-194424366": "au-dessus", "-857660728": "Le prix d'exercice", + "-1358367903": "Mise", "-1386326276": "La barrière est un champ obligatoire.", "-1418742026": "La barrière supérieure doit être plus élevée que la barrière inférieure.", "-92007689": "La barrière inférieure doit être inférieure à la barrière supérieure.", @@ -3491,6 +3542,21 @@ "-1975910372": "Minute doit se situer entre 0 et 59.", "-866277689": "La période d'expiration ne peut être antérieure.", "-1455298001": "Maintenant", + "-256210543": "Le Trading n’est pas disponible en ce moment.", + "-1150099396": "Nous travaillons pour que cela soit disponible pour vous bientôt. Si vous avez un autre compte, passez à ce compte pour continuer à trader. Vous pouvez ajouter un Deriv MT5 Financial.", + "-28115241": "{{platform_name_trader}} n'est pas disponible pour ce compte", + "-453920758": "Aller sur le tableau de bord {{platform_name_mt5}}", + "-402175529": "Historique", + "-988484646": "Offre annulation (réalisée)", + "-444882676": "Offre annulation (active)", + "-13423018": "ID de référence", + "-2035315547": "Barrière inférieure", + "-1551639437": "Pas d'historique", + "-1214703885": "Vous n'avez pas encore mis à jour soit le take profit, soit le stop loss", + "-504849554": "Il sera rouvert à", + "-59803288": "En attendant, essayez nos indices synthétiques. Elles simulent les movements du marché réel et sont ouvertes 24 heures sur 24, 7 jours sur 7.", + "-1278109940": "Voir les marchés ouverts", + "-694105443": "Ce marché est fermé", "-439389714": "Nous y travaillons", "-770929448": "Aller sur {{platform_name_smarttrader}}", "-347156282": "Soumettre une preuve", @@ -3537,6 +3603,8 @@ "-454245976": "Si vous pensez que le prix du marché baissera continuellement pendant une période donnée, choisissez <0>Short. Vous recevrez un paiement à la date d'expiration si le prix du marché ne franchit pas ou ne franchit pas la barrière. Votre paiement augmentera proportionnellement à la distance entre le prix du marché et la barrière si celle-ci n'est pas franchie. Vous commencerez à réaliser des bénéfices lorsque le paiement sera supérieur à votre mise. Si jamais le prix du marché franchit la barrière, il n'y aura aucun paiement.", "-351875097": "Nombre de ticks", "-729830082": "Voir moins", + "-1669741470": "Le paiement à l'échéance est égal au paiement par point multiplié par la différence entre le prix final et le prix d'exercice.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NOUVEAU!", "-993480898": "Accumulateurs", "-45873457": "NOUVEAU", @@ -3557,6 +3625,10 @@ "-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.", "-438655760": "<0>Remarque : vous pouvez clôturer votre transaction à tout moment. Soyez conscient du risque de slippage.", + "-774638412": "L'enjeu doit être compris entre {{min_stake}} {{currency}} et {{max_stake}} {{currency}}", + "-434270664": "Prix actuel", + "-1956787775": "Prix de Barrière :", + "-1513281069": "Barrière 2", "-1683683754": "Long", "-1046859144": "<0>{{title}} Vous recevrez un paiement si le prix du marché reste à {{price_position}} sans toucher ni franchir la barrière. Sinon, votre paiement sera nul.", "-1815023694": "au-dessus de la barrière", diff --git a/packages/translations/src/translations/it.json b/packages/translations/src/translations/it.json index a6f59d7bccaf..367dba56d99b 100644 --- a/packages/translations/src/translations/it.json +++ b/packages/translations/src/translations/it.json @@ -24,7 +24,6 @@ "27731356": "Il tuo account è temporaneamente disabilitato. Contattaci tramite <0>chat live per abilitare nuovamente depositi e prelievi.", "27830635": "Deriv (V) Ltd", "28581045": "Aggiungi un conto reale MT5", - "30801950": "Il tuo conto sarà aperto con {{legal_entity_name}}, regolamentata dalla Malta Gaming Authority, e sarà sottoposto alla legge di Malta.", "33433576": "Per favore, usa un portafoglio elettronico per prelevare i tuoi fondi.", "35089987": "Carica la parte anteriore e posteriore della tua patente di guida.", "41737927": "Grazie", @@ -60,11 +59,13 @@ "72500774": "Inserisci la residenza fiscale.", "73086872": "Hai scelto l'autoesclusione dal trading", "73326375": "Il minimo è il punto più basso raggiunto dal mercato durante il periodo contrattuale.", + "74836780": "{{currency_code}} Wallet", "74963864": "Sotto", "76916358": "Hai raggiunto il limite per il prelievo. <0/>Carica il documento di verifica di identità e indirizzo per abolire il limite e procedere con il prelievo.", "76925355": "Controlla le prestazioni del tuo bot", "77945356": "Fai trading ovunque ti trovi con la nostra app mobile.", "77982950": "Le opzioni Vanilla le permettono di prevedere una direzione al rialzo (rialzista) o al ribasso (ribassista) dell'attività sottostante acquistando una \"Call\" o una \"Put\".", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Pagina non trovata", "82839270": "Carica la pagina del tuo passaporto che contiene la tua foto.", "83202647": "Comprimi il blocco", @@ -76,6 +77,7 @@ "90266322": "2. Inizia una conversazione con il bot di Telegram appena creato e assicurati di inviargli alcuni messaggi (ad es. Ciao bot!) prima di passare alla fase successiva.", "91993812": "Utilizzata da oltre un secolo, la strategia Martingale è una classica tecnica di trading resa famosa dal matematico francese Paul Pierre Levy nel 18° secolo.", "93154671": "1. Premi Reimposta nella parte inferiore del pannello delle statistiche.", + "93939827": "Cryptocurrency accounts", "96381225": "Verifica dell'ID non riuscita", "98473502": "Non siamo tenuti a condurre un test di appropriatezza né a fornirti alcun avviso di rischio.", "98972777": "elemento casuale", @@ -83,6 +85,7 @@ "102226908": "Il campo non può essere vuoto", "108916570": "Durata: {{duration}} giorni", "109073671": "Usa un portafoglio elettronico utilizzato precedentemente per i depositi. Assicurati che il portafoglio elettronico supporti i prelievi. Puoi consulare un elenco <0>qui.", + "110822969": "One Wallet for all your transactions", "111215238": "Allontanati dalla luce diretta", "111718006": "Data di termine", "111931529": "Puntata massima totale su 7 giorni", @@ -215,7 +218,9 @@ "251882697": "Grazie! La tua risposta è stata registrata nel nostro sistema.<0/><0/> Premi «Ok» per continuare.", "254912581": "Analogamente a EMA, questo blocco fornisce anche l'interna linea EMA basandosi sull'elenco di input e il periodo determinato.", "256031314": "Lavoro pagato in contanti", + "256123827": "What happens to my trading accounts", "256602726": "Se chiudi il conto:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Valutazione del trading", "260069181": "Si è verificato un errore durante il tentativo di caricare l'URL", @@ -250,8 +255,8 @@ "284527272": "antimode", "284772879": "Contratto", "284809500": "Demo finanziaria", + "285909860": "Demo {{currency}} Wallet", "287934290": "Sei sicuro di voler annullare l'operazione?", - "289898640": "TERMINI D'USO", "291744889": "<0>1. Parametri Trade: <0>", "291817757": "Accedi alla community di Deriv per scopire le API, i token API, i modi per usare le API Deriv e altro ancora.", "292491635": "Se selezioni \"Stop Loss\" specificando l'importo del limite sulle perdite, la posizione verrà chiusa automaticamente quando la perdita raggiunge un valore pari o superiore a tale importo. Le perdite potrebbero superare l'importo selezionato in base al prezzo di chiusura del mercato.", @@ -299,6 +304,7 @@ "344418897": "I limiti sul trading e l'autoesclusione aiutano a controllare il tempo trascorso e il denaro speso su {{brand_website_name}} e a fare <0>trading in modo responsabile.", "345320063": "Timestamp non valido", "345818851": "Spiacente, si è verificato un errore interno. Premere la casella di controllo sopra per riprovare.", + "346214602": "A better way to manage your funds", "347029309": "Forex: standard/micro", "347039138": "Esegui iterazione (2)", "347217485": "Ha problemi ad accedere a Deriv MT5 sul suo cellulare?", @@ -353,6 +359,7 @@ "401345454": "Vai alla scheda Tutorial per farlo.", "402343402": "A causa di un problema sul nostro server, alcuni conti {{platform}} non sono disponibili al momento. Grazie per la comprensione e la pazienza.", "403456289": "La formula per la SMA è:", + "403608958": "Select a trading account or a Wallet", "404743411": "Depositi totali", "406359555": "Dettagli del contratto", "406497323": "Vende il tuo contratto attivo se necessario (opzionale)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Intervallo di tempo preferito tra un report e l'altro:", "431267979": "Ecco una guida rapida su come utilizzare Deriv Bot in viaggio.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Take Profit: {{ currency }} {{ take_profit }}", "432519573": "Documento caricato", @@ -453,12 +461,12 @@ "518955798": "7. Esegui una volta all'inizio", "520136698": "Indice Boom 500", "521872670": "elemento", - "522283618": "Esperienza di trading di opzioni digitali", "522703281": "divisibile per", "523123321": "-10 alla potenza di un dato numero", "524459540": "Come si creano le variabili?", "527329988": "Questa è una delle 100 password più usate", "529056539": "Opzioni", + "530864956": "Deriv Apps", "530953413": "Applicazioni autorizzate", "531114081": "3. Tipologia di contratto", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, azioni, indici azionari, criptovalute, indici sintetici", "545476424": "Prelievi totali", "549479175": "Moltiplicatori su Deriv", + "549799607": "Go to LiveChat", "550589723": "La tua puntata aumenterà dello {{growth_rate}}% per tick purché il prezzo spot corrente rimanga entro ±{{tick_size_barrier}} dal prezzo spot precedente.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Scopri di più sui limiti relativi ai trade", "554135844": "Modifica", "554410233": "Questa è una delle 10 password più usate", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Dopo aver definito i parametri e le opzioni di trading, potresti istruire il tuo bot ad acquistare contratti quando si verificano specifiche condizioni. A tal proposito, potrai utilizzare blocchi condizionali e indicatori per aiutare il tuo bot a prendere decisioni.", "555881991": "Numero del documento di identità nazionale", "556264438": "Intervallo di tempo", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.Se non è possibile raggiungere la risoluzione del reclamo, quest'ultimo passerà alla fase di determinazione condotta dalla DRC.", "639382772": "Caricare tipi di file supportati.", "640596349": "Non hai ancora ricevuto notifiche", @@ -562,7 +574,6 @@ "642546661": "Carica il retro della patente dal tuo computer", "642995056": "E-mail", "644150241": "Il numero di contratti ottenuti dall'ultima volta che hai cancellato le statistiche.", - "645016681": "Frequenza di trading con altri strumenti finanziari", "645902266": "EUR/NZD", "647039329": "È richiesto un documento a verifica dell'indirizzo", "647745382": "Elenco degli input {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "Nell'esempio sottostante, è stato selezionato il prezzo di apertura, che viene poi assegnato a una variabile chiamata \"op\".", "666724936": "Inserisci un numero ID valido.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Giurisdizione e scelta delle legge applicabile", "674973192": "Usa questa password per accedere ai conti Deriv MT5 via desktop, web e app su smartphone.", "676159329": "Non è stato possibile passare al conto default.", @@ -613,6 +625,7 @@ "692354762": "Inserisca il suo {{document_name}}. {{example_format}}", "693396140": "Cancellazione (termine scaduto)", "694035561": "Moltiplicatori di opzioni commerciali", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Orario d'apertura: il marcatore temporale d'inizio", "697630556": "Questo mercato è attualmente chiuso.", "698037001": "Numero del documeto di identità nazionale", @@ -624,8 +637,8 @@ "701647434": "Cerca stringa", "702451070": "Documento d'identità nazionale (senza foto)", "702561961": "Cambia tema", + "705262734": "Your Wallets are ready", "705299518": "Poi, carica la pagina del passaporto che contiene la tua foto.", - "706413212": "Per accedere alla cassa, ora sei nel tuo conto {{regulation}} ({{loginid}}) in {{currency}}.", "706727320": "Frequenza del trading di opzioni binarie", "706755289": "Questo blocco esegue funzioni trigonometriche.", "706960383": "Le offriremo di acquistare il suo contratto a questo prezzo, qualora decidesse di venderlo prima della sua scadenza. Questo si basa su diversi fattori, come il prezzo spot attuale, la durata, ecc. Tuttavia, non offriremo il valore del contratto se la durata residua è inferiore a 60 secondi.", @@ -644,6 +657,7 @@ "720293140": "Logout", "720519019": "Reimposta la password", "721011817": "- Aumenta il primo numero alla potenza del secondo numero", + "722797282": "EU-regulated USD accounts", "723045653": "Accederai al tuo conto Deriv con questo indirizzo e-mail.", "723961296": "Gestisci la password", "724203548": "Puoi inviare il reclamo sulla piattaforma <0>Risoluzione online delle controversie (ODR) della Commissione Europea. Procedura non valida per i clienti nel Regno Unito.", @@ -656,6 +670,7 @@ "734390964": "Saldo non sufficiente", "734881840": "falso", "742469109": "Ripristina saldo", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Fai trading con CFD su Forex, indici derivati, criptovalute e materie prime con leva elevata.", "743623600": "Riferimento", "744110277": "Serie di Bande di Bollinger (BBA)", @@ -689,6 +704,7 @@ "775706054": "Vendi bot di trading?", "776085955": "Strategie", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "Escludi ultimi anni", "784311461": "Media mobile esponenziale (EMA)", "784583814": "Collegato al tuo computer", @@ -725,6 +741,7 @@ "818447476": "Cambiare conto?", "820877027": "Controlla il documento di verifica dell'identità", "821163626": "La manutenzione del server avviene ogni primo sabato del mese dalle 7 alle 10 ora GMT. In questo periodo potrebbe subire delle interruzioni del servizio.", + "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": "Un blocco che può contenere testo.", "824797920": "La lista è vuota?", "825042307": "Riproviamo", @@ -747,7 +764,6 @@ "836097457": "Sono interessato al trading ma ho pochissima esperienza.", "837063385": "Non invii altre valute a questo indirizzo.", "837066896": "Stiamo esaminando il documento, riceverai risposta entro 1-3 giorni.", - "839618971": "INDIRIZZO", "839805709": "Per verificare facilmente la tua identità occorre una foto più nitida", "840672750": "Se questo non funziona, disinstalli e reinstalli l'applicazione MT5. Poi rifaccia i passaggi <0>2 e <0>3.", "841434703": "Disabilita raggruppamento", @@ -844,9 +860,9 @@ "943535887": "Chiudi le posizioni nei seguenti conti Deriv MT5:", "944499219": "Limite di posizioni aperte", "945532698": "Contratto venduto", + "945753712": "Back to Trader’s Hub", "946204249": "Leggi", "946841802": "Una candela bianca (o verde) indica che il prezzo di apertura è inferiore a quello di chiusura e rappresenta un movimento al rialzo del prezzo di mercato.", - "946944859": "Fai clic sul pulsante sottostante per ricevere un'e-mail con un link; fai clic sul link per confermare la richiesta di prelievo.", "947046137": "Il prelievo verrà effettuato entro 24 ore", "947363256": "Crea elenco", "947758334": "Città obbligatoria", @@ -950,6 +966,7 @@ "1050128247": "Confermo di aver verificato le informazioni di trasferimento dell'agente di pagamento.", "1050844889": "Report", "1052779010": "Sei sul conto demo", + "1052921318": "{{currency}} Wallet", "1053153674": "Indice Jump 50", "1053159279": "Livello di istruzione", "1053556481": "Una volta inviato il reclamo, ti invieremo un'e-mail di conferma per confermare che lo abbiamo ricevuto.", @@ -1010,6 +1027,7 @@ "1110102997": "Estratto", "1112582372": "Durata intervallo", "1113119682": "Questo blocco fornisce il valore della candela selezionata da un elenco di candele.", + "1113221217": "MT5 Swap-free", "1113292761": "Meno di 8 MB", "1114679006": "Hai creato con successo il tuo bot utilizzando una strategia semplice.", "1117281935": "Condizioni di vendita (opzionale)", @@ -1036,6 +1054,7 @@ "1134879544": "Esempio di un documento con riflessi", "1138126442": "Forex: standard", "1139483178": "Abilita raggruppamento", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "La direzione è {{ direction_type }}", "1144028300": "Serie di Indici di Forza Relativa (RSIA)", "1145927365": "Attiva i blocchi interni dopo un determinato numero di secondi", @@ -1066,7 +1085,6 @@ "1174689133": "3. Impostate i vostri parametri di trading e cliccate su Esegui.", "1174748431": "Mezzo di pagamento", "1175183064": "Vanuatu", - "1176926166": "Esperienza nel trading di altri strumenti finanziari", "1177396776": "Selezionando \"Ribasso asiatiche\", vincerai il payout se l'ultimo tick è inferiore alla media dei tick.", "1177723589": "Nessuna operazione da mostrare", "1178582280": "Il numero di contratti persi dall'ultima volta che hai cancellato le statistiche.", @@ -1077,6 +1095,7 @@ "1181396316": "Questo blocco fornisce un numero casuale entro un determinato intervallo", "1181770592": "Profitto/perdita dalle vendite", "1183007646": "- Tipo di contratto: il nome della tipologia come Rialzo, Ribasso, Tocca, Non Tocca, etc.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Chiudi subito il tuo contratto o mantienilo attivo. Se decidi di mantenerlo in funzione, puoi controllarlo e chiuderlo in un secondo momento ", "1188316409": "Per ricevere i fondi, contatta l'agente di pagamento con le seguenti informazioni", "1188980408": "5 minuti", @@ -1094,12 +1113,14 @@ "1201773643": "numerico", "1203297580": "Questo blocco invia un messaggio a un canale Telegram.", "1204223111": "In questo esempio, i prezzi di apertura presi da una lista di candele sono assegnati a una variabile chiamata \"candle_list\".", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Come mascherare la tua carta?", "1206821331": "Forze armate", "1207152000": "Scegli un modello e imposta i parametri di trading.", "1208714859": "In breve:", "1208729868": "Tick", "1208903663": "Token non valido", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Il bot si sta avviando", "1214893428": "Al momento non è possibile creare un conto per smartphone; per finalizzare l'operazione, accedi con il tuo computer.", "1216408337": "Libero professionista", @@ -1112,6 +1133,7 @@ "1222521778": "Effettuare depositi e prelievi è difficile.", "1222544232": "Ti abbiamo inviato una e-mail", "1225150022": "Numero di asset", + "1226027513": "Transfer from", "1227074958": "frazione casuale", "1227240509": "Rimuovi spazi", "1228534821": "Nel tuo Paese, gli agenti di pagamento non operano con alcune valute.", @@ -1121,6 +1143,7 @@ "1232291311": "Prelievo massimo restante", "1232353969": "0-5 operazioni negli ultimi 12 mesi", "1233300532": "Payout", + "1233376285": "Options & multipliers", "1234292259": "Fonte di ricchezza", "1234764730": "Carica uno screenshot del tuo nome e indirizzo email dalla sezione delle informazioni personali.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Ordina gli elementi di un determinato elenco in ordine crescente o decrescente, a seconda del loro valore numerico o alfabetico.", "1281290230": "Seleziona", "1282951921": "Solo discendenti", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Selezionando \"Perdita\", restituirai \"Vero\" se l'ultimo trade non è andato a buon fine. Diversamente, restituirai una stringa vuota.", "1286094280": "Preleva", "1286507651": "Chiudi schermata di verifica dell'identità", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Chiamata a margine", "1290525720": "Esempio: ", - "1291887623": "Frequenza del trading di opzioni digitali", "1291997417": "I contratti scadranno esattamente alle 23:59:59 GMT della data di scadenza selezionata.", "1292188546": "Reimposta la password dell'investitore Deriv MT5", "1292891860": "Notifica Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Vendi)", "1329136554": "Indice Jump 200", "1329325646": "Il contenuto del blocco è riportato su ogni tick", + "1330479159": "Ready to upgrade?", "1331199417": "Inserisci il formato corretto. ", "1331367811": "Numero di conto del cliente", "1332168410": "Scopri di più", @@ -1257,7 +1281,6 @@ "1367023655": "Per assicurarti che la perdita non superi la puntata, il contratto verrà chiuso automaticamente quando la perdita raggiunge <0/>.", "1367488817": "4. Condizioni per il riavvio dei trade", "1367990698": "Indice di volatilità 10", - "1369709538": "I nostri termini d'uso", "1370647009": "Goditi limiti giornalieri più elevati", "1371193412": "Annulla", "1371555192": "Scegli il tuo agente di pagamento preferito e inserisci l'importo del prelievo. Se il tuo agente di pagamento non è presente nell'elenco, <0>cercalo utilizzando il suo numero di conto.", @@ -1319,6 +1342,7 @@ "1434767075": "Iniziare a lavorare su Deriv Bot", "1434976996": "Annuncio", "1435363248": "Questo blocco converte il numero di secondi dall'epoca Unix al formato data e ora, ad es. 01-08-2019, 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Deposito minimo", "1437396005": "Aggiungi commento", "1438247001": "Un cliente professionale riceve grado di tutela del cliente inferiore per i seguenti motivi.", @@ -1369,6 +1393,7 @@ "1476301886": "Analogamente allo SMA, questo blocco fornisce l'intera linea SMA contenente una lista di tutti i valori di un dato periodo.", "1478030986": "Crea o cancella i token API per il trading e i prelievi", "1480915523": "Salta", + "1481860194": "Your new Wallet(s)", "1481977420": "Aiutaci a verificare la tua richiesta di prelievo.", "1483470662": "Fai clic su «Apri» per iniziare a fare trading con il tuo conto", "1484336612": "Il blocco è usato per concludere o continuare una ripetizione, e può essere posizionato ovunque all'interno di un blocco della ripetizione.", @@ -1389,6 +1414,7 @@ "1505420815": "La tua ricerca non ha trovato alcun agente di pagamento", "1505898522": "Scarica il gruppo", "1505927599": "I nostri server hanno subito un problema. Aggiorna la pagina per proseguire.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Acquista)", "1509678193": "Istruzione", @@ -1419,7 +1445,7 @@ "1542742708": "Sintetici, Forex, Azioni, Indizi azionari azionari, materie prime e Criptovalute", "1544642951": "Selezionando \"Solo ascendente\", ottieni il payout se tick consecutivi superano successivamente il punto di entrata. Non ottieni alcun payout se qualsiasi tick è minore o uguale a uno dei tick precedenti.", "1547148381": "Le dimensioni del file sono troppo grandi (consentiti solo fino a 8MB). Carica un altro file.", - "1548765374": "La verifica del numero di documento non è andata a buon fine", + "1548765374": "Verification of document number failed", "1549098835": "Totale prelievo", "1551172020": "Paniere AUD", "1552162519": "Visualizza l'onboarding", @@ -1449,6 +1475,7 @@ "1577480486": "Il link per smartphone scadrà tra un'ora", "1577527507": "Motivazione per l'apertura del conto obbligatoria.", "1577612026": "Seleziona una cartella", + "1577879664": "<0>Your Wallets are ready", "1579839386": "App store", "1580498808": "Individuati più volti", "1584109614": "Lista di stringhe di tick", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Si è verificato un errore durante l'avvio del bot.", "1648938920": "Paesi Bassi 25", "1649239667": "2. Nel menu Blocchi, vedrai un elenco di categorie. I blocchi sono raggruppati all'interno di queste categorie. Scegli il blocco che desideri e trascinalo nell'area di lavoro.", + "1650963565": "Introducing Wallets", "1651513020": "Mostra tempo rimanente per ogni intervallo", "1651951220": "Ripetizioni come \"abcabcabc\" risultano solo leggermente più difficili da indovinare di \"abc\"", "1652366857": "ottieni e rimuovi", @@ -1522,13 +1551,13 @@ "1665272539": "Ricorda: non puoi effettuare l'accesso al conto fino alla data selezionata.", "1665738338": "Saldo", "1665756261": "Vai alla chat live", + "1666783057": "Upgrade now", "1668138872": "Modifica le impostazioni del conto", "1670016002": "Moltiplicatore: {{ multiplier }}", "1670426231": "Orario di fine", "1671232191": "Hai impostato i limiti seguenti:", "1674163852": "Puoi determinare la scadenza del contratto impostando la durata o l'ora di fine.", "1675030608": "Per creare questo conto, abbiamo bisogno prima che tu invii nuovamente la prova dell'indirizzo.", - "1675289747": "Trasferito al conto reale", "1676549796": "Leva finanziaria dinamica", "1677027187": "Forex", "1677990284": "Le mie app", @@ -1556,6 +1585,7 @@ "1703091957": "Raccogliamo informazioni sulla tua situazione lavorativa nell'ambito degli obblighi di due diligence, come richiesto dalle normative anti-riciclaggio di denaro.", "1704656659": "Quanta esperienza hai nel trading di CFD?", "1708413635": "Per il tuo conto {{currency_name}} in {{currency}}", + "1709293836": "Wallet balance", "1709401095": "Fai trading di CFD su Deriv X con i mercati finanziari e i nostri indici derivati.", "1709859601": "Orario dello spot di uscita", "1710662619": "Se hai l'app, avviala per iniziare a fare trading.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Verrà addebitata una commissione per i trasferimenti 2% oppure {{minimum_fee}} {{currency}}, se ha un valore superiore, per i trasferimenti tra i conti per fiat e per criptovalute di Deriv.", "1720968545": "Carica la pagina del passaporto con la foto dal tuo computer", + "1723069433": "Your new Wallet", "1723589564": "Rappresenta il numero massimo di contratti in essere nel tuo portafoglio. Ogni riga presente sul tuo portafoglio vale una posizione aperta. Una volta raggiunto il valore massimo, non potrai aprire nuove posizioni senza prima chiudere una posizione esistente.", "1724696797": "È possibile avere un solo conto fiat.", "1725958461": "Numero del conto", @@ -1698,6 +1729,7 @@ "1842266423": "indietro", "1842862156": "Benvenuto sulla dashboard di Deriv X", "1843658716": "Selezionando \"Solo discendenti\", ottieni il payout se tick consecutivi scendono successivamente al di sotto del punto di entrata. Non ottieni alcun payout se qualsiasi tick è maggiore o uguale a uno dei tick precedenti.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min: {{min_stake}} - max: {{max_payout}})", "1846266243": "Questa funzione non è disponibile solo per conti demo.", "1846587187": "Non hai selezionato il Paese di residenza", @@ -1792,7 +1824,6 @@ "1924765698": "Luogo di nascita*", "1926987784": "- iOS: Scorra il dito verso sinistra sull'account e tocchi <0>Elimina.", "1928930389": "GBP/NOK", - "1929309951": "Occupazione", "1929694162": "Confronta conti", "1930899934": "Tether", "1931659123": "Esegui a ogni tick", @@ -1807,6 +1838,7 @@ "1943440862": "Calcola un elenco di Bande di Bollinger (BB) da un elenco con un periodo", "1944204227": "Questo blocco restituisce il saldo del conto corrente.", "1947527527": "1. Il link è stato inviato da te", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Questi sono i motivi possibili:", "1950413928": "Invia documenti di verifica dell'identità", @@ -1875,6 +1907,7 @@ "2014536501": "Numero della carta", "2014590669": "La variabile \"{{variable_name}}\" non ha valore. Imposta un valore per \"{{variable_name}}\".", "2017672013": "Seleziona il Paese in cui è stato emesso il documento.", + "2020104747": "Filter", "2020545256": "Chiudere il conto?", "2021037737": "Aggiorna i dettagli per continuare.", "2021161151": "Guardi questo video per imparare a costruire un trading bot su Deriv Bot. Inoltre, dia un'occhiata a questo post del blog sulla costruzione di un trading bot.", @@ -1885,7 +1918,6 @@ "2027696535": "Informazioni fiscali", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "Conti CFD Compare", "2030018735": "L'RSI è uno strumento tecnico di analisi che ti aiuta ad identificare i trend del mercato e fornisce un valore da 0 a 100. Se il valore è pari o superiore a 70 indica che un asset è ipercomprato e il trend corrente potrebbe invertirsi, se invece il valore è pari o inferiore a 30, significa che l'asset è ipervenduto.", "2030045667": "Messaggio", "2033648953": "Questo blocco fornisce il valore di una candela specifica contenuta nell'intervallo di tempo selezionato.", @@ -1919,6 +1951,7 @@ "2063812316": "Estratto di testo", "2063890788": "Annullato", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Patente di guida", "2070002739": "Non accetto", "2070345146": "Quando si apre un'operazione di CFD con leva.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Invio di un reclamo", "2080553498": "3. Ricevi l'ID della chat con le REST API di Telegram (scopri di più su: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Venduto per: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Sì, eliminare", "2084693624": "Converte una stringa data/tempo in una stringa in secondi rispetto all'epoca. Ad esempio: 01-01-02019 21:03:45 GMT+0800 verrebbe convertito in 1546347825. Gli offset di tempo e fuso orario sono opzionali.", "2085387371": "Deve comprendere numeri, lettere e i caratteri speciali. , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "Perdita", "2117165122": "1. Crea il tuo bot Telegram e ricevi il token dell'API Telegram. Scopri di più su come creare bot di Telegram su questa pagina: https://core.telegram.org/bots#6-botfather", "2117489390": "Aggiornamento automatico tra {{ remaining }} secondi", - "2118315870": "Dove vivi?", "2119449126": "Possibile risultato dell'esempio sottostante:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Suggerimento: puoi anche fare clic e trascinare fuori il blocco desiderato", "2146892766": "Esperienza di trading di opzioni binarie", "2147244655": "Come posso importare il mio trading bot in Deriv Bot?", - "-1232613003": "<0>Autenticazione fallita. <1>Perché?", - "-2029508615": "<0>Necessaria autenticazione. <1>Verifica ora", "-931052769": "Invia verifica", "-1004605898": "Suggerimenti", "-1938142055": "Documenti caricati", @@ -2141,18 +2172,9 @@ "-179726573": "Abbiamo ricevuto il tuo documento a verifica della proprietà.", "-813779897": "La verifica della proprietà è andata a buon fine.", "-638756912": "Oscura le cifre da 7 a 12 del numero della carta riportato sulla parte anteriore della carta di debito/credito.", - "-2073934245": "I servizi di trading finanziario offerti su questo sito sono disponibili esclusivamente per i clienti che accettano la possibilità di perdere tutto il denaro investito e comprendono a fondo il rischio legato all'acqusito di contratti finanziari. Le operazioni relative a tali contratti comportano un elevato livello di rischio; se il contratto acquistato termina con valore nullo, perdererai tutto il denaro investito, compresso il premio contrattuale.", - "-1166068675": "Il conto sarà aperto con {{legal_entity_name}}, regolamentata dalla UK Gaming Commission (UKGC), e soggetta alla legge dell'Isola di Man.", - "-975118358": "Il tuo conto sarà aperto con {{legal_entity_name}}, regolamentata dalla Malta Financial Services Authority (MFSA), e sarà sottoposto alla legge di Malta.", - "-680528873": "Il conto verrà aperto con {{legal_entity_name}}, e sarà soggetto alle leggi di Samoa.", - "-1125193491": "Aggiungi conto", - "-2068229627": "Non sono un soggetto PEP e non lo sono stato negli ultimi 12 mesi.", "-684271315": "OK", "-740157281": "Valutazione dell'esperienza di trading", "-1720468017": "Al fine di fornirti i nostri servizi, siamo tenuti a richiederti informazioni per valutare se un determinato prodotto o servizio è appropriato per te.", - "-186841084": "Modifica la tua email di accesso", - "-907403572": "Per modificare il tuo indirizzo email, devi prima scollegare il tuo indirizzo email dal tuo conto {{identifier_title}}.", - "-1850792730": "Scollegato da {{identifier_title}}", "-307865807": "Avviso di tolleranza al rischio", "-690100729": "Sì, comprendo il rischio.", "-2010628430": "I CFD e altri strumenti finanziari comportano un rischio elevato di perdere rapidamente denaro a causa della leva finanziaria. Dovresti valutare se comprendi come funzionano i CFD e altri strumenti finanziari e se puoi permetterti di correre l'elevato rischio di perdere il tuo denaro.<0/><0/> Per continuare, devi confermare di aver compreso che il tuo capitale è a rischio.", @@ -2206,11 +2228,6 @@ "-1725454783": "Non riuscito", "-506510414": "Data e ora", "-1708927037": "Indirizzo IP", - "-619126443": "Usa la <0>password Deriv per accedere a {{brand_website_name}} e {{platform_name_trader}}.", - "-623760979": "Utilizzi la <0>password Deriv per accedere a {{brand_website_name}}, {{platform_name_trader}} e {{platform_name_go}}.", - "-459147994": "Utilizzi la <0>password Deriv per accedere a {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} e {{platform_name_ctrader}}.", - "-80717068": "App che hai collegato alla tua <0>password di Deriv:", - "-9570380": "Usa la password di {{platform_name_dxtrade}} per accedere ai tuoi conti {{platform_name_dxtrade}} sul web e sulle app mobili.", "-2131200819": "Disabilita", "-200487676": "Abilita", "-1840392236": "Quello non è il codice giusto. Prova di nuovo.", @@ -2240,44 +2257,37 @@ "-378415317": "Stato obbligatorio", "-1497654315": "I nostri conti e servizi non sono disponibili per il CAP del Jersey.", "-755626951": "Complete le informazioni sul tuo indirizzo", - "-584911871": "Seleziona valuta portafoglio", "-1461267236": "Scegli una valuta", - "-1352330125": "VALUTA", "-1027595143": "Meno di 25.000 $", "-40491332": "25.000 $ - 50.000 $", "-1139806939": "50.001 $ - 100.000 $", - "-626752657": "0-1 anno", - "-532014689": "1-2 anni", - "-1001024004": "Oltre 3 anni", - "-790513277": "6-10 operazioni negli ultimi 12 mesi", - "-580085300": "11-39 operazioni negli ultimi 12 mesi", - "-654781670": "Primario", - "-1717373258": "Secondario", "-996132458": "Edilizia", "-915003867": "Salute", "-1430012453": "Tecnologia dell'informazione e della comunicazione", "-987824916": "Scienza e ingegneria", "-146630682": "Sociale e culturale", "-761306973": "Produzione", - "-739367071": "Impiegato", - "-1156937070": "500.001 $ - 1.000.000 $", - "-315534569": "Oltre 1.000.000 $", - "-2068544539": "Lavoratore dipendente", - "-531314998": "Investimenti e dividendi", - "-1235114522": "Pensione", - "-1298056749": "Sussidi statali", - "-449943381": "Risparmi ed eredità", "-1631552645": "Professionisti", "-474864470": "Lavoratori addetti alla cura della persona, alle vendite e ai servizi", "-1129355784": "Lavoratori addetti all'agricoltura, alla foresteria e al settore ittico", "-1242914994": "Lavoratori nei settori elettronico, elettrico, metallurgico e dell'artigianato", "-1317824715": "Addetti alle pulizie e aiutanti", "-1592729751": "Lavoratori per attività estrattive, edilizia, produzione e trasporti", + "-1030759620": "Funzionari governativi", "-2137323480": "Proprietà della società", "-1590574533": "Accordo di divorzio", "-1667683002": "Eredità", "-1237843731": "Redditi da capitale", "-777506574": "Vendita dei beni", + "-654781670": "Primario", + "-1717373258": "Secondario", + "-1156937070": "500.001 $ - 1.000.000 $", + "-315534569": "Oltre 1.000.000 $", + "-2068544539": "Lavoratore dipendente", + "-531314998": "Investimenti e dividendi", + "-1235114522": "Pensione", + "-1298056749": "Sussidi statali", + "-449943381": "Risparmi ed eredità", "-1161338910": "Nome obbligatorio.", "-1161818065": "Il cognome deve essere compreso tra i 2 e i 50 caratteri.", "-1281693513": "Data di nascita obbligatoria.", @@ -2287,28 +2297,14 @@ "-212167954": "Il codice di identificazione fiscale non è formattato correttamente.", "-621555159": "Informazioni sull'identità", "-204765990": "Termini di utilizzo", - "-231863107": "No", - "-870902742": "Quanta conoscenza ed esperienza hai sul trading online?", - "-1929477717": "Ho un titolo accademico, una certificazione professionale e/o un'esperienza lavorativa relativa ai servizi finanziari.", - "-1540148863": "Ho partecipato a seminari, corsi di formazione e/o workshop relativi al trading.", - "-922751756": "Meno di un anno", - "-542986255": "Nessuna", - "-1337206552": "Secondo le tue conoscenze, il trading con i CFD ti consente di", - "-456863190": "Metti una posizione sul movimento del prezzo di un asset il cui risultato è un rendimento fisso o nullo.", - "-1314683258": "Effettuare un investimento a lungo termine per un profitto garantito.", - "-1546090184": "Come influisce la leva sul trading di CFD?", - "-1636427115": "La leva finanziaria ti aiuta a mitigare il rischio.", - "-800221491": "La leva finanziaria garantisce profitti.", - "-811839563": "La leva finanziaria consente di aprire posizioni di grandi dimensioni per una frazione del valore della transazione, portando ad un possibile aumento dei profitti o delle perdite.", - "-1185193552": "Chiudere il trade automaticamente quando la perdita è pari o superiore a un importo specificato, purché vi sia un'adeguata liquidità di mercato.", - "-1046354": "Chiudere il trade automaticamente quando il profitto è pari o superiore a un importo specificato, purché vi sia un'adeguata liquidità di mercato.", - "-1842858448": "Ottenere un profitto garantito sull'operazione.", - "-860053164": "Quando si fa trading con moltiplicatori.", - "-1250327770": "Quando si acquistano azioni di una società.", - "-1222388581": "Tutte le precedenti.", "-477761028": "ID del votante", "-1466346630": "CPF", - "-1030759620": "Funzionari governativi", + "-739367071": "Impiegato", + "-626752657": "0-1 anno", + "-532014689": "1-2 anni", + "-1001024004": "Oltre 3 anni", + "-790513277": "6-10 operazioni negli ultimi 12 mesi", + "-580085300": "11-39 operazioni negli ultimi 12 mesi", "-612752984": "Questi sono i limiti standard applicati al tuo conto.", "-1598263601": "Per maggiori informazioni sui limiti ai trade e sulla loro modalità di applicazione, vai su <0>Assistenza clienti.", "-1411635770": "Scopri di più sui limiti relativi ai conti", @@ -2326,10 +2322,7 @@ "-1500958859": "Verifica", "-1502578110": "Il conto è stato completamente autenticato e i limiti di prelievo sono stati rimossi.", "-1662154767": "una bolletta di utenza (per esempio di elettricità, acqua, gas, internet o telefonica), estratto conto bancario o documento emesso dal governo con il tuo nome e il tuo indirizzo.", - "-190838815": "Ne abbiamo bisogno ai fini della verifica: se le informazioni sono false o imprecise, non ti sarà possibile prelevare o depositare fondi.", - "-223216785": "Seconda riga dell'indirizzo*", "-594456225": "Seconda riga dell'indirizzo", - "-1940457555": "Codice postale/CAP*", "-1964954030": "Codice postale/CAP", "-516397235": "Fai attenzione alle persone con cui condividi questo token. Chiunque ne sia in possesso può eseguire le seguenti azioni a nome del tuo conto", "-989216986": "Aggiungi conti", @@ -2371,8 +2364,6 @@ "-1100235269": "Settore di occupazione", "-684388823": "Patrimonio netto stimato", "-509054266": "Fatturato annuale previsto", - "-601903492": "Esperienza di trading su Forex", - "-1012699451": "Esperienza di trading su CFD", "-1588485629": "Esempio", "-1117345066": "Scegli il tipo di documento", "-651192353": "Modello:", @@ -2394,11 +2385,11 @@ "-1088324715": "Analizzeremo i documenti e ti aggiorneremo sullo stato dell'operazione entro 1-3 giorni lavorativi.", "-329713179": "Ok", "-1176889260": "Seleziona un tipo di documento.", - "-1926456107": "L'ID inviato è scaduto.", - "-555047589": "Sembra che il tuo documento d'identità sia scaduto. Riprova con un documento valido.", - "-841187054": "Riprova", + "-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": "Non è stato possibile verificare l'ID sulla base dei dettagli inseriti. ", - "-228284848": "Non è stato possibile verificare l'ID sulla base dei dettagli inseriti.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "L'ID è stato verificato. Occorre inoltre inviare la prova per la verifica dell'indirizzo.", "-118547687": "Verifica dell'ID superata", "-200989771": "Vai ai dati personali", @@ -2464,12 +2455,40 @@ "-142444667": "Per modificare la password di Deriv MT5, fai clic sul link presente nell'e-mail.", "-742748008": "Apri la posta elettronica e clicca sul link ricevuto per continuare.", "-84068414": "Non hai ricevuto ancora l'e-mail? Contattaci tramite <0>chat live.", + "-975118358": "Il tuo conto sarà aperto con {{legal_entity_name}}, regolamentata dalla Malta Financial Services Authority (MFSA), e sarà sottoposto alla legge di Malta.", + "-2073934245": "I servizi di trading finanziario offerti su questo sito sono disponibili esclusivamente per i clienti che accettano la possibilità di perdere tutto il denaro investito e comprendono a fondo il rischio legato all'acqusito di contratti finanziari. Le operazioni relative a tali contratti comportano un elevato livello di rischio; se il contratto acquistato termina con valore nullo, perdererai tutto il denaro investito, compresso il premio contrattuale.", + "-1125193491": "Aggiungi conto", + "-2068229627": "Non sono un soggetto PEP e non lo sono stato negli ultimi 12 mesi.", + "-186841084": "Modifica la tua email di accesso", + "-907403572": "Per modificare il tuo indirizzo email, devi prima scollegare il tuo indirizzo email dal tuo conto {{identifier_title}}.", + "-1850792730": "Scollegato da {{identifier_title}}", "-428335668": "Per completare la procedura, dovrai impostare una password.", + "-1232613003": "<0>Autenticazione fallita. <1>Perché?", + "-2029508615": "<0>Necessaria autenticazione. <1>Verifica ora", "-818898181": "Il nome nel documento non corrisponde al suo profilo Deriv.", "-310316375": "L'indirizzo nel documento non corrisponde all'indirizzo inserito in precedenza.", "-485368404": "Documento emesso più di 6 mesi fa.", "-367016488": "Documento sfocato. Tutte le informazioni devono essere chiare e visibili.", "-1957076143": "Documento ritagliato. Tutte le informazioni devono essere chiare e visibili.", + "-231863107": "No", + "-870902742": "Quanta conoscenza ed esperienza hai sul trading online?", + "-1929477717": "Ho un titolo accademico, una certificazione professionale e/o un'esperienza lavorativa relativa ai servizi finanziari.", + "-1540148863": "Ho partecipato a seminari, corsi di formazione e/o workshop relativi al trading.", + "-922751756": "Meno di un anno", + "-542986255": "Nessuna", + "-1337206552": "Secondo le tue conoscenze, il trading con i CFD ti consente di", + "-456863190": "Metti una posizione sul movimento del prezzo di un asset il cui risultato è un rendimento fisso o nullo.", + "-1314683258": "Effettuare un investimento a lungo termine per un profitto garantito.", + "-1546090184": "Come influisce la leva sul trading di CFD?", + "-1636427115": "La leva finanziaria ti aiuta a mitigare il rischio.", + "-800221491": "La leva finanziaria garantisce profitti.", + "-811839563": "La leva finanziaria consente di aprire posizioni di grandi dimensioni per una frazione del valore della transazione, portando ad un possibile aumento dei profitti o delle perdite.", + "-1185193552": "Chiudere il trade automaticamente quando la perdita è pari o superiore a un importo specificato, purché vi sia un'adeguata liquidità di mercato.", + "-1046354": "Chiudere il trade automaticamente quando il profitto è pari o superiore a un importo specificato, purché vi sia un'adeguata liquidità di mercato.", + "-1842858448": "Ottenere un profitto garantito sull'operazione.", + "-860053164": "Quando si fa trading con moltiplicatori.", + "-1250327770": "Quando si acquistano azioni di una società.", + "-1222388581": "Tutte le precedenti.", "-1515286538": "Inserisci il numero di documento. ", "-1694758788": "Inserisci il numero di documento", "-1458676679": "È necessario inserire da 2 a 50 caratteri.", @@ -2479,6 +2498,8 @@ "-1437017790": "Informazioni finanziarie", "-70342544": "Siamo tenuti legalmente a richiedere le tue informazioni finanziarie.", "-39038029": "Esperienza di trading", + "-601903492": "Esperienza di trading su Forex", + "-1012699451": "Esperienza di trading su CFD", "-1894668798": "Esperienza con altri strumenti di trading", "-1026468600": "Frequenza di utilizzo di altri strumenti di trading", "-1743024217": "Seleziona lingua", @@ -2489,6 +2510,11 @@ "-536187647": "Confermi la revoca dell'accesso?", "-1357606534": "Autorizzazione", "-570222048": "Revoca l'accesso", + "-80717068": "App che hai collegato alla tua <0>password di Deriv:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Usa la <0>password Deriv per accedere a {{brand_website_name}} e {{platform_name_trader}}.", + "-623760979": "Utilizzi la <0>password Deriv per accedere a {{brand_website_name}}, {{platform_name_trader}} e {{platform_name_go}}.", + "-459147994": "Utilizzi la <0>password Deriv per accedere a {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} e {{platform_name_ctrader}}.", "-1526404112": "Fatture relative a servizi di uso domestico: elettricità, acqua, gas, o rete fissa.", "-537552700": "Contratto di affitto della casa: contratto valido e attuale.", "-890084320": "Salva e invia", @@ -2510,11 +2536,20 @@ "-362324454": "Materie prime", "-1071336803": "Piattaforma", "-820028470": "Opzioni e moltiplicatori", - "-1255879419": "Trader's Hub", + "-1186807402": "Trasferisci", + "-224804428": "Operazioni", + "-470018967": "Ripristina saldo", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Reimposta", "-213142918": "Depositi e prelievi temporaneamente non disponibili ", - "-224804428": "Operazioni", - "-1186807402": "Trasferisci", "-1308346982": "Derivato", "-1145604233": "Fai trading con i CFD su MT5 con indici derivati che simulano i movimenti del mercato nel mondo reale.", "-328128497": "Finanziario", @@ -2525,15 +2560,29 @@ "-81256466": "È necessario un conto Deriv per creare un conto CFD.", "-699372497": "Fai trading con leva e spread ridotti per avere un ritorno maggiore sui trade che vanno a buon fine. <0>Scopri di più", "-1884966862": "Ottieni più conti Deriv MT5 di diverse tipologie e con più giurisdizioni.", - "-145462920": "Deriv cTrader", "-982095728": "Vai", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Avvertenza legale dell'UE: i CFD sono strumenti complessi che implicano un elevato rischio di perdere denaro rapidamente a causa della leva finanziaria. <0>Il 73% degli investitori al dettaglio subisce perdite. Ti invitiamo a valutare se sei effettivamente in grado di comprendere il funzionamento dei CFD e nelle condizioni di correre questo rischio.", "-1277942366": "Asset totali", + "-1255879419": "Trader's Hub", "-493788773": "Extra-UE", "-673837884": "UE", "-230566990": "I seguenti documenti che hai inviato non hanno superato i nostri controlli:", "-846812148": "Verifica dell'indirizzo.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Regolamento extra-UE", "-643108528": "Regolamento extra UE e UE", + "-979459594": "Buy/Sell", + "-494667560": "Ordini", + "-679691613": "I miei annunci", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Conto per moltiplicatori", "-744999940": "Conto Deriv", @@ -2543,9 +2592,20 @@ "-318106501": "Fai trading con CFD su MT5 su sintetici, panieri e sugli FX derivati.", "-1328701106": "Fai trading con CFD su MT5 su Forex, azioni, indici azionari, sintetici, criptovalute e materie prime.", "-1173266642": "Questo conto offre CFD su una piattaforma di trading ricca di funzionalità.", - "-1290112064": "Deriv EZ", "-1453519913": "Negoziare CFD su una piattaforma facile da avviare con tutti i suoi asset preferiti.", "-2051096382": "Guadagna una vasta gamma di pagamenti prevedendo correttamente i movimenti di mercato con <0>le opzioni, oppure ottieni i vantaggi dei CFD senza rischiare più della tua puntata iniziale con i <1>moltiplicatori.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Scelta del regolamento", "-249184528": "Puoi creare conti reali in base a normative UE o extra UE. Fai clic sull'<0><0/>icona per saperne di più su questi conti.", "-1505234170": "Visita del Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Ricarica il conto", "-1945421757": "Una volta che hai un conto, fai clic su «Deposita» o «Trasferisci» per aggiungervi fondi", "-1965920446": "Inizia il trading", - "-33612390": "<0>Avvertenza legale dell'UE: i CFD sono strumenti complessi che implicano un elevato rischio di perdere denaro rapidamente a causa della leva finanziaria. <0>Il 73% degli investitori al dettaglio subisce perdite. Ti invitiamo a valutare se sei effettivamente in grado di comprendere il funzionamento dei CFD e nelle condizioni di correre questo rischio.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Questo campo è obbligatorio.", "-1870909526": "Il nostro server non è in grado di recuperare l'indirizzo.", "-582721696": "Attualmente è possibile prelevare un importo compreso tra {{format_min_withdraw_amount}} e {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "L'indirizzo di portafoglio {{currency_symbol}}", "-38063175": "Portafoglio in {{account_text}}", "-705272444": "Carica un documento valido per verificare la tua identità", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Serve a proteggere il conto da prelievi non autorizzati.", "-130833284": "Il limite minimo e il limite massimo per il prelievo non sono fissi, ma possono cambiare in caso di elevata volatilità delle criptovalute.", "-1531269493": "Ti invieremo una e-mail quando l'operazione sarà completata.", @@ -2859,6 +2934,30 @@ "-1016171176": "Asset", "-621128676": "Tipologia di trade", "-447853970": "Soglia delle perdite", + "-155173714": "Costruiamo un bot!", + "-1919212468": "3. Puoi anche cercare i blocchi utilizzando la barra di ricerca sopra le categorie.", + "-1520558271": "Per ulteriori informazioni, dai un'occhiata a questo post del blog sulle basi della creazione di un bot di trading.", + "-980360663": "3. Scegli il blocco che desideri e trascinalo nell'area di lavoro.", + "-1493168314": "Cos'è una strategia rapida?", + "-1680391945": "Usare una strategia rapida", + "-1177914473": "Come salvo la mia strategia?", + "-271986909": "In Bot Builder, premi Salva nella barra degli strumenti in alto per scaricare il tuo bot. Assegna un nome al bot e scegli di scaricarlo sul tuo dispositivo o su Google Drive. Il bot verrà scaricato come file XML.", + "-1149045595": "1. Dopo aver premuto Importa, seleziona Local e fai clic su Continua.", + "-288041546": "2. Seleziona il tuo file XML e premi Apri.", + "-2127548288": "3. Il tuo bot verrà caricato di conseguenza.", + "-1311297611": "1. Dopo aver premuto Importa, seleziona Google Drive e fai clic su Continua.", + "-1549564044": "Come reimposto l'area di lavoro?", + "-1127331928": "In Bot Builder, premi Reset nella barra degli strumenti in alto. Questo cancellerà l'area di lavoro. Tieni presente che tutte le modifiche non salvate andranno perse.", + "-1720444288": "Come posso controllare le mie perdite con Deriv Bot?", + "-1142295124": "Esistono diversi modi per controllare le perdite con Deriv Bot. Ecco un semplice esempio di come può implementare il controllo delle perdite nella sua strategia:", + "-986689483": "1. Crea le seguenti variabili:", + "-269910127": "3. Aggiorna i profitti/perdite correnti con il profitto dell'ultimo contratto. Se l'ultimo contratto è andato perso, il valore dell'utile/perdita corrente sarà negativo.", + "-1565344891": "Posso eseguire Deriv Bot su più schede del mio browser web?", + "-90192474": "Sì, puoi. Tuttavia, ci sono dei limiti sul tuo account, come il numero massimo di posizioni aperte e il numero massimo di pagamenti aggregati sulle posizioni aperte. Quindi, tieni a mente questi limiti quando apri più posizioni. Puoi trovare maggiori informazioni su questi limiti in Impostazioni > Limiti dell'account.", + "-213872712": "No, non offriamo criptovalute su Deriv Bot.", + "-2147346223": "In quali Paesi è disponibile Deriv Bot?", + "-352345777": "Quali sono le strategie più popolari per il trading automatico?", + "-552392096": "Tre delle strategie più comunemente utilizzate nel trading automatico sono Martingala, D'Alembert e Oscar's Grind - le può trovare tutte pronte e in attesa di essere utilizzate in Deriv Bot.", "-507620484": "Non salvato", "-764102808": "Google Drive", "-555886064": "Vinto", @@ -2937,30 +3036,6 @@ "-1823621139": "Strategia rapida", "-1778025545": "Hai importato con successo un bot.", "-1519425996": "Nessun risultato trovato \"{{ faq_search_value }}»", - "-155173714": "Costruiamo un bot!", - "-1919212468": "3. Puoi anche cercare i blocchi utilizzando la barra di ricerca sopra le categorie.", - "-1520558271": "Per ulteriori informazioni, dai un'occhiata a questo post del blog sulle basi della creazione di un bot di trading.", - "-980360663": "3. Scegli il blocco che desideri e trascinalo nell'area di lavoro.", - "-1493168314": "Cos'è una strategia rapida?", - "-1680391945": "Usare una strategia rapida", - "-1177914473": "Come salvo la mia strategia?", - "-271986909": "In Bot Builder, premi Salva nella barra degli strumenti in alto per scaricare il tuo bot. Assegna un nome al bot e scegli di scaricarlo sul tuo dispositivo o su Google Drive. Il bot verrà scaricato come file XML.", - "-1149045595": "1. Dopo aver premuto Importa, seleziona Local e fai clic su Continua.", - "-288041546": "2. Seleziona il tuo file XML e premi Apri.", - "-2127548288": "3. Il tuo bot verrà caricato di conseguenza.", - "-1311297611": "1. Dopo aver premuto Importa, seleziona Google Drive e fai clic su Continua.", - "-1549564044": "Come reimposto l'area di lavoro?", - "-1127331928": "In Bot Builder, premi Reset nella barra degli strumenti in alto. Questo cancellerà l'area di lavoro. Tieni presente che tutte le modifiche non salvate andranno perse.", - "-1720444288": "Come posso controllare le mie perdite con Deriv Bot?", - "-1142295124": "Esistono diversi modi per controllare le perdite con Deriv Bot. Ecco un semplice esempio di come può implementare il controllo delle perdite nella sua strategia:", - "-986689483": "1. Crea le seguenti variabili:", - "-269910127": "3. Aggiorna i profitti/perdite correnti con il profitto dell'ultimo contratto. Se l'ultimo contratto è andato perso, il valore dell'utile/perdita corrente sarà negativo.", - "-1565344891": "Posso eseguire Deriv Bot su più schede del mio browser web?", - "-90192474": "Sì, puoi. Tuttavia, ci sono dei limiti sul tuo account, come il numero massimo di posizioni aperte e il numero massimo di pagamenti aggregati sulle posizioni aperte. Quindi, tieni a mente questi limiti quando apri più posizioni. Puoi trovare maggiori informazioni su questi limiti in Impostazioni > Limiti dell'account.", - "-213872712": "No, non offriamo criptovalute su Deriv Bot.", - "-2147346223": "In quali Paesi è disponibile Deriv Bot?", - "-352345777": "Quali sono le strategie più popolari per il trading automatico?", - "-552392096": "Tre delle strategie più comunemente utilizzate nel trading automatico sono Martingala, D'Alembert e Oscar's Grind - le può trovare tutte pronte e in attesa di essere utilizzate in Deriv Bot.", "-418247251": "Scarica il tuo registro.", "-2123571162": "Scarica", "-870004399": "<0>Acquistato:{{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Conto disattivato", "-1837059346": "Acquista / Vendi", "-1845037007": "Pagina dell'inserzionista", - "-494667560": "Ordini", - "-679691613": "I miei annunci", "-821418875": "Trader", "-679102561": "Dettagli del contratto", "-430118939": "Politica sui reclami", @@ -3082,7 +3155,6 @@ "-430041639": "Il documento a verifica dell'indirizzo non ha superato i nostri controlli e abbiamo applicato alcune restrizioni al tuo conto. Invia nuovamente il documento.", "-87177461": "Vai sulle impostazioni del conto e inserisci i dati personali per abilitare i depositi.", "-904632610": "Ripristina il saldo", - "-470018967": "Ripristina saldo", "-156611181": "Completa la valutazione finanziaria sulle impostazioni del conto per sbloccare l'operazione.", "-1925176811": "Impossibile prelevare fondi al momento", "-980696193": "I prelievi non sono momentaneamente disponibili a causa della manutenzione del sistema; potrai effettuarli a manutenzione finita.", @@ -3107,12 +3179,12 @@ "-577279362": "Invia il documento di verifica dell'identità per verificare il conto e continuare a fare trading.", "-197134911": "Il documento di verifica dell'identità è scaduto", "-152823394": "Il documento di verifica dell'identità è scaduto. Inviane uno nuovo per verificare il conto e continuare a fare trading.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Segua queste semplici istruzioni per risolvere il problema.", "-2142540205": "Sembra che l'indirizzo nel documento non corrisponda all'indirizzo nel tuo profilo Deriv. Aggiorna subito i tuoi dati personali con l'indirizzo corretto.", "-482715448": "Vai ai dati personali", "-2072411961": "Il documento di verifica dell'indirizzo è stato verificato", "-384887227": "Aggiorna l'indirizzo nel tuo profilo.", - "-448961363": "Non-UE", "-1998049070": "Se accetti l'uso dei cookies, clicca su Accetto. Per maggiori informazioni, <0>consulta la nostra politica.", "-402093392": "Aggiungi conto Deriv", "-1721181859": "Occorre un conto {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Schermo intero", "-1823504435": "Visualizza notifiche", "-1954045170": "Nessuna valuta assegnata", - "-583559763": "Menu", "-1591792668": "Limiti del conto", "-34495732": "Informazioni sulle normative", "-1496158755": "Vai su Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "La commissioni finanziaria accetta appelli per 45 giorni dopo la data dell'incidente e solo dopo che il trader ha provato a risolvere il problema direttamente con la società.", "-1825471709": "Una nuova esperienza di trading su una piattaforma semplice ed efficiente.", "-981017278": "Trading automatizzato e a portata di mano, senza bisogno di codifiche.", + "-583559763": "Menu", "-778309978": "Il link su cui hai fatto clic è scaduto. Assicurati di fare clic sul link nell'ultima e-mail nella tua casella di posta. In alternativa, inserisci la tua email qui sotto e fai clic su <0>Reinvia e-mail per un nuovo link.", "-336222114": "Segua questi semplici passi per risolvere il problema:", "-1064116456": "Cerchi il broker <0>Deriv Holdings (Guernsey) Limited e lo selezioni.", @@ -3415,22 +3487,6 @@ "-1282933308": "Non {{barrier}}", "-968190634": "Uguale a {{barrier}}", "-1747377543": "Inferiore a {{barrier}}", - "-256210543": "Al momento non è possibile avviare il trading.", - "-1150099396": "Stiamo lavorando per rendere questo servizio disponbile a breve. Se lo possiedi, accedi a un altro conto per continuare a fare trading; puoi anche aggiungere un conto finanziario Deriv MT5.", - "-28115241": "{{platform_name_trader}} non è disponibile per questo conto", - "-453920758": "Vai sul dashboard {{platform_name_mt5}}", - "-402175529": "Cronologia", - "-902712434": "Cancellazione", - "-988484646": "Cancellazione (conclusa)", - "-444882676": "Cancellazione (attiva)", - "-13423018": "ID di riferimento", - "-2035315547": "Barriera inferiore", - "-1551639437": "Nessuna cronologia", - "-1214703885": "Non hai ancora aggiornato il take profit o lo stop loss", - "-504849554": "Riapre alle", - "-59803288": "Intanto prova i nostri indici sintetici: simulano la volatilità del mercato reale e sono aperti 24/7.", - "-1278109940": "Vedi i mercati aperti", - "-694105443": "Il mercato è chiuso", "-1043795232": "Posizioni recenti", "-1511825574": "Profitto/Perdita:", "-726626679": "Profitto/perdita potenziale:", @@ -3455,21 +3511,15 @@ "-1435392215": "Cancellazione", "-2017825013": "Capito", "-1192773792": "Non mostrare più questo messaggio", + "-902712434": "Cancellazione", "-1280319153": "Annulla i trade in qualsiasi momento entro un termine stabilito. Si attiva automaticamente se il trade raggiunge il livello di stop out entro il termine stabilito.", "-471757681": "Gestione del rischio", "-843831637": "Stop loss", "-771725194": "Cancellazione", "-338707425": "La durata minima è 1 giorno", "-1003473648": "Durata: {{duration}} giorni", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Il payout alla scadenza è pari al payout per punto moltiplicato per la differenza tra il prezzo finale e il prezzo d'esercizio.", "-1527492178": "Acquisto bloccato", "-725375562": "Puoi bloccare/sbloccare il pulsante di acquisto dal menu Impostazioni", - "-774638412": "La posta in gioco deve essere compresa tra {{min_stake}} {{currency}} e {{max_stake}} {{currency}}", - "-1358367903": "Puntata", - "-434270664": "Prezzo attuale", - "-1956787775": "Prezzo Barriera:", - "-1513281069": "Barriera 2", "-390994177": "Dovrebbe essere compreso tra {{min}} e {{max}}", "-1804019534": "Scadenza: {{date}}", "-2055106024": "Alterna le impostazioni di durata semplici e avanzate", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "superiore", "-857660728": "Prezzo della puntata", + "-1358367903": "Puntata", "-1386326276": "È obbligatorio inserire una barriera.", "-1418742026": "La barriera superiore deve essere più alta rispetto a quella inferiore.", "-92007689": "La barriera inferiore deve essere più bassa rispetto a quella superiore.", @@ -3491,6 +3542,21 @@ "-1975910372": "I minuti devono essere inclusi tra 0 e 59.", "-866277689": "L'orario di scadenza non può essere nel passato.", "-1455298001": "Ora", + "-256210543": "Al momento non è possibile avviare il trading.", + "-1150099396": "Stiamo lavorando per rendere questo servizio disponbile a breve. Se lo possiedi, accedi a un altro conto per continuare a fare trading; puoi anche aggiungere un conto finanziario Deriv MT5.", + "-28115241": "{{platform_name_trader}} non è disponibile per questo conto", + "-453920758": "Vai sul dashboard {{platform_name_mt5}}", + "-402175529": "Cronologia", + "-988484646": "Cancellazione (conclusa)", + "-444882676": "Cancellazione (attiva)", + "-13423018": "ID di riferimento", + "-2035315547": "Barriera inferiore", + "-1551639437": "Nessuna cronologia", + "-1214703885": "Non hai ancora aggiornato il take profit o lo stop loss", + "-504849554": "Riapre alle", + "-59803288": "Intanto prova i nostri indici sintetici: simulano la volatilità del mercato reale e sono aperti 24/7.", + "-1278109940": "Vedi i mercati aperti", + "-694105443": "Il mercato è chiuso", "-439389714": "Ci stiamo lavorando", "-770929448": "Vai su {{platform_name_smarttrader}}", "-347156282": "Invia documento di verifica", @@ -3537,6 +3603,8 @@ "-454245976": "Se ritieni che il prezzo di mercato scenderà continuamente per un determinato periodo, scegli <0>Short. Riceverai un pagamento alla scadenza se il prezzo di mercato non tocca o supera la barriera. La tua vincita crescerà proporzionalmente alla distanza tra il prezzo di mercato e la barriera se la barriera non viene superata. Inizierai a realizzare un profitto quando la vincita sarà superiore alla tua puntata. Se il prezzo di mercato dovesse mai superare la barriera, non ci sarà alcun pagamento.", "-351875097": "Numero di tick", "-729830082": "Visualizza meno", + "-1669741470": "Il payout alla scadenza è pari al payout per punto moltiplicato per la differenza tra il prezzo finale e il prezzo d'esercizio.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NUOVO!", "-993480898": "Accumulatori", "-45873457": "NUOVO", @@ -3557,6 +3625,10 @@ "-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.", "-438655760": "<0>Nota: può chiudere l'operazione in qualsiasi momento. Sia consapevole del rischio di slippage.", + "-774638412": "La posta in gioco deve essere compresa tra {{min_stake}} {{currency}} e {{max_stake}} {{currency}}", + "-434270664": "Prezzo attuale", + "-1956787775": "Prezzo Barriera:", + "-1513281069": "Barriera 2", "-1683683754": "A lungo", "-1046859144": "<0>{{title}} Riceverai un pagamento se il prezzo di mercato rimane {{price_position}} e non tocca o supera la barriera. Altrimenti, il tuo pagamento sarà pari a zero.", "-1815023694": "al di sopra della barriera", diff --git a/packages/translations/src/translations/ko.json b/packages/translations/src/translations/ko.json index 4393cd678d7d..acb7970c5b4c 100644 --- a/packages/translations/src/translations/ko.json +++ b/packages/translations/src/translations/ko.json @@ -24,7 +24,6 @@ "27731356": "귀하의 계정이 일시적으로 중지되었습니다. 입금 및 인출을 다시 활성화하기 위해서는 <0>실시간 채팅을 통해 문의하시기 바랍니다.", "27830635": "Deriv (V) Ltd", "28581045": "실제 MT5 계좌 추가", - "30801950": "귀하의 계좌는 {{legal_entity_name}} 을 통해 개설될 것이며, 몰타 게임 규제 당국에 규제되고 몰타의 법률을 따르게 됩니다.", "33433576": "전자지갑을 이용하여 자금을 인출하시기 바랍니다.", "35089987": "귀하의 운전면허증의 앞면과 뒷면을 업로드하세요.", "41737927": "감사합니다", @@ -60,11 +59,13 @@ "72500774": "과세목적상 거주지를 입력해주시기 바랍니다.", "73086872": "귀하께서는 트레이딩에서 귀하를 직접 제외시켰습니다", "73326375": "저점은 해당 계약 기간 동안에 시장에 의해 도달된 가장 낮은 포인트를 의미합니다.", + "74836780": "{{currency_code}} Wallet", "74963864": "언더", "76916358": "귀하의 인출 금액이 한도에 도달했습니다. <0/>인출을 진행하기 위해서는 귀하의 신분증과 주소증명을 업로드하여 한도를 해제 하시기 바랍니다.", "76925355": "봇의 성능 확인하기", "77945356": "모바일 앱으로 이동 중에도 거래하세요.", "77982950": "바닐라 옵션을 사용하면 \"콜\" 또는 \"풋\"을 매수하여 기초자산의 상승(강세) 또는 하락(약세) 방향을 예측할 수 있습니다.", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "해당 페이지를 찾을 수 없었습니다", "82839270": "귀하의 사진이 포함되어 있는 여권 페이지를 업로드하세요.", "83202647": "블록 축소하기", @@ -76,6 +77,7 @@ "90266322": "2. 새롭게 생성하신 텔레그램 봇을 통해 대화를 시작하시고 다음 단계로 넘어가기 이전에 봇에게 메시지를 몇 개 전송해 주세요. (예: 안녕하세요 봇!)", "91993812": "마팅게일 전략은 18세기에 프랑스 수학자 폴 피에르 레비에 의해 대중화되었으며 100년이 넘는 기간 동안 사용되어 온 전통적인 트레이딩 기술입니다.", "93154671": "1. 통계 패널 하단의 재설정을 누릅니다.", + "93939827": "Cryptocurrency accounts", "96381225": "ID 인증이 실패되었습니다", "98473502": "우리는 적합성 시험을 수행할, 또는 위험 공지를 제공할 의무가 없습니다.", "98972777": "무작위 아이템", @@ -83,6 +85,7 @@ "102226908": "입력란은 비어 있을 수 없습니다", "108916570": "기간: {{duration}} 일", "109073671": "귀하께서 이전에 입금에 이용하신 전자지갑을 이용해 주시기 바랍니다. 귀하의 전자지갑이 인출을 지원하도록 확인 해 주세요. 인출을 지원하는 전자지갑의 목록을 <0>여기에서 확인하세요.", + "110822969": "One Wallet for all your transactions", "111215238": "직사광선으로부터 피해주세요", "111718006": "종료일", "111931529": "7일 동안의 최대 총 지분", @@ -215,7 +218,9 @@ "251882697": "감사합니다! 귀하의 응답이 저희 시스템에 기록되었습니다.<0/><0/> 계속 하시려면 ‘확인’을 클릭하시기 바랍니다.", "254912581": "이 블록은 입력 목록과 주어진 기간에 근거하여 EMA 전체 라인이 귀하에게 제공된다는 점을 제외하고는 EMA와 유사합니다.", "256031314": "현금 비즈니스", + "256123827": "What happens to my trading accounts", "256602726": "귀하의 계좌를 해지하는 경우:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "거래 평가", "260069181": "해당 URL을 로드하는 중에 오류가 발생했습니다", @@ -250,8 +255,8 @@ "284527272": "반최빈값", "284772879": "계약", "284809500": "파이낸셜 데모 (Financial Demo)", + "285909860": "Demo {{currency}} Wallet", "287934290": "정말 이 거래를 취소하시겠습니까?", - "289898640": "이용 약관", "291744889": "<0>1.거래 매개 변수: <0>", "291817757": "Deriv 커뮤니티로 이동하여 API, API 토큰, Deriv API 사용 방법 등에 대해 알아보세요.", "292491635": "귀하께서 \"손절매”를 선택하시고 귀하의 손실을 제한할 금액을 명시하시면, 귀하의 손실이 해당 금액보다 많거나 같을 때 귀하의 포지션이 자동적으로 종료될 것입니다. 귀하의 손실은 종료시의 시장 가격에 따라 귀하께서 입력하신 금액보다 더 클 수 있습니다.", @@ -299,6 +304,7 @@ "344418897": "이러한 거래한도 및 자가제한은 귀하께서 {{brand_website_name}} 에서 쓰시는 자금의 금액을 조절하고 <0>책임감 있는 거래를 하실 수 있도록 도와줍니다.", "345320063": "유효하지 않은 타임스탬프", "345818851": "죄송합니다. 내부 오류가 발생했습니다. 위의 체크박스를 눌러 다시 시도하세요.", + "346214602": "A better way to manage your funds", "347029309": "외환: 기준/마이크로", "347039138": "반복 (2)", "347217485": "모바일에서 Deriv MT5에 접속하는 데 문제가 있으신가요?", @@ -353,6 +359,7 @@ "401345454": "그렇게 하려면 튜토리얼 탭으로 이동하세요.", "402343402": "저희 서버 문제로 인해, 귀하의 몇몇 {{platform}} 계좌들을 현재 사용하실 수 없습니다. 귀하의 인내에 감사드립니다.", "403456289": "SMA의 공식은 다음과 같습니다:", + "403608958": "Select a trading account or a Wallet", "404743411": "총 입금액", "406359555": "계약 세부정보", "406497323": "필요한 경우 활성화되어 있는 귀하의 계약을 판매하세요 (선택 사항입니다)", @@ -373,6 +380,7 @@ "427617266": "비트코인", "428709688": "각 리포트 간에 귀하께서 선호하시는 시간 간격:", "431267979": "다음은 이동 중에 Deriv Bot을 사용하는 방법에 대한 간단한 가이드입니다.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "이익 실현: {{ currency }} {{ take_profit }}", "432519573": "문서가 업로드 되었습니다", @@ -453,12 +461,12 @@ "518955798": "7. 시작 시 한 번 실행", "520136698": "붐 500 (Boom 500) 지수", "521872670": "항목", - "522283618": "디지털 옵션 거래 경험", "522703281": "다음으로 나눌 수 있습니다", "523123321": "- 10에 주어진 숫자가 지수로 거듭제곱", "524459540": "어떻게 변수를 생성하나요?", "527329988": "이 비밀번호는 상위 100위에 들어가는 흔한 비밀번호입니다", "529056539": "옵션", + "530864956": "Deriv Apps", "530953413": "승인된 앱", "531114081": "3. 계약 유형", "531675669": "유로", @@ -473,10 +481,13 @@ "543915570": "외환, 주식, 주식 지수, 암호화폐, 합성 지수", "545476424": "인출 합계", "549479175": "Deriv Multipliers", + "549799607": "Go to LiveChat", "550589723": "현재 현물 가격이 이전 현물 가격에서 ±{{tick_size_barrier}} 이내로 유지되는 한, 귀하의 지분은 틱당 {{growth_rate}}% 씩 증가합니다.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "거래 한도에 대해 더 알아보세요", "554135844": "편집", "554410233": "이 비밀번호는 가장 흔한 비밀번호 상위 10위에 들어가는 흔한 비밀번호입니다", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "거래 매개변수와 거래 옵션을 정의한 후, 특정 조건이 충족되면 귀하의 봇이 계약을 구매할 수 있도록 지시하고자 할 수 있습니다. 이를 실행하기 위해 조건부 블록과 인디케이터 블록을 사용하여 봇이 결정을 내리도록 도울 수 있습니다.", "555881991": "주민등록번호 슬립", "556264438": "시간 간격", @@ -552,6 +563,7 @@ "629395043": "모든 성장률", "632398049": "이 블록은 항목 또는 명령문에 널 값을 할당합니다.", "634219491": "귀하께서는 세금 식별 번호를 제공하지 않으셨습니다. 이 정보는 법적 및 규제적 요구사항에 따라 필요한 정보입니다. 계정 설정의 <0>개인 세부정보 로 이동하여 귀하의 가장 최근 세금 식별 번호를 입력해 주시기 바랍니다.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.합의 기회가 없는 경우, 해당 불만은 결정 단계로 진행되어 DRC에서 처리됩니다.", "639382772": "지원되는 파일 유형을 업로드해 주세요.", "640596349": "귀하께서는 아직 알림을 받지 않으셨습니다", @@ -562,7 +574,6 @@ "642546661": "컴퓨터에서 라이선스의 뒷면을 업로드해주세요", "642995056": "이메일", "644150241": "스탯을 마지막으로 삭제한 이후부터 체결한 계약의 수.", - "645016681": "기타 금융 상품의 거래 빈도", "645902266": "EUR/NZD", "647039329": "주소 증명이 필요합니다", "647745382": "입력 목록 {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "아래의 예시에서는 시초가가 선택 된 후 \"op\"라는 변수에 할당됩니다.", "666724936": "유효한 ID 번호를 입력하시기 바랍니다.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "관할권 및 법률 선택", "674973192": "이 비밀번호를 사용하여 데스크톱, 웹 및 모바일 앱에서 귀하의 Deriv MT5 계정에 로그인하세요.", "676159329": "기본 계정으로 변경할 수 없었습니다.", @@ -613,6 +625,7 @@ "692354762": "{{document_name}}을 입력하세요. {{example_format}}", "693396140": "거래 취소 (만료)", "694035561": "트레이드 옵션 멀티플라이어", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- 시작 시간: 시작 타임 스탬프", "697630556": "이 시장은 현재 개설되어 있지 않습니다.", "698037001": "주민등록번호", @@ -624,8 +637,8 @@ "701647434": "문자열 검색", "702451070": "주민등록증 (사진 없음)", "702561961": "테마 변경", + "705262734": "Your Wallets are ready", "705299518": "다음으로는, 귀하의 사진을 포함하고 있는 여권 페이지를 업로드하세요.", - "706413212": "캐셔에 접근하기 위해서, 귀하께서는 {{regulation}} {{currency}} ({{loginid}}) 계정에 로그인되어 있습니다.", "706727320": "바이너리 옵션 거래 빈도", "706755289": "이 블록은 삼각 함수를 수행합니다.", "706960383": "만기 전에 계약을 매도하고자 하는 경우 이 가격으로 매입을 제안해 드립니다. 이는 현재 현물 가격, 기간 등 여러 요인을 고려해 결정됩니다. 단, 남은 기간이 60초 미만인 경우 계약 가격을 제시하지 않습니다.", @@ -644,6 +657,7 @@ "720293140": "로그아웃", "720519019": "비밀번호 재설정", "721011817": "- 밑을 첫번째 숫자로 하고 두번째 숫자를 지수로 하는 거듭제곱", + "722797282": "EU-regulated USD accounts", "723045653": "귀하께서는 이 이메일 주소로 귀하의 Deriv 계좌에 로그인 하실 것입니다.", "723961296": "비밀번호 관리", "724203548": "귀하께서는 귀하의 불만을 <0>유럽 위원회의 온라인 분쟁해결 (ODR) 플랫폼으로 보내실 수 있습니다. 이는 영국 고객분들께는 적용되지 않습니다.", @@ -656,6 +670,7 @@ "734390964": "부족한 잔액", "734881840": "거짓", "742469109": "잔액 재설정", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "높은 레버리지와 함께 원자재, 그리고 외환, 파생 지수, 암호화폐에 대하여 CFD를 거래하세요.", "743623600": "참조", "744110277": "볼린저 밴드 배열 (BBA)", @@ -689,6 +704,7 @@ "775706054": "트레이딩 봇을 판매하나요?", "776085955": "전략", "781924436": "콜 스프레드/풋 스프레드", + "782563319": "Add more Wallets", "783974693": "최근의 해는 피해주세요", "784311461": "지수함수 이동평균 (EMA)", "784583814": "귀하의 컴퓨터에 연결되었습니다", @@ -725,6 +741,7 @@ "818447476": "계좌를 변경하시겠습니까?", "820877027": "귀하의 신분증명을 인증해주세요", "821163626": "서버 점검은 매월 첫째 주 토요일 7~10시(GMT 기준)에 진행됩니다. 이 기간 동안 서비스가 중단될 수 있습니다.", + "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": "텍스트를 포함할 수 있는 블록입니다.", "824797920": "목록이 비어있나요?", "825042307": "다시 시도해 보겠습니다", @@ -747,7 +764,6 @@ "836097457": "저는 트레이딩에 관심이 있지만 경험이 거의 없습니다.", "837063385": "이 주소로 다른 통화를 보내지 마세요.", "837066896": "귀하의 서류가 검토되고 있습니다 1일에서 3일 이후에 다시 확인바랍니다.", - "839618971": "주소", "839805709": "귀하를 문제없이 인증하기 위해서, 우리는 더 나은 사진이 필요합니다", "840672750": "그래도 문제가 해결되지 않으면 MT5 앱을 삭제했다가 다시 설치하세요. 그런 다음 <0>2단계와 <0>3단계를 다시 실행합니다.", "841434703": "스택 비활성화", @@ -844,9 +860,9 @@ "943535887": "다음의 Deriv MT5 계좌(들)에서 귀하의 포지션들을 종료해 주시기 바랍니다:", "944499219": "최대 오픈 포지션", "945532698": "계약이 판매되었습니다", + "945753712": "Back to Trader’s Hub", "946204249": "읽기 전용", "946841802": "하얀 (또는 초록) 캔들은 시작가가 종가보다 낮다는 것을 나타냅니다. 이는 시장가의 상향이동을 나타냅니다.", - "946944859": "아래에 있는 버튼을 클릭하세요, 우리는 귀하에게 링크와 함께 이메일을 보내드릴 것입니다. 귀하의 인출 요청을 확인하기 위해 그 링크를 클릭하세요.", "947046137": "귀하의 인출은 24시간 이내로 처리될 것입니다", "947363256": "목록 만들기", "947758334": "도시는 요구되는 항목입니다", @@ -950,6 +966,7 @@ "1050128247": "결제 에이전트의 이체 정보를 확인했음을 컨펌합니다.", "1050844889": "보고서", "1052779010": "귀하께서는 데모 계좌를 사용하시고 계십니다", + "1052921318": "{{currency}} Wallet", "1053153674": "Jump 50 지수", "1053159279": "교육 수준", "1053556481": "불만 사항을 제출하시면 해당 불만 사항이 접수되었음을 확인하는 확인 이메일을 보내드립니다.", @@ -1010,6 +1027,7 @@ "1110102997": "명세서", "1112582372": "간격 기간", "1113119682": "이 블록은 캔들의 목록으로부터 선택되어진 캔들 값을 귀하에게 제공합니다.", + "1113221217": "MT5 Swap-free", "1113292761": "8MB 이하", "1114679006": "간단한 전략을 사용하여 성공적으로 봇을 만들었습니다.", "1117281935": "판매 조건 (선택 사항)", @@ -1036,6 +1054,7 @@ "1134879544": "반사된 부분이 있는 문서의 예시", "1138126442": "외환: 표준 (standard)", "1139483178": "스택 활성화", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "{{ direction_type }} 방향입니다", "1144028300": "상대강도지수 배열 (RSIA)", "1145927365": "주어진 초가 지난 이후 내부에서 블록을 구동하세요", @@ -1066,7 +1085,6 @@ "1174689133": "3. 거래 매개변수를 설정하고 실행.", "1174748431": "결제 채널", "1175183064": "바누아투", - "1176926166": "다른 금융상품 거래와 함께 경험하세요", "1177396776": "귀하께서 만약 \"Asian Fall\"을 선택하시면, 만약 틱들의 평균보다 마지막 틱이 낮은 경우에 지불금을 받으시게 됩니다.", "1177723589": "표시할 거래가 없습니다", "1178582280": "귀하께서 스탯을 삭제한 이후로부터 귀하께서 잃은 계약의 수.", @@ -1077,6 +1095,7 @@ "1181396316": "이 블록은 정해진 범위 내에서 무작위의 숫자를 귀하에게 제공합니다", "1181770592": "매도로부터 발생한 이윤/손실", "1183007646": "- 게약 종류: 상승, 하락, 터치, 노터치 등과 같은 계약 종류의 이름.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "지금 계약을 종료하거나 계속 운영하세요.계속 실행하기로 결정한 경우 나중에 확인하고 닫을 수 있습니다. ", "1188316409": "자금을 수령하기 위해서. 아래의 세부정보를 통해 결제 에이전트에게 문의하세요", "1188980408": "5분", @@ -1094,12 +1113,14 @@ "1201773643": "숫자의", "1203297580": "이 블록은 텔레그램 채널에 메시지를 전송합니다.", "1204223111": "이 예시에서, 캔들 목록에서의 개장가격은 \"candle_list\"로 불리는 변수에 할당되어집니다.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "카드를 가리는 방법", "1206821331": "군", "1207152000": "템플릿을 선택하고 거래 매개 변수를 설정합니다.", "1208714859": "줄여서:", "1208729868": "틱", "1208903663": "유효하지 않은 토큰", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "봇이 시작되고 있습니다", "1214893428": "휴대폰에서는 현재 계좌를 생성 하실 수 없습니다. 새 계좌를 생성하시기 위해 귀하의 컴퓨터로 로그인해주시기 바랍니다.", "1216408337": "자영업", @@ -1112,6 +1133,7 @@ "1222521778": "입금과 인출을 진행하는 것은 어렵습니다.", "1222544232": "우리는 귀하에게 이메일을 보내드렸습니다", "1225150022": "자산의 수", + "1226027513": "Transfer from", "1227074958": "무작위 분수", "1227240509": "띄어쓰기 제거", "1228534821": "몇몇 통화들의 경우 귀하의 국가에 있는 결제 에이전트들에 의해 지원되지 않을 수 있습니다.", @@ -1121,6 +1143,7 @@ "1232291311": "남아있는 최대 인출 금액", "1232353969": "지난 12개월에 걸쳐 0에서 5건의 거래 수", "1233300532": "지불금", + "1233376285": "Options & multipliers", "1234292259": "부의 원천", "1234764730": "개인 정보 항목에서 귀하의 성명과 이메일 주소의 스크린샷을 업로드하세요.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "주어진 목록에서 항목들을 숫자 또는 알파벳값의 오름차순 또는 내림차순을 통해 정리합니다.", "1281290230": "선택하기", "1282951921": "온리 다운", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "만약 \"손실\"이 선택되면, 귀하의 바로 이전의 거래가 성공적이지 않았을 경우에 \"참\"값이 나옵니다. 그렇지 않다면, 빈 줄이 나옵니다.", "1286094280": "인출", "1286507651": "신분검증 스크린 닫기", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "마진 콜", "1290525720": "예시: ", - "1291887623": "디지털 옵션 거래빈도", "1291997417": "계약은 선택한 만료일에 정확히 23:59:59(GMT)에 만료됩니다.", "1292188546": "Deriv MT5 투자자 비밀번호 재설정", "1292891860": "텔레그램 공지", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (판매)", "1329136554": "Jump 200 지수", "1329325646": "이 블록의 내용은 모든 틱마다 요구됩니다", + "1330479159": "Ready to upgrade?", "1331199417": "올바른 형식으로 입력해 주시기 바랍니다. ", "1331367811": "고객 계좌 번호", "1332168410": "더 알아보기", @@ -1257,7 +1281,6 @@ "1367023655": "귀하의 손실이 귀하의 지분을 초과하지 않도록 확실히 하기 위해, 귀하의 손실이 <0/>와 같아질 경우 귀하의 계약은 자동적으로 종료될 것입니다.", "1367488817": "4. 거래 조건 재시작", "1367990698": "변동성 10 지수", - "1369709538": "우리의 이용약관", "1370647009": "더 높은 일일 한도를 즐기세요", "1371193412": "취소", "1371555192": "선호하시는 결제 에이전트를 선택하시고 인출 금액을 입력하세요. 귀하의 결제 에이전트가 목록에 없다면, <0>이들의 계좌번호를 사용하여 검색하세요.", @@ -1319,6 +1342,7 @@ "1434767075": "파생 봇 시작하기", "1434976996": "공지", "1435363248": "이 블록은 유닉스 시간부터 초로 변환된 숫자를 2019-08-01 00:00:00처럼 날짜와 시간 형식으로 변환합니다.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "최소 입금액", "1437396005": "코멘트 추가", "1438247001": "전문가 고객은 다음의 이유 때문에 더 낮은 수준의 고객 보호를 받습니다.", @@ -1369,6 +1393,7 @@ "1476301886": "SMA와 비슷하게 이 블록은 주어진 기간동안에 모든 가치목록을 포함하는 SMA 선 전체를 귀하에게 제공합니다.", "1478030986": "트레이딩 및 인출에 대하여 API 토큰을 생성 또는 삭제하세요", "1480915523": "건너뛰기", + "1481860194": "Your new Wallet(s)", "1481977420": "우리가 귀하의 인출 요청을 확인할 수 있도록 도와주세요.", "1483470662": "'개설'를 클릭하여 귀하의 계정으로 거래를 시작하세요", "1484336612": "이 블록은 반복을 종료하거나 또는 지속하는 데에 사용되며 루프 블록 내에서 그 어디에서든지 놓여질 수 있습니다.", @@ -1389,6 +1414,7 @@ "1505420815": "귀하께서 검색하신 결제 에이전트를 찾을 수 없습니다", "1505898522": "스택 다운로드", "1505927599": "서버에 문제가 생겼습니다.새로 고침하여 다음 단계로 넘어갑시다.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (구매)", "1509678193": "교육", @@ -1419,7 +1445,7 @@ "1542742708": "합성수지, 외환, 주식, 주가지수, 원자재 및 암호화폐", "1544642951": "만약 귀하께서 \"Only Ups\"를 선택하시면, 연속적인 틱들이 엔트리 스팟 이후 성공적으로 오를 경우 귀하께서 지불금을 받습니다. 만약 그 어떠한 틱이라도 떨어지거나 또는 이전의 틱과 동일하다면 지불금은 없습니다.", "1547148381": "파일이 너무 큽니다 (최대 8MB까지만 허용됩니다). 다른 파일을 업로드하세요.", - "1548765374": "문서 번호의 인증이 실패되었습니다", + "1548765374": "Verification of document number failed", "1549098835": "인출된 총 금액", "1551172020": "AUD 바스켓", "1552162519": "온보딩 보기", @@ -1449,6 +1475,7 @@ "1577480486": "귀하의 모바일 링크는 한시간 이후에 만기될 것입니다", "1577527507": "계좌개설 이유는 필수 입력사항입니다.", "1577612026": "폴더를 선택하세요", + "1577879664": "<0>Your Wallets are ready", "1579839386": "앱스토어", "1580498808": "여러 얼굴들이 발견되었습니다", "1584109614": "틱 문자열 목록", @@ -1502,9 +1529,11 @@ "1644703962": "CFD 계정을 찾으시나요? Trader's Hub로 이동하세요", "1644864436": "전문가 고객이 되기 위해서는 먼저 귀하의 계정을 인증해야 합니다. <0>내 계정 인증하기", "1644908559": "숫자 코드가 요구됩니다.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "실행하는 동안에 해당 봇에 오류가 발견되었습니다.", "1648938920": "네덜란드 25 (Netherlands 25)", "1649239667": "2. 블록 메뉴 아래에 카테고리 목록이 표시됩니다. 블록은 이러한 범주 내에서 그룹화됩니다. 원하는 블록을 선택하고 작업 공간으로 끕니다.", + "1650963565": "Introducing Wallets", "1651513020": "각 간격 기간에 대하여 남아있는 시간을 보여줍니다", "1651951220": "\"abcabcabc\"과 같은 반복은 단지 \"abc\" 보다는 추측하기 약간 더 어렵습니다", "1652366857": "받기 및 제거", @@ -1522,13 +1551,13 @@ "1665272539": "기억하세요: 귀하께서는 선택된 날짜까지 귀하의 계좌로 로그인 하실 수 없습니다.", "1665738338": "잔액", "1665756261": "라이브챗으로 가기", + "1666783057": "Upgrade now", "1668138872": "계좌 설정 수정", "1670016002": "승수: {{ multiplier }}", "1670426231": "종료 시간", "1671232191": "귀하께서는 다음의 제한을 설정하셨습니다:", "1674163852": "기간 또는 종료 시간을 설정하여 계약 만료를 결정할 수 있습니다.", "1675030608": "이 계정을 생성하기 위해 먼저 귀하께서 귀하의 주소 증명을 다시 제출하셔야 합니다.", - "1675289747": "실제 계정으로 전환되었습니다", "1676549796": "다이나믹 레버리지", "1677027187": "외환", "1677990284": "나의 앱들", @@ -1556,6 +1585,7 @@ "1703091957": "당사는 자금 세탁 방지법의 요구에 따라 실사 의무의 일환으로 귀하의 고용 정보를 수집합니다.", "1704656659": "CFD 거래 경험이 얼마나 있습니까?", "1708413635": "귀하의 {{currency_name}} ({{currency}}) 계좌", + "1709293836": "Wallet balance", "1709401095": "금융 시장 및 당사의 Derived 지수로 Deriv X에서 CFD를 거래하세요.", "1709859601": "출구부 시간", "1710662619": "앱이 있으시다면, 앱을 실행하셔서 트레이딩을 시작하세요.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "귀하의 Deriv fiat과 Deriv 암호화폐 계좌들간의 송금들에 대해서 저희는 2% 송금 비용 또는 {{minimum_fee}} {{currency}} 중에서 더 높은 금액을 청구할 것입니다.", "1720968545": "귀하의 컴퓨터에서 여권 사진 페이지를 업로드해주세요", + "1723069433": "Your new Wallet", "1723589564": "귀하의 포트폴리오에 있는 처리해야 하는 계약건의 최대 수를 나타냅니다. 귀하의 포트폴리오에서 각각의 줄은 하나의 오픈 포지션을 나타냅니다. 최대 수에 도달되면 귀하께서는 현재 존재하는 포지션을 먼저 닫지 않고서는 새로운 포지션을 열 수 없습니다.", "1724696797": "귀하께서는 하나의 피아트 통화만 소유하실 수 있습니다.", "1725958461": "계좌 번호", @@ -1593,7 +1624,7 @@ "1740371444": "기초시장이 선택되지 않았습니다", "1742256256": "다음 문서 중 하나를 업로드 해주시기 바랍니다:", "1743448290": "지불 에이전트", - "1743679873": "<0>\"콜\"을 선택하면 <1>만기 시 <1>최종 가격이 <1>행사 가격 보다 높으면 <1>지급금을 받게 됩니다. 그렇지 않으면 지급금을 받지 못합니다.", + "1743679873": "<0>\"Call\" 을 선택한 경우 <1>최종 가격이 <1>행사 가격보다 높으면 <1>지급을 받게 됩니다. <1>만료 시. 그렇지 않으면 판매 대금을 받을 수 없습니다.", "1743902050": "귀하의 금융 평가를 완료해주세요", "1744509610": "컴퓨터에서 작업 영역으로 XML 파일을 끌어오기만 하면 봇이 그에 따라 로드됩니다. 또는 Bot Builder에서 가져오기를 누르고 컴퓨터 또는 Google 드라이브에서 봇을 가져오도록 선택할 수 있습니다.", "1745523557": "- 제곱근", @@ -1680,7 +1711,7 @@ "1821818748": "운전면허증 참조 번호 입력", "1823177196": "최고의 인기", "1824193700": "이 블록은 귀하에게 마지막 틱의 값에 대한 마지막 숫자를 제공합니다.", - "1824292864": "콜 (Call)", + "1824292864": "Call", "1827607208": "파일이 업로드되지 않았습니다.", "1828370654": "온보딩", "1830520348": "{{platform_name_dxtrade}} 비밀번호", @@ -1698,6 +1729,7 @@ "1842266423": "뒷면", "1842862156": "귀하의 Deriv X 대시보드에 오신 것을 환영합니다", "1843658716": "귀하께서 \"Only Downs\"을 선택하시면, 만약 연속적인 틱이 엔트리 스팟 이후 성공적으로 하락하는 경우 귀하께서 지불금을 받게 됩니다. 틱이 상승하거나 이전의 틱과 같아지면 지불되는 금액은 없습니다.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(최소: {{min_stake}} - 최대: {{max_payout}})", "1846266243": "이 기능은 데모 계좌에서는 활용할 수 없습니다.", "1846587187": "귀하께서는 귀하의 거주국가를 선택하지 않으셨습니다", @@ -1792,7 +1824,6 @@ "1924765698": "출생지*", "1926987784": "- iOS: 계정을 왼쪽으로 스와이프하고 <0>삭제를 탭합니다.", "1928930389": "GBP/NOK", - "1929309951": "고용 상태", "1929694162": "계좌 비교", "1930899934": "테더", "1931659123": "모든 틱에 대해서 실행하세요", @@ -1807,6 +1838,7 @@ "1943440862": "기간과 함께 한 목록으로부터의 볼린저 밴드 (BB)를 계산합니다", "1944204227": "이 블록은 현재의 계좌 잔액을 불러옵니다.", "1947527527": "1. 이 링크는 귀하에 의해 보내졌습니다", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "가능한 이유는 다음과 같습니다:", "1950413928": "신분증을 제출하세요", @@ -1875,6 +1907,7 @@ "2014536501": "카드 번호", "2014590669": "변수 '{{variable_name}}'가 값을 가지고 있지 않습니다. 공지하기 위해 변수 '{{variable_name}}'에 대하여 값을 설정해 주시기 바랍니다.", "2017672013": "문서가 발급된 국가를 선택해 주시기 바랍니다.", + "2020104747": "Filter", "2020545256": "계정을 닫으시겠습니까?", "2021037737": "진행하기 위해 귀하의 세부사항을 업데이트 해 주시기 바랍니다.", "2021161151": "파생 봇에서 트레이딩 봇을 구축하는 방법을 알아보려면 비디오를 시청하세요. 또한 블로그 게시물 에서 트레이딩 봇 구축에 대해 알아보세요.", @@ -1885,7 +1918,6 @@ "2027696535": "조세 정보", "2028163119": "EOS/USD", "2029237955": "라부안", - "2029641956": "CFD 계정 비교", "2030018735": "RSI는 귀하께서 시장 추세를 확인하실 수 있도록 도와주는 기술분석 툴입니다. RSI는 귀하에게 0부터 100까지의 값을 제공할 것입니다. RSI의 값 70과 그 이상의 의미는 해당 자산이 초과 매수되었다는 것과 현재의 추세가 반전될 수 있고 30 및 그 아래의 값은 해당 자산이 과매도되었다는 의미입니다.", "2030045667": "메시지", "2033648953": "이 블록은 선택된 시간 간격에 대한 명시된 캔들값을 귀하에게 제공합니다.", @@ -1919,6 +1951,7 @@ "2063812316": "문자 제어문", "2063890788": "취소되었습니다", "2065278286": "스프레드", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "운전 면허증", "2070002739": "수락하지 않습니다", "2070345146": "레버리지 CFD 거래를 개설할 때.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. 불만사항 제출", "2080553498": "3. 텔레그램 REST API를 활용하여 챗 ID를 받으세요 (더 읽어보기: https://core.telegram.org/bots/api#getupdates)", "2080829530": "판매금액: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "네, 삭제하겠습니다", "2084693624": "날짜/시간으로 표시되는 스트링을 에포크 시간 이후로의 초로 변환합니다. 예: 2019-01-01 21:03:45 GMT+0800는 1546347825로 변환될 것입니다. 시간과 시간대 오프셋은 선택사항입니다.", "2085387371": "반드시 숫자, 문자 및 특수문자. , ' - 여야 합니다", @@ -1966,7 +2000,6 @@ "2115223095": "손실", "2117165122": "1. 텔레그램 봇을 생성하시고 귀하의 텔레그램 API 토큰을 가지세요. 텔레그램에서 어떻게 봇을 생성하는지에 대해서는 다음의 링크에서 더 읽어보세요: https://core.telegram.org/bots#6-botfather", "2117489390": "{{ remaining }}초 후에 자동으로 업데이트 됩니다", - "2118315870": "귀하께서는 어디에 사시나요?", "2119449126": "아래 예시의 결과 예는 다음과 같을 것입니다:", "2119710534": "자주 하는 질문들", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "전문가 팁: 원하는 블록을 클릭하여 드래그할 수도 있습니다.", "2146892766": "바이너리 옵션 거래 경험", "2147244655": "내 트레이딩 봇을 파생 봇으로 가져오려면 어떻게 해야 하나요?", - "-1232613003": "<0>인증이 실패되었습니다. <1>왜 그런가요?", - "-2029508615": "<0>인증이 필요합니다.<1>지금 인증하세요", "-931052769": "인증 제출하기", "-1004605898": "팁", "-1938142055": "문서가 업로드되었습니다", @@ -2141,18 +2172,9 @@ "-179726573": "저희는 귀하의 소유권 증명을 받았습니다.", "-813779897": "소유권 증명 검증이 통과되었습니다.", "-638756912": "귀하의 직불/신용 카드 앞면에 표시되어 있는 카드 번호의 7 ~ 12자리 숫자를 검게 가리세요.", - "-2073934245": "이 사이트에서 제공되는 금융 거래 서비스는 투자한 금액을 모두 잃을 수 있는 가능성을 받아들이고 금융 계약의 구매에 연루되어 있는 위험에 대한 경험을 보유하신 고개분들만을 위한 것입니다. 금융 계약에서의 거래는 높은 수준의 위험을 수반합니다. 만약 귀하께서 구매하신 계약이 아무 가치가 없는 것으로 만기되면, 귀하께서는 해당되는 계약 프리미엄을 포함하는 투자하신 모든 부분을 잃게 될 것입니다.", - "-1166068675": "귀하의 계좌는 영국 도박 위원회 (UKGC) 에 의해 규제되는 {{legal_entity_name}} 를 통해 개설될 것이며, 맨섬의 법률을 따를 것입니다.", - "-975118358": "귀하의 계좌는 몰타 금융 서비스 당국 (MFSA) 에 의해 규제되는 {{legal_entity_name}} 을 통해 개설될 것이며, 몰타의 법률을 따를 것입니다.", - "-680528873": "귀하의 계좌는 {{legal_entity_name}} 을 통해 개설될 것이며 사모아의 법률에 따를 것입니다.", - "-1125193491": "계좌 추가", - "-2068229627": "저는 PEP가 아니며 지난 12개월간 PEP가 된 적이 없습니다.", "-684271315": "확인", "-740157281": "트레이딩 경험 평가", "-1720468017": "당사는 귀하에게 서비스를 제공할 때, 해당 상품 또는 서비스가 귀하에게 적합한지 여부를 평가하기 위해 귀하로부터 정보를 수집해야 합니다.", - "-186841084": "귀하의 로그인 이메일을 변경하세요", - "-907403572": "귀하의 이메일 주소를 변경하기 위해서는, 먼저 귀하의 {{identifier_title}} 계정과 이메일 주소의 연결을 해제해야 합니다.", - "-1850792730": "{{identifier_title}}로부터 연결해제", "-307865807": "위험 허용 경고", "-690100729": "네, 위험을 이해합니다.", "-2010628430": "CFD 및 기타 금융 상품은 레버리지로 인해 빠르게 자금을 잃을 위험이 높습니다. CFD 및 기타 금융 상품의 원리를 이해하시고 있는지와 자금을 잃을 수 있는 높은 위험을 감당할 수 있는지를 이해하시고 있는지 여부를 고려해야 합니다. <0/><0/>귀하의 자본이 위험에 처해 있다는 점을 이해하고 있는지를 확인하셔야 합니다.", @@ -2206,11 +2228,6 @@ "-1725454783": "실패되었습니다", "-506510414": "날짜 및 시간", "-1708927037": "IP 주소", - "-619126443": "{{brand_website_name}}, {{platform_name_trader}} 및 {} 에 로그인 하시기 위해 <0>Deriv 비밀번호를 사용하세요.", - "-623760979": "<0>Deriv 비밀번호를 사용하여 {{brand_website_name}}, {{platform_name_trader}} 및 {{platform_name_go}}에 로그인합니다.", - "-459147994": "<0>Deriv 비밀번호를 사용하여 {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} 및 {{platform_name_ctrader}}에 로그인합니다.", - "-80717068": "귀하의 <0>Deriv 비밀번호와 연결되어 있는 앱:", - "-9570380": "웹과 모바일 앱에서 귀하의 {{platform_name_dxtrade}} 계정들에 로그인 하시기 위해 {{platform_name_dxtrade}} 비밀번호를 이용하세요.", "-2131200819": "비활성화", "-200487676": "활성화", "-1840392236": "올바른 코드가 아닙니다. 다시 시작해주세요.", @@ -2240,44 +2257,37 @@ "-378415317": "주의 입력이 요구됩니다", "-1497654315": "저지섬의 우편번호에 대해서는 저희의 계좌들과 서비스들을 이용하실 수 없습니다.", "-755626951": "귀하의 주소 상세정보를 완료하세요", - "-584911871": "지갑의 통화를 선택하세요", "-1461267236": "귀하의 통화를 선택해주세요", - "-1352330125": "통화", "-1027595143": "$25,000 이하", "-40491332": "$25,000 - $50,000", "-1139806939": "$50,001 - $100,000", - "-626752657": "0-1 년", - "-532014689": "1-2 년", - "-1001024004": "3년에 걸쳐", - "-790513277": "지난 12월간에 걸친 6건에서 10건의 거래량", - "-580085300": "지난 12개월간에 걸친 11건에서 39건의 거래량", - "-654781670": "주요의", - "-1717373258": "이차의", "-996132458": "건설", "-915003867": "건강", "-1430012453": "정보 & 통신 기술", "-987824916": "과학 & 공학", "-146630682": "사회적 & 문화적", "-761306973": "제조", - "-739367071": "취업되어 있는 상태", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "$1,000,000 이상", - "-2068544539": "정규직 직장인", - "-531314998": "투자금 & 배당금", - "-1235114522": "연금", - "-1298056749": "주 보조금", - "-449943381": "저축 금액 & 상속", "-1631552645": "전문가", "-474864470": "개인 간병, 판매 및 서비스 종사자", "-1129355784": "농업, 삼림업 및 어업 종사자", "-1242914994": "공예, 금속, 전기 및 전자 종사자", "-1317824715": "클리너 및 도우미", "-1592729751": "광산, 건설, 제조 및 운송 종사자", + "-1030759620": "공무원", "-2137323480": "회사 소유권", "-1590574533": "이혼 위자료", "-1667683002": "상속", "-1237843731": "투자 수입", "-777506574": "자산의 판매", + "-654781670": "주요의", + "-1717373258": "이차의", + "-1156937070": "$500,001 - $1,000,000", + "-315534569": "$1,000,000 이상", + "-2068544539": "정규직 직장인", + "-531314998": "투자금 & 배당금", + "-1235114522": "연금", + "-1298056749": "주 보조금", + "-449943381": "저축 금액 & 상속", "-1161338910": "이름은 필수 입력사항입니다", "-1161818065": "성은 2~50자 사이여야 합니다.", "-1281693513": "생일은 필수 입력사항입니다.", @@ -2287,28 +2297,14 @@ "-212167954": "세금 식별 번호의 형식이 올바르지 않습니다.", "-621555159": "신분 정보", "-204765990": "이용약관", - "-231863107": "없습니다", - "-870902742": "온라인 트레이딩에 대한 지식과 경험은 어느 정도인가요?", - "-1929477717": "학업 학위, 전문 자격증, 및/또는 금융 서비스와 관련된 업무 경험이 있습니다.", - "-1540148863": "트레이딩과 관련된 세미나, 교육 및/또는 워크샵에 참석했습니다.", - "-922751756": "1년 미만", - "-542986255": "없음", - "-1337206552": "이해하시겠지만, CFD 거래를 통해 다음을 수행하실 수 있습니다", - "-456863190": "결과가 고정수익이거나 또는 수익이 전혀 없는 자산 가격 변동에 포지션을 설정하세요.", - "-1314683258": "수익 보장을 위해 장기 투자를 하세요.", - "-1546090184": "레버리지는 CFD 거래에 어떤 영향이 있나요?", - "-1636427115": "레버리지는 위험을 완화하는 데 도움이 됩니다.", - "-800221491": "레버리지는 수익을 보장합니다.", - "-811839563": "레버리지를 활용하면 거래 가치의 일부만으로 큰 포지션을 개설할 수 있으며, 이로 인해 수익 또는 손실이 증가할 수 있습니다.", - "-1185193552": "시장 유동성이 충분하다면 손실이 지정된 금액 이상일 때 자동으로 귀하의 거래를 종료하세요.", - "-1046354": "시장 유동성이 충분하다면 수익이 지정된 금액 이상일 때 귀하의 거래를 자동으로 마감하세요.", - "-1842858448": "거래에서 수익을 보장하세요.", - "-860053164": "승수를 거래할 때.", - "-1250327770": "회사의 주식을 살 때.", - "-1222388581": "위 항목 전체.", "-477761028": "유권자 신분증", "-1466346630": "CPF", - "-1030759620": "공무원", + "-739367071": "취업되어 있는 상태", + "-626752657": "0-1 년", + "-532014689": "1-2 년", + "-1001024004": "3년에 걸쳐", + "-790513277": "지난 12월간에 걸친 6건에서 10건의 거래량", + "-580085300": "지난 12개월간에 걸친 11건에서 39건의 거래량", "-612752984": "우리가 귀하의 계좌에 적용하는기본적인 제한이 있습니다.", "-1598263601": "거래 제한과 거래 제한이 어떻게 적용되는지 더 알고싶으시면, <0>헬프센터로 가시기 바랍니다.", "-1411635770": "계좌 한도에 대해 더 배워보세요", @@ -2326,10 +2322,7 @@ "-1500958859": "인증", "-1502578110": "귀하의 계좌가 인증 완료되었으며 인출한도가 풀렸습니다.", "-1662154767": "최근의 공과금 (예 전기세, 수도세, 가스세, 통신비, 또는 인터넷 요금), 은행 잔고증명서, 또는 귀하의 이름과 해당 주소가 표시되어 있는 정부에서 발급된 레터.", - "-190838815": "검증을 위해 우리는 이것을 필요로 합니다. 만약 귀하께서 제공하시는 정보가 가짜이거나 부정확한 경우, 귀하께서는 입금 및 인출을 하실 수 없게 됩니다.", - "-223216785": "주소의 둘째 줄*", "-594456225": "주소의 둘째 줄", - "-1940457555": "우편번호*", "-1964954030": "우편번호", "-516397235": "이 토큰을 누구와 공유하는지에 대해 주의하시기 바랍니다. 이 토큰을 가진 사람들은 귀하의 계좌를 대신하여 누구나 다음의 작업을 수행할 수 있습니다.", "-989216986": "계좌 추가", @@ -2371,8 +2364,6 @@ "-1100235269": "고용산업부문", "-684388823": "예상되는 순수 가치", "-509054266": "예상되는 연간 턴오버", - "-601903492": "외환 거래 경험", - "-1012699451": "CFD 거래 경험", "-1588485629": "예", "-1117345066": "문서 종류를 선택하세요", "-651192353": "샘플:", @@ -2394,11 +2385,11 @@ "-1088324715": "저희는 귀하의 문서를 검토한 후 해당 상태를 영업일 기준으로 1~3일 이내로 공지해 드리겠습니다.", "-329713179": "예", "-1176889260": "문서의 종류를 선택해 주시기 바랍니다.", - "-1926456107": "귀하꼐서 제출하신 신분증은 만료되었습니다.", - "-555047589": "귀하의 신분증이 만료된 것으로 보입니다. 유효한 문서로 재시도 해주시기 바랍니다.", - "-841187054": "재시도하기", + "-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": "우리는 귀하께서 제공하신 세부정보로 귀하의 ID를 검증할 수 없었습니다. ", - "-228284848": "우리는 귀하께서 제공하신 세부정보와 함께 귀하의 ID를 검증할 수 없었습니다.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "귀하의 ID는 검증되었습니다. 귀하께서는 귀하의 주소증명 또한 제출하셔야 합니다.", "-118547687": "ID가 검증되었습니다", "-200989771": "세부 인적사항으로 가기", @@ -2464,12 +2455,40 @@ "-142444667": "귀하의 Deriv MT5 비밀번호를 변경하기 위해 이메일에 있는 링크를 클릭하시기 바랍니다.", "-742748008": "진행하시기 위해 귀하의 이메일을 확인하시고 이메일에 있는 링크를 클릭하세요.", "-84068414": "이메일을 아직 받지 못하셨나요? <0>라이브 챗.을 통해 저희에게 연락해 주시기 바랍니다", + "-975118358": "귀하의 계좌는 몰타 금융 서비스 당국 (MFSA) 에 의해 규제되는 {{legal_entity_name}} 을 통해 개설될 것이며, 몰타의 법률을 따를 것입니다.", + "-2073934245": "이 사이트에서 제공되는 금융 거래 서비스는 투자한 금액을 모두 잃을 수 있는 가능성을 받아들이고 금융 계약의 구매에 연루되어 있는 위험에 대한 경험을 보유하신 고개분들만을 위한 것입니다. 금융 계약에서의 거래는 높은 수준의 위험을 수반합니다. 만약 귀하께서 구매하신 계약이 아무 가치가 없는 것으로 만기되면, 귀하께서는 해당되는 계약 프리미엄을 포함하는 투자하신 모든 부분을 잃게 될 것입니다.", + "-1125193491": "계좌 추가", + "-2068229627": "저는 PEP가 아니며 지난 12개월간 PEP가 된 적이 없습니다.", + "-186841084": "귀하의 로그인 이메일을 변경하세요", + "-907403572": "귀하의 이메일 주소를 변경하기 위해서는, 먼저 귀하의 {{identifier_title}} 계정과 이메일 주소의 연결을 해제해야 합니다.", + "-1850792730": "{{identifier_title}}로부터 연결해제", "-428335668": "귀하께서는 이 절차를 완료하시기 위해 비밀번호를 설정하셔야 합니다.", + "-1232613003": "<0>인증이 실패되었습니다. <1>왜 그런가요?", + "-2029508615": "<0>인증이 필요합니다.<1>지금 인증하세요", "-818898181": "문서의 이름이 파생 프로필과 일치하지 않습니다.", "-310316375": "문서의 주소가 위에 입력한 주소와 일치하지 않습니다.", "-485368404": "6개월 이상 전에 발급된 문서.", "-367016488": "흐릿한 문서. 모든 정보는 명확하고 눈에 잘 띄어야 합니다.", "-1957076143": "자른 문서. 모든 정보는 명확하고 눈에 띄어야 합니다.", + "-231863107": "없습니다", + "-870902742": "온라인 트레이딩에 대한 지식과 경험은 어느 정도인가요?", + "-1929477717": "학업 학위, 전문 자격증, 및/또는 금융 서비스와 관련된 업무 경험이 있습니다.", + "-1540148863": "트레이딩과 관련된 세미나, 교육 및/또는 워크샵에 참석했습니다.", + "-922751756": "1년 미만", + "-542986255": "없음", + "-1337206552": "이해하시겠지만, CFD 거래를 통해 다음을 수행하실 수 있습니다", + "-456863190": "결과가 고정수익이거나 또는 수익이 전혀 없는 자산 가격 변동에 포지션을 설정하세요.", + "-1314683258": "수익 보장을 위해 장기 투자를 하세요.", + "-1546090184": "레버리지는 CFD 거래에 어떤 영향이 있나요?", + "-1636427115": "레버리지는 위험을 완화하는 데 도움이 됩니다.", + "-800221491": "레버리지는 수익을 보장합니다.", + "-811839563": "레버리지를 활용하면 거래 가치의 일부만으로 큰 포지션을 개설할 수 있으며, 이로 인해 수익 또는 손실이 증가할 수 있습니다.", + "-1185193552": "시장 유동성이 충분하다면 손실이 지정된 금액 이상일 때 자동으로 귀하의 거래를 종료하세요.", + "-1046354": "시장 유동성이 충분하다면 수익이 지정된 금액 이상일 때 귀하의 거래를 자동으로 마감하세요.", + "-1842858448": "거래에서 수익을 보장하세요.", + "-860053164": "승수를 거래할 때.", + "-1250327770": "회사의 주식을 살 때.", + "-1222388581": "위 항목 전체.", "-1515286538": "귀하의 문서 번호를 입력해 주시기 바랍니다. ", "-1694758788": "문서 번호 입력", "-1458676679": "문자수는 2개에서 50개 사이로 입력하셔야 합니다.", @@ -2479,6 +2498,8 @@ "-1437017790": "재무 정보", "-70342544": "우리는 귀하의 금융 정보를 요청해야 할 법적 의무가 있습니다.", "-39038029": "거래 경험", + "-601903492": "외환 거래 경험", + "-1012699451": "CFD 거래 경험", "-1894668798": "기타 다른 트레이딩 상품 경험", "-1026468600": "기타 다른 트레이딩 상품 빈도", "-1743024217": "언어 선택", @@ -2489,6 +2510,11 @@ "-536187647": "접근 철회가 확실합니까?", "-1357606534": "허가", "-570222048": "접근 철회", + "-80717068": "귀하의 <0>Deriv 비밀번호와 연결되어 있는 앱:", + "-340060402": "귀하의 Deriv X 비밀번호는 웹 및 모바일 앱에서 Deriv X 계정에 로그인하기 위한 것입니다.", + "-619126443": "{{brand_website_name}}, {{platform_name_trader}} 및 {} 에 로그인 하시기 위해 <0>Deriv 비밀번호를 사용하세요.", + "-623760979": "<0>Deriv 비밀번호를 사용하여 {{brand_website_name}}, {{platform_name_trader}} 및 {{platform_name_go}}에 로그인합니다.", + "-459147994": "<0>Deriv 비밀번호를 사용하여 {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} 및 {{platform_name_ctrader}}에 로그인합니다.", "-1526404112": "공공요금: 전기, 수도, 가스 또는 유선 전화 요금.", "-537552700": "주택 임대차 계약: 유효한 최신 계약입니다.", "-890084320": "저장 및 제출", @@ -2510,11 +2536,20 @@ "-362324454": "원자재", "-1071336803": "플랫폼", "-820028470": "옵션 & 승수", - "-1255879419": "Trader's Hub", + "-1186807402": "송금", + "-224804428": "거래", + "-470018967": "잔액 재설정", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "재설정", "-213142918": "입금 및 출금이 일시적으로 불가능합니다. ", - "-224804428": "거래", - "-1186807402": "송금", "-1308346982": "파생", "-1145604233": "실제 시장 움직임을 시뮬레이션하는 파생 지수로 MT5에서 CFD를 거래하세요.", "-328128497": "금융", @@ -2525,15 +2560,29 @@ "-81256466": "CFD 계정을 만들려면 Deriv 계정이 필요합니다.", "-699372497": "성공적인 거래들에 대하여 더 나은 보상을 위해 레버리지와 촘촘한 스프레드와 함께 거래하세요. <0>자세히 알아보기", "-1884966862": "유형 및 관할 구역이 다른 Deriv MT5 계정을 더 많이 확보하십시오.", - "-145462920": "Deriv cTrader", "-982095728": "받기", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>EU 법적 고지 사항: CFD는 복잡한 상품이며 레버리지로 인해 손실이 급속히 커질 위험이 있습니다. <0>본 업체에서 CFD를 거래하는 개인 투자자 계좌의 73% 가 손실을 보고 있습니다. CFD의 작동 방식을 잘 이해하고 있는지, 높은 손실 위험을 감수할 수 있는지 고려해야 합니다.", "-1277942366": "총 자산", + "-1255879419": "Trader's Hub", "-493788773": "비 EU", "-673837884": "유럽 연합", "-230566990": "제출한 다음 문서가 검사를 통과하지 못했습니다.", "-846812148": "주소증명.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "비 유럽연합 규정", "-643108528": "비 EU 및 EU 규정", + "-979459594": "Buy/Sell", + "-494667560": "주문", + "-679691613": "내 광고", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "승수 계정", "-744999940": "Deriv 계좌", @@ -2543,9 +2592,20 @@ "-318106501": "합성상품, 바스켓 및 파생 FX로 MT5에서 CFD를 거래하세요.", "-1328701106": "외환, 주식, 주식 지수, 합성상품, 암호화폐 및 원자재로 MT5에서 CFD를 거래하세요.", "-1173266642": "이 계좌는 풍부한 기능의 거래 플랫폼에서 CFD를 제공합니다.", - "-1290112064": "Deriv EZ", "-1453519913": "시작하기 쉬운 플랫폼에서 좋아하는 모든 자산으로 CFD를 거래하세요.", "-2051096382": "시장 변동을 정확하게 예측하여 다양한 범위의 수익을 창출하십시오. <0>옵션 지분을 보다 더 많이 잃는 단점 없이 CFD의 장점을 <1>승수로 누리십시오.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "규제 항목 선택", "-249184528": "EU 또는 비 EU 규정에 따라 실제 계정을 만들 수 있습니다.<0><0/>아이콘을 클릭하면 해당 계정에 대해 자세히 알아볼 수 있습니다.", "-1505234170": "Trader's Hub 투어", @@ -2556,7 +2616,21 @@ "-951876657": "계정 충전", "-1945421757": "계좌를 개설한 후 '입금' 또는 '이체'를 클릭하여 계좌에 자금을 추가하세요.", "-1965920446": "거래 시작하기", - "-33612390": "<0>EU 법적 고지 사항: CFD는 복잡한 상품이며 레버리지로 인해 손실이 급속히 커질 위험이 있습니다. <0>본 업체에서 CFD를 거래하는 개인 투자자 계좌의 73% 가 손실을 보고 있습니다. CFD의 작동 방식을 잘 이해하고 있는지, 높은 손실 위험을 감수할 수 있는지 고려해야 합니다.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "이 항목을 채워주세요.", "-1870909526": "우리의 서버가 주소를 검색할 수 없습니다.", "-582721696": "현재 허용되는 인출금액은 {{format_min_withdraw_amount}} 에서 {{format_max_withdraw_amount}} {{currency}} 입니다", @@ -2703,6 +2777,7 @@ "-1707299138": "귀하의 {{currency_symbol}} 지갑 주소", "-38063175": "{{account_text}} 지갑", "-705272444": "귀하의 신분을 인증하기 위해 신분증을 업로드하세요", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "이는 귀하의 계좌를 인가되지 않은 인출로부터 보호하기 위한 것입니다.", "-130833284": "귀하의 최대 및 최소 인출 한도가 고정되어 있지 않다는 점을 아시기 바랍니다. 해당 한도들은 암호화폐의 높은 변동성 때문에 변합니다.", "-1531269493": "귀하의 거래가 처리되면 우리가 귀하에게 이메일을 전송해 드릴 것입니다.", @@ -2859,6 +2934,30 @@ "-1016171176": "자산", "-621128676": "거래 종류", "-447853970": "손실 특정수준", + "-155173714": "봇을 만들어 봅시다!", + "-1919212468": "3. 카테고리 위의 검색 창을 사용하여 원하시는 블록을 검색하실 수도 있습니다.", + "-1520558271": "자세한 내용은 거래 봇 구축의 기본 사항에 대한 이 블로그 게시물을 확인하세요.", + "-980360663": "3.원하는 블록을 선택하고 작업 공간으로 드래그합니다.", + "-1493168314": "빠른 전략이란 무엇인가요?", + "-1680391945": "빠른 전략 사용", + "-1177914473": "제 전략을 어떻게 저장할 수 있나요?", + "-271986909": "Bot Builder에서 상단의 도구 모음에서 저장을 눌러 봇을 다운로드합니다. 봇에 이름을 지정하고 봇을 디바이스 또는 Google 드라이브에 다운로드하도록 선택합니다. 봇이 XML 파일로 다운로드됩니다.", + "-1149045595": "1. 가져오기를 누른 후 로컬을 선택하고 계속을 클릭합니다.", + "-288041546": "2. XML 파일을 선택하고 열기를 누르십시오.", + "-2127548288": "3.그에 따라 봇이 로드됩니다.", + "-1311297611": "1. 가져오기를 누른 후 Google 드라이브를 선택하고 계속을 클릭합니다.", + "-1549564044": "작업공간을 어떻게 리셋할 수 있나요?", + "-1127331928": "Bot Builder의 맨 위에 있는 도구 모음에서 재설정을 누릅니다. 이렇게 하면 작업 공간이 지워집니다. 저장하지 않은 변경 사항은 손실됩니다.", + "-1720444288": "파생 봇으로 손실을 관리하려면 어떻게 해야 하나요?", + "-1142295124": "파생 봇으로 손실을 제어하는 방법에는 여러 가지가 있습니다. 다음은 전략에서 손실 통제를 구현하는 방법에 대한 간단한 예입니다:", + "-986689483": "1. 다음의 변수를 생성하세요:", + "-269910127": "3. 현재 손익을 마지막 계약의 수익으로 업데이트하십시오.마지막 계약이 손실된 경우 현재 손익의 가치는 마이너스가 됩니다.", + "-1565344891": "웹 브라우저의 여러 탭에서 파생 봇을 실행할 수 있나요?", + "-90192474": "예, 가능합니다. 그러나 계좌에는 최대 오픈 포지션 수와 오픈 포지션에 대한 최대 총 지급금 등의 제한이 있습니다. 따라서 여러 포지션을 개설할 때는 이러한 한도를 염두에 두시기 바랍니다. 이러한 한도에 대한 자세한 정보는 다음에서 확인할 수 있습니다설정 > 계정 한도.", + "-213872712": "아니요, 파생 봇에서는 암호화폐를 제공하지 않습니다.", + "-2147346223": "파생 봇은 어느 국가에서 사용할 수 있나요?", + "-352345777": "자동거래를 위한 가장 인기있는 전략은 무엇인가요?", + "-552392096": "자동매매에서 가장 많이 사용되는 세 가지 전략은 마틴게일, 달렘버트, 오스카스 그라인드이며, 파생 봇에서 모두 기성품으로 제공되어 기다리고 있습니다.", "-507620484": "저장안됨", "-764102808": "구글 드라이브", "-555886064": "획득", @@ -2937,30 +3036,6 @@ "-1823621139": "빠른 전략", "-1778025545": "봇을 성공적으로 가져왔습니다.", "-1519425996": "검색된 결과 없음 \"{{ faq_search_value }}”", - "-155173714": "봇을 만들어 봅시다!", - "-1919212468": "3. 카테고리 위의 검색 창을 사용하여 원하시는 블록을 검색하실 수도 있습니다.", - "-1520558271": "자세한 내용은 거래 봇 구축의 기본 사항에 대한 이 블로그 게시물을 확인하세요.", - "-980360663": "3.원하는 블록을 선택하고 작업 공간으로 드래그합니다.", - "-1493168314": "빠른 전략이란 무엇인가요?", - "-1680391945": "빠른 전략 사용", - "-1177914473": "제 전략을 어떻게 저장할 수 있나요?", - "-271986909": "Bot Builder에서 상단의 도구 모음에서 저장을 눌러 봇을 다운로드합니다. 봇에 이름을 지정하고 봇을 디바이스 또는 Google 드라이브에 다운로드하도록 선택합니다. 봇이 XML 파일로 다운로드됩니다.", - "-1149045595": "1. 가져오기를 누른 후 로컬을 선택하고 계속을 클릭합니다.", - "-288041546": "2. XML 파일을 선택하고 열기를 누르십시오.", - "-2127548288": "3.그에 따라 봇이 로드됩니다.", - "-1311297611": "1. 가져오기를 누른 후 Google 드라이브를 선택하고 계속을 클릭합니다.", - "-1549564044": "작업공간을 어떻게 리셋할 수 있나요?", - "-1127331928": "Bot Builder의 맨 위에 있는 도구 모음에서 재설정을 누릅니다. 이렇게 하면 작업 공간이 지워집니다. 저장하지 않은 변경 사항은 손실됩니다.", - "-1720444288": "파생 봇으로 손실을 관리하려면 어떻게 해야 하나요?", - "-1142295124": "파생 봇으로 손실을 제어하는 방법에는 여러 가지가 있습니다. 다음은 전략에서 손실 통제를 구현하는 방법에 대한 간단한 예입니다:", - "-986689483": "1. 다음의 변수를 생성하세요:", - "-269910127": "3. 현재 손익을 마지막 계약의 수익으로 업데이트하십시오.마지막 계약이 손실된 경우 현재 손익의 가치는 마이너스가 됩니다.", - "-1565344891": "웹 브라우저의 여러 탭에서 파생 봇을 실행할 수 있나요?", - "-90192474": "예, 가능합니다. 그러나 계좌에는 최대 오픈 포지션 수와 오픈 포지션에 대한 최대 총 지급금 등의 제한이 있습니다. 따라서 여러 포지션을 개설할 때는 이러한 한도를 염두에 두시기 바랍니다. 이러한 한도에 대한 자세한 정보는 다음에서 확인할 수 있습니다설정 > 계정 한도.", - "-213872712": "아니요, 파생 봇에서는 암호화폐를 제공하지 않습니다.", - "-2147346223": "파생 봇은 어느 국가에서 사용할 수 있나요?", - "-352345777": "자동거래를 위한 가장 인기있는 전략은 무엇인가요?", - "-552392096": "자동매매에서 가장 많이 사용되는 세 가지 전략은 마틴게일, 달렘버트, 오스카스 그라인드이며, 파생 봇에서 모두 기성품으로 제공되어 기다리고 있습니다.", "-418247251": "귀하의 저널을 다운로드하세요.", "-2123571162": "다운로드", "-870004399": "<0>매입완료: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "계좌가 비활성화되었습니다", "-1837059346": "구매 / 판매", "-1845037007": "광고주 페이지", - "-494667560": "주문", - "-679691613": "내 광고", "-821418875": "트레이더", "-679102561": "계약 세부사항", "-430118939": "불만절차", @@ -3082,7 +3155,6 @@ "-430041639": "귀하의 주소 증명이 저희의 인증 검사를 통과하지 못했으며, 이에 따라 저희는 귀하의 계좌에 몇몇의 제한을 두었습니다. 귀하의 주소 증명을 다시 제출해 주시기 바랍니다.", "-87177461": "예금을 활성화시키기 위해 귀하의 계좌 설정으로 가셔서 귀하의 세부 인적사항을 완료해 주시기 바랍니다.", "-904632610": "귀하의 잔액 재설정", - "-470018967": "잔액 재설정", "-156611181": "잠금되어 있는 것을 해제하기 위해 귀하의 계좌 설정에서 금융 평가를 완료해 주시기 바랍니다.", "-1925176811": "잠시동안 인출을 처리할 수 없습니다", "-980696193": "시스템 관리로 인해 인출은 일시적으로 불가능합니다. 귀하께서는 시스템 관리가 완료되면 인출을 진행하실 수 있습니다.", @@ -3107,12 +3179,12 @@ "-577279362": "계정을 확인하고 거래를 계속하려면 신원 증명을 제출하세요.", "-197134911": "신분 증명이 만료되었습니다", "-152823394": "신분 증명이 만료되었습니다. 계정을 확인하고 거래를 계속하려면 새 신분 증명을 제출하세요.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "다음의 간단한 지침에 따라 문제를 해결하세요.", "-2142540205": "귀하의 문서에 나와있는 주소가 귀하의 Deriv 프로필에 있는 주소와 일치하지 않는 것으로 보입니다. 귀하의 개인 세부정보를 지금 올바른 주소로 업데이트하시기 바랍니다.", "-482715448": "개인 세부 정보로 이동", "-2072411961": "귀하의 주소 증명이 인증되었습니다", "-384887227": "프로필에서 주소를 업데이트하세요.", - "-448961363": "비 EU", "-1998049070": "귀하께서 저희의 쿠키 활용에 동의하신다면, 동의하기 버튼을 클릭하세요. 더 많은 정보를 위해서는, <0>우리의 정책을 확인해주세요.", "-402093392": "Deriv 계정 추가", "-1721181859": "귀하께서는 {{deriv_account}} 계좌가 필요합니다", @@ -3125,7 +3197,6 @@ "-650505513": "전체 화면", "-1823504435": "공지 확인", "-1954045170": "할당된 통화가 없습니다", - "-583559763": "메뉴", "-1591792668": "계정 한도", "-34495732": "규제 정보", "-1496158755": "Deriv.com으로 이동", @@ -3259,6 +3330,7 @@ "-818926350": "금융 위원회는 사건 발생일로부터 45일간만 항소를 받아들이며 해당 트레이더가 해당 문제를 해당 회사와 직접적으로 통해 해결하려고 한 이후에만 받아들여집니다.", "-1825471709": "강력하지만 이용하기 쉬운 플랫폼에서의 완전히 새로운 트레이딩 경험.", "-981017278": "귀하의 손가락 끝에서 진행되는 자동화된 거래입니다. 코팅이 필요하지 않습니다.", + "-583559763": "메뉴", "-778309978": "클릭하신 링크는 만료되었습니다. 받은 편지함에서 최신 이메일 내의 링크를 클릭해야 합니다. 대안적으로는, 아래에 있는 귀하의 이메일을 입력하고 <0>이메일 재전송을 클릭하여 새 링크를 받을 수도 있습니다.", "-336222114": "이 문제를 해결하려면 다음의 간단한 단계를 따르세요:", "-1064116456": "브로커 <0>Deriv Holdings (Guernsey) Limited를 검색하여 선택합니다.", @@ -3415,22 +3487,6 @@ "-1282933308": "{{barrier}} 아님", "-968190634": "{{barrier}} 일치", "-1747377543": "{{barrier}} 아래", - "-256210543": "이 시간에는 트레이딩을 할 수 없습니다.", - "-1150099396": "이 기능을 곧 사용할 수 있도록 작업 중입니다. 다른 계좌를 가지고 계신다면, 그 계좌로 전환하여 거래를 진행하세요. Deriv MT5 파이낸셜을 추가하실 수 있습니다.", - "-28115241": "이 계정에서는 {{platform_name_trader}} 를 이용하실 수 없습니다", - "-453920758": "{{platform_name_mt5}} 대시보드로 이동", - "-402175529": "내역", - "-902712434": "거래 취소", - "-988484646": "거래 취소 (실행됨)", - "-444882676": "거래 취소 (활성화됨)", - "-13423018": "참조 ID", - "-2035315547": "낮은 장벽", - "-1551639437": "내역이 없습니다", - "-1214703885": "귀하께서는 이익실현 또는 손절매와 관련하여 아직 업데이트를 하지 않으셨습니다", - "-504849554": "다음의 때에 다시 열릴 것입니다", - "-59803288": "그동안에, 우리의 종합 지수를 이용해보세요. 이들은 실제시장 변동성을 모방하며 24시간 7일 내내 접근가능합니다.", - "-1278109940": "공개시장 보기", - "-694105443": "이 시장은 종료되었습니다", "-1043795232": "최근 포지션", "-1511825574": "이윤/손실:", "-726626679": "잠재적인 이윤/손실:", @@ -3455,21 +3511,15 @@ "-1435392215": "거래 취소에 관하여", "-2017825013": "알겠습니다", "-1192773792": "다시 보지않기", + "-902712434": "거래 취소", "-1280319153": "선택된 기간 이내에 언제든지 귀하의 거래를 취소하세요. 귀하의 거래가 선택된 기간 이내에스탑아웃 레벨에 도달하는 경우 자동으로 됩니다.", "-471757681": "위험 관리", "-843831637": "손실 제한", "-771725194": "거래 취소", "-338707425": "최소한의 기간은 1일입니다", "-1003473648": "기간: {{duration}} 일", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "만기 시 지급금은 포인트당 지급금에 최종 가격과 행사 가격의 차이를 곱한 금액입니다.", "-1527492178": "구매가 차단되었습니다", "-725375562": "귀하께서는 설정 메뉴에서 구매 버튼을 잠금/잠금해제 하실 수 있습니다", - "-774638412": "지분은 반드시 {{min_stake}} {{currency}}와 {{max_stake}} {{currency}} 사이여야 합니다", - "-1358367903": "지분", - "-434270664": "현재 가격", - "-1956787775": "배리어 가격:", - "-1513281069": "장벽 2", "-390994177": "{{min}} 과 {{max}} 사이여야 합니다", "-1804019534": "만료: {{date}}", "-2055106024": "고급 및 단순 기간 설정 사이를 왕래하세요", @@ -3481,9 +3531,10 @@ "-1043117679": "귀하의 현재 손실이 귀하의 지분의 {{stop_out_percentage}}%과 같거나 또는 이를 초과하면, 귀하의 계약은 가능한 가장 근접한 자산 가격으로 종료될 것입니다.", "-339236213": "승수", "-2131851017": "성장률", - "-1763848396": "풋 (Put)", + "-1763848396": "Put", "-194424366": "이상", "-857660728": "행사 가격", + "-1358367903": "지분", "-1386326276": "장벽은 필수입력사항입니다.", "-1418742026": "높은 장벽은 낮은 장벽보다 반드시 높아야 합니다.", "-92007689": "낮은 장벽은 높은 장벽보다 반드시 낮아야 합니다.", @@ -3491,6 +3542,21 @@ "-1975910372": "분은 반드시 0과 59 사이여야 합니다.", "-866277689": "만기 시간은 과거일 수 없습니다.", "-1455298001": "지금", + "-256210543": "이 시간에는 트레이딩을 할 수 없습니다.", + "-1150099396": "이 기능을 곧 사용할 수 있도록 작업 중입니다. 다른 계좌를 가지고 계신다면, 그 계좌로 전환하여 거래를 진행하세요. Deriv MT5 파이낸셜을 추가하실 수 있습니다.", + "-28115241": "이 계정에서는 {{platform_name_trader}} 를 이용하실 수 없습니다", + "-453920758": "{{platform_name_mt5}} 대시보드로 이동", + "-402175529": "내역", + "-988484646": "거래 취소 (실행됨)", + "-444882676": "거래 취소 (활성화됨)", + "-13423018": "참조 ID", + "-2035315547": "낮은 장벽", + "-1551639437": "내역이 없습니다", + "-1214703885": "귀하께서는 이익실현 또는 손절매와 관련하여 아직 업데이트를 하지 않으셨습니다", + "-504849554": "다음의 때에 다시 열릴 것입니다", + "-59803288": "그동안에, 우리의 종합 지수를 이용해보세요. 이들은 실제시장 변동성을 모방하며 24시간 7일 내내 접근가능합니다.", + "-1278109940": "공개시장 보기", + "-694105443": "이 시장은 종료되었습니다", "-439389714": "아직 작업중에 있습니다", "-770929448": "{{platform_name_smarttrader}} 으로 이동", "-347156282": "증명 제출", @@ -3537,6 +3603,8 @@ "-454245976": "특정 기간 동안 시장 가격이 계속 하락할 것으로 생각되면 <0>Short를 선택하십시오.시장 가격이 장벽에 닿거나 장벽을 넘지 않으면 만기 시점에 지불금을 받게 됩니다.장벽을 뚫지 않으면 시장 가격과 장벽 사이의 거리에 비례하여 지급액이 커집니다.지급액이 지분보다 높을 때 수익을 올리기 시작합니다.시장 가격이 장벽을 넘으면 지불금이 없을 것입니다.", "-351875097": "틱 수", "-729830082": "적게 보기", + "-1669741470": "만기 시 지급금은 포인트당 지급금에 최종 가격과 행사 가격의 차이를 곱한 금액입니다.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "새롭습니다!", "-993480898": "어큐뮬레이터", "-45873457": "새롭습니다", @@ -3557,6 +3625,10 @@ "-690963898": "지급액이 이 금액에 도달하면 계약이 자동으로 종료됩니다.", "-511541916": "이 틱 수에 도달하면 계약이 자동으로 종료됩니다.", "-438655760": "<0>참고: 언제든지 거래를 청산할 수 있습니다. 슬리피지 위험에 유의하세요.", + "-774638412": "지분은 반드시 {{min_stake}} {{currency}}와 {{max_stake}} {{currency}} 사이여야 합니다", + "-434270664": "현재 가격", + "-1956787775": "배리어 가격:", + "-1513281069": "장벽 2", "-1683683754": "롱", "-1046859144": "<0>{{title}} 시장 가격이 {{price_position}} 에 머무르며 장벽에 닿지 않을 경우 또는 넘지 않을 경우에 지급금을 받습니다. 만약 그렇지 못한 경우에는 귀하의 지급금은 없습니다.", "-1815023694": "장벽을 넘어서", diff --git a/packages/translations/src/translations/pl.json b/packages/translations/src/translations/pl.json index 9a45ab06eb9d..d610e557ea6b 100644 --- a/packages/translations/src/translations/pl.json +++ b/packages/translations/src/translations/pl.json @@ -24,7 +24,6 @@ "27731356": "Twoje konto jest tymczasowo wyłączone. Skontaktuj się z nami za pośrednictwem <0>czatu na żywo, aby ponownie włączyć wpłaty i wypłaty.", "27830635": "Deriv (V) Ltd", "28581045": "Dodaj prawdziwe konto MT5", - "30801950": "Twoje konto zostanie otwarte przez {{legal_entity_name}}, regulowaną przez Urząd ds. Gier Hazardowych: Malta Gaming Authority na Malcie, i będzie podlegać prawu Malty.", "33433576": "Skorzytaj z e-portfela, aby wypłacić swoje środki.", "35089987": "Prześlij przednią i tylną stronę swojego prawa jazdy.", "41737927": "Dziękujemy", @@ -60,11 +59,13 @@ "72500774": "Proszę podać rezydencję podatkową.", "73086872": "Skorzystano z samodzielnego wykluczenia z inwestowania", "73326375": "Cena niska to najniższy punkt kiedykolwiek osiągnięty przez rynek w czasie trwania kontraktu.", + "74836780": "{{currency_code}} Wallet", "74963864": "Poniżej", "76916358": "Osiągnięto limit wypłat.<0/>Prześlij dowód tożsamości i adresu, aby podnieś swój limit i dokonać wypłaty.", "76925355": "Sprawdź wydajność swojego bota", "77945356": "Handluj w podróży dzięki naszej aplikacji mobilnej.", "77982950": "Opcje waniliowe pozwalają Państwu przewidzieć wzrostowy (byczy) lub spadkowy (niedźwiedzi) kierunek aktywów bazowych poprzez zakup opcji kupna (Call) lub sprzedaży (Put).", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Nie znaleźliśmy tej strony", "82839270": "Prześlij skan strony z paszportu zawierającej zdjęcie.", "83202647": "Zwiń blok", @@ -76,6 +77,7 @@ "90266322": "2. Rozpocznij czat z naszym nowym botem Telegram i upewnij się, że wyślesz mu jakieś wiadomości zanim przejdziesz do następnego kroku. (np. Cześć Bot!)", "91993812": "Strategia Martingale'a jest klasyczną techniką handlową wykorzystywaną od ponad stu lat. Spopularyzował ją francuski matematyk Paul Pierre Levy w XVIII wieku.", "93154671": "1. Hit Resetuj na dole panelu statystyk.", + "93939827": "Cryptocurrency accounts", "96381225": "Nie udało się zweryfikować numeru identyfikacyjnego", "98473502": "Nie mamy obowiązku przeprowadzenia oceny zdolności ani przedstawienia Ci ostrzeżeń o ryzyku.", "98972777": "element losowy", @@ -83,6 +85,7 @@ "102226908": "Pole nie może być puste", "108916570": "Czas trwania: {{duration}} dni", "109073671": "Skorzystaj z e-portfela, który został użyty poprzednio do dokonania wpłaty. Upewnij się, że ten e-portfel posiada opcje wypłat. <0>Tutaj możesz zobaczyć listę e-portfeli obsługujących wypłaty.", + "110822969": "One Wallet for all your transactions", "111215238": "Odsuń się od bezpośredniego światła", "111718006": "Data zakończenia", "111931529": "Całkowita maks. stawka w ciągu 7 dni", @@ -215,7 +218,9 @@ "251882697": "Dziękujemy! Twoja odpowiedź została zapisana w naszym systemie.<0/><0/> Kliknij „OK”, aby kontynuować.", "254912581": "Ten blok jest podobny do EMA, tylko że daje całą linię EMA w oparciu o listę wejściową i wybrany okres czasu.", "256031314": "Działalność gotówkowa", + "256123827": "What happens to my trading accounts", "256602726": "Jeśli zamkniesz swoje konto:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Ocena handlowa", "260069181": "Podczas próby załadowania adresu URL wystąpił błąd", @@ -250,8 +255,8 @@ "284527272": "anty-tryb", "284772879": "Kontrakt", "284809500": "Demo finansowe", + "285909860": "Demo {{currency}} Wallet", "287934290": "Czy na pewno chcesz anulować tę transakcję?", - "289898640": "WARUNKI UŻYTKOWANIA", "291744889": "<0>1. Parametry handlowe: <0>", "291817757": "Przejdź do naszej społeczności Deriv i dowiedz się więcej m.in. o interfejsach API, tokenach API, sposobach korzystania z interfejsów API Deriv.", "292491635": "Jeśli wybierzesz „Stop stratom” i określisz kwotę, aby ograniczyć Twoją stratę, Twoja pozycja zostanie automatycznie zamknięta, gdy Twoja strata jest większa lub równa tej kwocie. Twoja strata może wynieść więcej niż wprowadzona kwota w zależności od ceny rynkowej przy zamknięciu.", @@ -299,6 +304,7 @@ "344418897": "Te limity i opcja samodzielnego wykluczenia pomagają kontrolować kwotę pieniędzy inwestowaną na {brand_website_name}} i czas spędzany na platformie i ułatwiają <0>odpowiedzialne inwestowanie.", "345320063": "Nieprawidłowy znacznik czasu", "345818851": "Przepraszamy, wystąpił błąd wewnętrzny. Kliknij powyższe pole wyboru, aby spróbować ponownie.", + "346214602": "A better way to manage your funds", "347029309": "Forex: standardowy/mikro", "347039138": "Iteracja (2)", "347217485": "Mają Państwo problemy z dostępem do Deriv MT5 na telefonie komórkowym?", @@ -353,6 +359,7 @@ "401345454": "Przejdź do zakładki Samouczki, aby to zrobić.", "402343402": "Z powodu problemów na naszym serwerze niektóre konta {{platform}} są w chwili obecnej niedostępne. Przepraszamy za niedogodności i dziękujemy za cierpliwość.", "403456289": "Formuła dla SMA to:", + "403608958": "Select a trading account or a Wallet", "404743411": "Wszystkie wpłaty", "406359555": "Szczegóły kontraktu", "406497323": "Sprzedaj swoje aktywne kontrakty, jeśli jest to konieczne (opcjonalnie)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Preferowany odstęp czasu między raportami:", "431267979": "Oto krótki przewodnik po tym, jak korzystać z Deriv Bot w podróży.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Uzyskaj Zysk: {{ currency }} {{ take_profit }}", "432519573": "Przesłano dokument", @@ -453,12 +461,12 @@ "518955798": "7. Uruchom raz przy starcie", "520136698": "Indeks Boom 500", "521872670": "element", - "522283618": "Doświadczenie w handlowaniu opcjami cyfrowymi", "522703281": "podzielna przez", "523123321": "- 10 do siły określonej liczby", "524459540": "W jaki sposób tworzyć zmienne?", "527329988": "To hasło jest wśród 100 najpopularniejszych", "529056539": "Opcje", + "530864956": "Deriv Apps", "530953413": "Aplikacje zatwierdzone", "531114081": "3. Rodzaj kontraktu", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, akcje, wskaźniki giełdowe, kryptowaluty, wskaźniki syntetyczne", "545476424": "Wszystkie wypłaty", "549479175": "Mnożniki Deriv", + "549799607": "Go to LiveChat", "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.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Dowiedz się więcej o limitach handlowych", "554135844": "Edytuj", "554410233": "To hasło jest wśród 10 najpopularniejszych", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Po określeniu parametrów i opcji zakładu, możesz poinstruować swój bot, aby dokonał zakupu kontraktu, gdy zostaną spełnione określone warunki. Aby to zrobić, możesz użyć bloków warunkowych i wskaźnikowych, które pomogą botowi podjąć decyzję.", "555881991": "Dowód krajowego numeru identyfikacji", "556264438": "Odstęp czasu", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.Jeżeli nie będzie możliwe dojście do porozumienia, skarga zostanie skierowana do fazy rozstrzygania prowadzonej przez DRC.", "639382772": "Prześlij obsługiwany typ pliku.", "640596349": "Nie otrzymano jeszcze żadnych powiadomień", @@ -562,7 +574,6 @@ "642546661": "Prześlij tylną część prawa jazdy ze swojego komputera", "642995056": "Adres e-mail", "644150241": "Liczba wygranych kontraktów od ostatniego zerowania statystyk.", - "645016681": "Częstotliwość handlowania innymi instrumentami finansowymi", "645902266": "EUR/NZD", "647039329": "Wymagane jest potwierdzenie adresu", "647745382": "Lista wejściowa {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "W poniższym przykładzie wybrana jest cena otwarcia, która następnie jest przypisana do zmiennej o nazwie „op”.", "666724936": "Wprowadź prawidłowy numer identyfikacyjny.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Jurysdykcja i wybór prawa", "674973192": "Użyj tego hasła, aby zalogować się do kont Deriv MT5 na aplikacji na komputery stacjonarne i urządzenia mobilne oraz aplikacji internetowej.", "676159329": "Nie można przełączyć na konto domyślne.", @@ -613,6 +625,7 @@ "692354762": "Proszę wpisać swój adres {{document_name}}. {{example_format}}", "693396140": "Anulowanie transakcji (wygasło)", "694035561": "Mnożniki opcji handlowych", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Czas otwarcia: otwierający znacznik czasu", "697630556": "Ten rynek jest obecnie zamknięty.", "698037001": "Krajowy numer identyfikacyjny", @@ -624,8 +637,8 @@ "701647434": "Szukaj ciągu", "702451070": "Identyfikator krajowy (bez zdjęcia)", "702561961": "Zmień motyw", + "705262734": "Your Wallets are ready", "705299518": "Następnie prześlij skan strony z paszportu zawierającej zdjęcie.", - "706413212": "Aby uzyskać dostęp do kasjera, jesteś teraz na swoim koncie {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Częstotliwość handlowania opcjami binarnymi", "706755289": "Ten blok oblicza funkcje trygonometryczne.", "706960383": "Zaoferujemy zakup Państwa kontraktu po tej cenie, jeśli zdecydują się Państwo sprzedać go przed wygaśnięciem. Jest to oparte na kilku czynnikach, takich jak bieżąca cena spot, czas trwania itp. Nie zaoferujemy jednak wartości kontraktu, jeśli pozostały czas trwania jest krótszy niż 60 sekund.", @@ -644,6 +657,7 @@ "720293140": "Wyloguj", "720519019": "Zresetuj moje hasło", "721011817": "- Podnieś pierwszą liczbę do potęgi drugiej liczby", + "722797282": "EU-regulated USD accounts", "723045653": "Przy użyciu tego adresu e-mail będziesz się logować do swojego konta Deriv.", "723961296": "Zarządzanie hasłem", "724203548": "Możesz wysłać swoją skargę przez platformę <0>Komisji Europejskiej do Rozstrzygania Sporów On-line (ODR). Ta opcja nie jest dostępna dla klientów z Wielkiej Brytanii.", @@ -656,6 +670,7 @@ "734390964": "Niewystarczające saldo", "734881840": "fałsz", "742469109": "Resetuj saldo", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Inwestuj w kontrakty CFD oparte na forex, indeksach pochodnych, kryptowalutach i towarach o wysokiej dźwigni finansowej.", "743623600": "Odwołanie", "744110277": "Szereg wstęgi Bollingera (BBA)", @@ -689,6 +704,7 @@ "775706054": "Czy sprzedajecie boty inwestycyjne?", "776085955": "Strategie", "781924436": "Spread zakupu/Spread sprzedaży", + "782563319": "Add more Wallets", "783974693": "Unikaj ostatnich lat", "784311461": "Wykładnicza średnia krocząca (EMA)", "784583814": "Połączone z Twoim komputerem", @@ -725,6 +741,7 @@ "818447476": "Zmienić konto?", "820877027": "Zweryfikuj swoje potwierdzenie tożsamości", "821163626": "Konserwacja serwera odbywa się w każdą pierwszą sobotę miesiąca od 7 do 10 czasu GMT. W tym czasie mogą wystąpić zakłócenia w świadczeniu usług.", + "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": "Blok, który może zawierać tekst.", "824797920": "Czy lista jest pusta?", "825042307": "Spróbujmy jeszcze raz", @@ -747,7 +764,6 @@ "836097457": "Interesuje mnie inwestowanie, ale mam bardzo małe doświadczenie.", "837063385": "Proszę nie wysyłać innych walut na ten adres.", "837066896": "Twój dokument jest weryfikowany, sprawdź ponownie za 1-3 dni.", - "839618971": "ADRES", "839805709": "Aby zweryfikować Twoją tożsamość, potrzebujemy lepszego zdjęcia", "840672750": "Jeśli to nie zadziała, proszę odinstalować i ponownie zainstalować aplikację MT5. Następnie proszę powtórzyć kroki <0>2 i <0>3.", "841434703": "Wyłącz stos", @@ -844,9 +860,9 @@ "943535887": "Zamknij swoje pozycje na następujących kontach Deriv MT5:", "944499219": "Maks. liczba otwartych pozycji", "945532698": "Sprzedane kontrakty", + "945753712": "Back to Trader’s Hub", "946204249": "Odczyt", "946841802": "Biała (lub zielona) świeca wskazuje, że cena otwarcia jest niższa niż cena zamknięcia. Reprezentuje wzrost ceny rynkowej.", - "946944859": "Naciśnij poniższy przycisk, a my wyślemy Ci e-mail z linkiem. Kliknij ten link, aby zweryfikować wniosek o wypłatę.", "947046137": "Twoja wypłata zostanie zrealizowana w ciągu 24 godzin", "947363256": "Utwórz listę", "947758334": "Miasto to pole wymagane", @@ -950,6 +966,7 @@ "1050128247": "Potwierdzam, że dane przelewu pośrednika płatności zostały zweryfikowane.", "1050844889": "Raporty", "1052779010": "Używasz konta demo", + "1052921318": "{{currency}} Wallet", "1053153674": "Indeks Jump 50", "1053159279": "Poziom wykształcenia", "1053556481": "Po złożeniu skargi wyślemy Ci wiadomość e-mail z potwierdzeniem, aby potwierdzić, że ją otrzymaliśmy.", @@ -1010,6 +1027,7 @@ "1110102997": "Wyciąg", "1112582372": "Czas trwania interwału", "1113119682": "Ten blok daje wartość wybranej świecy z listy świec.", + "1113221217": "MT5 Swap-free", "1113292761": "Mniej niż 8 MB", "1114679006": "Udało Ci się stworzyć swojego bota za pomocą prostej strategii.", "1117281935": "Warunki sprzedaży (opcjonalnie)", @@ -1036,6 +1054,7 @@ "1134879544": "Przykład prześwietlonego dokumentu", "1138126442": "Forex: standardowy", "1139483178": "Włącz stos", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Kierunek to {{ direction_type }}", "1144028300": "Szereg wskaźnika względnej siły (RSIA)", "1145927365": "Uruchom bloki wewnętrzne po określonej liczbie sekund", @@ -1066,7 +1085,6 @@ "1174689133": "3. Proszę ustawić parametry transakcji i nacisnąć przycisk Uruchom.", "1174748431": "Kanał płatności", "1175183064": "Vanuatu", - "1176926166": "Doświadczenie w handlowaniu innymi instrumentami finansowymi", "1177396776": "Jeśli wybierzesz zakład „Azjatycki - spadnie”, zdobędziesz wypłatę, gdy ostatni najmniejszy przyrost ceny będzie niższy niż średnia najmniejszych przyrostów ceny.", "1177723589": "Nie ma transakcji do wyświetlenia", "1178582280": "Liczba przegranych kontraktów od ostatniego zerowania statystyk.", @@ -1077,6 +1095,7 @@ "1181396316": "Ten blok daje losową liczbę spośród ustalonego zakresu", "1181770592": "Zysk/strata ze sprzedaży", "1183007646": "- Rodzaj kontraktu: nazwa rodzaju kontraktu, np. Wzrost, Spadek, Osiągnie, Nie osiągnie itp.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Zamknij kontrakt teraz lub utrzymuj go w ruchu. Jeśli zdecydujesz się utrzymać go w ruchu, możesz to sprawdzić i zamknąć później na ", "1188316409": "Aby otrzymać środki, skontaktuj się z agentem płatności, podając poniższe dane", "1188980408": "5 minut", @@ -1094,12 +1113,14 @@ "1201773643": "numeryczna", "1203297580": "Ten blok wysyła wiadomość do kanału Telegram.", "1204223111": "W tym przykładzie ceny otwarcia z listy świec są przypisane do zmiennej o nazwie „candle_list”.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Jak zamaskować kartę?", "1206821331": "Wojskowi", "1207152000": "Wybierz szablon i ustaw parametry handlowe.", "1208714859": "W skrócie:", "1208729868": "Najmniejsze zmiany ceny", "1208903663": "Nieprawidłowy token", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Uruchamianie bota", "1214893428": "Obecnie tworzenie kont jest niedostępne na urządzeniach mobilnych. Zaloguj się na swoim komputerze, aby utworzyć konto.", "1216408337": "Osoba samozatrudniona", @@ -1112,6 +1133,7 @@ "1222521778": "Dokonywanie wpłat i wypłat jest skomplikowane.", "1222544232": "Wysłaliśmy Ci wiadomość e-mail", "1225150022": "Liczba aktywów", + "1226027513": "Transfer from", "1227074958": "losowy ułamek", "1227240509": "Usuń odstępy", "1228534821": "Niektóre z walut mogą nie być obsługiwane przez pośrednika płatności w Twoim kraju.", @@ -1121,6 +1143,7 @@ "1232291311": "Pozostała maksymalna kwota wypłaty", "1232353969": "0-5 transakcji w ciągu ostatnich 12 miesięcy", "1233300532": "Wypłata", + "1233376285": "Options & multipliers", "1234292259": "Źródło majątku", "1234764730": "Prześlij zrzut ekranu swojego imienia i nazwiska oraz adresu e-mail z sekcji danych osobowych.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Sortuje elementy na określonej liście w zależności od ich wartości numerycznej lub alfabetycznej, rosnąco lub malejąco.", "1281290230": "Wybierz", "1282951921": "Tylko spadki", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Jeśli została wybrana wartość „Strata”, zwróci wartość „Prawda”, jeśli Twój ostatni zakład wygrał. W przeciwnym wypadku zwróci pusty ciąg.", "1286094280": "Wypłać", "1286507651": "Zamknij ekran weryfikacji tożsamości", @@ -1173,7 +1197,6 @@ "1289146554": "Brytyjskie Wyspy Dziewicze Usługi Finansowe Komisja", "1289646209": "Wezwanie do uzupełnienia depozytu", "1290525720": "Przykład: ", - "1291887623": "Częstotliwość handlowania opcjami cyfrowymi", "1291997417": "Kontrakty wygasną dokładnie o 23:59:59 GMT w wybranej przez Państwa dacie wygaśnięcia.", "1292188546": "Zresetuj hasło inwestora Deriv MT5", "1292891860": "Powiadom Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Sprzedaj)", "1329136554": "Indeks Jump 200", "1329325646": "Zawartość tego bloku jest wywoływana przy każdym ticku", + "1330479159": "Ready to upgrade?", "1331199417": "Proszę wprowadzić poprawny format. ", "1331367811": "Numer konta klienta", "1332168410": "Dowiedz się więcej", @@ -1257,7 +1281,6 @@ "1367023655": "Aby zapewnić, że Twoje straty nie przekroczą Twojej stawki, Twój kontrakt zostanie zamknięty automatycznie, kiedy Twoja strata wyniesie <0/>.", "1367488817": "4. Warunki zrestartowania handlowania", "1367990698": "Wskaźnik zmienności 10", - "1369709538": "Nasze warunki użytkowania", "1370647009": "Korzystaj z wyższych limitów dziennych", "1371193412": "Anuluj", "1371555192": "Wybierz preferowanego agenta płatności i wprowadź kwotę wypłaty. Jeśli Twojego agenta płatniczego nie ma na liście, <0>wyszukaj go, używając numeru konta.", @@ -1319,6 +1342,7 @@ "1434767075": "Proszę zacząć korzystać z Deriv Bot", "1434976996": "Zawiadomienie", "1435363248": "Ten blok zamienia liczbę sekund od początku epoki Uniksa na format daty i godziny, taki jak 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Minimalna wpłata", "1437396005": "Dodaj komentarz", "1438247001": "Klientom profesjonalnym zapewniamy ochronę na niższym poziomie z następujących przyczyn.", @@ -1369,6 +1393,7 @@ "1476301886": "Podobnie jak SMA, ten blok daje całą linię SMA z listą wszystkich wartości dla określonego okresu.", "1478030986": "Tworzenie lub usuwanie tokenów API w celu inwestowania lub wypłaty środków", "1480915523": "Pomiń", + "1481860194": "Your new Wallet(s)", "1481977420": "Pomóż nam zweryfikować Twój wniosek o wypłatę.", "1483470662": "Kliknij „Otwórz”, aby rozpocząć handel na swoim koncie", "1484336612": "Ten blok jest używany w celu zakończenia lub kontynuowania pętli i można go umieścić w dowolnym miejscu bloku pętli.", @@ -1389,6 +1414,7 @@ "1505420815": "Nie znaleziono agentów płatności dla Twojego wyszukiwania", "1505898522": "Pobierz stos", "1505927599": "Nasze serwery uderzyły w uderzenie. Odświeżmy się, aby przejść dalej.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Kup)", "1509678193": "Edukacja", @@ -1449,6 +1475,7 @@ "1577480486": "Twój link mobilny wygaśnie za godzinę", "1577527507": "Wymagane jest podanie powodu otwarcia konta.", "1577612026": "Wybierz folder", + "1577879664": "<0>Your Wallets are ready", "1579839386": "App Store", "1580498808": "Wykryto kilka twarzy", "1584109614": "Lista ciągu ticków", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Podczas działania bot napotkał błąd.", "1648938920": "Holandia 25", "1649239667": "2. W menu Blokizobaczysz listę kategorii. Bloki są pogrupowane w tych kategoriach. Wybierz żądany blok i przeciągnij go do obszaru roboczego.", + "1650963565": "Introducing Wallets", "1651513020": "Wyświetl pozostały czas dla każdego interwału", "1651951220": "Ciągi, takie jak „abcabcabc” są tylko trochę trudniejsze do przewidzenia niż „abc”", "1652366857": "pobierz i usuń", @@ -1522,13 +1551,13 @@ "1665272539": "Uwaga: Nie będzie możliwe zalogowanie się do konta aż do wybranej daty.", "1665738338": "Saldo", "1665756261": "Przejdź na czat na żywo", + "1666783057": "Upgrade now", "1668138872": "Zmień ustawienia konta", "1670016002": "Mnożniki: {{ multiplier }}", "1670426231": "Czas zakończenia", "1671232191": "Ustalono następujące limity:", "1674163852": "Możesz określić wygaśnięcie umowy, ustawiając czas trwania lub czas zakończenia.", "1675030608": "Aby utworzyć to konto, musisz ponownie przesłać dowód adresu.", - "1675289747": "Przełączono na konto rzeczywiste", "1676549796": "Dynamiczna dźwignia", "1677027187": "Forex", "1677990284": "Moje aplikacje", @@ -1556,6 +1585,7 @@ "1703091957": "Gromadzimy informacje o Twoim zatrudnieniu w ramach naszych zobowiązań due diligence, zgodnie z wymogami przepisów dotyczących przeciwdziałania praniu pieniędzy.", "1704656659": "Ile masz doświadczenia w inwestowaniu w kontrakty CFD?", "1708413635": "Dla Twojego konta {{currency_name}} ({{currency}})", + "1709293836": "Wallet balance", "1709401095": "Inwestuj w kontrakty CFD na platformie Deriv X, oferującej rynki finansowe i nasze indeksy pochodne.", "1709859601": "Czas punktu wyjściowego", "1710662619": "Jeśli masz aplikację, uruchom ją, aby rozpocząć inwestowanie.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Za przelewy między kontem Deriv w walucie fiducjarnej a kontem Deriv w kryptowalucie pobierana jest opłata w wysokości 2% kwoty transferu lub {{minimum_fee}} {{currency}}, w zależności od tego, która kwota jest wyższa.", "1720968545": "Prześlij stronę paszportu ze zdjęciem ze swojego komputera", + "1723069433": "Your new Wallet", "1723589564": "Pokazuje maksymalną liczbę niezapłaconych kontraktów w Twoim portfolio. Każda linia w Twoim portfolio liczy się jako jedna otwarta pozycja. Po osiągnięciu maksimum nie będziesz mieć możliwości otwierania nowych pozycji bez uprzedniego zamknięcia dotychczasowych pozycji.", "1724696797": "Obowiązuje Cię ograniczenie do jednego konta fiducjarnego.", "1725958461": "Numer konta", @@ -1698,6 +1729,7 @@ "1842266423": "tył", "1842862156": "Witaj w pulpicie Deriv X", "1843658716": "Jeśli wybierzesz Tylko spadki, zyskasz wygraną, gdy następujące po sobie zmiany ceny są zmianami w dół po punkcie wejściowym. Wypłata nie przysługuje, jeśli cena wzrasta lub jest równa dowolnej poprzedniej zmianie ceny.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min.: {{min_stake}} - maks.: {{max_payout}})", "1846266243": "Ta funkcja nie jest dostępna dla kont demo.", "1846587187": "Nie wybrano kraju zamieszkania", @@ -1792,7 +1824,6 @@ "1924765698": "Miejsce urodzenia*", "1926987784": "- iOS: Przesunąć palcem w lewo na koncie i dotknąć <0>Usuń.", "1928930389": "GBP/NOK", - "1929309951": "Status zatrudnienia", "1929694162": "Porównaj konta", "1930899934": "Tether", "1931659123": "Uruchom przy każdym ticku", @@ -1807,6 +1838,7 @@ "1943440862": "Oblicza listę wstęg Bollingera (BB) z listy z poprawnym okresem", "1944204227": "Blok zwraca obecne saldo konta.", "1947527527": "1. Ten link został wysłany przez Ciebie", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Oto niektóre z możliwych powodów:", "1950413928": "Prześlij dokument tożsamości", @@ -1875,6 +1907,7 @@ "2014536501": "Numer karty", "2014590669": "Zmienna '{{variable_name}}' nie ma żadnych wartości. Ustal wartość zmiennej '{{variable_name}}' do powiadomienia.", "2017672013": "Wybierz kraj wydania dokumentu.", + "2020104747": "Filter", "2020545256": "Zamknąć Twoje konto?", "2021037737": "Zaktualizuj swoje dane, aby kontynuować.", "2021161151": "Proszę obejrzeć ten film , aby dowiedzieć się, jak zbudować bota handlowego na Deriv Bot. Proszę również zapoznać się z tym wpisem na blogu na temat budowania bota handlowego.", @@ -1885,7 +1918,6 @@ "2027696535": "Informacje podatkowe", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "Konta CFDCompareAccounts", "2030018735": "RSI, wskaźnik siły względnej, jest narzędziem analizy technicznej, które pomaga zidentyfikować trend rynkowy. Zwróci wartość od 0 do 100. Wartość RSI wynosząca 70 i więcej oznacza, że aktywa są wykupione i obecny trend może się odwrócić, natomiast wartość 30 i mniej oznacza wyprzedawanie aktywów.", "2030045667": "Wiadomość", "2033648953": "Ten blok daje wartość określonej świecy dla wybranego interwału czasowego.", @@ -1919,6 +1951,7 @@ "2063812316": "Twierdzenie tekstu", "2063890788": "Anulowano", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Prawo jazdy", "2070002739": "Nie akceptuję", "2070345146": "Przy otwieraniu lewarowanej transakcji CFD.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Złożenie skargi", "2080553498": "3. Uzyskaj ID czatu, korzystając z API REST (dowiedz się więcej: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Sprzedano za: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Tak, usuń", "2084693624": "Zamienia ciąg reprezentujący datę/czas na sekundy od epoki. Na przykład: 2019-01-01 21:03:45 GMT+0800 zostanie zamieniony na 1546347825. Godzina i strefa czasowa są opcjonalne.", "2085387371": "Muszą to być liczby, litery i znaki specjalne . , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "Strata", "2117165122": "1. Utwórz bot Telegram i pobierz swój token Telegram API. Przeczytaj, aby dowiedzieć się, jak utworzyć boty w Telegram: https://core.telegram.org/bots#6-botfather", "2117489390": "Automatyczna aktualizacja za {{ remaining }} sek.", - "2118315870": "Gdzie mieszkasz?", "2119449126": "Przykładowy wynik dla poniższego przykładu to:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Wskazówka dla profesjonalistów: Możesz także kliknąć i przeciągnąć żądany blok", "2146892766": "Doświadczenie w handlowaniu opcjami binarnymi", "2147244655": "Jak zaimportować własnego bota handlowego do Deriv Bot?", - "-1232613003": "<0>Weryfikacja nie powiodła <1>się.", - "-2029508615": "<0>Potrzebujesz weryfikacji. <1>Zweryfikuj teraz", "-931052769": "Prześlij weryfikację", "-1004605898": "Porady", "-1938142055": "Przesłano dokumenty", @@ -2141,18 +2172,9 @@ "-179726573": "Otrzymaliśmy twój dowód własności.", "-813779897": "Dowód własności przeszedł weryfikację pozytywnie.", "-638756912": "Zakryj cyfry numeru karty od 7 do 12, znajdujące się na przedniej stronie karty debetowej/kredytowej.", - "-2073934245": "Usługi zawierania transakcji finansowych oferowane na niniejszym portalu są odpowiednie tylko dla klientów, którzy akceptują możliwość straty wszystkich zainwestowanych pieniędzy i którzy rozumieją ryzyko związane z zakupem kontraktów finansowych i mają doświadczenie w tym zakresie. Takie transakcje finansowe niosą ze sobą wysokie ryzyko. Jeśli zakupione przez Ciebie kontrakty zakończą się bez wartości, stracisz całą zainwestowaną sumę, która obejmuje premię z kontraktu.", - "-1166068675": "Twoje konto zostanie otwarte przez {{legal_entity_name}}, podlegającej regulacjom Komisji ds. Gier Hazardowych w Zjednoczonym Królestwie - UK Gaming Commission (UKGC) i prawom Wyspy Man.", - "-975118358": "Twoje konto zostanie otwarte przez {{legal_entity_name}}, regulowaną przez Malta Financial Services Authority (MFSA) i będzie podlegać prawu Malty.", - "-680528873": "Twoje konto zostanie otwarte przez {{legal_entity_name}}, i będzie podlegać przepisom prawa terytorium Samoa.", - "-1125193491": "Dodaj konto", - "-2068229627": "Nie jestem osobą zajmującą eksponowane stanowiska polityczne i nie byłem/am taką osobą w ciągu ostatnich 12 miesięcy.", "-684271315": "OK", "-740157281": "Ocena doświadczenia inwestycyjnego", "-1720468017": "Świadcząc nasze usługi, jesteśmy zobowiązani do uzyskania od użytkowników informacji w celu oceny, czy dany produkt lub usługa są dla nich odpowiednie.", - "-186841084": "Zmień swój adres e-mail", - "-907403572": "Aby zmienić swój adres e-mail, najpierw musisz usunąć swój obecny adres e-mail z konta {{identifier_title}}.", - "-1850792730": "Zakończ powiązanie z {{identifier_title}}", "-307865807": "Ostrzeżenie o tolerancji ryzyka", "-690100729": "Tak, rozumiem ryzyko.", "-2010628430": "Kontrakty CFD i inne instrumenty finansowe wiążą się z wysokim ryzykiem szybkiej utraty pieniędzy z powodu dźwigni finansowej. Zastanów się, czy rozumiesz, jak działają kontrakty CFD i inne instrumenty finansowe i czy możesz sobie pozwolić na podjęcie wysokiego ryzyka utraty pieniędzy.<0/><0/> Aby kontynuować, musisz potwierdzić, że zdajesz sobie sprawę, że Twój kapitał jest zagrożony.", @@ -2206,11 +2228,6 @@ "-1725454783": "Zakończone niepowodzeniem", "-506510414": "Data i czas", "-1708927037": "Adres IP", - "-619126443": "Użyj <0>hasła Deriv, aby zalogować się do {{brand_website_name}} i {{platform_name_trader}}.", - "-623760979": "Proszę użyć <0>hasła Deriv, aby zalogować się na {{brand_website_name}}, {{platform_name_trader}} i {{platform_name_go}}.", - "-459147994": "Proszę użyć <0>hasła Deriv, aby zalogować się na {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} i {{platform_name_ctrader}}.", - "-80717068": "Aplikacje, połączone z <0>hasłem Deriv:", - "-9570380": "Użyj hasła {{platform_name_dxtrade}} do logowania na swoje konta {{platform_name_dxtrade}} w aplikacji internetowej i na urządzenia mobilne.", "-2131200819": "Wyłącz", "-200487676": "Włącz", "-1840392236": "Kod jest nieprawidłowy. Spróbuj jeszcze raz.", @@ -2240,44 +2257,37 @@ "-378415317": "Wymagane jest podanie województwa", "-1497654315": "Nasze konta i usługi nie są dostępne dla adresów z kodem pocztowym Jersey.", "-755626951": "Uzupełnij swoje dane adresowe", - "-584911871": "Wybierz walutę portfela", "-1461267236": "Wybierz swoją walutę", - "-1352330125": "WALUTA", "-1027595143": "Mniej niż 25 000 $", "-40491332": "25 000 $ - 50 000 $", "-1139806939": "50 001 $ - 100 000 $", - "-626752657": "0-1 rok", - "-532014689": "1-2 lata", - "-1001024004": "Ponad 3 lata", - "-790513277": "6-10 transakcji w ciągu ostatnich 12 miesięcy", - "-580085300": "11-39 transakcji w ciągu ostatnich 12 miesięcy", - "-654781670": "Podstawowe", - "-1717373258": "Drugorzędne", "-996132458": "Budownictwo", "-915003867": "Opieka zdrowotna", "-1430012453": "Technologie informacyjno-komunikacyjne", "-987824916": "Nauka i technika", "-146630682": "Społeczeństwo i kultura", "-761306973": "Produkcja", - "-739367071": "Osoba zatrudniona", - "-1156937070": "500 001 $ - 1 000 000 $", - "-315534569": "Ponad 1 000 000 $", - "-2068544539": "Pracownik etatowy", - "-531314998": "Inwestycje i dywidenda", - "-1235114522": "Emerytura", - "-1298056749": "Zasiłki państwowe", - "-449943381": "Oszczędności i spadek", "-1631552645": "Specjaliści", "-474864470": "Pracownicy sektora opieki zdrowotnej, sprzedaży i sektora publicznego", "-1129355784": "Rolnicy, robotnicy leśni i rybacy", "-1242914994": "Pracownicy sektora rzemieślniczego, metalurgicznego, elektrycznego i elektronicznego", "-1317824715": "Pracownicy sprzątający i pomoc domowa", "-1592729751": "Pracownicy sektora wydobywczego, produkcyjnego i transportowego", + "-1030759620": "Urzędnicy państwowi", "-2137323480": "Właściciel firmy", "-1590574533": "Orzeczenie rozwodowe", "-1667683002": "Spadek", "-1237843731": "Dochód z inwestycji", "-777506574": "Sprzedaż mienia", + "-654781670": "Podstawowe", + "-1717373258": "Drugorzędne", + "-1156937070": "500 001 $ - 1 000 000 $", + "-315534569": "Ponad 1 000 000 $", + "-2068544539": "Pracownik etatowy", + "-531314998": "Inwestycje i dywidenda", + "-1235114522": "Emerytura", + "-1298056749": "Zasiłki państwowe", + "-449943381": "Oszczędności i spadek", "-1161338910": "Wymagany jest podanie imienia.", "-1161818065": "Nazwisko powinno składać się z 2-50 znaków.", "-1281693513": "Data urodzenia jest wymagana.", @@ -2287,28 +2297,14 @@ "-212167954": "Numer identyfikacji podatkowej nie jest poprawnie sformatowany.", "-621555159": "Dane tożsamości", "-204765990": "Warunki użycia", - "-231863107": "Nie", - "-870902742": "Ile posiadasz wiedzy i doświadczenia w zakresie inwestowania online?", - "-1929477717": "Posiadam dyplom akademicki, certyfikat zawodowy i/lub doświadczenie zawodowe związane z usługami finansowymi.", - "-1540148863": "Brałem/brałam udział w seminariach, szkoleniach i/lub warsztatach związanych z inwestowaniem.", - "-922751756": "Mniej niż rok", - "-542986255": "Brak", - "-1337206552": "W twoim rozumieniu handel kontraktami CFD pozwala", - "-456863190": "Umieść pozycję na ruchu cenowy składnika aktywów, w przypadku którego wynikiem jest stały zwrot lub nic.", - "-1314683258": "Dokonaj długoterminowej inwestycji, aby uzyskać gwarantowany zysk.", - "-1546090184": "Jak dźwignia wpływa na handel kontraktami CFD?", - "-1636427115": "Dźwignia finansowa pomaga ograniczyć ryzyko.", - "-800221491": "Dźwignia gwarantuje zyski.", - "-811839563": "Dźwignia pozwala otwierać duże pozycje za ułamek wartości handlowej, co może skutkować zwiększonym zyskiem lub stratą.", - "-1185193552": "Zamknij transakcję automatycznie, gdy strata jest równa lub większa niż określona kwota, o ile istnieje odpowiednia płynność rynku.", - "-1046354": "Zamknij transakcję automatycznie, gdy zysk jest równy lub większy niż określona kwota, o ile istnieje odpowiednia płynność rynku.", - "-1842858448": "Osiągnij gwarantowany zysk na swojej transakcji.", - "-860053164": "Przy inwestowaniu w mnożniki.", - "-1250327770": "Przy zakupie akcji spółki.", - "-1222388581": "Wszystkie powyższe.", "-477761028": "Identyfikator wyborcy", "-1466346630": "CPF", - "-1030759620": "Urzędnicy państwowi", + "-739367071": "Osoba zatrudniona", + "-626752657": "0-1 rok", + "-532014689": "1-2 lata", + "-1001024004": "Ponad 3 lata", + "-790513277": "6-10 transakcji w ciągu ostatnich 12 miesięcy", + "-580085300": "11-39 transakcji w ciągu ostatnich 12 miesięcy", "-612752984": "To są domyślne limity stosowane w odniesieniu do Twoich kont.", "-1598263601": "Aby dowiedzieć się więcej na temat limitów i ich stosowania, przejdź do <0>Centrum pomocy.", "-1411635770": "Dowiedz się więcej o limitach dla kont", @@ -2326,10 +2322,7 @@ "-1500958859": "Zweryfikuj", "-1502578110": "Twoje konto jest w pełni zweryfikowane, a Twój limit wypłat został zwiększony.", "-1662154767": "niedawny rachunek za media (np. prąd, wodę, gaz, linię telefoniczną lub internet), wyciąg z rachunku bankowego lub dokument wydany przez władze rządowe z Twoim imieniem i nazwiskiem i tym adresem.", - "-190838815": "Te dane potrzebne są w celu weryfikacji. Jeśli podane przez Ciebie informacji są nieprawdziwe lub niedokładne, nie będziesz mieć możliwości dokonywania wpłat i wypłat.", - "-223216785": "Druga część adresu*", "-594456225": "Druga część adresu", - "-1940457555": "Kod pocztowy*", "-1964954030": "Kod pocztowy", "-516397235": "Zwracaj uwagę na to, komu udostępniasz ten token. Osoba posiadająca ten token może wykonać następujące działania na Twoim koncie w Twoim imieniu", "-989216986": "Dodaj konta", @@ -2371,8 +2364,6 @@ "-1100235269": "Sektor zatrudnienia", "-684388823": "Szacowana wartość netto", "-509054266": "Przewidywany obrót roczny", - "-601903492": "Doświadczenie w handlowaniu walutami", - "-1012699451": "Doświadczenie w handlowaniu kontraktami na różnice kursowe (CFD)", "-1588485629": "Przykład", "-1117345066": "Wybierz rodzaj dokumentu", "-651192353": "Przykład:", @@ -2464,12 +2455,40 @@ "-142444667": "Kliknij link z wiadomości e-mail, aby zmienić swoje hasło Deriv MT5.", "-742748008": "Sprawdź swoją skrzynkę e-mail i kliknij link w wiadomości e-mail, aby kontynuować.", "-84068414": "Wciąż nie masz wiadomości e-mail? Skontaktuj się z nami przez <0>czat na żywo.", + "-975118358": "Twoje konto zostanie otwarte przez {{legal_entity_name}}, regulowaną przez Malta Financial Services Authority (MFSA) i będzie podlegać prawu Malty.", + "-2073934245": "Usługi zawierania transakcji finansowych oferowane na niniejszym portalu są odpowiednie tylko dla klientów, którzy akceptują możliwość straty wszystkich zainwestowanych pieniędzy i którzy rozumieją ryzyko związane z zakupem kontraktów finansowych i mają doświadczenie w tym zakresie. Takie transakcje finansowe niosą ze sobą wysokie ryzyko. Jeśli zakupione przez Ciebie kontrakty zakończą się bez wartości, stracisz całą zainwestowaną sumę, która obejmuje premię z kontraktu.", + "-1125193491": "Dodaj konto", + "-2068229627": "Nie jestem osobą zajmującą eksponowane stanowiska polityczne i nie byłem/am taką osobą w ciągu ostatnich 12 miesięcy.", + "-186841084": "Zmień swój adres e-mail", + "-907403572": "Aby zmienić swój adres e-mail, najpierw musisz usunąć swój obecny adres e-mail z konta {{identifier_title}}.", + "-1850792730": "Zakończ powiązanie z {{identifier_title}}", "-428335668": "Będzie konieczne ustawienie hasła, aby ukończyć proces.", + "-1232613003": "<0>Weryfikacja nie powiodła <1>się.", + "-2029508615": "<0>Potrzebujesz weryfikacji. <1>Zweryfikuj teraz", "-818898181": "Nazwa w dokumencie nie pasuje do Państwa profilu Deriv.", "-310316375": "Adres w dokumencie nie zgadza się z adresem podanym powyżej.", "-485368404": "Dokument wydany ponad 6 miesięcy temu.", "-367016488": "Niewyraźny dokument. Wszystkie informacje muszą być wyraźne i widoczne.", "-1957076143": "Przycięty dokument. Wszystkie informacje muszą być wyraźne i widoczne.", + "-231863107": "Nie", + "-870902742": "Ile posiadasz wiedzy i doświadczenia w zakresie inwestowania online?", + "-1929477717": "Posiadam dyplom akademicki, certyfikat zawodowy i/lub doświadczenie zawodowe związane z usługami finansowymi.", + "-1540148863": "Brałem/brałam udział w seminariach, szkoleniach i/lub warsztatach związanych z inwestowaniem.", + "-922751756": "Mniej niż rok", + "-542986255": "Brak", + "-1337206552": "W twoim rozumieniu handel kontraktami CFD pozwala", + "-456863190": "Umieść pozycję na ruchu cenowy składnika aktywów, w przypadku którego wynikiem jest stały zwrot lub nic.", + "-1314683258": "Dokonaj długoterminowej inwestycji, aby uzyskać gwarantowany zysk.", + "-1546090184": "Jak dźwignia wpływa na handel kontraktami CFD?", + "-1636427115": "Dźwignia finansowa pomaga ograniczyć ryzyko.", + "-800221491": "Dźwignia gwarantuje zyski.", + "-811839563": "Dźwignia pozwala otwierać duże pozycje za ułamek wartości handlowej, co może skutkować zwiększonym zyskiem lub stratą.", + "-1185193552": "Zamknij transakcję automatycznie, gdy strata jest równa lub większa niż określona kwota, o ile istnieje odpowiednia płynność rynku.", + "-1046354": "Zamknij transakcję automatycznie, gdy zysk jest równy lub większy niż określona kwota, o ile istnieje odpowiednia płynność rynku.", + "-1842858448": "Osiągnij gwarantowany zysk na swojej transakcji.", + "-860053164": "Przy inwestowaniu w mnożniki.", + "-1250327770": "Przy zakupie akcji spółki.", + "-1222388581": "Wszystkie powyższe.", "-1515286538": "Wprowadź numer swojego dokumentu. ", "-1694758788": "Wprowadź numer dokumentu", "-1458676679": "Wprowadź od 2 do 50 znaków.", @@ -2479,6 +2498,8 @@ "-1437017790": "Informacje finansowe", "-70342544": "Jesteśmy zobowiązani prawnie do pozyskania Twoich informacji finansowych.", "-39038029": "Doświadczenie w handlowaniu", + "-601903492": "Doświadczenie w handlowaniu walutami", + "-1012699451": "Doświadczenie w handlowaniu kontraktami na różnice kursowe (CFD)", "-1894668798": "Doświadczenie w handlowaniu innymi instrumentami", "-1026468600": "Doświadczenie w handlowaniu innymi instrumentami finansowymi", "-1743024217": "Wybierz język", @@ -2489,6 +2510,11 @@ "-536187647": "Potwierdzić wycofanie dostępu?", "-1357606534": "Pozwolenia", "-570222048": "Wycofaj dostęp", + "-80717068": "Aplikacje, połączone z <0>hasłem Deriv:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Użyj <0>hasła Deriv, aby zalogować się do {{brand_website_name}} i {{platform_name_trader}}.", + "-623760979": "Proszę użyć <0>hasła Deriv, aby zalogować się na {{brand_website_name}}, {{platform_name_trader}} i {{platform_name_go}}.", + "-459147994": "Proszę użyć <0>hasła Deriv, aby zalogować się na {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} i {{platform_name_ctrader}}.", "-1526404112": "Rachunek za media: rachunek za prąd, wodę, gaz lub telefon stacjonarny.", "-537552700": "Umowa najmu domu: ważna i aktualna umowa.", "-890084320": "Zapisz i prześlij", @@ -2510,11 +2536,20 @@ "-362324454": "Towary", "-1071336803": "Platforma", "-820028470": "Opcje i mnożniki", - "-1255879419": "Trader's Hub", + "-1186807402": "Przelew", + "-224804428": "Transakcje", + "-470018967": "Resetuj saldo", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Resetuj", "-213142918": "Wpłaty i wypłaty tymczasowo niedostępne ", - "-224804428": "Transakcje", - "-1186807402": "Przelew", "-1308346982": "Pochodne", "-1145604233": "Handluj kontraktami CFD na MT5 za pomocą indeksów pochodnych, które symulują rzeczywiste ruchy na rynku.", "-328128497": "Finansowe", @@ -2525,15 +2560,29 @@ "-81256466": "Aby utworzyć konto CFD, potrzebujesz konta Deriv.", "-699372497": "Handluj z dźwignią finansową i wąskimi spreadami, aby <0>uzyskać lepszy zwrot z udanych transakcji.", "-1884966862": "Uzyskaj więcej kont Deriv MT5 z innym typem i jurysdykcją.", - "-145462920": "Deriv cTrader", "-982095728": "Dostać", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Zastrzeżenie ustawowe UE: Kontrakty CFD są złożonymi instrumentami i wiążą się z wysokim ryzykiem szybkiej utraty pieniędzy z powodu dźwigni finansowej. <0>73% rachunków inwestorów detalicznych traci pieniądze podczas handlu kontraktami CFD z tym dostawcą. Należy rozważyć, czy rozumieją Państwo, jak działają kontrakty CFD i czy mogą sobie Państwo pozwolić na podjęcie wysokiego ryzyka utraty pieniędzy.", "-1277942366": "Całkowite aktywa", + "-1255879419": "Trader's Hub", "-493788773": "spoza UE", "-673837884": "UE", "-230566990": "Następujące dokumenty, które przesłałeś, nie przeszły naszych czeków:", "-846812148": "Dowód adresu.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Regulacje spoza UE", "-643108528": "Regulacje spoza UE i UE", + "-979459594": "Buy/Sell", + "-494667560": "Zlecenia", + "-679691613": "Moje ogłoszenia", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Konto mnożników", "-744999940": "Konta Deriv", @@ -2543,9 +2592,20 @@ "-318106501": "Handluj kontraktami CFD na MT5 z syntetyki, koszyki i pochodne FX.", "-1328701106": "Inwestuj w kontrakty CFD na platformie MT5, oferującej forex, akcje, indeksy giełdowe, towary i kryptowaluty.", "-1173266642": "Rachunek ten oferuje kontrakty CFD na bogatej w funkcje platformie transakcyjnej.", - "-1290112064": "Deriv EZ", "-1453519913": "Handel kontraktami CFD na łatwej do uruchomienia platformie ze wszystkimi Państwa ulubionymi aktywami.", "-2051096382": "<1>Zarabiaj szereg wypłat, poprawnie przewidując ruchy rynkowe z <0>opcjami lub zyskaj\n wzrost kontraktów CFD bez ryzykowania więcej niż początkowa stawka z mnożnikami.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Wybór regulacji", "-249184528": "Możesz tworzyć konta rzeczywiste zgodnie z przepisami UE lub spoza UE. Kliknij <0><0/>ikonę, aby dowiedzieć się więcej o tych kontach.", "-1505234170": "Wycieczka po Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Doładuj swoje konto", "-1945421757": "Po założeniu konta kliknij „Wpłać” lub „Przelew”, aby dodać środki na konto", "-1965920446": "Rozpocznij handlowanie", - "-33612390": "<0>Zastrzeżenie ustawowe UE: Kontrakty CFD są złożonymi instrumentami i wiążą się z wysokim ryzykiem szybkiej utraty pieniędzy z powodu dźwigni finansowej. <0>73% rachunków inwestorów detalicznych traci pieniądze podczas handlu kontraktami CFD z tym dostawcą. Należy rozważyć, czy rozumieją Państwo, jak działają kontrakty CFD i czy mogą sobie Państwo pozwolić na podjęcie wysokiego ryzyka utraty pieniędzy.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "To pole jest wymagane.", "-1870909526": "Nasze serwery nie mogą pobrać adresu.", "-582721696": "Dozwolona kwota wypłaty to {{format_min_withdraw_amount}} - {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Adres Twojego adresu {{currency_symbol}}", "-38063175": "portfel {{account_text}}", "-705272444": "Prześlij dokument potwierdzający tożsamość, aby ją zweryfikować", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Ma to na celu ochronę Twojego konta przed nieautoryzowanymi wypłatami.", "-130833284": "Twój maksymalny i minimalny limit wypłat nie jest stały. Zmienia się z powodu dużej zmienności kryptowalut.", "-1531269493": "Wyślemy Ci wiadomość e-mail, gdy transakcja będzie zrealizowana.", @@ -2732,7 +2807,7 @@ "-1194079833": "Deriv Bot nie jest dostępny dla klientów z UE", "-1223145005": "Kwota straty: {{profit}}", "-1206212388": "Witamy z powrotem! Państwa wiadomości zostały przywrócone. Korzystają Państwo z konta {{current_currency}}.", - "-1724342053": "Używają Państwo swojego konta {{current_currency}}.", + "-1724342053": "Używasz swojego konta {{current_currency}}.", "-1062922595": "Identyfikator referencyjny (zakup)", "-2068574600": "Identyfikator referencyjny (sprzedaż)", "-994038153": "Czas rozpoczęcia", @@ -2859,6 +2934,30 @@ "-1016171176": "Aktywa", "-621128676": "Rodzaj zakładu", "-447853970": "Próg straty", + "-155173714": "Zbudujmy bota!", + "-1919212468": "3. Możesz także wyszukiwać bloki, korzystając z paska wyszukiwania nad kategoriami.", + "-1520558271": "Aby uzyskać więcej informacji, sprawdź ten post na blogu na temat podstaw budowania bota handlowego.", + "-980360663": "3. Wybierz żądany blok i przeciągnij go do obszaru roboczego.", + "-1493168314": "Czym jest szybka strategia?", + "-1680391945": "Korzystanie z szybkiej strategii", + "-1177914473": "Jak mogę zapisać moją strategię?", + "-271986909": "W Bot Buildernaciśnij Zapisz na pasku narzędzi u góry, aby pobrać bota. Nadaj swojemu botowi nazwę i wybierz pobranie bota na urządzenie lub Dysk Google. Twój bot zostanie pobrany jako plik XML.", + "-1149045595": "1. Po naciśnięciu Importujwybierz Lokalne i kliknij Kontynuuj.", + "-288041546": "2. Wybierz plik XML i naciśnij Otwórz.", + "-2127548288": "3. Twój bot zostanie odpowiednio załadowany.", + "-1311297611": "1. Po naciśnięciu Importujwybierz Dysk Google i kliknij Kontynuuj.", + "-1549564044": "Jak mogę zresetować obszar roboczy?", + "-1127331928": "W Bot Buildernaciśnij Reset na pasku narzędzi u góry. Spowoduje to oczyszczenie obszaru roboczego. Należy pamiętać, że wszelkie niezapisane zmiany zostaną utracone.", + "-1720444288": "Jak mogę kontrolować swoje straty za pomocą Deriv Bot?", + "-1142295124": "Istnieje kilka sposobów kontrolowania strat za pomocą Deriv Bot. Oto prosty przykład tego, jak można wdrożyć kontrolę strat w swojej strategii:", + "-986689483": "1. Utwórz następujące zmienne:", + "-269910127": "3. Zaktualizuj bieżący zysk/stratę zyskiem z ostatniego kontraktu. Jeśli ostatni kontrakt został utracony, wartość bieżącego zysku/straty będzie ujemna.", + "-1565344891": "Czy mogę uruchomić Deriv Bot na wielu kartach w przeglądarce internetowej?", + "-90192474": "Tak, możesz. Istnieją jednak limity na Twoim koncie, takie jak maksymalna liczba otwartych pozycji i maksymalne zagregowane wypłaty na otwartych pozycjach. Dlatego pamiętaj o tych ograniczeniach podczas otwierania wielu pozycji. Więcej informacji na temat tych limitów można znaleźć w Ustawienia> Limity konta.", + "-213872712": "Nie, nie oferujemy kryptowalut w Deriv Bot.", + "-2147346223": "W jakich krajach dostępny jest Deriv Bot?", + "-352345777": "Jakie są najpopularniejsze strategie automatycznego inwestowania?", + "-552392096": "Trzy z najczęściej stosowanych strategii w handlu automatycznym to Martingale, D'Alembert i Oscar's Grind - wszystkie one są gotowe i czekają na Państwa w Deriv Bot.", "-507620484": "Nie zapisano", "-764102808": "Google Drive", "-555886064": "Wygrał", @@ -2937,30 +3036,6 @@ "-1823621139": "Szybka strategia", "-1778025545": "Pomyślnie zaimportowałeś bota.", "-1519425996": "Brak wyników \"{{ faq_search_value }}”", - "-155173714": "Zbudujmy bota!", - "-1919212468": "3. Możesz także wyszukiwać bloki, korzystając z paska wyszukiwania nad kategoriami.", - "-1520558271": "Aby uzyskać więcej informacji, sprawdź ten post na blogu na temat podstaw budowania bota handlowego.", - "-980360663": "3. Wybierz żądany blok i przeciągnij go do obszaru roboczego.", - "-1493168314": "Czym jest szybka strategia?", - "-1680391945": "Korzystanie z szybkiej strategii", - "-1177914473": "Jak mogę zapisać moją strategię?", - "-271986909": "W Bot Buildernaciśnij Zapisz na pasku narzędzi u góry, aby pobrać bota. Nadaj swojemu botowi nazwę i wybierz pobranie bota na urządzenie lub Dysk Google. Twój bot zostanie pobrany jako plik XML.", - "-1149045595": "1. Po naciśnięciu Importujwybierz Lokalne i kliknij Kontynuuj.", - "-288041546": "2. Wybierz plik XML i naciśnij Otwórz.", - "-2127548288": "3. Twój bot zostanie odpowiednio załadowany.", - "-1311297611": "1. Po naciśnięciu Importujwybierz Dysk Google i kliknij Kontynuuj.", - "-1549564044": "Jak mogę zresetować obszar roboczy?", - "-1127331928": "W Bot Buildernaciśnij Reset na pasku narzędzi u góry. Spowoduje to oczyszczenie obszaru roboczego. Należy pamiętać, że wszelkie niezapisane zmiany zostaną utracone.", - "-1720444288": "Jak mogę kontrolować swoje straty za pomocą Deriv Bot?", - "-1142295124": "Istnieje kilka sposobów kontrolowania strat za pomocą Deriv Bot. Oto prosty przykład tego, jak można wdrożyć kontrolę strat w swojej strategii:", - "-986689483": "1. Utwórz następujące zmienne:", - "-269910127": "3. Zaktualizuj bieżący zysk/stratę zyskiem z ostatniego kontraktu. Jeśli ostatni kontrakt został utracony, wartość bieżącego zysku/straty będzie ujemna.", - "-1565344891": "Czy mogę uruchomić Deriv Bot na wielu kartach w przeglądarce internetowej?", - "-90192474": "Tak, możesz. Istnieją jednak limity na Twoim koncie, takie jak maksymalna liczba otwartych pozycji i maksymalne zagregowane wypłaty na otwartych pozycjach. Dlatego pamiętaj o tych ograniczeniach podczas otwierania wielu pozycji. Więcej informacji na temat tych limitów można znaleźć w Ustawienia> Limity konta.", - "-213872712": "Nie, nie oferujemy kryptowalut w Deriv Bot.", - "-2147346223": "W jakich krajach dostępny jest Deriv Bot?", - "-352345777": "Jakie są najpopularniejsze strategie automatycznego inwestowania?", - "-552392096": "Trzy z najczęściej stosowanych strategii w handlu automatycznym to Martingale, D'Alembert i Oscar's Grind - wszystkie one są gotowe i czekają na Państwa w Deriv Bot.", "-418247251": "Pobierz rejestr.", "-2123571162": "Pobierz", "-870004399": "<0>Kupiono: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Deaktywowano konto", "-1837059346": "Kup / Sprzedaj", "-1845037007": "Strona reklamującego", - "-494667560": "Zlecenia", - "-679691613": "Moje ogłoszenia", "-821418875": "Gracz", "-679102561": "Szczegóły kontraktu", "-430118939": "Polityka dot. skarg", @@ -3082,7 +3155,6 @@ "-430041639": "Dokument potwierdzający adres nie przeszedł weryfikacji i nałożyliśmy pewne ograniczenia na Twoje konto. Prześlij ponownie potwierdzenie Twojego adresu.", "-87177461": "Przejdź do ustawień swojego konta i dodaj dane osobowe, aby włączyć możliwość dokonywania wpłat.", "-904632610": "Resetuj swoje saldo", - "-470018967": "Resetuj saldo", "-156611181": "Ukończ ocenę finansową w ustawieniach swojego konta, aby odblokować.", "-1925176811": "W obecnej chwili nie można realizować wypłat", "-980696193": "Wypłaty są tymczasowo niedostępne z powodu konserwacji systemu. Możesz dokonać wypłaty po zakończeniu konserwacji.", @@ -3107,12 +3179,12 @@ "-577279362": "Prześlij potwierdzenie swojej tożsamości, aby zweryfikować konto i kontynuować inwestowanie.", "-197134911": "Twoje potwierdzenie tożsamości jest już nieważne", "-152823394": "Twój dowód tożsamości jest już nieważny. Prześlij nowy dokument potwierdzający tożsamość, aby zweryfikować swoje konto i kontynuować inwestowanie.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Proszę postępować zgodnie z tymi prostymi instrukcjami, aby to naprawić.", "-2142540205": "Wygląda na to, że adres w dokumencie nie pasuje do adresu w Twoim profilu Deriv. Zaktualizuj teraz swoje dane osobowe, podając poprawny adres.", "-482715448": "Przejdź do danych osobowych", "-2072411961": "Twój dowód adresu został zweryfikowany", "-384887227": "Zaktualizuj adres w swoim profilu.", - "-448961363": "spoza UE", "-1998049070": "Jeśli zgadzasz się na wykorzystywanie przez nas plików cookies, kliknij Akceptuję. <0>Przeczytaj naszą politykę, aby uzyskać więcej informacji.", "-402093392": "Dodaj konto Deriv", "-1721181859": "Potrzebne Ci będzie konto {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Pełny ekran", "-1823504435": "Pokaż powiadomienia", "-1954045170": "Nie przypisano żadnej waluty", - "-583559763": "Menu", "-1591792668": "Limity na koncie", "-34495732": "Informacje o przepisach prawnych", "-1496158755": "Przejdź do Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "Komisja Finansowa akceptuje odwołania w ciągu 45 dni od daty zdarzenia i wyłącznie do uprzedniej próbie inwestora rozwiązania sprawy bezpośrednio z firmą.", "-1825471709": "Zupełnie nowy rodzaj handlowania na zaawansowanej, ale prostej w obsłudze platformie.", "-981017278": "Zautomatyzowane handlowanie na wyciągnięcie ręki. Bez umiejętności handlowania.", + "-583559763": "Menu", "-778309978": "Kliknięty link wygasł. Upewnij się, że klikniesz łącze w najnowszej wiadomości e-mail w skrzynce odbiorczej. Alternatywnie, wpisz poniżej swój adres e-mail i kliknij Wyślij <0>ponownie e-mail, aby uzyskać nowy link.", "-336222114": "Proszę wykonać te proste kroki, aby to naprawić:", "-1064116456": "Proszę wyszukać brokera <0>Deriv Holdings (Guernsey) Limited i wybrać go.", @@ -3415,22 +3487,6 @@ "-1282933308": "Nie {{barrier}}", "-968190634": "Równa się {{barrier}}", "-1747377543": "Poniżej {{barrier}}", - "-256210543": "Handlowanie nie jest dostępne w tym czasie.", - "-1150099396": "Opcja wkrótce będzie dostępna. Jeśli masz inne konto, przejdź na nie, aby kontynuować inwestowanie. Możesz dodać konto finansowe Deriv MT5.", - "-28115241": "Platforma {{platform_name_trader}} nie jest dostępna dla tego konta", - "-453920758": "Przejdź do pulpitu {{platform_name_mt5}}", - "-402175529": "Historia", - "-902712434": "Anulowanie transakcji", - "-988484646": "Anulowanie transakcji (wykonano)", - "-444882676": "Anulowanie transakcji (aktywne)", - "-13423018": "Identyfikator referencyjny", - "-2035315547": "Dolny limit", - "-1551639437": "Brak historii", - "-1214703885": "Musisz zaktualizować albo uzyskaj zysk albo stop stratom", - "-504849554": "Zostanie ponownie otwarty o", - "-59803288": "W międzyczasie możesz inwestować we wskaźniki syntetyczne, które symulują rzeczywistą sytuację rynkową i są dostępne 24 godz. na dobę 7 dni w tygodniu.", - "-1278109940": "Zobacz otwarte rynki", - "-694105443": "Ten rynek jest zamknięty", "-1043795232": "Ostatnie pozycje", "-1511825574": "Zysk/strata:", "-726626679": "Potencjalny zysk/strata:", @@ -3455,21 +3511,15 @@ "-1435392215": "O anulowaniu transakcji", "-2017825013": "Rozumiem", "-1192773792": "Nie pokazuj tego ponownie", + "-902712434": "Anulowanie transakcji", "-1280319153": "Anuluj swój zakład w dowolnej chwili w wybranym zakresie czasowym. Będzie to następować automatycznie, gdy Twój zakład osiągnie poziom Stop stratom w wybranym zakresie czasowym.", "-471757681": "Zarządzanie ryzykiem", "-843831637": "Stop stratom", "-771725194": "Anulowanie transakcji", "-338707425": "Minimalny czas trwania to 1 dzień", "-1003473648": "Czas trwania: {{duration}} dzień", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Wypłata w momencie wygaśnięcia jest równa wypłacie za punkt pomnożonej przez różnicę między ceną końcową a ceną wykonania.", "-1527492178": "Zablokowano zakup", "-725375562": "Możesz zablokować/odblokować przycisk zakupu w menu Ustawienia", - "-774638412": "Stawka musi mieścić się w przedziale od {{min_stake}} {{currency}} do {{max_stake}} {{currency}}.", - "-1358367903": "Stawka", - "-434270664": "Aktualna cena", - "-1956787775": "Bariera Cena:", - "-1513281069": "Limit 2", "-390994177": "Powinna być pomiędzy {{min}} a {{max}}", "-1804019534": "Data ważności: {{date}}", "-2055106024": "Przełącz między zaawansowanymi i prostymi ustawieniami czasu trwania", @@ -3484,6 +3534,7 @@ "-1763848396": "Umieścić", "-194424366": "powyżej", "-857660728": "Ceny wykonania", + "-1358367903": "Stawka", "-1386326276": "Limit to pole wymagane.", "-1418742026": "Wyższy limit musi być większy niż niższy limit.", "-92007689": "Niższy limit musi być mniejszy niż wyższy limit.", @@ -3491,6 +3542,21 @@ "-1975910372": "Minuta musi być wartością od 0 do 59.", "-866277689": "Czas wygaśnięcia nie może być w przeszłości.", "-1455298001": "Teraz", + "-256210543": "Handlowanie nie jest dostępne w tym czasie.", + "-1150099396": "Opcja wkrótce będzie dostępna. Jeśli masz inne konto, przejdź na nie, aby kontynuować inwestowanie. Możesz dodać konto finansowe Deriv MT5.", + "-28115241": "Platforma {{platform_name_trader}} nie jest dostępna dla tego konta", + "-453920758": "Przejdź do pulpitu {{platform_name_mt5}}", + "-402175529": "Historia", + "-988484646": "Anulowanie transakcji (wykonano)", + "-444882676": "Anulowanie transakcji (aktywne)", + "-13423018": "Identyfikator referencyjny", + "-2035315547": "Dolny limit", + "-1551639437": "Brak historii", + "-1214703885": "Musisz zaktualizować albo uzyskaj zysk albo stop stratom", + "-504849554": "Zostanie ponownie otwarty o", + "-59803288": "W międzyczasie możesz inwestować we wskaźniki syntetyczne, które symulują rzeczywistą sytuację rynkową i są dostępne 24 godz. na dobę 7 dni w tygodniu.", + "-1278109940": "Zobacz otwarte rynki", + "-694105443": "Ten rynek jest zamknięty", "-439389714": "Pracujemy nad tym", "-770929448": "Przejdź do {{platform_name_smarttrader}}", "-347156282": "Prześlij dowód", @@ -3537,6 +3603,8 @@ "-454245976": "Jeśli uważasz, że cena rynkowa będzie spadać w sposób ciągły przez określony czas, wybierz <0>Krótki. Otrzymasz wypłatę w momencie wygaśnięcia, jeśli cena rynkowa nie dotknie lub nie przekroczy bariery. Twoja wypłata wzrośnie proporcjonalnie do odległości między ceną rynkową a barierą, jeśli bariera nie zostanie przekroczona. Zaczniesz zarabiać, gdy wypłata będzie wyższa niż Twoja stawka. Jeśli cena rynkowa kiedykolwiek przekroczy barierę, nie będzie wypłaty.", "-351875097": "Liczba kleszczy", "-729830082": "Wyświetl mniej", + "-1669741470": "Wypłata w momencie wygaśnięcia jest równa wypłacie za punkt pomnożonej przez różnicę między ceną końcową a ceną wykonania.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NOWOŚĆ!", "-993480898": "Akumulatory", "-45873457": "NOWOŚĆ", @@ -3557,6 +3625,10 @@ "-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.", "-438655760": "<0>Uwaga: Mogą Państwo zamknąć transakcję w dowolnym momencie. Proszę pamiętać o ryzyku poślizgu.", + "-774638412": "Stawka musi mieścić się w przedziale od {{min_stake}} {{currency}} do {{max_stake}} {{currency}}.", + "-434270664": "Aktualna cena", + "-1956787775": "Bariera Cena:", + "-1513281069": "Limit 2", "-1683683754": "Długie", "-1046859144": "<0>{{title}} Otrzymasz wypłatę, jeśli cena rynkowa pozostanie {{price_position}} i nie dotknie ani nie przekroczy bariery. W przeciwnym razie Twoja wypłata wyniesie zero.", "-1815023694": "powyżej bariery", diff --git a/packages/translations/src/translations/pt.json b/packages/translations/src/translations/pt.json index a07fc94626de..13ba06086c5c 100644 --- a/packages/translations/src/translations/pt.json +++ b/packages/translations/src/translations/pt.json @@ -24,7 +24,6 @@ "27731356": "A sua conta está temporariamente desativada. Por favor, contacte-nos através do <0>live chat para ativar novamente os depósitos e levantamentos.", "27830635": "Deriv (V) Ltd", "28581045": "Adicione uma real MT5 account", - "30801950": "Sua conta será aberta com {{legal_entity_name}}, regulamentada pela Autoridade de Jogos de Malta, e estará sujeita às leis de Malta.", "33433576": "Use uma carteira eletrônica para sacar seus fundos.", "35089987": "Carregue a frente e o verso da sua carteira de habilitação.", "41737927": "Obrigado", @@ -60,11 +59,13 @@ "72500774": "Por favor, preencha a residência fiscal.", "73086872": "Foi auto-excluído da negociação", "73326375": "A baixa é o ponto mais baixo alguma vez atingido pelo mercado durante o período do contrato.", + "74836780": "{{currency_code}} Wallet", "74963864": "Abaixo", "76916358": "Atingiu o limite de levantamento.<0/>Carregue o seu comprovativo de identidade e morada para levantar o limite e continuar o seu levantamento.", "76925355": "Verifique o desempenho do seu bot", "77945356": "Negoceie em qualquer lugar com a nossa aplicação móvel.", "77982950": "As Opções Vanilla permitem-lhe prever uma direção ascendente (alta) ou descendente (baixa) do ativo subjacente através da compra de uma \"Call\" ou de uma \"Put\".", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Não conseguimos encontrar essa página", "82839270": "Carregue a página do seu passaporte que contém a sua fotografia.", "83202647": "Recolher bloco", @@ -76,6 +77,7 @@ "90266322": "2. Inicie uma conversa com o seu recém-criado bot do Telegram e certifique-se de enviar-lhe algumas mensagens antes de avançar para o passo seguinte. (por exemplo, Olá Bot!)", "91993812": "A Estratégia Martingale é uma técnica de negociação clássica que tem sido utilizada há mais de cem anos, popularizada pelo matemático francês Paul Pierre Levy no século XVIII.", "93154671": "1. Clique Redefinir na parte inferior do painel de estatísticas.", + "93939827": "Cryptocurrency accounts", "96381225": "A verificação de ID falhou", "98473502": "Não somos obrigados a efetuar um teste de adequação, nem a fornecer-lhe quaisquer avisos de risco.", "98972777": "item aleatório", @@ -83,6 +85,7 @@ "102226908": "O campo não pode estar vazio", "108916570": "Duração: {{duration}} dias", "109073671": "Utilize uma carteira eletrónica que já tenha utilizado anteriormente para depósitos. Certifique-se de que a carteira eletrónica suporta levantamentos. Consulte a lista de carteiras electrónicas que suportam levantamentos <0>aqui.", + "110822969": "One Wallet for all your transactions", "111215238": "Afaste-se da luz direta", "111718006": "Data de término", "111931529": "Entrada total máxima em 7 dias", @@ -215,7 +218,9 @@ "251882697": "Obrigado! A sua resposta foi registada no nosso sistema.<0/><0/>Clique em 'OK' para continuar.", "254912581": "Este bloco é semelhante ao EMA, exceto que lhe oferece toda a linha EMA com base na lista de entrada e no período dado.", "256031314": "Negócio a dinheiro", + "256123827": "What happens to my trading accounts", "256602726": "Se encerrar a sua conta:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Avaliação de negociação", "260069181": "Ocorreu um erro ao tentar carregar o URL", @@ -250,8 +255,8 @@ "284527272": "antimodo", "284772879": "Contrato", "284809500": "Demo Financeira", + "285909860": "Demo {{currency}} Wallet", "287934290": "Tem a certeza de que pretende cancelar esta transação?", - "289898640": "TERMOS DE UTILIZAÇÃO", "291744889": "<0>1. Parâmetros de negociação:<0>", "291817757": "Aceda à nossa comunidade Deriv e saiba mais sobre APIs, tokens de API, formas de utilizar APIs Deriv e muito mais.", "292491635": "Se selecionar \"Stop loss\" e especificar um valor para limitar as suas perdas, a sua posição será fechada automaticamente quando as suas perdas forem superiores ou iguais a este valor. A sua perda pode ser superior ao valor introduzido, dependendo do preço de mercado no fechamento.", @@ -299,6 +304,7 @@ "344418897": "Estes limites de negociação e autoexclusão ajudam-no a controlar a quantidade de dinheiro e tempo que gasta em {{brand_website_name}} e a exercer a <0>negociação responsável.", "345320063": "Carimbo de data/hora inválido", "345818851": "Desculpe, ocorreu um erro interno. Clique na caixa de seleção acima para tentar novamente.", + "346214602": "A better way to manage your funds", "347029309": "Forex: padrão/micro", "347039138": "Iterar (2)", "347217485": "Problemas ao aceder à Deriv MT5 no seu telemóvel?", @@ -353,6 +359,7 @@ "401345454": "Vá até a guia Tutoriais para fazer isso.", "402343402": "Devido a um problema no nosso servidor, algumas das suas contas {{platform}} estão indisponíveis de momento. Agradecemos a sua paciência.", "403456289": "A fórmula para SMA é:", + "403608958": "Select a trading account or a Wallet", "404743411": "Total de depósitos", "406359555": "Dados do Contrato", "406497323": "Venda o seu contrato ativo, se necessário (opcional)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "O seu intervalo de tempo preferido entre cada relatório:", "431267979": "Aqui está um guia rápido sobre como utilizar a Deriv Bot em qualquer lugar.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Take Profit: {{ currency }} {{ take_profit }}", "432519573": "Documento carregado", @@ -453,12 +461,12 @@ "518955798": "7. Execute uma vez no início", "520136698": "Índice Boom 500", "521872670": "item", - "522283618": "Experiência de negociação de opções digitais", "522703281": "divisível por", "523123321": "- 10 elevado à potência de um determinado número", "524459540": "Como faço para criar variáveis?", "527329988": "Esta é uma das 100 senhas mais comuns", "529056539": "Opções", + "530864956": "Deriv Apps", "530953413": "Aplicações autorizadas", "531114081": "3. Tipo de Contrato", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, ações, índices de ações, criptomoedas, índices sintéticos", "545476424": "Total de retiradas", "549479175": "Multiplicadores da Deriv", + "549799607": "Go to LiveChat", "550589723": "A sua entrada crescerá a {{growth_rate}}% por tick, desde que o preço à vista atual permaneça dentro de ±{{tick_size_barrier}} do preço à vista anterior.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Saiba mais sobre os limites de negociação", "554135844": "Editar", "554410233": "Esta é uma das 10 senhas mais comuns", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Após definir os parâmetros de negociação e as opções de negociação, pode instruir o seu bot a comprar contratos quando condições específicas forem atendidas. Para fazer isso, pode utilizar blocos condicionais e blocos indicadores para ajudar o seu bot a tomar decisões.", "555881991": "Boletim do número de identidade nacional", "556264438": "Intervalo de tempo", @@ -552,6 +563,7 @@ "629395043": "Todas as taxas de crescimento", "632398049": "Esse bloco atribui um valor nulo a um item ou declaração.", "634219491": "Não forneceu o seu número de identificação fiscal. Essas informações são necessárias para os requisitos legais e regulamentares. Aceda <0>Dados pessoais nas definições da sua conta e preencha o seu número de identificação fiscal mais recente.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c. Se nenhuma oportunidade de acordo for encontrada, a reclamação prosseguirá para a fase de determinação a ser tratada pela RDC.", "639382772": "Faça o upload do tipo de arquivo compatível.", "640596349": "Ainda não recebeu nenhuma notificação", @@ -562,7 +574,6 @@ "642546661": "Faça o upload da licença do seu computador", "642995056": "E-mail", "644150241": "O número de contratos que ganhou desde a última vez que limpou as suas estatísticas.", - "645016681": "Frequência de negociação em outros instrumentos financeiros", "645902266": "EURO/NZD", "647039329": "É necessário comprovativo de morada", "647745382": "Lista de entrada {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "No exemplo abaixo, o preço de abertura é selecionado, que é então atribuído a uma variável chamada “op”.", "666724936": "Insira um número de identificação válido.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Jurisdição e escolha da lei", "674973192": "Utilize esta senha para fazer login nas suas contas Deriv MT5 nas aplicações para computador, web e dispositivos móveis.", "676159329": "Não foi possível mudar para a conta padrão.", @@ -613,6 +625,7 @@ "692354762": "Por favor, introduza o seu {{document_name}}. {{example_format}}", "693396140": "Cancelamento da transação (expirado)", "694035561": "Multiplicadores de opções de negociação", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Horário de abertura: o horário de abertura", "697630556": "Este mercado está fechado no momento.", "698037001": "Número de identidade nacional", @@ -624,8 +637,8 @@ "701647434": "Pesquisar por string", "702451070": "Identificação nacional (sem foto)", "702561961": "Alterar o tema", + "705262734": "Your Wallets are ready", "705299518": "Em seguida, carregue a página do seu passaporte que contém a sua foto.", - "706413212": "Para aceder à Caixa, agora está na sua conta {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Frequência de negociação de opções binárias", "706755289": "Esse bloco executa funções trigonométricas.", "706960383": "Ofereceremos a compra do seu contrato a este preço, caso decida vendê-lo antes do seu termo. Isto baseia-se em vários fatores, como o preço à vista atual, a duração, etc. No entanto, não ofereceremos um valor de contrato se a duração restante for inferior a 60 segundos.", @@ -644,6 +657,7 @@ "720293140": "Sair", "720519019": "Redefinir minha senha", "721011817": "- Eleve o primeiro número à potência do segundo número", + "722797282": "EU-regulated USD accounts", "723045653": "Fará login na sua conta Deriv com este endereço de e-mail.", "723961296": "Gerenciar senha", "724203548": "Pode enviar a sua reclamação para a plataforma de <0>Resolução de Litígios Online (ODR) da Comissão Europeia. Isto não se aplica a clientes no Reino Unido.", @@ -656,6 +670,7 @@ "734390964": "Saldo insuficiente", "734881840": "falso", "742469109": "Redefinir saldo", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Negocie CFDs em forex, índices derivados, criptomoedas e matérias-primas com alta alavancagem.", "743623600": "Referência", "744110277": "Matriz de Bandas de Bollinger (BBA)", @@ -689,6 +704,7 @@ "775706054": "Vendem bots de negociação?", "776085955": "Estratégias", "781924436": "Spread de Compra/Venda", + "782563319": "Add more Wallets", "783974693": "Evite os últimos anos", "784311461": "Média Móvel Exponencial (EMA)", "784583814": "Vinculado ao seu computador", @@ -725,6 +741,7 @@ "818447476": "Alternar conta?", "820877027": "Verifique o seu comprovativo de identidade", "821163626": "A manutenção do servidor ocorre todos os primeiros sábados do mês, das 7 às 10 horas GMT. O serviço pode sofrer interrupções durante este período.", + "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": "Um bloco que pode conter texto.", "824797920": "A lista está vazia?", "825042307": "Vamos tentar novamente", @@ -747,7 +764,6 @@ "836097457": "Tenho interesse em negociar, mas tenho pouca experiência.", "837063385": "Não enviar outras divisas para este endereço.", "837066896": "A sua documentação está a ser analisada. Verifique novamente em 1 a 3 dias.", - "839618971": "ENDEREÇO", "839805709": "Para verificarmos com facilidade, precisaremos de uma foto melhor", "840672750": "Se isto não funcionar, desinstale e volte a instalar a aplicação MT5. Em seguida, repita os passos <0>2 e <0>3.", "841434703": "Desativar pilha", @@ -844,9 +860,9 @@ "943535887": "Feche suas posições nas seguintes contas Deriv MT5:", "944499219": "Máximo de posições abertas", "945532698": "Contrato vendido", + "945753712": "Back to Trader’s Hub", "946204249": "Leia", "946841802": "Uma vela branca (ou verde) indica que o preço de abertura é menor do que o preço de fechamento. Isso representa um movimento ascendente do preço de mercado.", - "946944859": "Clique no botão abaixo e enviaremos um e-mail com um link. Clique nesse link para verificar a sua solicitação de retirada.", "947046137": "O seu levantamento será processado em 24 horas", "947363256": "Criar lista", "947758334": "A cidade é obrigatória", @@ -950,6 +966,7 @@ "1050128247": "Confirmo que verifiquei as informações de transferência do agente de pagamentos.", "1050844889": "Relatórios", "1052779010": "Está na sua conta demo", + "1052921318": "{{currency}} Wallet", "1053153674": "Índice Jump 50", "1053159279": "Grau de escolaridade", "1053556481": "Assim que apresentar a sua reclamação, enviaremos um e-mail de confirmação da receção da mesma.", @@ -1010,6 +1027,7 @@ "1110102997": "Declaração", "1112582372": "Duração do intervalo", "1113119682": "Esse bloco fornece o valor da vela selecionada em uma lista de velas.", + "1113221217": "MT5 Swap-free", "1113292761": "Menos de 8MB", "1114679006": "O seu bot foi criado com êxito com uma estratégia simples.", "1117281935": "Condições de venda (opcional)", @@ -1036,6 +1054,7 @@ "1134879544": "Exemplo de um documento com brilho", "1138126442": "Forex: padrão", "1139483178": "Ativar pilha", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "A direção é {{ direction_type }}", "1144028300": "Matriz do Índice de Força Relativa (RSIA)", "1145927365": "Execute os blocos para dentro após um determinado número de segundos", @@ -1066,7 +1085,6 @@ "1174689133": "3. Defina os seus parâmetros comerciais e prima Run.", "1174748431": "Canal de pagamento", "1175183064": "Vanuatu", - "1176926166": "Experiência com negociação de outros instrumentos financeiros", "1177396776": "Se você selecionar “Asiático Desce”, ganhará o pagamento se o último tick for menor que a média dos ticks.", "1177723589": "Não há transações para exibir", "1178582280": "O número de contratos que perdeu desde a última vez que limpou as suas estatísticas.", @@ -1077,6 +1095,7 @@ "1181396316": "Este bloco fornece um número aleatório dentro de um intervalo definido", "1181770592": "Lucro/perda da venda", "1183007646": "- Tipo de contrato: o nome do tipo de contrato, como Sobe, Desce, Toca, Não Toca, etc.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Encerre o seu contrato agora ou mantenha-o em curso. Se decidir mantê-lo em execução, pode verificá-lo e encerrá-lo mais tarde na secção ", "1188316409": "Para receber os seus fundos, contacte o agente de pagamentos com os dados abaixo indicados", "1188980408": "5 minutos", @@ -1094,12 +1113,14 @@ "1201773643": "numérico", "1203297580": "Esse bloco envia uma mensagem para um canal do Telegram.", "1204223111": "Neste exemplo, os preços de abertura de uma lista de velas são atribuídos a uma variável chamada “candle_list”.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Como mascarar o seu cartão?", "1206821331": "Forças Armadas", "1207152000": "Escolha um modelo e defina os seus parâmetros de negociação.", "1208714859": "Resumindo:", "1208729868": "Ticks", "1208903663": "Token inválido", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "O bot está a começar", "1214893428": "No momento, a criação da conta não está disponível para dispositivos móveis. Faça login com seu computador para criar uma nova conta.", "1216408337": "Trabalhador autônomo", @@ -1112,6 +1133,7 @@ "1222521778": "É difícil efetuar depósitos e levantamentos.", "1222544232": "Enviámos um e-mail", "1225150022": "Número de ativos", + "1226027513": "Transfer from", "1227074958": "fração aleatória", "1227240509": "Espaços de corte", "1228534821": "Algumas moedas podem não ser aceites pelos agentes de pagamento no seu país.", @@ -1121,6 +1143,7 @@ "1232291311": "Retirada máxima restante", "1232353969": "0 a 5 transações nos últimos 12 meses", "1233300532": "Pagamento", + "1233376285": "Options & multipliers", "1234292259": "Origem do patrimônio", "1234764730": "Carregue uma captura de ecrã do seu nome e e-mail a partir da secção de dados pessoais.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Classifica os itens em uma determinada lista, por seu valor numérico ou alfabético, em ordem crescente ou decrescente.", "1281290230": "Selecionar", "1282951921": "Sempre Abaixo", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Se for selecionada a opção \"Perda\", será devolvido \"Verdadeiro\" se a sua última negociação não tiver sido bem sucedida. Caso contrário, devolverá uma cadeia de caracteres vazia.", "1286094280": "Retirar", "1286507651": "Fechar o ecrã de verificação de identidade", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Chamada de margem", "1290525720": "Exemplo: ", - "1291887623": "Frequência de negociação de opções digitais", "1291997417": "Os contratos expiram exatamente às 23:59:59 GMT na data de expiração selecionada.", "1292188546": "Redefinir a senha do investidor da Deriv MT5", "1292891860": "Notifique o Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Vender)", "1329136554": "Índice Jump 200", "1329325646": "O conteúdo deste bloco é chamado em cada tick", + "1330479159": "Ready to upgrade?", "1331199417": "Insira o formato correto. ", "1331367811": "Número da conta do cliente", "1332168410": "Saiba mais", @@ -1257,7 +1281,6 @@ "1367023655": "Para garantir que a sua perda não excede a sua entrada, o seu contrato será fechado automaticamente quando a sua perda for igual a <0/>.", "1367488817": "4. Reiniciar as condições comerciais", "1367990698": "Índice Volatilidade 10", - "1369709538": "Nossos termos de uso", "1370647009": "Desfrute de limites diários mais altos", "1371193412": "Cancelar", "1371555192": "Escolha o seu agente de pagamentos preferido e introduza o valor do levantamento. Se o seu agente de pagamentos não constar da lista, <0>procure-o utilizando o número da conta.", @@ -1319,6 +1342,7 @@ "1434767075": "Comece a utilizar o Deriv Bot", "1434976996": "Anúncio", "1435363248": "Este bloco converte o número de segundos desde a época Unix para um formato de data e hora, como 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Depósito mínimo", "1437396005": "Adicionar comentário", "1438247001": "Um cliente profissional beneficia de menos proteção do cliente devido ao seguinte.", @@ -1369,6 +1393,7 @@ "1476301886": "Semelhante ao SMA, esse bloco fornece toda a linha SMA contendo uma lista de todos os valores de um determinado período.", "1478030986": "Crie ou exclua tokens de API para negociações e retiradas", "1480915523": "Ignorar", + "1481860194": "Your new Wallet(s)", "1481977420": "Ajude-nos a verificar o seu pedido de levantamento.", "1483470662": "Clique em \"Abrir\" para começar a negociar com a sua conta", "1484336612": "Este bloco é utilizado para terminar ou continuar um ciclo, e pode ser colocado em qualquer sítio dentro de um bloco de ciclo.", @@ -1389,6 +1414,7 @@ "1505420815": "Não foram encontrados agentes de pagamento para a sua pesquisa", "1505898522": "Descarregar pilha", "1505927599": "Os nossos servidores tiveram um problema. Vamos atualizar-nos para seguir.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Comprar)", "1509678193": "Educação", @@ -1419,7 +1445,7 @@ "1542742708": "Sintéticos, Forex, Ações, Índices de Ações, Matérias-primas e Criptomoedas", "1544642951": "Se selecionar \"Sempre Acima\", ganha o pagamento se os ticks consecutivos subirem sucessivamente após o ponto de entrada. Não há pagamento se qualquer tick descer ou for igual a qualquer um dos ticks anteriores.", "1547148381": "Esse ficheiro é demasiado grande (só é permitido um máximo de 8MB). Por favor, carregue outro ficheiro.", - "1548765374": "Falha na Verificação do número do documento", + "1548765374": "Verification of document number failed", "1549098835": "Total retirado", "1551172020": "Cesta de AUD", "1552162519": "Ver a integração", @@ -1449,6 +1475,7 @@ "1577480486": "O seu link móvel expirará dentro de uma hora", "1577527507": "O motivo da abertura da conta é obrigatório.", "1577612026": "Selecione uma pasta", + "1577879664": "<0>Your Wallets are ready", "1579839386": "Appstore", "1580498808": "Vários rostos encontrados", "1584109614": "Lista de sequências de ticks", @@ -1502,9 +1529,11 @@ "1644703962": "Procurando contas de CFD? Vá para o Trader's Hub", "1644864436": "Terá de autenticar a sua conta antes de pedir para se tornar um cliente profissional. <0>Autenticar a minha conta", "1644908559": "O código de dígito é obrigatório.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "O bot encontrou um erro durante a execução.", "1648938920": "Netherlands 25", "1649239667": "2. No menu Blocks, verá uma lista de categorias. Os blocos estão agrupados dentro destas categorias. Escolha o bloco que pretende e arraste-o para a área de trabalho.", + "1650963565": "Introducing Wallets", "1651513020": "Exibir o tempo restante para cada intervalo", "1651951220": "Repetições como “abcabcabc” são apenas um pouco mais difíceis de adivinhar do que “abc”", "1652366857": "obter e remover", @@ -1522,13 +1551,13 @@ "1665272539": "Lembre-se: não pode iniciar sessão na sua conta até à data selecionada.", "1665738338": "Saldo", "1665756261": "Ir para o chat Live Chat", + "1666783057": "Upgrade now", "1668138872": "Modificar as definições da conta", "1670016002": "Multiplicador: {{ multiplier }}", "1670426231": "Tempo final", "1671232191": "O utilizador definiu os seguintes limites:", "1674163852": "Pode determinar a expiração do seu contrato definindo a duração ou a hora de término.", "1675030608": "Para criar esta conta, é necessário voltar a apresentar o seu comprovativo de morada.", - "1675289747": "Alternado para uma conta real", "1676549796": "Alavancagem dinâmica", "1677027187": "Forex", "1677990284": "Minhas aplicações", @@ -1556,6 +1585,7 @@ "1703091957": "Reunimos informações sobre o seu emprego no âmbito das nossas obrigações de diligência, conforme exigido pela legislação contra o branqueamento de capitais.", "1704656659": "Qual é a sua experiência na negociação de CFDs?", "1708413635": "Para a sua conta {{currency_name}} ({{currency}})", + "1709293836": "Wallet balance", "1709401095": "Negoceie CFDs na Deriv X com os mercados financeiros e os nossos índices derivados.", "1709859601": "Horário do preço de saída", "1710662619": "Se tiver a aplicação, inicie-a para começar a negociar.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Cobraremos uma taxa de transferência de 2% ou {{minimum_fee}} {{currency}}, o que for mais alto, para transferências entre suas contas Deriv fiduciária e Deriv criptomoeda.", "1720968545": "Carregue a página da foto do passaporte do seu computador", + "1723069433": "Your new Wallet", "1723589564": "Representa o número máximo de contratos pendentes na sua carteira. Cada linha na sua carteira conta para uma posição aberta. Uma vez atingido o máximo, não será possível abrir novas posições sem fechar primeiro uma posição existente.", "1724696797": "Está limitado a uma única conta fiduciária.", "1725958461": "Número da conta", @@ -1698,6 +1729,7 @@ "1842266423": "voltar", "1842862156": "Bem-vindo ao seu painel da Deriv X", "1843658716": "Se selecionar \"Sempre Abaixo\", ganha o pagamento se os ticks consecutivos descerem sucessivamente após o ponto de entrada. Não há pagamento se qualquer tick subir ou for igual a qualquer um dos ticks anteriores.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min: {{min_stake}} - máx: {{max_payout}})", "1846266243": "Esta funcionalidade não está disponível para contas demo.", "1846587187": "Não selecionou o seu país de residência", @@ -1792,7 +1824,6 @@ "1924765698": "Local de nascimento*", "1926987784": "- iOS: Deslize para a esquerda na conta e pressione <0>Eliminar.", "1928930389": "GBP/NOK", - "1929309951": "Situação profissional", "1929694162": "Comparar contas", "1930899934": "Tether", "1931659123": "Executar em cada tick", @@ -1807,6 +1838,7 @@ "1943440862": "Calcula a lista de Bandas de Bollinger (BB) a partir de uma lista com um período", "1944204227": "Esse bloco retorna o saldo atual da conta.", "1947527527": "1. Este link foi enviada por si", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Aqui estão os possíveis motivos:", "1950413928": "Envie documentos de identidade", @@ -1875,6 +1907,7 @@ "2014536501": "Número do cartão", "2014590669": "A variável '{{variable_name}}' não tem valor. Por favor, defina um valor para a variável '{{variable_name}}' para notificar.", "2017672013": "Selecione o país de emissão do documento.", + "2020104747": "Filter", "2020545256": "Fechar a sua conta?", "2021037737": "Atualize os seus dados para continuar.", "2021161151": "Assista a este vídeo para aprender como construir um bot de negociação no Deriv Bot. Além disso, verifique esta postagem do blog sobre como construir um bot de negociação.", @@ -1885,7 +1918,6 @@ "2027696535": "Informações fiscais", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "CFD Compare contas", "2030018735": "O RSI é uma ferramenta de análise técnica que o ajuda a identificar a tendência do mercado. Oferece-lhe um valor de 0 a 100. Um valor de RSI igual ou superior a 70 significa que o ativo está sobrecomprado e a tendência atual pode inverter-se, enquanto um valor igual ou inferior a 30 significa que o ativo está sobrevendido.", "2030045667": "Mensagem", "2033648953": "Esse bloco fornece o valor de vela especificado para um intervalo de tempo selecionado.", @@ -1919,6 +1951,7 @@ "2063812316": "Declaração de texto", "2063890788": "Cancelado", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Carta de condução", "2070002739": "Não aceitar", "2070345146": "Ao abrir uma negociação de CFDs alavancada.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Apresentação de uma reclamação", "2080553498": "3. Obtenha o ID do chat utilizando a API REST do Telegram (leia mais: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Vendido por: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Sim, apagar", "2084693624": "Converte uma string representando uma string de data/hora em segundos desde Epoch. Exemplo: 2019-01-01 21:03:45 GMT+0800 será convertido em 1546347825. A diferença de horário e fuso horário é opcional.", "2085387371": "Devem ser números, letras e caracteres especiais., '-", @@ -1966,7 +2000,6 @@ "2115223095": "Perda", "2117165122": "1. Crie um bot do Telegram e obtenha o seu token da API do Telegram. Leia mais sobre como criar bots no Telegram aqui: https://core.telegram.org/bots#6-botfather", "2117489390": "Atualização automática em {{ remaining }} segundos", - "2118315870": "Onde é que vive?", "2119449126": "O exemplo de saída do exemplo abaixo será:", "2119710534": "PERGUNTAS FREQUENTES", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Sugestão profissional: também pode clicar e arrastar o bloco pretendido", "2146892766": "Experiência de negociação de opções binárias", "2147244655": "Como faço para importar meu próprio bot de negociação para o Deriv Bot?", - "-1232613003": "<0>Falha na Verificação. <1>Por quê?", - "-2029508615": "<0>Precisa de verificação. <1>Verifique agora", "-931052769": "Enviar verificação", "-1004605898": "Dicas", "-1938142055": "Documentos enviados", @@ -2141,18 +2172,9 @@ "-179726573": "Recebemos o seu comprovativo de propriedade.", "-813779897": "A verificação do comprovativo de propriedade foi aprovada.", "-638756912": "Escureça os dígitos 7 a 12 do número do cartão exibido na frente do seu cartão de débito/crédito.", - "-2073934245": "Os serviços de negociação financeira oferecidos neste site são adequados apenas para clientes que aceitam a possibilidade de perder todo o dinheiro que investem e que entendem e têm experiência com o risco envolvido na compra de contratos financeiros. As transações em contratos financeiros apresentam um alto grau de risco. Se os contratos adquiridos expirarem como inúteis, você perderá todo o seu investimento, o que inclui o prêmio do contrato.", - "-1166068675": "A sua conta será aberta com {{legal_entity_name}}, regulada pela UK Gaming Commission (UKGC) e estará sujeita às leis da Ilha de Man.", - "-975118358": "A sua conta será aberta com {{legal_entity_name}}, regulada pela Autoridade de Serviços Financeiros de Malta (MFSA) e estará sujeita às leis de Malta.", - "-680528873": "A sua conta será aberta com {{legal_entity_name}} e estará sujeita às leis de Samoa.", - "-1125193491": "Adicionar conta", - "-2068229627": "Eu não sou um PEP e não fui um PEP nos últimos 12 meses.", "-684271315": "OK", "-740157281": "Avaliação da experiência de negociação", "-1720468017": "Ao fornecer nossos serviços a você, somos obrigados a obter informações de você para avaliar se um determinado produto ou serviço é apropriado para você.", - "-186841084": "Alterar seu e-mail de login", - "-907403572": "Para alterar o seu e-mail, primeiro tem de desvincular o seu e-mail da sua conta {{identifier_title}}.", - "-1850792730": "Desligar de {{identifier_title}}", "-307865807": "Aviso de tolerância ao risco", "-690100729": "Sim, eu entendo o risco.", "-2010628430": "CFDs e outros instrumentos financeiros apresentam um alto risco de perder dinheiro rapidamente devido à alavancagem. Você deve considerar se entende como os CFDs e outros instrumentos financeiros funcionam e se pode correr o alto risco de perder seu dinheiro. <0/> <0/> Para continuar, você deve confirmar que entende que seu capital está em risco.", @@ -2206,11 +2228,6 @@ "-1725454783": "Falhou", "-506510414": "Data e hora", "-1708927037": "Endereço IP", - "-619126443": "Use a senha <0>Deriv fazer login para {{brand_website_name}} e {{platform_name_trader}}.", - "-623760979": "Utilize a <0>palavra-passe Deriv para iniciar sessão em {{brand_website_name}}, {{platform_name_trader}} e {{platform_name_go}}.", - "-459147994": "Utilize a <0>palavra-passe Deriv para iniciar sessão em {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} e {{platform_name_ctrader}}.", - "-80717068": "Aplicações que associou à sua <0>palavra-passe Deriv:", - "-9570380": "Utilize a palavra-passe {{platform_name_dxtrade}} para iniciar sessão nas suas contas {{platform_name_dxtrade}} na Web e nas ", "-2131200819": "Desativar", "-200487676": "Ativar", "-1840392236": "Este não é o código correto. Por favor, tente novamente.", @@ -2240,44 +2257,37 @@ "-378415317": "O estado é obrigatório", "-1497654315": "Nossas contas e serviços não estão disponíveis para o código postal de Jersey.", "-755626951": "Preencha os detalhes do seu endereço", - "-584911871": "Selecione a moeda da carteira", "-1461267236": "Escolha sua moeda", - "-1352330125": "MOEDA", "-1027595143": "Menos de $25.000", "-40491332": "$25.000 - $50.000", "-1139806939": "$50.001 - $100.000", - "-626752657": "0-1 ano", - "-532014689": "1-2 anos", - "-1001024004": "Mais de 3 anos", - "-790513277": "6 a 10 transações nos últimos 12 meses", - "-580085300": "11-39 transações nos últimos 12 meses", - "-654781670": "Primária", - "-1717373258": "Secundário", "-996132458": "Construção", "-915003867": "Saúde", "-1430012453": "Tecnologia da Informação e Comunicação", "-987824916": "Ciência e Engenharia", "-146630682": "Social e cultural", "-761306973": "Fabricação", - "-739367071": "Empregado", - "-1156937070": "$500.001 - $1.000.000", - "-315534569": "Mais de $1.000.000", - "-2068544539": "Empregado assalariado", - "-531314998": "Investimentos e dividendos", - "-1235114522": "Pensão", - "-1298056749": "Benefícios estaduais", - "-449943381": "Poupança e herança", "-1631552645": "Profissionais", "-474864470": "Trabalhadores de cuidados pessoais, vendas e serviços", "-1129355784": "Trabalhadores da agricultura, silvicultura e pesca", "-1242914994": "Trabalhadores artesanais, metalúrgicos, elétricos e eletrônicos", "-1317824715": "Limpadores e ajudantes", "-1592729751": "Trabalhadores de mineração, construção, manufatura e transporte", + "-1030759620": "Oficiais do governo", "-2137323480": "Propriedade da empresa", "-1590574533": "Acordo de divórcio", "-1667683002": "Herança", "-1237843731": "Renda de investimento", "-777506574": "Venda de propriedade", + "-654781670": "Primária", + "-1717373258": "Secundário", + "-1156937070": "$500.001 - $1.000.000", + "-315534569": "Mais de $1.000.000", + "-2068544539": "Empregado assalariado", + "-531314998": "Investimentos e dividendos", + "-1235114522": "Pensão", + "-1298056749": "Benefícios estaduais", + "-449943381": "Poupança e herança", "-1161338910": "O primeiro nome é obrigatório.", "-1161818065": "O último nome deve ter entre 2 e 50 caracteres.", "-1281693513": "A data de nascimento é obrigatória.", @@ -2287,28 +2297,14 @@ "-212167954": "O número de identificação fiscal não está formatado corretamente.", "-621555159": "Informações de identidade", "-204765990": "Termos de uso", - "-231863107": "Não", - "-870902742": "Quanto conhecimento e experiência você tem em relação ao comércio on-line?", - "-1929477717": "Tenho um diploma acadêmico, certificação profissional e/ou experiência profissional relacionada a serviços financeiros.", - "-1540148863": "Participei de seminários, treinamentos e/ou workshops relacionados à negociação.", - "-922751756": "Menos de um ano", - "-542986255": "Nenhum", - "-1337206552": "Em seu entendimento, a negociação de CFD permite que você", - "-456863190": "Coloque uma posição no movimento do preço de um ativo em que o resultado seja um retorno fixo ou nada.", - "-1314683258": "Faça um investimento de longo prazo para obter lucro garantido.", - "-1546090184": "Como a alavancagem afeta a negociação de CFD?", - "-1636427115": "A Alavancagem ajuda a mitigar os riscos.", - "-800221491": "Alavancagem garante lucros.", - "-811839563": "Alavancagem permite que você abra grandes posições por uma fração do valor comercial, o que pode resultar em aumento de lucros ou perdas.", - "-1185193552": "Feche sua negociação automaticamente quando a perda for igual ou superior a um valor especificado, desde que haja liquidez de mercado adequada.", - "-1046354": "Feche sua negociação automaticamente quando o lucro for igual ou superior a um valor especificado, desde que haja liquidez de mercado adequada.", - "-1842858448": "Obtenha um lucro garantido em sua negociação.", - "-860053164": "Ao negociar multiplicadores.", - "-1250327770": "Ao comprar ações de uma empresa.", - "-1222388581": "Todas as anteriores.", "-477761028": "ID de eleitor", "-1466346630": "CPF", - "-1030759620": "Oficiais do governo", + "-739367071": "Empregado", + "-626752657": "0-1 ano", + "-532014689": "1-2 anos", + "-1001024004": "Mais de 3 anos", + "-790513277": "6 a 10 transações nos últimos 12 meses", + "-580085300": "11-39 transações nos últimos 12 meses", "-612752984": "Esses são os limites padrão que aplicamos às suas contas.", "-1598263601": "Para saber mais sobre os limites de negociação e como eles se aplicam, acesse a Central de <0>Ajuda.", "-1411635770": "Saiba mais sobre os limites da conta", @@ -2326,10 +2322,7 @@ "-1500958859": "Verificar", "-1502578110": "Sua conta está totalmente autenticada e seus limites de saque foram suspensos.", "-1662154767": "uma fatura recente (por exemplo, eletricidade, água, gás, telefone fixo ou Internet), um extrato bancário ou uma carta emitida pelo governo com o seu nome e esta morada.", - "-190838815": "Precisamos disso para verificação. Se as informações fornecidas forem falsas ou imprecisas, você não poderá depositar e sacar.", - "-223216785": "Segunda linha de endereço*", "-594456225": "Segunda linha de endereço", - "-1940457555": "Código postal/CEP*", "-1964954030": "Código postal", "-516397235": "Tenha cuidado com quem partilha este token. Qualquer pessoa com este token pode realizar as seguintes ações em nome da sua conta", "-989216986": "Adicionar contas", @@ -2371,8 +2364,6 @@ "-1100235269": "Indústria do emprego", "-684388823": "Patrimônio líquido estimado", "-509054266": "Volume de negócios anual previsto", - "-601903492": "Experiência de negociação em Forex", - "-1012699451": "Experiência em negociação de CFDs", "-1588485629": "Exemplo", "-1117345066": "Escolha o tipo de documento", "-651192353": "Amostra:", @@ -2394,11 +2385,11 @@ "-1088324715": "Analisaremos seus documentos e notificaremos você sobre seu status dentro de 1 a 3 dias úteis.", "-329713179": "Ok", "-1176889260": "Selecione um tipo de documento.", - "-1926456107": "O ID que você enviou expirou.", - "-555047589": "Parece que seu documento de identidade expirou. Tente novamente com um documento válido.", - "-841187054": "Tente novamente", + "-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": "Não foi possível verificar sua identidade com os detalhes que você forneceu. ", - "-228284848": "Não foi possível verificar sua identidade com os detalhes que você forneceu.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "A sua identificação foi verificada. Terá também de apresentar um comprovativo de morada.", "-118547687": "Verificação de identidade aprovada", "-200989771": "Vá para detalhes pessoais", @@ -2464,12 +2455,40 @@ "-142444667": "Clique no link do e-mail para alterar sua senha do Deriv MT5.", "-742748008": "Verifique seu e-mail e clique no link do e-mail para continuar.", "-84068414": "Ainda não recebeu o e-mail? Entre em contato conosco via <0>chat ao vivo.", + "-975118358": "A sua conta será aberta com {{legal_entity_name}}, regulada pela Autoridade de Serviços Financeiros de Malta (MFSA) e estará sujeita às leis de Malta.", + "-2073934245": "Os serviços de negociação financeira oferecidos neste site são adequados apenas para clientes que aceitam a possibilidade de perder todo o dinheiro que investem e que entendem e têm experiência com o risco envolvido na compra de contratos financeiros. As transações em contratos financeiros apresentam um alto grau de risco. Se os contratos adquiridos expirarem como inúteis, você perderá todo o seu investimento, o que inclui o prêmio do contrato.", + "-1125193491": "Adicionar conta", + "-2068229627": "Eu não sou um PEP e não fui um PEP nos últimos 12 meses.", + "-186841084": "Alterar seu e-mail de login", + "-907403572": "Para alterar o seu e-mail, primeiro tem de desvincular o seu e-mail da sua conta {{identifier_title}}.", + "-1850792730": "Desligar de {{identifier_title}}", "-428335668": "Você precisará definir uma senha para concluir o processo.", + "-1232613003": "<0>Falha na Verificação. <1>Por quê?", + "-2029508615": "<0>Precisa de verificação. <1>Verifique agora", "-818898181": "O nome no documento não corresponde ao seu perfil Deriv.", "-310316375": "O endereço no documento não coincide com o endereço que você inseriu acima.", "-485368404": "Documento emitido há mais de 6 meses.", "-367016488": "Documento desfocado. Todas as informações devem ser claras e visíveis.", "-1957076143": "Documento recortado. Todas as informações devem estar nítidas e visíveis.", + "-231863107": "Não", + "-870902742": "Quanto conhecimento e experiência você tem em relação ao comércio on-line?", + "-1929477717": "Tenho um diploma acadêmico, certificação profissional e/ou experiência profissional relacionada a serviços financeiros.", + "-1540148863": "Participei de seminários, treinamentos e/ou workshops relacionados à negociação.", + "-922751756": "Menos de um ano", + "-542986255": "Nenhum", + "-1337206552": "Em seu entendimento, a negociação de CFD permite que você", + "-456863190": "Coloque uma posição no movimento do preço de um ativo em que o resultado seja um retorno fixo ou nada.", + "-1314683258": "Faça um investimento de longo prazo para obter lucro garantido.", + "-1546090184": "Como a alavancagem afeta a negociação de CFD?", + "-1636427115": "A Alavancagem ajuda a mitigar os riscos.", + "-800221491": "Alavancagem garante lucros.", + "-811839563": "Alavancagem permite que você abra grandes posições por uma fração do valor comercial, o que pode resultar em aumento de lucros ou perdas.", + "-1185193552": "Feche sua negociação automaticamente quando a perda for igual ou superior a um valor especificado, desde que haja liquidez de mercado adequada.", + "-1046354": "Feche sua negociação automaticamente quando o lucro for igual ou superior a um valor especificado, desde que haja liquidez de mercado adequada.", + "-1842858448": "Obtenha um lucro garantido em sua negociação.", + "-860053164": "Ao negociar multiplicadores.", + "-1250327770": "Ao comprar ações de uma empresa.", + "-1222388581": "Todas as anteriores.", "-1515286538": "Por favor, insira o número do seu documento. ", "-1694758788": "Insira o número do seu documento", "-1458676679": "Você deve inserir de 2 a 50 caracteres.", @@ -2479,6 +2498,8 @@ "-1437017790": "Informações financeiras", "-70342544": "Somos legalmente obrigados a solicitar suas informações financeiras.", "-39038029": "Experiência de negociação", + "-601903492": "Experiência de negociação em Forex", + "-1012699451": "Experiência em negociação de CFDs", "-1894668798": "Experiência com outros instrumentos de negociação", "-1026468600": "Frequência de outros instrumentos de negociação", "-1743024217": "Selecione o idioma", @@ -2489,6 +2510,11 @@ "-536187647": "Confirmar a revogação do acesso?", "-1357606534": "Permissão", "-570222048": "Revogar acesso", + "-80717068": "Aplicações que associou à sua <0>palavra-passe Deriv:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Use a senha <0>Deriv fazer login para {{brand_website_name}} e {{platform_name_trader}}.", + "-623760979": "Utilize a <0>palavra-passe Deriv para iniciar sessão em {{brand_website_name}}, {{platform_name_trader}} e {{platform_name_go}}.", + "-459147994": "Utilize a <0>palavra-passe Deriv para iniciar sessão em {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} e {{platform_name_ctrader}}.", "-1526404112": "Conta de serviços públicos: conta de eletricidade, água, gás ou telefone fixo.", "-537552700": "Contrato de arrendamento de casa: contrato válido e atual.", "-890084320": "Salvar e enviar", @@ -2510,11 +2536,20 @@ "-362324454": "Matérias primas", "-1071336803": "Plataforma", "-820028470": "Opções e Multiplicadores", - "-1255879419": "Trader's Hub", + "-1186807402": "Transferir", + "-224804428": "Transações", + "-470018967": "Redefinir saldo", + "-693105141": "MT5 Financial", + "-1290112064": "Derivar EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Redefinir", "-213142918": "Depósitos e saques temporariamente indisponíveis ", - "-224804428": "Transações", - "-1186807402": "Transferir", "-1308346982": "Derivados", "-1145604233": "Trade CFDs no MT5 com índices derivados que simulam movimentos do mercado no mundo real.", "-328128497": "Financeira", @@ -2525,15 +2560,29 @@ "-81256466": "Você precisa de uma conta Deriv para criar uma conta CFD.", "-699372497": "Negoceie com alavancagem e spreads reduzidos para obter melhores retornos em transações bem sucedidas. <0>Saiba mais", "-1884966862": "Obtenha mais contas Deriv MT5 com diferentes tipos e jurisdições.", - "-145462920": "Deriv cTrader", "-982095728": "Obter", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Declaração de exoneração de responsabilidade da UE: Os CFD são instrumentos complexos e implicam um risco elevado de perda rápida de dinheiro devido ao efeito de alavanca. <0>73% das contas de pequenos investidores perdem dinheiro ao negociar CFDs com este fornecedor. Deve considerar se compreende o funcionamento dos CFD e se pode correr o risco elevado de perder o seu dinheiro.", "-1277942366": "Total de ativos", + "-1255879419": "Trader's Hub", "-493788773": "Fora da UE", "-673837884": "EU", "-230566990": "Os seguintes documentos que você enviou não passaram em nossas verificações:", "-846812148": "Comprovante de endereço.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Regulamentação fora da UE", "-643108528": "Regulamentação fora da UE e da UE", + "-979459594": "Buy/Sell", + "-494667560": "Pedidos", + "-679691613": "Meus anúncios", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Conta de Multiplicadores", "-744999940": "Conta Deriv", @@ -2543,9 +2592,20 @@ "-318106501": "Negoceie CFDs na MT5 com sintéticos, cestas e derivados de FX.", "-1328701106": "Negocie CFDs no MT5 com forex, ações, índices de ações, sintéticos, criptomoedas e commodities.", "-1173266642": "Esta conta oferece CFDs numa plataforma de negociação rica em funcionalidades.", - "-1290112064": "Derivar EZ", "-1453519913": "Negocie CFDs numa plataforma fácil de iniciar com todos os seus ativos favoritos.", "-2051096382": "<1>Ganhe uma variedade de pagamentos prevendo corretamente os movimentos do mercado com <0>opções ou obtenha a\n vantagem dos CFDs sem arriscar mais do que sua aposta inicial com multiplicadores.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Escolha do regulamento", "-249184528": "Você pode criar contas reais de acordo com a regulamentação da UE ou de fora da UE. Clique no <0><0/>ícone para saber mais sobre essas contas.", "-1505234170": "Visita ao Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Recarregue sua conta", "-1945421757": "Depois de criar uma conta, clique em 'Deposit' ou 'Transferir' para adicionar fundos a uma conta", "-1965920446": "Comece a negociar", - "-33612390": "<0>Declaração de exoneração de responsabilidade da UE: Os CFD são instrumentos complexos e implicam um risco elevado de perda rápida de dinheiro devido ao efeito de alavanca. <0>73% das contas de pequenos investidores perdem dinheiro ao negociar CFDs com este fornecedor. Deve considerar se compreende o funcionamento dos CFD e se pode correr o risco elevado de perder o seu dinheiro.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Esse campo é obrigatório.", "-1870909526": "Nosso servidor não pode recuperar um endereço.", "-582721696": "O valor atual de saque permitido é de {{format_min_withdraw_amount}} a {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Seu endereço de carteira {{currency_symbol}}", "-38063175": "{{account_text}} carteira", "-705272444": "Faça upload de um comprovante de identidade para verificar sua identidade", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Isso é para proteger sua conta contra saques não autorizados.", "-130833284": "Observe que seus limites máximo e mínimo de saque não são fixos. Eles mudam devido à alta volatilidade da cryptocurrency.", "-1531269493": "Enviaremos um e-mail assim que sua transação for processada.", @@ -2859,6 +2934,30 @@ "-1016171176": "Ativo", "-621128676": "Tipo de negociação", "-447853970": "Limite de perda", + "-155173714": "Vamos criar um bot!", + "-1919212468": "3. Você também pode pesquisar os blocos desejados usando a barra de pesquisa acima das categorias.", + "-1520558271": "Para mais informações, consulte este post do blogue sobre os princípios básicos da construção de um bot de negociação.", + "-980360663": "3. Escolha o bloco desejado e arraste-o para a área de trabalho.", + "-1493168314": "O que é uma estratégia rápida?", + "-1680391945": "Usando uma estratégia rápida", + "-1177914473": "Como faço para salvar minha estratégia?", + "-271986909": "No <0>Bot Builder, clique em <0>Salvar na barra de ferramentas na parte superior para baixar O seu bot. Dê um nome ao seu bot e escolha transferir para o seu dispositivo ou para o Google Drive. O seu bot será transferido como um arquivo XML.", + "-1149045595": "1. Depois de pressionar Importar, selecione Local e clique em Continuar.", + "-288041546": "2. Selecione seu arquivo XML e pressione Abrir.", + "-2127548288": "3. Seu bot será carregado adequadamente.", + "-1311297611": "1. Depois de pressionar Importar, selecione Google Drive e clique em Continuar.", + "-1549564044": "Como faço para redefinir o espaço de trabalho?", + "-1127331928": "Em Bot Builder, pressione Reset na barra de ferramentas na parte superior. Isso limpará o espaço de trabalho. Observe que todas as alterações não salvas serão perdidas.", + "-1720444288": "Como é que eu controlo as minhas perdas com o Deriv Bot?", + "-1142295124": "Existem várias maneiras de controlar suas perdas com o Deriv Bot. Aqui está um exemplo simples de como você pode implementar o controle de perdas em sua estratégia:", + "-986689483": "1. Crie as seguintes variáveis:", + "-269910127": "3. Atualize o lucro/perda atual com o lucro do último contrato. Se o último contrato foi perdido, o valor do lucro/prejuízo atual será negativo.", + "-1565344891": "Posso executar o Deriv Bot em vários separadores no meu navegador?", + "-90192474": "Sim, você pode. No entanto, há limites em sua conta, como número máximo de posições abertas e pagamentos agregados máximos em posições abertas. Portanto, lembre-se desses limites ao abrir várias posições. Você pode encontrar mais informações sobre esses limites em Configurações > Limites da conta.", + "-213872712": "Não, nós não oferecemos criptomoedas no Deriv Bot.", + "-2147346223": "Em que países está disponível o Deriv Bot?", + "-352345777": "Quais são as estratégias mais populares para negociação automatizada?", + "-552392096": "Três das estratégias mais usadas na negociação automatizada são Martingale, D'Alembert e Oscar's Grind - pode encontrá-las prontas e esperando por si na Deriv Bot.", "-507620484": "Não salvo", "-764102808": "Google Drive", "-555886064": "Ganhou", @@ -2937,30 +3036,6 @@ "-1823621139": "Estratégia rápida", "-1778025545": "Você importou um bot com sucesso.", "-1519425996": "Nenhum resultado encontrado \"{{ faq_search_value }}”", - "-155173714": "Vamos criar um bot!", - "-1919212468": "3. Você também pode pesquisar os blocos desejados usando a barra de pesquisa acima das categorias.", - "-1520558271": "Para mais informações, consulte este post do blogue sobre os princípios básicos da construção de um bot de negociação.", - "-980360663": "3. Escolha o bloco desejado e arraste-o para a área de trabalho.", - "-1493168314": "O que é uma estratégia rápida?", - "-1680391945": "Usando uma estratégia rápida", - "-1177914473": "Como faço para salvar minha estratégia?", - "-271986909": "No <0>Bot Builder, clique em <0>Salvar na barra de ferramentas na parte superior para baixar O seu bot. Dê um nome ao seu bot e escolha transferir para o seu dispositivo ou para o Google Drive. O seu bot será transferido como um arquivo XML.", - "-1149045595": "1. Depois de pressionar Importar, selecione Local e clique em Continuar.", - "-288041546": "2. Selecione seu arquivo XML e pressione Abrir.", - "-2127548288": "3. Seu bot será carregado adequadamente.", - "-1311297611": "1. Depois de pressionar Importar, selecione Google Drive e clique em Continuar.", - "-1549564044": "Como faço para redefinir o espaço de trabalho?", - "-1127331928": "Em Bot Builder, pressione Reset na barra de ferramentas na parte superior. Isso limpará o espaço de trabalho. Observe que todas as alterações não salvas serão perdidas.", - "-1720444288": "Como é que eu controlo as minhas perdas com o Deriv Bot?", - "-1142295124": "Existem várias maneiras de controlar suas perdas com o Deriv Bot. Aqui está um exemplo simples de como você pode implementar o controle de perdas em sua estratégia:", - "-986689483": "1. Crie as seguintes variáveis:", - "-269910127": "3. Atualize o lucro/perda atual com o lucro do último contrato. Se o último contrato foi perdido, o valor do lucro/prejuízo atual será negativo.", - "-1565344891": "Posso executar o Deriv Bot em vários separadores no meu navegador?", - "-90192474": "Sim, você pode. No entanto, há limites em sua conta, como número máximo de posições abertas e pagamentos agregados máximos em posições abertas. Portanto, lembre-se desses limites ao abrir várias posições. Você pode encontrar mais informações sobre esses limites em Configurações > Limites da conta.", - "-213872712": "Não, nós não oferecemos criptomoedas no Deriv Bot.", - "-2147346223": "Em que países está disponível o Deriv Bot?", - "-352345777": "Quais são as estratégias mais populares para negociação automatizada?", - "-552392096": "Três das estratégias mais usadas na negociação automatizada são Martingale, D'Alembert e Oscar's Grind - pode encontrá-las prontas e esperando por si na Deriv Bot.", "-418247251": "Descarregue o seu diário.", "-2123571162": "Descarregar", "-870004399": "<0>Comprado: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Conta desativada", "-1837059346": "Comprar/Vender", "-1845037007": "Página do anunciante", - "-494667560": "Pedidos", - "-679691613": "Meus anúncios", "-821418875": "Trader", "-679102561": "Dados do contrato", "-430118939": "Política de reclamações", @@ -3082,7 +3155,6 @@ "-430041639": "O seu comprovativo de morada não passou nos nossos controlos de verificação e colocámos algumas restrições na sua conta. Volte a enviar o seu comprovativo de morada.", "-87177461": "Aceda às definições da sua conta e preencha os seus dados pessoais para permitir depósitos.", "-904632610": "Redefina o seu saldo", - "-470018967": "Redefinir saldo", "-156611181": "Preencha a avaliação financeira nas definições da sua conta para a desbloquear.", "-1925176811": "Não é possível processar retiradas no momento", "-980696193": "As retiradas estão temporariamente indisponíveis devido à manutenção do sistema. Pode fazer retiradas quando a manutenção estiver concluída.", @@ -3107,12 +3179,12 @@ "-577279362": "Envie o seu comprovativo de identidade para verificar a sua conta e continuar a negociar.", "-197134911": "O seu comprovativo de identidade expirou", "-152823394": "O seu comprovativo de identidade expirou. Envie um novo comprovativo de identidade para verificar a sua conta e continuar a negociar.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Siga estas instruções simples para o resolver.", "-2142540205": "Parece que o endereço no seu documento não corresponde ao endereço no seu perfil da Deriv. Por favor, atualize os seus dados pessoais com o endereço correto.", "-482715448": "Aceder a Dados pessoais", "-2072411961": "O seu comprovativo de morada foi verificado", "-384887227": "Atualize o endereço no seu perfil.", - "-448961363": "não pertencente à União Europeia", "-1998049070": "Se concordar com a nossa utilização de cookies, clique em Aceitar. Para mais informações, <0>consulte a nossa política.", "-402093392": "Adicionar conta Deriv", "-1721181859": "É necessária uma conta {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Ecrã inteiro", "-1823504435": "Exibir notificações", "-1954045170": "Nenhuma moeda atribuída", - "-583559763": "Menu", "-1591792668": "Limites da conta", "-34495732": "Informações regulamentares", "-1496158755": "Aceder a Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "A Comissão Financeira aceita recursos durante 45 dias a contar da data do incidente e apenas após o trader ter tentado resolver o problema diretamente com a empresa.", "-1825471709": "Uma experiência de negociação totalmente nova numa plataforma poderosa e fácil de utilizar.", "-981017278": "Negociação automatizada na ponta dos dedos. Não é necessário codificar.", + "-583559763": "Menu", "-778309978": "O link em que você clicou expirou. Certifique-se de clicar no link do e-mail mais recente em sua caixa de entrada. Como alternativa, insira seu e-mail abaixo e clique em <0>Reenviar e-mail para obter um novo link.", "-336222114": "Siga estes passos simples para o resolver:", "-1064116456": "Procurar o corretor <0>Deriv Holdings (Guernsey) Limited e seleccioná-lo.", @@ -3415,22 +3487,6 @@ "-1282933308": "Não {{barrier}}", "-968190634": "Igual a {{barrier}}", "-1747377543": "Abaixo de {{barrier}}", - "-256210543": "De momento, a negociação não está disponível.", - "-1150099396": "Estamos trabalhando para disponibilizá-lo para você em breve. Se você tiver outra conta, mude para essa conta para continuar negociando. Você pode adicionar um Deriv MT5 Financial.", - "-28115241": "{{platform_name_trader}} não está disponível para esta conta", - "-453920758": "Vá para o painel {{platform_name_mt5}}", - "-402175529": "Histórico", - "-902712434": "Cancelamento da transação", - "-988484646": "Cancelamento da transação (executado)", - "-444882676": "Cancelamento da transação (ativo)", - "-13423018": "ID de referência", - "-2035315547": "Baixa barreira", - "-1551639437": "Sem histórico", - "-1214703885": "Ainda não atualizou o take profit ou o stop loss", - "-504849554": "Reabrirá em", - "-59803288": "Entretanto, experimente os nossos índices sintéticos. Estes simulam a volatilidade do mercado real e estão abertos 24 horas por dia, 7 dias por semana.", - "-1278109940": "Veja mercados abertos", - "-694105443": "Este mercado está fechado", "-1043795232": "Posições recentes", "-1511825574": "Lucro/perda:", "-726626679": "Lucro/perda potencial:", @@ -3455,21 +3511,15 @@ "-1435392215": "Sobre o cancelamento da transação", "-2017825013": "Entendi", "-1192773792": "Não mostre isso novamente", + "-902712434": "Cancelamento da transação", "-1280319153": "Cancele a sua negociação a qualquer momento dentro de um prazo escolhido. Acionada automaticamente se a sua negociação atingir o nível de stop out no prazo escolhido.", "-471757681": "Gestão do risco", "-843831637": "Stop loss", "-771725194": "Cancelamento da transação", "-338707425": "A duração mínima é de 1 dia", "-1003473648": "Duração: {{duration}} dia", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "O pagamento no vencimento é igual ao pagamento por ponto multiplicado pela diferença entre o preço final e o preço de exercício.", "-1527492178": "Compra bloqueada", "-725375562": "Pode bloquear/desbloquear o botão de compra no menu Definições", - "-774638412": "A aposta deve situar-se entre {{min_stake}} {{currency}} e {{max_stake}} {{currency}}", - "-1358367903": "Entrada", - "-434270664": "Preço atual", - "-1956787775": "Preço de Barreira:", - "-1513281069": "Barreira 2", "-390994177": "Deve estar entre {{min}} e {{max}}", "-1804019534": "Prazo de validade: {{date}}", "-2055106024": "Alternar entre definições de duração avançadas e simples", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "acima", "-857660728": "Preços de Exercício", + "-1358367903": "Entrada", "-1386326276": "A Barreira é um campo obrigatório.", "-1418742026": "A barreira superior deve ser superior à barreira inferior.", "-92007689": "A barreira inferior deve ser menor que a barreira superior.", @@ -3491,6 +3542,21 @@ "-1975910372": "O minuto deve estar entre 0 e 59.", "-866277689": "O horário de expiração não pode estar no passado.", "-1455298001": "Agora", + "-256210543": "De momento, a negociação não está disponível.", + "-1150099396": "Estamos trabalhando para disponibilizá-lo para você em breve. Se você tiver outra conta, mude para essa conta para continuar negociando. Você pode adicionar um Deriv MT5 Financial.", + "-28115241": "{{platform_name_trader}} não está disponível para esta conta", + "-453920758": "Vá para o painel {{platform_name_mt5}}", + "-402175529": "Histórico", + "-988484646": "Cancelamento da transação (executado)", + "-444882676": "Cancelamento da transação (ativo)", + "-13423018": "ID de referência", + "-2035315547": "Baixa barreira", + "-1551639437": "Sem histórico", + "-1214703885": "Ainda não atualizou o take profit ou o stop loss", + "-504849554": "Reabrirá em", + "-59803288": "Entretanto, experimente os nossos índices sintéticos. Estes simulam a volatilidade do mercado real e estão abertos 24 horas por dia, 7 dias por semana.", + "-1278109940": "Veja mercados abertos", + "-694105443": "Este mercado está fechado", "-439389714": "Estamos a trabalhar nisso", "-770929448": "Aceder a {{platform_name_smarttrader}}", "-347156282": "Enviar Comprovativo", @@ -3537,6 +3603,8 @@ "-454245976": "Se você acha que o preço de mercado cairá continuamente por um período específico, escolha <0>Curto. Você receberá um pagamento no prazo de validade se o preço de mercado não tocar ou ultrapassar a barreira. Seu pagamento aumentará proporcionalmente à distância entre o preço de mercado e a barreira se a barreira não for violada. Você começará a lucrar quando o pagamento for maior do que sua aposta. Se o preço de mercado ultrapassar a barreira, não haverá pagamento.", "-351875097": "Número de ticks", "-729830082": "Exibir menos", + "-1669741470": "O pagamento no vencimento é igual ao pagamento por ponto multiplicado pela diferença entre o preço final e o preço de exercício.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "NOVO!", "-993480898": "Acumuladores", "-45873457": "NOVO", @@ -3557,6 +3625,10 @@ "-690963898": "O seu contrato será encerrado automaticamente quando o seu pagamento atingir esse valor.", "-511541916": "O seu contrato será automaticamente encerrado ao atingir esse número de ticks.", "-438655760": "<0>Nota: Pode fechar a sua transação em qualquer altura. Esteja ciente do risco de derrapagem.", + "-774638412": "A aposta deve situar-se entre {{min_stake}} {{currency}} e {{max_stake}} {{currency}}", + "-434270664": "Preço atual", + "-1956787775": "Preço de Barreira:", + "-1513281069": "Barreira 2", "-1683683754": "Longo", "-1046859144": "<0>{{title}} Você receberá um pagamento se o preço de mercado permanecer igual a {{price_position}} e não tocar ou cruzar a barreira. Caso contrário, seu pagamento será zero.", "-1815023694": "acima da barreira", diff --git a/packages/translations/src/translations/ru.json b/packages/translations/src/translations/ru.json index 21edf40270f5..c2de8d6569e3 100644 --- a/packages/translations/src/translations/ru.json +++ b/packages/translations/src/translations/ru.json @@ -24,7 +24,6 @@ "27731356": "Ваш счет временно отключен. Свяжитесь с нами через <0>чат, чтобы активировать пополнение и вывод средств.", "27830635": "Deriv (V) Ltd", "28581045": "Добавить реальный счет MT5", - "30801950": "Ваш счет будет открыт в компании {{legal_entity_name}}, компания регулируется мальтийским управлением по азартным играм и подчиняется законодательству Мальты.", "33433576": "Используйте электронный кошелек для вывода средств.", "35089987": "Загрузите лицевую и оборотную сторону водительских прав.", "41737927": "Спасибо", @@ -60,11 +59,13 @@ "72500774": "Укажите налоговое резидентство.", "73086872": "Вы отказались от торговли", "73326375": "Минимум ‒ это самая низкая отметка, к которой опустилась цена за период действия контракта.", + "74836780": "{{currency_code}} Wallet", "74963864": "Ниже", "76916358": "Вы достигли лимита на вывод.<0/>Загрузите документ, подтверждающий личность и адрес, чтобы снять лимит и продолжить вывод средств.", "76925355": "Проверьте производительность вашего бота", "77945356": "Приложение для мобильного трейдинга.", "77982950": "Ванильные опционы позволяют прогнозировать восходящее (бычье) или нисходящее (медвежье) направление движения базового актива через покупку опциона \"колл\" или \"пут\".", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Мы не смогли найти эту страницу", "82839270": "Загрузите страницу паспорта с фотографией.", "83202647": "Свернуть блок", @@ -76,6 +77,7 @@ "90266322": "2. Начните чат с вашим только что созданным ботом Telegram и обязательно отправьте ему несколько сообщений, прежде чем переходить к следующему шагу. (например, Привет Бот!)", "91993812": "Стратегия Мартингейл - это классическая торговая техника, разработанная французским математиком Полем Пьером Леви в 18 веке, которая активно используется на протяжении более ста лет.", "93154671": "1. Нажмите Сбросить в нижней части панели статистики.", + "93939827": "Cryptocurrency accounts", "96381225": "Не удалось подтвердить личность", "98473502": "Мы не обязаны проводить тест на проверку соответствия и предоставлять вам какие-либо предупреждения о возможном риске.", "98972777": "случайный элемент", @@ -83,6 +85,7 @@ "102226908": "Поле не может быть пустым", "108916570": "Длительность: {{duration}} дн.", "109073671": "Используйте тот же электронный кошелек, который использовали для пополнения счета. Убедитесь, что электронный кошелек поддерживает вывод средств. Список поддерживаемых электронных кошельков можно найти <0>здесь.", + "110822969": "One Wallet for all your transactions", "111215238": "Отойдите от прямого света", "111718006": "Дата окончания", "111931529": "Макс. общая ставка за 7 дней", @@ -215,7 +218,9 @@ "251882697": "Спасибо! Мы зафиксировали ваш ответ.<0/><0/> Нажмите ОК, чтобы продолжить.", "254912581": "Этот блок дает вам линию EMA, построенную на основе выбранного периода и списка значений.", "256031314": "Сделка за наличный расчёт", + "256123827": "What happens to my trading accounts", "256602726": "Если вы закроете счет:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Торговая оценка", "260069181": "Возникла ошибка при загрузке URL", @@ -250,8 +255,8 @@ "284527272": "антимода", "284772879": "Контракт", "284809500": "Финансовый демо", + "285909860": "Demo {{currency}} Wallet", "287934290": "Вы уверены, что хотите отменить эту транзакцию?", - "289898640": "УСЛОВИЯ ИСПОЛЬЗОВАНИЯ", "291744889": "<0>1. Параметры контракта:<0>", "291817757": "Посетите сообщество Deriv и узнайте об API, токенах API, способах использования API Deriv и многом другом.", "292491635": "Если вы выберете «Стоп лосс» и зададите сумму, ограничивающую ваш убыток, позиция будет закрыта автоматически, если убыток больше или равен этой сумме. Ваш убыток может оказаться больше, чем сумма, которую вы ввели, в зависимости от рыночной цены при закрытии.", @@ -299,7 +304,8 @@ "344418897": "Эти торговые лимиты и самоисключение помогают вам контролировать количество денег и времени, которые вы тратите на {{brand_website_name}}, и практиковать <0>ответственную торговлю.", "345320063": "Неверная временная метка", "345818851": "Извините, произошла внутренняя ошибка. Нажмите флажок выше, чтобы повторить попытку.", - "347029309": "Forex: стандартные/микро", + "346214602": "A better way to manage your funds", + "347029309": "Форекс: стандартные/микро", "347039138": "Повторить (2)", "347217485": "Проблемы с доступом к Deriv MT5 с мобильного телефона?", "348951052": "Ваша касса заблокирована", @@ -353,6 +359,7 @@ "401345454": "Для этого перейдите на вкладку «Учебные пособия».", "402343402": "Из-за неполадок на нашем сервере некоторые из ваших счетов {{platform}} в настоящее время недоступны. Мы работаем над устранением проблемы. Приносим извинения и благодарим за понимание.", "403456289": "Формула SMA:", + "403608958": "Select a trading account or a Wallet", "404743411": "Общая сумма пополнения", "406359555": "Детали контракта", "406497323": "Продайте свой открытый контракт, если необходимо (опционально)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Предпочтительный интервал времени между отчетами:", "431267979": "Вот краткое руководство по использованию Deriv Bot.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Тейк профит: {{ currency }} {{ take_profit }}", "432519573": "Документ загружен", @@ -412,7 +420,7 @@ "465993338": "Оскар Грайнд", "466369320": "Ваша валовая прибыль - это процентное изменение рыночной цены, умноженное на вашу ставку и выбранный мультипликатор.", "466837068": "Да, увеличить лимиты", - "467839232": "Я регулярно торгую CFD на forex и другими сложными финансовыми инструментами на других платформах.", + "467839232": "Я регулярно торгую CFD на форекс и другими сложными финансовыми инструментами на других платформах.", "473154195": "Настройки", "474306498": "Жаль, что вы уходите. Ваш счет закрыт.", "475492878": "Попробуйте Синтетические индексы", @@ -453,12 +461,12 @@ "518955798": "7. Запустить один раз в начале", "520136698": "Индекс Boom 500", "521872670": "описание", - "522283618": "Опыт торговли цифровыми опционами", "522703281": "делится на", "523123321": "- 10 к степени заданного числа", "524459540": "Как создавать переменные?", "527329988": "Это один из 100 наиболее распространенных паролей.", "529056539": "Опционы", + "530864956": "Deriv Apps", "530953413": "Авторизованные приложения", "531114081": "3. Тип контракта", "531675669": "Евро", @@ -470,13 +478,16 @@ "542038694": "Для {{label}} разрешены только буквы, цифры, пробел, нижнее подчёркивание, и дефис.", "542305026": "Вам также необходимо предоставить подтверждение личности.", "543413346": "У вас нет открытых позиций по этому активу. Чтобы просмотреть другие открытые вакансии, нажмите Перейти к отчетам.", - "543915570": "Forex, акции, криптовалюты, фондовые и синтетические индексы", + "543915570": "Форекс, акции, криптовалюты, фондовые и синтетические индексы", "545476424": "Общая сумма вывода", "549479175": "Мультипликаторы Deriv", + "549799607": "Go to LiveChat", "550589723": "Ваша ставка будет расти на {{growth_rate}}% за тик до тех пор, пока текущая спот-цена остается в пределах ±{{{tick_size_barrier}} от предыдущей спот-цены.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "Узнайте больше о торговых лимитах", "554135844": "Изменить", "554410233": "Это один из 10 наиболее распространенных паролей.", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "После определения торговых параметров и опций, вы можете проинструктировать своего бота покупать контракты при соблюдении определенных условий. Используйте условные блоки и блоки индикаторов, чтобы помочь вашему боту принимать решения.", "555881991": "Квитанция с национальным идентификационным номером", "556264438": "Врем. интервал", @@ -552,6 +563,7 @@ "629395043": "Все темпы роста", "632398049": "Этот блок присваивает нулевое значение элементу или инструкции.", "634219491": "Вы не указали свой идентификационный номер налогоплательщика. Эта информация необходима для соблюдения правовых и нормативных требований. Перейдите в <0>личные данные в настройках счета и введите свой актуальный идентификационный номер налогоплательщика.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.Если не удастся найти возможность урегулировать спор, DRC перейдет к этапу определения.", "639382772": "Пожалуйста, загрузите файл в поддерживаемом формате.", "640596349": "У вас пока нет уведомлений", @@ -562,7 +574,6 @@ "642546661": "Загрузите оборотную сторону прав со своего компьютера", "642995056": "Email", "644150241": "Количество успешных контрактов с момента последней очистки статистики.", - "645016681": "Частота торговли другими финансовыми инструментами", "645902266": "EUR/NZD", "647039329": "Необходимо подтверждение адреса", "647745382": "Список ввода {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "В приведенном ниже примере выбирается цена открытия, которая затем присваивается переменной с именем \"цо\".", "666724936": "Введите действующий ID.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Юрисдикция и законодательство", "674973192": "Используйте этот пароль для входа на счета Deriv MT5 с браузеров, настольных и мобильных приложений.", "676159329": "Не удалось переключиться на счет по умолчанию.", @@ -613,6 +625,7 @@ "692354762": "Введите {{document_name}}. {{example_format}}", "693396140": "Отмена сделки (истекла)", "694035561": "Торговать мультипликаторами опционов", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Время открытия: отметка времени открытия", "697630556": "В настоящее время этот рынок закрыт.", "698037001": "Национальный идентификационный номер", @@ -624,8 +637,8 @@ "701647434": "Искать строку", "702451070": "Национальное удостоверение личности (без фото)", "702561961": "Сменить тему", + "705262734": "Your Wallets are ready", "705299518": "Затем загрузите страницу паспорта с фотографией.", - "706413212": "Чтобы получить доступ к кассе, теперь вы находитесь на счете {{regulation}} {{currency}} ({{loginid}}).", "706727320": "Частота торговли бинарными опционами", "706755289": "Этот блок выполняет тригонометрические функции.", "706960383": "Мы предложим купить ваш контракт по этой цене, если вы решите продать его до истечения срока действия. Это зависит от нескольких факторов, таких как текущая спот-цена, продолжительность и т. д. Мы не сможем выкупить контракт, если оставшаяся продолжительность меньше 60 секунд.", @@ -644,6 +657,7 @@ "720293140": "Выход", "720519019": "Сбросить пароль", "721011817": "- Поднять первое число до степени второго числа", + "722797282": "EU-regulated USD accounts", "723045653": "Используйте этот адрес электронной почты для входа на Deriv.", "723961296": "Управление паролем", "724203548": "Вы можете отправить жалобу на платформу <0>онлайн-урегулирования споров (ODR) Европейской Комиссии. Это не относится к клиентам из Великобритании.", @@ -656,7 +670,8 @@ "734390964": "Недостаточно средств на счете", "734881840": "неверно", "742469109": "Сбросить баланс", - "742676532": "Торгуйте CFD с высоким кредитным плечом на forex, индексах Derived, криптовалютах и сырьевых товарах.", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", + "742676532": "Торгуйте CFD с высоким кредитным плечом на форекс, индексах Derived, криптовалютах и сырьевых товарах.", "743623600": "Номер", "744110277": "Массив полос Боллинджера (BBA)", "745656178": "Используйте этот блок, чтобы продать контракт по рыночной цене.", @@ -689,6 +704,7 @@ "775706054": "Вы продаете торговых ботов?", "776085955": "Стратегии", "781924436": "Колл спред/Пут спред", + "782563319": "Add more Wallets", "783974693": "Избегайте недавних дат", "784311461": "Экспоненциальная скользящая средняя (EMA)", "784583814": "Подключено к вашему компьютеру", @@ -725,6 +741,7 @@ "818447476": "Переключить счет?", "820877027": "Пожалуйста, предоставьте удостоверение личности", "821163626": "Техническое обслуживание сервера проводится каждую первую субботу месяца с 7 до 10 часов по Гринвичу. В это время работа сервиса может прерываться.", + "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": "Блок, который может содержать текст.", "824797920": "Список пуст?", "825042307": "Давайте попробуем еще раз", @@ -747,7 +764,6 @@ "836097457": "Я интересуюсь торговлей, но у меня очень мало опыта.", "837063385": "Не отправляйте на этот адрес другие валюты.", "837066896": "Ваши документы проходят проверку. Пожалуйста, подождите от 1 до 3 дней.", - "839618971": "АДРЕС", "839805709": "Нам нужно фото более высокого качества, чтобы верифицировать вас", "840672750": "Если это не сработает, удалите и заново установите приложение МТ5. Затем повторно выполните шаги <0>2 и <0>3.", "841434703": "Отключить стек", @@ -844,9 +860,9 @@ "943535887": "Пожалуйста, закройте позиции на следующих счетах Deriv MT5:", "944499219": "Макс. число открытых позиций", "945532698": "Контракт продан", + "945753712": "Back to Trader’s Hub", "946204249": "Чтение", "946841802": "Белая (или зеленая) свеча означает, что цена открытия ниже, чем цена закрытия. Это указывает на восходящее движение рыночной цены.", - "946944859": "Нажмите кнопку ниже, и мы отправим вам электронное письмо со ссылкой. Кликните эту ссылку, чтобы подтвердить свой запрос на вывод средств.", "947046137": "Ваш вывод будет обработан в течение 24 часов.", "947363256": "Создать список", "947758334": "Необходимо указать город", @@ -950,6 +966,7 @@ "1050128247": "Я подтверждаю, что информация о переводе платежного агента указана точно.", "1050844889": "Отчеты", "1052779010": "Вы находитесь на демо-счете", + "1052921318": "{{currency}} Wallet", "1053153674": "Индекс Jump 50", "1053159279": "Уровень образования", "1053556481": "Как только вы подадите жалобу, мы отправим вам электронное письмо с подтверждением ее получения.", @@ -1010,6 +1027,7 @@ "1110102997": "История счёта", "1112582372": "Интервал длительности", "1113119682": "Этот блок отображает значение выбранной свечи из списка свечей.", + "1113221217": "MT5 Swap-free", "1113292761": "Менее 8MB", "1114679006": "Вы успешно создали бота с простой стратегией.", "1117281935": "Условия продажи (опционально)", @@ -1034,8 +1052,9 @@ "1130791706": "Нет", "1133651559": "Чат", "1134879544": "Пример документа с бликами", - "1138126442": "Forex: стандартные", + "1138126442": "Форекс: стандартные", "1139483178": "Включить стек", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Направление - {{ direction_type }}", "1144028300": "Массив индексов относительной силы (RSIA)", "1145927365": "Запустить блоки, находящиеся внутри, через указанное количество секунд", @@ -1066,7 +1085,6 @@ "1174689133": "3. Установите параметры контракта и нажмите Запустить.", "1174748431": "Платежный канал", "1175183064": "Вануату", - "1176926166": "Опыт торговли другими финансовыми инструментами", "1177396776": "Если вы выбираете \"Азиатские – Падение\", вы выигрываете, если последняя котировка окажется ниже, чем общее среднее значение котировок.", "1177723589": "Нет транзакций для отображения", "1178582280": "Количество убыточных контрактов с момента последней очистки статистики.", @@ -1077,6 +1095,7 @@ "1181396316": "Этот блок отображает случайное число из заданного диапазона", "1181770592": "Прибыль/убыток от продажи", "1183007646": "- Тип контракта: название типа контракта, например, Повышение, Падение, Касание, Нет касания и т. д.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Закройте контракт сейчас или продолжайте его действие. Если вы решите оставить его включенным, вы можете проверить и закрыть его позже на ", "1188316409": "Чтобы получить средства, свяжитесь с платежным агентом, указав данные ниже", "1188980408": "5 минут", @@ -1094,12 +1113,14 @@ "1201773643": "числовой", "1203297580": "Этот блок отправляет сообщение в Telegram-канал.", "1204223111": "В этом примере цены открытия из списка свечей присваиваются переменной с именем \"candle_list\".", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Как скрыть карту?", "1206821331": "Вооруженные силы", "1207152000": "Выберите шаблон и задайте параметры контракта.", "1208714859": "Короткая позиция:", "1208729868": "Тики", "1208903663": "Неверный ключ", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Бот запускается", "1214893428": "В данный момент открытие счета с мобильных устройств недоступно. Чтобы открыть новый счет, пожалуйста, войдите в систему с компьютера.", "1216408337": "Частный предприниматель", @@ -1112,6 +1133,7 @@ "1222521778": "Сложно пополнять счет и выводить средства.", "1222544232": "Мы отправили вам электронное письмо", "1225150022": "Кол-во активов", + "1226027513": "Transfer from", "1227074958": "случайная дробь", "1227240509": "Убрать пробелы", "1228534821": "Некоторые валюты могут не поддерживаться платежными агентами в вашей стране.", @@ -1121,6 +1143,7 @@ "1232291311": "Осталось до лимита", "1232353969": "0-5 транзакций за последние 12 месяцев", "1233300532": "Выплата", + "1233376285": "Options & multipliers", "1234292259": "Источник доходов", "1234764730": "Загрузите скриншот своего имени и адреса электронной почты из раздела личных данных.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Сортирует элементы в заданном списке по их числовому или алфавитному значению в порядке возрастания или убывания.", "1281290230": "Выбрать", "1282951921": "Только вниз", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Если выбран «Убыток», он вернет «Верно», если ваш последний контракт был неудачным. В противном случае он вернет пустую строку.", "1286094280": "Вывод", "1286507651": "Закройте экран подтверждения личности", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Маржин колл", "1290525720": "Пример: ", - "1291887623": "Частота торговли цифровыми опционами", "1291997417": "Срок действия контрактов истекает ровно в 23:59:59 GMT в выбранную дату истечения.", "1292188546": "Сбросить инвесторский пароль Deriv MT5", "1292891860": "Уведомить в Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Продать)", "1329136554": "Индекс Jump 200", "1329325646": "Содержимое этого блока вызывается на каждом тике", + "1330479159": "Ready to upgrade?", "1331199417": "Пожалуйста, введите правильный формат. ", "1331367811": "Номер счета клиента", "1332168410": "Подробнее", @@ -1257,7 +1281,6 @@ "1367023655": "Чтобы ваши потери не превышали размер ставки, контракт будет автоматически закрыт, если потери станут равны <0/>.", "1367488817": "4. Перезапустить торговые условия", "1367990698": "Индекс волатильн. 10", - "1369709538": "Наши условия использования", "1370647009": "Доступно повышение лимитов", "1371193412": "Отменить", "1371555192": "Выберите платежного агента и введите сумму вывода. Если вашего платежного агента нет в списке, <0>найдите его по номеру счета.", @@ -1319,6 +1342,7 @@ "1434767075": "Начните работу с Deriv Bot", "1434976996": "Оповещение", "1435363248": "Этот блок преобразует количество секунд с начала эпохи Unix в формат даты и времени, например 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Мин. депозит", "1437396005": "Добавить комментарий", "1438247001": "По ряду причин профессиональный клиент получает более низкий уровень клиентской защиты.", @@ -1369,6 +1393,7 @@ "1476301886": "Как и SMA, этот блок дает вам линию SMA, содержащую список всех значений за данный период.", "1478030986": "Создание или удаление токенов API для трейдинга и вывода средств", "1480915523": "Пропустить", + "1481860194": "Your new Wallet(s)", "1481977420": "Помогите нам верифицировать ваш запрос на вывод средств.", "1483470662": "Нажмите «Открыть», чтобы начать торговать", "1484336612": "Этот блок используется для завершения или продолжения цикла и может быть размещен в любом месте блока цикла.", @@ -1389,6 +1414,7 @@ "1505420815": "Платежные агенты по вашему запросу не найдены", "1505898522": "Загрузить стек", "1505927599": "Наши серверы столкнулись с проблемой. Давайте обновимся и продолжим.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Купить)", "1509678193": "Образование", @@ -1419,7 +1445,7 @@ "1542742708": "Синтетические активы, форекс, акции, фондовые индексы, сырьевые товары и криптовалюты", "1544642951": "Выбрав \"Только вверх\", вы получите выплату, если несколько тиков подряд будут расти по отношению к котировке на входе. Если любой тик покажет снижение или будет равен одному из предыдущих тиков, вы не получите выплату.", "1547148381": "Файл слишком большой (разрешено не более 8 МБ). Попробуйте другой файл.", - "1548765374": "Не удалось верифицировать номер документа", + "1548765374": "Verification of document number failed", "1549098835": "Общая сумма вывода", "1551172020": "Индекс AUD", "1552162519": "Смотреть адаптацию", @@ -1449,6 +1475,7 @@ "1577480486": "Срок действия вашей мобильной ссылки истечет через час.", "1577527507": "Необходимо указать причину открытия счета.", "1577612026": "Выберите папку", + "1577879664": "<0>Your Wallets are ready", "1579839386": "Appstore", "1580498808": "Найдено несколько лиц.", "1584109614": "Строка тиков Список", @@ -1502,9 +1529,11 @@ "1644703962": "Ищете счета CFD? Перейти в Trader's Hub", "1644864436": "Прежде чем подать заявку на статус профессионального клиента, необходимо аутентифицировать счет. <0>Аутентифицируйте счет", "1644908559": "Требуется цифровой код.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Бот обнаружил ошибку во время работы.", "1648938920": "Netherlands 25", "1649239667": "2. Блоки в меню блоков сгруппированы по категориям. Выберите нужный блок и перетащите его на рабочее пространство.", + "1650963565": "Introducing Wallets", "1651513020": "Показать оставшееся время для каждого интервала", "1651951220": "Повторения типа \"abcabcabc\" угадать немногим сложнее, чем \"abc\"", "1652366857": "получить и удалить", @@ -1522,15 +1551,15 @@ "1665272539": "Помните: вы не сможете войти на свой счет до выбранной даты.", "1665738338": "Баланс", "1665756261": "Перейти в чат", + "1666783057": "Upgrade now", "1668138872": "Изменить настройки счета", "1670016002": "Мультипликатор: {{ multiplier }}", "1670426231": "Время окончания", "1671232191": "Вы установили следующие лимиты:", "1674163852": "Можно определить срок действия контракта, установив продолжительность или время окончания.", "1675030608": "Чтобы открыть этот счет, нужно повторно отправить подтверждение адреса.", - "1675289747": "Перешли на реальный счет", "1676549796": "Динамическое кред. плечо", - "1677027187": "Forex", + "1677027187": "Форекс", "1677990284": "Мои приложения", "1679743486": "1. Перейдите в меню Быстрая стратегия и выберите нужную стратегию.", "1680666439": "Загрузите банковскую выписку с указанием вашего имени, номера счета и истории транзакций.", @@ -1556,6 +1585,7 @@ "1703091957": "Мы обязаны собирать информацию о вашей занятости в рамках законодательства по борьбе с отмыванием денег.", "1704656659": "Какой у вас опыт торговли CFD?", "1708413635": "Для вашего счета в {{currency_name}} ({{currency}})", + "1709293836": "Wallet balance", "1709401095": "Торгуйте CFD на Deriv X на финансовых рынках и наших индексах Derived.", "1709859601": "Время выходной котировки", "1710662619": "Если у вас есть приложение, запустите его и начните торговать.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "За переводы между вашими фиатными и криптовалютными счетами Deriv мы взимаем комиссию в размере 2% или {{minimum_fee}} {{currency}}, в зависимости от того, какая сумма больше.", "1720968545": "Загрузите страницу паспорта с фото со своего компьютера", + "1723069433": "Your new Wallet", "1723589564": "Представляет собой максимальное количество открытых контрактов в вашем портфеле. Каждая строка в портфеле отображает открытую позицию. Когда вы достигнете лимита, вы не сможете открывать новые контракты, пока не закроете текущие.", "1724696797": "Вы можете открыть только один фиатный счет.", "1725958461": "Номер счета", @@ -1698,6 +1729,7 @@ "1842266423": "оборотная сторона", "1842862156": "Добро пожаловать на панель управления Deriv X", "1843658716": "Выбрав \"Только вниз\", вы получите выплату, если несколько тиков подряд будут снижаться по отношению к котировке на входе. Если один из тиков покажет рост или будет равен одному из предыдущих тиков, вы не получите выплату.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(мин: {{min_stake}} - макс: {{max_payout}})", "1846266243": "Эта функция недоступна на демо-счетах.", "1846587187": "Вы не выбрали страну проживания", @@ -1718,7 +1750,7 @@ "1858251701": "минут(ы)", "1859308030": "Оставить отзыв", "1863053247": "Загрузите документ, удостоверяющий личность.", - "1863694618": "Торгуйте CFD на MT5 на forex, акциях, фондовых индексах, сырьевых товарах и криптовалютах.", + "1863694618": "Торгуйте CFD на MT5 на форекс, акциях, фондовых индексах, сырьевых товарах и криптовалютах.", "1863731653": "Чтобы получить средства, свяжитесь с платежным агентом", "1865525612": "Недавних транзакций нет.", "1866811212": "Пополняйте счет в местной валюте через авторизованного независимого платежного агента в вашей стране.", @@ -1792,7 +1824,6 @@ "1924765698": "Место рождения*", "1926987784": "- iOS: Проведите пальцем влево на счете и нажмите <0>Удалить.", "1928930389": "GBP/NOK", - "1929309951": "Статус занятости", "1929694162": "Сравнить счета", "1930899934": "Tether", "1931659123": "Запускать на каждый тик", @@ -1807,6 +1838,7 @@ "1943440862": "Рассчитывает список Полос Боллинджера (ПБ) из списка с периодом", "1944204227": "Этот блок возвращает текущий баланс счета.", "1947527527": "1. Эта ссылка была отправлена вами", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Вот возможные причины:", "1950413928": "Отправить удостоверение личности", @@ -1875,6 +1907,7 @@ "2014536501": "Номер карты", "2014590669": "Отсутствует значение переменной '{{variable_name}}'. Пожалуйста, установите значение переменной '{{variable_name}}' для уведомления.", "2017672013": "Выберите страну выдачи документа.", + "2020104747": "Filter", "2020545256": "Закрыть ваш счет?", "2021037737": "Чтобы продолжить, пожалуйста, обновите данные.", "2021161151": "Посмотрите это видео, чтобы узнать, как построить торгового бота на Deriv Bot. Также ознакомьтесь с этой статьей о создании торгового бота.", @@ -1885,7 +1918,6 @@ "2027696535": "Налоговая информация", "2028163119": "EOS/USD", "2029237955": "Лабуан", - "2029641956": "Сравнение счетов CFD", "2030018735": "RSI - это инструмент технического анализа, который помогает вам определить рыночный тренд. Значения индикатора находятся в диапазоне от 0 до 100. Значение RSI 70 и выше означает, что актив перекуплен, и текущая тенденция может измениться, а значение 30 и ниже означает, что актив перепродан.", "2030045667": "Сообщение", "2033648953": "Этот блок отображает значение указанной свечи для выбранного \nвременного интервала.", @@ -1919,6 +1951,7 @@ "2063812316": "Текстовая Инструкция", "2063890788": "Отменено", "2065278286": "Спред", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Водительские права", "2070002739": "Не принимать", "2070345146": "При открытии контракта CFD с кредитным плечом.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Подача жалобы", "2080553498": "3. Получите ID чата, используя REST API Telegram (подробнее: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Продано за: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Да, удалить", "2084693624": "Преобразует строку, представляющую строку даты/времени, в секунды с начала \nэпохи Unix. Пример: 2019-01-01 21:03:45 GMT +0800 будет преобразовано в 1546347825. Время и часовой пояс не являются обязательными.", "2085387371": "Допускаются цифры, буквы и специальные символы . , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "Проигрыш", "2117165122": "1. Создайте бота Telegram и получите свой токен Telegram API. Узнайте больше о том, как создавать ботов в Telegram здесь: https://core.telegram.org/bots#6-botfather", "2117489390": "Автоматическое обновление через {{ remaining }} сек.", - "2118315870": "Где вы живете?", "2119449126": "Ниже приведен пример двух вариантов вывода данных:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1975,7 +2008,7 @@ "2131963005": "Пожалуйста, выведите средства со следующих счетов Deriv MT5:", "2133451414": "Длительность", "2133470627": "Этот блок возвращает потенциальную выплату для выбранного типа контракта. Этот блок можно использовать только в корневом блоке \"Условия покупки\".", - "2135563258": "Частота торговли на Forex", + "2135563258": "Частота торговли на Форекс", "2136246996": "Селфи загружено.", "2137901996": "Это очистит все данные в сводке, транзакциях и журнале. Все счетчики будут сброшены на ноль.", "2137993569": "Этот блок сравнивает два значения и используется для построения условной структуры.", @@ -1992,8 +2025,6 @@ "2146698770": "Совет: вы можете нажать и перетащить нужный блок", "2146892766": "Опыт торговли бинарными опционами", "2147244655": "Как импортировать своего бота в Deriv Bot?", - "-1232613003": "<0>Ошибка верификации. <1>Причины", - "-2029508615": "<0>Нужна верификация.<1>Пройти", "-931052769": "Отправить подтверждение", "-1004605898": "Советы", "-1938142055": "Документы загружены.", @@ -2141,18 +2172,9 @@ "-179726573": "Мы получили ваше подтверждение права собственности.", "-813779897": "Подтверждение права собственности пройдено.", "-638756912": "Зачеркните/закройте с 7-й по 12-ю цифры номера вашей дебетовой/кредитной карты.", - "-2073934245": "Финансовые услуги, предоставляемые на этом сайте, подходят только для клиентов, готовых нести ответственность за возможную потерю всех инвестированных средств, а также осознающих все риски и имеющих опыт покупки финансовых контрактов. Заключение сделок на финансовых контрактах предполагает высокий уровень риска. Если приобретённые контракты истекут, не принеся прибыли, вы потеряете всю инвестированную сумму.", - "-1166068675": "Ваш счет будет открыт в {{legal_entity_name}}. Компания регулируется комиссией по азартным играм Великобритании (UKGC) и подчиняется законам острова Мэн.", - "-975118358": "Ваш счет будет открыт в {{legal_entity_name}}. Компания регулируется мальтийским управлением финансовых услуг (MFSA) и подчиняется законодательству Мальты.", - "-680528873": "Ваш счет будет открыт в компании {{legal_entity_name}} и будет регулироваться законами Самоа.", - "-1125193491": "Добавить счёт", - "-2068229627": "Я не являюсь ПЗЛ и не являлся ПЗЛ в течение последних 12 месяцев.", "-684271315": "OK", "-740157281": "Оценка торгового опыта", "-1720468017": "Нам необходимо получить от вас некоторую информацию с целью оценить, подходит ли вам определенный продукт или услуга.", - "-186841084": "Изменить логин", - "-907403572": "Чтобы изменить адрес электронной почты, сначала нужно отвязать старый адрес от счета {{identifier_title}} .", - "-1850792730": "Отвязать {{identifier_title}}", "-307865807": "Предупреждение о допустимости рисков", "-690100729": "Да, я понимаю риск.", "-2010628430": "CFD и другие финансовые инструменты сопряжены с высоким риском быстрой потери денег из-за кредитного плеча. Вам следует подумать, понимаете ли вы, как работают CFD и другие финансовые инструменты, и можете ли вы позволить себе рисковать. <0/><0/> Чтобы продолжить, подтвердите, что осознаете риски для вашего капитала.", @@ -2206,11 +2228,6 @@ "-1725454783": "Ошибка", "-506510414": "Дата и время", "-1708927037": "IP-адрес", - "-619126443": "Используйте <0>пароль Deriv для входа в {{brand_website_name}} и {{platform_name_trader}}.", - "-623760979": "Используйте <0>пароль Deriv для входа на {{brand_website_name}}, {{platform_name_trader}} и {{platform_name_go}}.", - "-459147994": "Используйте <0>пароль Deriv для входа на {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} и {{platform_name_ctrader}}.", - "-80717068": "Приложения, которые связаны с <0>паролем Deriv:", - "-9570380": "Используйте пароль {{platform_name_dxtrade}} для входа на {{platform_name_dxtrade}} с веб-браузеров и мобильных приложений.", "-2131200819": "Отключить", "-200487676": "Включить", "-1840392236": "Неправильный код. Пожалуйста, попробуйте еще раз.", @@ -2240,44 +2257,37 @@ "-378415317": "Необходимо указать Регион/Штат", "-1497654315": "Наши счета и услуги недоступны для почтового индекса Джерси.", "-755626951": "Заполните ваши адресные данные", - "-584911871": "Выберите валюту кошелька", "-1461267236": "Пожалуйста, выберите валюту", - "-1352330125": "ВАЛЮТА", "-1027595143": "Менее $25 000", "-40491332": "$25 000 - $50 000", "-1139806939": "$50 001 - $100 000", - "-626752657": "0-1 год", - "-532014689": "1-2 года", - "-1001024004": "Более 3 лет", - "-790513277": "6-10 транзакций за последние 12 месяцев", - "-580085300": "11-39 транзакций за последние 12 месяцев", - "-654781670": "Начальное", - "-1717373258": "Среднее", "-996132458": "Строительство", "-915003867": "Здравоохранение", "-1430012453": "Информационные технологии и коммуникации", "-987824916": "Наука и проектирование", "-146630682": "Социально-культурная сфера", "-761306973": "Производство", - "-739367071": "Работающий", - "-1156937070": "$500 001 - $1 000 000", - "-315534569": "Более $1 000 000", - "-2068544539": "Наёмный работник", - "-531314998": "Инвестиции и дивиденды", - "-1235114522": "Пенсия", - "-1298056749": "Государственные пособия", - "-449943381": "Сбережения и наследство", "-1631552645": "Специалисты", "-474864470": "Работники в сфере продаж и обслуживания", "-1129355784": "Работники сельского, лесного и рыбного хозяйства", "-1242914994": "Ремесленники, рабочие по металлу, электрике и электронике", "-1317824715": "Уборщики и обслуживающий персонал", "-1592729751": "Работники горнодобывающей промышленности, строительства, производства и транспорта", + "-1030759620": "Гос. служащие", "-2137323480": "Доля компании", "-1590574533": "Раздел имущества", "-1667683002": "Наследование", "-1237843731": "Доход от инвестиций", "-777506574": "Продажа имущества", + "-654781670": "Начальное", + "-1717373258": "Среднее", + "-1156937070": "$500 001 - $1 000 000", + "-315534569": "Более $1 000 000", + "-2068544539": "Наёмный работник", + "-531314998": "Инвестиции и дивиденды", + "-1235114522": "Пенсия", + "-1298056749": "Государственные пособия", + "-449943381": "Сбережения и наследство", "-1161338910": "Необходимо указать имя.", "-1161818065": "Фамилия должна содержать от 2 до 50 знаков.", "-1281693513": "Необходимо указать дату рождения.", @@ -2287,28 +2297,14 @@ "-212167954": "Неправильный формат ИНН.", "-621555159": "Идентификационная информация", "-204765990": "Условия пользования", - "-231863107": "Нет", - "-870902742": "Какими знаниями и опытом вы обладаете в сфере онлайн-трейдинга?", - "-1929477717": "У меня есть образование, профессиональный сертификат и/или опыт работы в сфере финансовых услуг.", - "-1540148863": "Семинары, тренинги и/или мастер-классы о трейдинге.", - "-922751756": "Менее года", - "-542986255": "Нет", - "-1337206552": "В вашем понимании, торговля CFD позволяет", - "-456863190": "Открыть позицию на движение цены актива, результатом которой будет фиксированная доходность или вообще ничего.", - "-1314683258": "Открывать долгосрочные инвестиции и получать гарантированный доход.", - "-1546090184": "Как кредитное плечо влияет на торговлю CFD?", - "-1636427115": "Кредитное плечо помогает снизить риск.", - "-800221491": "Кредитное плечо гарантирует прибыль.", - "-811839563": "Кредитное плечо позволяет открывать крупные позиции на небольшую часть стоимости сделки, что может привести к увеличению прибыли или убытков.", - "-1185193552": "Автоматически закроет контракт, если убыток равен или превышает указанную сумму, при условии достаточной рыночной ликвидности.", - "-1046354": "Автоматически закроет контракт, если прибыль равна или превышает указанную сумму, при условии достаточной рыночной ликвидности.", - "-1842858448": "Получить гарантированную прибыль от контракта.", - "-860053164": "При торговле мультипликаторами.", - "-1250327770": "При покупке акций компании.", - "-1222388581": "Все вышеперечисленное.", "-477761028": "Удостоверение избирателя", "-1466346630": "CPF", - "-1030759620": "Гос. служащие", + "-739367071": "Работающий", + "-626752657": "0-1 год", + "-532014689": "1-2 года", + "-1001024004": "Более 3 лет", + "-790513277": "6-10 транзакций за последние 12 месяцев", + "-580085300": "11-39 транзакций за последние 12 месяцев", "-612752984": "Это лимиты по умолчанию, которые мы применяем к вашим счетам.", "-1598263601": "Чтобы узнать больше о торговых лимитах и о том, как они применяются, перейдите в <0>Центр поддержки.", "-1411635770": "Узнайте больше о лимитах счета", @@ -2326,10 +2322,7 @@ "-1500958859": "Подтвердить", "-1502578110": "Ваш счет полностью авторизован, и лимит на вывод был снят.", "-1662154767": "недавний счет за коммунальные услуги (электричество, вода, газ, стационарный телефон или интернет), банковская выписка или государственное/муниципальное письмо с вашим именем и этим адресом.", - "-190838815": "Это нужно нам для проверки. Если предоставленная вами информация окажется поддельной или неточной, вы не сможете вносить и снимать средства.", - "-223216785": "Вторая строка адреса*", "-594456225": "Вторая строка адреса", - "-1940457555": "Почтовый код/индекс*", "-1964954030": "Почтовый код/индекс", "-516397235": "Будьте осторожны с теми, кому вы передаете этот токен. Любой, у кого есть к нему доступ, сможет выполнять следующие действия от имени вашего счета:", "-989216986": "Добавить счета", @@ -2371,8 +2364,6 @@ "-1100235269": "Сфера занятости", "-684388823": "Собственный капитал", "-509054266": "Ожидаемый годовой оборот", - "-601903492": "Опыт торговли на Forex", - "-1012699451": "Опыт торговли CFD", "-1588485629": "Пример", "-1117345066": "Выберите тип документа", "-651192353": "Образец:", @@ -2394,11 +2385,11 @@ "-1088324715": "Мы проверим ваши документы и сообщим об их статусе в течение 1-3 рабочих дней.", "-329713179": "Ok", "-1176889260": "Выберите тип документа.", - "-1926456107": "Срок действия отправленного удостоверения личности истек.", + "-1926456107": "The ID you submitted is expired.", "-555047589": "Похоже, срок действия вашего удостоверения личности истек. Пожалуйста, попробуйте еще раз с действующим документом.", - "-841187054": "Повторить", + "-841187054": "Try Again", "-2097808873": "Нам не удалось подтвердить вашу личность по предоставленным вами данным. ", - "-228284848": "Нам не удалось подтвердить вашу личность по предоставленным вами данным.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "Ваша личность подтверждена. Вам также необходимо будет предоставить подтверждение адреса.", "-118547687": "Подтверждение личности успешно", "-200989771": "Перейдите в Личные данные", @@ -2464,12 +2455,40 @@ "-142444667": "Нажмите на ссылку в письме, чтобы сбросить пароль Deriv MT5.", "-742748008": "Проверьте электронную почту и нажмите на ссылку в письме, чтобы продолжить.", "-84068414": "Не получили письмо? Свяжитесь с нами через <0>чат.", + "-975118358": "Ваш счет будет открыт в {{legal_entity_name}}. Компания регулируется мальтийским управлением финансовых услуг (MFSA) и подчиняется законодательству Мальты.", + "-2073934245": "Финансовые услуги, предоставляемые на этом сайте, подходят только для клиентов, готовых нести ответственность за возможную потерю всех инвестированных средств, а также осознающих все риски и имеющих опыт покупки финансовых контрактов. Заключение сделок на финансовых контрактах предполагает высокий уровень риска. Если приобретённые контракты истекут, не принеся прибыли, вы потеряете всю инвестированную сумму.", + "-1125193491": "Добавить счёт", + "-2068229627": "Я не являюсь ПЗЛ и не являлся ПЗЛ в течение последних 12 месяцев.", + "-186841084": "Изменить логин", + "-907403572": "Чтобы изменить адрес электронной почты, сначала нужно отвязать старый адрес от счета {{identifier_title}} .", + "-1850792730": "Отвязать {{identifier_title}}", "-428335668": "Вам нужно будет установить пароль, чтобы завершить процесс.", + "-1232613003": "<0>Ошибка верификации. <1>Причины", + "-2029508615": "<0>Нужна верификация.<1>Пройти", "-818898181": "Имя в документе не соответствует вашему профилю Deriv.", "-310316375": "Адрес в документе не совпадает с адресом, указанным выше.", "-485368404": "Документ выдан более 6 месяцев назад.", "-367016488": "Размытый документ. Вся информация должна быть четкой и видимой.", "-1957076143": "Обрезанный документ. Вся информация должна быть четкой и видимой.", + "-231863107": "Нет", + "-870902742": "Какими знаниями и опытом вы обладаете в сфере онлайн-трейдинга?", + "-1929477717": "У меня есть образование, профессиональный сертификат и/или опыт работы в сфере финансовых услуг.", + "-1540148863": "Семинары, тренинги и/или мастер-классы о трейдинге.", + "-922751756": "Менее года", + "-542986255": "Нет", + "-1337206552": "В вашем понимании, торговля CFD позволяет", + "-456863190": "Открыть позицию на движение цены актива, результатом которой будет фиксированная доходность или вообще ничего.", + "-1314683258": "Открывать долгосрочные инвестиции и получать гарантированный доход.", + "-1546090184": "Как кредитное плечо влияет на торговлю CFD?", + "-1636427115": "Кредитное плечо помогает снизить риск.", + "-800221491": "Кредитное плечо гарантирует прибыль.", + "-811839563": "Кредитное плечо позволяет открывать крупные позиции на небольшую часть стоимости сделки, что может привести к увеличению прибыли или убытков.", + "-1185193552": "Автоматически закроет контракт, если убыток равен или превышает указанную сумму, при условии достаточной рыночной ликвидности.", + "-1046354": "Автоматически закроет контракт, если прибыль равна или превышает указанную сумму, при условии достаточной рыночной ликвидности.", + "-1842858448": "Получить гарантированную прибыль от контракта.", + "-860053164": "При торговле мультипликаторами.", + "-1250327770": "При покупке акций компании.", + "-1222388581": "Все вышеперечисленное.", "-1515286538": "Введите номер документа. ", "-1694758788": "Введите номер документа", "-1458676679": "Вы должны ввести 2-50 символов.", @@ -2479,6 +2498,8 @@ "-1437017790": "Финансовая информация", "-70342544": "По закону мы обязаны запросить вашу финансовую информацию.", "-39038029": "Опыт торговли", + "-601903492": "Опыт торговли на Форекс", + "-1012699451": "Опыт торговли CFD", "-1894668798": "Опыт торговли на других инструментах", "-1026468600": "Частота торговли на других инструментах", "-1743024217": "Выберите язык", @@ -2489,6 +2510,11 @@ "-536187647": "Подтвердить отмену доступа?", "-1357606534": "Разрешение", "-570222048": "Отмена доступа", + "-80717068": "Приложения, которые связаны с <0>паролем Deriv:", + "-340060402": "Ваш пароль Deriv X предназначен для входа на счета Deriv X с веб-браузеров и мобильных приложений.", + "-619126443": "Используйте <0>пароль Deriv для входа в {{brand_website_name}} и {{platform_name_trader}}.", + "-623760979": "Используйте <0>пароль Deriv для входа на {{brand_website_name}}, {{platform_name_trader}} и {{platform_name_go}}.", + "-459147994": "Используйте <0>пароль Deriv для входа на {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} и {{platform_name_ctrader}}.", "-1526404112": "Счет за коммунальные услуги: счет за электричество, воду, газ или стационарный телефон.", "-537552700": "Договор аренды жилья: действующий и актуальный договор.", "-890084320": "Сохранить и отправить", @@ -2510,30 +2536,53 @@ "-362324454": "Сырьевые товары", "-1071336803": "Платформа", "-820028470": "Мульт. и опционы", - "-1255879419": "Trader's Hub", + "-1186807402": "Перевод", + "-224804428": "Транзакции", + "-470018967": "Сбросить баланс", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Сбросить", "-213142918": "Пополнение и вывод средств временно недоступны ", - "-224804428": "Транзакции", - "-1186807402": "Перевод", "-1308346982": "Derived", "-1145604233": "Торгуйте CFD на MT5 на индексах Derived, имитирующих движения реальных рынков.", "-328128497": "Финансовый", - "-1484404784": "Торгуйте CFD на MT5 на forex, фондовых индексах, сырьевых товарах и криптовалютах.", + "-1484404784": "Торгуйте CFD на MT5 на форекс, фондовых индексах, сырьевых товарах и криптовалютах.", "-659955365": "Без свопов", "-674118045": "Торгуйте CFD без свопов на MT5 на синтетических активах, форекс, акциях, фондовых индексах, криптовалютах, ETF.", "-1210359945": "Переведите средства на свои счета", "-81256466": "Для открытия счета CFD нужно открыть счет Deriv.", "-699372497": "Торгуйте с кредитным плечом и узкими спредами. Больше прибыли от успешных контрактов. <0>Подробнее", "-1884966862": "Больше счетов Deriv MT5 разных типов и юрисдикций.", - "-145462920": "Deriv cTrader", "-982095728": "Открыть", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Дисклеймер ЕС: CFD – это сложные инструменты, сопряженные с высоким риском быстрой потери средств из-за эффекта кредитного плеча. <0>73% счетов розничных инвесторов теряют деньги при торговле CFD с этим провайдером. Пожалуйста, убедитесь, что вы хорошо понимаете принципы работы CFD и готовы нести риск потери своих средств.", "-1277942366": "Всего активов", + "-1255879419": "Trader's Hub", "-493788773": "Вне ЕС", "-673837884": "ЕС", "-230566990": "Следующие документы не прошли нашу проверку:", "-846812148": "Подтверждение адреса.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Регулирование за пределами ЕС", "-643108528": "Регулирование в ЕС и вне ЕС", + "-979459594": "Buy/Sell", + "-494667560": "Ордеры", + "-679691613": "Мои объявления", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Счет мультипликаторов", "-744999940": "Счет Deriv", @@ -2541,11 +2590,22 @@ "-749129977": "Откройте реальный счет Deriv, начните торговать и управлять своими средствами.", "-1814994113": "CFD <0>{{compare_accounts_title}}", "-318106501": "Торгуйте CFD на MT5 на синтетических активах, валютных индексах и Derived FX.", - "-1328701106": "Торгуйте CFD на MT5 на forex, акциях, криптовалютах, сырьевых товарах, фондовых и синтетических индексах.", + "-1328701106": "Торгуйте CFD на MT5 на форекс, акциях, криптовалютах, сырьевых товарах, фондовых и синтетических индексах.", "-1173266642": "Этот счет предлагает CFD на многофункциональной торговой платформе.", - "-1290112064": "Deriv EZ", "-1453519913": "Торгуйте CFD на простой платформе со всеми любимыми активами.", "-2051096382": "Фиксированные выплаты за правильные прогнозы рыночных движений с <0>опционами или \n все преимущества CFD при ограниченном риске с <1>мультипликаторами.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "Выбор регулятора", "-249184528": "Можно открыть счет под юрисдикцией регулятора в ЕС или за его пределами. Нажмите <0><0/>, чтобы узнать больше об этих счетах.", "-1505234170": "Тур по Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "Пополните счет", "-1945421757": "Когда у вас появится счет, нажмите 'Пополнить' или 'Перевод', чтобы внести на него средства", "-1965920446": "Начать торговлю", - "-33612390": "<0>Дисклеймер ЕС: CFD – это сложные инструменты, сопряженные с высоким риском быстрой потери средств из-за эффекта кредитного плеча. <0>73% счетов розничных инвесторов теряют деньги при торговле CFD с этим провайдером. Пожалуйста, убедитесь, что вы хорошо понимаете принципы работы CFD и готовы нести риск потери своих средств.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Это поле является обязательным.", "-1870909526": "Нашему серверу не удалось получить адрес.", "-582721696": "Разрешенная сумма вывода сейчас составляет от {{format_min_withdraw_amount}} до {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Адрес вашего кошелька {{currency_symbol}}", "-38063175": "{{account_text}} кошелек", "-705272444": "Загрузите документ, подтверждающий личность", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Это нужно для того, чтобы защитить ваш счет от несанкционированного вывода средств.", "-130833284": "Обратите внимание, что ваши лимиты на максимальный и минимальный вывод средств не фиксированы. Они меняются из-за высокой волатильности криптовалюты.", "-1531269493": "Мы отправим вам электронное письмо, когда транзакция будет обработана.", @@ -2823,7 +2898,7 @@ "-1765276625": "Щелкните раскрывающееся меню мультипликаторов и выберите тот, который хотите применить.", "-1872233077": "Ваша потенциальная прибыль будет умножена на выбранный мультипликатор.", "-614454953": "Более подробную информацию об этом типе контрактов можно найти на странице <0>Мультипликаторы.", - "-2078588404": "Выберите нужный рынок и актив. Например, Forex > Основные пары > AUD/JPY", + "-2078588404": "Выберите нужный рынок и актив. Например, Форекс > Основные пары > AUD/JPY", "-2037446013": "2. Тип контракта", "-533927844": "Выберите нужный тип контракта. Например, Вверх/Вниз > Повышение/Падение", "-1192411640": "4. Интервал свечи по умолчанию", @@ -2859,6 +2934,30 @@ "-1016171176": "Актив", "-621128676": "Тип контракта", "-447853970": "Предельный убыток", + "-155173714": "Давайте создадим бота!", + "-1919212468": "3. Вы также можете найти нужные блоки, используя строку поиска над категориями.", + "-1520558271": "Для получения дополнительной информации ознакомьтесь с этим сообщением в блоге об основах создания торгового бота.", + "-980360663": "3. Выберите нужный блок и перетащите его на рабочее пространство.", + "-1493168314": "Что такое быстрая стратегия?", + "-1680391945": "Использование быстрой стратегии", + "-1177914473": "Как сохранить стратегию?", + "-271986909": "В Конструкторе ботов нажмите Сохранить на панели инструментов вверху, чтобы выгрузить бота. Дайте боту имя и выберите загрузку бота на свое устройство или Google Drive. Бот будет загружен в виде XML-файла.", + "-1149045595": "1. После нажатия кнопки Импортировать выберите Локальные и нажмите Продолжить.", + "-288041546": "2. Выберите XML-файл и нажмите Открыть.", + "-2127548288": "3. Ваш бот будет загружен соответствующим образом.", + "-1311297611": "1. После нажатия кнопки Импортировать выберите Google Drive и нажмите Продолжить.", + "-1549564044": "Как очистить рабочее пространство?", + "-1127331928": "В Конструкторе ботов нажмите Сбросить на панели инструментов вверху. Это очистит рабочее пространство. Все несохраненные изменения будут потеряны.", + "-1720444288": "Можно ли как-то контролировать убыток в Deriv Bot?", + "-1142295124": "Есть несколько способов контролировать убытки на Deriv Bot. Вот пример того, как можно реализовать один из них в вашей стратегии:", + "-986689483": "1. Создайте следующие переменные:", + "-269910127": "3. Обновите текущую прибыль/убыток прибылью по последнему контракту. Если последний контракт был потерян, значение текущей прибыли/убытка будет отрицательным.", + "-1565344891": "Можно ли запустить Deriv Bot на нескольких вкладках браузера?", + "-90192474": "Да. Но на вашем счете есть ограничения, такие как максимальное количество открытых позиций и максимальные совокупные выплаты по открытым позициям. Учитывайте эти ограничения при открытии нескольких позиций. Дополнительную информацию об этих лимитах можно найти в разделе Настройки > Лимиты счета.", + "-213872712": "Нет, мы не предлагаем криптовалюты на Deriv Bot.", + "-2147346223": "В каких странах доступен Deriv Bot?", + "-352345777": "Какие стратегии наиболее популярны для автоматической торговли?", + "-552392096": "Три часто используемые стратегии в автоматической торговле — это Мартингейл, Д'Аламбер и Оскар Грайнд. Все они готовы и ждут вас в Deriv Bot.", "-507620484": "Не сохранен", "-764102808": "Google Диск", "-555886064": "Выиграл", @@ -2937,30 +3036,6 @@ "-1823621139": "Быстрая стратегия", "-1778025545": "Вы успешно импортировали бота.", "-1519425996": "Нет результатов с \"{{ faq_search_value }}\"", - "-155173714": "Давайте создадим бота!", - "-1919212468": "3. Вы также можете найти нужные блоки, используя строку поиска над категориями.", - "-1520558271": "Для получения дополнительной информации ознакомьтесь с этим сообщением в блоге об основах создания торгового бота.", - "-980360663": "3. Выберите нужный блок и перетащите его на рабочее пространство.", - "-1493168314": "Что такое быстрая стратегия?", - "-1680391945": "Использование быстрой стратегии", - "-1177914473": "Как сохранить стратегию?", - "-271986909": "В Конструкторе ботов нажмите Сохранить на панели инструментов вверху, чтобы выгрузить бота. Дайте боту имя и выберите загрузку бота на свое устройство или Google Drive. Бот будет загружен в виде XML-файла.", - "-1149045595": "1. После нажатия кнопки Импортировать выберите Локальные и нажмите Продолжить.", - "-288041546": "2. Выберите XML-файл и нажмите Открыть.", - "-2127548288": "3. Ваш бот будет загружен соответствующим образом.", - "-1311297611": "1. После нажатия кнопки Импортировать выберите Google Drive и нажмите Продолжить.", - "-1549564044": "Как очистить рабочее пространство?", - "-1127331928": "В Конструкторе ботов нажмите Сбросить на панели инструментов вверху. Это очистит рабочее пространство. Все несохраненные изменения будут потеряны.", - "-1720444288": "Можно ли как-то контролировать убыток в Deriv Bot?", - "-1142295124": "Есть несколько способов контролировать убытки на Deriv Bot. Вот пример того, как можно реализовать один из них в вашей стратегии:", - "-986689483": "1. Создайте следующие переменные:", - "-269910127": "3. Обновите текущую прибыль/убыток прибылью по последнему контракту. Если последний контракт был потерян, значение текущей прибыли/убытка будет отрицательным.", - "-1565344891": "Можно ли запустить Deriv Bot на нескольких вкладках браузера?", - "-90192474": "Да. Но на вашем счете есть ограничения, такие как максимальное количество открытых позиций и максимальные совокупные выплаты по открытым позициям. Учитывайте эти ограничения при открытии нескольких позиций. Дополнительную информацию об этих лимитах можно найти в разделе Настройки > Лимиты счета.", - "-213872712": "Нет, мы не предлагаем криптовалюты на Deriv Bot.", - "-2147346223": "В каких странах доступен Deriv Bot?", - "-352345777": "Какие стратегии наиболее популярны для автоматической торговли?", - "-552392096": "Три часто используемые стратегии в автоматической торговле — это Мартингейл, Д'Аламбер и Оскар Грайнд. Все они готовы и ждут вас в Deriv Bot.", "-418247251": "Загрузить журнал.", "-2123571162": "Загрузить", "-870004399": "<0>Куплено: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Счет деактивирован", "-1837059346": "Покупка/продажа", "-1845037007": "Страница адвертайзера", - "-494667560": "Ордеры", - "-679691613": "Мои объявления", "-821418875": "Трейдер", "-679102561": "Детали контракта", "-430118939": "Политика рассмотрения жалоб", @@ -3082,7 +3155,6 @@ "-430041639": "Подтверждение адреса не прошло проверку. Мы наложили некоторые ограничения на ваш счет. Пожалуйста, отправьте подтверждение адреса еще раз.", "-87177461": "Пожалуйста, перейдите в настройки счета и введите недостающие личные данные, чтобы активировать пополнение счета.", "-904632610": "Сбросьте баланс", - "-470018967": "Сбросить баланс", "-156611181": "Пройдите финансовую оценку в настройках счета, чтобы разблокировать ее.", "-1925176811": "Сейчас мы не можем обработать вывод средств", "-980696193": "Вывод средств временно недоступен из-за технического обслуживания системы. Вы можете вывести средства после завершения работ.", @@ -3107,12 +3179,12 @@ "-577279362": "Пожалуйста, предоставьте подтверждение личности, чтобы верифицировать счет и продолжить торговлю.", "-197134911": "Истек срок действия документа, удостоверяющего личность", "-152823394": "Истек срок действия документа, удостоверяющего личность. Пожалуйста, предоставьте новое удостоверение личности, чтобы верифицировать счет и продолжить торговлю.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Следуйте этим простым инструкциям, чтобы исправить ситуацию.", "-2142540205": "Похоже, что адрес в вашем документе не совпадает с адресом в вашем профиле Deriv. Пожалуйста, обновите свои личные данные, указав правильный адрес.", "-482715448": "Перейдите в Личные данные", "-2072411961": "Ваше подтверждение адреса принято", "-384887227": "Обновите адрес в своем профиле.", - "-448961363": "вне ЕС", "-1998049070": "Если вы согласны на использование нами файлов cookie, нажмите Принять. Для получения дополнительной информации <0>см. нашу политику.", "-402093392": "Добавить счет Deriv", "-1721181859": "Вам понадобится счет {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "На весь экран", "-1823504435": "Открыть уведомления", "-1954045170": "Валюта не выбрана", - "-583559763": "Меню", "-1591792668": "Лимиты счета", "-34495732": "Нормативная информация", "-1496158755": "Перейти на Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "Финансовая комиссия принимает жалобы в течение 45 дней с даты инцидента и только после того, как трейдер попытается решить проблему напрямую с компанией.", "-1825471709": "Совершенно новый опыт трейдинга на мощной, но простой в использовании платформе.", "-981017278": "Автоматизированная торговля, доступная каждому. Не требует навыков кодинга.", + "-583559763": "Меню", "-778309978": "Срок действия ссылки истек. Попробуйте нажать на ссылку в последнем письме в папке Входящие. Или введите свой адрес электронной почты ниже и нажмите <0>Отправить письмо повторно, чтобы получить новую ссылку.", "-336222114": "Выполните эти простые шаги, чтобы исправить ситуацию:", "-1064116456": "Найдите брокера <0>Deriv Holdings (Guernsey) Limited и выберите его.", @@ -3271,9 +3343,9 @@ "-939154994": "Добро пожаловать на панель управления Deriv MT5", "-1667427537": "Запустите Deriv X в своем браузере или скачайте мобильное приложение", "-305915794": "Работайте на MT5 с браузера или загрузите приложение MT5 для своих устройств", - "-404375367": "Торгуйте с высоким кредитным плечом на forex, валютных индексах, сырьевых товарах и криптовалютах.", - "-243985555": "Торгуйте CFD с кредитным плечом на forex, акциях, криптовалютах сырьевых товарах, фондовых и синтетических индексах.", - "-2030107144": "Торгуйте CFD на forex, акциях, фондовых индексах, сырьевых товарах и криптовалютах.", + "-404375367": "Торгуйте с высоким кредитным плечом на форекс, валютных индексах, сырьевых товарах и криптовалютах.", + "-243985555": "Торгуйте CFD с кредитным плечом на форекс, акциях, криптовалютах сырьевых товарах, фондовых и синтетических индексах.", + "-2030107144": "Торгуйте CFD на форекс, акциях, фондовых индексах, сырьевых товарах и криптовалютах.", "-705682181": "Мальта", "-409563066": "Регулятор", "-1302404116": "Макс. кредитный рычаг", @@ -3338,8 +3410,8 @@ "-1727991510": "Отсканируйте QR-код, чтобы скачать мобильное приложение Deriv X", "-1769852749": "Н/Д", "-511301450": "Обозначает наличие контрактов на криптовалютах на определенном счете.", - "-1647569139": "Синтетические активы, Derived FX, Forex: стандартные/микро лоты, акции, фондовые индексы, сырьевые товары, криптовалюты", - "-2102641225": "В конца банковского торгового дня ликвидность на рынке forex понижена, в результате чего спреды и время обработки клиентских ордеров могут увеличиться. Это происходит около 21:00 по Гринвичу в летнее время и, соответственно, в 22:00 зимнее время.", + "-1647569139": "Синтетические активы, Derived FX, Форекс: стандартные/микро лоты, акции, фондовые индексы, сырьевые товары, криптовалюты", + "-2102641225": "В конца банковского торгового дня ликвидность на рынке форекс понижена, в результате чего спреды и время обработки клиентских ордеров могут увеличиться. Это происходит около 21:00 по Гринвичу в летнее время и, соответственно, в 22:00 зимнее время.", "-495364248": "Уровень маржинального требования и стоп аута будет время от времени меняться в зависимости от состояния рынка.", "-536189739": "Чтобы защитить ваш портфель от неблагоприятных скачков из-за разрыва при открытии рынка, мы оставляем за собой право уменьшить кредитное плечо по всем предлагаемым символам для финансовых счетов до закрытия рынка и снова увеличить его после открытия. Пожалуйста, убедитесь, что на вашем счете {{platform}} всегда находится достаточно средств для поддержки ваших позиций.", "-712681566": "Одноранговый (P2P) обмен", @@ -3372,7 +3444,7 @@ "-1211122723": "{{ account_title }} счет {{ platform }}", "-78895143": "Текущий баланс", "-149993085": "Новый текущий баланс", - "-490244964": "Forex, акции, криптовалюты, фондовые и", + "-490244964": "Форекс, акции, криптовалюты, фондовые и", "-1368041210": "синтетические индексы", "-877064208": "EUR", "-1284221303": "Вы получите предупреждение, известное как маржин колл, если баланс вашего счета упадет до уровня стоп аут.", @@ -3415,22 +3487,6 @@ "-1282933308": "Не {{barrier}}", "-968190634": "Равно {{barrier}}", "-1747377543": "Под {{barrier}}", - "-256210543": "В настоящее время торговля недоступна.", - "-1150099396": "Мы работаем над тем, чтобы сделать этот функционал доступным. Если у вас есть другой счет, переключитесь на него, чтобы продолжить торговлю. Вы можете добавить Финансовый счет Deriv MT5.", - "-28115241": "{{platform_name_trader}} недоступен для этого счета", - "-453920758": "Перейти на панель {{platform_name_mt5}}", - "-402175529": "История", - "-902712434": "Отмена сделки", - "-988484646": "Отмена сделки (выполнена)", - "-444882676": "Отмена сделки (активна)", - "-13423018": "Номер", - "-2035315547": "Нижний барьер", - "-1551639437": "Нет истории", - "-1214703885": "Вы еще не обновляли тейк профит или стоп лосс", - "-504849554": "Он откроется в", - "-59803288": "А пока попробуйте наши синтетические индексы. Они имитируют волатильность реального рынка и открыты 24/7.", - "-1278109940": "См. открытые рынки", - "-694105443": "Этот рынок закрыт", "-1043795232": "Недавние позиции", "-1511825574": "Прибыль/убыток:", "-726626679": "Потенциальная прибыль/убыток:", @@ -3455,21 +3511,15 @@ "-1435392215": "Об отмене сделки", "-2017825013": "Понятно", "-1192773792": "Больше не показывать", + "-902712434": "Отмена сделки", "-1280319153": "Отмените контракт в течение выбранного периода времени. Срабатывает автоматически, если ваш контракт достигает уровня стоп аут в течение указанного периода.", "-471757681": "Управление рисками", "-843831637": "Стоп лосс", "-771725194": "Отмена сделки", "-338707425": "Минимальная длительность - 1 день", "-1003473648": "Длительность: {{duration}} дн.", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Выплата по истечении срока действия равна выплате за пункт, умноженной на разницу между конечной ценой и ценой исполнения.", "-1527492178": "Покупка заблокирована", "-725375562": "Вы можете заблокировать/разблокировать кнопку покупки в меню настроек", - "-774638412": "Ставка должна быть между {{min_stake}} {{currency}} и {{max_stake}} {{currency}}", - "-1358367903": "Ставка", - "-434270664": "Текущая цена", - "-1956787775": "Барьерная цена:", - "-1513281069": "Барьер 2", "-390994177": "Должно быть между {{min}} и {{max}}", "-1804019534": "Срок действия: {{date}}", "-2055106024": "Переключение между расширенными и простыми настройками длительности", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "выше", "-857660728": "Цены исполнения", + "-1358367903": "Ставка", "-1386326276": "Поле \"Барьер\" является обязательным для заполнения.", "-1418742026": "Верхний барьер должен быть выше нижнего барьера.", "-92007689": "Нижний барьер должен быть ниже верхнего барьера.", @@ -3491,6 +3542,21 @@ "-1975910372": "\"Минуты\" должны быть от 0 до 59.", "-866277689": "Время истечения не может быть в прошлом.", "-1455298001": "Сейчас", + "-256210543": "В настоящее время торговля недоступна.", + "-1150099396": "Мы работаем над тем, чтобы сделать этот функционал доступным. Если у вас есть другой счет, переключитесь на него, чтобы продолжить торговлю. Вы можете добавить Финансовый счет Deriv MT5.", + "-28115241": "{{platform_name_trader}} недоступен для этого счета", + "-453920758": "Перейти на панель {{platform_name_mt5}}", + "-402175529": "История", + "-988484646": "Отмена сделки (выполнена)", + "-444882676": "Отмена сделки (активна)", + "-13423018": "Номер", + "-2035315547": "Нижний барьер", + "-1551639437": "Нет истории", + "-1214703885": "Вы еще не обновляли тейк профит или стоп лосс", + "-504849554": "Он откроется в", + "-59803288": "А пока попробуйте наши синтетические индексы. Они имитируют волатильность реального рынка и открыты 24/7.", + "-1278109940": "См. открытые рынки", + "-694105443": "Этот рынок закрыт", "-439389714": "Мы работаем над этим", "-770929448": "Перейти на {{platform_name_smarttrader}}", "-347156282": "Отправить подтверждение", @@ -3537,6 +3603,8 @@ "-454245976": "Если вы считаете, что рыночная цена будет постоянно падать в течение определенного периода, выберите <0>короткую позицию. Вы получите выплату по истечении срока действия, если рыночная цена не достигнет барьера или не превысит его. Если барьер не будет преодолен, размер выплаты будет расти пропорционально расстоянию между рыночной ценой и барьером. Вы начнете получать прибыль, когда выплата превысит ставку. Выплаты не будет, если рыночная цена пересечет барьер.", "-351875097": "Кол-во тиков", "-729830082": "Меньше", + "-1669741470": "Выплата по истечении срока действия равна выплате за пункт, умноженной на разницу между конечной ценой и ценой исполнения.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "НОВИНКА!", "-993480898": "Аккумуляторы", "-45873457": "НОВИНКА", @@ -3557,6 +3625,10 @@ "-690963898": "Ваш контракт будет автоматически закрыт, когда выплата достигнет этой суммы.", "-511541916": "По достижении этого количества тиков ваш контракт будет автоматически закрыт.", "-438655760": "<0>Примечание: Вы можете закрыть контракт в любое время. Помните о риске проскальзывания.", + "-774638412": "Ставка должна быть между {{min_stake}} {{currency}} и {{max_stake}} {{currency}}", + "-434270664": "Текущая цена", + "-1956787775": "Барьерная цена:", + "-1513281069": "Барьер 2", "-1683683754": "Длинная позиция", "-1046859144": "<0>{{title}} Вы получите выплату, если рыночная цена останется на уровне {{price_position}} и не пересечет барьер. В противном случае ваша выплата будет равна нулю.", "-1815023694": "над барьером", diff --git a/packages/translations/src/translations/si.json b/packages/translations/src/translations/si.json index 81b8efbca7d8..aeed5b21c24b 100644 --- a/packages/translations/src/translations/si.json +++ b/packages/translations/src/translations/si.json @@ -24,7 +24,6 @@ "27731356": "ඔබේ ගිණුම තාවකාලිකව අක්‍රීය කර ඇත. තැන්පතු සහ මුදල් ආපසු ගැනීම නැවත සක්‍රීය​ කිරීම සඳහා කරුණාකර <0>සජීවී කථාබස් හරහා අප හා සම්බන්ධ වන්න.", "27830635": "Deriv (V) Ltd", "28581045": "සැබෑ MT5 ගිණුමක් එක් කරන්න", - "30801950": "ඔබේ ගිණුම {{legal_entity_name}} නාමයෙන් විවෘත කර, Malta Gaming Authority විසින් නියාමනය කරනු ලබන අතර එය මෝල්ටාවේ නීතිවලට යටත් වනු ඇත.", "33433576": "කරුණාකර ඔබේ මුදල් ආපසු ගැනීමට ඊ-පසුම්බියක් භාවිතා කරන්න.", "35089987": "ඔබගේ රියදුරු බලපත්‍ර​යේ ඉදිරිපස සහ පිටුපස උඩුගත කරන්න.", "41737927": "ඔබට ස්තුතියි", @@ -54,17 +53,19 @@ "68885999": "දෝෂයක් ඇති වූ විට පෙර ගනුදෙනුව නැවත සිදු කරයි.", "69005593": "පහත උදාහරණය 1 මිනිත්තුවක candle ආරම්භ කර තත්පර 30කට හෝ ඊට වැඩි කාලයකට පසුව යළි ගනුදෙනු ආරම්භ කරයි.", "71016232": "OMG/USD", - "71445658": "විවෘත", + "71445658": "විවෘත කරන්න", "71563326": "වේගවත් සහ ආරක්ෂිත ෆියට් සිට ක්‍රිප්ටෝ ගෙවීම් සේවාවකි. ඔබගේ ණය/හර​ කාඩ්පත් සහ බැංකු හුවමාරු කිරීම් භාවිතයෙන් ලොව ඕනෑම තැනක සිට ක්‍රිප්ටෝ මුදල් තැන්පත් කරන්න.", "71853457": "$100,001 - $500,000", "72500774": "කරුණාකර බදු පදිංචිය පුරවන්න.", "73086872": "ඔබ ගනුදෙනුවලින් ස්වයං ව්‍යවර්තන වී ඇත​", "73326375": "ගිවිසුම් කාලය තුළ වෙළඳපලට ළඟා වූ අඩුම අගය 'low' නම් වෙයි.", + "74836780": "{{currency_code}} Wallet", "74963864": "Under", "76916358": "ඔබ මුදල් ආපසු ගැනීමේ සීමාවට පැමිණ ඇත.<0/>දිගටම මුදල් ආපසු ගැනීම සඳහා සීමාව ඉවත් කිරීමට ඔබේ අනන්‍යතාවය සහ ලිපිනය පිළිබඳ සාක්ෂි උඩුගත කරන්න.", "76925355": "ඔබේ බොට්ගේ කාර්ය සාධනය පරීක්ෂා කරන්න", "77945356": "අපගේ ජංගම යෙදුම සමඟ යන එන අතර මඟදීත් ගනුදෙනු කරන්න.", "77982950": "Vanilla විකල්ප ඔබට \"Call\" හෝ \"Put\" මිල දී ගැනීමෙන් පාදක වත්කමේ උඩුකුරු (bullish) හෝ යටිකුරු (bearish) දිශාවක් පුරෝකථනය කිරීමට ඉඩ සලසයි.", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "අපට එම පිටුව සොයාගත නොහැක", "82839270": "ඔබේ විදේශ ගමන් බලපත්‍ර​යේ ඔබේ ඡායාරූපය අඩංගු පිටුව උඩුගත කරන්න.", "83202647": "කඩා වැටීමේ කොටස්", @@ -76,6 +77,7 @@ "90266322": "2. ඔබ අලුතින් සාදන ලද Telegram බොට් සමඟ කථාබස් ආරම්භ කර ඊළඟ පියවරට යාමට පෙර පණිවුඩ​ කිහිපයක් යැවීමට වග බලා ගන්න. (උදා: ආයුබෝවන් බොට්!)", "91993812": "Martingale උපාය මාර්ගය යනු 18 වන ශතවර්ෂයේ ප්‍රං​ශ ගණිතඥයෙකු වන පෝල් පියරේ ලෙවී විසින් ප්‍රචලිත කරන ලද වසර සියයකට වැඩි කාලයක් තිස්සේ භාවිත කර ඇති සම්භාව්‍ය ගනුදෙනු තාක්ෂණයකි.", "93154671": "1. සංඛ්‍යාලේඛන පුවරුවේ පහළින් ඇති Reset ඔබන්න.", + "93939827": "Cryptocurrency accounts", "96381225": "හැඳුනුම්පත් සත්‍යාපනය අසාර්ථකයි", "98473502": "ඔබට යෝග්‍යතා පරීක්ෂණයක් පැවැත්වීමට හෝ අවදානම් අනතුරු ඇඟවීම් ලබා දීමට අපි බැඳී නැත.", "98972777": "අහඹු අයිතමය", @@ -83,6 +85,7 @@ "102226908": "ක්ෂේත්‍රය හිස් විය නොහැක", "108916570": "කාල සීමාව: {{duration}} දින", "109073671": "කරුණාකර ඔබ කලින් තැන්පතු සඳහා භාවිත කළ ඊ-පසුම්බියක් භාවිත කරන්න. ඉ-පසුම්බිය මුදල් ආපසු ගැනීම සඳහා සහය දක්වන බවට සහතික වන්න. මුදල් ආපසු ගැනීම් සඳහා සහය දක්වන ඊ-පසුම්බි ලැයිස්තුව <0>මෙතැනින් බලන්න.", + "110822969": "One Wallet for all your transactions", "111215238": "සෘජු ආලෝකයෙන් ඉවත් වන්න", "111718006": "අවසන් දිනය", "111931529": "දින 7 කට වැඩි මුළු කොටස්", @@ -128,8 +131,8 @@ "158355408": "සමහර සේවා තාවකාලිකව ලබා ගත නොහැක.", "160746023": "Omni ටෝකනයක් (USDT) ලෙස Tether යනු Tether අනුවාදයක් වන අතර එය Bitcoin blockchain හි Omni ස්ථරයේ සත්කාරකත්වය දරයි.", "160863687": "කැමරාව අනාවරණය වී නොමැත", - "164112826": "දුරස්ථ සේවාදායකයක ගබඩා කර ඇත්නම් URL එකකින් කුට්ටි පැටවීමට මෙම කොටස ඔබට ඉඩ සලසයි, ඒවා පටවනු ලබන්නේ ඔබේ බොට් ධාවනය වන විට පමණි.", - "164564432": "පද්ධති නඩත්තු කිරීම හේතුවෙන් තැන්පතු තාවකාලිකව ලබා ගත නොහැක. නඩත්තු කටයුතු අවසන් වූ විට ඔබට ඔබේ තැන්පතු කළ හැකිය.", + "164112826": "ඔබ දුරස්ථ සේවාදායකයක ගබඩා කර ඇත්නම් URL එකකින් බ්ලොක් එක පූරණය කිරීමට මෙම කොටස ඔබට ඉඩ සලසයි, ඒවා පූරණය වන්නේ ඔබේ බොට් ක්‍රියාත්මක වන විට පමණි.", + "164564432": "පද්ධති නඩත්තුව හේතුවෙන් තැන්පතු තාවකාලිකව ලබා ගත නොහැක. නඩත්තුව අවසන් වූ පසු ඔබට ඔබේ තැන්පතු සිදු කළ හැක.", "165294347": "අයකැමි වෙත ප්‍රවේශ​ වීම සඳහා කරුණාකර ඔබගේ ගිණුම් සැකසුම් තුළ ඔබගේ පදිංචි රට සකසන්න.", "165312615": "දුරකථනයෙන් ඉදිරියට යන්න", "165682516": "ඔබ පැවසීමට කැමති නම්, ඔබ භාවිත කරන වෙනත් ගනුදෙනු වේදිකා මොනවා ද?", @@ -151,7 +154,7 @@ "181346014": "සටහන් ", "181881956": "ගිවිසුම් වර්ගය: {{ contract_type }}", "184024288": "සිම්පල් අකුරු", - "189705706": "මෙම කොටස පුනරාවර්තන පාලනය කිරීමට “i” විචල්යය භාවිතා කරයි. එක් එක් පුනරාවර්තනය සමඟ, “i” හි වටිනාකම තීරණය කරනු ලබන්නේ දී ඇති ලැයිස්තුවක ඇති අයිතම මගිනි.", + "189705706": "මෙම බ්ලොක් එක පුනර්කරණය පාලනය කිරීමට \"i\" විචල්‍යය භාවිතා කරයි. එක් එක් පුනර්කරණය සමඟ, \"i\" හි අගය තීරණය වන්නේ දී ඇති ලැයිස්තුවේ ඇති අයිතමයන් මගිනි.", "189759358": "දී ඇති අයිතමයක් පුනරාවර්තනය කිරීමෙන් ලැයිස්තුවක් සාදයි", "190834737": "මාර්ගෝපදේශය", "191372501": "ආදාන/ඉතුරුම් සමුච්චය කිරීම", @@ -159,7 +162,7 @@ "192573933": "සත්‍යාපනය සම්පූර්ණයි", "195972178": "අක්ෂරය ලබා ගන්න", "196810983": "කාලය පැය 24 ට වඩා වැඩි නම්, කඩඉම් කාලය සහ කල් ඉකුත් වීමේ දිනය ඒ වෙනුවට යොදනු ලැබේ.", - "196998347": "බංකොලොත්භාවයකදී සමාගමේ වත්කම්වල කොටසක් නොවන අපගේ මෙහෙයුම් ගිණුම් වලින් වෙන්ව අපි පාරිභෝගික අරමුදල් බැංකු ගිණුම්වල තබා ගනිමු. පාරිභෝගික අරමුදල් මට්ටමින් වෙන් කිරීම සඳහා <0>සූදු කොමිෂන් සභාවේ අවශ්යතා මෙය සපුරාලයි: <1>මධ්යම ආරක්ෂාව.", + "196998347": "බංකොලොත් භාවයේ දී සමාගමේ වත්කම්වලින් කොටසක් නොවන අපගේ මෙහෙයුම් ගිණුම්වලින් වෙන් වූ බැංකු ගිණුම්වල අපි පාරිභෝගික අරමුදල් තබා ගනිමු. මෙය පාරිභෝගික අරමුදල් මට්ටමින් වෙන් කිරීම සඳහා <0>සූදු කොමිසමේ අවශ්‍යතා සපුරාලයි: <1>මධ්‍යම ආරක්ෂාව.", "197190401": "කල් ඉකුත් වීමේ දිනය", "201091938": "දින 30 ක්", "203108063": "සුභ පැතුම්, ඔබ සාර්ථකව ඔබගේ {{category}} <0>{{platform}} <1>{{type}} ගිණුම නිර්මාණය කර ඇත. ", @@ -177,7 +180,7 @@ "211461880": "පොදු නම් සහ වාසගම අනුමාන කිරීම පහසුය", "211847965": "ඔබේ <0>පුද්ගලික විස්තර අසම්පූර්ණයි. මුදල් ආපසු ගැනීම සබල කිරීමට කරුණාකර ඔබේ ගිණුම් සැකසීම් වෙත ගොස් ඔබේ පුද්ගලික තොරතුරු සම්පූර්ණ කරන්න.", "212871086": "ළඟදීම ජංගම දුරකථනයෙන් ලබා ගත හැක", - "216650710": "ඔබ ආදර්ශන ගිණුමක් භාවිතා කරයි", + "216650710": "ඔබ ආදර්ශන ගිණුමක් භාවිත කරයි", "217403651": "St. Vincent & Grenadines", "217504255": "මූල්‍ය තක්සේරුව සාර්ථකව ඉදිරිපත් කර ඇත", "218441288": "හැදුනුම්පත් අංකය", @@ -215,7 +218,9 @@ "251882697": "ඔබට ස්තූතියි! ඔබගේ ප්‍රතිචාරය අපගේ පද්ධතියට වාර්තා කර ඇත.<0/><0/>කරුණාකර ඉදිරියට යාමට 'හරි' ක්ලික් කරන්න.", "254912581": "මෙම කොටස EMA වලට සමාන වේ, එය ආදාන ලැයිස්තුව සහ ලබා දී ඇති කාල සීමාව මත පදනම්ව ඔබට සම්පූර්ණ EMA රේඛාව ලබා දෙයි.", "256031314": "මුදල් ව්‍යාපාර", + "256123827": "What happens to my trading accounts", "256602726": "ඔබ ඔබේ ගිණුම වසා දැමුවහොත්:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "ගනුදෙනු තක්සේරුව", "260069181": "URL පූරණය කිරීමට උත්සාහ කිරීමේදී දෝෂයක් ඇති විය", @@ -227,7 +232,7 @@ "264976398": "3. රතු පාටින් 'Error' පණිවුඩ​යක් පෙන්වන්නේ නම්, එමඟින් වහාම විසඳිය යුතු දෙයක් ඉස්මතු කරයි.", "265644304": "ගනුදෙනු වර්ග", "267992618": "වේදිකාවල ප්‍රධාන විශේෂාංග හෝ ක්‍රියාකාරීත්වය නොමැත.", - "268940240": "ඔබගේ ශේෂය ({{format_balance}} {{currency}}) දැනට අවසර දී ඇති අවම මුදල් ආපසු ({{format_min_withdraw_amount}} {{currency}}) ට වඩා අඩුය. ඔබගේ මුදල් ආපසු ගැනීම දිගටම කරගෙන යාමට කරුණාකර ඔබගේ ගිණුම ඉහළට ඔසවා තබන්න.", + "268940240": "ඔබේ ශේෂය ({{format_balance}} {{currency}}) දැනට අවසර දී ඇති අවම ආපසු ගැනීමේ මුදලට ({{format_min_withdraw_amount}} {{currency}}) වඩා අඩුය. ඔබේ මුදල් ආපසු ගැනීම දිගටම කරගෙන යාමට කරුණාකර ඔබේ ගිණුම top up කරන්න.", "269322978": "ඔබේ රටේ සෙසු ගනුදෙනුකරුවන් සමඟ peer-to-peer හුවමාරු හරහා ඔබේ දේශීය මුදල් ඒකකය සමඟ තැන්පතු සිදු කරන්න.", "269607721": "උඩුගත කරන්න", "270339490": "ඔබ 'Over' තෝරා ගන්නේ නම්, අවසාන සලකුණෙහි අවසාන ඉලක්කම ඔබේ අනාවැකියට වඩා වැඩි නම් ඔබ ගෙවීම දිනා ගනු ඇත.", @@ -250,8 +255,8 @@ "284527272": "ප්‍රති මාදිලිය", "284772879": "ගිවිසුම", "284809500": "Financial ආදර්ශනය", + "285909860": "Demo {{currency}} Wallet", "287934290": "ඔබට මෙම ගනුදෙනුව අවලංගු කිරීමට අවශ්‍ය බව ඔබට විශ්වාස ද?", - "289898640": "භාවිත නියම", "291744889": "<0>1. ගනුදෙනු පරාමිතීන්:<0>", "291817757": "අපගේ Deriv ප්‍රජාව වෙත ගොස් API, API ටෝකන, Deriv API භාවිතා කළ හැකි ක්‍රම සහ තවත් බොහෝ දේ ගැන ඉගෙන ගන්න.", "292491635": "ඔබ \"Stop loss\" තෝරා ගෙන ඔබේ පාඩුව සීමා කර ගැනීමට මුදලක් සඳහන් කළහොත්, ඔබේ පාඩුව මෙම මුදලට වඩා වැඩි හෝ සමාන වූ විට ඔබේ ස්ථානය ස්වයංක්‍රීයව වසා දමනු ඇත. ගිවිසුම වසා දැමීමේදී ඇති වෙළඳපල මිල අනුව ඔබේ පාඩුව ඔබ ඇතුළත් කළ මුදලට වඩා වැඩි විය හැක.", @@ -299,6 +304,7 @@ "344418897": "මෙම ගනුදෙනු සීමා සහ ස්වයං ව්‍යවර්තන මඟින් ඔබ {{brand_website_name}} සඳහා වියදම් කරන මුදල් හා කාලය පාලනය කිරීමට සහ <0>වගකීම්සහගත ලෙස ගනුදෙනු කිරීමට හැකි වේ.", "345320063": "වලංගු නොවන කාල මුද්‍රාව", "345818851": "කණගාටුයි, අභ්‍යන්තර දෝෂයක් සිදු විය. නැවත උත්සාහ කිරීමට ඉහත සලකුණු කොටුව ක්ලික් කරන්න.", + "346214602": "A better way to manage your funds", "347029309": "Forex: සම්මත/ක්ෂුද්‍ර", "347039138": "පුනරුච්චාරණය කරන්න (2)", "347217485": "ඔබගේ ජංගම දුරකථනයෙන් Deriv MT5 වෙත ප්‍රවේශ වීමේ අපහසුතාවයක් තිබේ ද?", @@ -324,7 +330,7 @@ "368160866": "ලැයිස්තුවේ", "369035361": "<0>• ඔබගේ ගිණුම් අංකය", "371151609": "අවසන් වරට භාවිත කළේ", - "371710104": "මෙම විෂය පථය මඟින් තෙවන පාර්ශවීය යෙදුම් ඔබ වෙනුවෙන් ගිවිසුම් මිලදී ගැනීමට සහ විකිණීමට, කල් ඉකුත් වූ මිලදී ගැනීම් අලුත් කිරීමට සහ ඔබේ ආදර්ශන ගිණුම් ඉහළ දැමීමට ඉඩ ලබා දේ.", + "371710104": "මෙම විෂය පථය මඟින් තෙවන පාර්ශවීය යෙදුම් ඔබ වෙනුවෙන් ගිවිසුම් මිලදී ගැනීමට සහ විකිණීමට, කල් ඉකුත් වූ මිලදී ගැනීම් අලුත් කිරීමට සහ ඔබේ ආදර්ශන ගිණුම් top up කිරීමට ඉඩ ලබා දේ.", "372291654": "බැහැර කාලය අද දිනට පසු විය යුතුය.", "372645383": "වෙළඳපල දිශාව තේරීමට ගැලපේ නම් සත්‍යකි", "373021397": "අහඹු", @@ -353,6 +359,7 @@ "401345454": "එසේ කිරීමට නිබන්ධන ටැබය වෙත යන්න.", "402343402": "අපගේ සේවාදායකයේ ඇති ගැටළුවක් හේතුවෙන්, ඔබගේ සමහර ගිණුම් {{platform}} මේ මොහොතේ ලබා ගත නොහැක. කරුණාකර අප සමඟ දරා ගන්න, ඔබේ ඉවසීමට ස්තූතියි.", "403456289": "SMA සඳහා සූත්‍රය:", + "403608958": "Select a trading account or a Wallet", "404743411": "මුළු තැන්පතු", "406359555": "ගිවිසුම් විස්තර", "406497323": "අවශ්‍ය නම් ඔබේ ක්‍රියාකාරී ගිවිසුම​ විකුණන්න (විකල්ප වශයෙන්)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "එක් එක් වාර්තාව අතර ඔබ කැමති කාල පරතරය:", "431267979": "යන එන අතරතුර දී Deriv බොට් භාවිත කරන ආකරය පිළිබඳ ඉක්මන් මාර්ගෝපදේශයක් මෙන්න.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Take Profit: {{ currency }} {{ take_profit }}", "432519573": "ලේඛනය උඩුගත කරන ලදී", @@ -453,12 +461,12 @@ "518955798": "7. ආරම්භයේදී එක් වරක් ධාවනය කරන්න", "520136698": "Boom 500 දර්ශකය", "521872670": "අයිතමය", - "522283618": "ඩිජිටල් විකල්ප ගනුදෙනු පළපුරුද්ද", "522703281": "විසින් බෙදිය හැකි", "523123321": "- දී ඇති අංකයක 10යේ බලය", "524459540": "මම විචල්‍යයන් නිර්මාණය කරන්නේ කෙසේද?", "527329988": "මෙය සුලභ ම මුරපද 100 අතර ඇත", "529056539": "විකල්ප", + "530864956": "Deriv Apps", "530953413": "අනුමත අයදුම්පත්", "531114081": "3. ගිවිසුම් වර්ගය", "531675669": "යුරෝ", @@ -473,10 +481,13 @@ "543915570": "Forex, කොටස්, කොටස් දර්ශක, ක්‍රිප්ටෝ මුදල්, කෘත්‍රිම​ දර්ශක", "545476424": "මුළු ආපසු ගැනීම්", "549479175": "Deriv ගුණක", + "549799607": "Go to LiveChat", "550589723": "වත්මන් ස්ථාන මිල පෙර ස්ථාන මිලට වඩා ±{{tick_size_barrier}} ක් තුළ පවතින තෙක් ඔබේ කොටස් සලකුණකට {{growth_rate}}% බැගින් වර්ධනය වේ.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "ගනුදෙනු සීමා ගැන තව දැන ගන්න", "554135844": "සංස්කරණය කරන්න", "554410233": "මෙය සුලභ ම මුරපද 10 අතර ඇත", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "ගනුදෙනු පරාමිතීන් සහ ගනුදෙනු විකල්ප නිර්වචනය කිරීමෙන් පසුව, නිශ්චිත කොන්දේසි සපුරාලන විට ගිවිසුම් මිලදී ගැනීමට ඔබට ඔබේ බොට් වෙත උපදෙස් දීමට අවශ්‍ය විය හැකිය. එය සිදු කිරීමට ඔබේ බොට් හට තීරණ ගැනීම සඳහා සහය වීමට කොන්දේසි සහිත කොටස් සහ දර්ශක කොටස් භාවිත කළ හැකිය.", "555881991": "ජාතික හැඳුනුම්පත් අංක පත්‍රිකාව", "556264438": "කාල විරාමය", @@ -552,6 +563,7 @@ "629395043": "සියලුම වර්ධන අනුපාත", "632398049": "මෙම කොටස අයිතමයකට හෝ ප්‍රකාශයකට ශුන්‍ය අගයක් පවරයි.", "634219491": "ඔබ ඔබේ බදු හඳුනාගැනීමේ අංකය සපයා නැත. නීතිමය සහ නියාමන අවශ්‍යතා සඳහා මෙම තොරතුරු අවශ්‍ය වේ. කරුණාකර ඔබේ ගිණුම් සැකසීම් තුළ <0>පුද්ගලික විස්තර වෙත ගොස්, ඔබේ නවතම බදු හඳුනාගැනීමේ අංකය පුරවන්න.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.බේරුම්කරණ අවස්ථාවක් සොයාගත නොහැකි නම්, පැමිණිල්ල DRC විසින් හැසිරවිය යුතු නිර්ණය කිරීමේ අදියර කරා ගමන් කරනු ඇත.", "639382772": "කරුණාකර සහය දක්වන ගොනු වර්ගයක් උඩුගත කරන්න.", "640596349": "ඔබට තවමත් කිසිදු දැනුම්දීමක් ලැබී නැත", @@ -562,7 +574,6 @@ "642546661": "ඔබේ පරිගණකයෙන් බලපත්‍රය නැවත උඩුගත කරන්න", "642995056": "ඊ-තැපෑල", "644150241": "ඔබ අවසන් වරට ඔබේ සංඛ්‍යාලේඛන ඉවත් කළ දා සිට ඔබ දිනාගත් ගිවිසුම් ගණන.", - "645016681": "වෙනත් මූල්‍ය උපකරණවල ගනුදෙනු සංඛ්‍යාතය", "645902266": "EUR/NZD", "647039329": "ලිපිනය සනාථ කිරීම අවශ්‍ය වේ", "647745382": "ආදාන ලැයිස්තුව {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "පහත උදාහරණයේ දී, ආරම්භක මිල තෝරා ගෙන, පසුව එය “op” යනුවෙන් හැඳින්වෙන විචල්‍යකට පවරනු ලැබේ.", "666724936": "කරුණාකර වලංගු හැඳුනුම්පත් අංකයක් ඇතුළත් කරන්න.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "අධිකරණ බලය සහ නීතිය තෝරා ගැනීම", "674973192": "ඩෙස්ක්ටොප්, වෙබ්, සහ ජංගම යෙදුම් මත ඔබගේ Deriv MT5 ගිණුම් වෙත පුරනය වීමට මෙම මුරපදය භාවිත කරන්න.", "676159329": "පෙරනිමි ගිණුමට මාරු විය නොහැක.", @@ -605,7 +617,7 @@ "685391401": "ඔබට පුරනය වීමේ ගැටලුවක් ඇත්නම්, <0>කථාබස් හරහා අපට දන්වන්න", "686312916": "ගනුදෙනු කිරීමේ ගිණුම්", "686387939": "මම මගේ ගනුදෙනු ලොගය හිස් කරන්නේ කෙසේද?", - "687193018": "ලිස්සා යාමේ අවදානම", + "687193018": "ලිස්සුම් අවදානම", "687212287": "'මුදල' යනු අවශ්‍ය ක්ෂේත්‍රයකි.", "688510664": "ඔබට මෙම උපාංගයේ {{two_fa_status}} 2FA ඇත. ඔබ ඔබේ වෙනත් උපාංගවලින් පුරනය් වී ඇති ගිණුම්වලින්ද (තිබේ නම්) ඉවත් වනු ඇත. නැවත පුරනය වීමට ඔබේ මුරපදය සහ 2FA කේතය භාවිත කරන්න.", "689137215": "ගැනුම් මිල", @@ -613,6 +625,7 @@ "692354762": "කරුණාකර ඔබේ ඇතුළත් කරන්න {{document_name}}. {{example_format}}", "693396140": "ගනුදෙනුව අවලංගු කිරීම (කල් ඉකුත් වූ)", "694035561": "ගනුදෙනු විකල්ප ගුණක", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- විවෘත වේලාව: ආරම්භක කාල​ මුද්‍රාව​", "697630556": "මෙම වෙළඳපල දැනට වසා ඇත.", "698037001": "ජාතික හැඳුනුම්පත් අංකය", @@ -624,8 +637,8 @@ "701647434": "පාඨය සොයන්න", "702451070": "ජාතික හැඳුනුම්පත (ඡායාරූපයක් නොමැත)", "702561961": "තේමාව වෙනස් කරන්න", + "705262734": "Your Wallets are ready", "705299518": "ඊළඟට, ඔබගේ ඡායාරූපය අඩංගු ඔබගේ විදේශ ගමන් බලපත්‍රයේ පිටුව උඩුගත කරන්න.", - "706413212": "මුදල් අයකැමි වෙත ප්‍රවේශ වීම සඳහා, ඔබ දැන් සිටින්නේ ඔබේ {{regulation}} {{currency}} ({{loginid}}) ගිණුමේ ය.", "706727320": "ද්විමය විකල්ප ගනුදෙනු සංඛ්‍යාතය", "706755289": "මෙම කොටස ත්‍රිකෝණමිතික කෘත්‍ය සිදු කරයි.", "706960383": "ඔබේ ගිවිසුම කල් ඉකුත්වීමට පෙර එය විකිණීමට තෝරා ගන්නේ නම් අපි මෙම මිලට මිලදී ගැනීමට ඉදිරිපත් වෙමු. මෙම ආදිය වත්මන් ස්ථානයේදීම මිල, කාල සීමාව, ලෙස සාධක කිහිපයක් මත පදනම් වේ, කෙසේ වෙතත්, අපි ඉතිරි කාල සීමාව තත්පර 60 ට අඩු නම් ගිවිසුම්ක් අගය ලබා නැහැ.", @@ -644,6 +657,7 @@ "720293140": "පිටවන්න", "720519019": "මගේ මුරපදය යළි සකසන්න", "721011817": "- පළමු අංකය දෙවන අංකයේ බලයට ඔසවන්න", + "722797282": "EU-regulated USD accounts", "723045653": "ඔබ මෙම ඊ-තැපැල් ලිපිනය සමග ඔබගේ Deriv ගිණුමට පුරනය වෙයි.", "723961296": "මුරපදය කළමනාකරණය කරන්න", "724203548": "ඔබට ඔබේ පැමිණිල්ල <0>European Commission's Online Dispute Resolution (ODR) වේදිකාවට යැවිය හැක. මෙය එක්සත් රාජධානියේ ගනුදෙනුකරුවන්ට අදාළ නොවේ.", @@ -656,6 +670,7 @@ "734390964": "ප්‍රමාණවත් නොවන ශේෂය", "734881840": "අසත්‍ය", "742469109": "ශේෂය යළි සකසන්න", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Forex, ව්‍යුත්පන්න දර්ශක, ක්‍රිප්ටෝ මුදල් සහ ඉහළ උත්තෝලනයක් සහිත වෙළඳ භාණ්ඩ මත CFD ගනුදෙනු කරන්න.", "743623600": "යොමුව", "744110277": "Bollinger Bands Array (BBA)", @@ -689,6 +704,7 @@ "775706054": "ඔබ ගනුදෙනු බොට් විකුණනවා ද?", "776085955": "උපාය මාර්ග", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "මෑත වසරවල් මඟ හරින්න", "784311461": "Exponential Moving Average (EMA)", "784583814": "ඔබේ පරිගණකයට සම්බන්ධ කර ඇත", @@ -725,6 +741,7 @@ "818447476": "ගිණුම මාරු කරන්න ද?", "820877027": "කරුණාකර ඔබේ අනන්‍යතාවය පිළිබඳ සාක්ෂි සත්‍යාපනය කරන්න", "821163626": "සේවාදායක නඩත්තුව මාසයේ සෑම පළමු සෙනසුරාදාවකම GMT වේලාවෙන් 7 සිට 10 දක්වා සිදු වේ. මෙම කාලය තුළ ඔබට සේවා බාධා ඇති විය හැක.", + "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": "පෙළ අඩංගු විය හැකි කොටසකි.", "824797920": "ලැයිස්තුව ශූන්‍ය ද?", "825042307": "නැවත උත්සාහ කරමු", @@ -747,7 +764,6 @@ "836097457": "මම ගනුදෙනු කිරීමට දැඩි උනන්දුවක් දක්වන නමුත් මට එතරම් අත්දැකීම් නැත.", "837063385": "මෙම ලිපිනයට වෙනත් මුදල් ඒකක යවන්න එපා.", "837066896": "ඔබේ ලේඛනය සමාලෝචනය වෙමින් පවතී., කරුණාකර දින 1-3 කින් නැවත පරීක්ෂා කරන්න.", - "839618971": "ලිපිනය", "839805709": "ඔබව සුමටව සත්‍යාපනය කිරීමට, අපට වඩා හොඳ ඡායාරූපයක් අවශ්‍ය වේ", "840672750": "මෙය ක්‍රියා නොකරන්නේ නම්, MT5 යෙදුම අස්ථාපනය කර නැවත ස්ථාපනය කරන්න. ඉන්පසු <0>2 සහ <0>3 පියවර නැවත කරන්න.", "841434703": "ඇසිරීම අක්‍රිය කරන්න", @@ -762,7 +778,7 @@ "851508288": "මෙම කොටස නියමිත පරාසයක් තුළ දී ඇති අංකයක් සීමා කරයි.", "852527030": "පියවර 2", "852583045": "ටික් සංගීත භාජනයට", - "854399751": "Digit කේතයේ අඩංගු විය යුත්තේ අංක පමණි.", + "854399751": "අංක කේතයේ අඩංගු විය යුත්තේ ඉලක්කම් පමණි.", "854630522": "ක්‍රිප්ටෝ මුදල් ගිණුමක් තෝරන්න", "857363137": "300 (1s) අස්ථායීතා දර්ශකය", "857445204": "Deriv දැනට Tether eUSDT Ethereum පසුම්බිය වෙත ආපසු ගැනීම සඳහා සහය දක්වයි. සාර්ථක ගනුදෙනුවක් සහතික කිරීම සඳහා, ඔබ මුදල් ආපසු ගැනීමට බලාපොරොත්තු වන ටෝකන සමඟ ගැළපෙන පසුම්බි ලිපිනයක් ඇතුළත් කරන්න. <0>තවත් දැනගන්න", @@ -784,7 +800,7 @@ "872721776": "2. ඔබේ XML ගොනුව තෝරා තෝරන්න ඔබන්න.", "872817404": "පිවිසුම් ස්ථානයේ වේලාව", "873166343": "1. 'Log' නිතිපතා පණිවිඩයක් පෙන්වයි.", - "874461655": "ඔබගේ දුරකථනයෙන් QR කේතය පරිලෝකනය කරන්න", + "874461655": "ඔබගේ දුරකථනයෙන් QR කේතය ස්කෑන් කරන්න", "874484887": "Take profit ධනාත්මක අංකයක් විය යුතුය.", "875101277": "මම මගේ වෙබ් බ්‍රවුසරය වසා දැමුවහොත්, Deriv බොට් දිගටම ක්‍රියාත්මක වේද?", "875532284": "වෙනත් උපාංගයක ක්රියාවලිය නැවත ආරම්භ කරන්න", @@ -820,7 +836,7 @@ "912406629": "මෙම පියවර අනුගමනය කරන්න:", "912967164": "ඔබේ පරිගණකයෙන් ආයාත කරන්න", "915735109": "{{platform_name}} වෙත ආපසු", - "918447723": "සැබෑ", + "918447723": "සැබෑ ගිණුම", "920125517": "ආදර්ශන ගිණුම එක් කරන්න", "921901739": "- ඔබගේ ගිණුමට සම්බන්ධ බැංකුවේ ඔබගේ ගිණුම් විස්තර", "922313275": "ඔබ නැවත මාර්ගගතව සිටී", @@ -844,13 +860,13 @@ "943535887": "කරුණාකර පහත Deriv MT5 ගිණුම(ම්) තුළ ඔබගේ තනතුරු වසා දමන්න:", "944499219": "උපරිම විවෘත ස්ථාන", "945532698": "ගිවිසුම විකුණා ඇත", + "945753712": "Back to Trader’s Hub", "946204249": "කියවන්න", "946841802": "සුදු (හෝ කොළ) ඉටිපන්දමක් පෙන්නුම් කරන්නේ විවෘත මිල ආසන්න මිලට වඩා අඩු බවයි. මෙය වෙළඳපල මිල ඉහළ යාමක් නියෝජනය කරයි.", - "946944859": "පහත බොත්තම එබූ විට අපි ඔබට සබැඳියක් සහිත ඊ-තැපෑලක් එවන්නෙමු. ඔබේ මුදල් ආපසු ගැනීමේ ඉල්ලීම සත්‍යාපනය කිරීමට එම සබැඳිය ක්ලික් කරන්න.", "947046137": "ඔබගේ මුදල් ආපසු ගැනීම පැය 24ක් ඇතුළත සකසනු ලැබේ", "947363256": "ලැයිස්තුව සාදන්න", "947758334": "නගරය​ අවශ්‍යයි", - "947914894": "එක් කරන්න  <0>", + "947914894": "Top up කරන්න  <0>", "948156236": "{{type}} මුරපදය සාදන්න", "948176566": "අලුත්!", "948545552": "150+", @@ -934,7 +950,7 @@ "1040472990": "1. Bot Builder වෙත යන්න.", "1040677897": "ගනුදෙනු දිගටම කරගෙන යාමට, ඔබ ලිපිනය පිළිබඳ සාක්ෂියක් ද ඉදිරිපත් කළ යුතුය.", "1041001318": "මෙම කොටස ලබා දී ඇති ලැයිස්තුවක් මත පහත මෙහෙයුම් සිදු කරයි: එකතුව, අවම, උපරිම, සාමාන්‍යය, මධ්‍ය, ප්‍රකාරය, ප්‍රතිමාතය, සම්මත අපගමනය, අහඹු අංකය.", - "1041620447": "ඔබට QR කේතය පරිලෝකනය කිරීමට නොහැකි නම්, ඒ වෙනුවට ඔබට මෙම කේතය අතින් ඇතුල් කළ හැක:", + "1041620447": "ඔබට QR කේතය ස්කෑන් කිරීමට නොහැකි නම්, ඒ වෙනුවට ඔබට මෙම කේතය හස්තීයව ඇතුළත් කළ හැකිය:", "1042659819": "ඔබට ක්‍රියා කළ යුතු ගිණුමක් ඇත", "1043790274": "දෝෂයක් තිබුණි", "1044540155": "100+", @@ -950,6 +966,7 @@ "1050128247": "ගෙවීම් නියෝජිතයාගේ හුවමාරු තොරතුරු මා සත්‍යාපනය කර ඇති බව මම තහවුරු කරමි.", "1050844889": "වාර්තා", "1052779010": "ඔබ සිටින්නේ ඔබේ ආදර්ශන ගිණුමේය", + "1052921318": "{{currency}} Wallet", "1053153674": "Jump 50 දර්ශකය", "1053159279": "අධ්‍යාපන මට්ටම", "1053556481": "ඔබ ඔබේ පැමිණිල්ල ඉදිරිපත් කළ පසු, අපට එය ලැබී ඇති බව තහවුරු කිරීම සඳහා අපි ඔබට පිළිගැනීමේ ඊ-තැපැලක් එවන්නෙමු.", @@ -959,7 +976,7 @@ "1057216772": "{{ input_text }} පාඨය හිස්ය", "1057749183": "ද්වි-සාධක සත්‍යාපනය (2FA)", "1057765448": "Stop out මට්ටම", - "1057904606": "D’Alembert උපාය මාර්ගයේ සංකල්පය Martingale උපාය මාර්ගයට සමාන යැයි කියනු ලැබේ, එහිදී ඔබ අලාභයකින් පසු ඔබේ ගිවිසුම් ප්‍රමාණය වැඩි කරනු ඇත. D’Alembert උපායමාර්ගය සමඟ, සාර්ථක ගනුදෙනුවකින් පසු ඔබ ඔබේ ගිවිසුම් ප්‍රමාණයද අඩු කරනු ඇත.", + "1057904606": "D’Alembert උපාය මාර්ගයේ සංකල්පය Martingale උපාය මාර්ගයට සමාන යැයි කියනු ලැබේ, එහිදී ඔබට අලාභයක් සිදු වූ පසු ඔබේ ගිවිසුමේ ප්‍රමාණය වැඩි කරනු ඇත. D’Alembert උපාය මාර්ගය සමඟ, සාර්ථක ගනුදෙනුවකින් පසු ඔබ ඔබේ ගිවිසුමේ ප්‍රමාණයද අඩු කරනු ඇත.", "1058804653": "කල් ඉකුත්වීම", "1060231263": "ආරම්භක ආන්තිකයක් ගෙවීමට ඔබට අවශ්‍ය වන්නේ කවදාද?", "1061308507": "{{ contract_type }} මිලදී ගැනීම", @@ -979,7 +996,7 @@ "1078221772": "උත්තෝලනය මඟින් විශාල තනතුරු විවෘත කිරීමෙන් වළක්වයි.", "1080068516": "ක්‍රියාව", "1080990424": "තහවුරු කරන්න", - "1082158368": "*උපරිම ගිණුම් මුදල් ශේෂය", + "1082158368": "*ගිණුමේ උපරිම මුදල් ශේෂය", "1082406746": "කරුණාකර අවම වශයෙන් {{min_stake}} ක් වත් කොටස් ප්‍රමාණයක් ඇතුළත් කරන්න.", "1083781009": "බදු හඳුනාගැනීමේ අංකය*", "1083826534": "කොටස සක්‍රීය කරන්න", @@ -1006,17 +1023,18 @@ "1104912023": "සත්‍යාපනය පොරොත්තුවෙන්", "1107474660": "ලිපිනය පිළිබඳ සාක්ෂි ඉදිරිපත් කරන්න", "1107555942": "දක්වා", - "1109217274": "සාර්ථකත්වය!", + "1109217274": "සාර්ථකයි!", "1110102997": "ප්‍රකාශන​ය", "1112582372": "විරාම කාල සීමාව", "1113119682": "මෙම කොටස ඔබට ඉටිපන්දම් ලැයිස්තුවකින් තෝරාගත් ඉටිපන්දම් අගය ලබා දෙයි.", + "1113221217": "MT5 Swap-free", "1113292761": "8MB ට වඩා අඩුය", - "1114679006": "ඔබ සරල උපාය මාර්ගයක් භාවිතා කරමින් ඔබේ බොට් සාර්ථකව නිර්මාණය කර ඇත.", + "1114679006": "ඔබ සරල උපාය මාර්ගයක් භාවිත කරමින් ඔබේ බොට් සාර්ථකව නිර්මාණය කර ඇත.", "1117281935": "කොන්දේසි විකුණන්න (විකල්ප)", "1117863275": "ආරක්ෂාව සහ සුරක්ෂිත බව", "1118294625": "ඔබ {{exclusion_end}} දක්වා අපගේ වෙබ් අඩවියේ ගනුදෙනු වලින් ඔබව බැහැර කිරීමට තෝරාගෙන ඇත. ඔබේ ස්වයං-බැහැර කාලයෙන් පසු ඔබට ගනුදෙනුවක් හෝ තැන්පතුවක් කිරීමට නොහැකි නම්, කරුණාකර සජීවී කතාබස් හරහා අප හා සම්බන්ධ වන්න.", "1119887091": "සත්‍යාපනය", - "1119986999": "ඔබගේ ලිපිනය සනාථ කිරීම සාර්ථකව ඉදිරිපත් කරන ලදී", + "1119986999": "ඔබේ ලිපිනය සනාථ කිරීම සාර්ථකව ඉදිරිපත් කරන ලදී", "1120985361": "නියමයන් සහ කොන්දේසි යාවත්කාලීන කරන ලදි", "1122910860": "කරුණාකර ඔබේ <0>මූල්‍ය තක්සේරුව සම්පූර්ණ කරන්න.", "1123927492": "ඔබ ඔබේ ගිණුමේ මුදල් තෝරාගෙන නැත", @@ -1036,6 +1054,7 @@ "1134879544": "දීප්තිය සහිත ලේඛනයක උදාහරණයක්", "1138126442": "Forex: සම්මත", "1139483178": "තොගය සබල කරන්න", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "දිශාව {{ direction_type }}", "1144028300": "Relative Strength Index Array (RSIA)", "1145927365": "දී ඇති තත්පර ගණනකට පසු කොටස් ඇතුළත ධාවනය කරන්න", @@ -1066,7 +1085,6 @@ "1174689133": "3. ඔබේ වෙළඳ පරාමිතීන් සකසා ධාවනය කරන්න.", "1174748431": "ගෙවීම් නාලිකාව", "1175183064": "Vanuatu", - "1176926166": "වෙනත් මූල්‍ය උපකරණ ගනුදෙනු කිරීමේ පළපුරුද්ද", "1177396776": "ඔබ \"Asian Fall\", තෝරා ගන්නේ නම්, අවසාන සලකුණ අනෙක්​ සලකුණුවල සාමාන්‍යයට වඩා අඩු නම් ඔබ විසින් ගෙවීම දිනා ගනු ඇත.", "1177723589": "සංදර්ශන කිරීමට ගනුදෙනු නොමැත", "1178582280": "ඔබ අවසන් වරට ඔබේ සංඛ්‍යාලේඛන ඉවත් කළ දා සිට ඔබට අහිමි වූ ගිවිසුම් ගණන.", @@ -1077,13 +1095,14 @@ "1181396316": "මෙම කොටස ඔබට නියමිත පරාසයක් තුළ සිට අහඹු අංකයක් ලබා දෙයි", "1181770592": "විකිණීමෙන් ලාභ/අලාභය", "1183007646": "- ගිවිසුම් වර්ගය: Rise, Fall, Touch, No Touch, වැනි ගිවිසුමේ නම.", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "දැන් ඔබේ ගිවිසුම වසා දමන්න හෝ එය ක්‍රියාත්මක කරන්න. ඔබ එය දිගටම ක්‍රියාත්මක කිරීමට තීරණය කරන්නේ නම්, ඔබට එය පසුව පරීක්ෂා කර වසා දැමිය හැක ", "1188316409": "ඔබේ අරමුදල් ලබා ගැනීම සඳහා, පහත විස්තර සමඟ ගෙවීම් නියෝජිතයා අමතන්න", "1188980408": "විනාඩි 5 යි", "1189249001": "4.1. පැමිණිල්ලක් ලෙස සලකන්නේ කුමක්ද?", "1189368976": "ඔබගේ අනන්‍යතාවය තහවුරු කිරීමට පෙර කරුණාකර ඔබගේ පුද්ගලික තොරතුරු සම්පූර්ණ කරන්න.", "1191429031": "ඔබේ <0>{{platform_name_dxtrade}} මුරපදය වෙනස් කිරීමට කරුණාකර ඊ-තැපෑලෙහි ඇති සබැඳිය ක්ලික් කරන්න.", - "1191644656": "වෙළඳපල දිශාව පුරෝකථනය කර ස්ථානයක් විවෘත කිරීමට \"Up\" හෝ \"Down\" තෝරන්න. ඔබ තනතුරක් විවෘත කරන විට අපි කොමිස් මුදලක් අය කරන්නෙමු.", + "1191644656": "වෙළඳපල දිශාව පුරෝකථනය කර ස්ථානයක් විවෘත කිරීමට \"Up\" හෝ \"Down\" තෝරන්න. ඔබ ස්ථානයක් විවෘත කරන විට අපි කොමිස් මුදලක් අය කරන්නෙමු.", "1192708099": "කාලසීමාවේ ඒකකය", "1195393249": "ශබ්දය සමඟ {{ notification_type }} දැනුම් දෙන්න: {{ notification_sound }} {{ input_message }}", "1196006480": "ලාභ සීමාව", @@ -1094,12 +1113,14 @@ "1201773643": "සංඛ්‍යාත්මක", "1203297580": "මෙම කොටස ටෙලිග්‍රාම් නාලිකාවකට පණිවිඩයක් යවයි.", "1204223111": "මෙම උදාහරණයේ දී, ඉටිපන්දම් ලැයිස්තුවකින් විවෘත මිල ගණන් \"candle_list\" යනුවෙන් හැඳින්වෙන විචල්‍යයකට පවරනු ලැබේ.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "ඔබේ කාඩ්පත ආවරණය කරන්නේ කෙසේද?", "1206821331": "සන්නද්ධ හමුදා", "1207152000": "අච්චුවක් තෝරාගෙන ඔබේ ගනුදෙනු පරාමිතීන් සකසන්න.", "1208714859": "කෙටි සඳහා:", - "1208729868": "Ticks", + "1208729868": "සලකුණු", "1208903663": "වලංගු නොවන ටෝකනය", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "බොට් ආරම්භ වේ", "1214893428": "ජංගම දුරකථන සඳහා ගිණුම් නිර්මාණය දැනට ලබා ගත නොහැක. නව ගිණුමක් සෑදීමට කරුණාකර ඔබේ පරිගණකය සමඟ පුරනය වන්න.", "1216408337": "ස්වයං රැකියාලාභීන්", @@ -1112,15 +1133,17 @@ "1222521778": "තැන්පතු සහ මුදල් ආපසු ගැනීම දුෂ්කර ය.", "1222544232": "අපි ඔබට ඊ-තැපෑලක් එවා ඇත", "1225150022": "වත්කම් ගණන", + "1226027513": "Transfer from", "1227074958": "අහඹු භාගය", "1227240509": "අවකාශයන් කපා දමන්න", "1228534821": "සමහර මුදල් ඔබගේ රටේ ගෙවීම් නියෝජිතයින්ගේ සහාය නොලැබෙනු ඇත.", "1229883366": "බදු හඳුනාගැනීමේ අංකය", - "1230884443": "රජයේ/පළාත (විකල්ප)", + "1230884443": "රජය/පළාත (අත්‍යවශ්‍ය නොවේ)", "1231282282": "පහත සඳහන් විශේෂ අක්ෂර පමණක් භාවිතා කරන්න: {{permitted_characters}}", "1232291311": "ඉතිරිව ඇති උපරිම මුදල් ආපසු ගැනීම", "1232353969": "පසුගිය මාස 12 තුළ ගනුදෙනු 0-5", "1233300532": "ගෙවීම්", + "1233376285": "Options & multipliers", "1234292259": "ධන මූලාශ්‍රය", "1234764730": "පුද්ගලික විස්තර අංශයෙන් ඔබගේ නම සහ ඊ-තැපැල් ලිපිනය දිස් වන තිර රුවක් උඩුගත කරන්න.", "1235426525": "50%", @@ -1136,7 +1159,7 @@ "1242994921": "ඔබගේ Deriv බොට් ගොඩනැගීම ආරම්භ කිරීමට මෙතන ක්ලික් කරන්න.", "1243064300": "දේශීය", "1243287470": "ගනුදෙනු තත්ත්වය", - "1246207976": "ඔබගේ 2FA යෙදුම මගින් ජනනය කරන ලද සත්‍යාපන කේතය ඇතුලත් කරන්න:", + "1246207976": "ඔබේ 2FA යෙදුම මඟින් ජනනය කරන ලද සත්‍යාපන කේතය ඇතුළත් කරන්න:", "1246880072": "නිකුත් කරන රට තෝරන්න", "1247280835": "පද්ධති නඩත්තුව හේතුවෙන් අපගේ ක්‍රිප්ටෝ මුදල් අයකැමි තාවකාලිකව පහත බැස ඇත. නඩත්තු කටයුතු අවසන් වූ විට ඔබට මිනිත්තු කිහිපයකින් ක්‍රිප්ටෝ මුදල් තැන්පතු සහ මුදල් ආපසු ලබා ගත හැකිය.", "1248018350": "ආදායම් මාර්ගය", @@ -1166,6 +1189,7 @@ "1281045211": "දී ඇති ලැයිස්තුවක ඇති අයිතම, ඒවායේ සංඛ්‍යාත්මක හෝ අකාරාදී අගය අනුව, ආරෝහණ හෝ අවරෝහණ අනුපිළිවෙලින් වර්ග කරයි.", "1281290230": "තෝරන්න", "1282951921": "Only Downs", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "\"Loss\" තෝරා ගෙන තිබේ නම්, ඔබේ අවසන් ගනුදෙනුව අසාර්ථක වූ විට එහි අගය \"සත්‍ය\" ලෙස ආපසු ලැබෙනු ඇත. එසේ නොමැති නම්, එය හිස් පාඨයක් ආපසු ලැබෙනු ඇත.", "1286094280": "ආපසු ගන්න", "1286507651": "අනන්‍යතා සත්‍යාපන තිරය වසන්න", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "ආන්තික ඇමතුම", "1290525720": "උදාහරණය: ", - "1291887623": "ඩිජිටල් විකල්ප ගනුදෙනු සංඛ්‍යාතය", "1291997417": "ඔබ තෝරාගත් කල් ඉකුත් වීමේ දිනයේ ගිවිසුම් හරියටම 23:59:59 GMT හි කල් ඉකුත් වේ.", "1292188546": "Deriv MT5 ආයෝජක මුරපදය නැවත සකසන්න", "1292891860": "ටෙලිග්‍රෑම් වෙත දැනුම් දෙන්න", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (විකුණුම්)", "1329136554": "Jump 200 දර්ශකය", "1329325646": "මෙම කොටසෙහි අන්තර්ගතය සෑම සලකුණකම හැඳින්වේ", + "1330479159": "Ready to upgrade?", "1331199417": "කරුණාකර නිවැරදි ආකෘතිය ඇතුළත් කරන්න. ", "1331367811": "සේවාලාභියාගේ ගිණුම් අංකය", "1332168410": "තව දැන ගන්න", @@ -1257,7 +1281,6 @@ "1367023655": "ඔබේ අලාභය ඔබේ කොටස ඉක්මවා නොයන බව සහතික කිරීම සඳහා, ඔබේ අලාභය සමාන වන විට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත<0/>.", "1367488817": "4. වෙළඳ කොන්දේසි නැවත ආරම්භ කරන්න", "1367990698": "10 අස්ථායීතා දර්ශකය", - "1369709538": "අපගේ භාවිත නියමයන්", "1370647009": "ඉහළ දෛනික සීමාවන් භුක්ති විඳින්න", "1371193412": "අවලංගු කරන්න", "1371555192": "ඔබ කැමති ගෙවීම් නියෝජිතයා තෝරාගෙන ඔබේ මුදල් ආපසු ගැනීමේ මුදල ඇතුළත් කරන්න. ඔබේ ගෙවීම් නියෝජිතයා ලැයිස්තුගත කර නොමැති නම්, <0>ඔවුන්ගේ ගිණුම් අංකය භාවිතා කර ඒවා සොයන්න.", @@ -1314,11 +1337,12 @@ "1430396558": "5. දෝෂය මත මිලදී ගැනීම/විකිණීම නැවත ආරම්භ කරන්න", "1430632931": "වෙළඳාම ලබා ගැනීම සඳහා, කරුණාකර ඔබ කවුරුන්ද යන්න සහ ඔබ ජීවත් වන්නේ කොතැනද යන්න තහවුරු කරන්න.", "1433367863": "කණගාටුයි, ඔබගේ ඉල්ලීම සැකසීමේදී දෝෂයක් ඇතිවිය.", - "1433468641": "අපගේ නියමයන් සහ කොන්දේසි වල සඳහන් ඒවා හැරුණු විට අපි සියලුම රටවල අපගේ සේවාවන් ලබා දෙන්නෙමු.", + "1433468641": "අපි අපගේ නියම සහ කොන්දේසිවල සඳහන් රටවල හැර, සියලුම රටවල අපගේ සේවා පිරිනමන්නෙමු", "1434382099": "පණිවිඩයක් සහිත සංවාද කවුළුවක් පෙන්වයි", "1434767075": "ඩෙරිව් බොට් මත ආරම්භ කරන්න", "1434976996": "නිවේදනය", "1435363248": "මෙම කොටසෙන් Unix Epoch සිට ඇති තත්පර ගණන 2019-08-01 00: 00: 00 වැනි දිනය සහ වේලාව සහිත ආකෘතියකට පරිවර්තනය කරයි.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "අවම තැන්පතුව", "1437396005": "අදහස් එක් කරන්න", "1438247001": "පහත සඳහන් කරුණු හේතුවෙන් වෘත්තීය සේවාදායකයෙකුට අඩු සේවාදායක ආරක්ෂාවක් ලැබේ.", @@ -1369,6 +1393,7 @@ "1476301886": "SMA හා සමානව, මෙම කොටස ඔබට ලබා දී ඇති කාල සීමාවක් සඳහා සියලු අගයන් ලැයිස්තුවක් අඩංගු සම්පූර්ණ SMA රේඛාව ලබා දෙයි.", "1478030986": "වෙළඳාම සහ මුදල් ආපසු ගැනීම සඳහා API ටෝකන සාදන්න හෝ මකා දමන්න", "1480915523": "මඟ හරින්න", + "1481860194": "Your new Wallet(s)", "1481977420": "ඔබගේ මුදල් ආපසු ගැනීමේ ඉල්ලීම සත්යාපනය කිරීමට කරුණාකර අපට උදව් කරන්න.", "1483470662": "ඔබගේ ගිණුම සමඟ වෙළඳාම ආරම්භ කිරීමට 'විවෘත' ක්ලික් කරන්න", "1484336612": "මෙම කොටස ලූපයක් අවසන් කිරීමට හෝ දිගටම කරගෙන යාමට භාවිතා කරන අතර ලූප බ්ලොක් එකක් තුළ ඕනෑම තැනක තැබිය හැකිය.", @@ -1389,8 +1414,9 @@ "1505420815": "ඔබගේ සෙවීම සඳහා ගෙවීම් නියෝජිතයන් හමු නොවීය", "1505898522": "අඩුක්කුව බාගත", "1505927599": "අපේ සේවාදායක තද පහරකට ලක් විය. ඉදිරියට යාමට නැවුම් කරමු.", + "1506251760": "Wallets", "1509559328": "CTrader", - "1509570124": "{{buy_value}} (මිලදී ගන්න)", + "1509570124": "{{buy_value}} (ගැනුම්)", "1509678193": "අධ්යාපන", "1510075920": "රන්/USD", "1510357015": "බදු පදිංචිය අවශ්ය වේ.", @@ -1406,12 +1432,12 @@ "1520332426": "ශුද්ධ වාර්ෂික ආදායම", "1524636363": "සත්යාපනය අසාර්ථකයි", "1526483456": "2. ඔබේ විචල්යය සඳහා නමක් ඇතුළත් කරන්න, සහ පහර සාදන්න. ඔබගේ නව විචල්යය අඩංගු නව කොටස් පහත දිස්වනු ඇත.", - "1527251898": "අසාර්ථක", - "1527664853": "ඔබේ ගෙවීම අවසාන මිල සහ වැඩ වර්ජන මිල අතර වෙනස මගින් ගුණ කරනු ලබන ලක්ෂ්යයකට ගෙවීමකට සමාන වේ.", + "1527251898": "අසාර්ථක විය", + "1527664853": "ඔබේ ගෙවීම අවසන් මිල සහ වර්ජන මිල අතර වෙනසෙන් ගුණ කළ ලක්ෂ්‍යයකට ගෙවීමට සමාන වේ.", "1527906715": "මෙම කොටස තෝරාගත් විචල්යයට ලබා දී ඇති අංකය එකතු කරයි.", "1531017969": "එක් එක් අමුණා ඇති අයිතමයේ පෙළ අගය ඒකාබද්ධ කිරීමෙන් තනි පෙළ නූලක් නිර්මාණය කරයි. අයිතම ගණන ඒ අනුව එකතු කළ හැකිය.", "1533177906": "Fall", - "1534796105": "විචල්ය අගය ලබා ගනී", + "1534796105": "විචල්‍ය අගයක් ලැබේ", "1537711064": "ඔබට මුදල් අයකැමි වෙත පිවිසීමට පෙර ඉක්මන් අනන්යතා සත්යාපනය කළ යුතුය. ඔබගේ අනන්යතාවය පිළිබඳ සාක්ෂි ඉදිරිපත් කිරීමට කරුණාකර ඔබගේ ගිණුම් සැකසුම් වෙත යන්න.", "1540585098": "පරිහානිය", "1541508606": "CFDs සොයනවාද? වෙළෙන්දාගේ කේන්ද්රය වෙත යන්න", @@ -1419,8 +1445,8 @@ "1542742708": "කෘත්‍රිම​ දර්ශක, Forex, කොටස්, කොටස් දර්ශක, වෙළඳ භාණ්ඩ සහ ක්‍රිප්ටෝ මුදල්", "1544642951": "ඔබ “Ups පමණක්” තෝරා ගන්නේ නම්, පිවිසුම් ස්ථානයෙන් පසු අඛණ්ඩව කිනිතුල්ලන් අනුක්රමයෙන් ඉහළ ගියහොත් ඔබ ගෙවීම දිනා ගනී. කිසියම් ටික් එකක් වැටුණහොත් හෝ පෙර කිනිතුල්ලන්ට සමාන නම් ගෙවීමක් නොමැත.", "1547148381": "එම ගොනුව ඉතා විශාලය (8MB දක්වා පමණක් අවසර දී ඇත). කරුණාකර වෙනත් ගොනුවක් උඩුගත කරන්න.", - "1548765374": "ලේඛන අංකය සත්යාපනය කිරීම අසාර්ථකයි", - "1549098835": "මුළු ඉවත්", + "1548765374": "ලේඛන අංකය සත්‍යාපන අසාර්ථක විය", + "1549098835": "මුළු ආපසු ගැනීම්", "1551172020": "AUD කූඩය", "1552162519": "දැක්ම onboarding", "1555345325": "පරිශීලක මාර්ගෝපදේශය", @@ -1449,6 +1475,7 @@ "1577480486": "ඔබගේ ජංගම සබැඳිය පැයකින් කල් ඉකුත් වේ", "1577527507": "ගිණුම් විවෘත කිරීමේ හේතුව අවශ්ය වේ.", "1577612026": "ෆෝල්ඩරයක් තෝරන්න", + "1577879664": "<0>Your Wallets are ready", "1579839386": "ඇප්ස්ටෝර්", "1580498808": "මුහුණු කිහිපයක් හමු විය", "1584109614": "කිනිතුල්ලන් සංගීත ලැයිස්තුව", @@ -1470,8 +1497,8 @@ "1602894348": "මුරපදයක් සාදන්න", "1604916224": "නිරපේක්ෂ", "1605222432": "මට වෙළඳාම පිළිබඳ දැනුමක් හා පළපුරුද්දක් නොමැත.", - "1605292429": "මැක්ස්. මුළු අලාභය", - "1612105450": "සබ්ස්ට්රිං ලබා ගන්න", + "1605292429": "උපරිම මුළු අලාභය", + "1612105450": "උපපෙළ ලබා ගන්න", "1612638396": "නිශ්චිත කාල රාමුවක් තුළ ඕනෑම වේලාවක ඔබේ වෙළඳාම අවලංගු කරන්න.", "1613633732": "පරතරය විනාඩි 10-60 අතර විය යුතුය", "1615897837": "සංඥා EMA කාල සීමාව {{ input_number }}", @@ -1499,17 +1526,19 @@ "1641635657": "අනන්යතා ලේඛනයේ නව සාක්ෂි අවශ්යයි", "1641980662": "ආචාර කිරීම අවශ්ය වේ.", "1644636153": "ගනුදෙනු hash: <0>{{value}}", - "1644703962": "CFD ගිණුම් සොයනවාද? වෙළෙන්දාගේ කේන්ද්රය වෙත යන්න", + "1644703962": "CFD ගිණුම් සොයනවාද? Trader's Hub වෙත යන්න", "1644864436": "වෘත්තීය සේවාදායකයෙකු වීමට ඉල්ලා සිටීමට පෙර ඔබේ ගිණුම <0>සත්යාපනය කිරීමට ඔබට අවශ්ය වනු ඇත.", "1644908559": "ඉලක්කම් කේතය අවශ්ය වේ.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "ධාවනය වන විට බොට් දෝෂයකට මුහුණ දුන්නේය.", "1648938920": "නෙදර්ලන්තය 25", "1649239667": "2. බ්ලොක් මෙනුව යටතේ, ඔබට කාණ්ඩ ලැයිස්තුවක් පෙනෙනු ඇත. මෙම කාණ්ඩ තුළ බ්ලොක් කාණ්ඩගත කර ඇත. ඔබට අවශ්ය කොටස තෝරාගෙන ඒවා වැඩබිම වෙත ඇදගෙන යන්න.", + "1650963565": "Introducing Wallets", "1651513020": "එක් එක් කාල පරතරය සඳහා ඉතිරිව ඇති කාලය පෙන්වන්න", "1651951220": "“abcabcabc” වැනි පුනරාවර්තන “abc” වලට වඩා අනුමාන කිරීමට තරමක් අපහසු වේ", "1652366857": "ලබා ගන්න සහ ඉවත් කරන්න", "1652968048": "ගුණකය සහ කොටස් වැනි ඔබේ වෙළඳ විකල්ප නිර්වචනය කරන්න.", - "1652976865": "මෙම උදාහරණයේ දී, ඉටිපන්දම් ලැයිස්තුවකින් විවෘත මිල ගණන් ලබා ගැනීම සඳහා මෙම කොටස තවත් බ්ලොක් එකක් සමඟ භාවිතා කරයි. විවෘත මිල ගණන් “cl” යනුවෙන් හැඳින්වෙන විචල්යයට පවරනු ලැබේ.", + "1652976865": "මෙම උදාහරණයේ දී, candle ලැයිස්තුවකින් විවෘත මිල ගණන් ලබා ගැනීම සඳහා මෙම බ්ලොක් එක වෙනත් බ්ලොක් එකක් සමඟ භාවිත කරයි. පසුව විවෘත මිල ගණන් \"cl\" නම් විචල්‍යයට පවරනු ලැබේ.", "1653136377": "පිටපත් කර ඇත!", "1653180917": "ඔබගේ කැමරාව භාවිතා නොකර අපට ඔබව සත්යාපනය කළ නොහැක", "1654365787": "නොදන්නා", @@ -1522,13 +1551,13 @@ "1665272539": "මතක තබා ගන්න: තෝරාගත් දිනය වන තෙක් ඔබට ඔබේ ගිණුමට පුරනය විය නොහැක.", "1665738338": "ශේෂය", "1665756261": "සජීවී කතාබස් වෙත යන්න", + "1666783057": "Upgrade now", "1668138872": "ගිණුම් සැකසුම් වෙනස් කරන්න", "1670016002": "ගුණකය: {{ multiplier }}", "1670426231": "අවසන් වේලාව", "1671232191": "ඔබ පහත සඳහන් සීමාවන් නියම කර ඇත:", "1674163852": "කාලසීමාව හෝ අවසාන කාලය සැකසීමෙන් ඔබේ කොන්ත්රාත්තුවේ කල් ඉකුත්වීම තීරණය කළ හැකිය.", "1675030608": "මෙම ගිණුම නිර්මාණය කිරීම සඳහා පළමුව ඔබගේ ලිපිනය පිළිබඳ සාක්ෂි නැවත ඉදිරිපත් කිරීමට අපට අවශ්ය වේ.", - "1675289747": "සැබෑ ගිණුමට මාරු විය", "1676549796": "ගතික උත්තෝලනය", "1677027187": "Forex", "1677990284": "මගේ යෙදුම්", @@ -1536,7 +1565,7 @@ "1680666439": "ඔබගේ නම, ගිණුම් අංකය සහ ගනුදෙනු ඉතිහාසය පෙන්වන ඔබේ බැංකු ප්රකාශය උඩුගත කරන්න.", "1682409128": "නොකැඩූ උපායමාර්ගය", "1682636566": "ඊ-තැපෑල නැවත යවන්න", - "1683522174": "ඉහළ-අප්", + "1683522174": "Top up කරන්න", "1683963454": "ඔබේ ගිවිසුම {{date}} {{timestamp}} ට පවතින මීළඟ වත්කම් මිලට අනුව ස්වයංක්‍රීයව වසා දමනු ඇත.", "1684419981": "මේ මොකක්ද?", "1686800117": "{{error_msg}}", @@ -1556,6 +1585,7 @@ "1703091957": "මුදල් විශුද්ධිකරණයට එරෙහි නීතිවලට අවශ්‍ය වන පරිදි, අපගේ නිසි වගකීම්වල කොටසක් ලෙස අපි ඔබේ රැකියාව පිළිබඳ තොරතුරු රැස් කරන්නෙමු.", "1704656659": "CFD ගනුදෙනු පිළිබඳ ඔබට කොපමණ අත්දැකීම් තිබේ ද?", "1708413635": "ඔබගේ {{currency_name}} {{currency}} ගිණුම සඳහා", + "1709293836": "Wallet balance", "1709401095": "මූල්‍ය වෙළඳපලවල් සහ අපගේ ව්‍යුත්පන්න දර්ශක සමඟ Deriv X හි CFD ගනුදෙනු කරන්න.", "1709859601": "පිටවීමේ ස්ථානයේ වේලාව", "1710662619": "ඔබ සතුව යෙදුම තිබේ නම්, ගනුදෙනු ආරම්භ කිරීමට එය දියත් කරන්න.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "අපි ඔබේ Deriv ෆියට් සහ Deriv ක්‍රිප්ටෝ මුදල් ගිණුම් අතර මාරුවීම් සඳහා 2% මාරු කිරීමේ ගාස්තුවක් හෝ {{currency}} {{minimum_fee}} ක් අය කරන්නෙමු.", "1720968545": "ඔබගේ පරිගණකයෙන් විදේශ ගමන් බලපත්‍රයේ ඡායාරූපය සහිත පිටුව උඩුගත කරන්න", + "1723069433": "Your new Wallet", "1723589564": "ඔබේ කළඹෙහි කැපී පෙනෙන කොන්ත්රාත්තු උපරිම ගණන නියෝජනය කරයි. ඔබගේ කළඹෙහි ඇති සෑම පේළියක්ම එක් විවෘත ස්ථානයක් සඳහා ගණන් ගනී. උපරිමය ළඟා වූ පසු, පළමුව පවතින තනතුරක් වසා දැමීමකින් තොරව ඔබට නව තනතුරු විවෘත කිරීමට නොහැකි වනු ඇත.", "1724696797": "ඔබ එක් ෆියට් ගිණුමකට පමණක් සීමා විය යුතුය.", "1725958461": "ගිණුම් අංකය", @@ -1620,7 +1651,7 @@ "1766993323": "අවසර ඇත්තේ අකුරු, අංක සහ යටි ලකුණු පමණි.", "1767429330": "ව්යුත්පන්න ගිණුමක් එක් කරන්න", "1768293340": "ගිවිසුමේ වටිනාකම", - "1768861315": "විනාඩිය", + "1768861315": "විනාඩි", "1768918213": "අකුරු, අවකාශය, හයිෆන්, කාල පරිච්ඡේදය සහ අපෝට්රොප් පමණක් අවසර ඇත.", "1769068935": "ක්‍රිප්ටෝ මුදල් මිලදී ගැනීම සඳහා මෙම හුවමාරුවලින් එකක් තෝරන්න:", "1771037549": "Deriv සැබෑ ගිණුමක් එක් කරන්න", @@ -1642,7 +1673,7 @@ "1787492950": "ප්‍රස්ථාර පටිත්තෙහි ඇති දර්ශක ප්‍රතීයමාන අරමුණු සඳහා පමණක් වන අතර {{platform_name_dbot}} වැඩබිමේ ඇති ඒවාට වඩා තරමක් වෙනස් විය හැක.", "1788515547": "<0/>මූල්ය සේවා සඳහා බේරුම්කරුගේ කාර්යාලය සමඟ පැමිණිල්ලක් ඉදිරිපත් කිරීම පිළිබඳ වැඩි විස්තර සඳහා කරුණාකර <1>ඔවුන්ගේ මග පෙන්වීම බලන්න.", "1788966083": "01-07-1999", - "1789273878": "එක් ලක්ෂ්යයකට ගෙවීම", + "1789273878": "ලක්ෂ්‍යයකට ගෙවීම", "1789497185": "නොපැහැදිලි හෝ දිදුලන නොමැතිව ඔබගේ විදේශ ගමන් බලපත්ර විස්තර කියවීමට පැහැදිලි බවට වග බලා ගන්න", "1790770969": "ප්‍රධාන FX (සම්මත/ක්ෂුද්‍ර​ කොටස්), සුළු FX, වෙළඳ භාණ්ඩ, ක්‍රිප්ටෝ මුදල්", "1791432284": "රට සොයන්න", @@ -1651,7 +1682,7 @@ "1794815502": "ඔබගේ ගනුදෙනු ඉතිහාසය බාගන්න.", "1796787905": "කරුණාකර පහත ලේඛනය (ය) උඩුගත කරන්න.", "1798943788": "ඔබට කළ හැක්කේ තැන්පතු පමණි.", - "1801093206": "ඉටිපන්දම් ලැයිස්තුව ලබා ගන්න", + "1801093206": "Candle ලැයිස්තුව ලබා ගන්න", "1801270786": "කිසිදු කේතයක් ලිවීමකින් තොරව ඔබේ වෙළඳ උපායමාර්ගය ස්වයංක්රීය කිරීමට සූදානම්ද? ඔබ නියම ස්ථානයට පැමිණ ඇත.", "1801927731": "{{platform_name_dxtrade}} ගිණුම්", "1803338729": "ඔබට වෙළඳාම් කිරීමට අවශ්ය කුමන ආකාරයේ කොන්ත්රාත්තුවක් තෝරන්න. උදාහරණයක් ලෙස, නැගී සිටීම/වැටීම වෙළඳ වර්ගය සඳහා ඔබට විකල්ප තුනෙන් එකක් තෝරා ගත හැකිය: නැගීම, වැටීම හෝ දෙකම. තෝරාගත් විකල්පය මිලදී ගැනීමේ කොටස සඳහා පවතින විකල්ප තීරණය කරනු ඇත.", @@ -1676,7 +1707,7 @@ "1816126006": "සියලුම එෆ්එක්ස් සහ සීඑෆ්ඩී වෙළඳ වේදිකාව වන ඩෙරිව් එම්ටී 5 ({{platform_name_dmt5}}) මත වෙළඳාම් කරන්න.", "1817154864": "මෙම කොටස ඔබට නියමිත පරාසයක් තුළ සිට අහඹු අංකයක් ලබා දෙයි.", "1820242322": "උදා: එක්සත් ජනපදය", - "1820332333": "ඉහළට", + "1820332333": "Top up කරන්න", "1821818748": "රියදුරු බලපත්ර යොමු අංකය ඇතුළත් කරන්න", "1823177196": "වඩාත් ජනප්රියයි", "1824193700": "මෙම කොටස ඔබට නවතම ටික් අගයේ අවසාන ඉලක්කම ලබා දෙයි.", @@ -1698,6 +1729,7 @@ "1842266423": "ආපසු", "1842862156": "ඔබගේ Deriv X උපකරණ පුවරුව වෙත ඔබව සාදරයෙන් පිළිගනිමු", "1843658716": "ඔබ “ඩවුන්ස් පමණක්” තෝරා ගන්නේ නම්, පිවිසුම් ස්ථානයෙන් පසු අඛණ්ඩව කිනිතුල්ලන් අනුක්රමයෙන් වැටුණහොත් ඔබ ගෙවීම දිනා ගනී. කිසියම් ටික් එකක් ඉහළ ගියහොත් හෝ පෙර කිනිතුල්ලන්ට සමාන නම් ගෙවීමක් නොමැත.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(විනාඩි: {{min_stake}} - උපරිම: {{max_payout}})", "1846266243": "මෙම විශේෂාංගය ආදර්ශන ගිණුම් සඳහා ලබා ගත නොහැක.", "1846587187": "ඔබ ඔබේ පදිංචි රට තෝරාගෙන නැත", @@ -1792,7 +1824,6 @@ "1924765698": "උපන් ස්ථානය*", "1926987784": "- iOS: ගිණුමේ වමට ස්වයිප් කර <0>මකන්න තට්ටු කරන්න.", "1928930389": "GBP/NOK", - "1929309951": "රැකියා තත්ත්වය", "1929694162": "ගිණුම් සසඳන්න", "1930899934": "ටෙතර්", "1931659123": "සෑම ටික් එකකම ධාවනය කරන්න", @@ -1807,6 +1838,7 @@ "1943440862": "කාල පරිච්ඡේදයක් සහිත ලැයිස්තුවකින් බොලින්ජර් බෑන්ඩ්ස් (බීබී) ලැයිස්තුව ගණනය කරයි", "1944204227": "මෙම කොටස ජංගම ගිණුමේ ශේෂය නැවත ලබා දෙයි.", "1947527527": "1. මෙම සබැඳිය ඔබ විසින් එවන ලදී", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "විය හැකි හේතු මෙන්න:", "1950413928": "අනන්යතා ලේඛන ඉදිරිපත් කරන්න", @@ -1821,16 +1853,16 @@ "1965916759": "ආසියානු විකල්පයන් අවසන් ටික් කාලය තුළ සාමාන්ය ස්ථානය සමඟ සංසන්දනය කිරීමෙන් නිරාකරණය වේ.", "1966023998": "2FA සක්‍රීය කර ඇත", "1966281100": "{{ message_type }} කොන්සෝල අගය: {{ input_message }}", - "1968025770": "බිට්කොයින් මුදල්", + "1968025770": "Bitcoin මුදල්", "1968077724": "කෘෂිකර්මාන්තය", "1968368585": "රැකියා තත්ත්වය", - "1970060713": "ඔබ සාර්ථකව බොට් එකක් මකා දමා ඇත.", + "1970060713": "ඔබ විසින් සාර්ථකව බොට් එකක් මකා දමා ඇත.", "1971898712": "ගිණුම එකතු කරන්න හෝ කළමනාකරණය කරන්න", "1973060793": "- උපරිම පාඩුව: ඔබේ උපරිම අලාභ​ සීමාව ගබඩා කිරීමට මෙම විචල්‍යය භාවිත කරන්න. ඔබට අවශ්‍ය ඕනෑම මුදලක් පැවරිය හැක, නමුත් එය ධනාත්මක අගයක් විය යුතුය.", "1973536221": "ඔබට තවමත් විවෘත ස්ථාන නොමැත.", "1973564194": "ඔබ එක් ෆියට් ගිණුමකට සීමා වේ. ඔබ දැනටමත් ඔබේ පළමු තැන්පතුව සිදු කර ඇත්නම් හෝ සැබෑ {{dmt5_label}} හෝ {{platform_name_dxtrade}} ගිණුමක් සාදා ඇත්නම් ඔබට ඔබේ ගිණුමේ මුදල් ඒකකය වෙනස් කිරීමට නොහැකි වනු ඇත.", "1973910243": "ඔබේ ගිණුම් කළමනාකරණය කරන්න", - "1974273865": "මෙම විෂය පථය තෙවන පාර්ශවීය යෙදුම් වලට ඔබගේ ගිණුම් ක්රියාකාරකම්, සැකසුම්, සීමාවන්, ශේෂ පත්ර, වෙළඳ මිලදී ගැනීමේ ඉතිහාසය සහ තවත් බොහෝ දේ බැලීමට ඉඩ ලබා දේ.", + "1974273865": "මෙම විෂය පථය තෙවන පාර්ශවීය යෙදුම්වලට ඔබේ ගිණුම් ක්‍රියාකාරකම්, සැකසීම්, සීමා, ශේෂ පත්‍ර, ගනුදෙනු මිලදී ගැනීමේ ඉතිහාසය, සහ තවත් දේ බැලීමට ඉඩ දෙනු ඇත.", "1974903951": "ඔබ ඔව් ක්ලික් කළහොත්, ඔබ ඇතුළත් කළ තොරතුරු නැති වී යයි.", "1981940238": "වරින් වර වෙනස් විය හැකි මෙම පැමිණිලි ප්රතිපත්තිය {{legal_entity_name_svg}} සහ {{legal_entity_name_v}}සමඟ ලියාපදිංචි කර ඇති ඔබගේ ගිණුමට අදාළ වේ.", "1982912252": "සාපේක්ෂ ශක්තිය දර්ශකය (සියළු කොටස්) කාල පරිච්ඡේදයක් සමග ලැයිස්තුවෙන්", @@ -1861,7 +1893,7 @@ "1995023783": "ලිපිනයේ පළමු පේළිය*", "1996767628": "කරුණාකර ඔබේ බදු තොරතුරු තහවුරු කරන්න.", "1997138507": "අන්තිම ටික් කිනිතුල්ලන්ගේ සාමාන්යයට සමාන නම්, ඔබ ගෙවීම දිනා නොගනී.", - "1997313835": "වර්තමාන ස්ථානීය මිල <0>පෙර ස්ථානීය මිලට වඩා නිශ්චිත <0>පරාසයක් තුළ පවතින තාක් කල් ඔබේ කොටස දිගටම වර්ධනය වේ. එසේ නොමැතිනම්, ඔබට ඔබේ කොටස අහිමි වන අතර වෙළඳාම අවසන් වේ.", + "1997313835": "වත්මන් ස්ථාන මිල <0>පෙර ස්ථාන මිලට වඩා නිශ්චිත <0>පරාසයක් තුළ පවතින තාක් කල් ඔබේ කොටස් දිගටම වර්ධනය වනු ඇත. එසේ නොමැතිනම්, ඔබට ඔබේ කොටස් අහිමි වන අතර ගනුදෙනුව අවසන් වේ.", "1998199587": "නිශ්චිත කාල සීමාවක් සඳහා ඔබට සම්පූර්ණයෙන්ම බැහැර කළ හැකිය. ඕනෑම වේලාවක, ඔබ නැවත වෙළඳාම් කිරීමට තීරණය කරන්නේ නම්, මෙම ස්වයං බැහැර කිරීම ඉවත් කිරීම සඳහා ඔබ අපගේ පාරිභෝගික සහාය අමතන්න. ඔබට වෙළඳාම නැවත ආරම්භ කිරීමට පෙර පැය 24 ක සිසිල් කාල සීමාවක් ඇත. ", "1999346412": "වේගවත් සත්‍යාපනය සඳහා, ඔබේ ලිපින ලේඛනයේ ඇති ලිපිනයම මෙහි ඇතුළත් කරන්න (පහත කොටස බලන්න)", "2001222130": "ඔබේ අයාචිත තැපැල් (spam) හෝ සුන්බුන් (junk) ෆෝල්ඩරය පරීක්ෂා කරන්න. එය එහි නොමැති නම්, ඊ-තැපෑල නැවත යැවීමට උත්සාහ කරන්න.", @@ -1875,6 +1907,7 @@ "2014536501": "කාඩ් අංකය", "2014590669": "විචල්ය '{{variable_name}}' අගය නැත. දැනුම් දීමට කරුණාකර විචල්ය '{{variable_name}}' සඳහා අගයක් සකසන්න.", "2017672013": "කරුණාකර ලේඛන නිකුත් කිරීමේ රට තෝරන්න.", + "2020104747": "Filter", "2020545256": "ඔබගේ ගිණුම වසා දමන්න?", "2021037737": "ඉදිරියට යාමට කරුණාකර ඔබේ විස්තර යාවත්කාලීන කරන්න.", "2021161151": "Deriv Bot මත ගනුදෙනු බොට් එකක් සාදා ගන්නා ආකාරය ඉගෙන ගැනීමට මෙම වීඩියෝව නරඹන්න. එසේම, ගනුදෙනු බොට් එකක් තැනීම පිළිබඳව මෙම බ්ලොග් සටහන බලන්න.", @@ -1885,7 +1918,6 @@ "2027696535": "බදු තොරතුරු", "2028163119": "EOS/USD", "2029237955": "ලාබුවාන්", - "2029641956": "CFD සැසඳීමේ ගිණුම්", "2030018735": "ආර්එස්අයි යනු වෙළඳපල ප්රවණතාව හඳුනා ගැනීමට ඔබට උපකාරී වන තාක්ෂණික විශ්ලේෂණ මෙවලමකි. එය ඔබට 0 සිට 100 දක්වා අගයක් ලබා දෙනු ඇත. 70 සහ ඊට වැඩි RSI අගයක් යනු වත්කම අධික ලෙස මිල දී ගෙන ඇති අතර වර්තමාන ප්රවණතාවය ආපසු හැරවිය හැකි අතර 30 සහ ඊට පහළ අගයක් යනු වත්කම අධික වන බවයි.", "2030045667": "පණිවිඩය", "2033648953": "මෙම කොටස ඔබට තෝරාගත් කාල පරතරයක් සඳහා නිශ්චිත ඉටිපන්දම් අගය ලබා දෙයි.", @@ -1904,7 +1936,7 @@ "2046577663": "ඔබේ බොට් ආයාත කරන්න හෝ තෝරන්න", "2048110615": "ඊ-තැපැල් ලිපිනය*", "2048134463": "ගොනු ප්රමාණය ඉක්මවා ඇත.", - "2049386104": "මෙම ගිණුම ලබා ගැනීම සඳහා ඔබට මේවා ඉදිරිපත් කිරීමට අපට අවශ්යය:", + "2049386104": "මෙම ගිණුම ලබා ගැනීම සඳහා අපට ඔබ පහත සඳහන් දේවල් ඉදිරිපත් කළ යුතුය:", "2050170533": "සලකුණු ලැයිස්තුව", "2051558666": "ගනුදෙනු ඉතිහාසය බලන්න", "2054889300": "“%1” සාදන්න", @@ -1919,6 +1951,7 @@ "2063812316": "පාඨ ප්‍රකාශනය", "2063890788": "අවලංගු කරන ලදි", "2065278286": "පැතිරීම", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "රියදුරු බලපත්රය", "2070002739": "පිළිගන්න එපා", "2070345146": "උත්තෝලිත සීඑෆ්ඩී වෙළඳාමක් විවෘත කරන විට.", @@ -1931,13 +1964,14 @@ "2074713563": "4.2. පැමිණිල්ලක් ඉදිරිපත් කිරීම", "2080553498": "3. ටෙලිග්රාම් REST API භාවිතයෙන් චැට් හැඳුනුම්පත ලබා ගන්න (වැඩිදුර කියවන්න: https://core.telegram.org/bots/api#getupdates)", "2080829530": "සඳහා විකුණනු ලැබේ: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "ඔව්, මකන්න", "2084693624": "යුගයේ සිට තත්පර බවට දිනය/වේලාව string නියෝජනය string පරිවර්තනය. උදාහරණය: 2019-01-01 21:03:45 GMT+0800 1546347825 බවට පරිවර්තනය වේ. වේලාව සහ කාල කලාප ඕෆ්සෙට් අත්‍යවශ්‍ය නොවේ.", "2085387371": "අංක, අකුරු සහ විශේෂ අක්ෂර විය යුතුය., '-", "2085602195": "- ඇතුළත් කිරීමේ අගය: කොන්ත්රාත්තුවේ පළමු ටික් එකේ වටිනාකම", "2086742952": "ඔබ සැබෑ විකල්ප ගිණුමක් එකතු කර ඇත. වෙළඳාම ආරම්භ කිරීම සඳහා දැන්ම තැන්පතුවක්<0/> කරන්න.", "2086792088": "බාධක දෙකම සාපේක්ෂ හෝ නිරපේක්ෂ විය යුතුය", - "2088735355": "ඔබගේ සැසිය සහ පිවිසුම් සීමාවන්", + "2088735355": "ඔබේ සැසිය හා පිවිසුම් සීමා", "2089581483": "කල් ඉකුත් වේ", "2090650973": "ඔබගේ ඇණවුම අපගේ සේවාදායකයන් වෙත ළඟා වන විට ස්ථානීය මිල වෙනස් විය හැකිය. මෙය සිදු වූ විට, ඔබගේ ගෙවීම බලපානු ඇත.", "2091671594": "තත්ත්වය", @@ -1964,9 +1998,8 @@ "2112175277": "ඩෙලමිටර් සමඟ", "2113321581": "ඩෙරිව් සූදු ගිණුමක් එක් කරන්න", "2115223095": "පාඩුව", - "2117165122": "1. ටෙලිග්‍රෑම් බොට් එකක් සාදා ඔබේ ටෙලිග්‍රෑම් API ටෝකනය ලබා ගන්න. ටෙලිග්‍රෑම් හි බොට්ස් නිර්මාණය කරන්නේ කෙසේද යන්න පිළිබඳ වැඩිදුර කියවන්න: https://core.telegram.org/bots#6-botfather", + "2117165122": "1. ටෙලිග්‍රෑම් බොට් එකක් සාදා ඔබේ ටෙලිග්‍රෑම් API ටෝකනය ලබා ගන්න. ටෙලිග්‍රෑම්හි බොට් නිර්මානය කරන ආකරය පිළිබඳ වැඩිදුර කියවන්න: https://core.telegram.org/bots#6-botfather", "2117489390": "තත්පර {{ remaining }} කින් ස්වයංක්‍රීයව යාවත්කාලීන කිරීම", - "2118315870": "ඔබ ජීවත් වන්නේ කොහේද?", "2119449126": "පහත උදාහරණයේ නිදර්ශන ප්රතිදානය වනුයේ:", "2119710534": "FAQ", "2121227568": "NEO/USD", @@ -1983,7 +2016,7 @@ "2139171480": "නැවත සකසන්න/පහළට යළි පිහිටුවන්න", "2139362660": "වම් පැත්ත", "2141055709": "නව {{type}} මුරපදය", - "2141873796": "<0>CFDs, <1>ගුණකය සහ <2>විකල්ප පිළිබඳ වැඩි විස්තර ලබා ගන්න.", + "2141873796": "<0>CFD, <1>ගුණක, සහ <2>විකල්ප පිළිබඳ වැඩිදුර තොරතුරු ලබා ගන්න.", "2143803283": "ගැනුම් දෝෂය", "2144609616": "ඔබ “Reset-Down” තෝරා ගන්නේ නම්, නැවත පිහිටුවීමේ වේලාවේදී පිටවීමේ ස්ථානය පිවිසුම් ස්ථානයට හෝ ස්ථානයට වඩා තදින් අඩු නම් ඔබ ගෙවීම දිනා ගනී.", "2145690912": "ආදායම් ඉපැයීම", @@ -1992,15 +2025,13 @@ "2146698770": "ප්රෝ ඉඟිය: ඔබට අපේක්ෂිත බ්ලොක් එක ක්ලික් කර ඇදගෙන යා හැකිය", "2146892766": "ද්විමය විකල්ප වෙළඳ අත්දැකීම්", "2147244655": "මගේම වෙළඳ බොට් ඩෙරිව් බොට් වෙත ආනයනය කරන්නේ කෙසේද?", - "-1232613003": "<0>සත්යාපනය අසාර්ථකයි <1>ඇයි?", - "-2029508615": "<0>සත්යාපනය අවශ්යයි <1>දැන් සත්යාපනය කරන්න", "-931052769": "සත්යාපනය ඉදිරිපත් කරන්න", "-1004605898": "ඉඟි", "-1938142055": "උඩුගත කරන ලද ලේඛන", "-448090287": "සබැඳිය ක්රියාත්මක වන්නේ ජංගම උපාංගවල පමණි", "-1244287721": "යමක් වැරදී ඇත", "-241258681": "ඔබේ පරිගණකයේ සත්යාපනය නැවත ආරම්භ කිරීමට ඔබට අවශ්ය වනු ඇත", - "-929254273": "ආරක්ෂිත සබැඳියක් ලබා ගන්න", + "-929254273": "ආරක්ෂිත සබැඳිය ලබා ගන්න", "-2021867851": "ඉදිරිපත් කිරීම අවසන් කිරීමට මෙහි නැවත පරීක්ෂා කරන්න", "-1547069149": "සබැඳිය විවෘත කර කාර්යයන් සම්පූර්ණ කරන්න", "-1767652006": "මෙන්න එය කරන්නේ කෙසේද:", @@ -2047,7 +2078,7 @@ "-1667839246": "ජංගම දුරකථන අංකය ඇතුළත් කරන්න", "-1533172567": "ඔබගේ ජංගම දුරකථන අංකය ඇතුලත් කරන්න:", "-1352094380": "මෙම එක් වරක් සබැඳිය ඔබගේ දුරකථනයට යවන්න", - "-28974899": "ඔබගේ ආරක්ෂිත සබැඳිය ලබා ගන්න", + "-28974899": "ඔබේ ආරක්ෂිත සබැඳිය ලබා ගන්න", "-359315319": "දිගටම කරගෙන යන්න", "-1279080293": "2. ඔබගේ ඩෙස්ක්ටොප් කවුළුව විවෘතව පවතී", "-102776692": "සත්යාපනය සමඟ ඉදිරියට යන්න", @@ -2120,7 +2151,7 @@ "-1282749116": "අවසාන නම", "-1485480657": "වෙනත් විස්තර", "-1784741577": "උපන් දිනය", - "-1702919018": "ලිපිනයේ දෙවන පේළිය (අත්යවශ්ය නොවේ)", + "-1702919018": "ලිපිනයේ දෙවන පේළිය (අත්‍යවශ්‍ය නොවේ)", "-1315410953": "ප්‍රාන්තය/පළාත", "-2040322967": "පුරවැසිභාවය", "-344715612": "රැකියා තත්වය*", @@ -2141,18 +2172,9 @@ "-179726573": "හිමිකාරිත්වය පිළිබඳ ඔබේ සාක්ෂි අපට ලැබී ඇත.", "-813779897": "හිමිකාරිත්ව සත්යාපනය පිළිබඳ සාධනය සම්මත විය.", "-638756912": "ඔබේ හර/ක්රෙඩිට් කාඩ්පතේ ඉදිරිපස පෙන්වා ඇති කාඩ්පත් අංකයේ 7 සිට 12 දක්වා ඉලක්කම් කළු කරන්න.", - "-2073934245": "මෙම වෙබ් අඩවියේ පිරිනමනු ලබන මූල්‍ය ගනුදෙනු සේවා සුදුසු වන්නේ ආයෝජනය කරන සියලුම මුදල් අහිමි වීමේ හැකියාව පිළිගන්නා සහ මූල්‍ය ගිවිසුම් මිලදී ගැනීමේදී ඇති අවදානම තේරුම් ගත් සහ ඒ පිළිබඳ අත්දැකීම් ඇති ගනුදෙනුකරුවන්ට පමණි. මූල්‍ය ගිවිසුම්වල ගනුදෙනු ඉහළ අවදානමක් දරයි. ඔබ මිල දී ගත් ගිවිසුම් නිෂ්ඵල ලෙස කල් ඉකුත් වුවහොත්, ගිවිසුම් වාරිකය ඇතුළු ඔබේ සියලුම ආයෝජන ඔබට අහිමි වනු ඇත.", - "-1166068675": "ඔබගේ ගිණුම එක්සත් රාජධානියේ සූදු කොමිෂන් සභාව (UKGC) විසින් නියාමනය කරනු ලබන {{legal_entity_name}}සමඟ විවෘත කරනු ලබන අතර අයිල් ඔෆ් මෑන් හි නීතිවලට යටත් වේ.", - "-975118358": "ඔබේ ගිණුම මෝල්ටා මූල්ය සේවා අධිකාරිය (MFSA) විසින් නියාමනය කරනු ලබන {{legal_entity_name}}සමඟ විවෘත වන අතර මෝල්ටාවේ නීතිවලට යටත් වේ.", - "-680528873": "ඔබගේ ගිණුම {{legal_entity_name}} සමඟ විවෘත වන අතර එය සැමෝවා හි නීතිවලට යටත් වේ.", - "-1125193491": "ගිණුම එක් කරන්න", - "-2068229627": "මම PEP නොවේ, පසුගිය මාස 12 ඇතුළත මම PEP නොවුණෙමි.", "-684271315": "හරි", "-740157281": "වෙළඳ පළපුරුද්ද ඇගයීම", "-1720468017": "ඔබට අපගේ සේවාවන් සැපයීමේදී, ලබා දී ඇති නිෂ්පාදනයක් හෝ සේවාවක් ඔබට සුදුසු දැයි තක්සේරු කිරීම සඳහා අපි ඔබෙන් තොරතුරු ලබා ගත යුතුය.", - "-186841084": "ඔබගේ පිවිසුම් ඊ-තැපෑල වෙනස් කරන්න", - "-907403572": "ඔබේ ඊ-තැපැල් ලිපිනය වෙනස් කිරීමට, ප්‍රථමයෙන් ඔබ ඔබේ ඊ-තැපැල් ලිපිනය ඔබේ {{identifier_title}} ගිණුමෙන් විසන්ධි කළ යුතුය.", - "-1850792730": "{{identifier_title}}වෙතින් ඉවත් වන්න", "-307865807": "අවදානම් ඉවසීම අවවාදයයි", "-690100729": "ඔව්, මට අවදානම තේරෙනවා.", "-2010628430": "සීඑෆ්ඩී සහ වෙනත් මූල්ය උපකරණ ලීවරය හේතුවෙන් වේගයෙන් මුදල් අහිමි වීමේ ඉහළ අවදානමක් ඇත. CFDs සහ අනෙකුත් මූල්ය උපකරණ ක්රියා කරන ආකාරය සහ ඔබේ මුදල් අහිමි වීමේ ඉහළ අවදානමක් ගැනීමට ඔබට හැකිද යන්න ඔබ තේරුම් ගෙන තිබේද යන්න ඔබ සලකා බැලිය යුතුය.<0/><0/>", @@ -2180,7 +2202,7 @@ "-1958764604": "ඊ-තැපැල් අභිරුචිය", "-2121071263": "ඊ-තැපෑල හරහා යාවත්කාලීන ලබා ගැනීමට මෙම කොටුව සලකුණු කරන්න.", "-2068064150": "Deriv නිෂ්පාදන, සේවා සහ සිදුවීම් පිළිබඳ යාවත්කාලීන ලබා ගන්න.", - "-1558679249": "කරුණාකර ඔබේ තොරතුරු නිවැරදි බවට වග බලා ගන්න, නැතහොත් එය ඔබේ වෙළඳ අත්දැකීමට බලපායි.", + "-1558679249": "කරුණාකර ඔබේ තොරතුරු නිවැරදි බවට වග බලා ගන්න, නැතහොත් එය ඔබේ ගනුදෙනු අත්දැකීමට බලපෑ හැකිය.", "-179005984": "සුරකින්න", "-2116332353": "කරුණාකර පහත ඩෙරිව් ගිණුමේ ඔබගේ තනතුරු වසා දමන්න (ය):", "-2048005267": "{{number_of_positions}} තත්ත්වය (ය)", @@ -2206,19 +2228,14 @@ "-1725454783": "අසාර්ථකයි", "-506510414": "දිනය සහ වේලාව", "-1708927037": "IP ලිපිනය", - "-619126443": "{{brand_website_name}} සහ {{platform_name_trader}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", - "-623760979": "{{brand_website_name}}, {{platform_name_trader}} සහ {{platform_name_go}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", - "-459147994": "{{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} සහ {{platform_name_ctrader}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", - "-80717068": "ඔබ ඔබේ <0>Deriv මුරපදය වෙත සම්බන්ධ කර ඇති යෙදුම්:", - "-9570380": "වෙබ් සහ ජංගම යෙදුම්වල ඔබේ {{platform_name_dxtrade}} ගිණුම් වෙත පුරනය වීමට {{platform_name_dxtrade}} මුරපදය භාවිත කරන්න.", "-2131200819": "අක්‍රමවත් කරන්න", "-200487676": "සක්රීය කරන්න", "-1840392236": "එය නිවැරදි කේතය නොවේ. කරුණාකර නැවත උත්සාහ කරන්න.", - "-2067796458": "සත්යාපන කේතය", + "-2067796458": "සත්‍යාපන කේතය", "-790444493": "2FA සමඟ ඔබේ ගිණුම ආරක්ෂා කර ගන්න. ඔබ ඔබේ ගිණුමට පුරනය වන සෑම අවස්ථාවකම, ඔබේ ස්මාර්ට් ජංගම දුරකතනයේ 2FA යෙදුමක් මඟින් උත්පාදනය කරන ලද ඔබේ මුරපදය සහ සත්‍යාපන කේතය ඇතුළත් කිරීමට ඔබට සිදු වේ.", "-368010540": "ඔබගේ ඩෙරිව් ගිණුම සඳහා ඔබ 2FA සක්රීය කර ඇත.", "-403552929": "2FA අක්රීය කිරීමට, කරුණාකර පහත ඔබගේ 2FA යෙදුම මගින් ජනනය කරන ලද ඉලක්කම් හයක සත්යාපන කේතය ඇතුළත් කරන්න:", - "-752939584": "ඔබගේ ඩෙරිව් ගිණුම සඳහා 2FA සකසන්නේ කෙසේද", + "-752939584": "ඔබේ Deriv ගිණුම සඳහා 2FA සකසන ආකරය", "-90649785": "යතුර පිටපත් කිරීමට මෙහි ක්ලික් කරන්න", "-206376148": "යතුර පිටපත් කර ඇත!", "-1592318047": "උදාහරණයක් බලන්න", @@ -2240,44 +2257,37 @@ "-378415317": "රාජ්ය අවශ්ය වේ", "-1497654315": "ජර්සි තැපැල් කේතය සඳහා අපගේ ගිණුම් සහ සේවාවන් නොමැත.", "-755626951": "ඔබේ ලිපින විස්තර සම්පූර්ණ කරන්න", - "-584911871": "පසුම්බි මුදල් තෝරන්න", "-1461267236": "කරුණාකර ඔබේ මුදල් ඒකකය තෝරන්න", - "-1352330125": "ව්යවහාර මුදල්", "-1027595143": "$25,000 ට වඩා අඩුය", "-40491332": "$25,000 - $50,000", "-1139806939": "$50,001 - $100,000", - "-626752657": "වසර 0-1", - "-532014689": "අවුරුදු 1 - 2", - "-1001024004": "අවුරුදු 3 ට වැඩි", - "-790513277": "පසුගිය මාස 6-10 තුළ ගනුදෙනු 12", - "-580085300": "පසුගිය මාස 11-39 තුළ ගනුදෙනු 12", - "-654781670": "ප්රාථමික", - "-1717373258": "ද්විතියික", "-996132458": "ගොඩනැගීම", "-915003867": "සෞඛ්‍ය", "-1430012453": "තොරතුරු සහ සන්නිවේදන තාක්ෂණය", "-987824916": "විද්‍යාව සහ ඉංජීනේරු ශිල්පය", "-146630682": "සමාජ සහ සංස්කෘතික", "-761306973": "නිෂ්පාදනය", - "-739367071": "සේවා නියුක්ත", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "$1,000,000 කට වඩා", - "-2068544539": "වැටුප් ලබන සේවකයා", - "-531314998": "ආයෝජන සහ ලාභාංශ", - "-1235114522": "විශ්‍රාම වැටුප", - "-1298056749": "රාජ්‍ය ප්‍රතිලාභ", - "-449943381": "ඉතුරුම් සහ උරුමය", "-1631552645": "වෘත්තිකයින්", "-474864470": "පුද්ගලික සත්කාර, විකුණුම් සහ සේවා සේවකයින්", "-1129355784": "කෘෂිකාර්මික, වන හා ධීවර කම්කරුවන්", "-1242914994": "අත්කම්, ලෝහ, විදුලි හා ඉලෙක්ට්රොනික කම්කරුවන්", "-1317824715": "පිරිසිදු කරන්නන් සහ සහයකයින්", "-1592729751": "පතල් කැණීම, ඉදිකිරීම්, නිෂ්පාදන හා ප්රවාහන සේවකයින්", + "-1030759620": "රජයේ නිලධාරීන්", "-2137323480": "සමාගම් හිමිකාරිත්වය", "-1590574533": "දික්කසාද බේරුම්කරණය", "-1667683002": "උරුමය", "-1237843731": "ආයෝජන ආදායම", "-777506574": "ඉඩකඩම් විකිණීම", + "-654781670": "ප්රාථමික", + "-1717373258": "ද්විතියික", + "-1156937070": "$500,001 - $1,000,000", + "-315534569": "$1,000,000 කට වඩා", + "-2068544539": "වැටුප් ලබන සේවකයා", + "-531314998": "ආයෝජන සහ ලාභාංශ", + "-1235114522": "විශ්‍රාම වැටුප", + "-1298056749": "රාජ්‍ය ප්‍රතිලාභ", + "-449943381": "ඉතුරුම් සහ උරුමය", "-1161338910": "පළමු නම අවශ්ය වේ.", "-1161818065": "අවසාන නම අක්ෂර 2 ත් 50 ත් අතර විය යුතුය.", "-1281693513": "උපන් දිනය අවශ්‍ය වේ.", @@ -2287,29 +2297,15 @@ "-212167954": "බදු හඳුනාගැනීමේ අංකය නිසි ලෙස හැඩගස්වා නොමැත.", "-621555159": "අනන්යතා තොරතුරු", "-204765990": "භාවිත නියම", - "-231863107": "නැත", - "-870902742": "සබැඳි වෙළඳාම සම්බන්ධයෙන් ඔබට කොපමණ දැනුමක් හා පළපුරුද්දක් තිබේද?", - "-1929477717": "මට අධ්යයන උපාධියක්, වෘත්තීය සහතිකයක් සහ/හෝ මූල්ය සේවාවන්ට අදාළ සේවා පළපුරුද්ද ඇත.", - "-1540148863": "මම වෙළඳාමට අදාළ සම්මන්ත්රණ, පුහුණුව සහ/හෝ වැඩමුළු වලට සහභාගී වී ඇත්තෙමි.", - "-922751756": "වසරකට අඩු", - "-542986255": "කිසිවක් නැත", - "-1337206552": "ඔබේ අවබෝධය අනුව, CFD වෙළඳාම ඔබට ඉඩ සලසයි", - "-456863190": "ප්‍රතිඵලය ස්ථාවර ප්‍රතිලාභයක් හෝ කිසිවක් නොමැති වත්කමක මිල චලනය මත ස්ථානයක් තබන්න.", - "-1314683258": "සහතික කළ ලාභයක් සඳහා දිගුකාලීන ආයෝජනයක් කරන්න.", - "-1546090184": "උත්තෝලනය CFD ගනුදෙනුවට බලපාන්නේ කෙසේද?", - "-1636427115": "උත්තෝලනය අවදානම අවම කිරීමට උපකාරී වේ.", - "-800221491": "උත්තෝලනය ලාභ සහතික කරයි.", - "-811839563": "ගනුදෙනු වටිනාකමෙන් කොටසක් සඳහා විශාල තනතුරු විවෘත කිරීමට උත්තෝලනය ඔබට ඉඩ සලසයි, එමඟින් ලාභය හෝ අලාභය වැඩි විය හැකිය.", - "-1185193552": "ප්‍රමාණවත් වෙළඳපල ද්‍රවශීලතාවයක් පවතින තාක් කල් අලාභය නිශ්චිත මුදලකට සමාන හෝ වැඩි වූ විට ඔබේ ගනුදෙනුව ස්වක්‍රීයව වසා දමන්න.", - "-1046354": "ප්‍රමාණවත් වෙළඳපල ද්‍රවශීලතාවයක් පවතින තාක් කල් ලාභය නිශ්චිත මුදලකට සමාන හෝ වැඩි වූ විට ඔබේ ගනුදෙනුව ස්වක්‍රීයව වසා දමන්න.", - "-1842858448": "ඔබේ ගනුදෙනුවෙන් සහතික කළ ලාභයක් ලබා ගන්න.", - "-860053164": "ගුණකයන් ගනුදෙනු කරන විට.", - "-1250327770": "සමාගමක කොටස් මිලදී ගැනීමේදී.", - "-1222388581": "ඉහත සියල්ල.", "-477761028": "ඡන්ද හැඳුනුම්පත", "-1466346630": "CPF", - "-1030759620": "රජයේ නිලධාරීන්", - "-612752984": "මේවා අපි ඔබගේ ගිණුම් වලට යොදන පෙරනිමි සීමාවන් වේ.", + "-739367071": "සේවා නියුක්ත", + "-626752657": "වසර 0-1", + "-532014689": "අවුරුදු 1 - 2", + "-1001024004": "අවුරුදු 3 ට වැඩි", + "-790513277": "පසුගිය මාස 6-10 තුළ ගනුදෙනු 12", + "-580085300": "පසුගිය මාස 11-39 තුළ ගනුදෙනු 12", + "-612752984": "මේවා අපි ඔබගේ ගිණුම් සඳහා යොදන පෙරනිමි සීමාවන් වේ.", "-1598263601": "ගනුදෙනු සීමාවන් සහ ඒවා අදාළ වන ආකාරය පිළිබඳ වැඩිදුර දැන ගැනීමට කරුණාකර <0>උපකාරක මධ්‍යස්ථානය වෙත යන්න.", "-1411635770": "ගිණුම් සීමාවන් ගැන තව දැනගන්න", "-1340125291": "සිදු කළා", @@ -2317,19 +2313,16 @@ "-858297154": "ඔබගේ ගිණුමේ තබා ගත හැකි උපරිම මුදල් ප්‍රමාණය නියෝජනය කරයි. උපරිමය ළඟා වුවහොත්, මුදල් ආපසු ගැනීමට ඔබෙන් අසනු ඇත.", "-976258774": "සකසා නැත", "-1182362640": "ඔබේ කළඹේ කැපී පෙනෙන ගිවිසුම් සඳහා උපරිම සමස්ත ගෙවීම් නියෝජනය කරයි. උපරිමය ළඟා කර ගන්නේ නම්, දැනට පවතින තනතුරු මුලින් වසා දැමීමකින් තොරව ඔබට අමතර ගිවිසුම් මිලදී නොගත හැකිය.", - "-1781293089": "විවෘත තනතුරු මත උපරිම සමස්ත ගෙවීම්", - "-1412690135": "*ඔබගේ ස්වයං-බැහැර සැකසුම් වල ඇති ඕනෑම සීමාවන් මෙම පෙරනිමි සීමාවන් අභිබවා යනු ඇත.", + "-1781293089": "විවෘත ස්ථාන මත උපරිම සමස්ථ ගෙවීම්", + "-1412690135": "*ඔබේ ස්වයං ව්‍යවර්තන සැකසීම්වල ඕනෑම සීමාවක් මෙම පෙරනිමි සීමාවන් අභිබවා යයි.", "-1598751496": "ඕනෑම ගනුදෙනු කිරීමේ දිනයකදී ඔබට මිලදී ගත හැකි උපරිම ගිවිසුම් ප්‍රමාණය නියෝජනය කරයි.", "-173346300": "උපරිම දෛනික පිරිවැටුම", - "-138380129": "මුළු මුදල් ආපසු ගැනීමට අවසර ඇත", + "-138380129": "සම්පූර්ණ මුදල් ආපසු ගැනීමේ සීමාව", "-854023608": "සීමාව වැඩි කිරීමට කරුණාකර ඔබේ අනන්‍යතාවය තහවුරු කරන්න", "-1500958859": "සත්‍යාපනය කරන්න", "-1502578110": "ඔබගේ ගිණුම සම්පූර්ණයෙන්ම සත්‍යාපනය කර ඇති අතර ඔබගේ මුදල් ආපසු ගැනීමේ සීමාවන් ඉවත් කර ඇත.", "-1662154767": "මෑත කාලීන උපයෝගිතා බිල්පතක් (උදා: විදුලිය, ජලය, ගෑස්, ස්ථාවර දුරකථන හෝ අන්තර්ජාල), බැංකු ප්‍රකාශය හෝ ඔබේ නම සහ මෙම ලිපිනය සහිත රජය විසින් නිකුත් කරන ලද ලිපියක්.", - "-190838815": "සත්යාපනය සඳහා අපට මෙය අවශ්යයි. ඔබ සපයන තොරතුරු ව්යාජ හෝ සාවද්ය නම්, ඔබට තැන්පත් කර ආපසු ගැනීමට නොහැකි වනු ඇත.", - "-223216785": "ලිපිනයේ දෙවන පේළිය*", "-594456225": "ලිපිනයේ දෙවන පේළිය", - "-1940457555": "තැපැල්/ZIP කේතය*", "-1964954030": "තැපැල්/ZIP කේතය", "-516397235": "ඔබ මෙම ටෝකනය බෙදා ගන්නේ කවුරුන්දැයි ප්‍රවේශම් වන්න. මෙම ටෝකනය ඇති ඕනෑම කෙනෙකුට ඔබගේ ගිණුම වෙනුවෙන් පහත සඳහන් ක්‍රියා සිදු කළ හැකිය", "-989216986": "ගිණුම් එක් කරන්න", @@ -2371,8 +2364,6 @@ "-1100235269": "රැකියා කර්මාන්තය", "-684388823": "ඇස්තමේන්තුගත ශුද්ධ වටිනාකම", "-509054266": "අපේක්ෂිත වාර්ෂික පිරිවැටුම", - "-601903492": "Forex ගනුදෙනු අත්දැකීම​", - "-1012699451": "CFD ගනුදෙනු අත්දැකීම", "-1588485629": "උදාහරණය", "-1117345066": "ලේඛන වර්ගය තෝරන්න", "-651192353": "නියැදිය:", @@ -2395,10 +2386,10 @@ "-329713179": "හරි", "-1176889260": "කරුණාකර ලේඛන වර්ගයක් තෝරන්න.", "-1926456107": "ඔබ ඉදිරිපත් කළ හැඳුනුම්පත කල් ඉකුත් වී ඇත.", - "-555047589": "ඔබගේ අනන්‍යතා ලේඛනය කල් ඉකුත් වී ඇති බව පෙනේ. කරුණාකර වලංගු ලේඛනයක් සමඟ නැවත උත්සාහ කරන්න.", + "-555047589": "ඔබේ අනන්‍යතා ලේඛනය කල් ඉකුත් වී ඇති බව පෙනේ. කරුණාකර වලංගු ලේඛනයක් සමඟ නැවත උත්සාහ කරන්න.", "-841187054": "නැවත උත්සාහ කරන්න", "-2097808873": "ඔබ ලබා දුන් විස්තර සමඟ ඔබගේ හැඳුනුම්පත සත්යාපනය කිරීමට අපට නොහැකි විය. ", - "-228284848": "ඔබ ලබා දුන් විස්තර සමඟ ඔබගේ හැඳුනුම්පත සත්යාපනය කිරීමට අපට නොහැකි විය.", + "-228284848": "ඔබ සපයා ඇති විස්තර සමඟ ඔබේ හැඳුනුම්පත සත්‍යාපනය කිරීමට අපට නොහැකි විය.", "-1391934478": "ඔබගේ හැඳුනුම්පත සත්යාපනය කර ඇත. ඔබේ ලිපිනය පිළිබඳ සාක්ෂි ඉදිරිපත් කිරීමටද ඔබට අවශ්ය වනු ඇත.", "-118547687": "හැඳුනුම්පත් සත්යාපනය සම්මත විය", "-200989771": "පුද්ගලික තොරතුරු වෙත යන්න", @@ -2428,26 +2419,26 @@ "-848721396": "මෙම වෙළඳ සීමාවන් අත්‍යවශ්‍ය නොවන අතර ඔබට ඕනෑම වේලාවක ඒවා ශක්තිමත් කළ හැකිය. ඔබ නිශ්චිත සීමාවක් නියම කිරීමට අකමැති නම්, ක්ෂේත්‍රය හිස්ව තබන්න. ඔබ එක්සත් රාජධානියේ ජීවත් වන්නේ නම්, පාරිභෝගික සහාය ඉල්ලීම ලැබීමෙන් පැය 24 කට පසු ඔබේ ගනුදෙනු සීමාවන් ඉවත් කිරීමට හෝ දුර්වල කිරීමට හැකිය. ඔබ Isle of Man හි ජීවත් වන්නේ නම්, පාරිභෝගික සහාය ඔබේ ගනුදෙනු සීමාවන් ඉවත් කිරීම හෝ දුර්වල කිරීම කළ හැක්කේ ඔබේ ගනුදෙනු සීමාවන් කල් ඉකුත් වූ පසු පමණි.", "-469096390": "මෙම වෙළඳ සීමාවන් අත්යවශ්ය නොවන අතර ඔබට ඕනෑම වේලාවක ඒවා ශක්තිමත් කළ හැකිය. ඔබ නිශ්චිත සීමාවක් නියම කිරීමට අකමැති නම්, ක්ෂේත්රය හිස්ව තබන්න. පාරිභෝගික සහාය ඉල්ලීම ලැබීමෙන් පැය 24 කට පසු ඔබේ වෙළඳ සීමාවන් ඉවත් කිරීමට හෝ දුර්වල කිරීමට හැකිය.", "-42808954": "නිශ්චිත කාල සීමාවක් සඳහා ඔබට සම්පූර්ණයෙන්ම බැහැර කළ හැකිය. මෙය ඉවත් කළ හැක්කේ ඔබේ ස්වයං බැහැර කිරීම කල් ඉකුත් වූ පසු පමණි. ඔබේ ස්වයං බැහැර කිරීමේ කාලය ඉකුත් වූ පසු වෙළඳාම දිගටම කරගෙන යාමට ඔබ කැමති නම්, මෙම ස්වයං බැහැර කිරීම ඉවත් කිරීම සඳහා <0>+447723580049 අමතා පාරිභෝගික සහාය අමතන්න. චැට් හෝ විද්යුත් තැපෑලෙන් ඉල්ලීම් ලබා නොගත යුතුය. ඔබට වෙළඳාම නැවත ආරම්භ කිරීමට පෙර පැය 24 ක සිසිල් කිරීමේ කාලයක් ඇත.", - "-1088698009": "මෙම ස්වයං-බැහැර කිරීමේ සීමාවන් Deriv හි {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} සහ {{platform_name_bbot}} මත ගනුදෙනු කිරීමට ඔබ වැය කරන මුදල් හා කාලය පාලනය කිරීමට උපකාරී වේ. ඔබ මෙහි නියම කර ඇති සීමාවන් <0>වගකිවයුතු ගනුදෙනුවක් කිරීමට ඔබට උපකාරී වනු ඇත.", + "-1088698009": "මෙම ස්වයං ව්‍යවර්තන සීමා ඔබට Deriv හි {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} සහ {{platform_name_bbot}} මත ගනුදෙනු කිරීමට වැය කරන මුදල් ප්‍රමාණය සහ කාලය පාලනය කිරීමට උදවු කරයි. ඔබ මෙහි සකසන සීමා ඔබට <0>වගකීම් සහිතව ගනුදෙනු කිරීමට උපකාරී වනු ඇත.", "-1702324712": "මෙම සීමාවන් අත්යවශ්ය නොවන අතර ඔබට ඕනෑම වේලාවක ඒවා සකස් කළ හැකිය. ඔබ කොපමණ ප්රමාණයක් සහ කොපමණ කාලයක් වෙළඳාම් කිරීමට කැමතිද යන්න ඔබ තීරණය කරයි. ඔබ නිශ්චිත සීමාවක් නියම කිරීමට අකමැති නම්, ක්ෂේත්රය හිස්ව තබන්න.", "-1819875658": "නිශ්චිත කාල සීමාවක් සඳහා ඔබට සම්පූර්ණයෙන්ම බැහැර කළ හැකිය. ස්වයං බැහැර කිරීමේ කාලය අවසන් වූ පසු, ඔබට එය තවදුරටත් දීර් extend කළ හැකිය, නැතහොත් වහාම වෙළඳාම නැවත ආරම්භ කළ හැකිය. ස්වයං බැහැර කිරීමේ කාලය අඩු කිරීමට හෝ ඉවත් කිරීමට ඔබට අවශ්ය නම්, අපගේ <0>පාරිභෝගික සහාය අමතන්න.", "-1031814119": "වෙළඳ සීමාවන් සහ ස්වයං-බැහැර කිරීම ගැන", - "-183468698": "වෙළඳ සීමාවන් සහ ස්වයං-බැහැර කිරීම", + "-183468698": "ගනුදෙනු සීමා සහ ස්වයං ව්‍යවර්තන", "-933963283": "නැත, මගේ සීමාවන් සමාලෝචනය කරන්න", "-1759860126": "ඔව්, මාව වහාම ඉවත් කරන්න", "-572347855": "මිනිත්තු {{value}}", "-313333548": "ඔබට ඕනෑම වේලාවක මෙම සීමාවන් සකස් කළ හැකිය. <0>ස්වයං-බැහැර කිරීමේ පිටුවෙන් ඔබේ සීමාවන් අඩු කර ගත හැකිය. ඔබේ සීමාවන් වැඩි කිරීමට හෝ ඉවත් කිරීමට කරුණාකර අපගේ <1>පාරිභෝගික සහාය කණ්ඩායම අමතන්න.", "-1265833982": "පිළිගන්න", - "-2123139671": "ඔබේ කොටස් සහ පාඩු සීමාවන්", + "-2123139671": "ඔබේ කොටස් සහ අලාභ සීමා", "-1250802290": "පැය 24", - "-2070080356": "මැක්ස්. මුළු කොටස්", + "-2070080356": "උපරිම මුළු කොටස්", "-1545823544": "දින 7", - "-180147209": "මෙම කාල සීමාව පසු ඔබ ස්වයංක්රීයව එක් එක් සැසිය සිට ලොගින් වී ඇත.", - "-374553538": "මෙම දිනය දක්වා ඔබගේ ගිණුම වෙබ් අඩවියෙන් බැහැර කරනු ලැබේ (අවම වශයෙන් 6 මාස, 5 වසර දක්වා).", + "-180147209": "මෙම කාල සීමාවෙන් පසු ඔබ එක් එක් සැසියෙන් ස්වයංක්‍රීයව ඉවත් වනු ඇත.", + "-374553538": "මෙම දිනය දක්වා ඔබේ ගිණුම වෙබ් අඩවියෙන් බැහැර කරනු ලැබේ (අවම වශයෙන් මාස 6 සිට අවුරුදු 5 දක්වා).", "-2121421686": "මහා බ්රිතාන්යයේ බලපත්ර ලබා ඇති සියලුම මාර්ගගත සූදු සමාගම් වලින් ස්වයං බැහැර කිරීමට, යන්න <0>www.gamstop.co.uk.", - "-2105708790": "ඔබගේ උපරිම ගිණුමේ ශේෂය සහ විවෘත තනතුරු", - "-1960600163": "ඔබගේ ගිණුමේ ශේෂය මෙම මුදල කරා ළඟා වූ පසු, ඔබට ඔබේ ගිණුමට මුදල් තැන්පත් කිරීමට නොහැකි වනු ඇත.", - "-1073845224": "විවෘත ස්ථාන ගණන (ය)", + "-2105708790": "ඔබේ උපරිම ගිණුම් ශේෂය සහ විවෘත ස්ථාන", + "-1960600163": "ඔබේ ගිණුමේ ශේෂය මෙම මුදලට ළඟා වූ පසු, ඔබට ඔබේ ගිණුමට මුදල් තැන්පත් කිරීමට නොහැකි වනු ඇත.", + "-1073845224": "විවෘත ස්ථාන ගණන", "-288196326": "ඔබේ උපරිම තැන්පතු සීමාව", "-568749373": "උපරිම. තැන්පතු සීමාව", "-1884902844": "උපරිම. දිනකට තැන්පතු සීමාව", @@ -2464,12 +2455,40 @@ "-142444667": "ඔබේ Deriv MT5 මුරපදය වෙනස් කිරීමට කරුණාකර ඊ-තැපෑලෙහි ඇති සබැඳිය ක්ලික් කරන්න.", "-742748008": "ඔබේ ඊ-තැපෑල පරීක්ෂා කර ඉදිරියට යාම සඳහා ඊ-තැපෑලෙහි ඇති සබැඳිය ක්ලික් කරන්න.", "-84068414": "තවම ඊ-තැපෑල ලැබුණේ නැද්ද? කරුණාකර <0>සජීවී කථාබස් හරහා අප හා සම්බන්ධ වන්න", + "-975118358": "ඔබේ ගිණුම මෝල්ටා මූල්ය සේවා අධිකාරිය (MFSA) විසින් නියාමනය කරනු ලබන {{legal_entity_name}}සමඟ විවෘත වන අතර මෝල්ටාවේ නීතිවලට යටත් වේ.", + "-2073934245": "මෙම වෙබ් අඩවියේ පිරිනමනු ලබන මූල්‍ය ගනුදෙනු සේවා සුදුසු වන්නේ ආයෝජනය කරන සියලුම මුදල් අහිමි වීමේ හැකියාව පිළිගන්නා සහ මූල්‍ය ගිවිසුම් මිලදී ගැනීමේදී ඇති අවදානම තේරුම් ගත් සහ ඒ පිළිබඳ අත්දැකීම් ඇති ගනුදෙනුකරුවන්ට පමණි. මූල්‍ය ගිවිසුම්වල ගනුදෙනු ඉහළ අවදානමක් දරයි. ඔබ මිල දී ගත් ගිවිසුම් නිෂ්ඵල ලෙස කල් ඉකුත් වුවහොත්, ගිවිසුම් වාරිකය ඇතුළු ඔබේ සියලුම ආයෝජන ඔබට අහිමි වනු ඇත.", + "-1125193491": "ගිණුම එක් කරන්න", + "-2068229627": "මම PEP නොවේ, පසුගිය මාස 12 ඇතුළත මම PEP නොවුණෙමි.", + "-186841084": "ඔබගේ පිවිසුම් ඊ-තැපෑල වෙනස් කරන්න", + "-907403572": "ඔබේ ඊ-තැපැල් ලිපිනය වෙනස් කිරීමට, ප්‍රථමයෙන් ඔබ ඔබේ ඊ-තැපැල් ලිපිනය ඔබේ {{identifier_title}} ගිණුමෙන් විසන්ධි කළ යුතුය.", + "-1850792730": "{{identifier_title}}වෙතින් ඉවත් වන්න", "-428335668": "ක්‍රියාවලිය සම්පූර්ණ කිරීම සඳහා ඔබ විසින් මුරපදයක් සැකසිය යුතු වේ.", + "-1232613003": "<0>සත්යාපනය අසාර්ථකයි <1>ඇයි?", + "-2029508615": "<0>සත්යාපනය අවශ්යයි <1>දැන් සත්යාපනය කරන්න", "-818898181": "ලේඛනයේ නම ඔබේ Deriv පැතිකඩට නොගැළපේ.", "-310316375": "ලේඛනයේ ඇති ලිපිනය ඔබ ඉහත ඇතුළත් කළ ලිපිනයට නොගැලපේ.", "-485368404": "ලේඛනය මාස 6 කට පෙර නිකුත් කරන ලදී.", "-367016488": "නොපැහැදිලි ලේඛනය. සියලුම තොරතුරු පැහැදිලි සහ දෘශ්‍යමාන විය යුතුය.", "-1957076143": "කපන ලද ලේඛනය. සියලුම තොරතුරු පැහැදිලි සහ දෘශ්‍යමාන විය යුතුය.", + "-231863107": "නැත", + "-870902742": "සබැඳි වෙළඳාම සම්බන්ධයෙන් ඔබට කොපමණ දැනුමක් හා පළපුරුද්දක් තිබේද?", + "-1929477717": "මට අධ්යයන උපාධියක්, වෘත්තීය සහතිකයක් සහ/හෝ මූල්ය සේවාවන්ට අදාළ සේවා පළපුරුද්ද ඇත.", + "-1540148863": "මම වෙළඳාමට අදාළ සම්මන්ත්රණ, පුහුණුව සහ/හෝ වැඩමුළු වලට සහභාගී වී ඇත්තෙමි.", + "-922751756": "වසරකට අඩු", + "-542986255": "කිසිවක් නැත", + "-1337206552": "ඔබේ අවබෝධය අනුව, CFD වෙළඳාම ඔබට ඉඩ සලසයි", + "-456863190": "ප්‍රතිඵලය ස්ථාවර ප්‍රතිලාභයක් හෝ කිසිවක් නොමැති වත්කමක මිල චලනය මත ස්ථානයක් තබන්න.", + "-1314683258": "සහතික කළ ලාභයක් සඳහා දිගුකාලීන ආයෝජනයක් කරන්න.", + "-1546090184": "උත්තෝලනය CFD ගනුදෙනුවට බලපාන්නේ කෙසේද?", + "-1636427115": "උත්තෝලනය අවදානම අවම කිරීමට උපකාරී වේ.", + "-800221491": "උත්තෝලනය ලාභ සහතික කරයි.", + "-811839563": "ගනුදෙනු වටිනාකමෙන් කොටසක් සඳහා විශාල තනතුරු විවෘත කිරීමට උත්තෝලනය ඔබට ඉඩ සලසයි, එමඟින් ලාභය හෝ අලාභය වැඩි විය හැකිය.", + "-1185193552": "ප්‍රමාණවත් වෙළඳපල ද්‍රවශීලතාවයක් පවතින තාක් කල් අලාභය නිශ්චිත මුදලකට සමාන හෝ වැඩි වූ විට ඔබේ ගනුදෙනුව ස්වක්‍රීයව වසා දමන්න.", + "-1046354": "ප්‍රමාණවත් වෙළඳපල ද්‍රවශීලතාවයක් පවතින තාක් කල් ලාභය නිශ්චිත මුදලකට සමාන හෝ වැඩි වූ විට ඔබේ ගනුදෙනුව ස්වක්‍රීයව වසා දමන්න.", + "-1842858448": "ඔබේ ගනුදෙනුවෙන් සහතික කළ ලාභයක් ලබා ගන්න.", + "-860053164": "ගුණකයන් ගනුදෙනු කරන විට.", + "-1250327770": "සමාගමක කොටස් මිලදී ගැනීමේදී.", + "-1222388581": "ඉහත සියල්ල.", "-1515286538": "කරුණාකර ඔබේ ලේඛන අංකය ඇතුළත් කරන්න. ", "-1694758788": "ඔබේ ලේඛන අංකය ඇතුළත් කරන්න", "-1458676679": "ඔබ 2-50 අක්ෂර ඇතුළත් කළ යුතුය.", @@ -2479,6 +2498,8 @@ "-1437017790": "මූල්‍ය තොරතුරු", "-70342544": "ඔබේ මූල්ය තොරතුරු ඉල්ලීමට අපි නීත්යානුකූලව බැඳී සිටිමු.", "-39038029": "වෙළඳ පළපුරුද්ද", + "-601903492": "Forex ගනුදෙනු අත්දැකීම​", + "-1012699451": "CFD ගනුදෙනු අත්දැකීම", "-1894668798": "වෙනත් වෙළඳ උපකරණ අත්දැකීම්", "-1026468600": "වෙනත් වෙළඳ උපකරණ සංඛ්යාතය", "-1743024217": "භාෂාව තෝරන්න", @@ -2489,6 +2510,11 @@ "-536187647": "ප්රවේශය අවලංගු කිරීම තහවුරු කරන්න?", "-1357606534": "අවසරය", "-570222048": "ප්රවේශ අවලංගු", + "-80717068": "ඔබ ඔබේ <0>Deriv මුරපදය වෙත සම්බන්ධ කර ඇති යෙදුම්:", + "-340060402": "ඔබගේ Deriv X මුරපදය වෙබ් සහ ජංගම යෙදුම් මත ඔබගේ Deriv X ගිණුම් වෙත පුරනය වීම සඳහා වේ.", + "-619126443": "{{brand_website_name}} සහ {{platform_name_trader}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", + "-623760979": "{{brand_website_name}}, {{platform_name_trader}} සහ {{platform_name_go}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", + "-459147994": "{{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} සහ {{platform_name_ctrader}} වෙත පුරනය වීමට <0>Deriv මුරපදය භාවිත කරන්න.", "-1526404112": "උපයෝගිතා බිල්පත: විදුලිය, ජලය, ගෑස් හෝ ස්ථාවර දුරකථන බිල්පත්.", "-537552700": "නිවාස කුලියට දීමේ ගිවිසුම: වලංගු සහ වත්මන් ගිවිසුම.", "-890084320": "සුරකින්න සහ ඉදිරිපත් කරන්න", @@ -2510,11 +2536,20 @@ "-362324454": "වෙළඳ භාණ්ඩ", "-1071336803": "වේදිකාව", "-820028470": "විකල්ප සහ ගුණක", - "-1255879419": "Trader's Hub", + "-1186807402": "මාරු කිරීම්", + "-224804428": "ගනුදෙනු", + "-470018967": "ශේෂය යළි පිහිටුවන්න", + "-693105141": "MT5 Financial", + "-1290112064": "EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "යළි සකසන්න", "-213142918": "තැන්පතු සහ මුදල් ආපසු ගැනීම තාවකාලිකව නොමැත ", - "-224804428": "ගනුදෙනු", - "-1186807402": "මාරු කිරීම්", "-1308346982": "Derived", "-1145604233": "තථ්ය-ලෝක වෙළඳපල චලනයන් අනුකරණය කරන ව්යුත්පන්න දර්ශක සමඟ MT5 මත CFDs වෙළඳාම් කරන්න.", "-328128497": "Financial", @@ -2524,28 +2559,53 @@ "-1210359945": "ඔබගේ ගිණුම් වලට අරමුදල් මාරු කරන්න", "-81256466": "CFD ගිණුමක් සෑදීමට ඔබට Deriv ගිණුමක් අවශ්‍ය වේ.", "-699372497": "සාර්ථක ගනුදෙනු සඳහා වඩා හොඳ ප්‍රතිලාභ ලබා ගැනීමට උත්තෝලනය සහ තද ව්‍යාප්ති සමඟ ගනුදෙනු කරන්න. <0>තව දැන ගන්න", - "-1884966862": "විවිධ වර්ගයේ සහ අධිකරණ බලය සහිත තවත් ඩෙරිව් එම්ටී 5 ගිණුමක් ලබා ගන්න.", - "-145462920": "Deriv cTrader", + "-1884966862": "විවිධ වර්ගයේ සහ විවිධ අධිකරණ බලය සහිත තවත් Deriv MT5 ගිණුම් ලබා ගන්න.", "-982095728": "ලබා ගන්න", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>යුරෝපා සංගම් ව්යවස්ථාපිත වියාචනය: සීඑෆ්ඩී යනු සංකීර්ණ උපකරණ වන අතර ලීවරය හේතුවෙන් වේගයෙන් මුදල් අහිමි වීමේ ඉහළ අවදානමක් ඇත. <0>සිල්ලර ආයෝජකයින්ගේ ගිණුම් වලින් 73% කට මෙම සැපයුම්කරු සමඟ සීඑෆ්ඩී වෙළඳාම් කිරීමේදී මුදල් අහිමි වේ. CFDs ක්රියා කරන ආකාරය ඔබ තේරුම් ගෙන තිබේද සහ ඔබේ මුදල් අහිමි වීමේ ඉහළ අවදානමක් ගැනීමට ඔබට හැකිද යන්න සලකා බැලිය යුතුය.", "-1277942366": "මුළු වත්කම්", + "-1255879419": "Trader's Hub", "-493788773": "යුරෝපීය සංගමයේ නොවන", "-673837884": "EU", "-230566990": "ඔබ ඉදිරිපත් කළ පහත සඳහන් ලියකියවිලි අපගේ චෙක්පත් සමත් නොවීය:", "-846812148": "ලිපිනය සනාථ කිරීම.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "යුරෝපා සංගම් නොවන නියාමනය", "-643108528": "යුරෝපා සංගම් නොවන සහ යුරෝපා සංගම් නියාමනය", + "-979459594": "Buy/Sell", + "-494667560": "නියෝග", + "-679691613": "මගේ දැන්වීම්", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "ගුණකයන් ගිණුම", "-744999940": "Deriv ගිණුම", - "-1638358352": "<0>ගුණකය සමඟ ඔබේ ආරම්භක කොටස් වලට වඩා අවදානමකින් තොරව සීඑෆ්ඩී වල උඩු යටිකුරු කරන්න.", + "-1638358352": "<0>ගුණක සමඟ ඔබේ මූලික කොටස්වලට වඩා වැඩි යමක් අවදානමට ලක් නොකර CFD හි වාසිය ලබා ගන්න.", "-749129977": "සැබෑ Deriv ගිණුමක් ලබා ගන්න, ගනුදෙනු ආරම්භ කර ඔබේ අරමුදල් කළමනාකරණය කරන්න.", "-1814994113": "CFD <0>{{compare_accounts_title}}", "-318106501": "කෘත්‍රිම​ දර්ශක, බාස්කට් සහ ව්‍යුත්පන්න FX සමඟ MT5 මත CFD ගනුදෙනු කරන්න.", "-1328701106": "Forex, කොටස්, කොටස් දර්ශක, කෘත්‍රිම​ දර්ශක, ක්‍රිප්ටෝ මුදල්, සහ වෙළඳ භාණ්ඩ​ සමඟ MT5 මත CFD ගනුදෙනු කරන්න.", "-1173266642": "මෙම ගිණුම විශේෂාංගවලින් පොහොසත් ගනුදෙනු වේදිකාවක් මත CFD පිරිනමයි.", - "-1290112064": "EZ", - "-1453519913": "ඔබගේ සියලු ප්රියතම වත්කම් සමඟ පහසුවෙන් ආරම්භ කළ හැකි වේදිකාවක් මත CFDs වෙළඳාම් කරන්න.", + "-1453519913": "ඔබේ සියලු ප්‍රියතම වත්කම් සමඟ, ආරම්භ කිරීමට පහසු වේදිකාවක් මත CFD ගනුදෙනු කරන්න.", "-2051096382": "<0>විකල්ප සමඟ වෙළඳපල චලනයන් නිවැරදිව පුරෝකථනය කිරීමෙන් ගෙවීම් පරාසයක් උපයා ගන්න, නැතහොත්\n <1>ගුණක සමඟ ඔබේ ආරම්භක කොටස්වලට වඩා අවදානමකින් තොරව CFD වල ප්‍රතිලාභ ලබා ගන්න.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "නියාමනය තෝරා ගැනීම", "-249184528": "ඔබට යුරෝපා සංගම් හෝ යුරෝපා සංගම් නොවන නියාමනය යටතේ සැබෑ ගිණුම් නිර්මාණය කළ හැකිය. <0>මෙම ගිණුම් පිළිබඳ වැඩිදුර දැන ගැනීමට<0/> අයිකනය ක්ලික් කරන්න.", "-1505234170": "වෙළෙන්දාගේ හබ් චාරිකාව", @@ -2556,7 +2616,21 @@ "-951876657": "ඔබේ ගිණුම Top-up කරන්න", "-1945421757": "ඔබට ගිණුමක් ඇති විට ගිණුමකට අරමුදල් එක් කිරීමට 'තැන්පත් කිරීම' හෝ 'මාරු කරන්න' මත ක්ලික් කරන්න", "-1965920446": "ගනුදෙනු ආරම්භ කරන්න", - "-33612390": "<0>යුරෝපා සංගම් ව්යවස්ථාපිත වියාචනය: සීඑෆ්ඩී යනු සංකීර්ණ උපකරණ වන අතර ලීවරය හේතුවෙන් වේගයෙන් මුදල් අහිමි වීමේ ඉහළ අවදානමක් ඇත. <0>සිල්ලර ආයෝජකයින්ගේ ගිණුම් වලින් 73% කට මෙම සැපයුම්කරු සමඟ සීඑෆ්ඩී වෙළඳාම් කිරීමේදී මුදල් අහිමි වේ. CFDs ක්රියා කරන ආකාරය ඔබ තේරුම් ගෙන තිබේද සහ ඔබේ මුදල් අහිමි වීමේ ඉහළ අවදානමක් ගැනීමට ඔබට හැකිද යන්න සලකා බැලිය යුතුය.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "මෙම ක්ෂේත්රය අවශ්ය වේ.", "-1870909526": "අපගේ සේවාදායකයට ලිපිනයක් ලබා ගත නොහැක.", "-582721696": "දැනට අවසර දී ඇති මුදල් ආපසු ගැනීමේ මුදල {{format_min_withdraw_amount}} සිට {{format_max_withdraw_amount}} {{currency}}දක්වා වේ", @@ -2630,7 +2704,7 @@ "-541870313": "ගෙවීම් නියෝජිතයින් හරහා තැන්පත් කරන්න", "-197251450": "{{currency_code}}හි වෙළඳාම් කිරීමට අවශ්ය නැද්ද? ඔබට තවත් cryptocurrency ගිණුමක් විවෘත කළ හැකිය.", "-91824739": "තැන්පතු {{currency}}", - "-523804269": "{{amount}} {{currency}} මත {{date}}", + "-523804269": "{{date}} ට {{amount}} {{currency}}", "-494847428": "ලිපිනය: <0>{{value}}", "-1117977576": "තහවුරු කිරීම්: <0>{{value}}", "-1935946851": "තවත් බලන්න", @@ -2644,7 +2718,7 @@ "-275902914": "Ethereum හි Tether (eUSDT)", "-1188009792": "ඔම්නි ස්ථරය මත ටෙතර් (USDT)", "-1239329687": "ටෙතර් මුලින් නිර්මාණය කරන ලද්දේ බිට්කොයින් ජාලය එහි ප්රවාහන ප්රොටෝකෝලය ලෙස භාවිතා කිරීම සඳහා වන අතර විශේෂයෙන් ඔම්නි ස්ථරය සාම්ප්රදායික මුදල් ගනුදෙනු කිරීමට ඉඩ දීම සඳහා ය.", - "-314177745": "අවාසනාවකට මෙන්, අපගේ සේවාදායකය පහළ වූ බැවින් අපට ලිපිනය ලබා ගත නොහැක. කරුණාකර ලිපිනය නැවත පූරණය කිරීමට Refresh ක්ලික් කරන්න හෝ පසුව නැවත උත්සාහ කරන්න.", + "-314177745": "අවාසනාවකට, අපගේ සේවාදායකය ක්‍රියා විරහිත වූ බැවින් අපට ලිපිනය ලබා ගැනීමට නොහැකි විය. කරුණාකර ලිපිනය නැවත පූරණය කිරීමට 'නැවුම් කරන්න' ක්ලික් කරන්න හෝ පසුව නැවත උත්සාහ කරන්න.", "-1068036170": "ඔබගේ ඩෙරිව් ෆියට් සහ {{platform_name_mt5}} ගිණුම් අතර සහ ඔබේ ඩෙරිව් ෆියට් සහ ගිණුම් {{platform_name_dxtrade}} ක් අතර එකම මුදලකින් මාරුවීම් සඳහා හුවමාරු ගාස්තුවක් අය නොකරමු.", "-2056016338": "ඔබගේ ඩෙරිව් ෆියට් සහ {{platform_name_mt5}} ගිණුම් අතර එකම මුදලකින් මාරුවීම් සඳහා හුවමාරු ගාස්තුවක් අය නොකෙරේ.", "-599632330": "ඔබගේ ඩෙරිව් ෆියට් සහ {{platform_name_mt5}} ගිණුම් අතර සහ ඔබේ ඩෙරිව් ෆියට් සහ ගිණුම් {{platform_name_dxtrade}} ක් අතර විවිධ මුදල් වල මාරුවීම් සඳහා අපි 1% හුවමාරු ගාස්තුවක් අය කරන්නෙමු.", @@ -2658,7 +2732,7 @@ "-1747571263": "සමහර මාරුවීම් කළ නොහැකි බව කරුණාකර මතක තබා ගන්න.", "-757062699": "ඉහළ අස්ථායීතාව හෝ තාක්ෂණික ගැටලු සහ හුවමාරුව වෙළඳපල වසා ඇති විට ස්ථාන මාරු ලබා ගත නොහැක.", "-1866405488": "CTrader ගිණුම් ලබා ගැනීම", - "-1344870129": "ගිණුම් ලබා", + "-1344870129": "Deriv ගිණුම්", "-1156059326": "ඔබට ඇත {{number}} හුවමාරුව අද සඳහා ඉතිරිව ඇත.", "-1109729546": "ඔබගේ ලිපිනය සත්යාපනය කළ පසු MT5 ගිණුම් සහ වෙනත් ගිණුම් අතර අරමුදල් මාරු කිරීමට ඔබට හැකි වේ.", "-1593609508": "ඩෙරිව් හි ඔබගේ ගිණුම් අතර මාරු කරන්න", @@ -2703,6 +2777,7 @@ "-1707299138": "ඔබගේ {{currency_symbol}} පසුම්බි ලිපිනය", "-38063175": "{{account_text}} පසුම්බිය", "-705272444": "ඔබගේ අනන්යතාවය තහවුරු කර ගැනීම සඳහා අනන්යතාවය පිළිබඳ සාක්ෂියක් උඩුගත කරන්න", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "මෙය ඔබගේ ගිණුම අනවසරයෙන් මුදල් ආපසු ගැනීමෙන් ආරක්ෂා කිරීමයි.", "-130833284": "ඔබේ උපරිම සහ අවම මුදල් ආපසු ගැනීමේ සීමා නියම කර නොමැති බව කරුණාවෙන් සලකන්න. ක්‍රිප්ටෝ මුදල්වල ඉහළ අස්ථායීතාව හේතුවෙන් ඒවා වෙනස් වේ.", "-1531269493": "ඔබේ ගනුදෙනුව ක්‍රියාවට නැංවූ පසු අපි ඔබට ඊ-තැපෑලක් එවන්නෙමු.", @@ -2859,6 +2934,30 @@ "-1016171176": "වත්කම", "-621128676": "ගනුදෙනු වර්ගය", "-447853970": "පාඩු සීමාව", + "-155173714": "අපි බොට් එකක් හදමු!", + "-1919212468": "3. ඔබට කාණ්ඩවලට ඉහළින් ඇති සෙවුම් තීරුව භාවිතා කර ඔබට අවශ්‍ය කොටස් සෙවිය හැකිය.", + "-1520558271": "වැඩි විස්තර සඳහා, ගනුදෙනු බොට් එකක් තැනීමේ මූලික කරුණු පිළිබඳ මෙම බ්ලොග් සටහන බලන්න.", + "-980360663": "3. ඔබට අවශ්‍ය කොටස තෝරා එය වැඩබිමට ඇද දමන්න.", + "-1493168314": "ඉක්මන් උපාය මාර්ගයක් යනු කුමක්ද?", + "-1680391945": "ඉක්මන් උපාය මාර්ගයක් භාවිතා කිරීම", + "-1177914473": "මම​ මගේ උපාය මාර්ගය සුරකින්නේ කෙසේද?", + "-271986909": "බොට් ගොඩනඟන්නා තුළ, ඔබේ බොට් එක​ බා ගත කර ගැනීමට​ ඉහළින් ඇති මෙවලම් තීරුවේ සුරකින්න ඔබන්න. ඔබේ බොට් හට​ නමක් ලබා දී, ඔබේ උපාංගයට හෝ Google Drive වෙත ඔබේ බොට් එක​ බා ගත කර ගැනීම තෝරන්න. ඔබේ බොට් XML ගොනුවක් ලෙස බාගත​ වනු ඇත​.", + "-1149045595": "1. පහර පසු ආයාත, තෝරා පළාත් ක්ලික් කරන්න ඉදිරියට.", + "-288041546": "2. ඔබගේ XML ගොනුව තෝරාගෙන විවෘත කරන්න.", + "-2127548288": "3. ඔබේ බොට් එක ඒ අනුව පටවනු ලැබේ.", + "-1311297611": "1. ආයාතපහර පසු, තෝරා Google Drive ක්ලික් කරන්න ඉදිරියට.", + "-1549564044": "වැඩබිම නැවත සකසන්නේ කෙසේද?", + "-1127331928": "තුළ Bot Builder, ඉහළින් ඇති මෙවලම් තීරුවේ යළි පිහිටුවන්න පහර දෙන්න. මෙය වැඩබිම ඉවත් කරනු ඇත. නොගැලවූ ඕනෑම වෙනස්කම් නැති වනු ඇති බව කරුණාවෙන් සලකන්න.", + "-1720444288": "Deriv බොට් සමඟ මගේ පාඩු පාලනය කරන්නේ කෙසේද?", + "-1142295124": "Deriv බොට් සමඟ ඔබේ අලාභය​ පාලනය කිරීමට ක්‍රම කිහිපයක් තිබේ. ඔබේ උපාය මාර්ගය තුළ ඔබට අලාභ පාලනය ක්‍රියාත්මක කළ හැකි ආකාරය පිළිබඳ සරල උදාහරණයක් මෙන්න:", + "-986689483": "1. පහත සඳහන් විචල්‍යයන් සාදන්න:", + "-269910127": "3. පසුගිය ගිවිසුමේ ලාභය සමඟින් වත්මන් ලාභය/අලාභය යාවත්කාලීන කරන්න. අවසාන ගිවිසුම දිනා ගැනීමට නොහැකි වුවහොත්, වත්මන් ලාභය/අලාභය හි අගය සෘණ වනු ඇත.", + "-1565344891": "මගේ වෙබ් බ්රව්සරයේ බහු ටැබ් මත ඩෙරිව් බොට් ධාවනය කළ හැකිද?", + "-90192474": "ඔව්, ඔබට පුළුවන්. කෙසේ වෙතත්, ඔබගේ ගිණුමේ සීමාවන් තිබේ, එනම් උපරිම විවෘත තනතුරු ගණන සහ විවෘත තනතුරු සඳහා උපරිම සමස්ත ගෙවීම් වැනි. එබැවින්, විවිධ තනතුරු විවෘත කිරීමේදී මෙම සීමාවන් මතකයේ තබා ගන්න. ඔබට මෙම සීමාවන් පිළිබඳ වැඩි විස්තර සොයාගත හැකිය සැකසීම්> ගිණුම් සීමාවන්.", + "-213872712": "නැත, අපි ඩෙරිව් බොට් හි ගුප්තකේතන මුදල් ලබා නොදෙන්නෙමු.", + "-2147346223": "Deriv බොට් තිබෙන්නේ කුමන රටවලද?", + "-352345777": "ස්වයංක්‍රීය ගනුදෙනු සඳහා වඩාත් ජනප්‍රිය උපාය මාර්ග මොනවාද?", + "-552392096": "ස්වයංක්රීය වෙළඳාමේ බහුලව භාවිතා වන උපාය මාර්ග තුනක් වන්නේ මාටින්ගේල්, ඩි ඇලෙම්බර්ට් සහ ඔස්කාර්ගේ ග්රින්ඩ් ය - ඔබට ඒවා සියල්ලම සූදානම් කර ඩෙරිව් බොට් හි ඔබ එනතුරු බලා සිටිය හැකිය.", "-507620484": "නොගැලවීම", "-764102808": "ගූගල් ඩ්රයිව්", "-555886064": "දිනයි", @@ -2901,11 +3000,11 @@ "-358288026": "සටහන: ඔබට මෙම නිබන්ධනය <0>නිබන්ධන පටිත්තෙහි ද සොයාගත හැකිය.", "-1793577405": "මුල සිට ගොඩනඟන්න", "-358753028": "අපගේ drag සහ​ drop කොටස් භාවිත කර ඔබේ බොට් සාදන්න නැතහොත් භාවිතයට සූදානම් බොට් සැකිලි තෝරා ගැනීමට ඉක්මන් උපාය මාර්ගය ක්ලික් කරන්න.", - "-1212601535": "වෙළඳපල අධීක්ෂණය කරන්න", + "-1212601535": "වෙළඳපල නිරීක්ෂණය කරන්න", "-21136101": "ඔබගේ බොට් තත්‍ය කාලීනව ක්‍රියා කරන ආකරය බලන්න.", "-631097919": "ඔබට ගනුදෙනු ආරම්භ කිරීමට අවශ්‍ය විට <0>ධාවනය කරන්න ක්ලික් කරන්න, ඔබට ගනුදෙනු නතර කිරීමට අවශ්‍ය විට <0>නවත්වන්න ක්ලික් කරන්න.", "-1999747212": "සංචාරය නැවත ලබා ගැනීමට අවශ්‍යද?", - "-129587613": "ඒක ගත්තා, ස්තූතියි!", + "-129587613": "එය ලැබුනා. ස්තූතියි!", "-782992165": "පියවර 1 :", "-1207872534": "පළමුව, <0>ගනුදෙනු පරාමිතීන් අවහිර කරන්න.", "-1656388044": "පළමුව, <0>වෙළඳපල Derived > අඛණ්ඩ දර්ශක > 100 (1s) අස්ථායීතා දර්ශකය ලෙස සකසන්න.", @@ -2929,43 +3028,19 @@ "-1411787252": "පියවර 1", "-1109392787": "සරල උපාය මාර්ගයක් භාවිත කරමින් මුල සිටම ඔබේ බොට් ගොඩනගන්නේ කෙසේදැයි ඉගෙන ගන්න.", "-1263822623": "ඔබට ඔබගේ ජංගම උපාංගයෙන් හෝ Google drive වෙතින් බොට් එකක් ආනයනය කළ හැකිය, බොට් ගොඩනඟන්නාගේ පෙරදසුනක් බලා බොට් ධාවනය කිරීමෙන් ගනුදෙනුව ආරම්භ කළ හැකිය.", - "-563921656": "බොට් ඉදි කරන්නන්ගේ මාර්ගෝපදේශය", + "-563921656": "බොට් ගොඩනඟන්නන්ගේ මාර්ගෝපදේශය", "-1109191651": "0 ට වඩා වැඩි සංඛ්‍යාවක් විය යුතුය", "-689786738": "අවම කාලසීමාව: {{ min }}", "-184183432": "උපරිම කාලසීමාව: {{ max }}", "-1494924808": "අගය 2 ට සමාන හෝ වැඩි විය යුතුය.", - "-1823621139": "ඉක්මන් උපාය", - "-1778025545": "ඔබ සාර්ථකව බොට් එකක් ආනයනය කර ඇත.", - "-1519425996": "ප්‍රතිඵල සොයාගත නොහැකි විය \"{{ faq_search_value }}”", - "-155173714": "අපි බොට් එකක් හදමු!", - "-1919212468": "3. ඔබට කාණ්ඩවලට ඉහළින් ඇති සෙවුම් තීරුව භාවිතා කර ඔබට අවශ්‍ය කොටස් සෙවිය හැකිය.", - "-1520558271": "වැඩි විස්තර සඳහා, ගනුදෙනු බොට් එකක් තැනීමේ මූලික කරුණු පිළිබඳ මෙම බ්ලොග් සටහන බලන්න.", - "-980360663": "ඔබට අවශ්‍ය කොටස තෝරා එය වැඩබිමට ඇද දමන්න.", - "-1493168314": "ඉක්මන් උපාය මාර්ගයක් යනු කුමක්ද?", - "-1680391945": "ඉක්මන් උපාය මාර්ගයක් භාවිතා කිරීම", - "-1177914473": "මම​ මගේ උපාය මාර්ගය සුරකින්නේ කෙසේද?", - "-271986909": "බොට් ගොඩනඟන්නා තුළ, ඔබේ බොට් එක​ බා ගත කර ගැනීමට​ ඉහළින් ඇති මෙවලම් තීරුවේ සුරකින්න ඔබන්න. ඔබේ බොට් හට​ නමක් ලබා දී, ඔබේ උපාංගයට හෝ Google Drive වෙත ඔබේ බොට් එක​ බා ගත කර ගැනීම තෝරන්න. ඔබේ බොට් XML ගොනුවක් ලෙස බාගත​ වනු ඇත​.", - "-1149045595": "1. පහර පසු ආයාත, තෝරා පළාත් ක්ලික් කරන්න ඉදිරියට.", - "-288041546": "2. ඔබගේ XML ගොනුව තෝරාගෙන විවෘත කරන්න.", - "-2127548288": "3. ඔබේ බොට් එක ඒ අනුව පටවනු ලැබේ.", - "-1311297611": "1. ආයාතපහර පසු, තෝරා Google Drive ක්ලික් කරන්න ඉදිරියට.", - "-1549564044": "වැඩබිම නැවත සකසන්නේ කෙසේද?", - "-1127331928": "තුළ Bot Builder, ඉහළින් ඇති මෙවලම් තීරුවේ යළි පිහිටුවන්න පහර දෙන්න. මෙය වැඩබිම ඉවත් කරනු ඇත. නොගැලවූ ඕනෑම වෙනස්කම් නැති වනු ඇති බව කරුණාවෙන් සලකන්න.", - "-1720444288": "Deriv බොට් සමඟ මගේ පාඩු පාලනය කරන්නේ කෙසේද?", - "-1142295124": "Deriv බොට් සමඟ ඔබේ අලාභය​ පාලනය කිරීමට ක්‍රම කිහිපයක් තිබේ. ඔබේ උපාය මාර්ගය තුළ ඔබට අලාභ පාලනය ක්‍රියාත්මක කළ හැකි ආකාරය පිළිබඳ සරල උදාහරණයක් මෙන්න:", - "-986689483": "1. පහත සඳහන් විචල්‍යය සාදන්න:", - "-269910127": "3. පසුගිය ගිවිසුමේ ලාභය සමඟින් වත්මන් ලාභය/අලාභය යාවත්කාලීන කරන්න. අවසාන ගිවිසුම දිනා ගැනීමට නොහැකි වුවහොත්, වත්මන් ලාභය/අලාභය හි අගය සෘණ වනු ඇත.", - "-1565344891": "මගේ වෙබ් බ්රව්සරයේ බහු ටැබ් මත ඩෙරිව් බොට් ධාවනය කළ හැකිද?", - "-90192474": "ඔව්, ඔබට පුළුවන්. කෙසේ වෙතත්, ඔබගේ ගිණුමේ සීමාවන් තිබේ, එනම් උපරිම විවෘත තනතුරු ගණන සහ විවෘත තනතුරු සඳහා උපරිම සමස්ත ගෙවීම් වැනි. එබැවින්, විවිධ තනතුරු විවෘත කිරීමේදී මෙම සීමාවන් මතකයේ තබා ගන්න. ඔබට මෙම සීමාවන් පිළිබඳ වැඩි විස්තර සොයාගත හැකිය සැකසීම්> ගිණුම් සීමාවන්.", - "-213872712": "නැත, අපි ඩෙරිව් බොට් හි ගුප්තකේතන මුදල් ලබා නොදෙන්නෙමු.", - "-2147346223": "Deriv බොට් තිබෙන්නේ කුමන රටවලද?", - "-352345777": "ස්වයංක්‍රීය ගනුදෙනු සඳහා වඩාත් ජනප්‍රිය උපාය මාර්ග මොනවාද?", - "-552392096": "ස්වයංක්රීය වෙළඳාමේ බහුලව භාවිතා වන උපාය මාර්ග තුනක් වන්නේ මාටින්ගේල්, ඩි ඇලෙම්බර්ට් සහ ඔස්කාර්ගේ ග්රින්ඩ් ය - ඔබට ඒවා සියල්ලම සූදානම් කර ඩෙරිව් බොට් හි ඔබ එනතුරු බලා සිටිය හැකිය.", + "-1823621139": "ඉක්මන් උපාය මාර්ගය", + "-1778025545": "ඔබ සාර්ථකව බොට් එකක් ආයාත කර ඇත.", + "-1519425996": "\"{{ faq_search_value }}” ප්‍රතිඵල සොයාගත නොහැකි විය", "-418247251": "ඔබේ ජර්නලය බාගන්න.", - "-2123571162": "බාගත", + "-2123571162": "බාගන්න", "-870004399": "<0>මිලදී ගත්: {{longcode}} (ID: {{transaction_id}})", "-1211474415": "පෙරහන්", - "-186972150": "ප්‍රදර්ශනය කිරීමට පණිවිඩ නොමැත", + "-186972150": "ප්‍රදර්ශනය කිරීමට පණිවුඩ​ නොමැත", "-999254545": "සියලුම පණිවිඩ පෙරීම සිදු වේ", "-1121028020": "හෝ, ඔබ කැමති නම්...", "-254025477": "ඔබගේ උපාංගයෙන් XML ගොනුවක් තෝරන්න", @@ -2998,8 +3073,6 @@ "-883103549": "ගිණුම අක්‍රීය කර ඇත", "-1837059346": "ගැනුම් / විකුණුම්", "-1845037007": "දැන්වීම්කරුගේ පිටුව", - "-494667560": "නියෝග", - "-679691613": "මගේ දැන්වීම්", "-821418875": "ගනුදෙනුකරුවා", "-679102561": "ගිවිසුම් විස්තර", "-430118939": "පැමිණිලි ප්රතිපත්තිය", @@ -3049,16 +3122,16 @@ "-1585069798": "ඔබගේ යෝග්යතා පරීක්ෂණය සම්පූර්ණ කිරීම සඳහා කරුණාකර පහත සබැඳිය ක්ලික් කරන්න.", "-1287141934": "වැඩි විස්තර දැනගන්න", "-367759751": "ඔබගේ ගිණුම සත්යාපනය කර නොමැත", - "-596690079": "ඩෙරිව් භාවිතා කිරීමෙන් විනෝද වන්න?", + "-596690079": "Deriv භාවිතයෙන් සතුටක් ලබනවා ද?", "-265932467": "අපි ඔබේ සිතුවිලි අහන්න කැමතියි", - "-1815573792": "ට්රස්ට්නියමු පිළිබඳ ඔබේ සමාලෝචනය අතහරින්න.", - "-823349637": "ට්රස්ට්නියමු වෙත යන්න", + "-1815573792": "Trustpilot හි ඔබේ සමාලෝචනය ඇතුළත් කරන්න.", + "-823349637": "Trustpilot වෙත යන්න", "-1204063440": "මගේ ගිණුම් මුදල් සකසන්න", "-1601813176": "ඔබේ දෛනික සීමාවන් {{max_daily_buy}} {{currency}} (මිලදී ගැනීම) සහ {{max_daily_sell}} {{currency}} (විකිණීම) දක්වා වැඩි කිරීමට ඔබ කැමතිද?", - "-1751632759": "<0>{{platform_name_go}} යෙදුම සමඟ වේගවත් ජංගම වෙළඳ අත්දැකීමක් ලබා ගන්න!", + "-1751632759": "<0>{{platform_name_go}} යෙදුම සමඟ වේගවත් ජංගම ගනුදෙනු අත්දැකීමක් ලබා ගන්න!", "-1164554246": "ඔබ කල් ඉකුත් වූ හඳුනාගැනීමේ ලේඛන ඉදිරිපත් කළා", "-219846634": "ඔබගේ හැඳුනුම්පත සත්යාපනය කරමු", - "-529038107": "ස්ථාපනය", + "-529038107": "ස්ථාපනය කරන්න", "-1738575826": "කරුණාකර ඔබගේ සැබෑ ගිණුමට මාරු වන්න හෝ මුදල් අයකැමි වෙත ප්රවේශ වීමට එකක් සාදන්න.", "-1329329028": "ඔබ ඔබේ දින 30 ක පිරිවැටුම් සීමාව නියම කර නැත", "-132893998": "ඔබගේ දින 30 ක පිරිවැටුම් සීමාව නියම කර නොමැති බැවින් මුදල් අයකැමි වෙත ඔබගේ ප්රවේශය තාවකාලිකව අක්රීය කර ඇත. කරුණාකර ස්වයං-බැහැර කිරීමට ගොස් සීමාව නියම කරන්න.", @@ -3082,7 +3155,6 @@ "-430041639": "ඔබගේ ලිපිනය පිළිබඳ සාක්ෂිය අපගේ සත්යාපන චෙක්පත් සමත් නොවූ අතර, අපි ඔබගේ ගිණුමට යම් සීමාවන් තබා ඇත්තෙමු. කරුණාකර ඔබේ ලිපිනය පිළිබඳ සාක්ෂි නැවත ඉදිරිපත් කරන්න.", "-87177461": "කරුණාකර ඔබගේ ගිණුම් සැකසුම් වෙත ගොස් තැන්පතු සක්රීය කිරීම සඳහා ඔබේ පුද්ගලික තොරතුරු සම්පූර්ණ කරන්න.", "-904632610": "ඔබගේ ශේෂය නැවත සකසන්න", - "-470018967": "ශේෂය යළි පිහිටුවන්න", "-156611181": "එය අගුළු ඇරීමට කරුණාකර ඔබගේ ගිණුම් සැකසුම් තුළ මූල්ය තක්සේරුව සම්පූර්ණ කරන්න.", "-1925176811": "මේ මොහොතේ මුදල් ආපසු ගැනීම සැකසීමට නොහැකි විය", "-980696193": "පද්ධති නඩත්තු කිරීම හේතුවෙන් මුදල් ආපසු ගැනීම තාවකාලිකව නොමැත. නඩත්තු කටයුතු අවසන් වූ විට ඔබට මුදල් ආපසු ලබා ගත හැකිය.", @@ -3107,12 +3179,12 @@ "-577279362": "ඔබගේ ගිණුම සත්යාපනය කිරීමට සහ වෙළඳාම දිගටම කරගෙන යාමට කරුණාකර ඔබේ අනන්යතාවය පිළිබඳ සාක්ෂි ඉදිරිපත් කරන්න.", "-197134911": "අනන්යතාවය පිළිබඳ ඔබේ සාක්ෂිය කල් ඉකුත් වී ඇත", "-152823394": "ඔබගේ අනන්යතාවය පිළිබඳ සාක්ෂි කල් ඉකුත් වී ඇත. කරුණාකර ඔබගේ ගිණුම සත්යාපනය කිරීමට සහ වෙළඳාම දිගටම කරගෙන යාමට අනන්යතාවය පිළිබඳ නව සාක්ෂියක් ඉදිරිපත් කරන්න.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "එය නිවැරදි කිරීමට මෙම සරල උපදෙස් අනුගමනය කරන්න.", "-2142540205": "ඔබගේ ලේඛනයේ ලිපිනය ඔබගේ ඩෙරිව් පැතිකඩෙහි ඇති ලිපිනයට නොගැලපෙන බව පෙනේ. කරුණාකර ඔබේ පුද්ගලික තොරතුරු දැන් නිවැරදි ලිපිනය සමඟ යාවත්කාලීන කරන්න.", "-482715448": "පුද්ගලික විස්තර වෙත යන්න", "-2072411961": "ඔබගේ ලිපිනය පිළිබඳ සාක්ෂි සත්යාපනය කර ඇත", "-384887227": "ඔබගේ පැතිකඩෙහි ලිපිනය යාවත්කාලීන කරන්න.", - "-448961363": "යුරෝපා සංගම් නොවන", "-1998049070": "අපගේ කුකීස් භාවිතා කිරීමට ඔබ එකඟ වන්නේ නම්, මත ක්ලික් කරන්න පිළිගන්න. වැඩි විස්තර සඳහා <0>අපගේ ප්රතිපත්තිය බලන්න.", "-402093392": "ගිණුම එකතු කරන්න", "-1721181859": "ඔබට {{deriv_account}} ගිණුමක් අවශ්ය වේ", @@ -3125,7 +3197,6 @@ "-650505513": "සම්පූර්ණ තිරය", "-1823504435": "දැනුම්දීම් බලන්න", "-1954045170": "මුදල් පවරා නැත", - "-583559763": "මෙනු", "-1591792668": "ගිණුම් සීමාවන්", "-34495732": "නියාමන තොරතුරු", "-1496158755": "Deriv.com වෙත යන්න", @@ -3144,12 +3215,12 @@ "-71049153": "මුරපදයකින් ඔබේ ගිණුම සුරක්ෂිතව තබා ගන්න", "-1861974537": "ශක්තිමත් මුරපදවල අවම වශයෙන් අක්ෂර 8 ක් අඩංගු වේ, කැපිටල් අකුරු, සිම්පල් අකුරු, අංක, සහ සංකේත ඒකාබද්ධ කරන්න.", "-1485242688": "පියවර {{step}}: {{step_title}} ({{step}} හි {{steps}})", - "-1829842622": "ඔබට එක් එක් cryptocurrency සඳහා ගිණුමක් විවෘත කළ හැකිය.", + "-1829842622": "ඔබට එක් එක් ක්‍රිප්ටෝ මුදල් ඒකක සඳහා ගිණුමක් විවෘත කළ හැකිය.", "-987221110": "ඔබ ගනුදෙනු කිරීමට කැමති මුදල් වර්ගයක් තෝරන්න.", "-1066574182": "මුදල් ඒකකයක් තෝරන්න", "-1914534236": "ඔබේ මුදල් තෝරන්න", "-200560194": "මුදල් වෙනස් කිරීමට කරුණාකර ඔබගේ {{fiat_currency}} ගිණුමට මාරු වන්න.", - "-1829493739": "ඔබ වෙළඳාම් කිරීමට කැමති මුදල් තෝරන්න.", + "-1829493739": "ඔබ ගනුදෙනු කිරීමට කැමති මුදල් ඒකකය තෝරන්න.", "-1814647553": "අලුත් එකක් එකතු කරන්න", "-1269362917": "නව එකතු කරන්න", "-650480777": "ක්රිප්ටෝ ගිණුම", @@ -3161,8 +3232,8 @@ "-1041852744": "අපි ඔබේ පුද්ගලික තොරතුරු සකසනවා", "-1775006840": "වෙළඳාම ආරම්භ කිරීම සඳහා දැන් තැන්පතුවක් කරන්න.", "-983734304": "ඔබට වෙළඳාම ආරම්භ කිරීමට පෙර ඔබගේ අනන්යතාවය සහ ලිපිනය පිළිබඳ සාක්ෂි අපට අවශ්ය වේ.", - "-917733293": "වෙළඳාම ලබා ගැනීම සඳහා කරුණාකර ඔබ ජීවත් වන ස්ථානය තහවුරු කරන්න.", - "-1282628163": "සත්යාපනය සම්පූර්ණ වූ වහාම ඔබට වෙළඳාම ලබා ගත හැකිය.", + "-917733293": "ගනුදෙනු ආරම්භ කිරීම සඳහා කරුණාකර ඔබ ජීවත් වන ස්ථානය තහවුරු කරන්න.", + "-1282628163": "සත්‍යාපනය සම්පූර්ණ වූ වහාම ඔබට ගනුදෙනු කිරීමට හැකි වනු ඇත.", "-952649119": "පුරනය වන්න", "-3815578": "ලියාපදිංචි වන්න", "-1456176427": "ඔබගේ සැබෑ ගිණුම සඳහා මුදල් සකසන්න", @@ -3185,22 +3256,22 @@ "-292363402": "වෙළඳ සංඛ්යාලේඛන වාර්තාව", "-1656860130": "විකල්ප වෙළඳාම සැබෑ ඇබ්බැහි වීමක් බවට පත්විය හැකිය, වෙනත් ඕනෑම ක්රියාකාරකමක් එහි සීමාවන්ට තල්ලු කළ හැකිය. එවැනි ඇබ්බැහි වීමේ අන්තරාය වළක්වා ගැනීම සඳහා, අපි නිතිපතා ඔබේ ගනුදෙනු සහ ගිණුම් පිළිබඳ සාරාංශයක් ලබා දෙන යථාර්ත-චෙක්පතක් ලබා දෙන්නෙමු.", "-28080461": "පළමුව ඔබේ ප්රකාශය පරීක්ෂා කිරීමට කැමතිද? <0>ප්රකාශය පරීක්ෂා කරන්න", - "-611059051": "කරුණාකර ඔබ කැමති පරතර රියලිටි පරීක්ෂාව මිනිත්තු කිහිපයකින් සඳහන් කරන්න:", + "-611059051": "කරුණාකර විනාඩි කිහිපයකින් ඔබ කැමති කාල අන්තර යථාර්ථය පරීක්ෂාව සඳහන් කරන්න:", "-1876891031": "මුදල් ඒකකය", "-11615110": "පිරිවැටුම", "-1370419052": "ලාභය/අලාභය", "-437320982": "සැසි කාලය:", - "-3959715": "වත්මන් කාලය:", + "-3959715": "වත්මන් වේලාව:", "-1534648620": "ඔබේ මුරපදය වෙනස් කර ඇත", - "-596199727": "අපි දැන් ඔබව පිවිසුම් පිටුවට හරවා එවන්නෙමු.", + "-596199727": "අපි දැන් ඔබව පිවිසුම් පිටුවට හරවා යවන්නෙමු.", "-310434518": "ඊ-තැපැල් ආදානය හිස් නොවිය යුතුය.", - "-437918412": "ඔබගේ ගිණුමට මුදල් පවරා නොමැත", + "-437918412": "ඔබේ ගිණුමට මුදල් ඒකකයක් පවරා නොමැත", "-1193651304": "පදිංචි රට", "-707550055": "අපගේ සේවාව ඔබගේ රටේ නීති හා රෙගුලාසි වලට අනුකූල වන බවට වග බලා ගැනීම සඳහා මෙය අවශ්ය වේ.", "-280139767": "පදිංචිය සකසන්න", "-601615681": "තේමාව තෝරන්න", "-1152511291": "අඳුරු", - "-1428458509": "ආලෝකය", + "-1428458509": "අඳුරු නැති", "-1976089791": "ඔබේ Deriv ගිණුම ඔබේ {{social_identity_provider}} ගිණුමෙන් විසන්ධි කර ඇත. ඔබට දැන් ඔබේ නව ඊ-තැපැල් ලිපිනය සහ මුරපදය භාවිතයෙන් Deriv වෙත පුරනය විය හැක.", "-505449293": "ඔබේ Deriv ගිණුම සඳහා නව මුරපදයක් ඇතුළත් කරන්න.", "-1728963310": "ගිණුමක් සෑදීම නවත්වන්න ද?", @@ -3208,14 +3279,14 @@ "-1235799308": "ව්යාජ සබැඳි බොහෝ විට “ඩෙරිව්” මෙන් පෙනෙන වචනය අඩංගු වන නමුත් මෙම වෙනස්කම් සොයා බලන්න.", "-2102997229": "උදාහරණ", "-82488190": "මම ඉහත කරුණු හොඳින් කියවා ඇත්තෙමි.", - "-97775019": "ව්යාජ වෙබ් අඩවි, දැන්වීම් හෝ ඊමේල් පිළිබඳ ඔබේ අක්තපත්ර විශ්වාස නොකරන්න.", - "-2142491494": "හරි, ඒක ගත්තා", - "-611136817": "ව්යාජ සබැඳි වලින් පරෙස්සම් වන්න.", + "-97775019": "ව්‍යාජ වෙබ් අඩවි, දැන්වීම් හෝ ඊ-තැපැල් විශ්වාස කර ඔබේ පරිශීලක නාම හා මුරපද ඒවාට දෙන්න එපා.", + "-2142491494": "හරි, තේරුණා", + "-611136817": "ව්‍යාජ සබැඳි ගැන විමසිල්ලෙන් සිටින්න.", "-1787820992": "වේදිකා", "-1793883644": "අභිරුචිකරණය කළ හැකි, භාවිතයට පහසු වෙළඳ වේදිකාවක් මත එෆ්එක්ස් සහ සීඑෆ්ඩී වෙළඳාම් කරන්න.", "-184713104": "සීමිත අවදානමක් සහිතව ඔබේ වාසි වැඩි කර ගැනීම සඳහා විකල්ප හෝ වෙළඳ ගුණකයන් සමඟ ස්ථාවර ගෙවීම් උපයන්න.", "-1571775875": "අපගේ ප්රමුඛ විකල්ප සහ ගුණක වෙළඳ වේදිකාව.", - "-895091803": "ඔබ සීඑෆ්ඩී සොයන්නේ නම්", + "-895091803": "ඔබ CFD සොයන්නේ නම්", "-1447215751": "විශ්වාස නැද්ද? මෙය උත්සාහ කරන්න", "-2338797": "ඔබ තබා ඇති ප්රමාණයට <0>වඩා අවදානමට ලක් කිරීමෙන් <0>ප්රතිලාභ උපරිම කරන්න.", "-1682067341": "ඔබ තැබූ දේ <0>පමණක් අවදානමට ලක් කිරීමෙන් <0>ස්ථාවර ප්රතිලාභ උපයන්න.", @@ -3232,9 +3303,9 @@ "-1406192787": "ප්රති come ලය පිළිබඳව ඔබ සෑහීමකට පත් නොවන්නේ නම්, <0>මූල්ය කොමිෂන් සභාව වෙත ඔබේ පැමිණිල්ල උත්සන්න කළ හැකිය.", "-1776547326": "<0/><1/>ඔබ එක්සත් රාජධානියේ පදිංචිව සිටින්නේ නම් සහ අපගේ ප්‍රතිචාරය ගැන ඔබ නොසතුටින් පසු වන්නේ නම්, ඔබට ඔබේ පැමිණිල්ල <2>මූල්‍ය ඔම්බුඩ්ස්මන් සේවයට තීව්‍ර කළ හැක.", "-2115348800": "1. හැඳින්වීම", - "-744009523": "2. සාධාරණ ප්රතිකාර", + "-744009523": "2. සාධාරණව සැලකීම", "-866831420": "3.1. පැමිණිල්ලක් ඉදිරිපත් කිරීම", - "-1102904026": "3.2. ඔබගේ පැමිණිල්ල මෙහෙයවීම", + "-1102904026": "3.2. ඔබේ පැමිණිල්ල හැසිරවීම", "-603378979": "3.3. ඔබේ පැමිණිල්ල විසඳීම", "-697569974": "3.4. ඔබේ තීරණය", "-1280998762": "4. පැමිණිලි", @@ -3257,13 +3328,14 @@ "-1500907666": "<0>ඈ. තීරණය අපගේ පක්ෂව ලබා දී තිබේ නම්, ඔබ තීරණය කරන විට දින 7 ක් ඇතුළත අප වෙනුවෙන් නිදහස් ලබා දිය යුතු අතර, පැමිණිල්ල වසා සලකා බලනු ලැබේ.", "-429248139": "5. වගකීමෙන් යුතුව ඔබ එවන", "-818926350": "මූල්ය කොමිෂන් සභාව සිද්ධිය වූ දිනට පසු දින 45 ක් සඳහා අභියාචනා භාර ගන්නා අතර වෙළෙන්දා සමාගම සමඟ ගැටළුව කෙලින්ම විසඳීමට උත්සාහ කිරීමෙන් පසුව පමණි.", - "-1825471709": "බලවත් නමුත් භාවිතයට පහසු වේදිකාවක් මත නව ගනුදෙනු අත්දැකීමක්.", - "-981017278": "ඔබේ ඇඟිලි තුඩුවල ස්වයංක්‍රීය ගනුදෙනු. කේතීකරණ අවශ්‍ය නොවේ.", + "-1825471709": "බලවත් එහෙත් භාවිතයට පහසු වේදිකාවක් මත නව ගනුදෙනු අත්දැකීමක්.", + "-981017278": "ස්වයංක්‍රීය ගනුදෙනු ඔබේ අත ළඟටම. කේතීකරණ අවශ්‍ය නොවේ.", + "-583559763": "මෙනු", "-778309978": "ඔබ ක්ලික් කළ සබැඳිය කල් ඉකුත් වී ඇත. ඔබේ එන ලිපි තුළ ඇති නවතම ඊ-තැපෑලෙහි ඇති සබැඳිය ක්ලික් කළ බවට සහතික වන්න. විකල්පයක් ලෙස, ඔබේ ඊ-තැපෑල පහතින් ඇතුළු කර නව සබැඳියක් සඳහා <0>යළි ඊ-තැපෑලක් එවන්න ක්ලික් කරන්න.", "-336222114": "එය නිවැරදි කිරීමට මෙම සරල පියවර අනුගමනය කරන්න:", "-1064116456": "<0>ඩෙරිව් හෝල්ඩින්ග්ස් (ගුවර්න්සි) ලිමිටඩ් තැරැව්කරු සඳහා සොයන්න එය තෝරන්න.", "-941870889": "මුදල් අයකැමි සැබෑ ගිණුම් සඳහා පමණි", - "-352838513": "ඔබට සැබෑ {{regulation}} ගිණුමක් නොමැති බව පෙනේ. මුදල් අයකැමි භාවිතා කිරීම සඳහා, ඔබගේ {{active_real_regulation}} සැබෑ ගිණුමට මාරු වන්න, නැතහොත් {{regulation}} සැබෑ ගිණුමක් ලබා ගන්න.", + "-352838513": "ඔබට සැබෑ {{regulation}} ගිණුමක් නොමැති බව පෙනේ. අයකැමි භාවිත කිරීමට, ඔබේ {{active_real_regulation}} සැබෑ ගිණුමට මාරු වන්න, නැතහොත් සැබෑ {{regulation}} ගිණුමක් ලබා ගන්න.", "-1858915164": "සැබෑ ලෙස තැන්පත් කිරීමට සහ ගනුදෙනු කිරීමට සූදානම් ද?", "-162753510": "සැබෑ ගිණුමක් එක් කරන්න", "-1208519001": "අයකැමි වෙත ප්‍රවේශ වීමට ඔබට සැබෑ Deriv ගිණුමක් අවශ්‍ය වේ.", @@ -3333,7 +3405,7 @@ "-742647506": "අරමුදල් මාරු කිරීම", "-1972393174": "අපගේ කෘත්‍රිම​ දර්ශක, බාස්කට් සහ ව්‍යුත්පන්න FX මත CFD ගනුදෙනු කරන්න.", "-1357917360": "වෙබ් පර්යන්තය", - "-1454896285": "MT5 ඩෙස්ක්ටොප් යෙදුම වින්ඩෝස් එක්ස්පී, වින්ඩෝස් 2003 සහ වින්ඩෝස් විස්ටා විසින් සහය නොදක්වයි.", + "-1454896285": "MT5 ඩෙස්ක්ටොප් යෙදුමට Windows XP, Windows 2003, සහ Windows Vista විසින් සහය නොදක්වයි.", "-810388996": "ඩෙරිව් එක්ස් ජංගම යෙදුම බාගන්න", "-1727991510": "ඩෙරිව් එක්ස් මොබයිල් ඇප් බාගත කිරීම සඳහා QR කේතය පරිලෝකනය කරන්න", "-1769852749": "N/A", @@ -3349,7 +3421,7 @@ "-1385484963": "ඔබේ {{platform}} මුරපදය වෙනස් කිරීමට තහවුරු කරන්න", "-1990902270": "මෙය ඔබේ සියලුම {{platform}} ගිණුම් සඳහා මුරපදය වෙනස් කරනු ඇත.", "-1922462747": "Trader's Hub", - "-700260448": "නිරූපණය", + "-700260448": "ආදර්ශන​ ගිණුම", "-1769158315": "සැබෑ", "-2015785957": "CFD {{demo_title}} ගිණුම් සසඳන්න", "-673424733": "ආදර්ශන ගිණුම", @@ -3367,7 +3439,7 @@ "-1928229820": "Deriv X ආයෝජක මුරපදය නැවත සකසන්න", "-1087845020": "ප්‍රධාන", "-1950683866": "ආයෝජකයා", - "-1874242353": "අරමුදල ඉහළට", + "-1874242353": "අරමුදල් Top-up කරන්න", "-89838213": "ඔබේ ශේෂය<1> හෝ ඊට අඩු<0> නම් අතිරේකයක් සමඟ ඔබේ ආදර්ශන ගිණුම ඉහළට ඔසවා තැබිය හැකිය.", "-1211122723": "{{ platform }} {{ account_title }} ගිණුම", "-78895143": "වත්මන් ශේෂය", @@ -3375,7 +3447,7 @@ "-490244964": "Forex, කොටස්, කොටස් දර්ශක, ක්‍රිප්ටෝ මුදල්", "-1368041210": ", කෘත්‍රිම​ දර්ශක", "-877064208": "EUR", - "-1284221303": "ඔබගේ ගිණුමේ ශේෂය නැවතුම් මට්ටමට ආසන්නව පහත වැටේ නම්, ආන්තික ඇමතුම් ලෙස හැඳින්වෙන අනතුරු ඇඟවීමක් ඔබට ලැබෙනු ඇත.", + "-1284221303": "ඔබේ ගිණුමේ ශේෂය stop out මට්ටමට ආසන්න වුවහොත්, ඔබට ආන්තික ඇමතුමක් ලෙසින් හැඳින්වෙන අනතුරු ඇඟවීමක් ලැබෙනු ඇත.", "-1848799829": "තේරුම් ගැනීමට සිදු නතර, පළමු ඔබ ඔබේ කොටස් අනුපාතය වන ආන්තිකය මට්ටම ගැන ඉගෙන ගැනීමට අවශ්‍ය (ඔබ එම මොහොතේ දී ඔබගේ සියලු තනතුරු වසා නම් ඔබට ඇති මුළු ශේෂය) ඔබ මේ මොහොතේ භාවිතා කරන්නේ ආන්තිකය කිරීමට. ඔබගේ ආන්තික මට්ටම අපගේ නැවතුම් මට්ටමට වඩා පහත වැටුණහොත්, තවදුරටත් පාඩු වලින් ඔබව ආරක්ෂා කිරීම සඳහා ඔබේ ස්ථාන ස්වයංක්‍රීය වසා දැමිය හැකිය.", "-224051432": "24/7", "-1318070255": "EUR/GBP", @@ -3412,39 +3484,23 @@ "-648956272": "වෙබ් සහ ජංගම යෙදුම් මත ඔබේ Deriv X ගිණුම් වෙත පුරනය වීමට මෙම මුරපදය භාවිත කරන්න.", "-1814308691": "ඔබේ {{platform}} මුරපදය වෙනස් කිරීමට කරුණාකර ඊ-තැපෑලෙහි ඇති සබැඳිය ක්ලික් කරන්න.", "-35790392": "බාගත කිරීම {{Deriv}} {{ platform }}සඳහා QR කේතය පරිලෝකනය කරන්න.", - "-1282933308": "{{barrier}}නොවේ", - "-968190634": "සමාන {{barrier}}", - "-1747377543": "{{barrier}}යටතේ", - "-256210543": "මෙම අවස්ථාවේදී ගනුදෙනු ලබා ගත නොහැක.", - "-1150099396": "අපි ඉක්මනින් ඔබ වෙනුවෙන් මෙම ලබා ගත හැකි කිරීමට කටයුතු කරනවා. ඔබට වෙනත් ගිණුමක් තිබේ නම්, ගනුදෙනු දිගටම කරගෙන යාමට එම ගිණුමට මාරු වන්න. ඔබට Deriv MT5 මූල්‍ය එකතු කළ හැකිය.", - "-28115241": "{{platform_name_trader}} මෙම ගිණුම සඳහා ලබා ගත නොහැක", - "-453920758": "{{platform_name_mt5}} උපකරණ පුවරුව වෙත යන්න", - "-402175529": "ඉතිහාසය", - "-902712434": "ගනුදෙනුව අවලංගු කිරීම", - "-988484646": "ගනුදෙනුව අවලංගු කිරීම (ක්‍රියාත්මක කරන ලද)", - "-444882676": "ගනුදෙනුව අවලංගු කිරීම (ක්‍රියාකාරී)", - "-13423018": "යොමු හැඳුනුම්පත", - "-2035315547": "පහළ බාධකය", - "-1551639437": "ඉතිහාසයක් නැත", - "-1214703885": "ඔබ තවමත් යාවත්කාලීන කර ඇත්තේ ලාභය ලබා ගැනීම හෝ පාඩුව නැවැත්වීම", - "-504849554": "එය නැවත විවෘත වේ", - "-59803288": "මේ අතරතුර, අපගේ කෘත්‍රිම​ දර්ශක උත්සාහ කරන්න. ඒවා සැබෑ වෙළඳපල අස්ථාවරත්වය අනුකරණය කරන අතර සතියේ දින 7ම, පැය 24 පුරා විවෘතව පවතී.", - "-1278109940": "විවෘත වෙළඳපොලවල් බලන්න", - "-694105443": "මෙම වෙළඳපොළ වසා ඇත", - "-1043795232": "මෑත කාලීන තනතුරු", - "-1511825574": "ලාභය/අඞු කිරීමට:", + "-1282933308": "{{barrier}} ක් නැත", + "-968190634": "{{barrier}} ට සමානයි", + "-1747377543": "{{barrier}} යටතේ", + "-1043795232": "මෑත කාලීන ස්ථාන", + "-1511825574": "ලාභය/අලාභය:", "-726626679": "විභව ලාභය/අලාභය:", - "-338379841": "දර්ශක මිල:", - "-1572796316": "මිලදී ගැනීමේ මිල:", - "-447037544": "මිල:", + "-338379841": "ප්‍රතීයමාන මිල:", + "-1572796316": "ගැනුම් මිල:", + "-447037544": "ගැනුම් මිල:", "-1694314813": "ගිවිසුම් වටිනාකම:", - "-153220091": "{{display_value}} ටික්", + "-153220091": "{{display_value}} සලකුණ", "-802374032": "පැය", - "-2039780875": "මිලදී ගැනීම තහවුරු", + "-2039780875": "මිලදී ගැනීම තහවුරු කිරීම", "-1672470173": "කොන්ත්රාත්තුවක් මිලදී ගැනීමට පෙර තහවුරු කිරීම අවශ්ය වේ", "-1342661765": "ගිවිසුම් මිලදී ගැනීමේ බොත්තම් අගුළු දමන්න", - "-1382749084": "ආපසු වෙළඳාමට යන්න", - "-1231210510": "Tick", + "-1382749084": "ගනුදෙනු වෙත ආපසු යන්න", + "-1231210510": "සලකුණ", "-1239477911": "දෙවන", "-1585766960": "අවම", "-1652791614": "මිනිත්තු", @@ -3455,26 +3511,20 @@ "-1435392215": "ගනුදෙනු අවලංගු කිරීම ගැන", "-2017825013": "තේරුම් ගත්තා", "-1192773792": "මෙය නැවත පෙන්වන්න එපා", + "-902712434": "ගනුදෙනුව අවලංගු කිරීම", "-1280319153": "තෝරාගත් කාල රාමුවක් තුළ ඕනෑම වේලාවක ඔබේ ගනුදෙනුව ස්වයංක්‍රීය අවලංගු කරන්න. තෝරාගත් කාල රාමුව තුළ ඔබේ ගනුදෙනුව නැවතුම් මට්ටමට ළඟා වුවහොත් ස්වයංක්‍රීයව ක්‍රියාරම්භ වේ.", "-471757681": "අවදානම් කළමනාකරණය", "-843831637": "පාඩුව නවත්වන්න", "-771725194": "ගනුදෙනුව අවලංගු කිරීම", "-338707425": "අවම කාලය දින 1 කි", "-1003473648": "කාල සීමාව: දින {{duration}}", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "කල් ඉකුත් වීමේ දී ගෙවීම අවසාන මිල සහ වැඩ වර්ජන මිල අතර වෙනස මගින් ගුණ කරන ලක්ෂ්‍යයකට ගෙවීමකට සමාන වේ.", - "-1527492178": "අගුලු දමා මිලදී", - "-725375562": "සැකසුම් මෙනුවෙන් ඔබට මිලදී ගැනීමේ බොත්තම අගුළු ඇරීමට/අගුළු ඇරීමට හැකිය", - "-774638412": "කොටස් {{min_stake}} {{currency}} සහ {{max_stake}} {{currency}} අතර විය යුතුය", - "-1358367903": "කොටස", - "-434270664": "වත්මන් මිල", - "-1956787775": "බාධක මිල:", - "-1513281069": "2 වන බාධකය", + "-1527492178": "මිලදී ගැනීම අගුලු දමා ඇත", + "-725375562": "ඔබට සැකසීම් මෙනුවෙන් මිලදී ගැනීමේ බොත්තම අගුළු දැමීමට/අගුළු හැරීමට හැකිය", "-390994177": "{{min}} සහ {{max}} අතර විය යුතුය", "-1804019534": "කල් ඉකුත්වන දිනය: {{date}}", "-2055106024": "උසස් සහ සරල කාලසීමා සැකසුම් අතර ටොගල් කරන්න", "-1012793015": "අවසන් වේලාව", - "-2037881712": "ඊළඟ ලබා ගත හැකි වත්කම් මිලට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත<0>.", + "-2037881712": "ඔබේ ගිවිසුම <0> පවතින මීළඟ වත්කම් මිලට ස්වයංක්‍රීයව වසා දමනු ඇත.", "-629549519": "කොමිස් <0/>", "-2131859340": "Stop out<0/>", "-1686280757": "<0>{{commission_percentage}}% (<1/>* {{multiplier}})", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "ඉහළින්", "-857660728": "වර්ජන මිල", + "-1358367903": "කොටස", "-1386326276": "බාධකය යනු අවශ්‍ය ක්ෂේත්‍රයකි.", "-1418742026": "ඉහළ බාධකයක් පහළ බාධකයට වඩා වැඩි විය යුතුය.", "-92007689": "පහළ බාධකය ඉහළ බාධකයට වඩා අඩු විය යුතුය.", @@ -3491,6 +3542,21 @@ "-1975910372": "මිනිත්තු 0 ත් 59 ත් අතර විය යුතුය.", "-866277689": "කල් ඉකුත්වන කාලය අතීතයේ විය නොහැක.", "-1455298001": "දැන්", + "-256210543": "මෙම අවස්ථාවේදී ගනුදෙනු ලබා ගත නොහැක.", + "-1150099396": "අපි ඉක්මනින් ඔබ වෙනුවෙන් මෙම ලබා ගත හැකි කිරීමට කටයුතු කරනවා. ඔබට වෙනත් ගිණුමක් තිබේ නම්, ගනුදෙනු දිගටම කරගෙන යාමට එම ගිණුමට මාරු වන්න. ඔබට Deriv MT5 මූල්‍ය එකතු කළ හැකිය.", + "-28115241": "{{platform_name_trader}} මෙම ගිණුම සඳහා ලබා ගත නොහැක", + "-453920758": "{{platform_name_mt5}} හි පාලක පුවරුව වෙත යන්න", + "-402175529": "ඉතිහාසය", + "-988484646": "ගනුදෙනුව අවලංගු කිරීම (ක්‍රියාත්මක කරන ලද)", + "-444882676": "ගනුදෙනුව අවලංගු කිරීම (ක්‍රියාකාරී)", + "-13423018": "යොමු හැඳුනුම්පත", + "-2035315547": "පහළ බාධකය", + "-1551639437": "ඉතිහාසයක් නැත", + "-1214703885": "ඔබට තවම take profit හෝ stop loss යාවත්කාලීන කළ නොහැක", + "-504849554": "ට නැවත විවෘත කෙරේ", + "-59803288": "මේ අතරතුර, අපගේ කෘත්‍රිම​ දර්ශක උත්සාහ කරන්න. ඒවා සැබෑ වෙළඳපල අස්ථාවරත්වය අනුකරණය කරන අතර සතියේ දින 7ම, පැය 24 පුරා විවෘතව පවතී.", + "-1278109940": "විවෘත වෙළඳපලවල් බලන්න", + "-694105443": "මෙම වෙළඳපල වසා ඇත", "-439389714": "අපි එය මත වැඩ කරනවා", "-770929448": "{{platform_name_smarttrader}} වෙත යන්න", "-347156282": "සාක්ෂය ඉදිරිපත් කරන්න", @@ -3498,24 +3564,24 @@ "-2036388794": "නොමිලේ ගිණුමක් සාදන්න", "-1813736037": "වර්තමාන වෙළඳ සැසිය සඳහා මෙම කොන්ත්රාත් වර්ගය මත තවදුරටත් වෙළඳාම් කිරීමට අවසර නැත. වැඩි විස්තර සඳහා, අපගේ <0>නියමයන් සහ කොන්දේසි වෙත යොමු වන්න.", "-590131162": "{{website_domain}}මත රැඳී සිටින්න", - "-1444663817": "ද්විමය. කොම් වෙත යන්න", + "-1444663817": "Binary.com වෙත යන්න", "-1526466612": "ඔබ දැනට සහාය නොදක්වන ගනුදෙනු වර්ගයක් තෝරාගෙන ඇත, නමුත් අපි එය මත වැඩ කරන්නෙමු.", "-1738427539": "මිලදී ගැනීම", - "-1937372493": "ඔබට ඕනෑම වේලාවක ඔබේ වෙළඳාම වසා දැමිය හැකිය. කෙසේ වෙතත්, <0>ලිස්සා යාමේ අවදානම ගැන සැලකිලිමත් වන්න. <0/>", - "-1392065699": "ඔබ “නැගීම” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය පිවිසුම් ස්ථානයට වඩා දැඩි ලෙස වැඩි නම් ඔබ ගෙවීම දිනා ගනී.", - "-1762566006": "ඔබ “වැටීම” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය පිවිසුම් ස්ථානයට වඩා දැඩි ලෙස අඩු නම් ඔබ ගෙවීම දිනා ගනී.", + "-1937372493": "ඔබට ඕනෑම වේලාවක ඔබේ ගනුදෙනුව වසා දැමිය හැක. කෙසේ වෙතත්, <0>ලිස්සුම් අවදානම<0/> පිළිබඳව දැනුවත් වන්න.", + "-1392065699": "ඔබ \"Rise\" තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය පිවිසුම් ස්ථානයට වඩා දැඩි ලෙස ඉ​හළින් පිහිටයි නම් ඔබ ගෙවීම දිනා ගනු ඇත.", + "-1762566006": "ඔබ \"Fall\" තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය පිවිසුම් ස්ථානයට වඩා දැඩි ලෙස ප​හළින් පිහිටයි නම් ඔබ ගෙවීම දිනා ගනු ඇත​.", "-1435306976": "ඔබ “සමාන කිරීමට ඉඩ දෙන්න” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය “නැගීම” සඳහා පිවිසුම් ස්ථානයට වඩා වැඩි හෝ සමාන නම් ඔබ ගෙවීම දිනා ගනී. ඒ හා සමානව, පිටවීමේ ස්ථානය “වැටීම” සඳහා ඇතුල්වීමේ ස්ථානයට වඩා අඩු හෝ සමාන නම් ඔබ ගෙවීම දිනා ගනී.", - "-1959473569": "ඔබ “පහළ” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය බාධකයට වඩා තදින් අඩු නම් ඔබ ගෙවීම දිනා ගනී.", - "-1350745673": "පිටවීමේ ස්ථානය බාධකයට සමාන නම්, ඔබ ගෙවීම දිනා නොගනී.", + "-1959473569": "ඔබ \"Lower\" තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය බාධකයට වඩා දැඩි ලෙස ඉහළ නම්, ඔබ ගෙවීම දිනා ගනී.", + "-1350745673": "පිටවීමේ ස්ථානය බාධකයට සමාන නම්, ඔබ ගෙවීම දිනා ගන්නේ නැත.", "-2089488446": "ඔබ “අවසානයි අතර” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය අඩු බාධකයට වඩා දැඩි ලෙස ඉහළ නම් සහ ඉහළ බාධකයට වඩා දැඩි ලෙස අඩු නම් ඔබ ගෙවීම දිනා ගනී.", "-1876950330": "ඔබ “පිටත අවසානය” තෝරා ගන්නේ නම්, පිටවීමේ ස්ථානය ඉහළ බාධකයට වඩා දැඩි ලෙස ඉහළ මට්ටමක පවතී නම් හෝ අඩු බාධකයට වඩා දැඩි ලෙස අඩු නම් ඔබ ගෙවීම දිනා ගනී.", "-546460677": "පිටවීමේ ස්ථානය අඩු බාධකයට හෝ මහ බාධකයට සමාන නම්, ඔබ ගෙවීම් දිනා නැත.", "-1812957362": "ඔබ “අතර රැඳී සිටින්න” තෝරා ගන්නේ නම්, ගිවිසුම් කාලය තුළ ඕනෑම වේලාවක වෙළඳපල ඉහළ බාධකයක් හෝ අඩු බාධකයක් අතර රැඳී සිටියහොත් (ස්පර්ශ නොවේ) ඔබ ගෙවීම දිනා ගනී", "-220379757": "ඔබ “පිටතට යන්න” තෝරා ගන්නේ නම්, ගිවිසුම් කාලය තුළ ඕනෑම වේලාවක වෙළඳපල ඉහළ බාධකයක් හෝ අඩු බාධකයක් ස්පර්ශ කළහොත් ඔබ ගෙවීම දිනා ගනී.", - "-1281286610": "ඔබ “තරඟ” තෝරා ගන්නේ නම්, අවසාන ටික්හි අවසාන ඉලක්කම් ඔබේ අනාවැකියට සමාන නම්, ඔබ ගෙවීම දිනා ගනු ඇත.", - "-1929209278": "ඔබ “පවා” තෝරා ගන්නේ නම්, අවසාන ටික්හි අවසාන ඉලක්කම් ඊටත් වඩා අංකයක් නම් (එනම්, 2, 4, 6, 8, හෝ 0) ඔබ ගෙවීම දිනා ගනු ඇත.", - "-2038865615": "ඔබ “අමුතු” තෝරා ගන්නේ නම්, අවසාන ටික්හි අවසාන ඉලක්කම් ඔත්තේ අංකයක් නම් (එනම්, 1, 3, 5, 7, හෝ 9) ඔබ ගෙවීම දිනා ගනු ඇත.", - "-1416078023": "ඔබ “ස්පර්ශ” තෝරා ගන්නේ නම්, ගිවිසුම් කාලය තුළ ඕනෑම වේලාවක වෙළඳපල බාධකයට ස්පර්ශ වුවහොත් ඔබ ගෙවීම දිනා ගනී.", + "-1281286610": "ඔබ \"Matches\" තෝරා ගන්නේ නම්, අවසාන සලකුණේ අවසාන ඉලක්කම් ඔබේ පුරෝකථනයට සමාන නම් ඔබ ගෙවීම දිනා ගනු ඇත.", + "-1929209278": "ඔබ \"Even\" තෝරා ගන්නේ නම්, අවසාන සලකුණේ අවසාන ඉලක්කම් ඉරට්ටේ සංඛ්‍යාවක් නම් ඔබ විසින් ගෙවීම දිනා ගනු ඇත. (එනම් 2, 4, 6, 8, හෝ 0).", + "-2038865615": "ඔබ \"Odd\" තෝරා ගන්නේ නම්, අවසාන සලකුණේ අවසාන ඉලක්කම් ඔත්තේ සංඛ්‍යාවක් නම් ඔබ විසින් ගෙවීම දිනා ගනු ඇත. (එනම් 1, 3, 5, 7, හෝ 9).", + "-1416078023": "ඔබ \"Touch\" තේරුවහොත්, ගිවිසුම් කාලය තුළ ඕනෑම අවස්ථාවක වෙළඳපල බාධකය ස්පර්ශ කළහොත් ඔබ ගෙවීම දිනා ගනී.", "-1272255095": "පිටවීමේ ස්ථානය බාධකයට හෝ නව බාධකයට සමාන නම් (යළි පිහිටුවීමක් සිදුවුවහොත්), ඔබ ගෙවීම දිනා නොගනී.", "-231957809": "පිටවීමේ ස්ථානය ඉහළ බාධකයට වඩා වැඩි හෝ සමාන නම් උපරිම ගෙවීම් දිනා ගන්න.", "-464144986": "පිටවීමේ ස්ථානය පහළ බාධකයට වඩා අඩු හෝ සමාන නම් උපරිම ගෙවීම් දිනා ගන්න.", @@ -3537,9 +3603,11 @@ "-454245976": "නිශ්චිත කාලයක් සඳහා වෙළඳපල මිල අඛණ්ඩව පහත වැටෙනු ඇතැයි ඔබ සිතන්නේ නම්, <0>කෙටි තෝරන්න. වෙළඳපල මිල බාධකයට ඉහළින් හෝ හරස් නොවන්නේ නම් කල් ඉකුත් වන විට ඔබට ගෙවීමක් ලැබෙනු ඇත. බාධකය උල්ලං is නය නොකළහොත් ඔබේ ගෙවීම වෙළඳපල මිල සහ බාධකය අතර දුරට සමානුපාතිකව වර්ධනය වේ. ගෙවීම ඔබේ කොටුවට වඩා වැඩි වූ විට ඔබ ලාභයක් ලබා ගැනීමට පටන් ගනී. වෙළඳපල මිල කවදා හෝ බාධකය තරණය කරන්නේ නම්, ගෙවීමක් සිදු නොවේ.", "-351875097": "සලකුණු ගණන", "-729830082": "අඩු බලන්න", + "-1669741470": "කල් ඉකුත් වීමේ දී ගෙවීම අවසාන මිල සහ වැඩ වර්ජන මිල අතර වෙනස මගින් ගුණ කරන ලක්ෂ්‍යයකට ගෙවීමකට සමාන වේ.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "අලුත්!", "-993480898": "ඇකියුමිලේටර", - "-45873457": "නව", + "-45873457": "අලුත්", "-1422269966": "ඔබට 1%, 2%, 3%, 4% සහ 5% අගයන් සහිත වර්ධන වේගයක් තෝරාගත හැක.", "-1186791513": "ගෙවීම යනු ඔබේ මූලික කොටස් සහ ලාභයේ එකතුවයි.", "-1682624802": "එය පෙර ස්ථාන මිලෙහි ප්‍රතිශතයකි. ප්‍රතිශත අනුපාතය පදනම් වන්නේ ඔබේ තේරීමේ දර්ශකය සහ වර්ධන වේගය මතය.", @@ -3556,9 +3624,13 @@ "-542594338": "උපරිම ගෙවීම", "-690963898": "ඔබගේ ගෙවීම මෙම මුදල කරා ළඟා වූ විට ඔබේ ගිවිසුම ස්වයංක්‍රීයව වසා දැමෙනු ඇත.", "-511541916": "මෙම සලකුණු ගණනට ළඟා වූ පසු ඔබේ ගිවිසුම ස්වයංක්‍රීයව වසා දමනු ඇත.", - "-438655760": "<0>සටහන: ඔබට ඕනෑම වේලාවක ඔබේ වෙළඳාම වසා දැමිය හැකිය. ලිස්සා යාමේ අවදානම ගැන සැලකිලිමත් වන්න.", + "-438655760": "<0>සටහන: ඔබට ඕනෑම වේලාවන ඔබේ ගනුදෙනුව වසා දැමිය හැක. ලිස්සුම් අවදානම ගැන සැලකිලිමත් වන්න.", + "-774638412": "කොටස් {{min_stake}} {{currency}} සහ {{max_stake}} {{currency}} අතර විය යුතුය", + "-434270664": "වත්මන් මිල", + "-1956787775": "බාධක මිල:", + "-1513281069": "2 වන බාධකය", "-1683683754": "දිග", - "-1046859144": "<0>{{title}} වෙළඳපල මිල {{price_position}} ක් පවතින්නේ නම් සහ බාධකය ස්පර්ශ නොකරන්නේ නම් ඔබට ගෙවීමක් ලැබෙනු ඇත. එසේ නොමැතිනම්, ඔබගේ ගෙවීම ශුන්ය වනු ඇත.", + "-1046859144": "<0>{{title}} වෙළඳපල මිල {{price_position}} මට්ටමක පවතී නම් සහ බාධකය ස්පර්ශ නොකළහොත් හෝ තරණය නොකරන්නේ නම් ඔබට ගෙවීමක් ලැබෙනු ඇත. එසේ නොමැතිනම්, ඔබේ ගෙවීම ශුන්‍ය වනු ඇත.", "-1815023694": "බාධකයට ඉහළින්", "-243332856": "නවතම 1000 කිනිතුල්ලන් සඳහා {{ underlying_name }}සඳහා අවසාන ඉලක්කම් සංඛ්යාන", "-1572548510": "Ups සහ Downs", @@ -3610,13 +3682,13 @@ "-188442606": "{{ function_name }} {{ function_params }} {{ dummy }} ශ්‍රිතය", "-313112159": "මෙම කොටස ඉහත එකට සමාන වේ, මෙය අගය නැවත ලබා දෙන බව හැර. ආපසු ලබා දුන් අගය ඔබ කැමති විචල්යයකට පැවරිය හැකිය.", "-1783320173": "අකාලයේ ශ්‍රිතයක් තුළ අගයක් ලබා දෙයි", - "-1485521724": "කොන්දේසි සහිත ප්රතිලාභ", + "-1485521724": "කොන්දේසි සහිත ආපසු ලැබීම", "-1482801393": "ආපසු", "-46453136": "ලබා ගන්න", "-1838027177": "පළමු", "-1182568049": "ලැයිස්තු අයිතමය ලබා ගන්න", - "-1675454867": "අයිතමයේ පිහිටීම අනුව ලැයිස්තුවක නිශ්චිත අයිතමයක වටිනාකම මෙම කොටස ඔබට ලබා දෙයි. එයට ලැයිස්තුවෙන් අයිතමය ඉවත් කළ හැකිය.", - "-381501912": "මෙම කොටස නිශ්චිත අයිතම තනතුරු භාවිතා කරමින් දැනට පවතින ලැයිස්තුවෙන් අයිතම ලැයිස්තුවක් නිර්මාණය කරයි.", + "-1675454867": "මෙම බ්ලොක් එකෙන් අයිතමයේ පිහිටීම අනුව ඔබට ලැයිස්තුවක ඇති නිශ්චිත අයිතමයක වටිනාකම ලබා දෙයි. එය ලැයිස්තුවෙන් අයිතමය ඉවත් කිරීමට ද හැකිය.", + "-381501912": "මෙම කොටස විශේෂිත අයිතම ස්ථාන භාවිත කරමින් පවතින ලැයිස්තුවකින් අයිතම ලැයිස්තුවක් නිර්මාණය කරයි.", "-426766796": "උප ලැයිස්තුව ලබා ගන්න", "-1679267387": "ලැයිස්තුවේ {{ input_list }} අයිතමයේ {{ first_or_last }} පදිංචිය සොයා ගන්න {{ input_value }}", "-2087996855": "මෙම කොටස ඔබට ලබා දී ඇති ලැයිස්තුවේ අයිතමයක ස්ථානය ලබා දෙයි.", @@ -3882,10 +3954,10 @@ "-558031309": "High Tick/Low Tick", "-123659792": "Vanillas", "-113940416": "වත්මන් කොටස්:", - "-1999539705": "ගනුදෙනුව අවලංගු කරන්න. ගාස්තු:", + "-1999539705": "ගනුදෙනු අවලංගු කිරීමේ ගාස්තුව:", "-155989831": "අඩු කිරීමේ අගය", - "-1167474366": "ටික් ", - "-2027409966": "ආරම්භක කොටස්:", + "-1167474366": "සලකුණ ", + "-2027409966": "ආරම්භක කොටස:", "-1525144993": "ගෙවීම් සීමාව:", "-1669418686": "AUD/CAD", "-1548588249": "විගණනය/CHF", diff --git a/packages/translations/src/translations/th.json b/packages/translations/src/translations/th.json index be8fd912162c..4d5b03d53376 100644 --- a/packages/translations/src/translations/th.json +++ b/packages/translations/src/translations/th.json @@ -24,7 +24,6 @@ "27731356": "บัญชีของคุณถูกปิดใช้งานชั่วคราว โปรดติดต่อเราผ่านทาง <0>แชทสด เพื่อเปิดใช้งานการฝากและถอนเงินได้อีกครั้ง", "27830635": "บริษัท Deriv (V) Ltd", "28581045": "เพิ่มบัญชี MT5 จริง", - "30801950": "บัญชีของคุณจะถูกเปิดโดย {{legal_entity_name}} ซึ่งได้รับการควบคุมโดย Malta Gaming Authority และจะอยู่ภายใต้กฎหมายของประเทศมอลตา", "33433576": "กรุณาใช้อีวอลเล็ทเพื่อถอนเงินของคุณ", "35089987": "โปรดอัพโหลดใบขับขี่ของคุณทั้งด้านหน้าและด้านหลัง", "41737927": "ขอบคุณ", @@ -60,11 +59,13 @@ "72500774": "โปรดระบุถิ่นที่อยู่เพื่อการรัษฎากร", "73086872": "คุณได้กันตนเองออกจากการซื้อขาย", "73326375": "จุดต่ำคือจุดที่ต่ำที่สุดที่ตลาดได้ไปถึงในช่วงระยะเวลาของสัญญา", + "74836780": "{{currency_code}} Wallet", "74963864": "น้อยกว่า", "76916358": "คุณมาถึงขีดจำกัดการถอนแล้ว <0/>โปรดอัปโหลดหลักฐานยืนยันตัวตนและที่อยู่ของคุณเพื่อยกเลิกขีดจำกัดแล้วดำเนินการถอนต่อไป", "76925355": "ตรวจสอบประสิทธิภาพของบอทของคุณ", "77945356": "ทำการเทรดได้ทุกที่ด้วยแอปมือถือของเรา", "77982950": "ตราสารสิทธิ Vanillas ช่วยให้คุณสามารถคาดการณ์ทิศทางขาขึ้น (ตลาดกระทิง) หรือขาลง (ตลาดหมี) ของสินทรัพย์อ้างอิงได้โดยการซื้อสัญญา “Call” หรือ “Put”", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "เราไม่พบหน้าเว็บนั้น", "82839270": "โปรดอัพโหลดหน้าหนังสือเดินทางของคุณที่มีรูปถ่ายของคุณอยู่", "83202647": "พับเก็บบล็อก", @@ -76,6 +77,7 @@ "90266322": "2. เริ่มแชทกับตัวบอทเทเลแกรมที่สร้างขึ้นใหม่ของคุณ แล้วทำให้แน่ใจว่า คุณได้ส่งข้อความไปหามันก่อนที่จะดำเนินการขั้นตอนต่อไป (เช่น สวัสดี บอท!)", "91993812": "กลยุทธ์มาติงเกล (Martingale) เป็นเทคนิคการเทรดที่คลาสสิกโดยมีการใช้มานานมากกว่าหนึ่งร้อยปี และถูกทำให้เป็นที่นิยมโดยนักคณิตศาสตร์ชาวฝรั่งเศสชื่อ Paul Pierre Levy ในช่วงศตวรรษที่ 18", "93154671": "1. กดปุ่ม รีเซ็ต ที่ด้านล่างสุดของแผงสถิติ", + "93939827": "Cryptocurrency accounts", "96381225": "การยืนยันตัวตนล้มเหลว", "98473502": "เราไม่ได้ถูกผูกมัดโดยกฏใดในการต้องจัดการทดสอบความเหมาะสมหรือในการให้คำเตือนถึงคุณเกี่ยวกับความเสี่ยงใด ๆ", "98972777": "รายการสุ่ม", @@ -83,6 +85,7 @@ "102226908": "ช่องนี้ไม่สามารถเว้นให้ว่างได้", "108916570": "ระยะเวลา {{duration}} วัน", "109073671": "โปรดใช้อีวอลเล็ทที่คุณได้ใช้สำหรับการฝากเงินก่อนหน้านี้ โปรดตรวจสอบให้แน่ใจว่าอีวอลเล็ทนั้นรองรับการถอนเงินได้ โดยคุณสามารถไปดูรายการอีวอลเล็ทที่รองรับการถอนเงินได้ <0>ที่นี่", + "110822969": "One Wallet for all your transactions", "111215238": "หลีกเลี่ยงแสงที่ส่องมาตรงๆ", "111718006": "เวลาสิ้นสุด", "111931529": "ยอดรวมเงินทุนทรัพย์สูงสุดในรอบ 7 วัน", @@ -215,7 +218,9 @@ "251882697": "ขอบคุณ! คำตอบของคุณถูกบันทึกไว้ในระบบของเราแล้ว <0/><0/>โปรดกกด ‘ตกลง’ เพื่อดำเนินการต่อ", "254912581": "บล็อกนี้คล้ายกับ EMA เว้นแต่ว่ามันจะให้คุณเห็นสาย EMA ทั้งหมดตามรายการข้อมูลที่ป้อนเข้าไปและในช่วงเวลาที่กำหนดไว้", "256031314": "ธุรกิจเงินสด", + "256123827": "What happens to my trading accounts", "256602726": "หากคุณปิดบัญชีของคุณ:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "การประเมินการซื้อขาย", "260069181": "เกิดข้อผิดพลาดขณะพยายามโหลด URL", @@ -250,8 +255,8 @@ "284527272": "ตัวเลขที่เกิดน้อยครั้งที่สุดหรือแอนตี้โหมด", "284772879": "สัญญา", "284809500": "บัญชีทดลอง Financial", + "285909860": "Demo {{currency}} Wallet", "287934290": "คุณแน่ใจหรือว่าต้องการยกเลิกธุรกรรมนี้?", - "289898640": "ข้อตกลงในการใช้งาน", "291744889": "<0>1. พารามิเตอร์การซื้อขาย:<0>", "291817757": "ไปที่ชุมชน Deriv ของเราและเรียนรู้เกี่ยวกับ APIs, API tokens, วิธีการใช้ Deriv API และอื่นๆ", "292491635": "หากคุณเลือก “ตัวหยุดการขาดทุนหรือ Stop Loss” และระบุจำนวนเงินเพื่อจำกัดการสูญเสียของคุณ ตำแหน่งการค้าของคุณจะถูกปิดโดยอัตโนมัติเมื่อการขาดทุนของคุณมีค่ามากกว่าหรือเท่ากับจำนวนที่ระบุนี้ ทั้งนี้ การขาดทุนของคุณอาจมากกว่าจำนวนเงินที่ระบุไว้โดยขึ้นอยู่กับราคาตลาด ณ เวลาที่ปิดสัญญา", @@ -299,6 +304,7 @@ "344418897": "การตั้งขีดจำกัดการซื้อขายและระบบการกันตนเองนั้นช่วยให้คุณควบคุมจำนวนเงินและเวลาที่ใช้ใน {{brand_website_name}} และเป็นการฝึก <0>การซื้อขายอย่างมีความรับผิดชอบ", "345320063": "การประทับเวลาไม่ถูกต้อง", "345818851": "ขออภัย เกิดข้อผิดพลาดภายใน กดช่องทำเครื่องหมายด้านบนเพื่อลองอีกครั้ง", + "346214602": "A better way to manage your funds", "347029309": "Forex: มาตรฐาน/ไมโคร", "347039138": "กระบวนการทำซ้ำ (2)", "347217485": "มีปัญหาในการเข้าถึง Deriv MT5 บนมือถือของคุณใช่ไหม?", @@ -353,6 +359,7 @@ "401345454": "ไปที่แท็บบทช่วยสอนเพื่อทำเช่นนั้น", "402343402": "เนื่องจากปัญหาบนเซิร์ฟเวอร์ของเรา บัญชี {{platform}} บางบัญชีของคุณนั้นยังไม่พร้อมใช้งานในขณะนี้ โปรดอดใจรอและเราขอขอบคุณสําหรับความอดทนของคุณ", "403456289": "สูตรสำหรับเส้นค่าเฉลี่ยเคลื่อนที่แบบปกติหรือ SMA คือ", + "403608958": "Select a trading account or a Wallet", "404743411": "เงินฝากทั้งหมด", "406359555": "รายละเอียดของสัญญา", "406497323": "ขายสัญญาที่กำลังเปิดใช้อยู่ของคุณได้ถ้าจำเป็น (ไม่บังคับ)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "ระยะห่างเวลาในระหว่างแต่ละรายงานตามที่คุณต้องการ:", "431267979": "นี่คือคำแนะนำฉบับย่อสำหรับการใช้ Deriv Bot ในระหว่างการเดินทาง", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "ตัวปิดเทรดเอากำไร: {{ currency }} {{ take_profit }}", "432519573": "เอกสารถูกอัปโหลดแล้ว", @@ -453,12 +461,12 @@ "518955798": "7. คลิกคำสั่ง Run เมื่อเริ่มใช้งาน", "520136698": "ดัชนี Boom 500", "521872670": "รายการ", - "522283618": "ประสบการณ์การซื้อขายตราสารสิทธิดิจิทัล", "522703281": "แบ่งออกได้โดย", "523123321": "- 10 ยกกำลังของตัวเลขที่กำหนดให้มา", "524459540": "สร้างตัวแปรระบบได้อย่างไร?", "527329988": "นี่คือรหัสผ่านทั่วไป 100 อันดับแรก", "529056539": "ตราสารสิทธิ", + "530864956": "Deriv Apps", "530953413": "แอปพลิเคชั่นที่ได้รับอนุญาต", "531114081": "3. ประเภทของสัญญา", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, หุ้น, ดัชนีหุ้น, สกุลเงินดิจิทัล, ดัชนีสังเคราะห์", "545476424": "เงินถอนทั้งหมด", "549479175": "ตัวคูณ Deriv", + "549799607": "Go to LiveChat", "550589723": "เงินทุนทรัพย์ของคุณจะเติบโต {{growth_rate}}% ในทุกจุด Tick ตราบใดที่ราคายังคงอยู่ในช่วง ±{{tick_size_barrier}} จากราคาอันก่อนหน้า", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "เรียนรู้เพิ่มเติมเกี่ยวกับขีดจำกัดการซื้อขาย", "554135844": "แก้ไข", "554410233": "นี่คือรหัสผ่านทั่วไป 10 อันดับแรก", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "หลังจากกำหนดพารามิเตอร์การซื้อขายและตัวเลือกการเทรดต่างๆแล้ว คุณอาจต้องการสั่งให้บอทของคุณทำการซื้อสัญญาเมื่อตรงตามเงื่อนไขเฉพาะที่ตั้งเอาไว้ และคุณสามารถใช้บล็อกเงื่อนไขและบล๊อกตัวบ่งชี้มาช่วยบอทของคุณในการตัดสินใจเพื่อให้คุณทำเช่นนั้นได้", "555881991": "สลิปเลขประจำตัวประชาชน", "556264438": "ช่วงเวลา", @@ -552,6 +563,7 @@ "629395043": "อัตราการเติบโตทั้งหมด", "632398049": "บล็อกนี้กำหนดค่าว่าไม่ทราบข้อมูลหรือ null ให้กับรายการหรือข้อความใดๆ", "634219491": "คุณยังไม่ได้ระบุหมายเลขประจำตัวผู้เสียภาษีของคุณ ข้อมูลนี้มีความจำเป็นเนื่องจากข้อกำหนดทางกฎหมายและระเบียบข้อบังคับ โปรดไปที่ <0>รายละเอียดส่วนบุคคล ในการตั้งค่าบัญชีของคุณ และกรอกหมายเลขประจำตัวผู้เสียภาษีล่าสุดของคุณ", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c หากไร้โอกาสในการหาข้อตกลงยุติการพิพาท ข้อร้องเรียนนั้นจะถูกส่งไปยังขั้นตอนการพิจารณาเพื่อให้คณะกรรมการ DRC เข้าจัดการต่อไป", "639382772": "โปรดอัปโหลดประเภทไฟล์ที่มีการรองรับ", "640596349": "คุณยังไม่ได้รับการแจ้งเตือนใดๆ", @@ -562,7 +574,6 @@ "642546661": "อัปโหลดด้านหลังใบขับขี่จากคอมพิวเตอร์ของคุณ", "642995056": "อีเมล์", "644150241": "จำนวนสัญญาที่คุณทำกำไรได้มาตั้งแต่การล้างสถิติครั้งล่าสุดของคุณ", - "645016681": "ความถี่ในการซื้อขายในตราสารทางการเงินอื่นๆ", "645902266": "EUR/NZD", "647039329": "โปรดส่งเอกสารหลักฐานยืนยันที่อยู่ของคุณ", "647745382": "ลิสต์รายการข้อมูลที่นำเข้า {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "จากตัวอย่างด้านล่าง ราคาเปิดได้ถูกเลือกแล้วและก็ถูกกำหนดให้กับตัวแปรที่เรียกว่า \"op\"", "666724936": "โปรดใส่ตัวเลขไอดีที่ถูกต้อง", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "เขตอำนาจรับผิดชอบและการเลือกใช้กฎหมาย", "674973192": "ใช้รหัสผ่านนี้เพื่อเข้าสู่ระบบบัญชี Deriv MT5 ของคุณบนเดสก์ท็อป เว็บ และแอปสําหรับอุปกรณ์เคลื่อนที่", "676159329": "ไม่สามารถสลับไปยังบัญชีเริ่มต้นได้", @@ -613,6 +625,7 @@ "692354762": "กรุณากรอกข้อมูล {{document_name}}ของคุณ {{example_format}}", "693396140": "การยกเลิกดีลข้อตกลง (หมดอายุ)", "694035561": "การซื้อขาย ตราสารสิทธิ ตัวคูณ", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "เวลาเปิด: การประทับเวลาเปิด", "697630556": "ตลาดนี้ปิดทําการแล้วตอนนี้", "698037001": "เลขประจำตัวประชาชน", @@ -624,8 +637,8 @@ "701647434": "ค้นหาสตริง", "702451070": "บัตรประชาชน (ไม่มีรูป)", "702561961": "เปลี่ยนธีม", + "705262734": "Your Wallets are ready", "705299518": "ขั้นตอนต่อไปคือ โปรดอัพโหลดหน้าหนังสือเดินทางของคุณที่มีรูปถ่ายของคุณอยู่", - "706413212": "ตอนนี้คุณอยู่ในบัญชี {{regulation}} {{currency}} ({{loginid}}) ของคุณเพื่อที่จะเข้าถึงแคชเชียร์", "706727320": "ความถี่ในการซื้อขายตราสารสิทธิไบนารี", "706755289": "บล็อกนี้ดำเนินการเกี่ยวกับฟังก์ชันตรีโกณมิติ", "706960383": "เราจะเสนอซื้อสัญญาของคุณในราคานี้หากคุณเลือกที่จะขายมันก่อนสัญญาหมดอายุ ซึ่งนี่ก็ขึ้นอยู่กับปัจจัยหลายประการ เช่น ราคาสปอตหรือราคาซื้อขายทันทีในปัจจุบัน ระยะเวลา เป็นต้น อย่างไรก็ตาม เราจะไม่เสนอมูลค่าของสัญญาหากระยะเวลาที่เหลืออยู่ต่ำกว่า 60 วินาที", @@ -644,6 +657,7 @@ "720293140": "ออกจากระบบ", "720519019": "ตั้งรหัสผ่านใหม่", "721011817": "- เพิ่มเลขตัวแรกเพื่อยกกำลังเลขตัวที่สอง", + "722797282": "EU-regulated USD accounts", "723045653": "คุณจะเข้าสู่ระบบบัญชี Deriv ของคุณด้วยที่อยู่อีเมล์นี้", "723961296": "จัดการรหัสผ่าน", "724203548": "คุณสามารถส่งข้อร้องเรียนของคุณไปที่แพลตฟอร์ม <0>การระงับข้อพิพาททางออนไลน์ของคณะกรรมาธิการยุโรป (ODR) อนึ่ง ช่องทางนี้ไม่สามารถใช้ได้กับลูกค้าในสหราชอาณาจักร", @@ -656,6 +670,7 @@ "734390964": "ยอดคงเหลือไม่เพียงพอ", "734881840": "เท็จ", "742469109": "รีเซ็ตยอดเงินคงเหลือ", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "ทำการเทรด CFD ใน Forex ดัชนี Derived สกุลเงินดิจิทัล และสินค้าโภคภัณฑ์ ด้วยเลเวอเรจสูง", "743623600": "การอ้างอิง", "744110277": "ตัวชี้วัด Bollinger Bands Array (BBA)", @@ -689,6 +704,7 @@ "775706054": "คุณขายบอทการซื้อขายหรือไม่?", "776085955": "กลยุทธ์", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "หลีกเลี่ยงปีล่าสุด", "784311461": "ค่าเฉลี่ย Exponential Moving Average (EMA)", "784583814": "ที่เชื่อมโยงไปยังคอมพิวเตอร์ของคุณ", @@ -725,6 +741,7 @@ "818447476": "ต้องการสลับบัญชีหรือไม่?", "820877027": "โปรดตรวจสอบหลักฐานการยืนยันตัวตนของคุณ", "821163626": "การบำรุงรักษาเซิร์ฟเวอร์จะทำขึ้นทุกวันเสาร์แรกของเดือน ตั้งแต่เวลา 7 ถึง 10 GMT ซึ่งคุณอาจประสบกับการบริการที่หยุดชะงักในช่วงเวลานี้", + "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": "บล็อกที่บรรจุข้อความได้", "824797920": "ลิสต์รายการว่างเปล่าหรือไม่?", "825042307": "ลองใหม่อีกครั้ง", @@ -747,7 +764,6 @@ "836097457": "ฉันสนใจในการเทรดแต่ฉันมีประสบการณ์น้อยมาก", "837063385": "โปรดอย่าส่งสกุลเงินอื่นๆ ไปยังที่อยู่นี้", "837066896": "เอกสารของคุณกำลังอยู่ระหว่างการพิจารณา โปรดตรวจสอบอีกครั้งใน 1-3 วัน", - "839618971": "ที่อยู่", "839805709": "เราต้องได้ภาพถ่ายที่ดีกว่านี้ของคุณเพื่อการยืนยันตัวตนที่ราบรื่น", "840672750": "หากวิธีนี้ไม่ได้ผล ให้ถอนการติดตั้งแล้วทำการติดตั้งแอป MT5 ใหม่อีกครั้ง จากนั้นให้ทำซ้ำขั้นตอนที่ <0>2 และ <0>3", "841434703": "ปิดการใช้งาน stack", @@ -844,9 +860,9 @@ "943535887": "โปรดปิดสถานะการค้าของคุณในบัญชี Deriv MT5 (เดี่ยวหรือหลายบัญชี) ต่อไปนี้:", "944499219": "จำนวนสูงสุดของตำแหน่งที่เปิดได้", "945532698": "สัญญาที่ถูกขาย", + "945753712": "Back to Trader’s Hub", "946204249": "อ่าน", "946841802": "แท่งเทียนสีขาว(หรือสีเขียว) บ่งบอกว่า ราคาเปิดนั้นต่ำกว่าราคาปิด ซึ่งสิ่งนี้ก็แสดงให้เห็นถึงการเคลื่อนไหวขาขึ้นของราคาตลาด", - "946944859": "กดปุ่มด้านล่างและเราจะส่งอีเมล์พร้อมกับลิงก์ให้แก่คุณ โปรดคลิกลิงก์นั้นเพื่อยืนยันคําขอถอนเงินของคุณ", "947046137": "การถอนเงินของคุณจะดําเนินการภายใน 24 ชั่วโมง", "947363256": "สร้างลิสต์รายการ", "947758334": "โปรดระบุเมือง", @@ -950,6 +966,7 @@ "1050128247": "ฉันขอยืนยันว่า ได้ตรวจสอบยืนยันข้อมูลการโอนเงินของตัวแทนชำระเงินแล้ว", "1050844889": "รายงาน", "1052779010": "คุณกำลังอยู่ในบัญชีทดลองของคุณ", + "1052921318": "{{currency}} Wallet", "1053153674": "ดัชนี Jump 50", "1053159279": "ระดับการศึกษา", "1053556481": "เมื่อคุณส่งคำร้องเรียน เราจะส่งอีเมล์ตอบกลับไปที่คุณเพื่อยืนยันว่าเราได้รับคำร้องเรียนนั้นแล้ว", @@ -1010,6 +1027,7 @@ "1110102997": "รายการบัญชี", "1112582372": "ช่วงเวลา", "1113119682": "บล็อกนี้ให้คุณเลือกค่าแท่งเทียนจากลิสต์รายการของแท่งเทียน", + "1113221217": "MT5 Swap-free", "1113292761": "น้อยกว่า 8MB", "1114679006": "คุณสร้างบอทของคุณสำเร็จโดยใช้กลยุทธ์ที่เรียบง่าย", "1117281935": "เงื่อนไขการขาย (ไม่บังคับ)", @@ -1036,6 +1054,7 @@ "1134879544": "ตัวอย่างของเอกสารที่มีแสงสะท้อน", "1138126442": "Forex: มาตรฐาน", "1139483178": "เปิดใช้งาน stack", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "ทิศทางคือ {{ direction_type }}", "1144028300": "ตัวชี้วัด Relative Strength Index Array (RSIA)", "1145927365": "เรียกใช้บล็อกภายในหลังจากจำนวนวินาทีที่กำหนด", @@ -1066,7 +1085,6 @@ "1174689133": "3. ตั้งค่าพารามิเตอร์การซื้อขายของคุณและกด เรียกใช้", "1174748431": "ช่องทางชำระเงิน", "1175183064": "วานูอาตู", - "1176926166": "ประสบการณ์ในการซื้อขายตราสารทางการเงินอื่นๆ", "1177396776": "หากคุณเลือก \"Asian Fall\" คุณจะได้รับเงินผลตอบแทนต่อเมื่อมูลค่าของจุด Tick สุดท้ายนั้นต่ำกว่าค่าเฉลี่ยของจุด Tick ทั้งหมดในช่วงเวลาสัญญา", "1177723589": "ไม่มีธุรกรรมที่จะแสดง", "1178582280": "จำนวนสัญญาที่คุณขาดทุนนับตั้งแต่การล้างสถิติครั้งล่าสุดของคุณ", @@ -1077,6 +1095,7 @@ "1181396316": "บล็อกนี้ให้ตัวเลขสุ่มจากภายในช่วงที่กําหนด", "1181770592": "กำไร/ขาดทุน จากการขาย", "1183007646": "- ประเภทสัญญา: ชื่อของประเภทสัญญา เช่น ขึ้น ลง แตะ ไม่แตะ และอื่นๆ", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "ปิดสัญญาการค้าของคุณตอนนี้หรือปล่อยให้ดำเนินการต่อไป หากเป็นกรณีหลังคุณจะสามารถตรวจดูและปิดสัญญาได้ในภายหลัง ", "1188316409": "หากต้องการรับเงินของคุณ โปรดติดต่อตัวแทนรับชำระเงินตามรายละเอียดด้านล่างนี้", "1188980408": "5 นาที", @@ -1094,12 +1113,14 @@ "1201773643": "ตัวเลข", "1203297580": "บล็อกนี้ส่งข้อความไปยังช่องแอป Telegram", "1204223111": "จากตัวอย่างนี้ ราคาเปิดจากลิสต์รายการของแท่งเทียนนั้นถูกกำหนดให้กับตัวแปรที่เรียกว่า \"candle_list\"", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "วิธีการปกปิดข้อมูลบัตรของคุณ", "1206821331": "เหล่าทัพ", "1207152000": "เลือกเทมเพลตและตั้งค่าพารามิเตอร์การซื้อขายของคุณ", "1208714859": "สำหรับการขาย:", "1208729868": "จุด", "1208903663": "โทเคนไม่ถูกต้อง", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "กำลังเริ่มรันบอท", "1214893428": "การสร้างบัญชีไม่สามารถทำได้บนมือถือในขณะนี้ โปรดเข้าสู่ระบบด้วยคอมพิวเตอร์ของคุณเพื่อสร้างบัญชีใหม่", "1216408337": "อาชีพอิสระ", @@ -1112,6 +1133,7 @@ "1222521778": "การฝากเงินและถอนเงินนั้นทำได้ยาก", "1222544232": "เราได้ส่งอีเมล์ถึงคุณแล้ว", "1225150022": "จำนวนของสินทรัพย์", + "1226027513": "Transfer from", "1227074958": "เศษส่วนแบบสุ่ม", "1227240509": "พื้นที่ปรับแต่ง", "1228534821": "ตัวแทนการชําระเงินในประเทศของคุณนั้นอาจจะไม่รองรับค่าเงินบางสกุล", @@ -1121,6 +1143,7 @@ "1232291311": "ยอดการถอนสูงสุดที่เหลืออยู่", "1232353969": "มีการทำธุรกรรมจำนวน 0-5 ครั้งในรอบ 12 เดือนที่ผ่านมา", "1233300532": "เงินผลตอบแทน", + "1233376285": "Options & multipliers", "1234292259": "แหล่งที่มาของรายได้", "1234764730": "อัปโหลดภาพหน้าจอที่มีชื่อและที่อยู่อีเมล์ของคุณจากส่วนแสดงรายละเอียดส่วนตัว", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "เรียงลําดับรายการในลิสต์รายการที่กําหนด ตามมูลค่าตัวเลขหรือตัวอักษรทั้งในลําดับจากน้อยไปหามากหรือจากมากไปหาน้อย", "1281290230": "เลือก", "1282951921": "ลงเท่านั้น", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "หากเลือก \"ขาดทุน\" ระบบจะส่งคืนค่าว่า \"จริง\" หากการซื้อขายครั้งสุดท้ายของคุณไม่สำเร็จ ถ้าไม่อย่างนั้นระบบจะส่งคืนสตริงที่ว่างเปล่า", "1286094280": "ถอนเงิน", "1286507651": "ปิดหน้าจอการยืนยันตัวตน", @@ -1173,7 +1197,6 @@ "1289146554": "องค์กร British Virgin Islands Financial Services Commission", "1289646209": "การเรียกหลักประกัน", "1290525720": "ตัวอย่าง: ", - "1291887623": "ความถี่ในการซื้อขายตราสารสิทธิดิจิทัล", "1291997417": "สัญญาจะหมดอายุในเวลา 23:59:59 GMT ของวันหมดอายุที่คุณได้เลือกไว้", "1292188546": "ตั้งรหัสผ่านนักลงทุน Deriv MT5 ใหม่", "1292891860": "ส่งข้อความแจ้ง Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (ขาย)", "1329136554": "ดัชนี Jump 200", "1329325646": "เนื้อหาของบล็อกนี้ถูกเรียกใช้ในทุกค่า Tick", + "1330479159": "Ready to upgrade?", "1331199417": "โปรดป้อนรูปแบบที่ถูกต้อง ", "1331367811": "หมายเลขบัญชีลูกค้า", "1332168410": "เรียนรู้เพิ่มเติม", @@ -1257,7 +1281,6 @@ "1367023655": "เพื่อให้แน่ใจว่าการขาดทุนจะไม่เกินจำนวนเงินทุนทรัพย์ของคุณ สัญญาการเทรดของคุณจะถูกปิดอัตโนมัติเมื่อการขาดทุนของคุณเท่ากับ <0/>", "1367488817": "4. เริ่มเงื่อนไขการซื้อขายใหม่อีกครั้ง", "1367990698": "ดัชนีความผันผวน 10", - "1369709538": "ข้อกําหนดการใช้งานของเรา", "1370647009": "เพลิดเพลินไปกับขีดจำกัดรายวันที่สูงขึ้น", "1371193412": "ยกเลิก", "1371555192": "เลือกตัวแทนรับชำระเงินที่คุณต้องการแล้วป้อนจำนวนเงินที่คุณจะถอน หากว่าตัวแทนชำระเงินของคุณไม่อยู่ในลิสต์รายการ <0>ให้ค้นหาตัวแทนดังกล่าวโดยใช้หมายเลขบัญชีของพวกเขา", @@ -1319,6 +1342,7 @@ "1434767075": "เริ่มต้นใช้งาน Deriv Bot", "1434976996": "ประกาศ", "1435363248": "บล็อกนี้จะแปลงจำนวนวินาทีของเวลาสากลที่นับตั้งแต่จุดมาตรฐานเวลา Unix Epoch มาเป็นในรูปแบบวันที่และเวลา เช่น 2019-08-01 00:00:00", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "ฝากเงินขั้นต่ำ", "1437396005": "เพิ่มความคิดเห็น", "1438247001": "ลูกค้าที่มีความเชี่ยวชาญจะได้รับกลไกการปกป้องลูกค้าในระดับที่ต่ำกว่าเนื่องจากเหตุผลดังต่อไปนี้:", @@ -1369,6 +1393,7 @@ "1476301886": "ในความคล้ายคลึงกันกับเส้นค่าเฉลี่ยเคลื่อนที่แบบปกติหรือ SMA บล็อกนี้จะแสดงให้คุณเห็นเส้น SMA ทั้งหมดซึ่งประกอบด้วยลิสต์รายการของมูลค่าต่างๆ ทั้งหมดจากในช่วงเวลาที่กำหนด", "1478030986": "สร้างหรือลบโทเคน API สำหรับการซื้อขายและการถอนเงิน", "1480915523": "ข้าม", + "1481860194": "Your new Wallet(s)", "1481977420": "โปรดช่วยเรายืนยันคําขอถอนเงินของคุณ", "1483470662": "คลิก 'เปิด' เพื่อเริ่มทำการเทรดด้วยบัญชีของคุณ", "1484336612": "บล็อกนี้ใช้เพื่อยกเลิกหรือดำเนินการวนรอบต่อไป โดยบล๊อกนี้สามารถวางไว้ที่ใดก็ได้ภายในบล็อกลูป", @@ -1389,6 +1414,7 @@ "1505420815": "ไม่พบตัวแทนรับชำระเงินจากการค้นหาของคุณ", "1505898522": "ดาวน์โหลด stack", "1505927599": "เซิร์ฟเวอร์ของเรามีข้อขัดข้อง โปรดลองรีเฟรชเพื่อดำเนินการต่อไป", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (ซื้อ)", "1509678193": "การศึกษา", @@ -1449,6 +1475,7 @@ "1577480486": "ลิงก์โทรศัพท์มือถือของคุณจะหมดอายุภายในหนึ่งชั่วโมง", "1577527507": "โปรดระบุเหตุผลในการเปิดบัญชี", "1577612026": "เลือกโฟลเดอร์", + "1577879664": "<0>Your Wallets are ready", "1579839386": "แอปสโตร์", "1580498808": "ตรวจพบใบหน้าหลายหน้า", "1584109614": "ลิสต์รายการสตริง Tick", @@ -1502,9 +1529,11 @@ "1644703962": "กำลังมองหาบัญชี CFD อยู่ใช่ไหม? ไปที่ Trader's Hub", "1644864436": "คุณจำเป็นจะต้องพิสูจน์สิทธิ์บัญชีของคุณเสียก่อนที่จะทำการขอเป็นลูกค้ามืออาชีพ <0>พิสูจน์สิทธิ์บัญชีของฉัน", "1644908559": "โปรดระบุรหัสหลัก", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "พบข้อผิดพลาดขณะทำงานของบอท", "1648938920": "Netherlands 25", "1649239667": "2. ภายใต้ เมนูบล็อก คุณจะเห็นลิสต์รายการหมวดหมู่ซึ่งบล็อกต่างๆ จะถูกจัดกลุ่มไว้ตามนั้น ให้คุณเลือกบล็อกที่ต้องการแล้วลากไปยังพื้นที่ทำงาน", + "1650963565": "Introducing Wallets", "1651513020": "แสดงเวลาที่เหลือสําหรับแต่ละช่วงเวลา", "1651951220": "การพิมพ์ซ้ำ เช่น \"abcabcabc\" จะทำให้คาดเดายากกว่า \"abc\" เพียงเล็กน้อย", "1652366857": "ได้รับและลบ", @@ -1522,13 +1551,13 @@ "1665272539": "โปรดจําไว้ว่า: คุณจะไม่สามารถเข้าสู่ระบบบัญชีของคุณได้จนกว่าจะถึงวันที่ได้เลือกไว้", "1665738338": "ยอดคงเหลือ", "1665756261": "ไปที่แชทสด", + "1666783057": "Upgrade now", "1668138872": "แก้ไขการตั้งค่าบัญชี", "1670016002": "ตัวคูณ: {{ multiplier }}", "1670426231": "เวลาสิ้นสุด", "1671232191": "คุณได้กำหนดขีดจำกัดต่อไปนี้:", "1674163852": "คุณสามารถกำหนดวันหมดอายุของสัญญาการค้าของคุณได้โดยการตั้งเป็นระยะเวลาหรือเป็นจุดเวลาสิ้นสุด", "1675030608": "ในการสร้างบัญชีนี้ ก่อนอื่นเราจำเป็นต้องให้คุณส่งหลักฐานที่อยู่ของคุณอีกครั้ง", - "1675289747": "สลับไปยังบัญชีจริง", "1676549796": "เลเวอเรจแบบไดนามิก", "1677027187": "Forex", "1677990284": "แอปของฉัน", @@ -1556,6 +1585,7 @@ "1703091957": "เราเก็บข้อมูลเกี่ยวกับการจ้างงานของคุณตามหน้าที่ในข้อกำหนดเพื่อการตรวจทานสถานะธุรกิจของเราซึ่งเป็นไปตามกฏหมายการป้องกันการฟอกเงิน", "1704656659": "คุณมีประสบการณ์ในการเทรด CFD มากแค่ไหน", "1708413635": "สำหรับบัญชี {{currency_name}} ({{currency}}) ของคุณ", + "1709293836": "Wallet balance", "1709401095": "เทรด CFD บน Deriv X กับตลาดการเงินและดัชนี Derived ของเรา", "1709859601": "เวลาจุดออก", "1710662619": "หากคุณมีแอปแล้ว ให้เปิดใช้เพื่อเริ่มทำการซื้อขาย", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "เราจะเรียกเก็บค่าธรรมเนียมการโอน 2% หรือ {{minimum_fee}} {{currency}} แล้วแต่ว่าจำนวนใดจะสูงกว่า สำหรับการโอนเงินระหว่างบัญชีเงินตรารัฐบาล Deriv และบัญชีสกุลเงินดิจิทัล Deriv", "1720968545": "อัปโหลดหนังสือเดินทางหน้าที่มีรูปภาพจากคอมพิวเตอร์ของคุณ", + "1723069433": "Your new Wallet", "1723589564": "แสดงถึงจำนวนมากที่สุดของสัญญาที่ยังไม่ยุติและยังคงอยู่ในบัญชีของคุณ โดยแต่ละบรรทัดในพอร์ตของคุณจะแสดงถึงหนึ่งตำแหน่งการค้าที่เปิดอยู่ โดยเมื่อมันขึ้นถึงขีดจำนวนสูงสุดแล้วคุณจะไม่สามารถเปิดตำแหน่งใหม่ได้นอกจากจะดำเนินการปิดตำแหน่งที่มีอยู่เสียก่อน", "1724696797": "คุณถูกจํากัดให้มีเพียงบัญชีเงินตรารัฐบาลอันเดียวเท่านั้น", "1725958461": "หมายเลขบัญชี", @@ -1698,6 +1729,7 @@ "1842266423": "กลับ", "1842862156": "ยินดีต้อนรับสู่หน้ากระดาน Deriv X ของคุณ", "1843658716": "หากคุณเลือก \"ขาลงเท่านั้นหรือ Only Downs\" คุณจะได้เงินผลตอบแทนก็ต่อเมื่อช่วงค่า Tick ที่ติดๆ กันลดลงอย่างต่อเนื่องหลังจากจุดเข้า แต่จะไม่ได้รับเงินหากว่าค่า Tick ใดในช่วงนั้นมีค่าสูงขึ้นหรือเท่ากับค่า Tick ตัวก่อนหน้า", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(ขั้นต่ำ: {{min_stake}} - สูงสุด: {{max_payout}})", "1846266243": "ฟีเจอร์นี้ไม่สามารถใช้ได้กับบัญชีทดลอง", "1846587187": "คุณยังไม่ได้เลือกประเทศที่พำนักอาศัยของคุณ", @@ -1792,7 +1824,6 @@ "1924765698": "สถานที่เกิด*", "1926987784": "- iOS: ปัดไปทางซ้ายบนบัญชีและแตะ <0>ลบ", "1928930389": "GBP/NOK", - "1929309951": "สถานะการจ้างงาน", "1929694162": "เปรียบเทียบบัญชี", "1930899934": "เงินดิจิทัล Tether", "1931659123": "ใช้กับทุกจุด Tick", @@ -1807,6 +1838,7 @@ "1943440862": "คำนวณลิสต์รายการตัวชี้วัดโบลลิงเจอร์แบน หรือ Bollinger Bands (BB) จากลิสต์รายการในระยะเวลาหนึ่ง", "1944204227": "บล็อกนี้ส่งคืนค่ายอดคงเหลือปัจจุบัน", "1947527527": "1. ลิงก์นี้ถูกส่งโดยตัวคุณเอง", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "นี่คือเหตุผลที่เป็นไปได้:", "1950413928": "ส่งเอกสารแสดงตัวตน", @@ -1875,6 +1907,7 @@ "2014536501": "หมายเลขบัตร", "2014590669": "ตัวแปร '{{variable_name}}' นั้นไม่มีการตั้งค่า โปรดตั้งค่าสำหรับตัวแปร '{{variable_name}}' เพื่อการแจ้งเตือน", "2017672013": "กรุณาเลือกประเทศที่ออกเอกสาร", + "2020104747": "Filter", "2020545256": "ปิดบัญชีของคุณหรือไม่?", "2021037737": "โปรดอัปเดตรายละเอียดของคุณเพื่อดำเนินการต่อ", "2021161151": "ดูวิดีโอนี้ เพื่อเรียนรู้วิธีสร้างบอทซื้อขายบน Deriv Bot นอกจากนี้ ลองดูบล็อกโพสต์นี้ ซึ่งเกี่ยวกับการสร้างบอทซื้อขาย", @@ -1885,7 +1918,6 @@ "2027696535": "ข้อมูลภาษี", "2028163119": "EOS/USD", "2029237955": "ลาบวน", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI เป็นเครื่องมือวิเคราะห์ทางเทคนิคที่ช่วยให้คุณระบุแนวโน้มของตลาดโดยจะให้ค่าตั้งแต่ 0 ถึง 100 ทั้งนี้ ค่า RSI ที่ 70 และสูงกว่านั้นหมายความว่าสินทรัพย์อยู่ในภาวะซื้อมากเกินไปหรือ Overbought และแนวโน้มปัจจุบันอาจย้อนกลับภายหลัง ในขณะที่ค่า 30 และต่ำกว่านั้นหมายถึงสินทรัพย์อยู่ในภาวะขายมากเกินไปหรือ Oversold", "2030045667": "ข้อความ", "2033648953": "บล็อกนี้ให้ค่าแท่งเทียนที่ระบุเฉพาะสำหรับช่วงเวลาที่เลือกไว้", @@ -1919,6 +1951,7 @@ "2063812316": "ข้อความรายการบัญชี", "2063890788": "ยกเลิกเรียบร้อยแล้ว", "2065278286": "สเปรด", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "ใบขับขี่", "2070002739": "ไม่ยอมรับ", "2070345146": "เมื่อเปิดการซื้อขาย CFD ที่มีการใช้เลเวอเรจ", @@ -1931,6 +1964,7 @@ "2074713563": "4.2 การยื่นข้อร้องเรียน", "2080553498": "3. รับ chat ID โดยใช้ Telegram REST API (อ่านเพิ่มเติมได้ที่: https://core.telegram.org/bots/api#getupdates)", "2080829530": "ขายสำหรับ: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "ใช่ ลบ", "2084693624": "แปลงสตริงที่แสดงวันที่และเวลาให้แสดงเป็นวินาทีที่นับตั้งแต่จุด Epoch ตัวอย่างเช่น 2019-01-01 21:03:45 GMT + 0800 นั้นจะถูกแปลงไปเป็น 1546347825 ทั้งนี้ การปรับเวลาและโซนเวลานั้นสามารถเลือกได้", "2085387371": "ต้องเป็นตัวเลข ตัวอักษร และอักขระพิเศษ , '-", @@ -1966,7 +2000,6 @@ "2115223095": "ขาดทุน", "2117165122": "1. สร้างบอทเทเลแกรมและรับโทเคน API เทเลแกรมของคุณ อ่านเพิ่มเติมเกี่ยวกับวิธีการสร้างบอทในเทเลแกรมได้ที่นี่: https://core.telegram.org/bots#6-botfather", "2117489390": "อัปเดตอัตโนมัติภายใน {{ remaining }} วินาที", - "2118315870": "คุณอาศัยอยู่ที่ไหน?", "2119449126": "ตัวอย่างผลลัพธ์ของตัวอย่างด้านล่างจะเป็น:", "2119710534": "คำถามที่พบบ่อย", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "เคล็ดลับมือโปร: คุณยังคลิกและลากบล็อกที่ต้องการออกมาได้", "2146892766": "ประสบการณ์การซื้อขายไบนารีออปชัน", "2147244655": "ฉันจะนำเข้าบอทเทรดของฉันเองลงใน Deriv Bot ได้อย่างไร?", - "-1232613003": "<0>การตรวจสอบยืนยันล้มเหลว <1>เพราะอะไร?", - "-2029508615": "<0>ต้องมีการตรวจสอบยืนยัน<1>ตรวจสอบยืนยันตอนนี้", "-931052769": "ส่งการตรวจสอบยืนยัน", "-1004605898": "เคล็ดลับ", "-1938142055": "เอกสารถูกอัปโหลดแล้ว", @@ -2141,18 +2172,9 @@ "-179726573": "เราได้รับหลักฐานการเป็นเจ้าของของคุณแล้ว", "-813779897": "ผ่านการตรวจสอบยืนยันการเป็นเจ้าของแล้ว", "-638756912": "ขีดทับตัวเลขหลักที่ 7 ถึง 12 ของหมายเลขบัตรที่แสดงอยู่ด้านหน้าบัตรเดบิต/เครดิตของคุณ⁤", - "-2073934245": "บริการซื้อขายทางการเงินที่นำเสนอในเว็บไซต์นี้เหมาะเฉพาะสำหรับลูกค้าที่ยอมรับความเป็นไปได้ของการขาดทุนเงินทั้งหมดที่พวกเขาลงทุนไปและผู้ที่มีความเข้าใจและมีประสบการณ์เกี่ยวกับความเสี่ยงที่เกี่ยวข้องกับการซื้อสัญญาทางการเงินเท่านั้น การทำธุรกรรมในสัญญาทางการเงินมีความเสี่ยงสูง หากสัญญาที่คุณซื้อหมดอายุคุณก็จะสูญเสียเงินลงทุนทั้งหมดซึ่งรวมถึงค่าธรรมเนียมของสัญญาดังกล่าวด้วย", - "-1166068675": "บัญชีของคุณจะถูกเปิดกับ {{legal_entity_name}} ซึ่งถูกควบคุมดูแลโดยคณะกรรมการการพนันแห่งสหราชอาณาจักรหรือ UK Gaming Commission (UKGC) และจะอยู่ภายใต้กฎหมายของเกาะไอล์ออฟแมน", - "-975118358": "บัญชีของคุณจะเปิดขึ้นกับ {{legal_entity_name}} ซึ่งถูกควบคุมดูแลโดยองค์กร Malta Financial Services Authority (MFSA) และจะอยู่ภายใต้กฎหมายของมอลตา", - "-680528873": "บัญชีของคุณจะถูกเปิดขึ้นกับ {{legal_entity_name}} และจะอยู่ภายใต้กฎหมายของรัฐเอกราชซามัว", - "-1125193491": "เพิ่มบัญชี", - "-2068229627": "ฉันไม่ใช่บุคคลที่มีสถานภาพทางการเมืองหรือ PEP และฉันไม่ได้เป็น PEP ในช่วง 12 เดือนที่ผ่านมา", "-684271315": "OK", "-740157281": "การประเมินประสบการณ์การเทรด", "-1720468017": "ในการให้บริการของเราแก่คุณ เราจำเป็นต้องได้รับข้อมูลจากคุณเพื่อประเมินว่าผลิตภัณฑ์หรือบริการนั้นเหมาะสมกับคุณหรือไม่", - "-186841084": "เปลี่ยนอีเมล์ที่ใช้เข้าสู่ระบบของคุณ", - "-907403572": "หากคุณต้องการเปลี่ยนที่อยู่อีเมล์ ประการแรกคุณจะต้องยกเลิกการเชื่อมโยงที่อยู่อีเมล์ของคุณจากบัญชี {{identifier_title}} เสียก่อน", - "-1850792730": "ยกเลิกการเชื่อมโยงจาก {{identifier_title}}", "-307865807": "การเตือนถึงความเสี่ยงที่ยอมรับได้", "-690100729": "ใช่ ฉันเข้าใจถึงความเสี่ยง", "-2010628430": "CFDs และตราสารทางการเงินอื่นๆ มีความเสี่ยงสูงที่จะสูญเสียเงินอย่างรวดเร็วเนื่องจากเลเวอเรจคุณควรพิจารณาว่าคุณเข้าใจวิธีการทำงานของ CFDs และตราสารทางการเงินอื่นๆ หรือไม่และคุณจะรับความเสี่ยงสูงในการสูญเสียเงินของคุณได้หรือไม่<0/><0/> เพื่อดำเนินการต่อ คุณต้องยืนยันว่าคุณเข้าใจว่าเงินทุนของคุณมีความเสี่ยง", @@ -2206,11 +2228,6 @@ "-1725454783": "ล้มเหลว", "-506510414": "วันที่และเวลา", "-1708927037": "หมายเลขประจำเครื่องคอมพิวเตอร์", - "-619126443": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}} และ {{platform_name_trader}}", - "-623760979": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}}, {{platform_name_trader}} และ {{platform_name_go}}", - "-459147994": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} และ {{platform_name_ctrader}}.", - "-80717068": "แอปพลิเคชั่นที่คุณเชื่อมโยงเข้ากับ <0>รหัสผ่าน Deriv: ของคุณ", - "-9570380": "ให้ใช้รหัสผ่าน {{platform_name_dxtrade}} เพื่อเข้าใช้บัญชี {{platform_name_dxtrade}} ของคุณบนเว็บและแอปมือถือ", "-2131200819": "ปิดใช้งาน", "-200487676": "เปิดใช้งาน", "-1840392236": "นั่นไม่ใช่รหัสที่ถูกต้อง โปรดลองอีกครั้ง", @@ -2240,44 +2257,37 @@ "-378415317": "โปรดระบุรัฐ", "-1497654315": "บัญชีและบริการของเราไม่สามารถใช้ได้สำหรับรหัสไปรษณีย์ Jersey", "-755626951": "กรอกรายละเอียดที่อยู่ของคุณ", - "-584911871": "เลือกสกุลเงินในกระเป๋าเงินอิเล็กทรอนิกส์", "-1461267236": "โปรดเลือกสกุลเงินของคุณ", - "-1352330125": "สกุลเงิน", "-1027595143": "น้อยกว่า $25,000", "-40491332": "$25,000 - $50,000", "-1139806939": "$50,001 - $100,000", - "-626752657": "0-1 ปี", - "-532014689": "1-2 ปี", - "-1001024004": "มากกว่า 3 ปี", - "-790513277": "มี 6-10 ธุรกรรมใน 12 เดือนที่ผ่านมา", - "-580085300": "มี 11-39 ธุรกรรมใน 12 เดือนที่ผ่านมา", - "-654781670": "ระดับประถมศึกษา", - "-1717373258": "ระดับมัธยมศึกษา", "-996132458": "การก่อสร้าง", "-915003867": "สุขภาพ", "-1430012453": "เทคโนโลยีสารสนเทศและการสื่อสาร", "-987824916": "วิทยาศาสตร์และวิศวกรรม", "-146630682": "สังคมและวัฒนธรรม", "-761306973": "อุตสาหกรรมการผลิต", - "-739367071": "มีการประกอบอาชีพ", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "มากกว่า $1,000,000", - "-2068544539": "พนักงานที่ได้รับเงินเดือน", - "-531314998": "เงินลงทุนและเงินปันผล", - "-1235114522": "บำนาญ", - "-1298056749": "ผลประโยชน์ของรัฐ", - "-449943381": "เงินออม & มรดกตกทอด", "-1631552645": "ผู้เชี่ยวชาญ", "-474864470": "พนักงานดูแลด้านสุขภาพ พนักงานขาย และผู้ให้บริการต่างๆ", "-1129355784": "คนงานภาคเกษตรกรรม การป่าไม้ และการประมง", "-1242914994": "คนทำงานช่างฝีมือ งานโลหะ ไฟฟ้าและอิเล็กทรอนิกส์", "-1317824715": "พนักงานทำความสะอาดและผู้ช่วยทำงานบ้าน", "-1592729751": "คนงานเหมือง ก่อสร้าง อุตสาหกรรม และการขนส่ง", + "-1030759620": "ข้าราชการ", "-2137323480": "เจ้าของกิจการ", "-1590574533": "ข้อตกลงการหย่า", "-1667683002": "มรดกตกทอด", "-1237843731": "รายได้จากการลงทุน", "-777506574": "การขายทรัพย์สิน", + "-654781670": "ระดับประถมศึกษา", + "-1717373258": "ระดับมัธยมศึกษา", + "-1156937070": "$500,001 - $1,000,000", + "-315534569": "มากกว่า $1,000,000", + "-2068544539": "พนักงานที่ได้รับเงินเดือน", + "-531314998": "เงินลงทุนและเงินปันผล", + "-1235114522": "บำนาญ", + "-1298056749": "ผลประโยชน์ของรัฐ", + "-449943381": "เงินออม & มรดกตกทอด", "-1161338910": "โปรดระบุชื่อแรก", "-1161818065": "นามสกุลควรมีความยาวระหว่าง 2 ถึง 50 ตัวอักษร", "-1281693513": "โปรดระบุวันเกิด", @@ -2287,28 +2297,14 @@ "-212167954": "หมายเลขประจำตัวผู้เสียภาษีนั้นไม่อยู่ในรูปแบบที่ถูกต้อง", "-621555159": "ข้อมูลประจำตัว", "-204765990": "ข้อตกลงในการใช้งาน", - "-231863107": "ไม่ใช่", - "-870902742": "คุณมีความรู้และประสบการณ์เกี่ยวกับการซื้อขายออนไลน์มากน้อยเพียงใด", - "-1929477717": "ฉันมีวุฒิการศึกษา ประกาศนียบัตรวิชาชีพ และ/หรือประสบการณ์การทำงานที่เกี่ยวข้องกับบริการทางการเงิน", - "-1540148863": "ฉันได้เข้าร่วมการสัมนา ฝึกอบรม และ/หรือเวิร์กซ็อปที่เกี่ยวข้องกับการเทรด", - "-922751756": "น้อยกว่า 1 ปี", - "-542986255": "ไม่มี", - "-1337206552": "ตามความเข้าใจของคุณ การเทรด CFD ช่วยให้คุณ", - "-456863190": "วางตำแหน่งการค้าอิงการเคลื่อนไหวราคาสินทรัพย์ซึ่งจะให้ผลลัพธ์เป็นการที่จะได้ผลตอบแทนอันคงที่หรือการที่จะไม่ได้อะไรเลย", - "-1314683258": "ลงทุนระยะยาวเพื่อรับประกันผลกำไร", - "-1546090184": "เลเวเรจมีผลต่อการเทรด CFD อย่างไร", - "-1636427115": "เลเวเรจช่วยลดความเสี่ยง", - "-800221491": "เลเวเรจรับประกันผลกำไร", - "-811839563": "เลเวเรจช่วยให้คุณเปิดตำแหน่งการค้าขนาดใหญ่โดยใช้เพียงเศษเสี้ยวของมูลค่าการเทรดแท้จริง ซึ่งนี่ก็อาจส่งผลให้เกิดผลกำไรที่เพิ่มพูนหรือการขาดทุนที่เพิ่มขึ้น", - "-1185193552": "ปิดการซื้อขายของคุณโดยอัตโนมัติเมื่อการขาดทุนนั้นเท่ากับหรือมากกว่าจำนวนที่กำหนด ตราบใดที่มีสภาพคล่องในตลาดเพียงพอ", - "-1046354": "ปิดการซื้อขายของคุณโดยอัตโนมัติเมื่อผลกำไรนั้นเท่ากับหรือมากกว่าจำนวนที่กำหนด ตราบใดที่มีสภาพคล่องในตลาดเพียงพอ", - "-1842858448": "ทำผลกำไรที่รับประกันจากการเทรดของคุณ", - "-860053164": "เมื่อทำการเทรดตัวคูณต่างๆ", - "-1250327770": "เมื่อซื้อหุ้นต่างๆ ของบริษัท", - "-1222388581": "ทั้งหมดทุกข้อข้างต้น", "-477761028": "บัตรประจำตัวผู้มีสิทธิเลือกตั้ง", "-1466346630": "หมายเลขประจำตัวประชาชน CPF", - "-1030759620": "ข้าราชการ", + "-739367071": "มีการประกอบอาชีพ", + "-626752657": "0-1 ปี", + "-532014689": "1-2 ปี", + "-1001024004": "มากกว่า 3 ปี", + "-790513277": "มี 6-10 ธุรกรรมใน 12 เดือนที่ผ่านมา", + "-580085300": "มี 11-39 ธุรกรรมใน 12 เดือนที่ผ่านมา", "-612752984": "นี่คือข้อจำกัดตั้งต้นที่ใช้กับบัญชีของคุณ", "-1598263601": "หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับข้อจำกัดการซื้อขายและวิธีการใช้งาน โปรดไปที่ <0>ศูนย์ช่วยเหลือ", "-1411635770": "เรียนรู้เพิ่มเติมเกี่ยวกับขีดจำกัดบัญชี", @@ -2326,10 +2322,7 @@ "-1500958859": "ยืนยัน", "-1502578110": "บัญชีของคุณได้รับการยืนยันตัวตนอย่างสมบูรณ์ และวงเงินการถอนเงินของคุณได้ถูกยกเลิกแล้ว", "-1662154767": "ใบแจ้งหนี้ค่าสาธารณูปโภคล่าสุด (เช่น ไฟฟ้า น้ำ แก๊ส โทรศัพท์หรืออินเทอร์เน็ต) ใบแจ้งยอดบัญชีธนาคาร หรือจดหมายที่ออกโดยรัฐบาลที่แสดงชื่อของคุณและที่อยู่นี้", - "-190838815": "เราต้องการสิ่งนี้สำหรับการตรวจสอบยืนยัน หากข้อมูลที่คุณให้นั้นเป็นข้อมูลปลอมหรือไม่ถูกต้อง คุณจะไม่สามารถทำการฝากและถอนได้", - "-223216785": "บรรทัดที่สองของที่อยู่*", "-594456225": "บรรทัดที่สองของที่อยู่", - "-1940457555": "รหัสไปรษณีย์*", "-1964954030": "รหัสไปรษณีย์", "-516397235": "ระวังคนที่คุณแบ่งปันโทเคนนี้ด้วย เพราะใครก็ตามที่มีโทเคนนี้สามารถดำเนินการต่อไปนี้ในนามบัญชีของคุณได้", "-989216986": "เพิ่มบัญชี", @@ -2371,8 +2364,6 @@ "-1100235269": "อุตสาหกรรมการจ้างงาน", "-684388823": "ประมาณการรายได้สุทธิ", "-509054266": "ผลประกอบการประจําปีที่คาดการณ์เอาไว้", - "-601903492": "ประสบการณ์การซื้อขาย Forex", - "-1012699451": "ประสบการณ์การซื้อขาย CFD", "-1588485629": "ตัวอย่าง", "-1117345066": "เลือกประเภทเอกสาร", "-651192353": "ตัวอย่าง:", @@ -2464,12 +2455,40 @@ "-142444667": "โปรดกดที่ลิงก์ในอีเมล์เพื่อเปลี่ยนรหัส Deriv MT5 ของคุณ", "-742748008": "ตรวจสอบอีเมล์ของคุณและคลิกลิงก์ในอีเมล์เพื่อดำเนินการต่อ", "-84068414": "หากยังไม่ได้รับอีเมล์ โปรดติดต่อเราทาง <0>แชทสด", + "-975118358": "บัญชีของคุณจะเปิดขึ้นกับ {{legal_entity_name}} ซึ่งถูกควบคุมดูแลโดยองค์กร Malta Financial Services Authority (MFSA) และจะอยู่ภายใต้กฎหมายของมอลตา", + "-2073934245": "บริการซื้อขายทางการเงินที่นำเสนอในเว็บไซต์นี้เหมาะเฉพาะสำหรับลูกค้าที่ยอมรับความเป็นไปได้ของการขาดทุนเงินทั้งหมดที่พวกเขาลงทุนไปและผู้ที่มีความเข้าใจและมีประสบการณ์เกี่ยวกับความเสี่ยงที่เกี่ยวข้องกับการซื้อสัญญาทางการเงินเท่านั้น การทำธุรกรรมในสัญญาทางการเงินมีความเสี่ยงสูง หากสัญญาที่คุณซื้อหมดอายุคุณก็จะสูญเสียเงินลงทุนทั้งหมดซึ่งรวมถึงค่าธรรมเนียมของสัญญาดังกล่าวด้วย", + "-1125193491": "เพิ่มบัญชี", + "-2068229627": "ฉันไม่ใช่บุคคลที่มีสถานภาพทางการเมืองหรือ PEP และฉันไม่ได้เป็น PEP ในช่วง 12 เดือนที่ผ่านมา", + "-186841084": "เปลี่ยนอีเมล์ที่ใช้เข้าสู่ระบบของคุณ", + "-907403572": "หากคุณต้องการเปลี่ยนที่อยู่อีเมล์ ประการแรกคุณจะต้องยกเลิกการเชื่อมโยงที่อยู่อีเมล์ของคุณจากบัญชี {{identifier_title}} เสียก่อน", + "-1850792730": "ยกเลิกการเชื่อมโยงจาก {{identifier_title}}", "-428335668": "คุณจะต้องตั้งรหัสผ่านเพื่อให้กระบวนการเสร็จสมบูรณ์", + "-1232613003": "<0>การตรวจสอบยืนยันล้มเหลว <1>เพราะอะไร?", + "-2029508615": "<0>ต้องมีการตรวจสอบยืนยัน<1>ตรวจสอบยืนยันตอนนี้", "-818898181": "ชื่อในเอกสารไม่ตรงกับในโปรไฟล์ Deriv ของคุณ", "-310316375": "ที่อยู่ในเอกสารไม่ตรงกับที่อยู่ที่คุณป้อนข้างต้น", "-485368404": "เอกสารที่ออกมานานมากกว่า 6 เดือนที่ผ่านมา", "-367016488": "เอกสารเบลอ ข้อมูลทั้งหมดต้องมีความชัดเจนและมองเห็นได้ชัด", "-1957076143": "เอกสารที่ถูกครอปตัดบางส่วน ข้อมูลทั้งหมดต้องมีความชัดเจนและมองเห็นได้ชัด", + "-231863107": "ไม่ใช่", + "-870902742": "คุณมีความรู้และประสบการณ์เกี่ยวกับการซื้อขายออนไลน์มากน้อยเพียงใด", + "-1929477717": "ฉันมีวุฒิการศึกษา ประกาศนียบัตรวิชาชีพ และ/หรือประสบการณ์การทำงานที่เกี่ยวข้องกับบริการทางการเงิน", + "-1540148863": "ฉันได้เข้าร่วมการสัมนา ฝึกอบรม และ/หรือเวิร์กซ็อปที่เกี่ยวข้องกับการเทรด", + "-922751756": "น้อยกว่า 1 ปี", + "-542986255": "ไม่มี", + "-1337206552": "ตามความเข้าใจของคุณ การเทรด CFD ช่วยให้คุณ", + "-456863190": "วางตำแหน่งการค้าอิงการเคลื่อนไหวราคาสินทรัพย์ซึ่งจะให้ผลลัพธ์เป็นการที่จะได้ผลตอบแทนอันคงที่หรือการที่จะไม่ได้อะไรเลย", + "-1314683258": "ลงทุนระยะยาวเพื่อรับประกันผลกำไร", + "-1546090184": "เลเวเรจมีผลต่อการเทรด CFD อย่างไร", + "-1636427115": "เลเวเรจช่วยลดความเสี่ยง", + "-800221491": "เลเวเรจรับประกันผลกำไร", + "-811839563": "เลเวเรจช่วยให้คุณเปิดตำแหน่งการค้าขนาดใหญ่โดยใช้เพียงเศษเสี้ยวของมูลค่าการเทรดแท้จริง ซึ่งนี่ก็อาจส่งผลให้เกิดผลกำไรที่เพิ่มพูนหรือการขาดทุนที่เพิ่มขึ้น", + "-1185193552": "ปิดการซื้อขายของคุณโดยอัตโนมัติเมื่อการขาดทุนนั้นเท่ากับหรือมากกว่าจำนวนที่กำหนด ตราบใดที่มีสภาพคล่องในตลาดเพียงพอ", + "-1046354": "ปิดการซื้อขายของคุณโดยอัตโนมัติเมื่อผลกำไรนั้นเท่ากับหรือมากกว่าจำนวนที่กำหนด ตราบใดที่มีสภาพคล่องในตลาดเพียงพอ", + "-1842858448": "ทำผลกำไรที่รับประกันจากการเทรดของคุณ", + "-860053164": "เมื่อทำการเทรดตัวคูณต่างๆ", + "-1250327770": "เมื่อซื้อหุ้นต่างๆ ของบริษัท", + "-1222388581": "ทั้งหมดทุกข้อข้างต้น", "-1515286538": "กรุณาใส่หมายเลขเอกสารของคุณ ", "-1694758788": "ป้อนหมายเลขเอกสารของคุณ", "-1458676679": "คุณควรป้อน 2-50 อักขระ", @@ -2479,6 +2498,8 @@ "-1437017790": "ข้อมูลทางการเงิน", "-70342544": "เรามีหน้าที่ตามกฎหมายที่จะต้องขอข้อมูลทางการเงินของคุณ", "-39038029": "ประสบการณ์การซื้อขาย", + "-601903492": "ประสบการณ์การซื้อขาย Forex", + "-1012699451": "ประสบการณ์การซื้อขาย CFD", "-1894668798": "ประสบการณ์ซื้อขายตราสารทางการเงินอื่นๆ", "-1026468600": "ความถี่ในการซื้อขายตราสารทางการเงินอื่นๆ", "-1743024217": "เลือกภาษา", @@ -2489,6 +2510,11 @@ "-536187647": "ยืนยันการยกเลิกการเข้าถึง?", "-1357606534": "สิทธิ์", "-570222048": "การเพิกถอนการเข้าถึง", + "-80717068": "แอปพลิเคชั่นที่คุณเชื่อมโยงเข้ากับ <0>รหัสผ่าน Deriv: ของคุณ", + "-340060402": "รหัสผ่าน Deriv X ของคุณใช้สําหรับเข้าสู่ระบบบัญชี Deriv X ของคุณบนเว็บและแอปบนอุปกรณ์เคลื่อนที่", + "-619126443": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}} และ {{platform_name_trader}}", + "-623760979": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}}, {{platform_name_trader}} และ {{platform_name_go}}", + "-459147994": "ใช้ <0>รหัสผ่าน Deriv เพื่อเข้าสู่ระบบ {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} และ {{platform_name_ctrader}}.", "-1526404112": "ใบแจ้งหนี้ค่าสาธารณูปโภค: ค่าไฟฟ้า ค่าน้ำ ค่าก๊าซ ค่าโทรศัพท์พื้นฐาน", "-537552700": "สัญญาเช่าบ้าน: ข้อตกลงที่ถูกต้องและเป็นปัจจุบัน", "-890084320": "บันทึกและส่ง", @@ -2510,11 +2536,20 @@ "-362324454": "สินค้าโภคภัณฑ์", "-1071336803": "แพลตฟอร์ม", "-820028470": "ตราสารสิทธิ & ตัวคูณ", - "-1255879419": "Trader's Hub", + "-1186807402": "โอนเงิน", + "-224804428": "ธุรกรรม", + "-470018967": "รีเซ็ตยอดเงินคงเหลือ", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "ตั้งค่าใหม่", "-213142918": "ไม่สามารถฝากและถอนเงินได้ชั่วคราว ", - "-224804428": "ธุรกรรม", - "-1186807402": "โอนเงิน", "-1308346982": "บัญชี Derived", "-1145604233": "เทรด CFD บน MT5 ด้วยดัชนี Derived ซึ่งจำลองการเคลื่อนไหวของตลาดจริง", "-328128497": "บัญชี Financial", @@ -2525,15 +2560,29 @@ "-81256466": "คุณต้องมีบัญชี Deriv เพื่อสร้างบัญชี CFD", "-699372497": "ทำการซื้อขายด้วยเลเวอเรจและสเปรดที่แคบเพื่อผลตอบแทนที่ดีขึ้นจากการเทรดที่สำเร็จ <0>เรียนรู้เพิ่มเติม", "-1884966862": "รับบัญชี Deriv MT5 เพิ่มด้วยประเภทและเขตอำนาจศาลที่แตกต่างกัน", - "-145462920": "Deriv cTrader", "-982095728": "รับ", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>ข้อสงวนสิทธิ์ตามกฎหมายสหภาพยุโรป: สัญญาส่วนต่างหรือ CFD คือตราสารทางการเงินที่มีความซับซ้อนและมีความเสี่ยงสูงในการสูญเสียเงินอย่างรวดเร็วเนื่องจากการใช้เลเวอเรจ ทั้งนี้ <0>73% ของบัญชีนักลงทุนรายย่อยได้สูญเสียเงินเมื่อทําการเทรด CFD กับผู้ให้บริการรายนี้<0> ดังนั้น คุณควรพิจารณาว่า คุณเข้าใจการทำงานของ CFD หรือไม่อย่างไรและคุณสามารถรับความเสี่ยงสูงต่อการสูญเสียเงินของคุณได้หรือไม่", "-1277942366": "สินทรัพย์ทั้งหมด", + "-1255879419": "Trader's Hub", "-493788773": "นอกสหภาพยุโรปหรือ EU", "-673837884": "สหภาพยุโรปหรือ EU", "-230566990": "เอกสารต่อไปนี้ที่คุณส่งมาไม่ผ่านการตรวจสอบของเรา:", "-846812148": "หลักฐานยืนยันที่อยู่", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "กฎระเบียบสำหรับพื้นที่นอกสหภาพยุโรป", "-643108528": "กฎระเบียบสำหรับพื้นที่นอกและในสหภาพยุโรป", + "-979459594": "Buy/Sell", + "-494667560": "คำสั่งซื้อขาย", + "-679691613": "โฆษณาของฉัน", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "บัญชีตัวคูณ", "-744999940": "บัญชี Deriv", @@ -2543,9 +2592,20 @@ "-318106501": "เทรด CFD บน MT5 ในกลุ่มดัชนีสังเคราะห์ ดัชนีตะกร้า และดัชนี Derived FX", "-1328701106": "เทรด CFD บน MT5 กับ Forex หุ้น ดัชนีหุ้น สินทรัพย์สังเคราะห์ คริปโตเคอเรนซี่ และสินค้าโภคภัณฑ์", "-1173266642": "บัญชีนี้ให้บริการ CFD บนแพลตฟอร์มการซื้อขายที่มีคุณสมบัติหลากหลาย", - "-1290112064": "Deriv EZ", "-1453519913": "ซื้อขาย CFD บนแพลตฟอร์มที่เริ่มต้นใช้งานได้ง่ายซี่งมีสินทรัพย์ที่คุณชื่นชอบทั้งหมด", "-2051096382": "รับเงินผลตอบแทนหลายแบบผ่านการคาดการณ์อย่างถูกต้องถึงการเคลื่อนไหวของตลาดไปกับ <0>ตราสารสิทธิ หรือได้ประโยชน์จากข้อดีของสัญญาส่วนต่าง CFD โดยไม่เสี่ยงเกินไปกว่าเงินทุนทรัพย์เริ่มต้นของคุณไปกับ <1>ตัวคูณ", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "ทางเลือกของกฎระเบียบ", "-249184528": "คุณสามารถสร้างบัญชีจริงภายใต้กฎระเบียบของสหภาพยุโรปหรือที่ไม่ใช่สหภาพยุโรป คลิกที่ไอคอน <0><0/>เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับบัญชีเหล่านี้", "-1505234170": "เยี่ยมชม Trader's Hub", @@ -2556,7 +2616,21 @@ "-951876657": "เติมเงินเข้าบัญชีของคุณ", "-1945421757": "เมื่อคุณมีบัญชีคลิกที่ 'ฝากเงิน' หรือ 'โอนเงิน' เพื่อเพิ่มเงินเข้าบัญชี", "-1965920446": "เริ่มทำการซื้อขาย", - "-33612390": "<0>ข้อสงวนสิทธิ์ตามกฎหมายสหภาพยุโรป: สัญญาส่วนต่างหรือ CFD คือตราสารทางการเงินที่มีความซับซ้อนและมีความเสี่ยงสูงในการสูญเสียเงินอย่างรวดเร็วเนื่องจากการใช้เลเวอเรจ ทั้งนี้ <0>73% ของบัญชีนักลงทุนรายย่อยได้สูญเสียเงินเมื่อทําการเทรด CFD กับผู้ให้บริการรายนี้<0> ดังนั้น คุณควรพิจารณาว่า คุณเข้าใจการทำงานของ CFD หรือไม่อย่างไรและคุณสามารถรับความเสี่ยงสูงต่อการสูญเสียเงินของคุณได้หรือไม่", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "ข้อมูลในช่องนี้ต้องระบุ", "-1870909526": "เซิร์ฟเวอร์ของเราไม่สามารถดึงข้อมูลที่อยู่ได้", "-582721696": "จำนวนการถอนที่อนุญาตในปัจจุบันคือ {{format_min_withdraw_amount}} ถึง {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "ที่อยู่วอลเล็ท {{currency_symbol}} ของคุณ", "-38063175": "วอลเล็ทหรือกระเป๋าเงินอิเล็กทรอนิกส์ของ {{account_text}}", "-705272444": "อัปโหลดหลักฐานการยืนยันตัวตนเพื่อทำการยืนยันตัวตนของคุณ", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "นี่เป็นการปกป้องบัญชีของคุณจากการถอนเงินโดยไม่ได้รับอนุญาต", "-130833284": "โปรดทราบว่า วงเงินสูงสุดและต่ำสุดในการถอนของคุณนั้นไม่ได้อยู่คงที่ แต่จะเปลี่ยนไปตามความผันผวนสูงของสกุลเงินดิจิทัล", "-1531269493": "เราจะส่งอีเมล์ถึงคุณเมื่อธุรกรรมของคุณได้รับการประมวลผลแล้ว", @@ -2859,6 +2934,30 @@ "-1016171176": "สินทรัพย์", "-621128676": "ประเภทการซื้อขาย", "-447853970": "เกณฑ์การขาดทุน", + "-155173714": "มาสร้างบอทกันเถอะ!", + "-1919212468": "3. คุณสามารถค้นหาบล็อกต่างๆ ที่ต้องการโดยการใช้แถบคำสั่งค้นหาที่อยู่ข้างบนหมวดหมู่ ", + "-1520558271": "สำหรับข้อมูลเพิ่มเติม เข้าดูบล็อกโพสต์นี้ ซึ่งเกี่ยวกับพื้นฐานการสร้างบอทซื้อขาย", + "-980360663": "3. เลือกบล็อกที่คุณต้องการแล้วลากไปยังพื้นที่ทำงาน", + "-1493168314": "กลยุทธ์ด่วนคืออะไร?", + "-1680391945": "การใช้กลยุทธ์ด่วน", + "-1177914473": "ฉันจะบันทึกกลยุทธ์ของฉันได้อย่างไร?", + "-271986909": "จากใน ตัวสร้างบอท ให้กดปุ่ม บันทึก บนแถบเครื่องมือที่ด้านบนเพื่อดาวน์โหลดบอทของคุณ ตั้งชื่อบอทนั้น แล้วเลือกดาวน์โหลดบอทนั้นลงในอุปกรณ์ของคุณหรือ Google Drive ทั้งนี้ บอทของคุณจะถูกดาวน์โหลดเป็นไฟล์ XML", + "-1149045595": "1. หลังจากกดปุ่ม นำเข้า เลือก ในเครื่อง แล้วคลิก ดำเนินการต่อ", + "-288041546": "2. เลือกไฟล์ XML ของคุณและกด เปิด", + "-2127548288": "3. บอทของคุณจะถูกโหลดตามนั้น", + "-1311297611": "1. หลังจากกดปุ่ม นำเข้า เลือก Google Drive แล้วคลิก ดำเนินการต่อ", + "-1549564044": "ทำการตั้งค่าพื้นที่ทำงานได้อย่างไร?", + "-1127331928": "ใน ตัวสร้างบอท กด รีเซ็ต บนแถบเครื่องมือที่ด้านบนเพื่อลบล้างพื้นที่ทำงาน โปรดทราบว่า การเปลี่ยนแปลงใดๆ ที่ไม่ได้บันทึกไว้จะหายไป", + "-1720444288": "ฉันจะควบคุมการขาดทุนด้วย Deriv Bot ได้อย่างไร?", + "-1142295124": "มีหลายวิธีที่จะควบคุมการขาดทุนของคุณด้วย Deriv Bot และต่อไปนี้คือตัวอย่างง่ายๆ ของวิธีที่คุณใช้การควบคุมการขาดทุนในกลยุทธ์ของคุณ:", + "-986689483": "1. สร้างตัวแปรดังต่อไปนี้:", + "-269910127": "3. อัปเดต กำไร/ขาดทุนปัจจุบัน ด้วยกำไรจากสัญญาครั้งล่าสุด หากสัญญานั้นขาดทุน ค่าของ กำไร/ขาดทุนปัจจุบัน จะเป็นค่าลบ", + "-1565344891": "ฉันสามารถเรียกใช้ Deriv Bot บนหลายๆ แท็บในเว็บเบราว์เซอร์ของฉันได้หรือไม่?", + "-90192474": "ใช่ คุณสามารถทำได้ แต่จะมีข้อจำกัดบางอย่างในบัญชีของคุณ เช่น จำนวนตำแหน่งการค้าที่เปิดได้สูงสุด และการจ่ายเงินรวมสูงสุดสำหรับตำแหน่งการค้าที่เปิดอยู่ ดังนั้นคุณเพียงต้องตระหนักถึงข้อจำกัดเหล่านี้ไว้ในใจเมื่อเปิดหลายตำแหน่งการค้าไว้ คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับข้อจำกัดเหล่านี้ได้ที่ การตั้งค่า > ขีดจำกัดของบัญชี", + "-213872712": "ไม่ เราไม่นำเสนอคริปโตเคอร์เรนซี่บน Deriv Bot", + "-2147346223": "Deriv Bot มีให้บริการในประเทศใดบ้าง?", + "-352345777": "กลยุทธ์ที่นิยมมากที่สุดสำหรับการซื้อขายอัตโนมัติคืออะไร?", + "-552392096": "สามกลยุทธ์ที่ใช้กันมากที่สุดในการซื้อขายแบบอัตโนมัติคือ กลยุทธ์มาติงเกล (Martingale) กลยุทธ์ดาล็องแบร์ (D'Alembert) และกลยุทธ์ออสการ์ กรินด์ (Oscar's Grind) ซึ่งคุณจะเจอสามกลยุทธ์รอคุณอยู่แล้วใน Deriv Bot", "-507620484": "ยังไม่ได้บันทึก", "-764102808": "Google Drive", "-555886064": "ชนะ", @@ -2937,30 +3036,6 @@ "-1823621139": "กลยุทธ์ด่วน", "-1778025545": "คุณนำเข้าบอทสำเร็จแล้ว", "-1519425996": "ไม่พบผลการค้นหา \"{{ faq_search_value }}”", - "-155173714": "มาสร้างบอทกันเถอะ!", - "-1919212468": "3. คุณสามารถค้นหาบล็อกต่างๆ ที่ต้องการโดยการใช้แถบคำสั่งค้นหาที่อยู่ข้างบนหมวดหมู่ ", - "-1520558271": "สำหรับข้อมูลเพิ่มเติม เข้าดูบล็อกโพสต์นี้ ซึ่งเกี่ยวกับพื้นฐานการสร้างบอทซื้อขาย", - "-980360663": "3. เลือกบล็อกที่คุณต้องการแล้วลากไปยังพื้นที่ทำงาน", - "-1493168314": "กลยุทธ์ด่วนคืออะไร?", - "-1680391945": "การใช้กลยุทธ์ด่วน", - "-1177914473": "ฉันจะบันทึกกลยุทธ์ของฉันได้อย่างไร?", - "-271986909": "จากใน ตัวสร้างบอท ให้กดปุ่ม บันทึก บนแถบเครื่องมือที่ด้านบนเพื่อดาวน์โหลดบอทของคุณ ตั้งชื่อบอทนั้น แล้วเลือกดาวน์โหลดบอทนั้นลงในอุปกรณ์ของคุณหรือ Google Drive ทั้งนี้ บอทของคุณจะถูกดาวน์โหลดเป็นไฟล์ XML", - "-1149045595": "1. หลังจากกดปุ่ม นำเข้า เลือก ในเครื่อง แล้วคลิก ดำเนินการต่อ", - "-288041546": "2. เลือกไฟล์ XML ของคุณและกด เปิด", - "-2127548288": "3. บอทของคุณจะถูกโหลดตามนั้น", - "-1311297611": "1. หลังจากกดปุ่ม นำเข้า เลือก Google Drive แล้วคลิก ดำเนินการต่อ", - "-1549564044": "ทำการตั้งค่าพื้นที่ทำงานได้อย่างไร?", - "-1127331928": "ใน ตัวสร้างบอท กด รีเซ็ต บนแถบเครื่องมือที่ด้านบนเพื่อลบล้างพื้นที่ทำงาน โปรดทราบว่า การเปลี่ยนแปลงใดๆ ที่ไม่ได้บันทึกไว้จะหายไป", - "-1720444288": "ฉันจะควบคุมการขาดทุนด้วย Deriv Bot ได้อย่างไร?", - "-1142295124": "มีหลายวิธีที่จะควบคุมการขาดทุนของคุณด้วย Deriv Bot และต่อไปนี้คือตัวอย่างง่ายๆ ของวิธีที่คุณใช้การควบคุมการขาดทุนในกลยุทธ์ของคุณ:", - "-986689483": "1. สร้างตัวแปรดังต่อไปนี้:", - "-269910127": "3. อัปเดต กำไร/ขาดทุนปัจจุบัน ด้วยกำไรจากสัญญาครั้งล่าสุด หากสัญญานั้นขาดทุน ค่าของ กำไร/ขาดทุนปัจจุบัน จะเป็นค่าลบ", - "-1565344891": "ฉันสามารถเรียกใช้ Deriv Bot บนหลายๆ แท็บในเว็บเบราว์เซอร์ของฉันได้หรือไม่?", - "-90192474": "ใช่ คุณสามารถทำได้ แต่จะมีข้อจำกัดบางอย่างในบัญชีของคุณ เช่น จำนวนตำแหน่งการค้าที่เปิดได้สูงสุด และการจ่ายเงินรวมสูงสุดสำหรับตำแหน่งการค้าที่เปิดอยู่ ดังนั้นคุณเพียงต้องตระหนักถึงข้อจำกัดเหล่านี้ไว้ในใจเมื่อเปิดหลายตำแหน่งการค้าไว้ คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับข้อจำกัดเหล่านี้ได้ที่ การตั้งค่า > ขีดจำกัดของบัญชี", - "-213872712": "ไม่ เราไม่นำเสนอคริปโตเคอร์เรนซี่บน Deriv Bot", - "-2147346223": "Deriv Bot มีให้บริการในประเทศใดบ้าง?", - "-352345777": "กลยุทธ์ที่นิยมมากที่สุดสำหรับการซื้อขายอัตโนมัติคืออะไร?", - "-552392096": "สามกลยุทธ์ที่ใช้กันมากที่สุดในการซื้อขายแบบอัตโนมัติคือ กลยุทธ์มาติงเกล (Martingale) กลยุทธ์ดาล็องแบร์ (D'Alembert) และกลยุทธ์ออสการ์ กรินด์ (Oscar's Grind) ซึ่งคุณจะเจอสามกลยุทธ์รอคุณอยู่แล้วใน Deriv Bot", "-418247251": "ดาวน์โหลดบันทึกรายละเอียดการเทรดของคุณ", "-2123571162": "ดาวน์โหลด", "-870004399": "<0>ซื้อ: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "บัญชีถูกปิดใช้งาน", "-1837059346": "ซื้อ / ขาย", "-1845037007": "หน้าเพจผู้ลงโฆษณา", - "-494667560": "คำสั่งซื้อขาย", - "-679691613": "โฆษณาของฉัน", "-821418875": "เทรดเดอร์", "-679102561": "รายละเอียดสัญญา", "-430118939": "นโยบายการร้องเรียน", @@ -3082,7 +3155,6 @@ "-430041639": "หลักฐานแสดงที่อยู่ของคุณไม่ผ่านการตรวจสอบยืนยันของเรา และเราได้ตั้งข้อจำกัดบางอย่างให้กับบัญชีของคุณ ดังนั้นกรุณาส่งหลักฐานแสดงที่อยู่ของคุณอีกครั้ง", "-87177461": "โปรดไปที่การตั้งค่าบัญชีของคุณและกรอกรายละเอียดส่วนบุคคลของคุณเพื่อเปิดใช้งานการฝากเงิน", "-904632610": "รีเซ็ตยอดเงินคงเหลือของคุณ", - "-470018967": "รีเซ็ตยอดเงินคงเหลือ", "-156611181": "โปรดทำการประเมินทางการเงินให้เสร็จสิ้นในการตั้งค่าบัญชีของคุณเพื่อปลดล็อก", "-1925176811": "ไม่สามารถดำเนินการถอนได้ในขณะนี้", "-980696193": "การถอนเงินจะไม่สามารถใช้ได้ชั่วคราวเนื่องจากมีการบำรุงรักษาระบบ คุณสามารถถอนเงินได้เมื่อการบำรุงรักษาเสร็จสิ้น", @@ -3107,12 +3179,12 @@ "-577279362": "กรุณาส่งหลักฐานยืนยันตัวตนของคุณเพื่อยืนยันบัญชีของคุณและดำเนินการซื้อขายต่อไป", "-197134911": "หลักฐานยืนยันตัวตนของคุณหมดอายุแล้ว", "-152823394": "หลักฐานยืนยันตัวตนของคุณหมดอายุแล้ว กรุณาส่งหลักฐานยืนยันตัวตนใหม่เพื่อยืนยันบัญชีของคุณและดำเนินการซื้อขายต่อไป", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "ปฏิบัติตามคำแนะนำง่ายๆ เหล่านี้เพื่อทำการแก้ไข", "-2142540205": "ดูเหมือนว่าที่อยู่ในเอกสารของคุณไม่ตรงกับที่อยู่ในโปรไฟล์ Deriv ของคุณ โปรดอัปเดตรายละเอียดส่วนตัวของคุณตอนนี้กับที่อยู่ที่ถูกต้อง", "-482715448": "ไปที่รายละเอียดส่วนบุคคล", "-2072411961": "หลักฐานแสดงที่อยู่ของคุณได้รับการยืนยันแล้ว", "-384887227": "อัปเดตที่อยู่ในโปรไฟล์ของคุณ", - "-448961363": "นอกสหภาพยุโรป", "-1998049070": "หากคุณยอมรับการใช้งานคุกกี้ของเราให้คลิกที่ยอมรับ สำหรับข้อมูลเพิ่มเติม <0>ดูนโยบายของเรา", "-402093392": "เพิ่มบัญชี Deriv", "-1721181859": "คุณจะต้องมีบัญชี {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "เต็มหน้าจอ", "-1823504435": "ดูการแจ้งเตือน", "-1954045170": "ไม่ได้กำหนดสกุลเงิน", - "-583559763": "เมนู", "-1591792668": "วงเงินในบัญชี", "-34495732": "ข้อมูลเกี่ยวกับกฎระเบียบ", "-1496158755": "ไปที่ Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "คณะกรรมการทางการเงินยอมรับการอุทธรณ์ภายในเวลา 45 วันหลังจากวันที่เกิดเหตุการณ์ และต่อเมื่อภายหลังจากที่เทรดเดอร์ได้พยายามแก้ไขปัญหากับบริษัทโดยตรงแล้วเท่านั้น", "-1825471709": "ประสบการณ์แปลกใหม่ในการซื้อขายบนแพลตฟอร์มที่มีประสิทธิภาพสูงแต่ก็ยังใช้งานได้ง่าย", "-981017278": "ทำการซื้อขายอัตโนมัติเพียงปลายนิ้วสัมผัส โดยไม่ต้องเขียนชุดคำสั่งเอง", + "-583559763": "เมนู", "-778309978": "ลิงก์ที่คุณคลิกได้หมดอายุแล้ว โปรดตรวจดูให้แน่ใจว่าได้คลิกลิงก์ในอีเมล์อันล่าสุดในกล่องจดหมายของคุณหรือป้อนอีเมล์ของคุณที่ด้านล่างและคลิก <0>ส่งอีเมล์อีกครั้ง เพื่อขอลิงก์อันใหม่", "-336222114": "ปฏิบัติตามขั้นตอนง่ายๆ เหล่านี้เพื่อทำการแก้ไข:", "-1064116456": "ค้นหาโบรกเกอร์ <0>Deriv Holdings (Guernsey) Limited แล้วกดเลือกบริษัทนั้น", @@ -3415,22 +3487,6 @@ "-1282933308": "ไม่ใช่ {{barrier}}", "-968190634": "ให้เท่ากัน {{barrier}}", "-1747377543": "น้อยกว่า {{barrier}}", - "-256210543": "ไม่สามารถทำการซื้อขายได้ในขณะนี้", - "-1150099396": "เรากำลังดำเนินการเพื่อให้คุณใช้งานสิ่งนี้ได้เร็วๆ นี้ หากคุณมีบัญชีอื่นให้เปลี่ยนเป็นบัญชีนั้นเพื่อดำเนินการซื้อขายต่อไป คุณสามารถเพิ่มบัญชี Deriv MT5 Financial", - "-28115241": "{{platform_name_trader}} ไม่พร้อมใช้งานสำหรับบัญชีนี้", - "-453920758": "ไปที่หน้ากระดานของ {{platform_name_mt5}}", - "-402175529": "ประวัติ", - "-902712434": "การยกเลิกดีลข้อตกลง", - "-988484646": "การยกเลิกข้อตกลง (ดำเนินการแล้ว)", - "-444882676": "การยกเลิกดีลข้อตกลง (ใช้งานอยู่)", - "-13423018": "หมายเลขอ้างอิง", - "-2035315547": "เส้นระดับราคาเป้าหมายอันล่าง", - "-1551639437": "ไม่มีประวัติ", - "-1214703885": "คุณยังไม่ได้อัพเดตตัวปิดเทรดเอากำไรหรือตัวหยุดการขาดทุน", - "-504849554": "จะเปิดอีกครั้งเมื่อ", - "-59803288": "ในระหว่างนี้ มาลองใช้ดัชนีสังเคราะห์ของเราซึ่งจำลองความผันผวนของตลาดจริงและเปิดให้บริการตลอด 24 ชั่วโมงทุกวัน", - "-1278109940": "ดูตลาดที่เปิด", - "-694105443": "ตลาดนี้ปิดแล้ว", "-1043795232": "ตำแหน่งล่าสุด", "-1511825574": "กำไร/ขาดทุน:", "-726626679": "กำไร/ขาดทุนที่ถูกประมาณการ:", @@ -3455,21 +3511,15 @@ "-1435392215": "เกี่ยวกับการยกเลิกดีลข้อตกลง", "-2017825013": "รับทราบ", "-1192773792": "ไม่ต้องแสดงข้อความนี้อีก", + "-902712434": "การยกเลิกดีลข้อตกลง", "-1280319153": "ยกเลิกการซื้อขายของคุณได้ตลอดเวลาภายในกรอบเวลาที่เลือกไว้ โดยระบบจะทำงานอัตโนมัติหากการซื้อขายของคุณถึงระดับจุดยุติการซื้อขายหรือ stop out ภายในกรอบเวลาที่เลือกไว้", "-471757681": "การบริหารความเสี่ยง", "-843831637": "ตัวหยุดการขาดทุน", "-771725194": "การยกเลิกดีลข้อตกลง", "-338707425": "ระยะเวลาขั้นต่ำคือ 1 วัน", "-1003473648": "ระยะเวลา: {{duration}} วัน", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "เงินผลตอบแทน ณ เวลาหมดอายุนั้นจะเท่ากับการเอาเงินได้ต่อจุดพอยท์มาคูณด้วยส่วนต่างระหว่างราคาสุดท้ายและราคาใช้สิทธิ", "-1527492178": "ล็อกการซื้อ", "-725375562": "คุณสามารถล็อก/ปลดล็อกปุ่มซื้อได้จากเมนูการตั้งค่า", - "-774638412": "เงินทุนทรัพย์ต้องอยู่ระหว่าง {{min_stake}} {{currency}} และ {{max_stake}} {{currency}}", - "-1358367903": "ทุนทรัพย์", - "-434270664": "ราคาปัจจุบัน", - "-1956787775": "ราคาเส้นระดับเป้าหมาย:", - "-1513281069": "เส้นระดับราคาเป้าหมาย 2", "-390994177": "ควรอยู่ระหว่าง {{min}} ถึง {{max}}", "-1804019534": "เวลาหมดอายุ: {{date}}", "-2055106024": "สลับระหว่างการตั้งค่าระยะเวลาขั้นสูงและการตั้งค่าระยะเวลาแบบง่าย", @@ -3484,6 +3534,7 @@ "-1763848396": "Put", "-194424366": "ด้านบน", "-857660728": "ราคาใช้สิทธิ", + "-1358367903": "ทุนทรัพย์", "-1386326276": "โปรดระบุค่าเส้นระดับราคาเป้าหมายในช่อง", "-1418742026": "เส้นระดับราคาเป้าหมายอันบนต้องมีค่าสูงกว่าเส้นระดับราคาอันล่าง", "-92007689": "เส้นระดับราคาเป้าหมายอันล่างต้องมีค่าต่ำกว่าเส้นระดับราคาอันบน", @@ -3491,6 +3542,21 @@ "-1975910372": "นาทีต้องอยู่ระหว่าง 0 ถึง 59", "-866277689": "เวลาหมดอายุไม่สามารถเป็นช่วงเวลาในอดีตได้", "-1455298001": "ขณะนี้", + "-256210543": "ไม่สามารถทำการซื้อขายได้ในขณะนี้", + "-1150099396": "เรากำลังดำเนินการเพื่อให้คุณใช้งานสิ่งนี้ได้เร็วๆ นี้ หากคุณมีบัญชีอื่นให้เปลี่ยนเป็นบัญชีนั้นเพื่อดำเนินการซื้อขายต่อไป คุณสามารถเพิ่มบัญชี Deriv MT5 Financial", + "-28115241": "{{platform_name_trader}} ไม่พร้อมใช้งานสำหรับบัญชีนี้", + "-453920758": "ไปที่หน้ากระดานของ {{platform_name_mt5}}", + "-402175529": "ประวัติ", + "-988484646": "การยกเลิกข้อตกลง (ดำเนินการแล้ว)", + "-444882676": "การยกเลิกดีลข้อตกลง (ใช้งานอยู่)", + "-13423018": "หมายเลขอ้างอิง", + "-2035315547": "เส้นระดับราคาเป้าหมายอันล่าง", + "-1551639437": "ไม่มีประวัติ", + "-1214703885": "คุณยังไม่ได้อัพเดตตัวปิดเทรดเอากำไรหรือตัวหยุดการขาดทุน", + "-504849554": "จะเปิดอีกครั้งเมื่อ", + "-59803288": "ในระหว่างนี้ มาลองใช้ดัชนีสังเคราะห์ของเราซึ่งจำลองความผันผวนของตลาดจริงและเปิดให้บริการตลอด 24 ชั่วโมงทุกวัน", + "-1278109940": "ดูตลาดที่เปิด", + "-694105443": "ตลาดนี้ปิดแล้ว", "-439389714": "เรากำลังดำเนินการอยู่", "-770929448": "ไปที่ {{platform_name_smarttrader}}", "-347156282": "โปรดส่งหลักฐาน", @@ -3537,6 +3603,8 @@ "-454245976": "หากคุณคิดว่าราคาตลาดจะลดลงอย่างต่อเนื่องในช่วงเวลาหนึ่งๆ ให้เลือก <0>ขาย คุณจะได้รับเงินผลตอบแทนเมื่อสัญญาหมดอายุถ้าราคาตลาดไม่แตะหรือข้ามไปอยู่สูงกว่าเส้นระดับราคาเป้าหมาย เงินผลตอบแทนของคุณจะเติบโตตามสัดส่วนไปตามระยะห่างระหว่างราคาตลาดและเส้นระดับราคาเป้าหมายตราบที่เส้นนั้นไม่ถูกฝ่าออกไป ทั้งนี้คุณจะเริ่มทำกำไรเมื่อเงินผลตอบแทนมีจำนวนสูงกว่าเงินทุนทรัพย์ที่ลงไปของคุณ แต่ถ้าราคาตลาดฝ่าเส้นระดับราคาเป้าหมายก็จะไม่มีเงินผลตอบแทน", "-351875097": "จำนวนจุด Tick", "-729830082": "ดูน้อยลง", + "-1669741470": "เงินผลตอบแทน ณ เวลาหมดอายุนั้นจะเท่ากับการเอาเงินได้ต่อจุดพอยท์มาคูณด้วยส่วนต่างระหว่างราคาสุดท้ายและราคาใช้สิทธิ", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "ใหม่!", "-993480898": "แอกคิวมูเลเตอร์", "-45873457": "ใหม่", @@ -3553,10 +3621,14 @@ "-127118348": "เลือก {{contract_type}}", "-543478618": "ลองตรวจสอบการสะกดของคุณหรือใช้คำอื่น", "-700280380": "ค่าธรรมเนียมการยกเลิกดีลข้อตกลง", - "-542594338": "ยอดเงินที่ได้รับสูงสุด", + "-542594338": "เงินผลตอบแทนขั้นสูงสุด", "-690963898": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติหากว่าจำนวนเงินผลตอบแทนของคุณได้มาถึงจำนวนนี้", "-511541916": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติเมื่อถึงจำนวนจุด Tick นี้", "-438655760": "<0>หมายเหตุ: คุณสามารถปิดการซื้อขายของคุณได้ตลอดเวลา โปรดตระหนักถึงความเสี่ยงการคลาดเคลื่อนราคา", + "-774638412": "เงินทุนทรัพย์ต้องอยู่ระหว่าง {{min_stake}} {{currency}} และ {{max_stake}} {{currency}}", + "-434270664": "ราคาปัจจุบัน", + "-1956787775": "ราคาเส้นระดับเป้าหมาย:", + "-1513281069": "เส้นระดับราคาเป้าหมาย 2", "-1683683754": "ซื้อ", "-1046859144": "<0>{{title}} คุณจะได้รับเงินผลตอบแทนถ้าราคาตลาดอยู่ที่ {{price_position}} และไม่แตะหรือข้ามเส้นระดับราคาเป้าหมาย มิฉะนั้นเงินผลตอบแทนของคุณจะเป็นศูนย์", "-1815023694": "อยู่เหนือกว่าเส้นระดับราคาเป้าหมาย", diff --git a/packages/translations/src/translations/tr.json b/packages/translations/src/translations/tr.json index bfdf6b3dda21..ede78efd943a 100644 --- a/packages/translations/src/translations/tr.json +++ b/packages/translations/src/translations/tr.json @@ -8,7 +8,7 @@ "3420069": "Gecikmeleri önlemek için, <0>adınızı ve <0>doğum tarihinizi tam olarak kimlik belgenizde göründüğü gibi girin.", "7100308": "Saat 0 ile 23 arasında olmalıdır.", "9488203": "Deriv Bot, dijital opsiyon ticareti için web tabanlı bir strateji oluşturucudur. Sürükle ve bırak 'bloklarını' kullanarak kendi otomatik ticaret botunuzu oluşturabileceğiniz bir platformdur.", - "11539750": "{{ variable }} değişkenini Göreli Kuvvet Endeks Dizisi {{ dummy }} olarak ayarlayın", + "11539750": "{{ variable }} ögesini Göreli Kuvvet Endeks Dizisi {{ dummy }} olarak ayarlayın", "11872052": "Evet, daha sonra tekrar geleceğim", "14365404": "{{ message_type }} için istek başarısız: {{ delay }} saniye içinde yeniden deniyor", "15377251": "Kâr tutarı: {{profit}}", @@ -24,7 +24,6 @@ "27731356": "Hesabınız geçici olarak devre dışı bırakıldı. Para yatırma ve çekme işlemlerini tekrar etkinleştirmek için lütfen <0>canlı sohbet yoluyla bizimle iletişime geçin.", "27830635": "Deriv (V) Ltd", "28581045": "Gerçek bir MT5 hesabı ekleyin", - "30801950": "Hesabınız, Malta Oyun Otoritesi tarafından düzenlenen {{legal_entity_name}} ile açılacak ve Malta yasalarına tabi olacaktır.", "33433576": "Lütfen paranızı çekmek için bir e-cüzdan kullanın.", "35089987": "Ehliyetinizin ön ve arka tarafını yükleyin.", "41737927": "Teşekkür ederim", @@ -60,11 +59,13 @@ "72500774": "Lütfen Vergi İkametgahı girin.", "73086872": "Ticaretten kendini kendinizi dışladınız", "73326375": "Alt, piyasanın sözleşme dilimi süresince ulaştığı en düşük noktadır.", + "74836780": "{{currency_code}} Wallet", "74963864": "Altında", "76916358": "Para çekme sınırına ulaştınız. <0/>Para çekme işleminize devam etmek ve sınırı yükseltmek için lütfen kimlik kanıtınızı ve adresinizi yükleyin.", "76925355": "Botunuzun performansını kontrol edin", "77945356": "Mobil uygulamamızla hareket halindeyken ticaret yapın.", "77982950": "Vanilya opsiyonlar, bir \"Call\" veya \"Put\" satın alarak dayanak varlığın yukarı (bullish) veya aşağı (bearish) yönünü tahmin etmenizi sağlar.", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Bu sayfayı bulamadık", "82839270": "Pasaportunuzun fotoğrafınızı içeren sayfasını yükleyin.", "83202647": "Bloğu Daralt", @@ -76,6 +77,7 @@ "90266322": "2. Yeni oluşturulan Telegram botunuzla bir sohbet başlatın ve bir sonraki adıma geçmeden önce bazı mesajları gönderdiğinizden emin olun. (örn. Merhaba Bot!)", "91993812": "Martingale Stratejisi, 18. yüzyılda Fransız Mathematikçi Paul Pierre Levy tarafından yaygınlaştırılmış, yüz yıldan fazla bir süredir kullanılan klasik bir ticaret tekniğidir.", "93154671": "1. İstatistik panelinin altında Sıfırla ögesine tıklayın.", + "93939827": "Cryptocurrency accounts", "96381225": "Kimlik doğrulaması başarısız oldu", "98473502": "Uygunluk testi yapmak veya size herhangi bir risk uyarısı sağlama yükümlülüğümüz yoktur.", "98972777": "rastgele madde", @@ -83,6 +85,7 @@ "102226908": "Alan boş bırakılamaz", "108916570": "Süre: {{duration}} gün", "109073671": "Lütfen daha önce para yatırmak için kullandığınız bir e-cüzdan kullanın. E-cüzdanın para çekme işlemini desteklediğinden emin olun. Para çekme işlemlerini destekleyen e-cüzdanların listesini <0>burada bulabilirsiniz.", + "110822969": "One Wallet for all your transactions", "111215238": "Direkt ışıktan uzaklaşın", "111718006": "Bitiş tarihi", "111931529": "7 gün boyunca maksimum toplam bahis", @@ -109,7 +112,7 @@ "133536621": "ve", "133655768": "Not: Bot Oluşturucu hakkında daha fazla bilgi edinmek isterseniz, <0>Öğreticiler sekmesine geçebilirsiniz.", "139454343": "Limitlerimi onayla", - "141265840": "Funds transfer information", + "141265840": "Fon transferi bilgileri", "141626595": "Cihazınızda çalışan bir kamera olduğundan emin olun", "142050447": "metin oluşturmak için aşağıdakiler ile {{ variable }} öğesini ayarlayın", "142390699": "Cep telefonunuza bağlanıldı", @@ -144,7 +147,7 @@ "176319758": "30 gün süresince maksimum toplam bahis", "176327749": "- Android: Hesaba tıklayın, <0>Seçenekler ögesini açın ve <0>Sil seçeneğine tıklayın.", "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.", + "177099483": "Adres doğrulama işleminiz beklemede ve hesabınıza bazı kısıtlamalar getirdik. Adresiniz doğrulandığında kısıtlamalar kaldırılacaktır.", "178413314": "İlk isim 2 ile 50 karakter arasında olmalıdır.", "179083332": "Tarih", "179737767": "Eski opsiyon ticaret platformumuz.", @@ -163,7 +166,7 @@ "197190401": "Son kullanma tarihi", "201091938": "30 gün", "203108063": "Tebrikler, {{category}} <0>{{platform}} <1>{{type}} hesabınızı başarıyla oluşturdunuz. ", - "203179929": "<0>You can open this account once your submitted documents have been verified.", + "203179929": "<0>Gönderdiğiniz belgeler doğrulandıktan sonra bu hesabı açabilirsiniz.", "203271702": "Tekrar deneyin", "203297887": "Az önce oluşturduğunuz Hızlı Strateji çalışma alanına yüklenecektir.", "203924654": "Başlamak için <0>Başlat düğmesine basın ve öğreticiyi takip edin.", @@ -171,7 +174,7 @@ "204863103": "Çıkış zamanı", "206010672": "{{ delete_count }} Bloklarını Sil", "207824122": "Lütfen aşağıdaki Deriv hesap(lar)ından fonlarınızı çekin:", - "209533725": "You’ve transferred {{amount}} {{currency}}", + "209533725": "{{amount}} {{currency}} transfer ettiniz", "210385770": "Aktif bir hesabınız varsa devam etmek için lütfen oturum açın. Aksi takdirde, lütfen kaydolun.", "211224838": "Yatırım", "211461880": "Genel adlar ve soyadları tahmin etmek kolaydır", @@ -215,7 +218,9 @@ "251882697": "Teşekkür ederim! Cevabınız sistemimize kaydedildi. <0/><0/>Devam etmek için lütfen 'Tamam' düğmesine tıklayın.", "254912581": "Bu blok EMA'ya benziyor, ancak size giriş listesine ve verilen süreye göre tüm EMA hattını verir.", "256031314": "Nakit ticareti", + "256123827": "What happens to my trading accounts", "256602726": "Hesabınızı kapatırsanız:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Ticaret değerlendirmesi", "260069181": "URL yüklenmeye çalışılırken bir hata oluştu", @@ -250,8 +255,8 @@ "284527272": "antimode", "284772879": "Sözleşme", "284809500": "Finansal Demo", + "285909860": "Demo {{currency}} Wallet", "287934290": "Bu işlemi iptal etmek istediğinizden emin misiniz?", - "289898640": "KULLANIM KOŞULLARI", "291744889": "<0>1. Ticaret parametreleri: <0>", "291817757": "Deriv topluluğumuza gidin ve API'ler, API belirteçleri, Deriv API'lerini kullanma yolları ve daha fazlası hakkında bilgi edinin.", "292491635": "“Zarar Durdur”u seçerseniz ve kaybınızı sınırlamak için bir miktar belirtirseniz, kaybınız bu miktardan fazla veya bu miktara eşit olduğunda pozisyonunuz otomatik olarak kapatılır. Kaybınız, kapanıştaki piyasa fiyatına bağlı olarak girdiğiniz tutardan fazla olabilir.", @@ -286,7 +291,7 @@ "333121115": "Deriv MT5'in hesap türünü seçin", "333456603": "Para çekme limitleri", "333807745": "Kaldırmak istediğiniz bloğa tıklayın ve klavyenizde Sil tuşuna basın.", - "334680754": "Switch to your real account to create a Deriv MT5 account", + "334680754": "Deriv MT5 hesabı oluşturmak için gerçek hesabınıza geçin", "334942497": "Satın alma zamanı", "335040248": "Hakkımızda", "337023006": "Başlangıç saati geçmişte olamaz.", @@ -299,6 +304,7 @@ "344418897": "Bu işlem limitleri ve kendini-dışlama {{brand_website_name}} üzerinde harcadığınız para ve zamanın miktarını kontrol etmenize ve <0>sorumlu ticaret uygulamanıza yardımcı olur.", "345320063": "Geçersiz zaman bilgisi", "345818851": "Üzgünüz, dahili bir hata oluştu. Tekrar denemek için yukarıdaki onay kutusuna basın.", + "346214602": "A better way to manage your funds", "347029309": "Forex: standart/mikro", "347039138": "Yineleme (2)", "347217485": "Cep telefonunuzdan Deriv MT5'e erişimde sorun mu yaşıyorsunuz?", @@ -353,6 +359,7 @@ "401345454": "Bunu yapmak için Öğreticiler sekmesine gidin.", "402343402": "Sunucumuzdaki bir sorun nedeniyle bazı {{platform}} hesaplarınız şu anda kullanılamıyor. Lütfen bizimle kalın ve sabrınız için teşekkür ederiz.", "403456289": "SMA için formül:", + "403608958": "Select a trading account or a Wallet", "404743411": "Toplam mevduat", "406359555": "Sözleşme detayları", "406497323": "Gerekirse aktif sözleşmenizi satın (isteğe bağlı)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Her rapor arasında tercih ettiğiniz zaman aralığı:", "431267979": "İşte Deriv Bot'u hareket halindeyken nasıl kullanacağınıza dair hızlı bir kılavuz.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Kar Al: {{ currency }} {{ take_profit }}", "432519573": "Belge yüklendi", @@ -453,12 +461,12 @@ "518955798": "7. Başlangıçta bir kez çalıştır", "520136698": "Boom 500 Endeksi", "521872670": "öge", - "522283618": "Dijital opsiyon ticareti deneyimi", "522703281": "ile bölünebilen", "523123321": "- Belirli bir sayının gücüne 10", "524459540": "Değişkenleri nasıl oluşturabilirim?", "527329988": "Bu top-100 ortak parolasıdır", "529056539": "Opsiyonlar", + "530864956": "Deriv Apps", "530953413": "Yetkili uygulamalar", "531114081": "3. Sözleşme Türü", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, hisse senetleri, hisse senedi endeksleri, kripto para birimleri, sentetik endeksler", "545476424": "Toplam para çekme işlemleri", "549479175": "Deriv Çarpanları", + "549799607": "Go to LiveChat", "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.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "İşlem limitleri hakkında daha fazla bilgi edinin", "554135844": "Düzenle", "554410233": "Bu bir top-10 ortak parolasıdır", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "Ticari parametreleri ve ticaret seçeneklerini tanımladıktan sonra, belirli koşullar karşılandığında botunuza sözleşmeleri satın almasını söylemek isteyebilirsiniz. Bunu yapmak için botunuzun karar vermesine yardımcı olmak için koşullu blokları ve gösterge bloklarını kullanabilirsiniz.", "555881991": "Ulusal Kimlik Numarası Fişi", "556264438": "Zaman aralığı", @@ -552,17 +563,17 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.herhangi bir anlaşma fırsatı bulunamazsa, şikayet DRC tarafından ele alınmak üzere karar aşamasına geçecektir.", "639382772": "Lütfen desteklenen dosya türünü yükleyin.", "640596349": "Henüz herhangi bir bildirim almadınız", "640730141": "Kimlik doğrulama işlemini yeniden başlatmak için bu sayfayı yenileyin", "641420532": "Size bir e-posta gönderdik", "642210189": "İşlemi tamamlamak için lütfen doğrulama bağlantısı ile ilgili e-postanızı kontrol edin.", - "642393128": "Enter amount", + "642393128": "Tutar girin", "642546661": "Ehliyetinizin arkasını bilgisayarınızdan yükleyin", "642995056": "Email", "644150241": "İstatistiklerinizi en son temizledikten sonra kazandığınız sözleşme sayısı.", - "645016681": "Diğer finansal araçlarda alım satım sıklığı", "645902266": "EUR/NZD", "647039329": "Adres kanıtı gerekli", "647745382": "Giriş Listesi {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "Aşağıdaki örnekte, açılış fiyatı seçilir ve daha sonra \"op\" adlı bir değişkene atanır.", "666724936": "Lütfen geçerli bir kimlik numarası girin.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Yetki alanı ve hukuk seçimi", "674973192": "Masaüstü, web ve mobil uygulamalarda Deriv MT5 hesaplarınıza giriş yapmak için bu şifreyi kullanın.", "676159329": "Varsayılan hesaba geçmedi.", @@ -613,6 +625,7 @@ "692354762": "Lütfen {{document_name}} bilginizi giriniz. {{example_format}}", "693396140": "Anlaşma iptali (süresi dolmuş)", "694035561": "Ticaret opsiyon çarpanları", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- Açılma süresi: Açılış saati damgası", "697630556": "Bu piyasa şu anda kapalı.", "698037001": "Ulusal Kimlik Numarası", @@ -624,12 +637,12 @@ "701647434": "Dize ara", "702451070": "Ulusal Kimlik (Fotoğraf Yok)", "702561961": "Temayı değiştir", + "705262734": "Your Wallets are ready", "705299518": "Ardından, pasaportunuzun fotoğrafınızı içeren sayfasını yükleyin.", - "706413212": "Kasiyere erişmek için artık {{regulation}} {{currency}} ({{loginid}}) hesabınızdasın.", "706727320": "Binary seçenekleri işlem frekansı", "706755289": "Bu blok, trigonometrik işlevler gerçekleştirir.", "706960383": "Sözleşmenizi vadesinden önce satmayı tercih etmeniz halinde bu fiyattan satın almayı teklif edeceğiz. Bu, mevcut spot fiyat, süre vb. gibi çeşitli faktörlere dayanmaktadır. Ancak, kalan süre 60 saniyenin altındaysa bir sözleşme değeri teklif etmeyeceğiz.", - "707662672": "{{unblock_date}} at {{unblock_time}}", + "707662672": "{{unblock_date}} tarihi saat {{unblock_time}}'de", "708055868": "Ehliyet numarası", "710123510": "{{ while_or_until }} {{ boolean }} işlemini tekrarlayın", "711999057": "Başarılı", @@ -644,6 +657,7 @@ "720293140": "Oturumu kapat", "720519019": "Parolamı sıfırla", "721011817": "- İlk sayıyı ikinci sayının gücüne yükseltin", + "722797282": "EU-regulated USD accounts", "723045653": "Bu e-posta adresi ile Deriv hesabınızda oturum açaçaksınız.", "723961296": "Şifreyi yönet", "724203548": "Şikayetinizi <0>Avrupa Komisyonu'nun Online Anlaşmazlık Çözümü (ODR) platformuna gönderebilirsiniz. Bu, Birleşik Krallık müşterileri için geçerli değildir.", @@ -656,6 +670,7 @@ "734390964": "Yetersiz bakiye", "734881840": "yanlış", "742469109": "Bakiyeyi sıfırla", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Forex, türetilmiş endeksler, kripto para birimleri ve yüksek kaldıraçlı emtialar üzerinde CFD ticareti yapın.", "743623600": "Referans", "744110277": "Bollinger Bands Array (BBA)", @@ -689,6 +704,7 @@ "775706054": "Ticaret botları satıyor musunuz?", "776085955": "Stratejiler", "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "Son yıllardan kaçının", "784311461": "Üssel Hareketli Ortalama (EMA)", "784583814": "Bilgisayarınıza bağlı", @@ -725,6 +741,7 @@ "818447476": "Hesap değişsin mi?", "820877027": "Lütfen kimlik kanıtınızı doğrulayın", "821163626": "Sunucu bakımı her ayın ilk Cumartesi günü GMT saatiyle 7 ila 10 arasında gerçekleşir. Bu süre zarfında hizmet kesintisi yaşayabilirsiniz.", + "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": "Metin içerebilen bir blok.", "824797920": "Liste boş mu?", "825042307": "Tekrar deneyelim", @@ -747,7 +764,6 @@ "836097457": "Ticaretle ilgileniyorum ama çok az deneyimim var.", "837063385": "Bu adrese başka para birimleri göndermeyin.", "837066896": "Belgeniz inceleniyor, lütfen 1-3 gün sonra tekrar kontrol edin.", - "839618971": "ADRES", "839805709": "Sizi sorunsuz bir şekilde doğrulamak için daha iyi bir fotoğrafa ihtiyacımız var", "840672750": "Bu işe yaramazsa, MT5 uygulamasını kaldırın ve yeniden yükleyin. Ardından <0>2. ve <0>3. adımları tekrarlayın.", "841434703": "Yığını devre dışı bırak", @@ -812,7 +828,7 @@ "905134118": "Ödeme:", "905227556": "Güçlü parolalar en az 8 karakter içerir, büyük ve küçük harfleri ve sayıları bir araya getirir.", "905564365": "MT5 CFD'ler", - "906049814": "We’ll review your documents and notify you of its status within 5 minutes.", + "906049814": "Belgelerinizi inceleyeceğiz ve durumunu 5 dakika içinde size bildireceğiz.", "907680782": "Sahiplik doğrulaması kanıtı başarısız oldu", "909272635": "Finansal - SVG", "910888293": "Çok fazla deneme", @@ -838,15 +854,15 @@ "937682366": "Kimliğinizi kanıtlamak için bu belgelerin her ikisini de yükleyin.", "937831119": "Soyadı*", "937992258": "Tablo", - "938500877": "{{ text }}. <0>You can view the summary of this transaction in your email.", + "938500877": "{{ text }}. <0>Bu işlemin özetini e-postanızda görüntüleyebilirsiniz.", "938947787": "Para Çekme {{currency}}", "938988777": "Yüksek bariyer", "943535887": "Lütfen aşağıdaki Deriv MT5 hesap(lar)ındaki pozisyonlarınızı kapatın:", "944499219": "Maks. açık pozisyonlar", "945532698": "Sözleşme satıldı", + "945753712": "Back to Trader’s Hub", "946204249": "Oku", "946841802": "Beyaz (veya yeşil) bir mum, açılış fiyatının kapanış fiyatından düşük olduğunu gösterir. Bu, piyasa fiyatının yukarı yönlü bir hareketini temsil eder.", - "946944859": "Aşağıdaki düğmeye basın ve size bir bağlantı içeren bir e-posta göndereceğiz. Para çekme talebinizi doğrulamak için bu bağlantıyı tıklayın.", "947046137": "Para çekme işleminiz 24 saat içinde işleme alınacaktır", "947363256": "Liste oluştur", "947758334": "Şehir gereklidir", @@ -888,7 +904,7 @@ "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", - "997276809": "I confirm that the name and date of birth above match my chosen identity document", + "997276809": "Yukarıdaki isim ve doğum tarihinin seçtiğim kimlik belgesiyle eşleştiğini onaylıyorum", "999008199": "metin", "1001160515": "Sat", "1001749987": "Hesap bakiyeniz durdurma seviyesine yakın düşerse, bir uyarı alırsınız, adlandırılmış marj çağrısı.", @@ -950,6 +966,7 @@ "1050128247": "I confirm that I have verified the payment agent’s transfer information.", "1050844889": "Raporlar", "1052779010": "Demo hesabınızdasınız", + "1052921318": "{{currency}} Wallet", "1053153674": "Jump 50 Endeksi", "1053159279": "Eğitim seviyesi", "1053556481": "Şikayetinizi gönderdikten sonra, aldığımızı onaylamak için size bir onay e-postası göndereceğiz.", @@ -1010,6 +1027,7 @@ "1110102997": "Açıklama", "1112582372": "Aralık süresi", "1113119682": "Bu blok, bir mum listesinden seçilen mum değerini verir.", + "1113221217": "MT5 Swap-free", "1113292761": "8 Mb'den az", "1114679006": "Botunuzu basit bir strateji kullanarak başarıyla oluşturdunuz.", "1117281935": "Satış koşulları (isteğe bağlı)", @@ -1036,6 +1054,7 @@ "1134879544": "Parlama olan bir belge örneği", "1138126442": "Forex: standart", "1139483178": "Desteyi etkinleştir", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Yön {{ direction_type }}", "1144028300": "Göreceli Güç Endeks Dizisi (RSI)", "1145927365": "Belirli bir saniye sonra blokları içeride çalıştır", @@ -1063,10 +1082,9 @@ "1171961126": "ticari parametreler", "1172524677": "CFD Demosu", "1174542625": "- Cevapta sohbet kimliği özelliğini bulun ve kimlik özelliğinin değerini kopyalayın", - "1174689133": "3. Set your trade parameters and hit Run.", + "1174689133": "3. İşlem parametrelerinizi ayarlayın ve Rundüğmesine basın.", "1174748431": "Ödeme kanalı", "1175183064": "Vanuatu", - "1176926166": "Diğer finansal araçlarla ilgili deneyim", "1177396776": "\"Asian Fall\"ı seçerseniz son tik, tiklerin ortalamasından düşükse ödemeyi kazanırsınız.", "1177723589": "Görüntülenecek işlem yok", "1178582280": "İstatistiklerinizi en son temizledikten sonra kaybettiğiniz sözleşme sayısı.", @@ -1077,6 +1095,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ı.", + "1183448523": "<0>We're setting up your Wallets", "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", @@ -1094,12 +1113,14 @@ "1201773643": "sayısal", "1203297580": "Bu blok bir Telegram kanalına mesaj gönderir.", "1204223111": "Bu örnekte, mum listesindeki açılış fiyatları \"mum_listesi\" adlı bir değişkene atanır.", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Kartınızı nasıl maskeleyebilirsiniz?", "1206821331": "Silahlı Kuvvetler", "1207152000": "Bir şablon seçin ve işlem parametrelerinizi ayarlayın.", "1208714859": "Kısaca:", "1208729868": "Tikler", "1208903663": "Geçersiz token", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Bot başlıyor", "1214893428": "Hesap oluşturma şu anda mobil için kullanılamıyor. Yeni bir hesap oluşturmak için lütfen bilgisayarınızla oturum açın.", "1216408337": "Serbest çalışan", @@ -1112,6 +1133,7 @@ "1222521778": "Deposit ve para çekme işlemleri yapmak zordur.", "1222544232": "Size bir e-posta gönderdik", "1225150022": "Varlıkların sayısı", + "1226027513": "Transfer from", "1227074958": "rastgele fraksiyon", "1227240509": "Boşlukları kırp", "1228534821": "Bazı para birimleri ülkenizdeki ödeme aracıları tarafından desteklenmeyebilir.", @@ -1121,6 +1143,7 @@ "1232291311": "Kalan maksimum para çekme", "1232353969": "son 12 ayda 0-5 işlem", "1233300532": "Ödeme", + "1233376285": "Options & multipliers", "1234292259": "Zenginlik kaynağı", "1234764730": "Kişisel bilgiler bölümünden adınızın ve e-posta adresinizin ekran görüntüsünü yükleyin.", "1235426525": "%50", @@ -1166,6 +1189,7 @@ "1281045211": "Belirli bir listedeki öğeleri, artan veya azalan sırada sayısal veya alfabetik değerlerine göre sıralar.", "1281290230": "Seç", "1282951921": "Only Downs", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "\"Kayıp\" seçili ise, son işlem başarısız olduğunda \"Doğru\" olarak döner. Aksi takdirde, boş bir dize döndürür.", "1286094280": "Para çek", "1286507651": "Kimlik doğrulama ekranını kapat", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Marjin call", "1290525720": "Örnek: ", - "1291887623": "Dijital opsiyonlar işlem frekansı", "1291997417": "Sözleşmeler, seçtiğiniz vade tarihinde GMT saatiyle tam olarak 23:59:59'da sona erecektir.", "1292188546": "Deriv MT5 yatırımcı şifresini sıfırla", "1292891860": "Telegram'a Bildir", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Sat)", "1329136554": "Jump 200 Endeksi", "1329325646": "Bu bloğun içeriği her tikde çağrılır", + "1330479159": "Ready to upgrade?", "1331199417": "Lütfen doğru formatı girin. ", "1331367811": "Müşteri hesap numarası", "1332168410": "Daha fazla öğrenin", @@ -1257,7 +1281,6 @@ "1367023655": "Kaybınızın bahisinizi aşmamasını sağlamak için, kaybınız <0/> değerine eşitlendiğinde sözleşmeniz otomatik olarak kapatılacaktır.", "1367488817": "4. İşlem koşullarını yeniden başlatın", "1367990698": "Volatilite 10 Endeksi", - "1369709538": "Kullanım Koşullarımız", "1370647009": "Daha yüksek günlük limitlerin tadını çıkarın", "1371193412": "İptal et", "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.", @@ -1283,7 +1306,7 @@ "1393901361": "Bunun için bir uygulama var", "1393903598": "eğer doğruysa {{ return_value }}", "1396179592": "Komisyon", - "1396417530": "Ayı Piyasası Endeksi", + "1396417530": "Bear Piyasası Endeksi", "1397628594": "Yetersiz fon", "1400341216": "Belgelerinizi inceleyeceğiz ve 1 ila 3 gün içinde durumunu size bildireceğiz.", "1400732866": "Kameradan görünüm", @@ -1319,6 +1342,7 @@ "1434767075": "Deriv Bot'u kullanmaya başlayın", "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.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Minimum depozito", "1437396005": "Açıklama ekle", "1438247001": "Profesyonel bir müşteri, aşağıdakiler nedeniyle daha düşük düzeyde müşteri koruması alır.", @@ -1369,6 +1393,7 @@ "1476301886": "SMA'ya benzer şekilde, bu blok size belirli bir dönem için tüm değerlerin listesini içeren tüm SMA satırını verir.", "1478030986": "Ticaret ve para çekme işlemleri için API belirteçleri oluştur veya sil", "1480915523": "Atla", + "1481860194": "Your new Wallet(s)", "1481977420": "Lütfen para çekme isteğinizi doğrulamamıza yardımcı olun.", "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.", @@ -1389,6 +1414,7 @@ "1505420815": "No payment agents found for your search", "1505898522": "Deste indir", "1505927599": "Sunucularımız bir darbe aldı. Devam etmek için yenileyelim.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Satın Al)", "1509678193": "Eğitim", @@ -1419,7 +1445,7 @@ "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ı", + "1548765374": "Belge numarası doğrulaması başarısız oldu", "1549098835": "Çekilen toplam", "1551172020": "AUD Sepeti", "1552162519": "Onboardingi görüntüle", @@ -1449,6 +1475,7 @@ "1577480486": "Mobil bağlantınız bir saat içinde sona erecek", "1577527507": "Hesap açma nedeni gerekli.", "1577612026": "Bir klasör seçin", + "1577879664": "<0>Your Wallets are ready", "1579839386": "Appstore", "1580498808": "Birden çok yüz bulundu", "1584109614": "Tikler Dizesi Listesi", @@ -1502,9 +1529,11 @@ "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.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Bot çalışırken bir hatayla karşılaştı.", "1648938920": "Hollanda 25", "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.", + "1650963565": "Introducing Wallets", "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", @@ -1522,13 +1551,13 @@ "1665272539": "Unutmayın: Seçilen tarihe kadar hesabınızda oturum açamazsınız.", "1665738338": "Bakiye", "1665756261": "Canlı sohbete git", + "1666783057": "Upgrade now", "1668138872": "Hesap ayarlarını değiştir", "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.", "1675030608": "Bu hesabı oluşturmak için önce adres kanıtınızı yeniden göndermeniz gerekiyor.", - "1675289747": "Gerçek hesaba geçildi", "1676549796": "Dinamik Kaldıraç", "1677027187": "Forex", "1677990284": "Uygulamalarım", @@ -1556,6 +1585,7 @@ "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", + "1709293836": "Wallet balance", "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.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "Deriv fiat ve Deriv kripto para hesaplarınız arasındaki transferler için %2 transfer ücreti veya {{minimum_fee}} {{currency}}, hangisi yüksekse, ücret talep edeceğiz.", "1720968545": "Bilgisayarınızdan pasaport fotoğraf sayfası yükleyin", + "1723069433": "Your new Wallet", "1723589564": "Portföyünüzün en fazla bekleyen sözleşme sayısını temsil eder. Portföyünüzün her bir satırı bir açık pozisyon için geçerlidir. Maksimuma ulaşıldığında, mevcut bir konumu kapatmadan yeni pozisyonlar açamayacaksınız.", "1724696797": "Yalnızca bir fiat hesabıyla sınırlısınız.", "1725958461": "Hesap numarası", @@ -1687,10 +1718,10 @@ "1831847842": "Yukarıdaki isim ve doğum tarihinin seçtiğim kimlik belgesine uyduğunu onaylıyorum (aşağıya bakınız)", "1833481689": "Kilidini aç", "1833499833": "Kimlik kanıtı belgelerinin yüklenmesi başarısız oldu", - "1836767074": "Search payment agent name", + "1836767074": "Ödeme aracısı adını ara", "1837762008": "Kasiyere erişmek için lütfen hesap ayarlarınızda hesabınızı doğrulamak üzere kimlik kanıtınızı ve adres kanıtınızı sunun.", "1838639373": "Kaynaklar", - "1839021527": "Please enter a valid account number. Example: CR123456789", + "1839021527": "Lütfen geçerli bir hesap numarası girin. Örnek: CR123456789", "1840865068": "{{ variable }} değişkenini Basit Hareketli Ortalama Dizi {{ dummy }} olarak ayarlayın", "1841381387": "Daha fazla cüzdan alın", "1841788070": "Palladyum/USD", @@ -1698,6 +1729,7 @@ "1842266423": "arka", "1842862156": "Deriv X kontrol panelinize hoş geldiniz", "1843658716": "\"Only Downs\" seçeneğini seçerseniz, giriş noktasından sonra art arda tikler düşerse ödemeyi kazanırsınız. Herhangi bir tik yükselirse veya önceki tiklerden herhangi birine eşitse ödeme yapılmaz.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(min: {{min_stake}} - max: {{max_payout}})", "1846266243": "Bu özellik demo hesaplarında kullanılamaz.", "1846587187": "İkamet ettiğiniz ülkeyi seçmediniz", @@ -1710,7 +1742,7 @@ "1851052337": "Doğum yeri gereklidir.", "1851776924": "yukarı", "1854480511": "Kasiyer kilitli", - "1854874899": "Back to list", + "1854874899": "Listeye geri dön", "1855566768": "Öğe konumunu listele", "1856485118": "Please <0>resubmit your proof of address to transfer funds between MT5 and Deriv accounts.", "1856755117": "Bekleyen eylem gerekli", @@ -1792,7 +1824,6 @@ "1924765698": "Doğum yeri*", "1926987784": "- iOS: Hesap üzerinde sola kaydırın ve <0>Sil öğesine dokunun.", "1928930389": "GBP/NOK", - "1929309951": "İstihdam Durumu", "1929694162": "Hesapları karşılaştır", "1930899934": "Tether", "1931659123": "Her tik'de çalıştır", @@ -1807,6 +1838,7 @@ "1943440862": "Bir periyot içeren listeden Bollinger Bantları (BB) listesini hesaplar", "1944204227": "Bu blok, cari hesap bakiyesini verir.", "1947527527": "1. Bu bağlantı sizin tarafındanızdan gönderildi", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Olası nedenler şunlardır:", "1950413928": "Kimlik belgelerini gönderin", @@ -1875,6 +1907,7 @@ "2014536501": "Kart numarası", "2014590669": "'{{variable_name}}' değişkeninin değeri yok. Lütfen '{{variable_name}}' değişkeni için bildirimde bulunmak üzere bir değer ayarlayın.", "2017672013": "Lütfen belgenin düzenlendiği ülkeyi seçin.", + "2020104747": "Filter", "2020545256": "Hesabınızı kapatıyor musunuz?", "2021037737": "Devam etmek için lütfen bilgilerinizi güncelleyin.", "2021161151": "Deriv Bot'ta bir ticaret botunun nasıl oluşturulacağını öğrenmek için bu videoyu izleyin. Ayrıca, bir ticaret botu oluşturma hakkındaki bu blog gönderisine göz atın.", @@ -1885,7 +1918,6 @@ "2027696535": "Vergi bilgileri", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI, piyasa eğilimini belirlemenize yardımcı olan teknik bir analiz aracıdır. Size 0 ile 100 arasında bir değer verecektir. 70 ve üzeri bir RSI değeri, varlığın aşırı alım yaptığı ve mevcut eğilimin tersine dönebileceği anlamına gelirken, 30 ve altındaki bir değer varlığın aşırı satış olduğu anlamına gelir.", "2030045667": "Mesaj", "2033648953": "Bu blok, belirli bir zaman aralığı için belirtilen mum değerini verir.", @@ -1919,6 +1951,7 @@ "2063812316": "Metin Beyanı", "2063890788": "İptal edildi", "2065278286": "Spread", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Sürücü belgesi", "2070002739": "Kabul etme", "2070345146": "Kaldıraçlı bir CFD ticareti açarken.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Şikayetin sunulması", "2080553498": "3. Telegram REST API kullanarak sohbet kimliğini alın (daha fazla bilgi için: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Satıldı: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "Evet, sil", "2084693624": "Bir tarih/saat dizesini temsil eden bir dizeyi Epoch'tan bu yana saniyelere dönüştürür. Örnek: 2019-01-01 21:03:45 GMT+0800, 1546347825'e dönüştürülecek. Saat ve saat dilimi farkı isteğe bağlıdır.", "2085387371": "Sayı, harf ve özel karakter olmalıdır . , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "Zarar", "2117165122": "1. Bir Telegram botu oluşturun ve Telegram API token'inizi alın. Telegram'da bot oluşturma hakkında daha fazla bilgi için: https://core.telegram.org/bots#6-botfather", "2117489390": "{{ remaining }} saniye içinde otomatik güncelleme", - "2118315870": "Nerede yaşıyorsunuz?", "2119449126": "Aşağıdaki örneğin çıktı örneği:", "2119710534": "SSS", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "2146698770": "Pro ipucu: İstediğiniz bloğu tıklayıp dışarı sürükleyebilirsiniz", "2146892766": "Binary seçenekli ticaret deneyimi", "2147244655": "Kendi ticaret botumu Deriv Bot'a nasıl aktarabilirim?", - "-1232613003": "<0>Doğrulama başarısız. <1>Neden?", - "-2029508615": "<0>Doğrulama gerekli. <1>Şimdi doğrulayın", "-931052769": "Doğrulama gönder", "-1004605898": "İpuçları", "-1938142055": "Belgeler yüklendi", @@ -2141,18 +2172,9 @@ "-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.", - "-2073934245": "Bu sitede sunulan finansal ticaret hizmetleri, yalnızca yatırım yaptıkları tüm parayı kaybetme olasılığını kabul eden ve finansal sözleşmelerin satın alınmasıyla ilgili riskleri anlayan ve deneyimleyen müşteriler için uygundur. Finansal sözleşmelerdeki işlemler yüksek derecede risk taşır. Satın aldığınız sözleşmeler değersiz olarak sona ererse, sözleşme primi dahil tüm yatırımınızı kaybedersiniz.", - "-1166068675": "Hesabınız, Birleşik Krallık Oyun Komisyonu (UKGC) tarafından düzenlenen {{legal_entity_name}} ile açılacak ve Man Adası yasalarına tabi olacaktır.", - "-975118358": "Hesabınız, Malta Financial Services Authority (MFSA) tarafından düzenlenen {{legal_entity_name}} ile açılacak ve Malta yasalarına tabi olacaktır.", - "-680528873": "Hesabınız {{legal_entity_name}} ile açılacak ve Samoa yasalarına tabi olacaktır.", - "-1125193491": "Hesap ekle", - "-2068229627": "PEP değilim ve son 12 ay içinde PEP olmadım.", "-684271315": "TAMAM", "-740157281": "Ticaret Deneyimi Değerlendirmesi", "-1720468017": "Size hizmetlerimizi sağlarken, belirli bir ürün veya hizmetin sizin için uygun olup olmadığını değerlendirmek için sizden bilgi almamız gerekmektedir.", - "-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": "{{identifier_title}} ile bağlantıyı kaldır", "-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. <0/><0/> Devam etmek için, sermayenizin risk altında olduğunu anladığınızı onaylamanız gerekir.", @@ -2206,11 +2228,6 @@ "-1725454783": "Başarısız oldu", "-506510414": "Tarih ve saat", "-1708927037": "IP adresi", - "-619126443": "Giriş yapmak için <0>Deriv şifresini kullanın {{brand_website_name}} ve {{platform_name_trader}}.", - "-623760979": "{{brand_website_name}}, {{platform_name_trader}} ve {{platform_name_go}} adreslerinde oturum açmak için <0>Deriv şifresini kullanın.", - "-459147994": "{{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} ve {{platform_name_ctrader}} adreslerine giriş yapmak için <0>Deriv şifresini kullanın.", - "-80717068": "<0>Deriv şifrenize bağladığınız uygulamalar", - "-9570380": "Kullan {{platform_name_dxtrade}} giriş yapmak için şifre {{platform_name_dxtrade}} web ve mobil uygulamalardaki hesaplar.", "-2131200819": "Devre dışı bırak", "-200487676": "Etkinleştir", "-1840392236": "Bu doğru kod değil. Lütfen tekrar deneyin.", @@ -2240,44 +2257,37 @@ "-378415317": "Eyalet gereklidir", "-1497654315": "Jersey posta kodu için hesaplarımız ve hizmetlerimiz kullanılamıyor.", "-755626951": "Adres bilgilerinizi tamamlayın", - "-584911871": "Cüzdan para birimini seçin", "-1461267236": "Lütfen para biriminizi seçin", - "-1352330125": "PARA PİRİMİ", "-1027595143": "25.000$'dan daha az", "-40491332": "25,000$ - 50,000$", "-1139806939": "50,001$ - 100,000$", - "-626752657": "0-1 yıl", - "-532014689": "1-2 yıl", - "-1001024004": "3 yıl boyunca", - "-790513277": "son 12 ayda 6-10 işlem", - "-580085300": "son 12 ayda 11-39 işlem", - "-654781670": "Birincil", - "-1717373258": "İkincil", "-996132458": "İnşaat", "-915003867": "Sağlık", "-1430012453": "Bilgi ve İletişim Teknolojisi", "-987824916": "Bilim ve Mühendislik", "-146630682": "Sosyal ve Kültürel", "-761306973": "Üretim", - "-739367071": "Çalışan", - "-1156937070": "500,001$ - 1,000,000$", - "-315534569": "1,000,000$ üzerinde", - "-2068544539": "Maaşlı personel", - "-531314998": "Yatırımlar ve Temettüler", - "-1235114522": "Emeklilik", - "-1298056749": "Devlet yardımları", - "-449943381": "Tasarruflar & Miras", "-1631552645": "Profesyoneller", "-474864470": "Kişisel Bakım, Satış ve Servis çalışanları", "-1129355784": "Tarım, Ormancılık ve Balıkçılık Çalışanları", "-1242914994": "El Sanatları, Metal, Elektrikli ve Elektronik Çalışanları", "-1317824715": "Temizleyiciler ve Yardımcılar", "-1592729751": "Madencilik, İnşaat, Üretim ve Taşımacılık Çalışanları", + "-1030759620": "Kamu Çalışanları", "-2137323480": "Şirket Mülkiyeti", "-1590574533": "Boşanma Uzlaşması", "-1667683002": "Miras", "-1237843731": "Yatırım Geliri", "-777506574": "Mülk Satışı", + "-654781670": "Birincil", + "-1717373258": "İkincil", + "-1156937070": "500,001$ - 1,000,000$", + "-315534569": "1,000,000$ üzerinde", + "-2068544539": "Maaşlı personel", + "-531314998": "Yatırımlar ve Temettüler", + "-1235114522": "Emeklilik", + "-1298056749": "Devlet yardımları", + "-449943381": "Tasarruflar & Miras", "-1161338910": "İlk ad gereklidir.", "-1161818065": "Soyadı 2 ile 50 karakter arasında olmalıdır.", "-1281693513": "Doğum tarihi gereklidir.", @@ -2287,28 +2297,14 @@ "-212167954": "Vergi Kimlik Numarası uygun şekilde biçimlendirilmemiş.", "-621555159": "Kimlik bilgisi", "-204765990": "Kullanım Koşulları", - "-231863107": "Hayır", - "-870902742": "Çevrimiçi ticaretle ilgili ne kadar bilgi ve deneyime sahipsiniz?", - "-1929477717": "Finansal hizmetlerle ilgili akademik derecem, mesleki sertifikasyon ve/veya iş deneyimim var.", - "-1540148863": "Ticaretle ilgili seminer, eğitim ve/veya atölye çalışmalarına katıldım.", - "-922751756": "Bir yıldan az", - "-542986255": "Hiçbiri", - "-1337206552": "Anlayışınıza göre, CFD ticareti şunları yapmanızı sağlar", - "-456863190": "Bir varlığın fiyat hareketine sonucun sabit bir getiri veya hiçbir şey olduğu bir pozisyon açın.", - "-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ç 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ı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.", - "-1222388581": "Yukarıdakilerin tümü.", "-477761028": "Seçmen kimliği", "-1466346630": "CPF", - "-1030759620": "Kamu Çalışanları", + "-739367071": "Çalışan", + "-626752657": "0-1 yıl", + "-532014689": "1-2 yıl", + "-1001024004": "3 yıl boyunca", + "-790513277": "son 12 ayda 6-10 işlem", + "-580085300": "son 12 ayda 11-39 işlem", "-612752984": "Bunlar, hesaplarınıza uyguladığımız varsayılan sınırlardır.", "-1598263601": "Alım satım limitleri ve bunların nasıl uygulandığı hakkında daha fazla bilgi için lütfen <0>Yardım Merkezi'ne gidin", "-1411635770": "Hesap sınırları hakkında daha fazla bilgi edinin", @@ -2326,10 +2322,7 @@ "-1500958859": "Doğrula", "-1502578110": "Hesabınızın kimliği tamamen doğrulandı ve para çekme limitleriniz kaldırıldı.", "-1662154767": "yakın tarihli bir hizmet faturası (örn. elektrik, su, gaz, sabit hat veya internet), banka hesap özeti veya adınızı ve bu adresinizi içeren resmi bir mektup.", - "-190838815": "Doğrulama için buna ihtiyacımız var. Sağladığınız bilgiler sahte veya yanlışsa para yatırıp çekemeyeceksiniz.", - "-223216785": "İkinci adres satırı*", "-594456225": "İkinci adres satırı", - "-1940457555": "Posta Kodu*", "-1964954030": "Posta Kodu", "-516397235": "Bu tokeni kim ile paylaştığınıza dikkat edin. Bu tokeni kullanan herkes hesabınız adına aşağıdaki işlemleri gerçekleştirebilir", "-989216986": "Hesap ekle", @@ -2371,8 +2364,6 @@ "-1100235269": "İstihdam Sanayisi", "-684388823": "Tahmini net değeri", "-509054266": "Tahmini yıllık ciro", - "-601903492": "Forex Ticaret Deneyimi", - "-1012699451": "CFD alım satım deneyimi", "-1588485629": "Örnek", "-1117345066": "Belge türünü seçin", "-651192353": "Örnek:", @@ -2394,11 +2385,11 @@ "-1088324715": "We’ll review your documents and notify you of its status within 1 - 3 working days.", "-329713179": "Tamam", "-1176889260": "Lütfen bir belge türü seçin.", - "-1926456107": "Sunduğunuz kimliğin süresi doldu.", - "-555047589": "Kimlik belgenizin süresi dolmuş gibi görünüyor. Lütfen geçerli bir belgeyle yeniden deneyin.", - "-841187054": "Tekrar Deneyin", + "-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": "Verdiğiniz ayrıntılarla kimliğinizi doğrulayamadık. ", - "-228284848": "Kimliğinizi sağladığınız ayrıntılarla doğrulayamadık.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-1391934478": "Kimliğiniz doğrulandı. Ayrıca adres kanıtınızı da göndermeniz gerekir.", "-118547687": "Kimlik doğrulamasını geçti", "-200989771": "Kişisel ayrıntılara git", @@ -2464,12 +2455,40 @@ "-142444667": "Deriv MT5 parolanızı değiştirmek için lütfen e-postadaki bağlantıya tıklayın.", "-742748008": "E-postanızı kontrol edin ve devam etmek için e-postadaki linke tıklayın.", "-84068414": "E-postayı hala almadınız mı? Lütfen <0>canlı sohbet. yoluyla bizimle iletişime geçin", + "-975118358": "Hesabınız, Malta Financial Services Authority (MFSA) tarafından düzenlenen {{legal_entity_name}} ile açılacak ve Malta yasalarına tabi olacaktır.", + "-2073934245": "Bu sitede sunulan finansal ticaret hizmetleri, yalnızca yatırım yaptıkları tüm parayı kaybetme olasılığını kabul eden ve finansal sözleşmelerin satın alınmasıyla ilgili riskleri anlayan ve deneyimleyen müşteriler için uygundur. Finansal sözleşmelerdeki işlemler yüksek derecede risk taşır. Satın aldığınız sözleşmeler değersiz olarak sona ererse, sözleşme primi dahil tüm yatırımınızı kaybedersiniz.", + "-1125193491": "Hesap ekle", + "-2068229627": "PEP değilim ve son 12 ay içinde PEP olmadım.", + "-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": "{{identifier_title}} ile bağlantıyı kaldır", "-428335668": "İşlemi tamamlamak için bir parola belirlemeniz gerekir.", + "-1232613003": "<0>Doğrulama başarısız. <1>Neden?", + "-2029508615": "<0>Doğrulama gerekli. <1>Şimdi doğrulayın", "-818898181": "Belgedeki isim Deriv profilinizle eşleşmiyor.", "-310316375": "Belgedeki adres yukarıda girdiğiniz adresle eşleşmiyor.", "-485368404": "Belge 6 aydan daha uzun bir süre önce düzenlenmiştir.", "-367016488": "Bulanık belge. Tüm bilgiler net ve görünür olmalıdır.", "-1957076143": "Kırpılmış belge. Tüm bilgiler net ve görünür olmalıdır.", + "-231863107": "Hayır", + "-870902742": "Çevrimiçi ticaretle ilgili ne kadar bilgi ve deneyime sahipsiniz?", + "-1929477717": "Finansal hizmetlerle ilgili akademik derecem, mesleki sertifikasyon ve/veya iş deneyimim var.", + "-1540148863": "Ticaretle ilgili seminer, eğitim ve/veya atölye çalışmalarına katıldım.", + "-922751756": "Bir yıldan az", + "-542986255": "Hiçbiri", + "-1337206552": "Anlayışınıza göre, CFD ticareti şunları yapmanızı sağlar", + "-456863190": "Bir varlığın fiyat hareketine sonucun sabit bir getiri veya hiçbir şey olduğu bir pozisyon açın.", + "-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ç 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ı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.", + "-1222388581": "Yukarıdakilerin tümü.", "-1515286538": "Lütfen belge numaranızı girin. ", "-1694758788": "Belge numaranızı girin", "-1458676679": "2-50 karakter girmelisiniz.", @@ -2479,6 +2498,8 @@ "-1437017790": "Finansal bilgileri", "-70342544": "Mali bilgilerinizi yasal olarak istemek zorundayız.", "-39038029": "Ticaret deneyimi", + "-601903492": "Forex Ticaret Deneyimi", + "-1012699451": "CFD alım satım deneyimi", "-1894668798": "Diğer ticari araçlar deneyimi", "-1026468600": "Diğer ticari araçların sıklığı", "-1743024217": "Dil Seçiniz", @@ -2489,6 +2510,11 @@ "-536187647": "Erişim iptali onaylansın mı?", "-1357606534": "İzin", "-570222048": "Erişimi iptal et", + "-80717068": "<0>Deriv şifrenize bağladığınız uygulamalar", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Giriş yapmak için <0>Deriv şifresini kullanın {{brand_website_name}} ve {{platform_name_trader}}.", + "-623760979": "{{brand_website_name}}, {{platform_name_trader}} ve {{platform_name_go}} adreslerinde oturum açmak için <0>Deriv şifresini kullanın.", + "-459147994": "{{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} ve {{platform_name_ctrader}} adreslerine giriş yapmak için <0>Deriv şifresini kullanın.", "-1526404112": "Hizmet faturası: elektrik, su, gaz veya sabit telefon faturası.", "-537552700": "Ev kiralama sözleşmesi: geçerli ve güncel sözleşme.", "-890084320": "Kaydet ve gönder", @@ -2510,11 +2536,20 @@ "-362324454": "Emtialar", "-1071336803": "Platform", "-820028470": "Opsiyonlar & Çarpanlar", - "-1255879419": "Trader's Hub", + "-1186807402": "Transfer", + "-224804428": "İşlemler", + "-470018967": "Bakiyeyi sıfırla", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Sıfırla", "-213142918": "Deposit 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ürev endekslerle MT5'te CFD ticareti yapın.", "-328128497": "Finansal", @@ -2525,15 +2560,29 @@ "-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 yapın. <0>Daha fazla bilgi edin", "-1884966862": "Farklı tür ve yetki alanına sahip daha fazla Deriv MT5 hesabı edinin.", - "-145462920": "Deriv cTrader", "-982095728": "Edin", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<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 %73'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.", "-1277942366": "Toplam varlıklar", + "-1255879419": "Trader's Hub", "-493788773": "AB Dışı", "-673837884": "AB", "-230566990": "Gönderdiğiniz aşağıdaki belgeler kontrollerimizi geçmedi:", "-846812148": "Adres kanıtı.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "AB dışı yönetmelik", "-643108528": "AB dışı ve AB yönetmeliği", + "-979459594": "Buy/Sell", + "-494667560": "Emirler", + "-679691613": "İlanlarım", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Çarpanlar hesabı", "-744999940": "Deriv hesabı", @@ -2543,9 +2592,20 @@ "-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.", "-1173266642": "Bu hesap, zengin özelliklere sahip bir ticaret platformunda CFD'ler sunar.", - "-1290112064": "Deriv EZ", "-1453519913": "Tüm favori varlıklarınızla kolay başlangıçlı bir platformda CFD ticareti yapın.", "-2051096382": "<0>Opsiyonlar ile piyasa fiyatı hareketlerini doğru bir şekilde tahmin ederek bir dizi ödeme kazanın veya <1>Çarpanlarla ilk hissenizden daha fazlasını riske atmadan CFD'lerin avantajını elde edin.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-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", @@ -2556,7 +2616,21 @@ "-951876657": "Hesabınıza yükleme", "-1945421757": "Bir hesabınız olduğunda, hesaba para eklemek için “Deposit” veya “Transfer”i tıklayın", "-1965920446": "Ticarete başlayın", - "-33612390": "<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 %73'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.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "Bu alan zorunludur.", "-1870909526": "Sunucumuz bir adres kurtaramıyor.", "-582721696": "İzin verilen geçerli geri çekme miktarı {{format_min_withdraw_amount}} ile {{format_max_withdraw_amount}} {{currency}}", @@ -2703,6 +2777,7 @@ "-1707299138": "{{currency_symbol}} cüzdan adresiniz", "-38063175": "{{account_text}} cüzdan", "-705272444": "Kimliğinizi doğrulamak için bir kimlik belgesi yükleyin", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Bu, hesabınızı izinsiz para çekme işlemlerinden korumak içindir.", "-130833284": "Maksimum ve minimum para çekme limitlerinizin sabit olmadığını lütfen unutmayın. Kriptopara biriminin yüksek volatilitesi nedeniyle değişirler.", "-1531269493": "Alım satım işleminiz işlendikten sonra size bir e-posta göndereceğiz.", @@ -2859,6 +2934,30 @@ "-1016171176": "Varlık", "-621128676": "Ticaret türü", "-447853970": "Zarar eşiği", + "-155173714": "Hadi bir bot yapalım!", + "-1919212468": "3. Kategorilerin üstündeki arama çubuğunu kullanarak istediğiniz blokları da arayabilirsiniz..", + "-1520558271": "Daha fazla bilgi için, bu blog gönderisine göz atın bir ticaret botu oluşturmanın temelleri hakkında.", + "-980360663": "3. İstediğiniz bloğu seçin ve çalışma alanına sürükleyin.", + "-1493168314": "Hızlı strateji nedir?", + "-1680391945": "Hızlı bir strateji kullanma", + "-1177914473": "Stratejimi nasıl kaydedebilirim?", + "-271986909": "Bot Oluşturucu içerisinde, botunuzu indirmek için üstteki araç çubuğunun üzerinde Kaydet ögesine tıklayın. Botunuza bir isim verin, ve botunuzu cihazınıza veya Google Drive'a indirmeyi seçin. Botunuz bir XML dosyası olarak indirilecek.", + "-1149045595": "1. İçe Aktar ögesini seçtikten sonra, Lokal seçeneğini seçin ve Devam ögesine tıklayın.", + "-288041546": "2. XML dosyanızı seçin ve Open ögesine tıklayın.", + "-2127548288": "3. Botunuz buna göre yüklenecek.", + "-1311297611": "1. İçe Aktar seçildikten sonra, Google Drive ögesini seçin ve Devam ögesine tıklayın.", + "-1549564044": "Çalışma alanını nasıl sıfırlarım?", + "-1127331928": "Bot Oluşturucu içerisinde, üstteki araç çubuğu üzerinde Sıfırla ögesine tıklayın. Bu çalışma alanını temizleyecektir. Kaydedilmemiş değişikliklerin kaybolacağını lütfen unutmayın.", + "-1720444288": "Deriv Bot ile kayıplarımı nasıl kontrol edebilirim?", + "-1142295124": "Deriv Bot ile kayıplarınızı kontrol etmenin birkaç yolu vardır. İşte stratejinizde kayıp kontrolünü nasıl uygulayabileceğinize dair basit bir örnek:", + "-986689483": "1. Aşağıdaki değişkenleri oluşturun:", + "-269910127": "3. Mevcut kar/zararı son sözleşmeden elde edilen karla güncelleyin. Son sözleşme kaybedilirse, mevcut kar/zararın değeri negatif olacaktır.", + "-1565344891": "Deriv Bot'u web tarayıcımda birden fazla sekmede çalıştırabilir miyim?", + "-90192474": "Evet, yapabilirsiniz. Ancak, hesabınızda maksimum açık pozisyon sayısı ve açık pozisyonlarda maksimum toplam ödeme gibi limitler vardır. Yani, birden fazla pozisyon açarken bu sınırları aklınızda bulundurun. Bu sınırlar hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: Ayarlar > Hesap limitleri.", + "-213872712": "Hayır, Deriv Bot'ta kripto para birimleri sunmuyoruz.", + "-2147346223": "Deriv Bot hangi ülkelerde kullanılabilir?", + "-352345777": "Otomatik ticaret için en popüler stratejiler nelerdir?", + "-552392096": "Otomatik ticarette en sık kullanılan stratejilerden üçü Martingale, D'Alembert ve Oscar's Grind'dir - hepsini hazır ve Deriv Bot'ta sizi bekliyor bulabilirsiniz.", "-507620484": "Kaydedilmedi", "-764102808": "Google Drive", "-555886064": "Kazandı", @@ -2937,30 +3036,6 @@ "-1823621139": "Hızlı Strateji", "-1778025545": "Bir botu başarıyla içe aktardınız.", "-1519425996": "Sonuç bulunamadı \"{{ faq_search_value }}”", - "-155173714": "Hadi bir bot yapalım!", - "-1919212468": "3. Kategorilerin üstündeki arama çubuğunu kullanarak istediğiniz blokları da arayabilirsiniz..", - "-1520558271": "Daha fazla bilgi için, bu blog gönderisine göz atın bir ticaret botu oluşturmanın temelleri hakkında.", - "-980360663": "3. İstediğiniz bloğu seçin ve çalışma alanına sürükleyin.", - "-1493168314": "Hızlı strateji nedir?", - "-1680391945": "Hızlı bir strateji kullanma", - "-1177914473": "Stratejimi nasıl kaydedebilirim?", - "-271986909": "Bot Oluşturucu içerisinde, botunuzu indirmek için üstteki araç çubuğunun üzerinde Kaydet ögesine tıklayın. Botunuza bir isim verin, ve botunuzu cihazınıza veya Google Drive'a indirmeyi seçin. Botunuz bir XML dosyası olarak indirilecek.", - "-1149045595": "1. İçe Aktar ögesini seçtikten sonra, Lokal seçeneğini seçin ve Devam ögesine tıklayın.", - "-288041546": "2. XML dosyanızı seçin ve Open ögesine tıklayın.", - "-2127548288": "3. Botunuz buna göre yüklenecek.", - "-1311297611": "1. İçe Aktar seçildikten sonra, Google Drive ögesini seçin ve Devam ögesine tıklayın.", - "-1549564044": "Çalışma alanını nasıl sıfırlarım?", - "-1127331928": "Bot Oluşturucu içerisinde, üstteki araç çubuğu üzerinde Sıfırla ögesine tıklayın. Bu çalışma alanını temizleyecektir. Kaydedilmemiş değişikliklerin kaybolacağını lütfen unutmayın.", - "-1720444288": "Deriv Bot ile kayıplarımı nasıl kontrol edebilirim?", - "-1142295124": "Deriv Bot ile kayıplarınızı kontrol etmenin birkaç yolu vardır. İşte stratejinizde kayıp kontrolünü nasıl uygulayabileceğinize dair basit bir örnek:", - "-986689483": "1. Aşağıdaki değişkenleri oluşturun:", - "-269910127": "3. Mevcut kar/zararı son sözleşmeden elde edilen karla güncelleyin. Son sözleşme kaybedilirse, mevcut kar/zararın değeri negatif olacaktır.", - "-1565344891": "Deriv Bot'u web tarayıcımda birden fazla sekmede çalıştırabilir miyim?", - "-90192474": "Evet, yapabilirsiniz. Ancak, hesabınızda maksimum açık pozisyon sayısı ve açık pozisyonlarda maksimum toplam ödeme gibi limitler vardır. Yani, birden fazla pozisyon açarken bu sınırları aklınızda bulundurun. Bu sınırlar hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: Ayarlar > Hesap limitleri.", - "-213872712": "Hayır, Deriv Bot'ta kripto para birimleri sunmuyoruz.", - "-2147346223": "Deriv Bot hangi ülkelerde kullanılabilir?", - "-352345777": "Otomatik ticaret için en popüler stratejiler nelerdir?", - "-552392096": "Otomatik ticarette en sık kullanılan stratejilerden üçü Martingale, D'Alembert ve Oscar's Grind'dir - hepsini hazır ve Deriv Bot'ta sizi bekliyor bulabilirsiniz.", "-418247251": "Günlüğünüzü indirin.", "-2123571162": "İndir", "-870004399": "<0>Satın alındı: {{longcode}} (KİMLİK: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Hesap devre dışı bırakıldı", "-1837059346": "Buy / Sell", "-1845037007": "İlan veren sayfası", - "-494667560": "Emirler", - "-679691613": "İlanlarım", "-821418875": "Tüccar", "-679102561": "Sözleşme detayları", "-430118939": "Şikayet politikası", @@ -3082,7 +3155,6 @@ "-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": "Deposit işlemlerini etkinleştirmek için lütfen hesap ayarlarınıza gidin ve kişisel bilgilerinizi tamamlayın.", "-904632610": "Bakiyenizi sıfırlayın", - "-470018967": "Bakiyeyi sıfırla", "-156611181": "Kilidini açmak için lütfen hesap ayarlarınızda finansal değerlendirmeyi tamamlayın.", "-1925176811": "Şu anda para çekme işlemleri gerçekleştirilemiyor", "-980696193": "Sistem bakımı nedeniyle para çekme işlemleri geçici olarak kullanılamıyor. Bakım tamamlandığında para çekme işlemi yapabilirsiniz.", @@ -3107,12 +3179,12 @@ "-577279362": "Hesabınızı doğrulamak ve ticarete devam etmek için lütfen kimlik kanıtınızı gönderin.", "-197134911": "Kimlik kanıtınızın süresi doldu", "-152823394": "Kimlik kanıtınızın süresi doldu. Hesabınızı doğrulamak ve ticarete devam etmek için lütfen yeni bir kimlik kanıtı gönderin.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Düzeltmek için bu basit talimatları izleyin.", "-2142540205": "Görünüşe göre belgenizdeki adres, Deriv profilinizdeki adresle eşleşmiyor. Lütfen kişisel bilgilerinizi şimdi doğru adresle güncelleyin.", "-482715448": "Kişisel bilgiler'e gidin", "-2072411961": "Adres kanıtınız doğrulandı", "-384887227": "Profilinizdeki adresi güncelleyin.", - "-448961363": "AB-Dışı", "-1998049070": "Çerezleri kullanmayı kabul ediyorsanız Kabul Et'i tıklayın. Daha fazla bilgi için, <0>politikamıza bakın.", "-402093392": "Deriv Hesabı Ekle", "-1721181859": "Bir {{deriv_account}} hesabına ihtiyacınız olacak", @@ -3125,7 +3197,6 @@ "-650505513": "Tam ekran", "-1823504435": "Bildirimleri görüntüleyin", "-1954045170": "Atanmış para birimi yok", - "-583559763": "Menü", "-1591792668": "Hesap Limitleri", "-34495732": "Düzenleyici bilgiler", "-1496158755": "Deriv.com'a git", @@ -3259,6 +3330,7 @@ "-818926350": "Mali Komisyon, olayın tarihinden itibaren 45 gün içerisinde ve ancak ticaret yapan kişi sorunu doğrudan şirketle çözmeye çalıştıktan sonra itirazları kabul eder.", "-1825471709": "Güçlü ve kullanımı kolay bir platformda tamamen yeni bir ticari deneyim.", "-981017278": "Otomatik ticaret parmaklarınızın ucunda. Kodlama gerekmez.", + "-583559763": "Menü", "-778309978": "Tıkladığınız bağlantının süresi doldu. Gelen kutunuzdaki en son e-postadaki bağlantıyı tıkladığınızdan emin olun. Alternatif olarak, e-postanızı aşağıya girin ve yeni bir bağlantı için <0>E-postayı yeniden gönder seçeneğine tıklayın.", "-336222114": "Düzeltmek için bu basit adımları izleyin:", "-1064116456": "<0>Deriv Holdings (Guernsey) Limited brokerini arayın ve seçin.", @@ -3415,22 +3487,6 @@ "-1282933308": "{{barrier}} değil", "-968190634": "Equals {{barrier}}", "-1747377543": "{{barrier}} altında", - "-256210543": "Şu anda alım satım işlemi yapılamıyor.", - "-1150099396": "Yakında bunun sizin için hazır olması için çalışıyoruz. Başka bir hesabınız varsa, ticarete devam etmek için o hesaba geçin. Bir Deriv MT5 Financial ekleyebilirsiniz.", - "-28115241": "{{platform_name_trader}} bu hesap için kullanılamaz", - "-453920758": "{{platform_name_mt5}} panosuna gidin", - "-402175529": "Geçmiş", - "-902712434": "Anlaşma iptali", - "-988484646": "Anlaşma iptali (uygulandı)", - "-444882676": "Anlaşma iptali (etkin)", - "-13423018": "Referans Kimliği", - "-2035315547": "Düşük bariyer", - "-1551639437": "Kaydı yok", - "-1214703885": "Kar al veya zarar durdur gibi bilgileri henüz güncellemediniz", - "-504849554": "Yeniden açılacak", - "-59803288": "Bu arada sentetik indekslerimizi deneyin. Gerçek piyasa volatilitesini simüle eder ve 7/24 açıktır.", - "-1278109940": "Açık piyasalara bakın", - "-694105443": "Bu piyasa kapalı", "-1043795232": "Son pozisyonlar", "-1511825574": "Kar/Zarar:", "-726626679": "Potansiyel kar/zarar:", @@ -3455,21 +3511,15 @@ "-1435392215": "Anlaşma iptali hakkında", "-2017825013": "Anlaşıldı", "-1192773792": "Bunu bir daha gösterme", + "-902712434": "Anlaşma iptali", "-1280319153": "İşleminizi istediğiniz zaman seçtiğiniz bir zaman dilimi içinde iptal edin. İşleminiz seçilen zaman dilimi içinde stop out seviyesine ulaşırsa otomatik olarak tetiklenir.", "-471757681": "Risk yönetimi", "-843831637": "Zarar durdur", "-771725194": "Anlaşma iptali", "-338707425": "Minimum süre 1 gündür", "-1003473648": "Süre: {{duration}} gün", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Süre sonunda ki ödeme, puan başına ödemenin nihai fiyat ile strike fiyatı arasındaki farkla çarpımına eşittir.", "-1527492178": "Satın alma kilitlendi", "-725375562": "Satın alma düğmesini Ayarlar menüsünden kilitleyebilir/kilidini açabilirsiniz", - "-774638412": "Bahis {{min_stake}} {{currency}} ile {{max_stake}} {{currency}} arasında olmalıdır", - "-1358367903": "Bahis", - "-434270664": "Mevcut Fiyat", - "-1956787775": "Bariyer Fiyatı:", - "-1513281069": "Bariyer 2", "-390994177": "{{min}} ile {{max}} arasında olmalıdır", "-1804019534": "Süre sonu: {{date}}", "-2055106024": "Gelişmiş ve basit süre ayarları arasında geçiş", @@ -3484,6 +3534,7 @@ "-1763848396": "Koymak", "-194424366": "üzerinde", "-857660728": "Strike Fiyatları", + "-1358367903": "Bahis", "-1386326276": "Bariyer gerekli bir alandır.", "-1418742026": "Yüksek bariyer alt bariyerden yüksek olmalıdır.", "-92007689": "Düşük bariyer, yüksek bariyere göre daha düşük olmalıdır.", @@ -3491,6 +3542,21 @@ "-1975910372": "Dakika 0 ile 59 arasında olmalıdır.", "-866277689": "Son kullanma zamanı geçmişte olamaz.", "-1455298001": "Şimdi", + "-256210543": "Şu anda alım satım işlemi yapılamıyor.", + "-1150099396": "Yakında bunun sizin için hazır olması için çalışıyoruz. Başka bir hesabınız varsa, ticarete devam etmek için o hesaba geçin. Bir Deriv MT5 Financial ekleyebilirsiniz.", + "-28115241": "{{platform_name_trader}} bu hesap için kullanılamaz", + "-453920758": "{{platform_name_mt5}} panosuna gidin", + "-402175529": "Geçmiş", + "-988484646": "Anlaşma iptali (uygulandı)", + "-444882676": "Anlaşma iptali (etkin)", + "-13423018": "Referans Kimliği", + "-2035315547": "Düşük bariyer", + "-1551639437": "Kaydı yok", + "-1214703885": "Kar al veya zarar durdur gibi bilgileri henüz güncellemediniz", + "-504849554": "Yeniden açılacak", + "-59803288": "Bu arada sentetik indekslerimizi deneyin. Gerçek piyasa volatilitesini simüle eder ve 7/24 açıktır.", + "-1278109940": "Açık piyasalara bakın", + "-694105443": "Bu piyasa kapalı", "-439389714": "Bunun üzerinde çalışıyoruz", "-770929448": "{{platform_name_smarttrader}} platformuna gidin", "-347156282": "Kanıt sunun", @@ -3537,6 +3603,8 @@ "-454245976": "Piyasa fiyatının belirli bir süre boyunca sürekli düşeceğini düşünüyorsanız, <0>Short seçeneğini seçin. Piyasa fiyatı bariyerin üzerine değmez veya aşmazsa, süre sonunda bir ödeme alırsınız. Bariyer ihlal edilmezse ödemeniz piyasa fiyatı ile bariyer arasındaki mesafeyle orantılı olarak artacaktır. Ödeme, bahis tutarınızdan daha yüksek olduğunda kar etmeye başlayacaksınız. Piyasa fiyatı bariyeri aşarsa, bir ödeme olmayacaktır.", "-351875097": "Tiklerin sayısı", "-729830082": "Daha az görüntüle", + "-1669741470": "Süre sonunda ki ödeme, puan başına ödemenin nihai fiyat ile strike fiyatı arasındaki farkla çarpımına eşittir.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "YENİ!", "-993480898": "Akümülatörler", "-45873457": "YENİ", @@ -3557,6 +3625,10 @@ "-690963898": "Ödemeniz bu tutara ulaştığında sözleşmeniz otomatik olarak kapatılacaktır.", "-511541916": "Bu sayıda tike ulaşıldığında sözleşmeniz otomatik olarak kapatılacaktır.", "-438655760": "<0>Not: İşleminizi istediğiniz zaman kapatabilirsiniz. Kayma riskinin farkında olun.", + "-774638412": "Bahis {{min_stake}} {{currency}} ile {{max_stake}} {{currency}} arasında olmalıdır", + "-434270664": "Mevcut Fiyat", + "-1956787775": "Bariyer Fiyatı:", + "-1513281069": "Bariyer 2", "-1683683754": "Long", "-1046859144": "<0>{{title}} Piyasa fiyatı {{price_position}} kalırsa ve bariyere dokunmaz veya geçmezse bir ödeme alırsınız. Aksi takdirde, ödemeniz sıfır olacaktır.", "-1815023694": "bariyerin üstünde", diff --git a/packages/translations/src/translations/vi.json b/packages/translations/src/translations/vi.json index 548566e038f4..0ebaab80cfac 100644 --- a/packages/translations/src/translations/vi.json +++ b/packages/translations/src/translations/vi.json @@ -24,7 +24,6 @@ "27731356": "Tài khoản của bạn tạm thời bị vô hiệu hóa. Vui lòng liên hệ với chúng tôi qua <0> live chat để được kích hoạt lại tính năng nạp và rút tiền.", "27830635": "Deriv (V) Ltd", "28581045": "Thêm một tài khoản thực MT5", - "30801950": "Tài khoản của bạn sẽ được mở với {{legal_entity_name}}, được quản lý bởi Malta Gaming Authority và sẽ tuân theo luật pháp của Malta.", "33433576": "Vui lòng chọn một ví điện tử để rút tiền.", "35089987": "Tải lên mặt trước và mặt sau bằng lái xe của bạn.", "41737927": "Xin cảm ơn", @@ -60,11 +59,13 @@ "72500774": "Vui lòng nhập Địa chỉ thuế.", "73086872": "Bạn đã tự giới hạn mình khỏi việc giao dịch", "73326375": "Thấp là điểm thấp nhất thị trường chạm đến trong khoảng thời gian diễn ra hợp đồng.", + "74836780": "{{currency_code}} Wallet", "74963864": "Thấp hơn", "76916358": "Bạn đã đạt giới hạn rút tiền.<0/>Vui lòng tải lên giấy tờ xác thực danh tính và địa chỉ của bạn để được nâng giới hạn và tiếp tục rút tiền.", "76925355": "Kiểm tra hiệu suất bot của bạn", "77945356": "Ứng dụng di động giúp bạn giao dịch mọi lúc mọi nơi.", - "77982950": "Vanilla là giao dịch quyền chọn cho phép bạn dự đoán hướng giá lên (tăng) hoặc giá xuống (giảm) của tài sản cơ sở bằng cách mua một lệnh “Mua” hoặc “Bán”.", + "77982950": "Vanilla là giao dịch quyền chọn cho phép bạn dự đoán hướng giá lên (tăng) hoặc giá xuống (giảm) của tài sản cơ sở bằng cách mua một lệnh “Call” hoặc “Put”.", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "Chúng tôi không thể tìm thấy trang đó", "82839270": "Tải lên trang có ảnh của bạn trong hộ chiếu.", "83202647": "Thu gọn Khung", @@ -76,6 +77,7 @@ "90266322": "2. Bắt đầu trò chuyện với bot Telegram mới tạo của bạn và hãy đảm bảo rằng bạn gửi cho bot một số tin nhắn trước khi tiếp tục bước tiếp theo. (Ví dụ: Xin chào Bot!)", "91993812": "Chiến lược Martingale là một kỹ thuật giao dịch cổ điển đã được sử dụng trong hơn một trăm năm, được phổ biến bởi nhà toán học người Pháp Paul Pierre Levy trong thế kỷ 18.", "93154671": "1. Nhấn Cài đặt lại ở cuối bảng thống kê.", + "93939827": "Cryptocurrency accounts", "96381225": "Xác minh ID thất bại", "98473502": "Chúng tôi không có nghĩa vụ phải tiến hành kiểm tra tính phù hợp cũng như không phải cung cấp cho bạn bất kỳ cảnh báo rủi ro nào.", "98972777": "mục ngẫu nhiên", @@ -83,6 +85,7 @@ "102226908": "Mục không thể để trống", "108916570": "Thời lượng: {{duration}} ngày", "109073671": "Vui lòng sử dụng loại ví điện tử bạn đã dùng để nạp tiền. Hãy đảm bảo rằng ví đó có hỗ trợ việc rút tiền. Xem danh sách các ví điện tử cho phép rút tiền <0>tại đây.", + "110822969": "One Wallet for all your transactions", "111215238": "Tránh khỏi ánh sáng trực tiếp", "111718006": "Ngày kết thúc", "111931529": "Tổng tiền cược tối đa qua 7 ngày", @@ -215,7 +218,9 @@ "251882697": "Cảm ơn bạn! Phản hồi của bạn đã được hệ thống của chúng tôi ghi nhận.<0/><0/>Vui lòng nhấp “OK” để tiếp tục.", "254912581": "Khung này tương tự như EMA, ngoại trừ việc nó cung cấp cho bạn toàn bộ dòng EMA dựa trên danh sách đầu vào và khoảng thời gian nhất định.", "256031314": "Kinh doanh tiền mặt", + "256123827": "What happens to my trading accounts", "256602726": "Nếu bạn hủy tài khoản:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "Đánh giá kinh nghiệm giao dịch", "260069181": "Lỗi đã xảy ra trong khi tải URL", @@ -250,8 +255,8 @@ "284527272": "antimode", "284772879": "Hợp đồng", "284809500": "Tài chính thử nghiệm", + "285909860": "Demo {{currency}} Wallet", "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ố 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.", @@ -299,6 +304,7 @@ "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 đánh dấu ở trên để thử lại.", + "346214602": "A better way to manage your funds", "347029309": "Forex: Tiêu chuẩn/Micro", "347039138": "Phép lặp (2)", "347217485": "Bạn gặp vấn đề khi truy cập Deriv MT5 trên điện thoại di động của bạn?", @@ -353,6 +359,7 @@ "401345454": "Đi đến thẻ Hướng dẫn để thực hiện.", "402343402": "Do có vấn đề với máy chủ, một số tài khoản {{platform}} của bạn tạm thời không thể sử dụng. Mong bạn thông cảm cho chúng tôi và xin cảm ơn sự kiên nhẫn của bạn.", "403456289": "Công thức của SMA là:", + "403608958": "Select a trading account or a Wallet", "404743411": "Tổng số tiền nạp", "406359555": "Thông tin hợp đồng", "406497323": "Bán hợp đồng đang hoạt động của bạn nếu cần (tùy chọn)", @@ -373,6 +380,7 @@ "427617266": "Bitcoin", "428709688": "Khoảng thời gian nghỉ bạn muốn giữa mỗi báo cáo:", "431267979": "Dưới đây là hướng dẫn nhanh về cách sử dụng Deriv Bot khi di chuyển.", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "Chốt lời: {{ currency }} {{ take_profit }}", "432519573": "Tài liệu đã được tải lên", @@ -453,12 +461,12 @@ "518955798": "7. Chạy một lần tại điểm bắt đầu", "520136698": "Chỉ số Boom 500", "521872670": "mục", - "522283618": "Kinh nghiệm giao dịch quyền chọn kỹ thuật số", "522703281": "chia hết cho", "523123321": "- 10 tới lũy thừa của một số cho sẵn", "524459540": "Làm thế nào để tạo biến số?", "527329988": "Đây là một trong 100 mật khẩu phổ biến nhất", "529056539": "Quyền chọn", + "530864956": "Deriv Apps", "530953413": "Các ứng dụng được cho phép", "531114081": "3. Loại hợp đồng", "531675669": "Euro", @@ -473,10 +481,13 @@ "543915570": "Forex, chứng khoán, chỉ số chứng khoán, tiền mã hóa, chỉ số tổng hợp", "545476424": "Tổng số tiền rút", "549479175": "Cấp số nhân Deriv", + "549799607": "Go to LiveChat", "550589723": "Tiền 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 đó.", + "551550548": "Your balance has been reset to 10,000.00 USD.", "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", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "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": "Số căn cước công dân", "556264438": "Khoảng thời gian", @@ -552,6 +563,7 @@ "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.", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "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ý.", "639382772": "Vui lòng tải lên loại tệp được hỗ trợ.", "640596349": "Bạn chưa nhận được thông báo nào", @@ -562,7 +574,6 @@ "642546661": "Tải lên ảnh mặt sau của giấy phép từ máy tính của bạn", "642995056": "Email", "644150241": "Số hợp đồng đã sinh lời tính từ lần cuối bạn làm mới số liệu thông kê của mình.", - "645016681": "Tần suất giao dịch bằng các công cụ tài chính khác", "645902266": "EUR/NZD", "647039329": "Yêu cầu giấy tờ xác thực địa chỉ", "647745382": "Danh sách Đầu vào {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "Trong ví dụ dưới đây, giá mở cửa được chọn sau đó được gán cho một biến được gọi là \"op\".", "666724936": "Vui lòng nhập số ID hợp lệ.", "672008428": "ZEC/USD", + "672731171": "Non-EU USD accounts", "673915530": "Thẩm quyền và sự chọn lựa luật pháp", "674973192": "Sử dụng mật khẩu này để đăng nhập vào các tài khoản Deriv MT5 của bạn trên máy tính, trang web và các ứng dụng điện thoại.", "676159329": "Không thể đổi về tài khoản mặc định.", @@ -613,6 +625,7 @@ "692354762": "Vui lòng nhập {{document_name}}. {{example_format}} của bạn", "693396140": "Hủy giao dịch (hết hạn)", "694035561": "Giao dịch quyền chọn cấp số nhân", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "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ố căn cước công dân", @@ -624,8 +637,8 @@ "701647434": "Tìm kiếm chuỗi", "702451070": "Căn cước công dân (Không ảnh)", "702561961": "Thay đổi giao diện", + "705262734": "Your Wallets are ready", "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", "706755289": "Khung này thực hiện các hàm lượng giác.", "706960383": "Chúng tôi sẽ đề nghị mua hợp đồng của bạn ở mức giá này nếu bạn chọn bán nó trước khi hết hạn. Đề nghị mua này dựa trên một số yếu tố, chẳng hạn như giá giao ngay hiện tại, thời gian, v. v. Tuy nhiên, chúng tôi sẽ không chấp nhận hợp đồng nếu thời gian còn lại dưới 60 giây.", @@ -644,6 +657,7 @@ "720293140": "Đăng xuất", "720519019": "Lấy lại mật khẩu", "721011817": "- Tăng số đầu tiên lên luỹ thừa của số thứ hai", + "722797282": "EU-regulated USD accounts", "723045653": "Bạn sẽ đăng nhập vào tài khoản Deriv của mình bằng địa chỉ email này.", "723961296": "Quản lý mật khẩu", "724203548": "Bạn có thể gửi đơn khiếu nại của mình đến nền tảng <0>Giải quyết Tranh chấp Trực tuyến của Ủy ban Châu Âu (European Commission's Online Dispute Resolution - ODR). Điều này không áp dụng cho khách hàng Vương quốc Anh.", @@ -656,6 +670,7 @@ "734390964": "Số dư tài khoản không đủ", "734881840": "sai", "742469109": "Đặt lại số dư", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "Giao dịch CFD trên thị trường forex, chỉ số mô phỏng, tiền điện tử và hàng hóa với đòn bẩy cao.", "743623600": "Tài liệu tham khảo", "744110277": "Mảng Biên Bollinger (BBA)", @@ -688,7 +703,8 @@ "775679302": "{{pending_withdrawals}} lượt rút tiền đang chờ xử lý", "775706054": "Deriv có bán trading bot không?", "776085955": "Các chiến lược", - "781924436": "Chênh lệch mua/Chênh lệch bán", + "781924436": "Call Spread/Put Spread", + "782563319": "Add more Wallets", "783974693": "Tránh những năm gần đây", "784311461": "Trung bình biến thiên theo cấp số nhân (EMA)", "784583814": "Kết nối với máy tính của bạn", @@ -725,6 +741,7 @@ "818447476": "Đổi tài khoản?", "820877027": "Vui lòng xác thực danh tính của bạn", "821163626": "Bảo trì máy chủ diễn ra vào mỗi thứ Bảy đầu tiên của tháng từ 7 đến 10 giờ GMT. Dịch vụ có thể gián đoạn trong thời gian này.", + "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": "Một khung có thể chứa văn bản.", "824797920": "Danh sách trống?", "825042307": "Hãy thử lại", @@ -747,7 +764,6 @@ "836097457": "Tôi quan tâm đến trading nhưng có rất ít kinh nghiệm.", "837063385": "Không gửi các loại tiền tệ khác đến địa chỉ này.", "837066896": "Giấy tờ của bạn đang được xem xét, vui lòng đợi thêm từ 1 đến 3 ngày nữa.", - "839618971": "ĐỊA CHỈ", "839805709": "Để việc xác minh được dễ dàng, chúng tôi cần một bức ảnh có chất lượng tốt hơn", "840672750": "Nếu cách này không hiệu quả, hãy gỡ cài đặt và cài đặt lại ứng dụng MT5. Sau đó làm lại bước <0>2 và <0>3.", "841434703": "Vô hiệu hóa ngăn xếp", @@ -844,9 +860,9 @@ "943535887": "Vui lòng đóng các vị thế của bạn trong (các) tài khoản Deriv MT5 sau:", "944499219": "Số vị thế mở tối đa", "945532698": "Hợp đồng đã bán", + "945753712": "Back to Trader’s Hub", "946204249": "Chỉ đọc", "946841802": "Một nến trắng (hoặc xanh) cho biết giá mở thấp hơn giá đóng. Điều này thể hiện sự đi lên của giá thị trường.", - "946944859": "Nhấn vào nút phía dưới và chúng tôi sẽ gửi cho bạn một email kèm theo một đường link. Hãy truy cập qua đường link đó để xác nhận yêu cầu rút tiền của bạn.", "947046137": "Khoản tiền rút của bạn sẽ được xử lý trong vòng 24 giờ", "947363256": "Tạo danh sách", "947758334": "Phải có thông tin thành phố", @@ -950,6 +966,7 @@ "1050128247": "Tôi xác nhận rằng tôi đã xác minh thông tin chuyển khoản của đại lý thanh toán.", "1050844889": "Báo cáo", "1052779010": "Bạn đang sử dụng tài khoản thử nghiệm của mình", + "1052921318": "{{currency}} Wallet", "1053153674": "Chỉ số Jump 50", "1053159279": "Trình độ giáo dục", "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.", @@ -1010,6 +1027,7 @@ "1110102997": "Sao kê", "1112582372": "Khoảng thời gian", "1113119682": "K\u001dhung này cung cấp cho bạn giá trị nến đã chọn từ danh sách nến.", + "1113221217": "MT5 Swap-free", "1113292761": "Ít hơn 8MB", "1114679006": "Bạn đã tạo thành công bot của mình bằng một chiến lược đơn giản.", "1117281935": "Điều kiện bán (tùy chọn)", @@ -1036,6 +1054,7 @@ "1134879544": "Ví dụ của tài liệu bị lóa", "1138126442": "Forex: tài khoản tiêu chuẩn", "1139483178": "Kích hoạt ngăn xếp", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "Xu hướng là {{ direction_type }}", "1144028300": "Mảng Chỉ số Tiềm lực Tương đối (RSIA)", "1145927365": "Chạy các khung bên trong sau một số giây nhất định", @@ -1066,7 +1085,6 @@ "1174689133": "3. Thiết lập các thông số giao dịch của bạn và nhấn Chạy.", "1174748431": "Kênh thanh toán", "1175183064": "Vanuatu", - "1176926166": "Trải nghiệm giao dịch với các công cụ tài chính khác", "1177396776": "Nếu bạn chọn \"Châu Á Tăng\" (Asian Rise), hợp đồng quyền chọn của bạn sẽ sinh lời nếu giá tại tick cuối cùng cao hơn giá trung bình của các tick.", "1177723589": "Không có giao dịch để hiển thị", "1178582280": "Số hợp đồng bạn đã thua lỗ tính từ lần cuối bạn làm mới số liệu thông kê của mình.", @@ -1077,6 +1095,7 @@ "1181396316": "Khung này cung cấp cho bạn một số ngẫu nhiên từ trong phạm vi đã đặt", "1181770592": "\bLời/Lỗ từ việc bán", "1183007646": "- Loại hợp đồng: tên của loại hợp đồng như \u001dTăng, Giảm, Chạm, Không Chạm, v.v...", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "Đóng hợp đồng của bạn ngay bây giờ hoặc giữ nó hoạt động. Nếu bạn quyết định giữ, bạn có thể kiểm tra và đóng sau này trên ", "1188316409": "Để nhận tiền, hãy liên hệ đại lý thanh toán với các thông tin bên dưới", "1188980408": "5 phút", @@ -1094,12 +1113,14 @@ "1201773643": "số", "1203297580": "Khung này gửi một tin nhắn tới kênh Telegram.", "1204223111": "Trong ví dụ này, giá bắt đầu của một danh sách nến được gán vào một biến gọi là \"candle_list\".", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "Làm thế nào để ẩn thẻ của bạn?", "1206821331": "Lực lượng vũ trang", "1207152000": "Chọn một mẫu và thiết lập các thông số giao dịch của bạn.", "1208714859": "Với vị thế Short:", "1208729868": "Tick", "1208903663": "Mã không hợp lệ", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Bot đang khởi động", "1214893428": "Không thể tạo tài khoản tạm thời trên điện thoại. Vui lòng sử dụng máy tính để tạo một tài khoản mới.", "1216408337": "Tự kinh doanh", @@ -1112,6 +1133,7 @@ "1222521778": "Khiến cho việc rút và nạp tiền gặp khó khăn.", "1222544232": "Chúng tôi đã gửi cho bạn một email", "1225150022": "Số lượng tài sản", + "1226027513": "Transfer from", "1227074958": "phần ngẫu nhiên", "1227240509": "Cắt khoảng trống", "1228534821": "Một số đơn vị tiền tệ có thể không được các đại lý thanh toán ở quốc gia của bạn hỗ trợ.", @@ -1121,6 +1143,7 @@ "1232291311": "Mức rút tối đa còn lại", "1232353969": "Từ 0 đến 5 giao dịch trong 12 tháng qua", "1233300532": "Mức chi trả", + "1233376285": "Options & multipliers", "1234292259": "Nguồn tài sản", "1234764730": "Tải lên ảnh chụp màn hình tên và địa chỉ email của bạn từ phần thông tin cá nhân.", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "Sắp xếp các mục trong một danh sách nhất định, theo giá trị số hoặc bảng chữ cái và theo thứ tự tăng dần hoặc giảm dần.", "1281290230": "Chọn", "1282951921": "Chỉ Giảm", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "Nếu \"Thua\" được chọn, nó sẽ trả về \"Đúng\" nếu giao dịch cuối của bạn không thành công. Nếu không, nó sẽ trả về chuỗi rỗng.", "1286094280": "Rút tiền", "1286507651": "Đóng màn hình xác thực danh tính", @@ -1173,7 +1197,6 @@ "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Gọi ký quỹ", "1290525720": "Ví dụ: ", - "1291887623": "Tần suất giao dịch quyền chọn kỹ thuật số", "1291997417": "Hợp đồng sẽ hết hạn lúc 23:59:59 GMT vào ngày hết hạn đã chọn.", "1292188546": "Đặt lại mật khẩu nhà đầu tư Deriv MT5", "1292891860": "Thông báo Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (Bán)", "1329136554": "Chỉ số Jump 200", "1329325646": "Nội dung của khung này sẽ được gọi trên mỗi tick", + "1330479159": "Ready to upgrade?", "1331199417": "Vui lòng nhập đúng định dạng. ", "1331367811": "Số tài khoản khách hàng", "1332168410": "Tìm hiểu thêm", @@ -1257,7 +1281,6 @@ "1367023655": "Để đảm bảo khoản lỗ của bạn không vượt quá số tiền đặt cược, hợp đồng của bạn sẽ tự động đóng khi khoản lỗ của bạn bằng<0/>.", "1367488817": "4. Khởi động lại điều kiện giao dịch", "1367990698": "Chỉ số Biến động 10", - "1369709538": "Điều khoản sử dụng", "1370647009": "Tận hưởng mức giới hạn hàng ngày cao hơn trước", "1371193412": "Hủy", "1371555192": "Chọn đại lý thanh toán yêu thích và nhập số tiền muốn rút. Nếu đại lý thanh toán của bạn không có trong danh sách, <0>hãy tìm bằng số tài khoản của họ.", @@ -1319,6 +1342,7 @@ "1434767075": "Bắt đầu với Deriv Bot", "1434976996": "Thông báo", "1435363248": "\bKhung này chuyển đổi số giây kể từ Unix Epoch sang định dạng ngày và giờ như 2019-08-01 00:00:00.", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "Tiền nạp tối thiểu", "1437396005": "Thêm bình luận", "1438247001": "Một khách hàng chuyên nghiệp nhận được mức độ bảo vệ khách hàng thấp hơn do những điều sau đây.", @@ -1369,6 +1393,7 @@ "1476301886": "Tương tự SMA, khung này đưa ra toàn bộ đường SMA chứa danh sách tất cả các giá trị trong một khoảng thời gian nhất định.", "1478030986": "Tạo hoặc xóa mã thông báo API để giao dịch và rút tiền", "1480915523": "Bỏ qua", + "1481860194": "Your new Wallet(s)", "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": "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.", @@ -1389,6 +1414,7 @@ "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 gặp sự cố. Hãy làm mới để tiếp tục.", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (Mua)", "1509678193": "Đào tạo", @@ -1419,7 +1445,7 @@ "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", + "1548765374": "Verification of document number failed", "1549098835": "Tổng số tiền rút", "1551172020": "Giỏ AUD", "1552162519": "Xem hướng dẫn", @@ -1449,6 +1475,7 @@ "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.", "1577612026": "Chọn một thư mục", + "1577879664": "<0>Your Wallets are ready", "1579839386": "App store", "1580498808": "Phát hiện nhiều khuôn mặt", "1584109614": "Danh sách chuỗi tick", @@ -1502,9 +1529,11 @@ "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ố.", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "Bot đã gặp lỗi khi chạy.", "1648938920": "Netherlands 25", "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.", + "1650963565": "Introducing Wallets", "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ỏ", @@ -1517,18 +1546,18 @@ "1655627840": "VIẾT HOA", "1656155124": "Gửi lại sau <0 /> giây", "1658954996": "Người vận hành nhà máy và xưởng lắp ráp", - "1659074761": "Đặt lại lệnh bán", + "1659074761": "Reset Put", "1659352235": "Thêm tài khoản Deriv MT5 CFD của bạn, trực thuộc Deriv Investments (Europe) Limited, được quản lý bởi Malta Financial Services Authority (MFSA) (giấy phép số IS/70156).", "1665272539": "Lưu ý: Bạn không thể đăng nhập vào tài khoản của mình cho đến ngày đã chọn.", "1665738338": "Số dư", "1665756261": "Đi tới live chat", + "1666783057": "Upgrade now", "1668138872": "Sửa đổi cài đặt tài khoản", "1670016002": "Cấp số nhân: {{ multiplier }}", "1670426231": "Thời gian kết thúc", "1671232191": "Bạn đã đặt các giới hạn sau:", "1674163852": "Bạn có thể chọn thời điểm hết hạn hợp đồng bằng cách đặt thời hạn hoặc đặt điểm thời gian kết thúc.", "1675030608": "Để tạo tài khoản này, trước tiên, chúng tôi cần bạn gửi lại giấy tờ xác thực địa chỉ của mình.", - "1675289747": "Chuyển sang tài khoản thực", "1676549796": "Dynamic Leverage", "1677027187": "Forex", "1677990284": "Ứng dụng của tôi", @@ -1556,6 +1585,7 @@ "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.", "1704656659": "Bạn có bao nhiêu kinh nghiệm giao dịch CFD?", "1708413635": "Cho tài khoản {{currency_name}} {{currency}} của bạn", + "1709293836": "Wallet balance", "1709401095": "Giao dịch CFD trên Deriv X với các thị trường tài chính và các chỉ số mô phỏng của chúng tôi.", "1709859601": "Thời gian thoát", "1710662619": "Nếu bạn có ứng dụng, hãy khởi chạy ứng dụng để bắt đầu giao dịch.", @@ -1570,6 +1600,7 @@ "1719248689": "EUR/GBP/USD", "1720451994": "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 pháp định và tài khoản tiền điện tử Deriv của bạn.", "1720968545": "Tải ảnh hộ chiếu của bạn từ máy tính", + "1723069433": "Your new Wallet", "1723589564": "Trình bày số tối đa của những hợp đồng nổi bật có trong hồ sơ của bạn. Mỗi một dòng trong hồ sơ là một vị thế mở. Khi đã đạt đến mức tối đa, bạn sẽ không thể mở thêm vị thế mới mà không đóng các vị thế đang có trước.", "1724696797": "Bạn bị giới hạn chỉ được có một tài khoản tiền pháp định.", "1725958461": "Số tài khoản", @@ -1593,7 +1624,7 @@ "1740371444": "Thị trường cơ sở không được chọn", "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", - "1743679873": "Nếu bạn chọn <0>“Mua (Call)”, hợp đồng quyền chọn của bạn sẽ sinh lời một <1>khoản chi trả nếu <1>giá cuối cùng cao hơn <1>giá thực hiện vào <1>thời điểm hết hạn. Nếu không, hợp đồng quyền chọn của bạn sẽ không sinh lời.", + "1743679873": "Nếu bạn chọn <0>\"Call\", hợp đồng quyền chọn của bạn sẽ sinh lời một <1>khoản chi trả nếu <1>giá cuối cùng cao hơn <1>giá thực hiện vào <1>thời điểm hết hạn. Nếu không, hợp đồng quyền chọn của bạn sẽ không sinh lời.", "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 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", @@ -1680,7 +1711,7 @@ "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", + "1824292864": "Call", "1827607208": "Tệp chưa được tải lên.", "1828370654": "Onboarding", "1830520348": "Mật khẩu {{platform_name_dxtrade}}", @@ -1698,6 +1729,7 @@ "1842266423": "quay lại", "1842862156": "Chào mừng đến với bảng điều khiển Deriv X", "1843658716": "Nếu bạn chọn \"Chỉ Giảm\" (Only Downs), hợp đồng quyền chọn của bạn sẽ sinh lời nếu các tick tiếp theo sau giá vào giảm liên tiếp. Hợp đồng không sinh lời nếu giá bất kỳ tick nào cao hơn hoặc bằng với bất kỳ tick nào trước đó.", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(Tối thiểu: {{min_stake}} - Tối đa: {{max_payout}})", "1846266243": "Tài khoản thử nghiệm không có tính năng này.", "1846587187": "Bạn chưa chọn quốc gia cư trú của mình", @@ -1792,7 +1824,6 @@ "1924765698": "Nơi sinh*", "1926987784": "- iOS: Vuốt sang trái trên tài khoản và nhấn <0>Xóa.", "1928930389": "GBP/NOK", - "1929309951": "Nghề nghiệp", "1929694162": "So sánh tài khoản", "1930899934": "Tether", "1931659123": "Chạy trên mỗi tick", @@ -1807,6 +1838,7 @@ "1943440862": "Tính toán danh sách Bollinger Bands (BB) với một khoảng thời gian", "1944204227": "Khung này trả về số dư tài khoản hiện tại.", "1947527527": "1. Đường dẫn được gửi bởi bạn", + "1948044825": "MT5 Derived", "1948092185": "GBP/CAD", "1949719666": "Dưới đây là một số lý do có thể xảy ra:", "1950413928": "Gửi giấy tờ tùy thân", @@ -1875,6 +1907,7 @@ "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ờ.", + "2020104747": "Filter", "2020545256": "Bạn muốn đóng tài khoản?", "2021037737": "Vui lòng cập nhật thông tin của bạn để tiếp tục.", "2021161151": "Xem video này để tìm hiểu cách tạo một bot giao dịch trên Deriv Bot. Ngoài ra, bạn cũng có thể tham khảo bài đăng blog này về cách tạo một bot giao dịch.", @@ -1885,7 +1918,6 @@ "2027696535": "Thông tin thuế", "2028163119": "EOS/USD", "2029237955": "Labuan", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI là một công cụ phân tích kỹ thuật giúp bạn xác định xu hướng thị trường. Công cụ sẽ cung cấp cho bạn một giá trị từ 0 đến 100. Giá trị RSI từ 70 trở lên có nghĩa là tài sản bị mua quá mức và xu hướng hiện tại có thể đảo ngược, trong khi giá trị từ 30 trở xuống có nghĩa là tài sản đang bị bán quá mức.", "2030045667": "Tin nhắn", "2033648953": "Khung này cung cấp một giá trị nến được chỉ định trong khoảng thời gian đã chọn.", @@ -1919,6 +1951,7 @@ "2063812316": "Văn bản", "2063890788": "Đã huỷ", "2065278286": "Chênh lệnh giá", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "Giấy phép lái xe", "2070002739": "Không chấp nhận", "2070345146": "Khi mở một giao dịch CFD đòn bẩy.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. Nộp đơn khiếu nại", "2080553498": "3. Nhận ID chat sử dụng Telegram REST API (đọc thêm tại: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Đã bán cho: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "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ờ tùy chọn.", "2085387371": "Phải là số, chữ cái và ký tự đặc biệt . , '-", @@ -1966,7 +2000,6 @@ "2115223095": "Lỗ", "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": "Ví dụ đầu ra của ví dụ dưới đây là:", "2119710534": "Những câu hỏi thường gặp", "2121227568": "NEO/USD", @@ -1992,8 +2025,6 @@ "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", "2147244655": "Làm thế nào để nhập bot giao dịch của tôi vào Deriv Bot?", - "-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", "-931052769": "Nộp xác minh", "-1004605898": "Mẹo", "-1938142055": "Tài liệu đã được tải lên", @@ -2141,18 +2172,9 @@ "-179726573": "Chúng tôi đã nhận được bằng chứng về quyền sở hữu của bạn.", "-813779897": "Bằng chứng xác thực quyền sở hữu đã được thông qua.", "-638756912": "Che từ số thứ 7 đến số thứ 12 phần số thẻ ở mặt trước thẻ ghi nợ/thẻ tín dụng của bạn.", - "-2073934245": "Các dịch vụ giao dịch tài chính được cung cấp trên trang web này chỉ phù hợp cho những khách hàng chấp nhận khả năng mất tất cả số tiền họ đầu tư cũng như hiểu và có kinh nghiệm về các rủi ro liên quan đến việc mua bán hợp đồng tài chính. Các giao dịch hợp đồng tài chính có mức độ rủi ro cao. Nếu hợp đồng bạn mua khi hết hạn trở nên vô giá trị, bạn sẽ bị mất toàn bộ số tiền đầu tư, bao gồm cả phí bảo hiểm hợp đồng.", - "-1166068675": "Tài khoản của bạn sẽ được mở với {{legal_entity_name}}, được quản lý bởi UK Gaming Commission (UKGC), và sẽ tuân theo luật pháp của Đảo Man.", - "-975118358": "Tài khoản của bạn sẽ được mở với {{legal_entity_name}}, được quản lý bởi Malta Financial Services Authority (MFSA), và sẽ tuân theo luật pháp của Malta.", - "-680528873": "Tài khoản của bạn sẽ được mở với {{legal_entity_name}} và sẽ tuân theo luật pháp của Samoa.", - "-1125193491": "Thêm tài khoản", - "-2068229627": "Tôi hiện tại không phải là PEP, cũng như trong 12 tháng qua.", "-684271315": "OK", "-740157281": "Đánh giá kinh nghiệm trading", "-1720468017": "Để được cung cấp dịch vụ tới bạn, chúng tôi được yêu cầu phải thu thập thông tin từ bạn để đánh giá liệu một sản phẩm hoặc dịch vụ nhất định có phù hợp với bạn hay không.", - "-186841084": "Thay đổi email đăng nhập của bạn", - "-907403572": "Để thay đổi địa chỉ email của bạn, trước tiên bạn cần phải hủy liên kết địa chỉ email của bạn khỏi tài khoản {{identifier_title}} của bạn.", - "-1850792730": "Bỏ liên kết với {{identifier_title}}", "-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.", @@ -2206,11 +2228,6 @@ "-1725454783": "Thất bại", "-506510414": "Ngày và thời gian", "-1708927037": "Địa chỉ IP", - "-619126443": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}} và {{platform_name_trader}}.", - "-623760979": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}}, {{platform_name_trader}} và {{platform_name_go}}.", - "-459147994": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} và {{platform_name_ctrader}}.", - "-80717068": "Ứng dụng bạn đã liên kết với <0>mật khẩu Deriv của bạn:", - "-9570380": "Sử dụng mật khẩu {{platform_name_dxtrade}} để đăng nhập vào tài khoản {{platform_name_dxtrade}} của bạn trên trang web và ứng dụng di động.", "-2131200819": "Vô hiệu hóa", "-200487676": "Kích hoạt", "-1840392236": "Mã không đúng. Vui lòng thử lại.", @@ -2240,44 +2257,37 @@ "-378415317": "Cần có thông tin tỉnh/thành phố", "-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": "Hoàn thành thông tin địa chỉ của bạn", - "-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", - "-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": "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", "-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", - "-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": "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ử", "-1317824715": "Nhân viên vệ sinh và người giúp việc", "-1592729751": "Công nhân khai khoáng, xây dựng, sản xuất và vận chuyển", + "-1030759620": "Nhân viên chính phủ", "-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 từ đầu tư", "-777506574": "Bán tài sản", + "-654781670": "Tiểu học", + "-1717373258": "Cấp hai", + "-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ế", "-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.", @@ -2287,28 +2297,14 @@ "-212167954": "Mã số thuế không ở định dạng đúng.", "-621555159": "Thông tin nhận dạng", "-204765990": "Điều khoản sử dụng", - "-231863107": "Không", - "-870902742": "Bạn đã trading online bao nhiêu năm?", - "-1929477717": "Tôi có bằng đại học, chứng nhận chuyên môn và/hoặc kinh nghiệm làm việc liên quan đến các dịch vụ tài chính.", - "-1540148863": "Tôi đã tham dự các hội thảo, đào tạo và/hoặc hội thảo liên quan đến trading.", - "-922751756": "Chưa đầy một năm", - "-542986255": "Không có", - "-1337206552": "Theo hiểu biết của bạn, giao dịch CFD cho phép bạn", - "-456863190": "Mở vị thế về biến động giá của một tài sản với kết quả là lợi nhuận cố định hoặc không có gì cả.", - "-1314683258": "Đầu tư dài hạn với lợi nhuận được đảm bảo.", - "-1546090184": "Đòn bẩy ảnh hưởng đến giao dịch CFD như thế nào?", - "-1636427115": "Đòn bẩy giúp giảm thiểu rủi ro.", - "-800221491": "Đòn bẩy giúp đảm bảo lợi nhuận.", - "-811839563": "Đòn bẩy cho phép bạn mở các vị thế lớn chỉ với mức bỏ ra nhỏ và có thể dẫn đến tăng lợi nhuận hoặc lỗ.", - "-1185193552": "Tự động đóng giao dịch của bạn khi số lỗ bằng hoặc nhiều hơn một số tiền quy định, miễn là có đủ thanh khoản thị trường.", - "-1046354": "Tự động đóng giao dịch của bạn khi lợi nhuận bằng hoặc nhiều hơn một số tiền quy định, miễn là có đủ thanh khoản thị trường.", - "-1842858448": "Đảm bảo lợi nhuận cho giao dịch của bạn.", - "-860053164": "Khi giao dịch Cấp số nhân.", - "-1250327770": "Khi mua cổ phần của một công ty.", - "-1222388581": "Tất cả những điều trên.", "-477761028": "Voter ID", "-1466346630": "CPF", - "-1030759620": "Nhân viên chính phủ", + "-739367071": "Có việc làm", + "-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", "-612752984": "Đây là những giới hạn mặc định mà chúng tôi áp dụng cho tài khoản của bạn.", "-1598263601": "Để tìm hiểu thêm về giới hạn giao dịch và cách áp dụng, vui lòng đi tới <0>Trung tâm hỗ trợ.", "-1411635770": "Tìm hiểu thêm về các giới hạn tài khoản", @@ -2326,10 +2322,7 @@ "-1500958859": "Xác thực", "-1502578110": "Tài khoản của bạn đã được xác thực đầy đủ và mức giới hạn rút tiền của bạn đã được nâng lên.", "-1662154767": "một hóa đơn tiện ích mới đây (ví dụ: điện, nước, ga, điện thoại cố định, hoặc internet), sao kê ngân hàng, hoặc thư do chính phủ cấp với tên của bạn và địa chỉ này.", - "-190838815": "Chúng tôi cần thông tin này để xác minh. Nếu thông tin bạn cung cấp là giả hoặc không chính xác, bạn sẽ không thể gửi và rút tiền.", - "-223216785": "Dòng thứ hai của địa chỉ nhà*", "-594456225": "Dòng thứ hai của địa chỉ nhà", - "-1940457555": "Mã bưu chính/Mã ZIP*", "-1964954030": "Mã số bưu chính/Mã ZIP", "-516397235": "Hãy cẩn thận với những người bạn chia sẻ mã thông báo này. Bất kỳ ai có mã thông báo này đều có thể thực hiện các thao tác sau trên tài khoản của bạn", "-989216986": "Thêm tài khoản", @@ -2371,8 +2364,6 @@ "-1100235269": "Ngành nghề", "-684388823": "Tổng thu nhập ước tính", "-509054266": "Dự đoán doanh thu lợi nhuận", - "-601903492": "Kinh nghiệm giao dịch forex", - "-1012699451": "Kinh nghiệm giao dịch CFD", "-1588485629": "Ví dụ", "-1117345066": "Chọn loại giấy tờ", "-651192353": "Ví dụ:", @@ -2394,11 +2385,11 @@ "-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", "-1176889260": "Vui lòng chọn một loại giấy tờ.", - "-1926456107": "ID mà bạn nhập đã hết hạn.", - "-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", + "-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": "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.", + "-228284848": "We were unable to verify your ID with the details you provided.", "-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", @@ -2464,12 +2455,40 @@ "-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": "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.", + "-975118358": "Tài khoản của bạn sẽ được mở với {{legal_entity_name}}, được quản lý bởi Malta Financial Services Authority (MFSA), và sẽ tuân theo luật pháp của Malta.", + "-2073934245": "Các dịch vụ giao dịch tài chính được cung cấp trên trang web này chỉ phù hợp cho những khách hàng chấp nhận khả năng mất tất cả số tiền họ đầu tư cũng như hiểu và có kinh nghiệm về các rủi ro liên quan đến việc mua bán hợp đồng tài chính. Các giao dịch hợp đồng tài chính có mức độ rủi ro cao. Nếu hợp đồng bạn mua khi hết hạn trở nên vô giá trị, bạn sẽ bị mất toàn bộ số tiền đầu tư, bao gồm cả phí bảo hiểm hợp đồng.", + "-1125193491": "Thêm tài khoản", + "-2068229627": "Tôi hiện tại không phải là PEP, cũng như trong 12 tháng qua.", + "-186841084": "Thay đổi email đăng nhập của bạn", + "-907403572": "Để thay đổi địa chỉ email của bạn, trước tiên bạn cần phải hủy liên kết địa chỉ email của bạn khỏi tài khoản {{identifier_title}} của bạn.", + "-1850792730": "Bỏ liên kết với {{identifier_title}}", "-428335668": "Bạn sẽ cần phải đặt mật khẩu để hoàn tất quy trình.", + "-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", "-818898181": "Tên trong giấy tờ không khớp với hồ sơ Deriv của bạn.", "-310316375": "Địa chỉ trong giấy tờ không khớp với địa chỉ bạn đã nhập ở trên.", "-485368404": "Tài liệu được cấp hơn 6 tháng trước.", "-367016488": "Giấy tờ bị mờ. Tất cả thông tin phải rõ ràng và có thể đọc được.", "-1957076143": "Giấy tờ bị cắt. Tất cả thông tin phải rõ ràng và có thể thấy được.", + "-231863107": "Không", + "-870902742": "Bạn đã trading online bao nhiêu năm?", + "-1929477717": "Tôi có bằng đại học, chứng nhận chuyên môn và/hoặc kinh nghiệm làm việc liên quan đến các dịch vụ tài chính.", + "-1540148863": "Tôi đã tham dự các hội thảo, đào tạo và/hoặc hội thảo liên quan đến trading.", + "-922751756": "Chưa đầy một năm", + "-542986255": "Không có", + "-1337206552": "Theo hiểu biết của bạn, giao dịch CFD cho phép bạn", + "-456863190": "Mở vị thế về biến động giá của một tài sản với kết quả là lợi nhuận cố định hoặc không có gì cả.", + "-1314683258": "Đầu tư dài hạn với lợi nhuận được đảm bảo.", + "-1546090184": "Đòn bẩy ảnh hưởng đến giao dịch CFD như thế nào?", + "-1636427115": "Đòn bẩy giúp giảm thiểu rủi ro.", + "-800221491": "Đòn bẩy giúp đảm bảo lợi nhuận.", + "-811839563": "Đòn bẩy cho phép bạn mở các vị thế lớn chỉ với mức bỏ ra nhỏ và có thể dẫn đến tăng lợi nhuận hoặc lỗ.", + "-1185193552": "Tự động đóng giao dịch của bạn khi số lỗ bằng hoặc nhiều hơn một số tiền quy định, miễn là có đủ thanh khoản thị trường.", + "-1046354": "Tự động đóng giao dịch của bạn khi lợi nhuận bằng hoặc nhiều hơn một số tiền quy định, miễn là có đủ thanh khoản thị trường.", + "-1842858448": "Đảm bảo lợi nhuận cho giao dịch của bạn.", + "-860053164": "Khi giao dịch Cấp số nhân.", + "-1250327770": "Khi mua cổ phần của một công ty.", + "-1222388581": "Tất cả những điều trên.", "-1515286538": "Vui lòng nhập số của giấy tờ của bạn. ", "-1694758788": "Nhập số của giấy tờ của bạn", "-1458676679": "Bạn nên nhập từ 2 - 50 ký tự.", @@ -2479,6 +2498,8 @@ "-1437017790": "Thông tin tài chính", "-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.", "-39038029": "Kinh nghiệm giao dịch", + "-601903492": "Kinh nghiệm giao dịch forex", + "-1012699451": "Kinh nghiệm giao dịch CFD", "-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", "-1743024217": "Chọn ngôn ngữ", @@ -2489,6 +2510,11 @@ "-536187647": "Xác nhận thu hồi quyền truy cập?", "-1357606534": "Cấp phép", "-570222048": "Hủy bỏ truy cập", + "-80717068": "Ứng dụng bạn đã liên kết với <0>mật khẩu Deriv của bạn:", + "-340060402": "Your Deriv X password is for logging in to your Deriv X accounts on the web and mobile apps.", + "-619126443": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}} và {{platform_name_trader}}.", + "-623760979": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}}, {{platform_name_trader}} và {{platform_name_go}}.", + "-459147994": "Sử dụng <0>mật khẩu Deriv để đăng nhập vào {{brand_website_name}}, {{platform_name_go}}, {{platform_name_trader}}, {{platform_name_smarttrader}}, {{platform_name_dbot}} và {{platform_name_ctrader}}.", "-1526404112": "Hóa đơn tiện ích: hóa đơn điện, nước, gas hoặc điện thoại cố định.", "-537552700": "Hợp đồng thuê nhà: hợp đồng hiện tại hợp lệ.", "-890084320": "Lưu và gửi", @@ -2510,11 +2536,20 @@ "-362324454": "Hàng hóa", "-1071336803": "Nền tảng", "-820028470": "Quyền. & Cấp số nhân", - "-1255879419": "Trader's Hub", + "-1186807402": "Chuyển khoản", + "-224804428": "Giao dịch", + "-470018967": "Đặt lại số dư", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "Thiết lập lại", "-213142918": "Chức năng nạp và rút tiền tạm thời không khả dụng ", - "-224804428": "Giao dịch", - "-1186807402": "Chuyển khoản", "-1308346982": "Mô phỏng", "-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", @@ -2525,15 +2560,29 @@ "-81256466": "Bạn cần tài khoản Deriv để tạo 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", "-1884966862": "Tạo thêm nhiều loại tài khoản Deriv MT5 ở nhiều khu vực pháp lý khác nhau.", - "-145462920": "Deriv cTrader", "-982095728": "Tạo", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>Tuyên bố từ chối trách nhiệm theo luật châu Âu: CFD là công cụ giao dịch phức tạp và có nguy cơ mất tiền nhanh chóng do đòn bẩy. <0>73% tài khoản nhà đầu tư cá nhân 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.", "-1277942366": "Tổng tài sản", + "-1255879419": "Trader's Hub", "-493788773": "Không thuộc châu Âu", "-673837884": "CHÂU ÂU", "-230566990": "Các giấy tờ bạn gửi sau đây không vượt qua quy trình kiểm tra của chúng tôi:", "-846812148": "Giấy tờ xác thực địa chỉ.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "Quy định cho những nước không thuộc châu Âu", "-643108528": "Quy định cho những nước thuộc và không thuộc châu Âu", + "-979459594": "Buy/Sell", + "-494667560": "Giao dịch", + "-679691613": "Quảng cáo của tôi", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "Tài khoản Cấp số nhân", "-744999940": "Tài khoản Deriv", @@ -2543,9 +2592,20 @@ "-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.", "-1173266642": "Tài khoản có thể giao dịch CFD trên nền tảng giao dịch nhiều tính năng.", - "-1290112064": "Deriv EZ", "-1453519913": "Giao dịch CFD trên nền tảng dễ sử dụng với tất cả các loại tài sản yêu thích của bạn.", "-2051096382": "Nhận các khoản chi trả bằng cách dự đoán đúng biến động 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 đầu tư ban đầu với giao dịch <1>Cấp số nhân.", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-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", @@ -2556,7 +2616,21 @@ "-951876657": "Nạp tiền vào tài khoản của bạn", "-1945421757": "Khi bạn đã có tài khoản, nhấp vào “Nạp” hoặc “Chuyển” để nạp tiền vào tài khoản", "-1965920446": "Bắt đầu giao dịch", - "-33612390": "<0>Tuyên bố từ chối trách nhiệm theo luật châu Âu: CFD là công cụ giao dịch phức tạp và có nguy cơ mất tiền nhanh chóng do đòn bẩy. <0>73% tài khoản nhà đầu tư cá nhân 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.", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-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}}", @@ -2703,6 +2777,7 @@ "-1707299138": "Địa chỉ ví tiền {{currency_symbol}} của bạn", "-38063175": "Ví tiền {{account_text}}", "-705272444": "Tải lên giấy tờ để xác minh danh tính của bạn", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "Hành động này là để bảo vệ tài khoản của bạn khỏi bị rút tiền trái phép.", "-130833284": "Xin lưu ý rằng giới hạn rút tiền tối đa và tối thiểu của bạn không cố định. Chúng thay đổi do sự biến động cao của tiền điện tử.", "-1531269493": "Chúng tôi sẽ gửi email cho bạn sau khi giao dịch của bạn đã được xử lý.", @@ -2721,7 +2796,7 @@ "-1127399675": "Xuống", "-768425113": "Không Chạm", "-1163058241": "Ở giữa", - "-1354485738": "Đặt lại quyền mua", + "-1354485738": "Reset Call", "-376148198": "Chỉ Lên", "-1337379177": "Tick cao", "-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.", @@ -2859,6 +2934,30 @@ "-1016171176": "Tài sản", "-621128676": "Loại giao dịch", "-447853970": "Ngưỡng thua lỗ", + "-155173714": "Hãy tạo một bot!", + "-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ì?", + "-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 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.", + "-1149045595": "1. Sau khi nhấn Nhập, chọn Local và nhấp Tiếp tục.", + "-288041546": "2. Chọn tệp XML và nhấp Mở.", + "-2127548288": "3. Bot của bạn sẽ được tải một cách phù hợp.", + "-1311297611": "1. Sau khi nhấp Nhập, chọn Google Drive và nhấp Tiếp tục.", + "-1549564044": "Làm thế nào để cài đặt lại không gian làm việc?", + "-1127331928": "Trong Tạo Bot, nhấp Cài đặt lại trên thanh công cụ ở trên cùng. Thao tác này sẽ xóa không gian làm việc của bạn. Lưu ý rằng bất kỳ thay đổi nào chưa được lưu sẽ bị mất.", + "-1720444288": "Làm thế nào để kiểm soát tổn thất của tôi với Deriv Bot?", + "-1142295124": "Có một số cách để kiểm soát tổn thất của bạn với Deriv Bot. Dưới đây là một ví dụ đơn giản về cách bạn có thể thực hiện để kiểm soát mất mát trong chiến lược của bạn:", + "-986689483": "1. Tạo các biến sau:", + "-269910127": "3. Cập nhật số lãi/lỗ hiện tại với lợi nhuận từ hợp đồng gần nhất. Nếu hợp đồng gần nhất bị lỗ, giá trị của số lãi/lỗ hiện tại sẽ âm.", + "-1565344891": "Tôi có thể chạy Deriv Bot trên nhiều thẻ trong trình duyệt web của tôi không?", + "-90192474": "Có thể. Tuy nhiên, có những giới hạn với tài khoản của bạn, chẳng hạn như số lượng tối đa các vị thế có thể mở và tổng chi trả tối đa cho các vị thế mở. Vì vậy, bạn cần ghi nhớ những giới hạn này khi mở nhiều vị thế. Bạn có thể tìm thêm thông tin về các giới hạn này tại Cài đặt > Giới hạn tài khoản.", + "-213872712": "Không, chúng tôi không cung cấp giao dịch tiền điện tử trên Deriv Bot.", + "-2147346223": "Deriv Bot có mặt ở những quốc gia nào?", + "-352345777": "Các chiến lược nào là phổ biến nhất để giao dịch tự động?", + "-552392096": "3 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. Các chiến lược này đều đang có sẵn và chờ bạn tại Deriv Bot.", "-507620484": "Chưa lưu", "-764102808": "Google Drive", "-555886064": "Lời", @@ -2876,7 +2975,7 @@ "-1646497683": "Vòng lặp", "-251326965": "Tiện ích khác", "-934909826": "Tải chiến lược", - "-1692205739": "Nhập bot từ máy tính hoặc Google Drive của bạn, tạo từ đầu hoặc bắt đầu với một chiến lược nhanh.", + "-1692205739": "Tải bot lên từ máy tính hoặc Google Drive của bạn, hoặc tự tạo từ đầu hoặc bắt đầu với một chiến lược nhanh.", "-1545070554": "Xóa bot", "-1972599670": "Bot của bạn sẽ bị xóa vĩnh viễn khi chọn ", "-1692956623": "Có, xóa.", @@ -2927,7 +3026,7 @@ "-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", - "-1109392787": "Tìm hiểu cách tự tạo bot của bạn bằng chiến lược đơn giản.", + "-1109392787": "Tìm hiểu cách tự tạo bot của riêng mình bằng một chiến lược đơn giản.", "-1263822623": "Bạn có thể nhập bot từ thiết bị di động của mình 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.", "-563921656": "Hướng dẫn tạo Bot", "-1109191651": "Phải là số lớn hơn 0", @@ -2937,30 +3036,6 @@ "-1823621139": "Chiến lược nhanh", "-1778025545": "Bạn đã nhập bot thành công.", "-1519425996": "Không tìm thấy kết quả \"{{ faq_search_value }}”", - "-155173714": "Hãy tạo một bot!", - "-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ì?", - "-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 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.", - "-1149045595": "1. Sau khi nhấn Nhập, chọn Local và nhấp Tiếp tục.", - "-288041546": "2. Chọn tệp XML và nhấp Mở.", - "-2127548288": "3. Bot của bạn sẽ được tải một cách phù hợp.", - "-1311297611": "1. Sau khi nhấp Nhập, chọn Google Drive và nhấp Tiếp tục.", - "-1549564044": "Làm thế nào để cài đặt lại không gian làm việc?", - "-1127331928": "Trong Tạo Bot, nhấp Cài đặt lại trên thanh công cụ ở trên cùng. Thao tác này sẽ xóa không gian làm việc của bạn. Lưu ý rằng bất kỳ thay đổi nào chưa được lưu sẽ bị mất.", - "-1720444288": "Làm thế nào để kiểm soát tổn thất của tôi với Deriv Bot?", - "-1142295124": "Có một số cách để kiểm soát tổn thất của bạn với Deriv Bot. Dưới đây là một ví dụ đơn giản về cách bạn có thể thực hiện để kiểm soát mất mát trong chiến lược của bạn:", - "-986689483": "1. Tạo các biến sau:", - "-269910127": "3. Cập nhật số lãi/lỗ hiện tại với lợi nhuận từ hợp đồng gần nhất. Nếu hợp đồng gần nhất bị lỗ, giá trị của số lãi/lỗ hiện tại sẽ âm.", - "-1565344891": "Tôi có thể chạy Deriv Bot trên nhiều thẻ trong trình duyệt web của tôi không?", - "-90192474": "Có thể. Tuy nhiên, có những giới hạn với tài khoản của bạn, chẳng hạn như số lượng tối đa các vị thế có thể mở và tổng chi trả tối đa cho các vị thế mở. Vì vậy, bạn cần ghi nhớ những giới hạn này khi mở nhiều vị thế. Bạn có thể tìm thêm thông tin về các giới hạn này tại Cài đặt > Giới hạn tài khoản.", - "-213872712": "Không, chúng tôi không cung cấp giao dịch tiền điện tử trên Deriv Bot.", - "-2147346223": "Deriv Bot có mặt ở những quốc gia nào?", - "-352345777": "Các chiến lược nào là phổ biến nhất để giao dịch tự động?", - "-552392096": "3 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. Các chiến lược này đều đang có sẵn và chờ bạn tại Deriv Bot.", "-418247251": "Tải xuống nhật ký của bạn.", "-2123571162": "Tải", "-870004399": "<0>Đã mua: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "Vô hiệu hóa tài khoản", "-1837059346": "Mua/Bán", "-1845037007": "Trang của nhà quảng cáo", - "-494667560": "Giao dịch", - "-679691613": "Quảng cáo của tôi", "-821418875": "Trader", "-679102561": "Thông tin hợp đồng", "-430118939": "Chính sách khiếu nại", @@ -3082,7 +3155,6 @@ "-430041639": "Giấy tờ xác thực địa chỉ của bạn không vượt qua kiểm tra xác minh của chúng tôi và chúng tôi đã đặt một số hạn chế đối với tài khoản của bạn. Vui lòng gửi lại giấy tờ xác thực địa chỉ của bạn.", "-87177461": "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 tiền.", "-904632610": "Đặt lại số dư", - "-470018967": "Đặt lại số dư", "-156611181": "Vui lòng hoàn thành đánh giá tài chính trong cài đặt tài khoản để mở khóa.", "-1925176811": "Không thể xử lý rút tiền trong thời điểm này", "-980696193": "Bạn 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.", @@ -3107,12 +3179,12 @@ "-577279362": "Vui lòng gửi giấy tờ xác thực danh tính của bạn để xác minh tài khoản và tiếp tục giao dịch.", "-197134911": "Giấy tờ xác thực danh tính của bạn đã hết hạn", "-152823394": "Giấy tờ xác thực danh tính của bạn đã hết hạn. Vui lòng gửi giấy tờ xác thực danh tính mới để xác minh tài khoản của bạn và tiếp tục giao dịch.", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "Làm theo các bước hướng dẫn đơn giản này để sửa lỗi.", "-2142540205": "Đị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.", "-482715448": "Đi đến Thông tin cá nhân", "-2072411961": "Giấy tờ xác thực địa chỉ của bạn đã được chấp thuận", "-384887227": "Cập nhật địa chỉ trong hồ sơ của bạn.", - "-448961363": "không thuộc châu Âu", "-1998049070": "Nếu bạn đồng ý cho việc sử dụng cookies của chúng tôi, nhấp vào Chấp nhận. Để biết thêm thông tin <0>xem quy định.", "-402093392": "Thêm tài khoản Deriv", "-1721181859": "Bạn cần một tài khoản {{deriv_account}}", @@ -3125,7 +3197,6 @@ "-650505513": "Toàn màn hình", "-1823504435": "Xem thông báo", "-1954045170": "Không có loại tiền tệ nào được chỉ định", - "-583559763": "Menu", "-1591792668": "Giới hạn tài khoản", "-34495732": "Thông tin pháp lý", "-1496158755": "Đi tới Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "Ủy ban Tài chính chấp nhận kháng cáo trong 45 ngày sau ngày xảy ra vụ việc và chỉ sau khi trader đã cố gắng giải quyết vấn đề trực tiếp với công ty.", "-1825471709": "Một trải nghiệm giao dịch hoàn toàn mới trên nền tảng mạnh mẽ và dễ sử dụng.", "-981017278": "Giao dịch tự động ngay trong tầm tay. Không cần có kiến thức về lập trình.", + "-583559763": "Menu", "-778309978": "Liên kết bạn nhấp vào đã hết hạn. Hãy đảm bảo bạn nhấp vào liên kết trong email mới nhất trong hộp thư đến của bạn. Hoặc bạn có thể nhập email của bạn vào bên dưới và nhấp vào <0>Gửi lại email để có liên kết mới.", "-336222114": "Làm theo các bước đơn giản này để sửa lỗi:", "-1064116456": "Tìm kiếm nhà môi giới <0>Deriv Holdings (Guernsey) Limited và chọn.", @@ -3415,22 +3487,6 @@ "-1282933308": "Không {{barrier}}", "-968190634": "Bằng {{barrier}}", "-1747377543": "Dưới {{barrier}}", - "-256210543": "Không thể giao dịch vào lúc này.", - "-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.", - "-28115241": "Tài khoản này không có {{platform_name_trader}}", - "-453920758": "Đi tới bảng điều khiển {{platform_name_mt5}}", - "-402175529": "Lịch sử", - "-902712434": "Hủy giao dịch", - "-988484646": "Hủy giao dịch (đã thực hiện)", - "-444882676": "Hủy giao dịch (đang hoạt động)", - "-13423018": "ID đối chiếu", - "-2035315547": "Ngưỡng thấp", - "-1551639437": "Không có lịch sử", - "-1214703885": "Bạn vẫn chưa cập nhật chốt lời hoặc cắt lỗ", - "-504849554": "Thị trường sẽ mở của lại vào", - "-59803288": "Hãy thử giao dịch các chỉ số tổng hợp của chúng tôi. Chúng mô phỏng sự biến động của thị trường thực và mở cửa 24/7.", - "-1278109940": "Xem các thị trường đang mở", - "-694105443": "Thị trường này đã đóng cửa", "-1043795232": "Các vị thế gần đây", "-1511825574": "Lời/Lỗ:", "-726626679": "Lời/lỗ tiềm năng:", @@ -3455,21 +3511,15 @@ "-1435392215": "Giới thiệu về việc hủy giao dịch", "-2017825013": "Đã hiểu", "-1192773792": "Không hiển thị lại", + "-902712434": "Hủy giao dịch", "-1280319153": "Hủy giao dịch của bạn bất cứ lúc nào trong một khung thời gian đã chọn. Được tự động kích hoạt nếu giao dịch của bạn đạt đến mức dừng trong khung thời gian đã chọn.", "-471757681": "Quản lý rủi ro", "-843831637": "Cắt lỗ", "-771725194": "Hủy giao dịch", "-338707425": "Thời lượng tối thiểu là 1 ngày", "-1003473648": "Thời lượng: {{duration}} ngày", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "Khoản chi trả khi hết hạn bằng với khoản chi trả của mỗi điểm nhân với chênh lệch giữa giá cuối cùng và giá thực hiện.", "-1527492178": "Tính năng mua bị khóa", "-725375562": "Bạn có thể khóa/mở khóa nút mua trong phần Cài đặt", - "-774638412": "Số tiền đầu tư phải từ {{min_stake}} {{currency}} đến {{max_stake}} {{currency}}", - "-1358367903": "Mức cược", - "-434270664": "Giá hiện tại", - "-1956787775": "Giá ngưỡng:", - "-1513281069": "Ngưỡng 2", "-390994177": "Nên ở giữa {{min}} và {{max}}", "-1804019534": "Ngày hết hạn: {{date}}", "-2055106024": "Chuyển đổi giữa cài đặt thời lượng nâng cao và đơn giản", @@ -3481,9 +3531,10 @@ "-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ẽ tự động đóng ở mức giá tài sản hiện có gần nhất.", "-339236213": "Cấp số nhân", "-2131851017": "Tốc độ tăng trưởng", - "-1763848396": "Bán", + "-1763848396": "Put", "-194424366": "trên", "-857660728": "Giá thực hiện", + "-1358367903": "Mức cược", "-1386326276": "Cần có mức ngưỡng.", "-1418742026": "Ngưỡng cao hơn phải cao hơn ngưỡng thấp.", "-92007689": "Ngưỡng thấp hơn phải \bthấp hơn ngưỡng cao.", @@ -3491,6 +3542,21 @@ "-1975910372": "Số phút phải từ 0 đến 59.", "-866277689": "Thời điểm kết thúc hợp đồng không thể trong quá khứ.", "-1455298001": "Bây giờ", + "-256210543": "Không thể giao dịch vào lúc này.", + "-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.", + "-28115241": "Tài khoản này không có {{platform_name_trader}}", + "-453920758": "Đi tới bảng điều khiển {{platform_name_mt5}}", + "-402175529": "Lịch sử", + "-988484646": "Hủy giao dịch (đã thực hiện)", + "-444882676": "Hủy giao dịch (đang hoạt động)", + "-13423018": "ID đối chiếu", + "-2035315547": "Ngưỡng thấp", + "-1551639437": "Không có lịch sử", + "-1214703885": "Bạn vẫn chưa cập nhật chốt lời hoặc cắt lỗ", + "-504849554": "Thị trường sẽ mở của lại vào", + "-59803288": "Hãy thử giao dịch các chỉ số tổng hợp của chúng tôi. Chúng mô phỏng sự biến động của thị trường thực và mở cửa 24/7.", + "-1278109940": "Xem các thị trường đang mở", + "-694105443": "Thị trường này đã đóng cửa", "-439389714": "Chúng tôi đang khắc phục sự cố", "-770929448": "Đi tới {{platform_name_smarttrader}}", "-347156282": "Gủi bằng chứng", @@ -3537,6 +3603,8 @@ "-454245976": "Nếu bạn tin rằng giá thị trường sẽ giảm liên tục trong một khoảng thời gian cụ thể, hãy chọn vị thế <0>Short. Bạn sẽ nhận được một khoản chi trả vào thời điểm hết hạn nếu giá thị trường không chạm hoặc không vượt quá mức ngưỡng. Khoản chi trả của bạn sẽ tăng tỷ lệ thuận với khoảng cách giữa giá thị trường và ngưỡng nếu giá không vượt quá ngưỡng. Bạn sẽ bắt đầu kiếm được lợi nhuận khi khoản chi trả cho bạn cao hơn số tiền bạn đầu tư ban đầu. Nếu giá thị trường vượt quá mức ngưỡng, bạn sẽ không nhận được khoản chi trả nào.", "-351875097": "Số tick", "-729830082": "Thu gọn", + "-1669741470": "Khoản chi trả khi hết hạn bằng với khoản chi trả của mỗi điểm nhân với chênh lệch giữa giá cuối cùng và giá thực hiện.", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "MỚI!", "-993480898": "Tích lũy", "-45873457": "MỚI", @@ -3545,7 +3613,7 @@ "-1682624802": "Đó là tỷ lệ phần trăm của giá giao ngay trước đó. Tỷ lệ phần trăm dựa trên sự lựa chọn của bạn về chỉ số và tốc độ tăng trưởng.", "-1221049974": "Giá cuối cùng", "-1247327943": "Đây là giá giao ngay của tick cuối cùng vào lúc hết hạn.", - "-878534036": "Nếu bạn chọn quyền chọn “Mua (Call)\", hợp đồng quyền chọn của bạn sẽ sinh lời nếu giá cuối cùng cao hơn giá thực hiện vào thời điểm hết hạn. Nếu ngược lại, hợp đồng quyền chọn của bạn sẽ không sinh lời.", + "-878534036": "Nếu bạn chọn quyền chọn \"Call\", hợp đồng quyền chọn của bạn sẽ sinh lời nếu giá cuối cùng cao hơn giá thực hiện vào thời điểm hết hạn. Nếu ngược lại, hợp đồng quyền chọn của bạn sẽ không sinh lời.", "-1587076792": "Nếu bạn chọn quyền chọn “Bán (Put)\", hợp đồng quyền chọn của bạn sẽ sinh lời nếu giá cuối cùng thấp hơn giá thực hiện vào thời điểm hết hạn hợp đồng. Nếu ngược lại, hợp đồng quyền chọn của bạn sẽ không sinh lời.", "-1482134885": "Chúng tôi tính toán con số này dựa trên giá thực hiện và thời hạn hợp đồng bạn đã chọn.", "-1890561510": "Thời gian chốt", @@ -3557,6 +3625,10 @@ "-690963898": "Hợp đồng của bạn sẽ tự động đóng khi mức chi trả cho bạn đạt đến số tiền này.", "-511541916": "Hợp đồng của bạn sẽ tự động đóng khi đạt đến số tick này.", "-438655760": "<0>Lưu ý: Bạn có thể đóng giao dịch của mình bất cứ lúc nào. Hãy cẩn thận với rủi ro trượt giá.", + "-774638412": "Số tiền đầu tư phải từ {{min_stake}} {{currency}} đến {{max_stake}} {{currency}}", + "-434270664": "Giá hiện tại", + "-1956787775": "Giá ngưỡng:", + "-1513281069": "Ngưỡng 2", "-1683683754": "Long", "-1046859144": "<0>{{title}} Bạn sẽ nhận được một khoản chi trả nếu giá thị trường giữ nguyên {{price_position}}, không chạm hoặc vượt quá giá ngưỡng. Ngược lại, bạn sẽ không nhận được khoản chi trả nào cả.", "-1815023694": "trên mức ngưỡng", @@ -3593,7 +3665,7 @@ "-525321833": "1 ngày", "-1691868913": "Chạm/Không Chạm", "-151151292": "Châu Á", - "-1048378719": "Đặt lại Quyền Mua/ Đặt lại Quyền Bán", + "-1048378719": "Reset Call/Reset Put", "-1282312809": "Tick Cao/Thấp", "-1237186896": "Chỉ Tăng/Chỉ Giảm", "-529846150": "Giây", diff --git a/packages/translations/src/translations/zh_cn.json b/packages/translations/src/translations/zh_cn.json index e4e1a906decc..e6de5b92d3f2 100644 --- a/packages/translations/src/translations/zh_cn.json +++ b/packages/translations/src/translations/zh_cn.json @@ -24,7 +24,6 @@ "27731356": "账户暂时被禁用。请通过<0>实时聊天联系我们,重新启用存款和取款。", "27830635": "Deriv (V) 有限公司", "28581045": "添加真实 MT5 账户", - "30801950": "您的账户将通过{{legal_entity_name}} 开立, 并由马耳他博彩机构监管,以及受马耳他的法律管辖。", "33433576": "请使用电子钱包取款。", "35089987": "上传驾驶执照的正面和背面。", "41737927": "谢谢", @@ -60,11 +59,13 @@ "72500774": "请填写税务居住地.", "73086872": "您已自我禁止交易", "73326375": "最低值是市场在合约期间内达到的最低点。", + "74836780": "{{currency_code}} Wallet", "74963864": "小于", "76916358": "已达到提款限额。<0/>请上传您的身份和地址证明,以提高提款限额,并继续提款。", "76925355": "检查机器人的表现", "77945356": "使用移动应用程序随时随地交易.", "77982950": "普通期权允许通过购买 “看涨” 或 “看跌” 来预测标的资产的向上(看涨)或向下(看跌)走势。", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "无法找到页面", "82839270": "上传包含照片的护照页面。", "83202647": "折叠程序块", @@ -76,6 +77,7 @@ "90266322": "2. 与您新创建的Telegram 机器人开始聊天,并确保在继续下一步骤前给其发送消息。(例如,机器人你好!)", "91993812": "鞅策略于十八世纪由法国数学家Paul Pierre Levy推广,是用了百多年的经典交易技术。", "93154671": "1. 点击统计面板底部的重置。", + "93939827": "Cryptocurrency accounts", "96381225": "ID 验证失败", "98473502": "我们没有义务进行适当性测试, 也没有义务向您提供任何风险警告.", "98972777": "随机项目", @@ -83,6 +85,7 @@ "102226908": "字段不可为空", "108916570": "持续时间:{{duration}} 天", "109073671": "请使用您之前用于存款的电子钱包。确保电子钱包支持提款。<0>此处查看支持提款的电子钱包列表。", + "110822969": "One Wallet for all your transactions", "111215238": "远离直射光", "111718006": "结束日期", "111931529": "7天内最大总投注金额", @@ -215,7 +218,9 @@ "251882697": "谢谢!您的回复已记录到系统中。<0/><0/>请单击 “确定” 继续。", "254912581": "此程序块与指数平均数指标(EMA)相似,除此以外,它也根据输入列表和指定周期给您提供整个EMA线。", "256031314": "现金业务", + "256123827": "What happens to my trading accounts", "256602726": "如您关闭账户:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "交易评估", "260069181": "尝试加载URL时发生错误", @@ -250,8 +255,8 @@ "284527272": "反众数", "284772879": "合约", "284809500": "金融演示", + "285909860": "Demo {{currency}} Wallet", "287934290": "确认取消此交易?", - "289898640": "使用条款", "291744889": "<0>1. 交易参数:<0>", "291817757": "访问 Deriv 社区,了解 API、API 代币、Deriv API 的使用方法等。", "292491635": "如果您选择“止损”并指定限制亏损的金额,那么当您的亏损大于或与该金额等值时,您的头寸将自动平仓。您的损失可能大于您投入的金额,具体取决于收盘时的市场价格。", @@ -299,6 +304,7 @@ "344418897": "这些交易限制和自我禁止功能可帮助您控制花在 {{brand_website_name}} 的金钱和时间,并执行<0>负责任交易。", "345320063": "无效的时间戳", "345818851": "抱歉,发生了内部错误。点击上面的复选框再试一次。", + "346214602": "A better way to manage your funds", "347029309": "外汇:标准/微型手", "347039138": "循环 (2)", "347217485": "手机访问 Deriv MT5 时遇到困难?", @@ -353,6 +359,7 @@ "401345454": "前往 “教程” 选项卡操作。", "402343402": "由于服务器发生问题,一些{{platform}} 账户目前无法使用。请耐心配合,非常感谢。", "403456289": "简单移动平均线的公式是:", + "403608958": "Select a trading account or a Wallet", "404743411": "存款总额", "406359555": "合约细节", "406497323": "如需要,卖出您的有效合约(可选)", @@ -373,6 +380,7 @@ "427617266": "比特币", "428709688": "每个报告之间的首选时间间隔:", "431267979": "以下是出门时使用 Deriv 机器人的快速指南。", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "止盈: {{ currency }} {{ take_profit }}", "432519573": "文档已上传", @@ -453,12 +461,12 @@ "518955798": "7. 开机时运行", "520136698": "兴旺 500 指数", "521872670": "项目", - "522283618": "数字期权交易经验", "522703281": "可除以", "523123321": "-10 的指定数字的次方", "524459540": "如何创建变量?", "527329988": "这是100个最常用的密码", "529056539": "期权", + "530864956": "Deriv Apps", "530953413": "授权应用程序", "531114081": "3. 合约类型", "531675669": "欧元", @@ -473,10 +481,13 @@ "543915570": "外汇、股票、股票指数、加密货币、综合指数", "545476424": "提款总额", "549479175": "Deriv 乘数", + "549799607": "Go to LiveChat", "550589723": "只要当前入市现价保持在前一个现价的±{{tick_size_barrier}} 范围内,投注额将以每一跳动价的 {{growth_rate}}%增长。", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "了解交易限制的详细信息", "554135844": "编辑", "554410233": "这是10个最常用的密码", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "定义好了交易参数和交易期权以后,当达到特定条件时,您还能指示机器人购入合约。您可使用条件程序块和指示器来帮助机器人做决定,以实现此功能。", "555881991": "国民身份证号码单", "556264438": "时间间隔", @@ -552,6 +563,7 @@ "629395043": "所有增长率", "632398049": "此程序块给项目或语句分配空值。", "634219491": "您没有提供税务编号。法律和监管规定要求提供此信息。请到账户设置中的<0>个人资料,填写您最新的税务编号。", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.如果找不到和解机会,则投诉将进入由 DRC 处理的确定阶段。", "639382772": "请上传支持的文件类型。", "640596349": "您还未收到任何通知", @@ -562,7 +574,6 @@ "642546661": "从电脑上传执照的背面", "642995056": "电子邮件", "644150241": "上次清除统计记录至今的获利合约数。", - "645016681": "其它金融工具的交易频率", "645902266": "欧元/纽元", "647039329": "需要地址证明", "647745382": "输入列表 {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "下例中,先选定开盘价,然后分配予称为\"op\"的变量。", "666724936": "请输入有效的身份证号码。", "672008428": "大零币/美元", + "672731171": "Non-EU USD accounts", "673915530": "管辖和法律规定", "674973192": "用此密码登录桌面、网络和手机应用上的 Deriv MT5 账户。", "676159329": "无法转换至默认账户。", @@ -613,6 +625,7 @@ "692354762": "请输入 {{document_name}}。 {{example_format}}", "693396140": "交易取消(已过期)", "694035561": "交易期权乘数", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- 开市时间:开市时间戳", "697630556": "此市场目前已关闭。", "698037001": "国民身份证号码", @@ -624,8 +637,8 @@ "701647434": "搜索字串", "702451070": "国民身份证(无照片)", "702561961": "更改主题", + "705262734": "Your Wallets are ready", "705299518": "接下来,上传包含照片的护照页面。", - "706413212": "要访问收银台,您已在使用 {{regulation}} {{currency}} ({{loginid}}) 账户。", "706727320": "二元期权交易频率", "706755289": "此程序块执行三角函数运算。", "706960383": "如果选择在合约到期前卖出,我们会提出以这个价格买入合约。这基于几个因素,如当前的现货价格、持续时间等。然而,如果剩余期限低于60秒,我们将不提供合约价值。", @@ -644,6 +657,7 @@ "720293140": "注销", "720519019": "重置密码", "721011817": "- 将首个数字作为第二数字的次方", + "722797282": "EU-regulated USD accounts", "723045653": "您将使用此电子邮件地址登录 Deriv 账户。", "723961296": "管理密码", "724203548": "您可以将投诉提呈到<0>欧洲委员会的在线争议解决(ODR)平台。英国客户不适用。", @@ -656,6 +670,7 @@ "734390964": "余额不足", "734881840": "假", "742469109": "重置余额", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "通过高杠杆率进行外汇、衍生指数、加密货币和大宗商品的差价合约交易。", "743623600": "参考", "744110277": "布林线数组(BBA)", @@ -689,6 +704,7 @@ "775706054": "交易机器人有卖吗?", "776085955": "策略", "781924436": "买权价差/卖权价差", + "782563319": "Add more Wallets", "783974693": "避免用最近数年的年份", "784311461": "指数移动平均线 (EMA)", "784583814": "与您的电脑连接", @@ -725,6 +741,7 @@ "818447476": "转换账户?", "820877027": "请验证您的身份证明", "821163626": "服务器维护时间为每月第一个星期六的格林尼治标准时间 7: 00 至 10: 00。在此期间,服务可能会中断。", + "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": "可含文本的程序块。", "824797920": "列表为空?", "825042307": "让我们再试一次", @@ -747,7 +764,6 @@ "836097457": "我对交易感兴趣,但很少经验。", "837063385": "请勿向该地址汇出其他货币。", "837066896": "您的文件正在审查中,请于1-3天后再查看。", - "839618971": "地址", "839805709": "为了顺利验证,我们需要更好的照片", "840672750": "如果还不行,请卸载并重新安装 MT5 应用程序。然后重新执行步骤<0>2和<0>3。", "841434703": "禁用堆栈", @@ -844,9 +860,9 @@ "943535887": "请将以下Deriv MT5账户平仓:", "944499219": "最大未平仓头寸", "945532698": "已卖出合约", + "945753712": "Back to Trader’s Hub", "946204249": "读取", "946841802": "白色(或绿色)烛形线表示开盘价低于平仓价。代表市价上升走势。", - "946944859": "点击以下按钮后,我们会发送含链接的邮件给您。请点击该链接以验证您的取款请求。", "947046137": "取款将于24小时内处理", "947363256": "创建列表", "947758334": "城市为必填项", @@ -950,6 +966,7 @@ "1050128247": "确认已经验证了付款代理的转账信息。", "1050844889": "报表", "1052779010": "您正在使用演示账户", + "1052921318": "{{currency}} Wallet", "1053153674": "上跳 50 指数", "1053159279": "教育水平", "1053556481": "提交投诉后,我们将向您发送电子邮件,确认收到投诉。", @@ -1010,6 +1027,7 @@ "1110102997": "声明", "1112582372": "间隔期限", "1113119682": "此程序块向您提供自烛形线图列表选定的烛形线值。", + "1113221217": "MT5 Swap-free", "1113292761": "少于 8MB", "1114679006": "已经使用简单的策略成功创建了机器人。", "1117281935": "卖出条件(可选)", @@ -1036,6 +1054,7 @@ "1134879544": "带有眩光的文档示例", "1138126442": "外汇:标准", "1139483178": "启用堆栈", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "方向为 {{ direction_type }}", "1144028300": "相对强度指标数组 (RSIA)", "1145927365": "在指定秒数后运行内部程序块", @@ -1066,7 +1085,6 @@ "1174689133": "3. 设置交易参数并点击运行。", "1174748431": "付款渠道", "1175183064": "瓦努阿图", - "1176926166": "其他金融工具的交易经验", "1177396776": "如果您选择“亚洲下跌”期权,当最新价格低于平均价格时,您将获得赔付。", "1177723589": "没有要显示的交易", "1178582280": "上次清除统计记录至今的亏损合约数。", @@ -1077,6 +1095,7 @@ "1181396316": "此程序块提供设置范围内的随机数字", "1181770592": "卖出的损益", "1183007646": "- 合约类型:合约类型名称如上涨、下跌、触及、未触及等。", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "立即关闭合约或继续运行。如果决定让它继续运行,可以稍后检查并关闭它 ", "1188316409": "要收取资金,请联系付款代理并提供以下详细信息", "1188980408": "5分钟", @@ -1094,12 +1113,14 @@ "1201773643": "数字", "1203297580": "此程序块将消息发送到Telegram通道。", "1204223111": "此例中,烛线列表中的开盘价被分配予称为\"candle_list\"的变量。", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "如何掩盖卡片?", "1206821331": "武装部队", "1207152000": "选择模板并设置交易参数。", "1208714859": "短仓:", "1208729868": "跳动点", "1208903663": "无效的令牌", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "机器人将开始", "1214893428": "当前无法通过移动设备创建账户。请使用您的计算机登录以创建新账户。", "1216408337": "个体经营", @@ -1112,6 +1133,7 @@ "1222521778": "存款和取款有困难。", "1222544232": "我们已给您发送电子邮件", "1225150022": "资产数目", + "1226027513": "Transfer from", "1227074958": "随机分数", "1227240509": "剪裁空间", "1228534821": "一些币种可能不受您的所在国的付款代理支持。", @@ -1121,6 +1143,7 @@ "1232291311": "最大取款余额", "1232353969": "过去12个月内0-5次交易", "1233300532": "赔付额", + "1233376285": "Options & multipliers", "1234292259": "财富来源", "1234764730": "从个人详细信息区上传姓名和电子邮件地址的屏幕截图。", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "在提供列表中将项目按其数字或字母值以升序或降序排序。", "1281290230": "选择", "1282951921": "只会持续下跌", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "如果选择“亏损”,假设您的最后一笔交易失败,将返回“真”。否则将返回空字符串。", "1286094280": "提款", "1286507651": "关闭身份验证屏幕", @@ -1173,7 +1197,6 @@ "1289146554": "英属维尔京群岛金融服务委员会", "1289646209": "追加保证金通知", "1290525720": "例如: ", - "1291887623": "数字期权交易频率", "1291997417": "合约将在选择到期日的格林威治标准时间23:59:59准时到期。", "1292188546": "重置 Deriv MT5 投资者密码", "1292891860": "通知Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (卖出)", "1329136554": "上跳 200 指数", "1329325646": "每个跳动点都呼叫这个程序块的内容", + "1330479159": "Ready to upgrade?", "1331199417": "请输入正确的格式。 ", "1331367811": "客户账号", "1332168410": "了解更多", @@ -1257,7 +1281,6 @@ "1367023655": "为确保您的亏损不超过您的投注金额,当亏损与<0/>等值时,您的合约将自动平仓。", "1367488817": "4. 重启交易条件", "1367990698": "波动率 10 指数", - "1369709538": "我们的使用条款", "1370647009": "享用更高的每日限额", "1371193412": "取消", "1371555192": "选择首选付款代理并输入提款金额。如果付款代理未列出,<0>请使用其账号进行搜索。", @@ -1319,6 +1342,7 @@ "1434767075": "开始使用 Deriv 机器人", "1434976996": "公告", "1435363248": "此程序块将自Unix纪元以来的秒数转换成日期和时间格式,例如2019-08-01 00:00:00。", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "最小存款额", "1437396005": "添加评语", "1438247001": "由于以下原因,专业客户会收到程度较低的客户端保护.", @@ -1369,6 +1393,7 @@ "1476301886": "与简单移动平均线相同,此程序块提供内含指定期间内所有数值列表的整个简单移动平均线。", "1478030986": "创建或删除用于交易和取款的 API 代币", "1480915523": "跳过", + "1481860194": "Your new Wallet(s)", "1481977420": "请帮忙验证您的取款请求。", "1483470662": "点击 “打开” 开始使用账户交易", "1484336612": "此程序块用于终止或继续循环,并可以放置在循环块内任何位置。", @@ -1389,6 +1414,7 @@ "1505420815": "未找到与搜索相符的付款代理", "1505898522": "下载堆栈", "1505927599": "服务器出现了问题。请刷新以继续。", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (买入)", "1509678193": "教育", @@ -1449,6 +1475,7 @@ "1577480486": "您的手机链接将于一小时后失效", "1577527507": "开立账户的原因是必填项.", "1577612026": "选择文件夹", + "1577879664": "<0>Your Wallets are ready", "1579839386": "应用商店", "1580498808": "发现多个面孔", "1584109614": "跳动点字符串列表", @@ -1502,9 +1529,11 @@ "1644703962": "正在寻找差价合约账户?前往Trader's Hub", "1644864436": "申请成为专业客户前,必须验证账户。<0>验证账户", "1644908559": "数字代码是必填项。", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "机器人运行时遇到错误。", "1648938920": "荷兰 25", "1649239667": "2. 在程序块菜单里可看到类别列表。程序块按这些类别分组。选择想要的程序块并拖到工作区。", + "1650963565": "Introducing Wallets", "1651513020": "显示每个间隔的剩余时间", "1651951220": "像“abcabcabc”这样的重复词比“abc”更难猜测", "1652366857": "获取和删除", @@ -1522,13 +1551,13 @@ "1665272539": "切记:在选定日期之前,您无法登录账户。", "1665738338": "余额", "1665756261": "前往实时聊天", + "1666783057": "Upgrade now", "1668138872": "账户设置修改", "1670016002": "乘数: {{ multiplier }}", "1670426231": "结束时间", "1671232191": "您已设置以下限制:", "1674163852": "通过设置期限或结束时间确定合约到期时间。", "1675030608": "要开立此账户首先需要重新提交地址证明。", - "1675289747": "转换至真实账户", "1676549796": "动态杠杆", "1677027187": "外汇", "1677990284": "我的应用程序", @@ -1556,6 +1585,7 @@ "1703091957": "作为我们必须履行,按照反洗钱立法要求的勤勉义务,我们会收集关于您的职业的信息。", "1704656659": "您在差价合约交易方面有多少经验?", "1708413635": "用于 {{currency_name}} ({{currency}}) 账户", + "1709293836": "Wallet balance", "1709401095": "在 Deriv X 使用金融市场和衍生指数交易差价合约。", "1709859601": "退市现价时间", "1710662619": "如有该应用程序,请启动并开始交易。", @@ -1570,6 +1600,7 @@ "1719248689": "欧元/英镑/美元", "1720451994": "Deriv 法定货币和 Deriv 加密货币账户之间的转账,我们将收取 2% 转账费或 {{minimum_fee}} {{currency}},以较高者为准。", "1720968545": "从电脑上传含照片的护照页面", + "1723069433": "Your new Wallet", "1723589564": "表示您的投资组合中未平仓合约的最大数量。您投资组合中的每一行都算作是一个未平仓头寸。一旦达到该最大值,您在开设新头寸之前需要先结束一个现有头寸。", "1724696797": "只能使用一个法定账户.", "1725958461": "账号", @@ -1698,6 +1729,7 @@ "1842266423": "返回", "1842862156": "欢迎来到 Deriv X 仪表板", "1843658716": "如果您选择“只会持续下跌”期权,只要入市现价后的价格持续下跌,您将获得赔付。如果期间内的价格有任何上涨或相等于之前的价格, 您将不会获得赔付。", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(最小: {{min_stake}} - 最大: {{max_payout}})", "1846266243": "演示账户不能使用此功能。", "1846587187": "您尚未选择居住国", @@ -1792,7 +1824,6 @@ "1924765698": "出生地*", "1926987784": "- iOS:在账户上向左轻扫,然后点击<0>删除。", "1928930389": "英镑/挪威克罗钠", - "1929309951": "就业状况", "1929694162": "账户比较", "1930899934": "Tether", "1931659123": "每一跳动点皆运行", @@ -1807,6 +1838,7 @@ "1943440862": "使用有期限列表计算布林线 (BB) 列表", "1944204227": "此程序块返回当前账户余额。", "1947527527": "1. 此链接是您发送的", + "1948044825": "MT5 Derived", "1948092185": "英镑/加拿大元", "1949719666": "以下是可能的原因:", "1950413928": "提交身份证明文件", @@ -1875,6 +1907,7 @@ "2014536501": "卡号", "2014590669": "变量 '{{variable_name}}' 无数值。请为变量 '{{variable_name}}' 设置数值以通知。", "2017672013": "请选择文件签发国.", + "2020104747": "Filter", "2020545256": "关闭账户?", "2021037737": "请更新您的详细资料以继续操作。", "2021161151": "观看此视频了解如何在 Deriv 机器人构建交易机器人。另外, 请查看这篇关于构建交易机器人的博客文章 。", @@ -1885,7 +1918,6 @@ "2027696535": "税务信息", "2028163119": "EOS/美元", "2029237955": "纳闽", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI是可帮助您确定市场趋势的技术分析工具。它将为您提供0到100之间的数值。RSI值大于等于70表示资产已超买,当前趋势可能会反转,而RSI值小于等于30则意味着资产超卖。", "2030045667": "消息", "2033648953": "此程序块提供选定时间间隔的特定烛形线值。", @@ -1919,6 +1951,7 @@ "2063812316": "文本声明", "2063890788": "已取消", "2065278286": "价差交易", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "驾驶执照", "2070002739": "不要接受", "2070345146": "开设杠杆差价合约交易时.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. 提交投诉", "2080553498": "3. 使用Telegram REST API获取聊天ID(更多信息:https://core.telegram.org/bots/api#getupdates)", "2080829530": "卖价: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "是,删除", "2084693624": "将代表日期/时间字符串的字符串转换为自大纪元以来的秒数。例如:2019年1月1日21:03:45 GMT+0800 将转换为1546347825。时间和时区偏移是可选项。", "2085387371": "必须是数字、字母和特殊字符 . , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "亏损", "2117165122": "1. 创建Telegram机器人并获取Telegram API令牌。在此处阅读关于Telegram中创建机器人功能的更多信息:https://core.telegram.org/bots#6-botfather", "2117489390": "{{ remaining }} 秒内自动更新", - "2118315870": "您的居住地是哪里?", "2119449126": "以下例子的输出示例将是:", "2119710534": "常见问题", "2121227568": "小蚁币/美元", @@ -1992,8 +2025,6 @@ "2146698770": "专家提示:您也可以点击并拖出所需的程序块", "2146892766": "二元期权交易经验", "2147244655": "如何将自己的交易机器人导入 Deriv 机器人?", - "-1232613003": "<0>验证失败。<1>为什么?", - "-2029508615": "<0>需要验证。<1>立即验证", "-931052769": "提交验证", "-1004605898": "提示", "-1938142055": "文档已上传", @@ -2141,18 +2172,9 @@ "-179726573": "已经收到了所有权证明。", "-813779897": "所有权证明验证已通过。", "-638756912": "将借记卡/信用卡正面显示的卡号的7至12位数字涂黑。", - "-2073934245": "本网站提供的金融交易服务仅适合这样的客户:能够接受全部投入资金亏损的可能性,了解购买金融合约的风险并具有相关经验。金融合约交易有很高的风险。如果购买的合约到期时一文不值,您将损失全部投资,包括合约费用。", - "-1166068675": "您的账户将通过 {{legal_entity_name}} 开立,并由英国博彩委员会(UKGC)监管,以及受马恩岛的法律管辖。", - "-975118358": "您的账户将通过{{legal_entity_name}} 开立, 并由马耳他金融服务机构 (MFSA) 监管,以及受马耳他的法律管辖。", - "-680528873": "您的账户将透过{{legal_entity_name}} 开立,并受萨摩亚的法律管辖。", - "-1125193491": "添加账户", - "-2068229627": "本人不是政治公众人士,而且在过去的12个月中,我未曾当过政治公众人士。", "-684271315": "确定", "-740157281": "交易经验评估", "-1720468017": "为了给您提供服务,我们必须向您获取信息,以便确定产品或服务是否适合您。", - "-186841084": "更改登录电子邮件", - "-907403572": "要更改电子邮件地址,首先需要取消 {{identifier_title}} 账户的电子邮件地址链接。", - "-1850792730": "与{{identifier_title}} 解除链接", "-307865807": "风险容忍警告", "-690100729": "是的,我了解须承担风险。", "-2010628430": "由于杠杆作用,差价合约和其他金融工具资金快速亏损的风险很高。您必须考虑自己是否了解差价合约和其他金融工具的运作方式,以及是否能够承担资金亏损的高风险。<0/><0/>如要继续,您必须确认了解自己的资本面临风险。", @@ -2206,11 +2228,6 @@ "-1725454783": "失败", "-506510414": "日期和时间", "-1708927037": "IP 地址", - "-619126443": "使用 <0>Deriv 密码登录 {{brand_website_name}} 和 {{platform_name_trader}}。", - "-623760979": "使用 <0>Deriv 密码登录 {{brand_website_name}}、{{platform_name_trader}} 和 {{platform_name_go}}。", - "-459147994": "使用 <0>Deriv 密码登录 {{brand_website_name}}、{{platform_name_go}}、{{platform_name_trader}}、{{platform_name_smarttrader}}、 {{platform_name_dbot}} 和 {{platform_name_ctrader}}。", - "-80717068": "与<0>Deriv 密码链接的应用:", - "-9570380": "用 {{platform_name_dxtrade}} 密码登录网络和手机应用的 {{platform_name_dxtrade}} 账户。", "-2131200819": "禁用", "-200487676": "启用", "-1840392236": "代码不正确。请重试。", @@ -2240,44 +2257,37 @@ "-378415317": "州/区是必填项", "-1497654315": "泽西邮政编码区的用户不可使用我们的账户和服务.", "-755626951": "完成您的地址资料", - "-584911871": "选择钱包货币", "-1461267236": "请选择货币", - "-1352330125": "货币", "-1027595143": "少于$25,000", "-40491332": "$25,000 - $50,000", "-1139806939": "$50,001 - $100,000", - "-626752657": "0-1 年", - "-532014689": "1-2 年", - "-1001024004": "3年以上", - "-790513277": "过去12个月内6-10次交易", - "-580085300": "过去12个月内11-39次交易", - "-654781670": "主要", - "-1717373258": "次要", "-996132458": "建筑", "-915003867": "健康", "-1430012453": "信息和通信技术", "-987824916": "科学 & 工程", "-146630682": "社会 & 文化", "-761306973": "制造", - "-739367071": "就业", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "大于$1,000,000", - "-2068544539": "受薪雇员", - "-531314998": "投资与分红", - "-1235114522": "养老金", - "-1298056749": "国家收益", - "-449943381": "储蓄和继承", "-1631552645": "专业人士", "-474864470": "个人护理、销售及服务员工", "-1129355784": "农业、林业和渔业工人", "-1242914994": "工艺、金属、电气和电子工人", "-1317824715": "清洁工和佣工", "-1592729751": "矿业、建筑业、制造业和运输工人", + "-1030759620": "政府官员", "-2137323480": "公司所有权", "-1590574533": "离婚协议", "-1667683002": "继承", "-1237843731": "投资收入", "-777506574": "财产出售", + "-654781670": "主要", + "-1717373258": "次要", + "-1156937070": "$500,001 - $1,000,000", + "-315534569": "大于$1,000,000", + "-2068544539": "受薪雇员", + "-531314998": "投资与分红", + "-1235114522": "养老金", + "-1298056749": "国家收益", + "-449943381": "储蓄和继承", "-1161338910": "名字是必填项.", "-1161818065": "姓氏长度须介于 2至50 个字符。", "-1281693513": "出生日期为必填项.", @@ -2287,28 +2297,14 @@ "-212167954": "税务识别号格式不正确。", "-621555159": "身份信息", "-204765990": "使用条款", - "-231863107": "否", - "-870902742": "在线交易方面有多少知识和经验?", - "-1929477717": "我拥有与金融服务相关的学位、专业认证和/或工作经验。", - "-1540148863": "我参加过与交易相关的研讨会、培训和/或工作室。", - "-922751756": "不到一年", - "-542986255": "没有", - "-1337206552": "据您了解,差价合约交易允许", - "-456863190": "对资产的价格走势开立头寸,结果是固定回报或毫无收益。", - "-1314683258": "进行长期投资以获得有保障的利润。", - "-1546090184": "杠杆如何影响差价合约交易?", - "-1636427115": "杠杆帮助降低风险。", - "-800221491": "杠杆保证能获得利润。", - "-811839563": "杠杆允许以交易价值的一小部分开立大额头寸,这可能会导致盈利或亏损增加。", - "-1185193552": "只要有足够的市场流动性,当亏损等于或超过指定金额时,就会自动平仓。", - "-1046354": "只要有足够的市场流动性,当利润等于或超过指定金额时,就会自动平仓。", - "-1842858448": "保证交易获利。", - "-860053164": "交易乘数时.", - "-1250327770": "购买公司股票时.", - "-1222388581": "以上全部.", "-477761028": "选民身份证", "-1466346630": "公积金", - "-1030759620": "政府官员", + "-739367071": "就业", + "-626752657": "0-1 年", + "-532014689": "1-2 年", + "-1001024004": "3年以上", + "-790513277": "过去12个月内6-10次交易", + "-580085300": "过去12个月内11-39次交易", "-612752984": "这些是适用于您账户的默认限制。", "-1598263601": "要了解有关交易限额及其实施方法的更多信息,请访问<0>帮助中心。", "-1411635770": "了解账户限制的详细信息", @@ -2326,10 +2322,7 @@ "-1500958859": "验证", "-1502578110": "您的账户已经得到完全验证,且您的取款限额已经取消。", "-1662154767": "近期的水电费账单(例如电费、水费、煤气费、固定电话费或互联网费),银行对账单或政府签发的带有您的姓名和地址的信件。", - "-190838815": "我们需要它进行验证。如果您提供的信息是虚假的或不正确的,您将无法存款和提款。", - "-223216785": "地址第二行*", "-594456225": "地址第二行", - "-1940457555": "邮政编码*", "-1964954030": "邮政编码", "-516397235": "与他人共享此代币要小心。拥有此代币的任何人都可以代表您的账户执行以下操作", "-989216986": "添加账户", @@ -2371,8 +2364,6 @@ "-1100235269": "职业领域", "-684388823": "估计净值", "-509054266": "预期的年交易额", - "-601903492": "外汇交易经验", - "-1012699451": "差价合约交易经验", "-1588485629": "示例", "-1117345066": "选择文件类型", "-651192353": "样本:", @@ -2395,10 +2386,10 @@ "-329713179": "确定", "-1176889260": "请选择文件类型.", "-1926456107": "提交的 ID 已过期。", - "-555047589": "您的身份证明文件似乎已过期。请用有效的文件重试。", + "-555047589": "身份证明文件似乎已过期。请用有效的文件重试。", "-841187054": "重试", "-2097808873": "无法根据您提供的信息验证 ID。 ", - "-228284848": "无法根据您提供的信息验证 ID。", + "-228284848": "无法根据提供的信息验证 ID。", "-1391934478": "ID 已验证。您还需提交地址证明。", "-118547687": "ID 验证已通过", "-200989771": "前往个人资料", @@ -2464,12 +2455,40 @@ "-142444667": "请单击邮件上的链接以更改 Deriv MT5 密码。", "-742748008": "查看电子邮件并点击邮件里的链接以继续操作。", "-84068414": "还是没有收到邮件?请通过<0>实时聊天与我们联系。", + "-975118358": "您的账户将通过{{legal_entity_name}} 开立, 并由马耳他金融服务机构 (MFSA) 监管,以及受马耳他的法律管辖。", + "-2073934245": "本网站提供的金融交易服务仅适合这样的客户:能够接受全部投入资金亏损的可能性,了解购买金融合约的风险并具有相关经验。金融合约交易有很高的风险。如果购买的合约到期时一文不值,您将损失全部投资,包括合约费用。", + "-1125193491": "添加账户", + "-2068229627": "本人不是政治公众人士,而且在过去的12个月中,我未曾当过政治公众人士。", + "-186841084": "更改登录电子邮件", + "-907403572": "要更改电子邮件地址,首先需要取消 {{identifier_title}} 账户的电子邮件地址链接。", + "-1850792730": "与{{identifier_title}} 解除链接", "-428335668": "必须设置密码以完成流程。", + "-1232613003": "<0>验证失败。<1>为什么?", + "-2029508615": "<0>需要验证。<1>立即验证", "-818898181": "文档中的姓名与 Deriv 个人资料不匹配。", "-310316375": "文件中的地址与上面输入的地址不符。", "-485368404": "文件签发日期超过 6 个月。", "-367016488": "文件模糊。所有信息必须清晰可见。", "-1957076143": "裁剪过的文件。所有信息必须清晰可见。", + "-231863107": "否", + "-870902742": "在线交易方面有多少知识和经验?", + "-1929477717": "我拥有与金融服务相关的学位、专业认证和/或工作经验。", + "-1540148863": "我参加过与交易相关的研讨会、培训和/或工作室。", + "-922751756": "不到一年", + "-542986255": "没有", + "-1337206552": "据您了解,差价合约交易允许", + "-456863190": "对资产的价格走势开立头寸,结果是固定回报或毫无收益。", + "-1314683258": "进行长期投资以获得有保障的利润。", + "-1546090184": "杠杆如何影响差价合约交易?", + "-1636427115": "杠杆帮助降低风险。", + "-800221491": "杠杆保证能获得利润。", + "-811839563": "杠杆允许以交易价值的一小部分开立大额头寸,这可能会导致盈利或亏损增加。", + "-1185193552": "只要有足够的市场流动性,当亏损等于或超过指定金额时,就会自动平仓。", + "-1046354": "只要有足够的市场流动性,当利润等于或超过指定金额时,就会自动平仓。", + "-1842858448": "保证交易获利。", + "-860053164": "交易乘数时.", + "-1250327770": "购买公司股票时.", + "-1222388581": "以上全部.", "-1515286538": "请输入文件号. ", "-1694758788": "输入文件号", "-1458676679": "您必须输入2-50个字符。", @@ -2479,6 +2498,8 @@ "-1437017790": "财务信息", "-70342544": "根据法律规定,我们有义务要求您提供财务信息。", "-39038029": "交易经验", + "-601903492": "外汇交易经验", + "-1012699451": "差价合约交易经验", "-1894668798": "其他交易工具经验", "-1026468600": "其他交易工具频率", "-1743024217": "选择语言", @@ -2489,6 +2510,11 @@ "-536187647": "确认撤消访问权限?", "-1357606534": "权限", "-570222048": "撤销访问权限", + "-80717068": "与<0>Deriv 密码链接的应用:", + "-340060402": "Deriv X 密码是用于登录网络和手机应用上的 Deriv X 账户。", + "-619126443": "使用 <0>Deriv 密码登录 {{brand_website_name}} 和 {{platform_name_trader}}。", + "-623760979": "使用 <0>Deriv 密码登录 {{brand_website_name}}、{{platform_name_trader}} 和 {{platform_name_go}}。", + "-459147994": "使用 <0>Deriv 密码登录 {{brand_website_name}}、{{platform_name_go}}、{{platform_name_trader}}、{{platform_name_smarttrader}}、 {{platform_name_dbot}} 和 {{platform_name_ctrader}}。", "-1526404112": "水电账单:电费、水费、煤气费或固定电话账单。", "-537552700": "房屋租赁协议:有效的现行协议。", "-890084320": "保存及提交", @@ -2510,11 +2536,20 @@ "-362324454": "大宗商品", "-1071336803": "平台", "-820028470": "期权 & 乘数", - "-1255879419": "Trader's Hub", + "-1186807402": "转账", + "-224804428": "交易", + "-470018967": "重置余额", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "重置", "-213142918": "暂时无法存款和取款 ", - "-224804428": "交易", - "-1186807402": "转账", "-1308346982": "衍生资产", "-1145604233": "使用模拟真实市场走势的衍生指数在 MT5 交易差价合约。", "-328128497": "金融", @@ -2525,15 +2560,29 @@ "-81256466": "需有 Deriv 账户才能开立差价合约账户。", "-699372497": "利用杠杆和低价差进行交易,以在成功交易时获得更高回报。<0>了解更多", "-1884966862": "获取更多具有不同类型和司法管辖区的 Deriv MT5 账户。", - "-145462920": "Deriv cTrader", "-982095728": "获取", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>欧盟法定免责声明:差价合约是复杂的工具,并且由于杠杆作用,资金迅速亏损的风险很高。<0>与此提供商交易差价合约时有73% 的零售投资者账户蒙受亏损。必须考虑自己是否了解差价合约的运作方式,以及是否能够承担资金亏损的高风险。", "-1277942366": "总资产", + "-1255879419": "Trader's Hub", "-493788773": "非欧盟", "-673837884": "欧盟", "-230566990": "提交的以下文件未通过检查:", "-846812148": "地址证明.", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "非欧盟法规", "-643108528": "非欧盟和欧盟法规", + "-979459594": "Buy/Sell", + "-494667560": "订单", + "-679691613": "我的广告", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "乘数账户", "-744999940": "Deriv 账户", @@ -2543,9 +2592,20 @@ "-318106501": "在 MT5 交易综合资产、篮子和衍生外汇差价合约。", "-1328701106": "在 MT5 交易外汇、股票、股票指数、综合指数、加密货币和大宗商品的差价合约。", "-1173266642": "此账户在功能齐全的交易平台提供差价合约。", - "-1290112064": "Deriv EZ", "-1453519913": "在容易上手的平台用喜欢的所有资产交易差价合约。", "-2051096382": "使用<0>期权正确预测市场走势获得各种赔付,或者使用<1>乘数交易差价合约获利,而承担风险不超过投注额。", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "选择法规", "-249184528": "可以根据欧盟或非欧盟法规开立真实账户。点击<0><0/>图标了解有关这些账户的更多信息。", "-1505234170": "Trader's Hub 浏览", @@ -2556,7 +2616,21 @@ "-951876657": "充值账户", "-1945421757": "有了账户后,点击 “存款” 或 “转账” 给账户添加资金", "-1965920446": "开始交易", - "-33612390": "<0>欧盟法定免责声明:差价合约是复杂的工具,并且由于杠杆作用,资金迅速亏损的风险很高。<0>与此提供商交易差价合约时有73% 的零售投资者账户蒙受亏损。必须考虑自己是否了解差价合约的运作方式,以及是否能够承担资金亏损的高风险。", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "此为必填字段。", "-1870909526": "我们的服务器无法取回地址。", "-582721696": "当前允许取款额为 {{format_min_withdraw_amount}} 至 {{format_max_withdraw_amount}}", @@ -2703,6 +2777,7 @@ "-1707299138": "您的{{currency_symbol}} 钱包地址", "-38063175": "{{account_text}} 钱包", "-705272444": "上传身份证明以验证您的身份", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "这是为了保护您的账户免遭未经授权提款。", "-130833284": "请注意,您的最高和最低提款限额不是固定的。将根据加密货币的高波动率而发生变化。", "-1531269493": "交易处理好后我们会发送邮件给您。", @@ -2859,6 +2934,30 @@ "-1016171176": "资产", "-621128676": "交易类型", "-447853970": "亏损阈值", + "-155173714": "让我们建造机器人吧!", + "-1919212468": "3. 也可以使用类别上方的搜索栏搜索所需的程序块。", + "-1520558271": "如需更多信息,查看这篇介绍构建交易机器人基础知识的博文。", + "-980360663": "3. 选择想要的程序块并将其拖到工作区。", + "-1493168314": "什么是快速策略?", + "-1680391945": "使用快速策略", + "-1177914473": "如何保存策略?", + "-271986909": "在机器人生成器点击顶部工具栏上的保存以下载机器人。给机器人起个名字,然后选择将机器人下载到设备或谷歌云端硬盘。机器人将以 XML 文件格式下载。", + "-1149045595": "1. 点击 导入后,选择 本地 并单击 继续。", + "-288041546": "2. 选择 XML 文件并点击打开。", + "-2127548288": "3. 机器人将相应加载。", + "-1311297611": "1. 点击导入,选择Google Drive并点击继续。", + "-1549564044": "如何重置工作空间?", + "-1127331928": "在机器人生成器点击顶部工具栏上的重置。这将清空工作区。请注意,任何未保存的更改都将丢失。", + "-1720444288": "如何用 Deriv 机器人控制亏损?", + "-1142295124": "使用 Deriv 机器人可以通过多种方式控制亏损。以下是简单的示例,说明如何在策略中实施亏损控制:", + "-986689483": "1. 创建以下变量:", + "-269910127": "3. 用上一份合约的利润更新当前盈/亏。如果最新合约已丢失,当前盈/亏的值将为负数。", + "-1565344891": "可否在网页浏览器的多个选项卡运行 Deriv 机器人?", + "-90192474": "是,可以的。但是,账户有些限制,例如未平仓头寸的最大数量和未平仓头寸的最大总赔付额。因此,开设多个头寸时,请牢记这些限制。可以在设置>账户限制中找到有关这些限制的更多信息。", + "-213872712": "不,Deriv 机器人不提供加密货币交易。", + "-2147346223": "Deriv 机器人在哪些国家/地区可用?", + "-352345777": "自动交易最热门的策略是什么?", + "-552392096": "自动交易中最热门的三种策略是 Martingale、D'Alembert 和 Oscar's Grind — Deriv 机器人中可找到预先制作好并等着采用的版本。", "-507620484": "未保存", "-764102808": "Google Drive", "-555886064": "赢得", @@ -2937,30 +3036,6 @@ "-1823621139": "快速策略", "-1778025545": "已成功导入机器人。", "-1519425996": "未找到结果 “{{ faq_search_value }}”", - "-155173714": "让我们建造机器人吧!", - "-1919212468": "3. 也可以使用类别上方的搜索栏搜索所需的程序块。", - "-1520558271": "如需更多信息,查看这篇介绍构建交易机器人基础知识的博文。", - "-980360663": "3. 选择想要的程序块并将其拖到工作区。", - "-1493168314": "什么是快速策略?", - "-1680391945": "使用快速策略", - "-1177914473": "如何保存策略?", - "-271986909": "在机器人生成器点击顶部工具栏上的保存以下载机器人。给机器人起个名字,然后选择将机器人下载到设备或谷歌云端硬盘。机器人将以 XML 文件格式下载。", - "-1149045595": "1. 点击 导入后,选择 本地 并单击 继续。", - "-288041546": "2. 选择 XML 文件并点击打开。", - "-2127548288": "3. 机器人将相应加载。", - "-1311297611": "1. 点击导入,选择Google Drive并点击继续。", - "-1549564044": "如何重置工作空间?", - "-1127331928": "在机器人生成器点击顶部工具栏上的重置。这将清空工作区。请注意,任何未保存的更改都将丢失。", - "-1720444288": "如何用 Deriv 机器人控制亏损?", - "-1142295124": "使用 Deriv 机器人可以通过多种方式控制亏损。以下是简单的示例,说明如何在策略中实施亏损控制:", - "-986689483": "1. 创建以下变量:", - "-269910127": "3. 用上一份合约的利润更新当前盈/亏。如果最新合约已丢失,当前盈/亏的值将为负数。", - "-1565344891": "可否在网页浏览器的多个选项卡运行 Deriv 机器人?", - "-90192474": "是,可以的。但是,账户有些限制,例如未平仓头寸的最大数量和未平仓头寸的最大总赔付额。因此,开设多个头寸时,请牢记这些限制。可以在设置>账户限制中找到有关这些限制的更多信息。", - "-213872712": "不,Deriv 机器人不提供加密货币交易。", - "-2147346223": "Deriv 机器人在哪些国家/地区可用?", - "-352345777": "自动交易最热门的策略是什么?", - "-552392096": "自动交易中最热门的三种策略是 Martingale、D'Alembert 和 Oscar's Grind — Deriv 机器人中可找到预先制作好并等着采用的版本。", "-418247251": "下载您的日志。", "-2123571162": "下载", "-870004399": "<0>已购入: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "账户已停用", "-1837059346": "买入 / 卖出", "-1845037007": "广告商页面", - "-494667560": "订单", - "-679691613": "我的广告", "-821418875": "交易者", "-679102561": "合约细节", "-430118939": "控诉政策", @@ -3082,7 +3155,6 @@ "-430041639": "地址证明未通过验证,我们对账户设置了一些限制。请重新提交地址证明。", "-87177461": "请前往账户设置并填写个人详细信息,以启用存款。", "-904632610": "重置余额", - "-470018967": "重置余额", "-156611181": "请前往账户设置完成财务评估以解锁。", "-1925176811": "暂时无法处理提款", "-980696193": "由于系统维护,暂时无法取款。一旦维护完成,您即可取款。", @@ -3107,12 +3179,12 @@ "-577279362": "请提交身份证明以验证账户并继续交易。", "-197134911": "身份证明已过期", "-152823394": "身份证明已过期。请提交新的身份证明以验证账户并继续交易。", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "请按照以下简单说明进行修复。", "-2142540205": "文档中的地址似乎与 Deriv 个人资料中的地址不匹配。请立即在个人详细信息中更新正确地址。", "-482715448": "前往个人资料", "-2072411961": "地址证明已通过验证", "-384887227": "更新个人资料中的地址。", - "-448961363": "非欧盟", "-1998049070": "如您同意我们使用 cookie,请单击“接受”。有关更多信息,请<0>参阅我们的政策。", "-402093392": "添加 Deriv 账户", "-1721181859": "您需要有 {{deriv_account}} 账户", @@ -3125,7 +3197,6 @@ "-650505513": "全屏", "-1823504435": "查看通知", "-1954045170": "未分配币种", - "-583559763": "菜单", "-1591792668": "账户限额", "-34495732": "监管信息", "-1496158755": "前往 Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "事件发生之日起45天内,金融委员会接受上诉,条件是交易者事先须试图直接与公司解决问题。", "-1825471709": "功能强大又容易使用的平台全新交易体验。", "-981017278": "触手可及的自动交易。无需编码。", + "-583559763": "菜单", "-778309978": "您点击的链接已过期。确保点击收件箱中最新电子邮件中的链接。或者,在下面输入电子邮件地址,然后点击<0>重新发送电子邮件以获取新链接。", "-336222114": "请按照以下简单步骤进行修复:", "-1064116456": "搜索经纪商<0>Deriv Holdings (Guernsey) Limited并选择它。", @@ -3415,22 +3487,6 @@ "-1282933308": "不是 {{barrier}}", "-968190634": "等值 {{barrier}}", "-1747377543": "低于 {{barrier}}", - "-256210543": "此时无法交易。", - "-1150099396": "我们正在努力为您提供此功能。如果您有另一个账户,请切换到该账户以继续交易。可以添加 Deriv MT5 金融账户。", - "-28115241": "此账户不可用 {{platform_name_trader}}", - "-453920758": "前往 {{platform_name_mt5}} 仪表板", - "-402175529": "历史", - "-902712434": "交易取消", - "-988484646": "交易取消(已执行)", - "-444882676": "交易取消(有效)", - "-13423018": "参考编号", - "-2035315547": "低障碍", - "-1551639437": "没有历史", - "-1214703885": "您还未更新止盈或止损", - "-504849554": "它将于下述时间后重启", - "-59803288": "同时请试试我们的综合指数。它模拟真实市场波动率,并全天候开放。", - "-1278109940": "查看已开启的市场", - "-694105443": "此市场已关闭", "-1043795232": "最近的头寸", "-1511825574": "利润/亏损:", "-726626679": "潜在利润/亏损:", @@ -3455,21 +3511,15 @@ "-1435392215": "关于交易取消", "-2017825013": "知道了", "-1192773792": "别再显示此项", + "-902712434": "交易取消", "-1280319153": "在选定时间范围内随时取消交易。如果您的交易在选定的时间范围内达到止损水平,将自动触发此功能。", "-471757681": "风险管理", "-843831637": "止损", "-771725194": "交易取消", "-338707425": "最小持续时间是1天", "-1003473648": "持续时间:{{duration}} 天", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "到期时的赔付额等于每点赔付乘以最终价格与行权价格之间的差额。", "-1527492178": "买入被锁定", "-725375562": "购入按钮可在设置菜单上锁定/解锁", - "-774638412": "投注额必须介于 {{min_stake}} {{currency}} 和 {{max_stake}} {{currency}} 之间", - "-1358367903": "投注资金", - "-434270664": "当前价格", - "-1956787775": "障碍价格:", - "-1513281069": "障碍2", "-390994177": "必须介于 {{min}} 和 {{max}} 之间", "-1804019534": "到期日: {{date}}", "-2055106024": "高级和简单持续时间设置之间切换", @@ -3484,6 +3534,7 @@ "-1763848396": "看跌期权", "-194424366": "高于", "-857660728": "行权价格", + "-1358367903": "投注资金", "-1386326276": "障碍为必填字段。", "-1418742026": "高障碍必须高于低障碍。", "-92007689": "低障碍必须低于高障碍。", @@ -3491,6 +3542,21 @@ "-1975910372": "分钟数必须在0到59之间。", "-866277689": "到期时间不可为过去式。", "-1455298001": "现在", + "-256210543": "此时无法交易。", + "-1150099396": "我们正在努力为您提供此功能。如果您有另一个账户,请切换到该账户以继续交易。可以添加 Deriv MT5 金融账户。", + "-28115241": "此账户不可用 {{platform_name_trader}}", + "-453920758": "前往 {{platform_name_mt5}} 仪表板", + "-402175529": "历史", + "-988484646": "交易取消(已执行)", + "-444882676": "交易取消(有效)", + "-13423018": "参考编号", + "-2035315547": "低障碍", + "-1551639437": "没有历史", + "-1214703885": "您还未更新止盈或止损", + "-504849554": "它将于下述时间后重启", + "-59803288": "同时请试试我们的综合指数。它模拟真实市场波动率,并全天候开放。", + "-1278109940": "查看已开启的市场", + "-694105443": "此市场已关闭", "-439389714": "我们正在处理", "-770929448": "前往 {{platform_name_smarttrader}}", "-347156282": "提交证明", @@ -3537,6 +3603,8 @@ "-454245976": "如果您认为市场价格会在指定期限内持续下跌,请选择<0>短仓。如果市场价格没有触及或高于障碍,您将在到期时获得赔付。如果未超出障碍,赔付将根据市场价格与障碍之间的差距成比例增长。当赔付高于投注额时,您将开始获利。如果市场价格超出障碍,则不会有赔付。", "-351875097": "跳动点数目", "-729830082": "查看更少", + "-1669741470": "到期时的赔付额等于每点赔付乘以最终价格与行权价格之间的差额。", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "新建!", "-993480898": "累计器", "-45873457": "新建", @@ -3557,6 +3625,10 @@ "-690963898": "当赔付额达到此金额,合约将自动平仓。", "-511541916": "达到此价格跳动次数时,合约将自动平仓。", "-438655760": "<0>注意:可以随时平仓。注意滑点风险。", + "-774638412": "投注额必须介于 {{min_stake}} {{currency}} 和 {{max_stake}} {{currency}} 之间", + "-434270664": "当前价格", + "-1956787775": "障碍价格:", + "-1513281069": "障碍2", "-1683683754": "长仓", "-1046859144": "<0>{{title}} 如果市场价格保持在 {{price_position}} 并且没有触及或超出障碍,将获得赔付。否则,赔付将为零。", "-1815023694": "超出障碍", diff --git a/packages/translations/src/translations/zh_tw.json b/packages/translations/src/translations/zh_tw.json index 122f2f625e7e..9a2d4bfe137b 100644 --- a/packages/translations/src/translations/zh_tw.json +++ b/packages/translations/src/translations/zh_tw.json @@ -24,7 +24,6 @@ "27731356": "帳戶已暫時停用。請通過<0>即時聊天與我們聯繫以再次啟用存款和取款功能。", "27830635": "Deriv (V) 有限公司", "28581045": "新增真實 MT5 帳戶", - "30801950": "您的帳戶將通過 {{legal_entity_name}} 開立,並由馬爾他博彩機構監管,以及受馬爾他的法律管轄。", "33433576": "請使用電子錢包取款。", "35089987": "上載駕駛執照的正面和背面。", "41737927": "謝謝", @@ -60,11 +59,13 @@ "72500774": "請填寫稅務居住地。", "73086872": "您已自我禁止交易", "73326375": "最低值是市場在合約期內達到的最低點。", + "74836780": "{{currency_code}} Wallet", "74963864": "小於", "76916358": "已達到提款限額。<0/>請上傳身份和地址證明,以提高提款限額,並繼續提款。", "76925355": "檢查機器人的效能", "77945356": "使用行動應用程式隨時隨地交易。", "77982950": "普通期權允許通過購買「看漲」或「看跌」來預測標的資產的向上(看漲)或向下(看跌)走勢。", + "81091424": "To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "81450871": "無法找到頁面", "82839270": "上傳包含照片的護照頁面。", "83202647": "摺疊區塊", @@ -76,6 +77,7 @@ "90266322": "2. 與新建立的Telegram 機器人開始聊天,並確保在繼續下一步驟前給其發送消息。(例如,機器人你好!)", "91993812": "馬丁格爾策略於十八世紀由法國數學家Paul Pierre Levy推廣,是用了百多年的經典交易技術。", "93154671": "1. 點選統計面板底部的重設。", + "93939827": "Cryptocurrency accounts", "96381225": "ID 驗證失敗", "98473502": "我們沒有義務進行適當性測試,也沒有義務向您提供任何風險警告。", "98972777": "隨機項目", @@ -83,6 +85,7 @@ "102226908": "欄位不可為空", "108916570": "持續時間: {{duration}} 天", "109073671": "請使用您之前用於存款的電子錢包。確保電子錢包支持提款。<0>此處檢視支援提款的電子錢包清單。", + "110822969": "One Wallet for all your transactions", "111215238": "遠離直射光", "111718006": "結束日期", "111931529": "7天內最大總投注金額", @@ -215,7 +218,9 @@ "251882697": "謝謝!您的回覆已記錄到系統中,<0/><0/>請按「確定」繼續。", "254912581": "此區塊與指數平均數指標(EMA)相似,除此以外,它也根據輸入清單和指定週期給您提供整個EMA線。", "256031314": "現金業務", + "256123827": "What happens to my trading accounts", "256602726": "如您關閉帳戶:", + "258026201": "<0>To complete the upgrade, please log out and log in again to add more accounts and make transactions with your Wallets.", "258448370": "MT5", "258912192": "交易評估", "260069181": "試圖載入URL時出錯", @@ -250,8 +255,8 @@ "284527272": "反眾數", "284772879": "合約", "284809500": "財務示範", + "285909860": "Demo {{currency}} Wallet", "287934290": "確認取消此交易?", - "289898640": "使用條款", "291744889": "<0>1.交易參數:<0>", "291817757": "前往 Deriv 社群,瞭解 API、API 代幣、使用 Deriv API 的方式等資訊。", "292491635": "如果您選擇「止損」並指定限制虧損的金額,那麼當虧損大於或與該金額等值時,您的頭寸將自動平倉。損失可能大於投入金額,具體取決於收盤時的市場價格。", @@ -299,6 +304,7 @@ "344418897": "這些交易限制和自我禁止功能可幫助您控制花在 {{brand_website_name}} 的金錢和時間,並執行<0>負責任交易。", "345320063": "無效的時間戳", "345818851": "抱歉,發生內部錯誤。點選上面的複選框再試一次。", + "346214602": "A better way to manage your funds", "347029309": "外匯:標準/微型手", "347039138": "反覆 (2)", "347217485": "手機存取 Deriv MT5 時遇到問題?", @@ -353,6 +359,7 @@ "401345454": "前往教學課程標籤以執行此操作。", "402343402": "由於伺服器發生問題,一些 {{platform}} 帳戶目前無法使用。 請耐心配合,非常感謝。", "403456289": "簡單移動平均線的公式是:", + "403608958": "Select a trading account or a Wallet", "404743411": "存款總額", "406359555": "合約詳情", "406497323": "如需要,賣出有效合約(可選)", @@ -373,6 +380,7 @@ "427617266": "比特幣", "428709688": "每個報告之間的偏好時間間隔:", "431267979": "以下是出門時使用 Deriv 機器人的快速指南。", + "431654991": "<0>This may take up to 2 minutes. During this time, you won't be able to deposit, withdraw, transfer, and add new accounts.", "432273174": "1:100", "432508385": "止盈:{{ currency }} {{ take_profit }}", "432519573": "文檔已上傳", @@ -453,12 +461,12 @@ "518955798": "7. 開機時運行", "520136698": "興旺 500 指數", "521872670": "項目", - "522283618": "數字期權交易經驗", "522703281": "可被整除以", "523123321": "-10 的指定數字的次方", "524459540": "如何建立變數?", "527329988": "這是100個最常用的密碼", "529056539": "期權", + "530864956": "Deriv Apps", "530953413": "授權應用程式", "531114081": "3. 合約類型", "531675669": "歐元", @@ -473,10 +481,13 @@ "543915570": "外匯、股票、股票指數、加密貨幣、綜合指數", "545476424": "提款總額", "549479175": "Deriv 乘數", + "549799607": "Go to LiveChat", "550589723": "只要入市現價格保持在前一個入市現價的±{{tick_size_barrier}} 範圍內,投注額將以每個跳動點的 {{growth_rate}}%增長。", + "551550548": "Your balance has been reset to 10,000.00 USD.", "551569133": "了解交易限制的詳細資訊", "554135844": "編輯", "554410233": "這是10個最常用的密碼", + "554777712": "Deposit and withdraw Tether TRC20, a version of Tether hosted on the TRON blockchain.", "555351771": "定義好了交易參數和交易期權以後,當達到特定條件時,您還能指示機器人購入合約。您可使用條件區塊和指示器區塊來幫助機器人做決定,以實現此功能。", "555881991": "國民身份證號碼單", "556264438": "時間間隔", @@ -552,6 +563,7 @@ "629395043": "所有增長率", "632398049": "此區塊給項目或語句分配空值。", "634219491": "您沒有提供稅務編號。法律和監管規定要求提供此資訊。請到帳戶設定中的<0>個人資料,填寫您最新的稅務編號。", + "635884758": "Deposit and withdraw Tether ERC20, a version of Tether hosted on the Ethereum blockchain.", "636219628": "<0>c.如果找不到和解機會,則投訴將進入由 DRC 處理的確定階段。", "639382772": "請上傳支援的文件類型。", "640596349": "您還未收到任何通知", @@ -562,7 +574,6 @@ "642546661": "從電腦上傳執照的背面", "642995056": "電子郵件", "644150241": "上次清除統計記錄至今的獲利合約數。", - "645016681": "其它金融工具的交易頻率", "645902266": "歐元/紐元", "647039329": "需要地址證明", "647745382": "輸入清單 {{ input_list }}", @@ -592,6 +603,7 @@ "665872465": "下例中,先選定開盤價,然後分配予稱為「op」的變數。", "666724936": "請輸入有效的身份證件號碼。", "672008428": "大零幣/美元", + "672731171": "Non-EU USD accounts", "673915530": "管轄和法律規定", "674973192": "使用此密碼登入桌面、網絡和手機應用上的 Deriv MT5 帳戶.", "676159329": "無法轉換至預設帳戶。", @@ -613,6 +625,7 @@ "692354762": "請輸入 {{document_name}}. {{example_format}}", "693396140": "交易取消(已過期)", "694035561": "交易期權乘數", + "694089159": "Deposit and withdraw Australian dollars using credit or debit cards, e-wallets, or bank wires.", "696870196": "- 開市時間:開市時間戳", "697630556": "此市場目前已關閉。", "698037001": "國民身份證號碼", @@ -624,8 +637,8 @@ "701647434": "搜尋字串", "702451070": "國民身份證(無照片)", "702561961": "更改主題", + "705262734": "Your Wallets are ready", "705299518": "接下來,上傳包含照片的護照頁面。", - "706413212": "要存取收銀台,現在已在使用 {{regulation}} {{currency}} ({{loginid}}) 帳戶。", "706727320": "二元期權交易頻率", "706755289": "此區塊執行三角函數運算。", "706960383": "如果選擇在合約到期前賣出,我們會提出以這個價格買入合約。這基於幾個因素,如當前的現貨價格、持續時間等。然而,如果剩餘期限低於60秒,我們將不提供合約價值。", @@ -644,6 +657,7 @@ "720293140": "登出", "720519019": "重設密碼", "721011817": "- 將首個數字作為第二數字的次方", + "722797282": "EU-regulated USD accounts", "723045653": "您將使用此電子郵件地址登入 Deriv 帳戶。", "723961296": "管理密碼", "724203548": "您可以將投訴提呈到<0>歐洲委員會的線上爭議解決(ODR)平台。不適用於英國客戶。", @@ -656,6 +670,7 @@ "734390964": "餘額不足", "734881840": "假", "742469109": "重設餘額", + "742570452": "<0>Deriv P2P is unavailable in Wallets at this time.", "742676532": "通過高槓桿率進行外匯、衍生指數、加密貨幣和大宗商品的差價合約交易。", "743623600": "參考", "744110277": "布林通道陣列(BBA)", @@ -689,6 +704,7 @@ "775706054": "交易機器人是否有出售?", "776085955": "策略", "781924436": "買權價差/賣權價差", + "782563319": "Add more Wallets", "783974693": "避免用最近數年的年份", "784311461": "指數移動平均線 (EMA)", "784583814": "與您的電腦連接", @@ -725,6 +741,7 @@ "818447476": "轉換帳戶?", "820877027": "請驗證身份證明", "821163626": "伺服器維護時間為每月第一個星期六的格林威治標準時間 7: 00 至 10: 00。在此期間,服務可能會中斷。", + "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": "可含文字的區塊。", "824797920": "清單為空?", "825042307": "讓我們再試一次", @@ -747,7 +764,6 @@ "836097457": "我對交易感興趣,但很少經驗。", "837063385": "請勿將其他貨幣匯到此地址。", "837066896": "文件正在審查中,請於1-3天後再檢視.", - "839618971": "地址", "839805709": "為了順利驗證,我們需要更好的照片", "840672750": "如果這不起作用,請卸載並重新安裝 MT5 應用程式。然後重做步驟 <0>2 和 <0>3。", "841434703": "禁用堆叠", @@ -844,9 +860,9 @@ "943535887": "請將以下 Deriv MT5 帳戶平倉:", "944499219": "最大未平倉頭寸", "945532698": "已賣出合約", + "945753712": "Back to Trader’s Hub", "946204249": "讀取", "946841802": "白色(或綠色)燭形線表示開盤價低於平倉價。代表市價上升走勢。", - "946944859": "點選以下按鈕後,我們會傳送含連結的郵件給您。請點選該連結以驗證您的取款請求。", "947046137": "取款將於24小時内處理", "947363256": "建立清單", "947758334": "城市為必填欄位", @@ -950,6 +966,7 @@ "1050128247": "確認已驗證付款代理的轉帳資訊。", "1050844889": "報告", "1052779010": "您正在使用示範帳戶", + "1052921318": "{{currency}} Wallet", "1053153674": "上跳 50 指數", "1053159279": "教育水準", "1053556481": "提交投訴後,我們將發送確認電子郵件,確認收到投訴。", @@ -1010,6 +1027,7 @@ "1110102997": "帳單", "1112582372": "間隔期限", "1113119682": "此區塊提供自燭線圖清單選定的燭線值。", + "1113221217": "MT5 Swap-free", "1113292761": "少於 8MB", "1114679006": "您已使用簡單的策略成功建立機器人。", "1117281935": "賣出條件(可選)", @@ -1036,6 +1054,7 @@ "1134879544": "帶有眩光的文檔示例", "1138126442": "外匯:標準", "1139483178": "啟用堆叠", + "1141383005": "Deposit and withdraw Litecoin, the cryptocurrency with low transaction fees, hosted on the Litecoin blockchain.", "1143730031": "方向為 {{ direction_type }}", "1144028300": "相對強度指標陣列 (RSIA)", "1145927365": "指定秒數後運行內部區塊", @@ -1066,7 +1085,6 @@ "1174689133": "3. 設定交易參數並點選運行。", "1174748431": "付款通道", "1175183064": "萬那杜", - "1176926166": "其它金融工具的交易經驗", "1177396776": "如果選擇「亞洲下跌」期權,當最新價格低於平均價格時,將獲得賠付。", "1177723589": "沒有要顯示的交易", "1178582280": "上次清除統計記錄至今的虧損合約數。", @@ -1077,6 +1095,7 @@ "1181396316": "此區塊提供設定範圍內的隨機數字", "1181770592": "賣出的損益", "1183007646": "- 合約類型:合約類型名稱如上漲、下跌、觸及、未觸及等。", + "1183448523": "<0>We're setting up your Wallets", "1184968647": "立即關閉合約或繼續執行。如果決定繼續執行,可以稍後檢查並關閉它 ", "1188316409": "要收取資金,請聯繫付款代理,並提供以下詳細資料", "1188980408": "5分鐘", @@ -1094,12 +1113,14 @@ "1201773643": "數字", "1203297580": "此區塊將消息傳送到 Telegram 通道。", "1204223111": "此例中,燭線清單中的開盤價被分配予稱為\"candle_list\"的變數。", + "1204834928": "We'll connect your existing USD trading account(s) to your new USD Wallet ", "1206227936": "如何掩蓋卡片?", "1206821331": "武裝部隊", "1207152000": "選擇模板並設定交易參數。", "1208714859": "短倉:", "1208729868": "跳動點", "1208903663": "無效的權杖", + "1209914202": "Get a Wallet, add funds, trade", "1211912982": "Bot 將開始", "1214893428": "目前無法通過行動裝置建立帳戶。請使用您的電腦登入以建立新帳戶。", "1216408337": "自雇者", @@ -1112,6 +1133,7 @@ "1222521778": "存款和取款有困難。", "1222544232": "已給您傳送電子郵件", "1225150022": "資產數目", + "1226027513": "Transfer from", "1227074958": "隨機分數", "1227240509": "修剪空間", "1228534821": "一些幣種可能不受您的所在國的付款代理支援。", @@ -1121,6 +1143,7 @@ "1232291311": "最大取款餘額", "1232353969": "過去12個月內0-5次交易", "1233300532": "賠付", + "1233376285": "Options & multipliers", "1234292259": "財富來源", "1234764730": "從個人詳細資料區上傳姓名和電子郵件地址的螢幕擷取畫面。", "1235426525": "50%", @@ -1166,6 +1189,7 @@ "1281045211": "在提供清單中將項目按其數字或字母值以升序或降序排序。", "1281290230": "選擇", "1282951921": "只會持續下跌", + "1283807218": "Deposit and withdraw USD Coin, hosted on the Ethereum blockchain.", "1284522768": "如果選擇「虧損」,假設最後一筆交易失敗,將返回「真」。否則將返回空字串。", "1286094280": "提款", "1286507651": "關閉身份驗證螢幕", @@ -1173,7 +1197,6 @@ "1289146554": "英屬維京群島金融服務委員會", "1289646209": "追加保證金通知", "1290525720": "例如: ", - "1291887623": "數字期權交易頻率", "1291997417": "合約將在選擇到期日的格林威治標準時間23:59:59準時到期。", "1292188546": "重設 Deriv MT5 投資者密碼", "1292891860": "通知 Telegram", @@ -1214,6 +1237,7 @@ "1327494533": "{{sell_value}} (賣出)", "1329136554": "上跳 200 指數", "1329325646": "每個跳動點都呼叫這個區塊的內容", + "1330479159": "Ready to upgrade?", "1331199417": "請輸入正確的格式。 ", "1331367811": "客戶帳號", "1332168410": "瞭解更多", @@ -1257,7 +1281,6 @@ "1367023655": "為確保虧損不超過投注金額,當虧損與<0/>等值時,合約將自動平倉。", "1367488817": "4. 重啟交易條件", "1367990698": "波動率 10 指數", - "1369709538": "我們的使用條款", "1370647009": "享用更高的每日限額", "1371193412": "取消", "1371555192": "選擇慣用付款代理並輸入提款金額。如果付款代理不在清單裡,請<0>使用其帳號搜尋。", @@ -1319,6 +1342,7 @@ "1434767075": "開始使用 Deriv 機器人", "1434976996": "公告", "1435363248": "此區塊將自Unix紀元以來的秒數轉換成日期和時間格式,例如2019-08-01 00:00:00。", + "1435368624": "Get one Wallet, get several {{dash}} your choice", "1435380105": "最小存款額", "1437396005": "新增評論", "1438247001": "由於以下原因,專業客戶會收到程度較低的使用者端保護。", @@ -1369,6 +1393,7 @@ "1476301886": "與簡單移動平均線相同,此區塊提供內含指定期間內所有數值清單的整個簡單移動平均線。", "1478030986": "建立或刪除用於交易和取款的 API 代幣", "1480915523": "跳過", + "1481860194": "Your new Wallet(s)", "1481977420": "請幫忙驗證取款請求。", "1483470662": "點選「打開」開始使用帳戶交易", "1484336612": "此區塊用於終止或繼續迴圈,並可以放置在迴圈塊內任何位置。", @@ -1389,6 +1414,7 @@ "1505420815": "找不到搜尋的付款代理", "1505898522": "下載堆疊", "1505927599": "伺服器出現了問題,請重新整理以繼續。", + "1506251760": "Wallets", "1509559328": "cTrader", "1509570124": "{{buy_value}} (買入)", "1509678193": "教育", @@ -1449,6 +1475,7 @@ "1577480486": "手機連結將於一小時後失效", "1577527507": "開立帳戶的原因是必填欄位。", "1577612026": "選擇資料夾", + "1577879664": "<0>Your Wallets are ready", "1579839386": "應用商店", "1580498808": "發現多個面孔", "1584109614": "跳動點字串清單", @@ -1502,9 +1529,11 @@ "1644703962": "尋找差價合約帳戶?前往 Trader's Hub", "1644864436": "申請成為專業客戶前,必須驗證帳戶。<0>驗證帳戶", "1644908559": "數字代碼是必填項。", + "1645315784": "{{display_currency_code}} Wallet", "1647186767": "機器人運行時出錯。", "1648938920": "荷蘭 25", "1649239667": "2. 在區塊功能表可看到類別清單。區塊會根據這些類別分組。選擇所需的區塊並將其拖曳至工作區。", + "1650963565": "Introducing Wallets", "1651513020": "顯示每個間隔的剩餘時間", "1651951220": "像“abcabcabc”這樣的重複詞比“abc”更難猜測", "1652366857": "取得和刪除", @@ -1522,13 +1551,13 @@ "1665272539": "切記:選定日期之前,無法登入帳戶。", "1665738338": "餘額", "1665756261": "前往即時聊天", + "1666783057": "Upgrade now", "1668138872": "帳戶設定修改", "1670016002": "乘數: {{ multiplier }}", "1670426231": "結束時間", "1671232191": "已設定以下限制:", "1674163852": "通過設定期限或結束時間確定合約到期日。", "1675030608": "要開立此帳戶,首先需要重新提交地址證明。", - "1675289747": "轉換至真實帳戶", "1676549796": "動態槓桿", "1677027187": "外匯", "1677990284": "我的應用程式", @@ -1556,6 +1585,7 @@ "1703091957": "作為我們必須履行,按照反洗錢立法要求的勤勉義務,我們會收集關於您的職業的資料。", "1704656659": "您在差價合約交易方面有多少經驗?", "1708413635": "用於 {{currency_name}} ({{currency}}) 帳戶", + "1709293836": "Wallet balance", "1709401095": "在 Deriv X 交易金融市場和衍生指數差價合約。", "1709859601": "退市現價時間", "1710662619": "如有該應用程序,請啟動開始交易。", @@ -1570,6 +1600,7 @@ "1719248689": "歐元/英鎊/美元", "1720451994": "Deriv 法定貨幣和 Deriv 加密貨幣帳戶之間的轉帳,將收取 2% 轉帳費或 {{minimum_fee}} {{currency}},以較高者為準。", "1720968545": "從電腦上傳含照片的護照頁面", + "1723069433": "Your new Wallet", "1723589564": "表示投資組合中未平倉合約的最大數量。投資組合中的每一行都算作是一個未平倉頭寸。一旦達到該最大值,在開設新頭寸之前需要先了結一個現有頭寸。", "1724696797": "只能使用一個法定帳戶。", "1725958461": "帳號", @@ -1698,6 +1729,7 @@ "1842266423": "返回", "1842862156": "歡迎來到 Deriv X 儀表板", "1843658716": "如果選擇「只會持續下跌」期權,只要入市現價後的價格持續下跌,將獲得賠付。如果期間內的價格有任何上漲或相等於之前的價格, 將不會獲得賠付。", + "1844458194": "You can only transfers funds from the {{account}} to the linked {{wallet}}.", "1845892898": "(最小: {{min_stake}} - 最大: {{max_payout}})", "1846266243": "示範帳戶不能使用此功能。", "1846587187": "尚未選擇居住國", @@ -1792,7 +1824,6 @@ "1924765698": "出生地*", "1926987784": "-iOS:在帳戶上向左滑動,然後點選<0>「刪除」。", "1928930389": "英鎊/挪威克羅鈉", - "1929309951": "就業狀況", "1929694162": "帳戶比較", "1930899934": "Tether", "1931659123": "每一跳動點皆運行", @@ -1807,6 +1838,7 @@ "1943440862": "從有期限的清單計算布林通道 (BB)", "1944204227": "此區塊返回目前帳戶餘額。", "1947527527": "1. 此連結是您傳送的", + "1948044825": "MT5 Derived", "1948092185": "英鎊/加拿大元", "1949719666": "以下是可能的原因:", "1950413928": "提交身份證明文件", @@ -1875,6 +1907,7 @@ "2014536501": "卡號", "2014590669": "變數 '{{variable_name}}' 無數值。請為變數 '{{variable_name}}' 設定數值以通知。", "2017672013": "請選擇文件簽發國。", + "2020104747": "Filter", "2020545256": "關閉帳戶?", "2021037737": "請更新詳細資料以繼續操作。", "2021161151": "觀看此視訊以了解如何在 Deriv 機器人構建交易機器人。另外,請查看有關構建交易機器人的部落格文章。", @@ -1885,7 +1918,6 @@ "2027696535": "稅務資訊", "2028163119": "EOS/美元", "2029237955": "納閩", - "2029641956": "CFDCompareAccounts", "2030018735": "RSI 是可幫助確定市場趨勢的技術分析工具。它將提供0到100之間的數值。RSI 值大於等於70表示資產已超買,當前趨勢可能會反轉,而 RSI 值小於等於30則意味著資產超賣。", "2030045667": "消息", "2033648953": "此區塊提供選定時間間隔內的特定燭線值。", @@ -1919,6 +1951,7 @@ "2063812316": "文字聲明", "2063890788": "已取消", "2065278286": "價差交易", + "2066419724": "Trading accounts linked with {{wallet}}", "2067903936": "駕駛執照", "2070002739": "不要接受", "2070345146": "建立槓桿差價合約交易時.", @@ -1931,6 +1964,7 @@ "2074713563": "4.2. 提交投訴", "2080553498": "3. 使用 Telegram REST API 取得聊天 ID(更多資訊:https://core.telegram.org/bots/api#getupdates)", "2080829530": "賣價: {{sold_for}}", + "2080906200": "I understand and agree to upgrade to Wallets.", "2082533832": "是,刪除", "2084693624": "將代表日期/時間字串的字串轉換為自大紀元以來的秒數。例如:2019年1月1日21:03:45 GMT+0800 將轉換為1546347825。時間和時區偏移是可選項。", "2085387371": "必須是數字、字母和特殊字元 . , ' -", @@ -1966,7 +2000,6 @@ "2115223095": "虧損", "2117165122": "1. 建立Telegram機器人並取得Telegram API權杖。在此處閱讀關於Telegram建立機器人功能的更多資訊:https://core.telegram.org/bots#6-botfather", "2117489390": "{{ remaining }} 秒內自動更新", - "2118315870": "居住地是哪裡?", "2119449126": "以下例子的輸出例將是:", "2119710534": "常見問題集", "2121227568": "小蟻幣/美元", @@ -1992,8 +2025,6 @@ "2146698770": "專家提示:也可以點選並拖出所需的區塊", "2146892766": "二元期權交易經驗", "2147244655": "如何將自己的交易機器人匯入 Deriv 機器人?", - "-1232613003": "<0>驗證失敗。<1>為什麼?", - "-2029508615": "<0>需要驗證。<1>立即驗證", "-931052769": "提交驗證", "-1004605898": "提示", "-1938142055": "文檔已上傳", @@ -2141,18 +2172,9 @@ "-179726573": "已收到擁有權證明。", "-813779897": "擁有權證明驗證已通過。", "-638756912": "將轉帳卡/信用卡正面顯示的卡號的7至12位數字塗黑。", - "-2073934245": "本網站所提供的金融交易服務僅適合這樣的客戶:能夠接受全部投入資金虧損的可能性,了解購買金融合約所蘊含的風險並擁有相關的風險經歷。金融合約交易涉及很大的風險。如果所購買的合約到期時一文不值,投資將完全損失,其中還包括合約費用。", - "-1166068675": "帳戶將通過 {{legal_entity_name}} 開立,並由英國博彩委員會(UKGC)監管,以及受曼島的法律管轄。", - "-975118358": "帳戶將通過 {{legal_entity_name}} 開立,並由馬爾他金融服務機構(MFSA) 監管,以及受馬爾他的法律管轄。", - "-680528873": "帳戶將透過 {{legal_entity_name}} 開立,並受薩摩亞的法律管轄。", - "-1125193491": "新增帳戶", - "-2068229627": "本人不是政治公眾人士,而且在過去的12個月中,我未曾當過政治公眾人士。", "-684271315": "確定", "-740157281": "交易經驗評估", "-1720468017": "為了給您提供服務,我們需要向您索取資訊,以便評估某項產品或服務是否適合您。", - "-186841084": "變更登入電子郵件", - "-907403572": "若要變更電子郵件地址,必須先取消電子郵件地址與 {{identifier_title}} 帳戶的連結。", - "-1850792730": "與 {{identifier_title}} 解除連結", "-307865807": "風險承受警告", "-690100729": "是的,我了解須承擔風險。", "-2010628430": "由於槓桿作用,差價合約和其他金融工具資金快速虧損的風險很高。您必須考慮自己是否了解差價合約和其他金融工具的運作方式,以及是否能夠承擔資金虧損的高風險。 <0/><0/>如要繼續,您必須確認了解自己的資本面臨風險。", @@ -2206,11 +2228,6 @@ "-1725454783": "失敗", "-506510414": "日期和時間", "-1708927037": "IP 地址", - "-619126443": "使用 <0>Deriv 密碼登入{{brand_website_name}} 和 {{platform_name_trader}}。", - "-623760979": "使用 <0>Deriv 密碼登入 {{brand_website_name}}、{{platform_name_trader}} 和 {{platform_name_go}}。", - "-459147994": "使用 <0>Deriv 密碼登入 {{brand_website_name}}、{{platform_name_go}}、{{platform_name_trader}}、{{platform_name_smarttrader}}、{{platform_name_dbot}} 和 {{platform_name_ctrader}}。", - "-80717068": "與<0>Deriv 密碼連結的應用:", - "-9570380": "使用 {{platform_name_dxtrade}} 密碼登入網絡和手機應用上的 {{platform_name_dxtrade}} 帳戶.", "-2131200819": "禁用", "-200487676": "啟用", "-1840392236": "代碼不正確。請重試。", @@ -2240,44 +2257,37 @@ "-378415317": "州/區為必填欄位", "-1497654315": "澤西郵遞區號的使用者不可使用我們的帳戶和服務。", "-755626951": "完成地址資料", - "-584911871": "選擇錢包貨幣", "-1461267236": "請選擇貨幣", - "-1352330125": "貨幣", "-1027595143": "少於$25,000", "-40491332": "$25,000 - $50,000", "-1139806939": "$50,001 - $100,000", - "-626752657": "0-1 年", - "-532014689": "1-2 年", - "-1001024004": "3年以上", - "-790513277": "過去12個月內6-10次交易", - "-580085300": "過去12個月內11-39次交易", - "-654781670": "主要", - "-1717373258": "次要", "-996132458": "建構", "-915003867": "健康", "-1430012453": "資訊和通信技術", "-987824916": "科學 & 工程", "-146630682": "社會 & 文化", "-761306973": "製造", - "-739367071": "就業", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "大於$1,000,000", - "-2068544539": "支薪員工", - "-531314998": "投資與分紅", - "-1235114522": "退休金", - "-1298056749": "國家收益", - "-449943381": "儲蓄和繼承", "-1631552645": "專業人士", "-474864470": "個人護理、銷售及服務員工", "-1129355784": "農業、林業和漁業工人", "-1242914994": "工藝、金屬、電氣和電子工人", "-1317824715": "清潔工和傭工", "-1592729751": "礦業、建築業、製造業和運輸工人", + "-1030759620": "政府官員", "-2137323480": "公司擁有權", "-1590574533": "離婚協定", "-1667683002": "繼承", "-1237843731": "投資收入", "-777506574": "財產出售", + "-654781670": "主要", + "-1717373258": "次要", + "-1156937070": "$500,001 - $1,000,000", + "-315534569": "大於$1,000,000", + "-2068544539": "支薪員工", + "-531314998": "投資與分紅", + "-1235114522": "退休金", + "-1298056749": "國家收益", + "-449943381": "儲蓄和繼承", "-1161338910": "名字為必填欄位。", "-1161818065": "姓氏的長度必須介於2-50個字元。", "-1281693513": "出生日期為必填欄位。", @@ -2287,28 +2297,14 @@ "-212167954": "稅務識別號碼格式不正確。", "-621555159": "身份資訊", "-204765990": "使用條款", - "-231863107": "否", - "-870902742": "對網上交易有多少知識和經驗?", - "-1929477717": "我擁有與金融服務相關的學術學位、專業認證和/或工作經驗。", - "-1540148863": "我參加了與交易有關的研討會,培訓和/或工作坊。", - "-922751756": "不到一年", - "-542986255": "没有", - "-1337206552": "根據您的理解,差價合約交易可以讓您", - "-456863190": "對資產的價格變動開立頭寸,其結果是固定回報或毫無收益。", - "-1314683258": "進行長期投資以獲得有保障的利潤。", - "-1546090184": "槓桿如何影響差價合約交易?", - "-1636427115": "槓桿幫助降低風險。", - "-800221491": "槓桿保證能獲得利潤。", - "-811839563": "槓桿可以交易價值的一小部分開倉位,這可能會導致利潤或虧損增加。", - "-1185193552": "只要有足夠的市場流動性,當虧損等於或大於指定金額時,交易將自動平倉。", - "-1046354": "只要有足夠的市場流動性,當利潤等於或大於指定金額時,交易將自動平倉。", - "-1842858448": "交易中保證獲得利潤。", - "-860053164": "交易乘數時.", - "-1250327770": "購買公司股票時.", - "-1222388581": "以上全部.", "-477761028": "選民身份證", "-1466346630": "公積金", - "-1030759620": "政府官員", + "-739367071": "就業", + "-626752657": "0-1 年", + "-532014689": "1-2 年", + "-1001024004": "3年以上", + "-790513277": "過去12個月內6-10次交易", + "-580085300": "過去12個月內11-39次交易", "-612752984": "這些是對帳戶施行的預設限額。", "-1598263601": "要了解有關交易限額及其實施方法的更多資訊,請前往<0>幫助中心。", "-1411635770": "了解帳戶限制的詳細資訊", @@ -2326,10 +2322,7 @@ "-1500958859": "驗證", "-1502578110": "帳戶已經得到完全驗證,且取款限額已經取消。", "-1662154767": "近期的水電費帳單(例如電費、水費、煤氣費、固定電話費或互聯網費),銀行對帳單或政府簽發的帶有姓名和地址的信件。", - "-190838815": "需要它進行驗證。如果提供的資訊是虛假的或不正確的,將無法存款和提款。", - "-223216785": "地址第二行*", "-594456225": "地址第二行", - "-1940457555": "郵遞區號*", "-1964954030": "郵遞區號", "-516397235": "與他人分享此代幣要小心。擁有此代幣的任何人都可以代表您的帳戶執行以下操作", "-989216986": "新增帳戶", @@ -2371,8 +2364,6 @@ "-1100235269": "職業領域", "-684388823": "估計淨值", "-509054266": "預期的年交易額", - "-601903492": "外匯交易經驗", - "-1012699451": "差價合約交易經驗", "-1588485629": "例如", "-1117345066": "選擇文件類型", "-651192353": "樣本:", @@ -2464,12 +2455,40 @@ "-142444667": "請點選郵件上的連結以更改 Deriv MT5 密碼。", "-742748008": "查看電子郵件並點選郵件裡的連結以繼續操作。", "-84068414": "還是沒有收到郵件?請通過<0>即時聊天 與我們聯繫。", + "-975118358": "帳戶將通過 {{legal_entity_name}} 開立,並由馬爾他金融服務機構(MFSA) 監管,以及受馬爾他的法律管轄。", + "-2073934245": "本網站所提供的金融交易服務僅適合這樣的客戶:能夠接受全部投入資金虧損的可能性,了解購買金融合約所蘊含的風險並擁有相關的風險經歷。金融合約交易涉及很大的風險。如果所購買的合約到期時一文不值,投資將完全損失,其中還包括合約費用。", + "-1125193491": "新增帳戶", + "-2068229627": "本人不是政治公眾人士,而且在過去的12個月中,我未曾當過政治公眾人士。", + "-186841084": "變更登入電子郵件", + "-907403572": "若要變更電子郵件地址,必須先取消電子郵件地址與 {{identifier_title}} 帳戶的連結。", + "-1850792730": "與 {{identifier_title}} 解除連結", "-428335668": "必須設定密碼以完成流程。", + "-1232613003": "<0>驗證失敗。<1>為什麼?", + "-2029508615": "<0>需要驗證。<1>立即驗證", "-818898181": "文件中的名稱與 Deriv 個人資料不符。", "-310316375": "文件中的地址與上面輸入的地址不符。", "-485368404": "文件簽發日期超過 6 個月。", "-367016488": "文件模糊。所有資訊必須清晰可見。", "-1957076143": "裁剪的文檔。所有資訊必須清晰可見。", + "-231863107": "否", + "-870902742": "對網上交易有多少知識和經驗?", + "-1929477717": "我擁有與金融服務相關的學術學位、專業認證和/或工作經驗。", + "-1540148863": "我參加了與交易有關的研討會,培訓和/或工作坊。", + "-922751756": "不到一年", + "-542986255": "没有", + "-1337206552": "根據您的理解,差價合約交易可以讓您", + "-456863190": "對資產的價格變動開立頭寸,其結果是固定回報或毫無收益。", + "-1314683258": "進行長期投資以獲得有保障的利潤。", + "-1546090184": "槓桿如何影響差價合約交易?", + "-1636427115": "槓桿幫助降低風險。", + "-800221491": "槓桿保證能獲得利潤。", + "-811839563": "槓桿可以交易價值的一小部分開倉位,這可能會導致利潤或虧損增加。", + "-1185193552": "只要有足夠的市場流動性,當虧損等於或大於指定金額時,交易將自動平倉。", + "-1046354": "只要有足夠的市場流動性,當利潤等於或大於指定金額時,交易將自動平倉。", + "-1842858448": "交易中保證獲得利潤。", + "-860053164": "交易乘數時.", + "-1250327770": "購買公司股票時.", + "-1222388581": "以上全部.", "-1515286538": "請輸入文件號。 ", "-1694758788": "輸入文件編號", "-1458676679": "必須輸入2-50 個字元。", @@ -2479,6 +2498,8 @@ "-1437017790": "財務資料", "-70342544": "根據法律規定,我們有義務要求您提供財務資料。", "-39038029": "交易經驗", + "-601903492": "外匯交易經驗", + "-1012699451": "差價合約交易經驗", "-1894668798": "其他交易工具經驗", "-1026468600": "其他交易工具頻率", "-1743024217": "選擇語言", @@ -2489,6 +2510,11 @@ "-536187647": "確認撤銷存取權限?", "-1357606534": "權限", "-570222048": "撤銷存取權限", + "-80717068": "與<0>Deriv 密碼連結的應用:", + "-340060402": "Deriv X 密碼是用於登入網絡和手機應用上的 Deriv X 帳戶.", + "-619126443": "使用 <0>Deriv 密碼登入{{brand_website_name}} 和 {{platform_name_trader}}。", + "-623760979": "使用 <0>Deriv 密碼登入 {{brand_website_name}}、{{platform_name_trader}} 和 {{platform_name_go}}。", + "-459147994": "使用 <0>Deriv 密碼登入 {{brand_website_name}}、{{platform_name_go}}、{{platform_name_trader}}、{{platform_name_smarttrader}}、{{platform_name_dbot}} 和 {{platform_name_ctrader}}。", "-1526404112": "水電帳單:電費、水費、煤氣費或固定電話帳單。", "-537552700": "房屋租賃協議:有效的目前使用協議。", "-890084320": "儲存及提交", @@ -2510,11 +2536,20 @@ "-362324454": "大宗商品", "-1071336803": "平台", "-820028470": "期權和乘數", - "-1255879419": "Trader's Hub", + "-1186807402": "轉帳", + "-224804428": "交易", + "-470018967": "重設餘額", + "-693105141": "MT5 Financial", + "-1290112064": "Deriv EZ", + "-145462920": "Deriv cTrader", + "-882362166": "Deposit and withdraw euros into your accounts regulated by MFSA using credit or debit cards and e-wallets.", + "-1186915014": "Deposit and withdraw US dollars using credit or debit cards, e-wallets, or bank wires.", + "-1533139744": "Deposit and withdraw Bitcoin, the world's most popular cryptocurrency, hosted on the Bitcoin blockchain.", + "-549933762": "Deposit and withdraw Ether, the fastest growing cryptocurrency, hosted on the Ethereum blockchain.", + "-714679884": "Deposit and withdraw Tether Omni, hosted on the Bitcoin blockchain.", + "-794619351": "Deposit and withdraw funds via authorised, independent payment agents.", "-1856204727": "重設", "-213142918": "暫時無法存款和取款 ", - "-224804428": "交易", - "-1186807402": "轉帳", "-1308346982": "衍生資產", "-1145604233": "使用模擬真實世界市場走勢的衍生指數在 MT5 交易差價合約。", "-328128497": "金融", @@ -2525,15 +2560,29 @@ "-81256466": "需有 Deriv 帳戶才能開立差價合約帳戶。", "-699372497": "利用槓桿和低點差進行交易,以在成功交易時獲得更高回報。<0>了解更多", "-1884966862": "獲取更多具有不同類型和司法管轄區的 Deriv MT5 帳戶。", - "-145462920": "Deriv cTrader", "-982095728": "獲取", + "-124150034": "Reset balance to 10,000.00 USD", + "-677271147": "Reset your virtual balance if it falls below 10,000.00 USD or exceeds 10,000.00 USD.", + "-1829666875": "Transfer funds", + "-1504456361": "CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>73% 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.", + "-33612390": "<0>歐盟法定免責聲明:差價合約是複雜的工具,並且由於槓桿作用,資金迅速虧損的風險很高。<0>與此提供商交易差價合約時有73% 的零售投資者帳戶蒙受虧損。必須考慮自己是否了解差價合約的運作方式,以及是否能夠承擔資金虧損的高風險。", "-1277942366": "總資產", + "-1255879419": "Trader's Hub", "-493788773": "非歐盟", "-673837884": "歐盟", "-230566990": "提交的以下文件未通過檢查:", "-846812148": "地址證明。", + "-1320592007": "Upgrade to Wallets", + "-1283678015": "This is <0>irreversible. Once you upgrade, the Cashier won't be available anymore. You'll need to\n use Wallets to deposit, withdraw, and transfer funds.", + "-417529381": "Your current trading account(s)", + "-1842223244": "This is how we link your accounts with your new Wallet.", + "-437170875": "Your existing funds will remain in your trading account(s) and can be transferred to your Wallet after the upgrade.", "-2055865877": "非歐盟法規", "-643108528": "非歐盟及歐盟法規", + "-979459594": "Buy/Sell", + "-494667560": "訂單", + "-679691613": "我的廣告", + "-1002556560": "We’re unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-172898036": "CR5236585", "-1665192032": "乘數帳戶", "-744999940": "Deriv 帳戶", @@ -2543,9 +2592,20 @@ "-318106501": "在 MT5 交易綜合資產、籃子和衍生外匯的差價合約。", "-1328701106": "在 MT5 交易外匯、股票、股票指數、綜合指數、加密貨幣和大宗商品差價合約。", "-1173266642": "此帳戶在功能齊全的交易平台提供差價合約。", - "-1290112064": "Deriv EZ", "-1453519913": "在易於使用的平台交易喜歡的所有資產差價合約。", "-2051096382": "使用<0>期權正確預測市場走勢獲得各種賠付,或者使用<1>乘數交易差價合約\n 獲利,而承擔風險不超過投注額。", + "-623025665": "Balance: {{balance}} {{currency}}", + "-473300321": "To trade CFDs, you’ll need to use your {{fiat_wallet_currency}} Wallet. Click Transfer to move your {{currency}} to your {{fiat_wallet_currency}} Wallet.", + "-596618970": "Other CFDs", + "-2006676463": "Account information", + "-1078378070": "Trade with leverage and tight spreads for better returns on trades. <0>Learn more", + "-1989682739": "Get the upside of CFDs without risking more than your initial stake with <0>multipliers.", + "-2102073579": "{{balance}} {{currency}}", + "-2082307900": "You have insufficient fund in the selected wallet, please reset your virtual balance", + "-1483251744": "Amount you send", + "-536126207": "Amount you receive", + "-486580863": "Transfer to", + "-71189928": "<0>Wallets<1> — the best way to organise your funds", "-2146691203": "選擇法規", "-249184528": "可以根據歐盟或非歐盟法規開立真實帳戶。按一下<0><0/>圖示以進一步瞭解這些帳戶。", "-1505234170": "Trader's Hub 瀏覽", @@ -2556,7 +2616,21 @@ "-951876657": "充值帳戶", "-1945421757": "有了帳戶後,點選「存款」或「轉帳」給帳戶充值", "-1965920446": "開始交易", - "-33612390": "<0>歐盟法定免責聲明:差價合約是複雜的工具,並且由於槓桿作用,資金迅速虧損的風險很高。<0>與此提供商交易差價合約時有73% 的零售投資者帳戶蒙受虧損。必須考慮自己是否了解差價合約的運作方式,以及是否能夠承擔資金虧損的高風險。", + "-542766473": "During the upgrade, deposits, withdrawals, transfers, and adding new accounts will be unavailable.", + "-327352856": "Your open positions won't be affected and you can continue trading.", + "-747378570": "You can use <0>Payment agents' services to deposit by adding a Payment Agent Wallet after the upgrade.", + "-917391116": "A new way to manage your funds", + "-35169107": "One Wallet, one currency", + "-2069339099": "Keep track of your trading funds in one place", + "-1615726661": "A Wallet for each currency to focus your funds", + "-132463075": "How it works", + "-1215197245": "Simply add your funds and trade", + "-1325660250": "Get a Wallet for the currency you want", + "-1643530462": "Add funds to your Wallet via your favourite payment method", + "-557603541": "Move funds to your trading account to start trading", + "-1200921647": "We'll link them", + "-1370356153": "We'll connect your existing trading accounts of the same currency to your new Wallet", + "-2125046510": "For example, all your USD trading account(s) will be linked to your USD Wallet", "-2021135479": "此為必填欄位。", "-1870909526": "伺服器無法取回地址。", "-582721696": "目前允許取款額為 {{format_min_withdraw_amount}} 至 {{format_max_withdraw_amount}}", @@ -2703,6 +2777,7 @@ "-1707299138": "{{currency_symbol}} 錢包地址", "-38063175": "{{account_text}} 錢包", "-705272444": "上傳身份證明以驗證身份", + "-259633143": "Click the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.", "-2024958619": "這是為了保護帳戶免遭未經授權提款。", "-130833284": "請注意,最高和最低提款限額不是固定的。將根據加密貨幣的高波動率而發生變化。", "-1531269493": "交易處理好後將給您傳送郵件。", @@ -2859,6 +2934,30 @@ "-1016171176": "資產", "-621128676": "交易類型", "-447853970": "虧損門檻", + "-155173714": "讓我們建立機器人!", + "-1919212468": "3. 還可以使用類別上方的搜尋列搜尋所需的區塊。", + "-1520558271": "如需更多資訊,檢視這篇介紹建立交易機器人基礎知識的部落格貼文。", + "-980360663": "3.選擇所需的區塊並將其拖曳至工作區。", + "-1493168314": "什麼是快速策略?", + "-1680391945": "使用快速策略", + "-1177914473": "如何儲存策略?", + "-271986909": "在機器人產生器點選頂部工具欄上的儲存以下載機器人。為機器人命名,然後選擇將機器人下載到裝置或 Google 雲端硬盤。機器人將被下載為 XML 文件。", + "-1149045595": "1. 點選匯入後,選擇 本地 ,然後點選 繼續。", + "-288041546": "2. 選擇 XML 文件,然後按打開。", + "-2127548288": "3. 機器人將相應載入。", + "-1311297611": "1. 點選匯入後,選擇 Google 雲端硬盤 ,然後點選 繼續。", + "-1549564044": "如何重設工作區?", + "-1127331928": "在機器人產生器中點選頂部工具欄上的重設以清除工作區。請注意,任何未儲存的變更都將丟失。", + "-1720444288": "如何用 Deriv 機器人控制虧損?", + "-1142295124": "使用 Deriv 機器人可以通過多種方式控制虧損。這是個簡單的示例,說明如何在策略中實施虧損控制:", + "-986689483": "1. 建立以下變數:", + "-269910127": "3. 用上一份合約的利潤更新 目前盈/虧。如果最新合約已丟失, 目前盈/虧的值將為負數。", + "-1565344891": "可否在網頁瀏覽器的多個分頁執行 Deriv 機器人?", + "-90192474": "是,可以的。但是,帳戶有些限制,例如未平倉頭寸的最大數量和未平倉頭寸的最大總賠付額。因此,開立多個頭寸時,請牢記這些限制。可以在設定>帳戶限制中找到有關這些限制的更多資訊。", + "-213872712": "不,Deriv 機器人不提供加密貨幣交易。", + "-2147346223": "Deriv 機器人可在哪些國家/地區使用?", + "-352345777": "最受歡迎的自動交易策略有哪些?", + "-552392096": "自動交易中最常用的三種策略是 Martingale、D'Alembert 和 Oscar's Grind — 可以在 Deriv 機器人找到已經預先製作好等待使用的版本。", "-507620484": "未儲存", "-764102808": "Google Drive", "-555886064": "贏得", @@ -2937,30 +3036,6 @@ "-1823621139": "快速策略", "-1778025545": "已成功匯入機器人。", "-1519425996": "未找到結果 \"{{ faq_search_value }}\"", - "-155173714": "讓我們建立機器人!", - "-1919212468": "3. 還可以使用類別上方的搜尋列搜尋所需的區塊。", - "-1520558271": "如需更多資訊,檢視這篇介紹建立交易機器人基礎知識的部落格貼文。", - "-980360663": "3.選擇所需的區塊並將其拖曳至工作區。", - "-1493168314": "什麼是快速策略?", - "-1680391945": "使用快速策略", - "-1177914473": "如何儲存策略?", - "-271986909": "在機器人產生器點選頂部工具欄上的儲存以下載機器人。為機器人命名,然後選擇將機器人下載到裝置或 Google 雲端硬盤。機器人將被下載為 XML 文件。", - "-1149045595": "1. 點選匯入後,選擇 本地 ,然後點選 繼續。", - "-288041546": "2. 選擇 XML 文件,然後按打開。", - "-2127548288": "3. 機器人將相應載入。", - "-1311297611": "1. 點選匯入後,選擇 Google 雲端硬盤 ,然後點選 繼續。", - "-1549564044": "如何重設工作區?", - "-1127331928": "在機器人產生器中點選頂部工具欄上的重設以清除工作區。請注意,任何未儲存的變更都將丟失。", - "-1720444288": "如何用 Deriv 機器人控制虧損?", - "-1142295124": "使用 Deriv 機器人可以通過多種方式控制虧損。這是個簡單的示例,說明如何在策略中實施虧損控制:", - "-986689483": "1. 建立以下變數:", - "-269910127": "3. 用上一份合約的利潤更新 目前盈/虧。如果最新合約已丟失, 目前盈/虧的值將為負數。", - "-1565344891": "可否在網頁瀏覽器的多個分頁執行 Deriv 機器人?", - "-90192474": "是,可以的。但是,帳戶有些限制,例如未平倉頭寸的最大數量和未平倉頭寸的最大總賠付額。因此,開立多個頭寸時,請牢記這些限制。可以在設定>帳戶限制中找到有關這些限制的更多資訊。", - "-213872712": "不,Deriv 機器人不提供加密貨幣交易。", - "-2147346223": "Deriv 機器人可在哪些國家/地區使用?", - "-352345777": "最受歡迎的自動交易策略有哪些?", - "-552392096": "自動交易中最常用的三種策略是 Martingale、D'Alembert 和 Oscar's Grind — 可以在 Deriv 機器人找到已經預先製作好等待使用的版本。", "-418247251": "下載日誌。", "-2123571162": "下載", "-870004399": "<0>已購入: {{longcode}} (ID: {{transaction_id}})", @@ -2998,8 +3073,6 @@ "-883103549": "帳戶已停用", "-1837059346": "買入 / 賣出", "-1845037007": "廣告商頁面", - "-494667560": "訂單", - "-679691613": "我的廣告", "-821418875": "交易者", "-679102561": "合約詳細資料", "-430118939": "控訴政策", @@ -3082,7 +3155,6 @@ "-430041639": "地址證明未通過驗證,而且我們對帳戶設定了一些限制。請重新提交地址證明。", "-87177461": "請前往帳戶設定並填寫個人詳細資料,以啟用存款。", "-904632610": "重設餘額", - "-470018967": "重設餘額", "-156611181": "請前往帳戶設定完成財務評估以解鎖。", "-1925176811": "暫時無法處理提款", "-980696193": "由於系統維護,暫時無法取款。一旦維護完成,即可取款。", @@ -3107,12 +3179,12 @@ "-577279362": "請提交身份證明以驗證帳戶並繼續交易。", "-197134911": "身份證明已過期", "-152823394": "身份證明已過期。請提交新的身份證明以驗證帳戶並繼續交易。", + "-822813736": "We're unable to complete with the Wallet upgrade. Please try again later or contact us via live chat.", "-420930276": "請按照這些簡單的說明進行修復。", "-2142540205": "文件中的地址似乎與 Deriv 個人資料中的地址不匹配。請立即在個人詳細資料中更新正確地址。", "-482715448": "前往個人資料", "-2072411961": "地址證明已通過驗證", "-384887227": "更新個人資料中的地址。", - "-448961363": "非歐盟", "-1998049070": "如同意我們使用 cookie,請點選「接受」。有關更多資訊,請<0>參閱我們的政策。", "-402093392": "新增 Deriv 帳戶", "-1721181859": "需要有 {{deriv_account}} 帳戶", @@ -3125,7 +3197,6 @@ "-650505513": "全螢幕", "-1823504435": "檢視通知", "-1954045170": "未分配幣種", - "-583559763": "功能表", "-1591792668": "帳戶限額", "-34495732": "監管資訊", "-1496158755": "前往 Deriv.com", @@ -3259,6 +3330,7 @@ "-818926350": "事件發生之日起45天內,金融委員會接受上訴,條件是交易者事先須試圖直接與公司解決問題。", "-1825471709": "功能強大又容易使用的平台全新交易體驗。", "-981017278": "觸手可及的自動交易。無需編碼。", + "-583559763": "功能表", "-778309978": "您點選的連結已過期。請務必點選收件匣中最新電子郵件中的連結。或者,請在下方輸入電子郵件地址,然後按一下<0>重新傳送電子郵件以獲取新的連結。", "-336222114": "請按照以下簡單步驟進行修復:", "-1064116456": "搜尋經紀商 <0>Deriv Holdings (Guernsey) Limited並選擇它。", @@ -3415,22 +3487,6 @@ "-1282933308": "不是 {{barrier}}", "-968190634": "等值 {{barrier}}", "-1747377543": "低於 {{barrier}}", - "-256210543": "此時無法交易。", - "-1150099396": "正在努力為您提供此功能。如果有另一個帳戶,請切換到該帳戶以繼續交易。可以新建 Deriv MT5 金融帳戶。", - "-28115241": "此帳戶不可用 {{platform_name_trader}}", - "-453920758": "前往 {{platform_name_mt5}} 儀表板", - "-402175529": "歷史", - "-902712434": "交易取消", - "-988484646": "交易取消(已執行)", - "-444882676": "交易取消(有效)", - "-13423018": "身份參考號", - "-2035315547": "低障礙", - "-1551639437": "沒有歷史", - "-1214703885": "還未更新止盈或止損", - "-504849554": "將於下述時間後重啟", - "-59803288": "同時請試試綜合指數。它模擬真實市場波動率,並全天候開放。", - "-1278109940": "檢視已開啟的市場", - "-694105443": "此市場已關閉", "-1043795232": "最近的頭寸", "-1511825574": "利潤/虧損:", "-726626679": "潛在利潤/虧損:", @@ -3455,21 +3511,15 @@ "-1435392215": "關於交易取消", "-2017825013": "知道了", "-1192773792": "別再顯示此項", + "-902712434": "交易取消", "-1280319153": "在選定時間範圍內隨時取消交易。如果交易在選定的時間範圍內達到止損水平,將自動觸發此功能。", "-471757681": "風險管理", "-843831637": "止損", "-771725194": "交易取消", "-338707425": "最小持續時間是1天", "-1003473648": "持續時間: {{duration}} 天", - "-740702998": "<0>{{title}} {{message}}", - "-1669741470": "到期時的賠付額等於每點賠付乘以最終價格與行權價格之間的差額。", "-1527492178": "買入被鎖定", "-725375562": "購入按鈕可在設定功能表上鎖定/解鎖", - "-774638412": "投注額必須介於 {{min_stake}} {{currency}} 和 {{max_stake}} {{currency}} 之間", - "-1358367903": "投注資金", - "-434270664": "目前價格", - "-1956787775": "障礙價格:", - "-1513281069": "障礙 2", "-390994177": "必須介於 {{min}} 和 {{max}} 之間", "-1804019534": "到期日: {{date}}", "-2055106024": "高級和簡單持續時間設定之間切換", @@ -3484,6 +3534,7 @@ "-1763848396": "看跌期權", "-194424366": "高於", "-857660728": "行權價格", + "-1358367903": "投注資金", "-1386326276": "障礙為必填欄位。", "-1418742026": "高障礙必須高於低障礙.", "-92007689": "低障礙必須低於高障礙.", @@ -3491,6 +3542,21 @@ "-1975910372": "分鐘數必須在 0 和 59 之間。", "-866277689": "到期時間不可為過去式。", "-1455298001": "現在", + "-256210543": "此時無法交易。", + "-1150099396": "正在努力為您提供此功能。如果有另一個帳戶,請切換到該帳戶以繼續交易。可以新建 Deriv MT5 金融帳戶。", + "-28115241": "此帳戶不可用 {{platform_name_trader}}", + "-453920758": "前往 {{platform_name_mt5}} 儀表板", + "-402175529": "歷史", + "-988484646": "交易取消(已執行)", + "-444882676": "交易取消(有效)", + "-13423018": "身份參考號", + "-2035315547": "低障礙", + "-1551639437": "沒有歷史", + "-1214703885": "還未更新止盈或止損", + "-504849554": "將於下述時間後重啟", + "-59803288": "同時請試試綜合指數。它模擬真實市場波動率,並全天候開放。", + "-1278109940": "檢視已開啟的市場", + "-694105443": "此市場已關閉", "-439389714": "正在處理", "-770929448": "前往 {{platform_name_smarttrader}}", "-347156282": "提交證明", @@ -3537,6 +3603,8 @@ "-454245976": "如果您認為市場價格會在指定期限內持續下跌,請選擇<0>短倉。如果市場價格沒有觸及或高於障礙,您將在到期時獲得賠付。如果未超出障礙,賠付將根據市場價格與障礙之間的差距成比例增長。當賠付高於投注額時,您將開始獲利。如果市場價格超出障礙,則不會有賠付。", "-351875097": "跳動點數目", "-729830082": "檢視較少內容", + "-1669741470": "到期時的賠付額等於每點賠付乘以最終價格與行權價格之間的差額。", + "-740702998": "<0>{{title}} {{message}}", "-1790089996": "新建!", "-993480898": "累計器", "-45873457": "新建", @@ -3557,6 +3625,10 @@ "-690963898": "當賠付額達到此金額,合約將自動平倉。", "-511541916": "達到此跳動點次數時,合約將自動平倉。", "-438655760": "<0>注意:可以隨時關閉交易。注意滑點風險。", + "-774638412": "投注額必須介於 {{min_stake}} {{currency}} 和 {{max_stake}} {{currency}} 之間", + "-434270664": "目前價格", + "-1956787775": "障礙價格:", + "-1513281069": "障礙 2", "-1683683754": "長倉", "-1046859144": "<0>{{title}} 如果市場價格保持在 {{price_position}} 並且沒有觸及或超出障礙,將獲得賠付。否則,賠付將為零。", "-1815023694": "超出障礙", diff --git a/packages/utils/package.json b/packages/utils/package.json index 25092ee3c66f..990ad33a913a 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,9 +3,15 @@ "private": true, "version": "1.0.0", "main": "src/index.ts", - "dependencies": {}, + "dependencies": { + "lodash.groupby": "^4.6.0", + "lodash.pickby": "^4.6.0", + "moment": "^2.29.2" + }, "devDependencies": { - "typescript": "^4.6.3", - "@deriv/api-types": "^1.0.118" + "@deriv/api-types": "^1.0.118", + "@types/lodash.groupby": "^4.6.7", + "@types/lodash.pickby": "^4.6.7", + "typescript": "^4.6.3" } } diff --git a/packages/utils/src/__tests__/getLocalStorage.spec.ts b/packages/utils/src/__tests__/getLocalStorage.spec.ts new file mode 100644 index 000000000000..2791dd262e3f --- /dev/null +++ b/packages/utils/src/__tests__/getLocalStorage.spec.ts @@ -0,0 +1,47 @@ +import { getLocalStorage } from '../getLocalStorage'; + +describe('getLocalStorage', () => { + beforeEach(() => { + localStorage.clear(); + }); + + test('should retrieve the stored value from localStorage', () => { + const key = 'test_key'; + const value = 'Hello'; + + localStorage.setItem(key, JSON.stringify(value)); + + const result = getLocalStorage(key); + + expect(result).toBe(value); + }); + + test('should return null when localStorage key does not exist', () => { + const key = 'non_existent_key'; + + const result = getLocalStorage(key); + + expect(result).toBeNull(); + }); + + test('should return null when localStorage value is null', () => { + const key = 'test_key'; + + localStorage.setItem(key, JSON.stringify(null)); + + const result = getLocalStorage(key); + + expect(result).toBeNull(); + }); + + test('should parse and return the stored value as an object', () => { + const key = 'test_key'; + const value = { name: 'John', age: 30 }; + + localStorage.setItem(key, JSON.stringify(value)); + + const result = getLocalStorage(key); + + expect(result).toEqual(value); + }); +}); diff --git a/packages/utils/src/__tests__/getLoginHistoryFormattedData.spec.tsx b/packages/utils/src/__tests__/getLoginHistoryFormattedData.spec.tsx new file mode 100644 index 000000000000..b26cde85c7fe --- /dev/null +++ b/packages/utils/src/__tests__/getLoginHistoryFormattedData.spec.tsx @@ -0,0 +1,33 @@ +import getLoginHistoryFormattedData from '../getLoginHistoryFormattedData'; + +describe('getLoginHistoryFormattedData', () => { + type TStatus = 0 | 1; + const mock_status: TStatus[] = [0, 1]; + const mock_login_history = [ + { + action: 'login', + environment: + '10-Oct-23 13:02:23GMT IP=MOCK.IP.ADDRESS IP_COUNTRY=AE User_AGENT=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 LANG=EN', + status: mock_status[0], + time: 1696942944, + }, + ]; + + it('should return all the expected key value pairs', () => { + const result = getLoginHistoryFormattedData(mock_login_history); + const required_keys = ['date', 'action', 'browser', 'ip', 'status', 'id']; + + expect(required_keys.toString()).toBe(Object.keys(result[0]).toString()); + }); + + it('should generate login history object with required information', () => { + const result_object = getLoginHistoryFormattedData(mock_login_history)[0]; + + expect(result_object.id).toEqual(0); + expect(result_object.date).toEqual('2023-10-10 13:02:23 GMT'); + expect(result_object.action).toEqual('Login'); + expect(result_object.browser).toEqual('Chrome v117.0.0.0'); + expect(result_object.ip).toEqual('MOCK.IP.ADDRESS'); + expect(result_object.status).toEqual('Failed'); + }); +}); diff --git a/packages/utils/src/__tests__/getWalletCurrencyIcon.spec.ts b/packages/utils/src/__tests__/getWalletCurrencyIcon.spec.ts new file mode 100644 index 000000000000..f14534d0a2b1 --- /dev/null +++ b/packages/utils/src/__tests__/getWalletCurrencyIcon.spec.ts @@ -0,0 +1,95 @@ +import getWalletCurrencyIcon from '../getWalletCurrencyIcon'; + +describe('getWalletCurrencyIcon', () => { + describe('Should return proper icons for cashier modal', () => { + it('should return proper icon for demo currency', () => { + expect(getWalletCurrencyIcon('demo', false, true)).toBe('IcWalletDerivDemoLight'); + }); + + it('should return proper icon for USDT, eUSDT, tUSDT, UST currency in dark mode', () => { + const currencies = ['USDT', 'eUSDT', 'tUSDT', 'UST']; + currencies.forEach(currency => { + expect(getWalletCurrencyIcon(currency, true, true)).toBe('IcWalletModalTetherDark'); + }); + }); + + it('should return proper icon for USDT, eUSDT, tUSDT, UST currency in light mode', () => { + const currencies = ['USDT', 'eUSDT', 'tUSDT', 'UST']; + currencies.forEach(currency => { + expect(getWalletCurrencyIcon(currency, false, true)).toBe('IcWalletModalTetherLight'); + }); + }); + }); + + describe('Should return proper icons for other components', () => { + it('should return proper icon for demo currency in dark mode', () => { + expect(getWalletCurrencyIcon('demo', false)).toBe('IcWalletDerivDemoLight'); + }); + + it('should return proper icon for demo currency in light mode', () => { + expect(getWalletCurrencyIcon('demo', true)).toBe('IcWalletDerivDemoDark'); + }); + + it('should return proper icon for USD currency in dark/light mode', () => { + expect(getWalletCurrencyIcon('USD')).toBe('IcWalletCurrencyUsd'); + }); + + it('should return proper icon for EUR currency in dark/light mode', () => { + expect(getWalletCurrencyIcon('EUR')).toBe('IcWalletCurrencyEur'); + }); + + it('should return proper icon for AUD currency in dark/light mode', () => { + expect(getWalletCurrencyIcon('AUD')).toBe('IcWalletCurrencyAud'); + }); + + it('should return proper icon for GBP currency in dark/light mode', () => { + expect(getWalletCurrencyIcon('GBP')).toBe('IcWalletCurrencyGbp'); + }); + + it('should return proper icon for BTC currency in dark mode', () => { + expect(getWalletCurrencyIcon('BTC', false)).toBe('IcWalletBitcoinLight'); + }); + + it('should return proper icon for BTC currency in light mode', () => { + expect(getWalletCurrencyIcon('BTC', true)).toBe('IcWalletBitcoinDark'); + }); + + it('should return proper icon for ETH currency in dark mode', () => { + expect(getWalletCurrencyIcon('ETH', false)).toBe('IcWalletEthereumLight'); + }); + + it('should return proper icon for ETH currency in light mode', () => { + expect(getWalletCurrencyIcon('ETH', true)).toBe('IcWalletEthereumDark'); + }); + + it('should return proper icon for USDT, eUSDT, tUSDT, UST currency in dark mode', () => { + const currencies = ['USDT', 'eUSDT', 'tUSDT', 'UST']; + currencies.forEach(currency => { + expect(getWalletCurrencyIcon(currency, true)).toBe('IcWalletTetherDark'); + }); + }); + + it('should return proper icon for USDT, eUSDT, tUSDT, UST currency in light mode', () => { + const currencies = ['USDT', 'eUSDT', 'tUSDT', 'UST']; + currencies.forEach(currency => { + expect(getWalletCurrencyIcon(currency, false)).toBe('IcWalletTetherLight'); + }); + }); + + it('should return proper icon for LTC currency in dark mode', () => { + expect(getWalletCurrencyIcon('LTC', false)).toBe('IcWalletLiteCoinLight'); + }); + + it('should return proper icon for LTC currency in light mode', () => { + expect(getWalletCurrencyIcon('LTC', true)).toBe('IcWalletLiteCoinDark'); + }); + + it('should return proper icon for USDC currency in dark mode', () => { + expect(getWalletCurrencyIcon('USDC', false)).toBe('IcWalletUsdCoinLight'); + }); + + it('should return proper icon for USDC currency in light mode', () => { + expect(getWalletCurrencyIcon('USDC', true)).toBe('IcWalletUsdCoinDark'); + }); + }); +}); diff --git a/packages/utils/src/__tests__/groupTransactionsByDay.spec.ts b/packages/utils/src/__tests__/groupTransactionsByDay.spec.ts new file mode 100644 index 000000000000..d49958cecec8 --- /dev/null +++ b/packages/utils/src/__tests__/groupTransactionsByDay.spec.ts @@ -0,0 +1,33 @@ +import groupTransactionsByDay from '../groupTransactionsByDay'; +import { Statement } from '@deriv/api-types'; + +describe('groupTransactionsByDay', () => { + it('should group transactions by day', () => { + const transactions: Statement['transactions'] = [ + { + transaction_time: new Date('08 Jun 2023').getTime() / 1000, + }, + { + transaction_time: new Date('10 Jun 2023').getTime() / 1000, + }, + { + transaction_time: new Date('12 Jun 2023').getTime() / 1000, + }, + { + transaction_time: new Date('08 Jun 2023').getTime() / 1000, + }, + { + transaction_time: new Date('10 Jun 2023').getTime() / 1000, + }, + { + transaction_time: new Date('12 Jun 2023').getTime() / 1000, + }, + ]; + + const grouped_transactions = groupTransactionsByDay(transactions); + + expect(transactions).toHaveLength(6); + expect(Object.keys(grouped_transactions)).toHaveLength(3); + expect(Object.keys(grouped_transactions)).toStrictEqual(['08 Jun 2023', '10 Jun 2023', '12 Jun 2023']); + }); +}); diff --git a/packages/utils/src/__tests__/parse-url.spec.tsx b/packages/utils/src/__tests__/parse-url.spec.tsx new file mode 100644 index 000000000000..a18d3bfcf313 --- /dev/null +++ b/packages/utils/src/__tests__/parse-url.spec.tsx @@ -0,0 +1,13 @@ +import { isExternalLink } from '../parse-url'; + +describe('isExternalLink', () => { + it('should return true if the link matches the regex for external link', () => { + expect(isExternalLink('https://www.deriv.com')).toBeTruthy(); + expect(isExternalLink('mailto://www.deriv.com')).toBeTruthy(); + }); + + it("should return false if the link dosen't match the for external link", () => { + expect(isExternalLink('localhost.binary.sx')).toBeFalsy(); + expect(isExternalLink('sftp://test_doc.com')).toBeFalsy(); + }); +}); diff --git a/packages/utils/src/getLocalStorage.ts b/packages/utils/src/getLocalStorage.ts new file mode 100644 index 000000000000..dfc8629515f7 --- /dev/null +++ b/packages/utils/src/getLocalStorage.ts @@ -0,0 +1,18 @@ +/** check is stringified object or not */ +const checkIsStringifiedObject = (s: string) => { + try { + return JSON.parse(s); + } catch (error) { + return s; + } +}; + +/** + * Retrieves the value stored in localStorage for the given key. + * @param {string} key - The localStorage key. + * @returns {any} - The value stored in localStorage for the given key, or null if the key does not exist or has no value. + */ +export const getLocalStorage = (key: string) => { + const data = localStorage.getItem(key); + return data ? checkIsStringifiedObject(data) : null; +}; diff --git a/packages/utils/src/getWalletCurrencyIcon.ts b/packages/utils/src/getWalletCurrencyIcon.ts new file mode 100644 index 000000000000..4c409738fa8d --- /dev/null +++ b/packages/utils/src/getWalletCurrencyIcon.ts @@ -0,0 +1,35 @@ +const getWalletCurrencyIcon = (currency: string, is_dark_mode_on = false, is_modal = false) => { + switch (currency) { + case 'demo': + if (is_modal) return 'IcWalletDerivDemoLight'; + return is_dark_mode_on ? 'IcWalletDerivDemoDark' : 'IcWalletDerivDemoLight'; + case 'USD': + return 'IcWalletCurrencyUsd'; + case 'EUR': + return 'IcWalletCurrencyEur'; + case 'AUD': + return 'IcWalletCurrencyAud'; + case 'GBP': + return 'IcWalletCurrencyGbp'; + case 'BTC': + return is_dark_mode_on ? 'IcWalletBitcoinDark' : 'IcWalletBitcoinLight'; + case 'ETH': + return is_dark_mode_on ? 'IcWalletEthereumDark' : 'IcWalletEthereumLight'; + case 'USDT': + case 'eUSDT': + case 'tUSDT': + case 'UST': + if (is_modal) { + return is_dark_mode_on ? 'IcWalletModalTetherDark' : 'IcWalletModalTetherLight'; + } + return is_dark_mode_on ? 'IcWalletTetherDark' : 'IcWalletTetherLight'; + case 'LTC': + return is_dark_mode_on ? 'IcWalletLiteCoinDark' : 'IcWalletLiteCoinLight'; + case 'USDC': + return is_dark_mode_on ? 'IcWalletUsdCoinDark' : 'IcWalletUsdCoinLight'; + default: + return ''; + } +}; + +export default getWalletCurrencyIcon; diff --git a/packages/utils/src/groupTransactionsByDay.ts b/packages/utils/src/groupTransactionsByDay.ts new file mode 100644 index 000000000000..e7379c15eb89 --- /dev/null +++ b/packages/utils/src/groupTransactionsByDay.ts @@ -0,0 +1,21 @@ +import groupBy from 'lodash.groupby'; +import pickBy from 'lodash.pickby'; +import moment from 'moment'; +import { Statement } from '@deriv/api-types'; + +const groupTransactionsByDay = (transactions: Statement['transactions']) => { + const grouped_transactions = pickBy( + groupBy(transactions, transaction => { + return transaction.transaction_time + ? moment(transaction.transaction_time * 1000) + .startOf('day') + .format('DD MMM YYYY') + : null; + }), + (value, key) => key !== null + ); + + return grouped_transactions; +}; + +export default groupTransactionsByDay; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 30af776f608a..d7c5cb086790 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,6 +1,10 @@ export { default as getAccountsFromLocalStorage } from './getAccountsFromLocalStorage'; export { default as getActiveAuthTokenIDFromLocalStorage } from './getActiveAuthTokenIDFromLocalStorage'; export { default as getActiveLoginIDFromLocalStorage } from './getActiveLoginIDFromLocalStorage'; +export { getLocalStorage } from './getLocalStorage'; +export { default as getWalletCurrencyIcon } from './getWalletCurrencyIcon'; +export { default as groupTransactionsByDay } from './groupTransactionsByDay'; export { default as getTruncatedString } from './getTruncatedString'; export { default as unFormatLocaleString } from './unFormatLocaleString'; export { default as getLoginHistoryFormattedData } from './getLoginHistoryFormattedData'; +export * from './parse-url'; diff --git a/packages/utils/src/parse-url.ts b/packages/utils/src/parse-url.ts new file mode 100644 index 000000000000..cd1262aad5ac --- /dev/null +++ b/packages/utils/src/parse-url.ts @@ -0,0 +1,6 @@ +/** + * Checks if the url passed via prop is the route to external URL resource by checking if it starts with http, https or mailto + * @param link string + * @returns boolean + */ +export const isExternalLink = (link: string) => /^(http|https|mailto):/i.test(link); diff --git a/packages/wallets/src/components/CreatePassword/CreatePassword.tsx b/packages/wallets/src/components/CreatePassword/CreatePassword.tsx index 48b90482326c..aab983bfa26a 100644 --- a/packages/wallets/src/components/CreatePassword/CreatePassword.tsx +++ b/packages/wallets/src/components/CreatePassword/CreatePassword.tsx @@ -1,6 +1,9 @@ import React from 'react'; + import { useAvailableMT5Accounts, useCreateOtherCFDAccount } from '@deriv/api'; + import PasswordShowIcon from '../../public/images/ic-password-show.svg'; + import './CreatePassword.scss'; type TPlatformMT5 = NonNullable['data']>[number]['platform']; diff --git a/packages/wallets/src/components/DesktopWalletsList/DesktopWalletsList.tsx b/packages/wallets/src/components/DesktopWalletsList/DesktopWalletsList.tsx index d84ef33bc816..b4f64c50c0e0 100644 --- a/packages/wallets/src/components/DesktopWalletsList/DesktopWalletsList.tsx +++ b/packages/wallets/src/components/DesktopWalletsList/DesktopWalletsList.tsx @@ -1,8 +1,11 @@ import React from 'react'; + import { useAuthorize, useWalletAccountsList } from '@deriv/api'; + import { AccountsList } from '../AccountsList'; import { WalletListCard } from '../WalletListCard'; import { WalletsAccordion } from '../WalletsAccordion'; + import './DesktopWalletsList.scss'; const DesktopWalletsList: React.FC = () => { diff --git a/packages/wallets/src/components/DxtradeEnterPasswordModal/DxtradeEnterPasswordModal.tsx b/packages/wallets/src/components/DxtradeEnterPasswordModal/DxtradeEnterPasswordModal.tsx index 542de3a944cc..f021ef9d4c20 100644 --- a/packages/wallets/src/components/DxtradeEnterPasswordModal/DxtradeEnterPasswordModal.tsx +++ b/packages/wallets/src/components/DxtradeEnterPasswordModal/DxtradeEnterPasswordModal.tsx @@ -1,9 +1,12 @@ import React, { useEffect, useState } from 'react'; + import { useActiveWalletAccount, useCreateOtherCFDAccount } from '@deriv/api'; + import DxTradePasswordIcon from '../../public/images/ic-dxtrade-password.svg'; import { CreatePassword } from '../CreatePassword'; import { useModal } from '../ModalProvider'; import { ModalWrapper } from '../ModalWrapper'; + import './DxtradeEnterPasswordModal.scss'; const DxtradeEnterPasswordModal = () => { diff --git a/packages/wallets/src/components/JurisdictionModal/JurisdictionCard.tsx b/packages/wallets/src/components/JurisdictionModal/JurisdictionCard.tsx index a264c5af14cc..7598ca1ff2f7 100644 --- a/packages/wallets/src/components/JurisdictionModal/JurisdictionCard.tsx +++ b/packages/wallets/src/components/JurisdictionModal/JurisdictionCard.tsx @@ -1,7 +1,9 @@ import React, { useState } from 'react'; import classNames from 'classnames'; + import JurisdictionCardRow from './JurisdictionCardRow'; import JurisdictionCardTag from './JurisdictionCardTag'; + import './JurisdictionCard.scss'; type TJurisdictionCardProps = { diff --git a/packages/wallets/src/components/JurisdictionModal/JurisdictionCardRow.tsx b/packages/wallets/src/components/JurisdictionModal/JurisdictionCardRow.tsx index 8e3a9b1e2e48..848a8d5c3441 100644 --- a/packages/wallets/src/components/JurisdictionModal/JurisdictionCardRow.tsx +++ b/packages/wallets/src/components/JurisdictionModal/JurisdictionCardRow.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import './JurisdictionCardRow.scss'; type TJurisdictionCardRowProps = { diff --git a/packages/wallets/src/components/JurisdictionModal/JurisdictionCardTag.tsx b/packages/wallets/src/components/JurisdictionModal/JurisdictionCardTag.tsx index 49f9b133f895..1afb3f80d555 100644 --- a/packages/wallets/src/components/JurisdictionModal/JurisdictionCardTag.tsx +++ b/packages/wallets/src/components/JurisdictionModal/JurisdictionCardTag.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import './JurisdictionCardTag.scss'; type TJurisdictionCardTagProps = { diff --git a/packages/wallets/src/components/MT5PasswordModal/MT5PasswordModal.tsx b/packages/wallets/src/components/MT5PasswordModal/MT5PasswordModal.tsx index 05006ae3e212..163f6cf8a0a6 100644 --- a/packages/wallets/src/components/MT5PasswordModal/MT5PasswordModal.tsx +++ b/packages/wallets/src/components/MT5PasswordModal/MT5PasswordModal.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from 'react'; + import { useActiveWalletAccount, useAvailableMT5Accounts, @@ -7,6 +8,7 @@ import { useSettings, useSortedMT5Accounts, } from '@deriv/api'; + import MT5PasswordIcon from '../../public/images/ic-mt5-password.svg'; import { CreatePassword } from '../CreatePassword'; import { EnterPassword } from '../EnterPassword'; diff --git a/packages/wallets/src/components/ModalWrapper/ModalWrapper.tsx b/packages/wallets/src/components/ModalWrapper/ModalWrapper.tsx index fde9dcb20171..30418c1f1607 100644 --- a/packages/wallets/src/components/ModalWrapper/ModalWrapper.tsx +++ b/packages/wallets/src/components/ModalWrapper/ModalWrapper.tsx @@ -1,6 +1,8 @@ import React, { FC } from 'react'; + import CloseIcon from '../../public/images/ic-close-dark.svg'; import { useModal } from '../ModalProvider'; + import './ModalWrapper.scss'; type TProps = { diff --git a/packages/wallets/src/components/WalletCard/WalletCard.tsx b/packages/wallets/src/components/WalletCard/WalletCard.tsx index e9343b691914..c68b2e2d96a6 100644 --- a/packages/wallets/src/components/WalletCard/WalletCard.tsx +++ b/packages/wallets/src/components/WalletCard/WalletCard.tsx @@ -1,8 +1,11 @@ import React from 'react'; + import { useWalletAccountsList } from '@deriv/api'; + import { WalletCardIcon } from '../WalletCardIcon'; import { WalletGradientBackground } from '../WalletGradientBackground'; import { WalletListCardBadge } from '../WalletListCardBadge'; + import './WalletCard.scss'; type TProps = { diff --git a/packages/wallets/src/components/WalletCardIcon/WalletCardIcon.tsx b/packages/wallets/src/components/WalletCardIcon/WalletCardIcon.tsx index 6d265f8927e8..3632c2fd5d30 100644 --- a/packages/wallets/src/components/WalletCardIcon/WalletCardIcon.tsx +++ b/packages/wallets/src/components/WalletCardIcon/WalletCardIcon.tsx @@ -1,4 +1,5 @@ import React from 'react'; + import useDevice from '../../hooks/useDevice'; import Bitcoin from '../../public/images/bitcoin.svg'; import Demo from '../../public/images/demo.svg'; diff --git a/packages/wallets/src/components/WalletTransactions/WalletTransactions.tsx b/packages/wallets/src/components/WalletTransactions/WalletTransactions.tsx index bdb02fb8afd1..90d1209d287d 100644 --- a/packages/wallets/src/components/WalletTransactions/WalletTransactions.tsx +++ b/packages/wallets/src/components/WalletTransactions/WalletTransactions.tsx @@ -1,4 +1,4 @@ -import React, { ComponentProps } from 'react'; +import React, { ComponentProps, useState } from 'react'; import { WalletTransactionsCrypto } from '../WalletTransactionsCrypto'; import { WalletTransactionsFilter } from '../WalletTransactionsFilter'; import './WalletTransactions.scss'; diff --git a/packages/wallets/src/components/WalletsAccordion/WalletsAccordion.tsx b/packages/wallets/src/components/WalletsAccordion/WalletsAccordion.tsx index f27fb2d59aa6..775a9ab22f94 100644 --- a/packages/wallets/src/components/WalletsAccordion/WalletsAccordion.tsx +++ b/packages/wallets/src/components/WalletsAccordion/WalletsAccordion.tsx @@ -1,5 +1,7 @@ import React, { useEffect, useRef } from 'react'; + import IcDropdown from '../../public/images/ic-dropdown.svg'; + import './WalletsAccordion.scss'; type TProps = { diff --git a/types/global.d.ts b/types/global.d.ts index 2f5bbbfa742c..9f1d1d23ab11 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -13,6 +13,9 @@ declare global { }; TrackJS: { console: { log: (arg0: unknown[]) => void }; track: (arg0: object) => void }; Blockly; + Onfido: { + init: (args: any) => any; + }; } }