diff --git a/.github/workflows/flow-and-lint.yml b/.github/workflows/flow-and-lint.yml index 85b6cdfab6..c53ccaf7c8 100644 --- a/.github/workflows/flow-and-lint.yml +++ b/.github/workflows/flow-and-lint.yml @@ -1,4 +1,4 @@ -name: Flow and lint +name: Flow and Lint and TSC on: workflow_dispatch: @@ -43,4 +43,7 @@ jobs: npm run flow - name: lint run: | - npm run eslint \ No newline at end of file + npm run eslint + - name: tsc + run: | + npm run tsc \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 146d983e00..347135abdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,9 +116,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -137,24 +137,27 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1570,16 +1573,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", - "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", + "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/type-utils": "8.8.0", - "@typescript-eslint/utils": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/type-utils": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1603,15 +1606,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", - "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", + "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/typescript-estree": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", "debug": "^4.3.4" }, "engines": { @@ -1631,13 +1634,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", - "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", + "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0" + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1648,13 +1651,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", - "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", + "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.8.0", - "@typescript-eslint/utils": "8.8.0", + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/utils": "8.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1665,6 +1668,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1672,9 +1678,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", - "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", + "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1685,13 +1691,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", - "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", + "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1737,15 +1743,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", - "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", + "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/typescript-estree": "8.8.0" + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1756,16 +1762,21 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", - "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", + "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.8.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.16.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1775,6 +1786,18 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", @@ -3106,9 +3129,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3285,9 +3308,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -6673,9 +6696,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -8125,9 +8148,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz", + "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==", "dev": true, "engines": { "node": ">=16" diff --git a/packages/e2e-tests/package-lock.json b/packages/e2e-tests/package-lock.json index 284e8c0295..f7064c2d92 100644 --- a/packages/e2e-tests/package-lock.json +++ b/packages/e2e-tests/package-lock.json @@ -41,7 +41,7 @@ "@emurgo/cardano-serialization-lib-nodejs": "^12.0.0-alpha.26", "bignumber.js": "^9.1.2", "chai": "^4.3.10", - "chromedriver": "130.0.1", + "chromedriver": "131.0.0", "cross-env": "^7.0.3", "json-server": "^0.17.4", "mocha": "^10.2.0", @@ -450,9 +450,9 @@ } }, "node_modules/chromedriver": { - "version": "130.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-130.0.1.tgz", - "integrity": "sha512-JH+OxDZ7gVv02r9oXwj4mQ8JCtj62g0fCD1LMUUYdB/4mPxn/E2ys+1IzXItoE7vXM9fGVc9R1akvXLqwwuSww==", + "version": "131.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-131.0.0.tgz", + "integrity": "sha512-ukYmdCox2eRsjpCYUB4AOLV1fSfWQ1ZPfcUc0PIUWZKoyjyXKEl8i4DJ14bcNzNbEvaVx2Z2pnx/nLK2CM+ruQ==", "dev": true, "hasInstallScript": true, "dependencies": { diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 7498dade11..7d9dfc8772 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -47,7 +47,7 @@ "@emurgo/cardano-serialization-lib-nodejs": "^12.0.0-alpha.26", "bignumber.js": "^9.1.2", "chai": "^4.3.10", - "chromedriver": "130.0.1", + "chromedriver": "131.0.0", "cross-env": "^7.0.3", "json-server": "^0.17.4", "mocha": "^10.2.0", diff --git a/packages/yoroi-extension/.gitignore b/packages/yoroi-extension/.gitignore index e5f88b3bce..fad4529c33 100644 --- a/packages/yoroi-extension/.gitignore +++ b/packages/yoroi-extension/.gitignore @@ -45,4 +45,6 @@ Yoroi Shelley Testnet .netlify # SSL overrides for DEV -scripts/sslOverrides.js \ No newline at end of file +scripts/sslOverrides.js + +app/UI/**/*.d.ts diff --git a/packages/yoroi-extension/app/UI/components/BackButton.tsx b/packages/yoroi-extension/app/UI/components/BackButton.tsx new file mode 100644 index 0000000000..7f50212dbb --- /dev/null +++ b/packages/yoroi-extension/app/UI/components/BackButton.tsx @@ -0,0 +1,26 @@ +import { Button, Typography } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import React from 'react'; +import { ReactComponent as BackIcon } from '../../assets/images/assets-page/back-arrow.inline.svg'; + +const SButton = styled(Button)(({ theme }: any) => ({ + color: theme.palette.ds.el_gray_medium, + '&.MuiButton-sizeMedium': { + padding: '13px 16px', + }, + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + +export const BackButton = ({ label, onAction }: { label: string; onAction: () => void }) => { + return ( + }> + + {label} + + + ); +}; diff --git a/packages/yoroi-extension/app/UI/components/Collapsible/Collapsible.tsx b/packages/yoroi-extension/app/UI/components/Collapsible/Collapsible.tsx index f587de6765..0d635d7d0c 100644 --- a/packages/yoroi-extension/app/UI/components/Collapsible/Collapsible.tsx +++ b/packages/yoroi-extension/app/UI/components/Collapsible/Collapsible.tsx @@ -38,17 +38,18 @@ const AccordionDetails = styled(MuiAccordionDetails)(({ theme }: any) => ({ type Props = { title: string; content: React.ReactNode; + expanded?: boolean, }; -export const Collapsible = ({ title, content }: Props) => { - const [expanded, setExpanded] = React.useState('none'); +export const Collapsible = ({ title, content, expanded: startExpanded }: Props) => { + const [expanded, setExpanded] = React.useState(startExpanded ?? false); - const handleChange = (panel: string | false) => (_: React.SyntheticEvent, newExpanded: boolean) => { - setExpanded(newExpanded ? panel : false); + const handleChange = (_: React.SyntheticEvent, newExpanded: boolean) => { + setExpanded(newExpanded); }; return ( - + ({ - borderRadius: `${theme.shape.borderRadius}px`, +const StyledInput = styled(OutlinedInput)(({ theme }: any) => ({ width: '320px', height: '40px', - padding: `${theme.spacing(1)} ${theme.spacing(2)} ${theme.spacing(1)} ${theme.spacing(1)}`, - border: '1px solid', - borderColor: theme.palette.ds.gray_400, - 'input::placeholder': { - color: theme.palette.ds.gray_600, + padding: '8px', + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_low, + }, + }, + '& input::placeholder': { + color: theme.palette.ds.el_gray_low, + opacity: 1, }, })); diff --git a/packages/yoroi-extension/app/UI/components/TransactionFailed/TransactionFailed.tsx b/packages/yoroi-extension/app/UI/components/TransactionFailed/TransactionFailed.tsx index f40ab28149..01884d3619 100644 --- a/packages/yoroi-extension/app/UI/components/TransactionFailed/TransactionFailed.tsx +++ b/packages/yoroi-extension/app/UI/components/TransactionFailed/TransactionFailed.tsx @@ -4,9 +4,12 @@ import { FormattedMessage } from 'react-intl'; import globalMessages from '../../../i18n/global-messages'; import { useNavigateTo } from '../../features/governace/common/useNavigateTo'; import { FailedIlustration } from './FailedIlustration'; +import LocalizableError from '../../../i18n/LocalizableError'; -export const TransactionFailed = () => { +export const TransactionFailed = (props: { error: Error | null }) => { const navigate = useNavigateTo(); + const { error } = props; + return ( @@ -14,7 +17,9 @@ export const TransactionFailed = () => { - + {/* @ts-ignore */} @@ -102,10 +96,7 @@ export default class WalletInfo extends Component { if (request.shouldHideBalance) { balanceDisplay = {hiddenAmount}; } else { - const [beforeDecimalRewards, afterDecimalRewards] = splitAmount( - shiftedAmount, - tokenInfo.Metadata.numberOfDecimals - ); + const [beforeDecimalRewards, afterDecimalRewards] = splitAmount(shiftedAmount, tokenInfo.Metadata.numberOfDecimals); balanceDisplay = ( <> @@ -131,8 +122,16 @@ export default class WalletInfo extends Component { const truncatedName = truncateLongName(walletName); return ( - {walletName}}> - {truncatedName} + + {walletName} + + } + > + + {truncatedName} + ); }; diff --git a/packages/yoroi-extension/app/components/common/walletInfo/WalletInfo.scss b/packages/yoroi-extension/app/components/common/walletInfo/WalletInfo.scss index 85ffe01693..01a53ad5d2 100644 --- a/packages/yoroi-extension/app/components/common/walletInfo/WalletInfo.scss +++ b/packages/yoroi-extension/app/components/common/walletInfo/WalletInfo.scss @@ -28,7 +28,6 @@ font-weight: 500; font-size: 14px; line-height: 22px; - color: var(--yoroi-palette-gray-900); margin-right: 4px; display: flex; align-items: center; @@ -40,7 +39,6 @@ } .plate { - color: var(--yoroi-palette-gray-600); font-weight: 400; font-size: 12px; line-height: 20px; @@ -64,7 +62,6 @@ font-weight: 500; font-size: 14px; line-height: 22px; - color: var(--yoroi-palette-gray-900); .isLoading { margin-left: 9px; diff --git a/packages/yoroi-extension/app/components/layout/CenteredLayout.js b/packages/yoroi-extension/app/components/layout/CenteredLayout.js index bdace96563..046a9bd7f5 100644 --- a/packages/yoroi-extension/app/components/layout/CenteredLayout.js +++ b/packages/yoroi-extension/app/components/layout/CenteredLayout.js @@ -14,7 +14,7 @@ function CenteredLayout({ children }: Props): Node { display: 'flex', alignItems: 'center', justifyContent: 'space-between', - backgroundColor: 'var(--yoroi-loading-background-color)', + backgroundColor: 'ds.bg_color_max', height: '100%', }} > diff --git a/packages/yoroi-extension/app/components/layout/HorizintallyCenteredLayout.js b/packages/yoroi-extension/app/components/layout/HorizintallyCenteredLayout.js new file mode 100644 index 0000000000..6ba97af118 --- /dev/null +++ b/packages/yoroi-extension/app/components/layout/HorizintallyCenteredLayout.js @@ -0,0 +1,24 @@ +// @flow +import type { Node, ComponentType } from 'react'; +import { observer } from 'mobx-react'; +import { Box } from '@mui/system'; + +type Props = {| + +children: Node, +|}; + +function HorizontallyCenteredLayout({ children }: Props): Node { + return ( + + {children} + + ); +} +export default (observer(HorizontallyCenteredLayout): ComponentType); diff --git a/packages/yoroi-extension/app/components/layout/TopBarLayout.js b/packages/yoroi-extension/app/components/layout/TopBarLayout.js index f4e254bbc4..01f536b7ed 100644 --- a/packages/yoroi-extension/app/components/layout/TopBarLayout.js +++ b/packages/yoroi-extension/app/components/layout/TopBarLayout.js @@ -74,7 +74,7 @@ function TopBarLayout({ flex: '0 1 auto', height: '100%', }), - overflow: isRevamp ? 'auto' : 'unset', + overflow: 'scroll', }} > {isRevamp ? ( diff --git a/packages/yoroi-extension/app/components/profile/language-selection/LanguageSelectionForm.js b/packages/yoroi-extension/app/components/profile/language-selection/LanguageSelectionForm.js index 6692a51a2d..83a0546d5e 100644 --- a/packages/yoroi-extension/app/components/profile/language-selection/LanguageSelectionForm.js +++ b/packages/yoroi-extension/app/components/profile/language-selection/LanguageSelectionForm.js @@ -29,6 +29,7 @@ type Props = {| +error?: ?LocalizableError, +localizedTermsOfUse: string, +localizedPrivacyNotice: string, + +externalPrivacyPolicyURL: ?string, |}; type State = {| @@ -82,7 +83,13 @@ class LanguageSelectionForm extends Component { const isStartupScreen = variant === 'startup'; const isSettingsScreen = variant === 'settings'; + const isFirefox = environment.isFirefox(); + const analyticsDetails = [ [YesIcon, messages.line1], [YesIcon, messages.line2], + (isFirefox ? [YesIcon, messages.rejectionImpact] : null), [NoIcon, messages.line3], [NoIcon, messages.line4], [NoIcon, messages.line5], - ]; + ].filter(Boolean); return ( + <>
{isSettingsScreen && ( @@ -136,6 +153,45 @@ export default class OptForAnalyticsForm extends Component { ))} +
+
+ + {isFirefox ? ( + + + {intl.formatMessage(messages.collectedData)} + + + + + {intl.formatMessage(messages.privacyNotice)} + + + + ) : null} + + +
{ )}
+ ); } } diff --git a/packages/yoroi-extension/app/components/settings/categories/SupportSettings.js b/packages/yoroi-extension/app/components/settings/categories/SupportSettings.js index d063636837..fa63317278 100644 --- a/packages/yoroi-extension/app/components/settings/categories/SupportSettings.js +++ b/packages/yoroi-extension/app/components/settings/categories/SupportSettings.js @@ -37,11 +37,20 @@ const messages = defineMessages({ id: 'settings.support.logs.title', defaultMessage: '!!!Logs', }, + paperWallet: { + id: 'settings.support.paperWallet.title', + defaultMessage: '!!!Paper Wallet', + }, + paperWalletTransfer: { + id: 'settings.support.paperWallet.button', + defaultMessage: '!!!Transfer from Paper Wallet', + }, }); type Props = {| +onExternalLinkClick: MouseEvent => void, +onDownloadLogs: void => void, + +onPaperWalletTransfer: void => void, |}; type InjectedProps = {| +isRevampLayout: boolean |}; @@ -150,6 +159,21 @@ class SupportSettings extends Component { > {intl.formatMessage(globalMessages.downloadLogsButtonLabel)} + + + + {intl.formatMessage(messages.paperWallet)} + + + ); } diff --git a/packages/yoroi-extension/app/components/settings/categories/general-setting/ThemeSettingsBlock.js b/packages/yoroi-extension/app/components/settings/categories/general-setting/ThemeSettingsBlock.js index 74daf9c854..42c6d8ff67 100644 --- a/packages/yoroi-extension/app/components/settings/categories/general-setting/ThemeSettingsBlock.js +++ b/packages/yoroi-extension/app/components/settings/categories/general-setting/ThemeSettingsBlock.js @@ -28,7 +28,7 @@ export default class ThemeSettingsBlock extends Component { py: false, }} > - {environment.isDev() && ( + {(environment.isDev() || environment.isNightly()) && ( diff --git a/packages/yoroi-extension/app/components/settings/menu/SettingsMenu.js b/packages/yoroi-extension/app/components/settings/menu/SettingsMenu.js index 6d69743fdb..886ce6d4b6 100644 --- a/packages/yoroi-extension/app/components/settings/menu/SettingsMenu.js +++ b/packages/yoroi-extension/app/components/settings/menu/SettingsMenu.js @@ -47,7 +47,7 @@ class SettingsMenu extends Component { render(): Node { const { intl } = this.context; - const { onItemClick, isActiveItem, isRevampLayout } = this.props; + const { onItemClick, isActiveItem } = this.props; const isProduction = environmnent.isProduction(); const settingOptions: Array = [ { @@ -72,9 +72,7 @@ class SettingsMenu extends Component { hidden: isProduction, }, { - label: intl.formatMessage( - isRevampLayout ? globalMessages.termsOfService : globalMessages.termsOfUse - ), + label: intl.formatMessage(globalMessages.termsOfService), route: ROUTES.SETTINGS.TERMS_OF_USE, className: 'termsOfUse', }, @@ -92,18 +90,10 @@ class SettingsMenu extends Component { label: intl.formatMessage(settingsMenuMessages.analytics), route: ROUTES.SETTINGS.ANALYTICS, className: 'analytics', - hidden: !isRevampLayout, }, ]; - return ( - - ); + return ; } } diff --git a/packages/yoroi-extension/app/components/topbar/NavBarRevamp.js b/packages/yoroi-extension/app/components/topbar/NavBarRevamp.js index eae3d5f53e..deaec4c393 100644 --- a/packages/yoroi-extension/app/components/topbar/NavBarRevamp.js +++ b/packages/yoroi-extension/app/components/topbar/NavBarRevamp.js @@ -66,7 +66,7 @@ class NavBarRevamp extends Component { }} > - {title} + {title} {children} diff --git a/packages/yoroi-extension/app/components/topbar/SideBarCategoryRevamp.js b/packages/yoroi-extension/app/components/topbar/SideBarCategoryRevamp.js index 016ca3f434..cd857513e0 100644 --- a/packages/yoroi-extension/app/components/topbar/SideBarCategoryRevamp.js +++ b/packages/yoroi-extension/app/components/topbar/SideBarCategoryRevamp.js @@ -18,7 +18,7 @@ type Props = {| const ItemWrapper = styled(Box)(({ theme, active }) => ({ cursor: 'pointer', - background: active && theme.palette.ds.special_web_bg_sidebar, + background: active !== 'false' && theme.palette.ds.special_web_bg_sidebar, paddingTop: '8px', paddingBottom: '8px', width: '100%', @@ -48,7 +48,7 @@ export default class SideBarCategoryRevamp extends Component { id={label.id} onClick={onClick} disabled={active} - active={active} + active={active.toString()} > diff --git a/packages/yoroi-extension/app/components/topbar/WalletCard.js b/packages/yoroi-extension/app/components/topbar/WalletCard.js index 91bacdf9d3..2c3d1d39f6 100644 --- a/packages/yoroi-extension/app/components/topbar/WalletCard.js +++ b/packages/yoroi-extension/app/components/topbar/WalletCard.js @@ -42,9 +42,7 @@ type Props = {| id: string, |}; -export function constructPlate40( - plate: WalletChecksum, -): [string, React$Element<'div'>] { +export function constructPlate40(plate: WalletChecksum): [string, React$Element<'div'>] { return constructPlate(plate, { saturationFactor: 0, size: 8, @@ -54,9 +52,7 @@ export function constructPlate40( }); } -export function constructPlate32( - plate: WalletChecksum, -): [string, React$Element<'div'>] { +export function constructPlate32(plate: WalletChecksum): [string, React$Element<'div'>] { return constructPlate(plate, { saturationFactor: 0, size: 8, @@ -76,7 +72,8 @@ export function constructPlate( borderRadius: number, |} ): [string, React$Element<'div'>] { - return [plate.TextPart, ( + return [ + plate.TextPart, - - )]; + , + ]; } const IconWrapper = styled(Box)(({ theme }) => ({ @@ -131,7 +128,7 @@ export default class WalletCard extends Component { const walletTokensAmountId = `${id}:walletCard_${idx}-walletTokensAmount-text`; const walletNFTsAmountId = `${id}:walletCard_${idx}-walletNFTsAmount-text`; - const draggableBoxBorderColor = (isDragging) => { + const draggableBoxBorderColor = isDragging => { if (isDragging) { return 'ds.gray_200'; } @@ -139,118 +136,111 @@ export default class WalletCard extends Component { return 'ds.primary_600'; } return 'transparent'; - } + }; return ( {(provided, snapshot) => { return ( - - - {/* Wallet icon, wallet name, wallet plate */} - - {iconComponent} - - - {truncateLongName(this.props.name)} - - - {walletPlate} - + + + {/* Wallet icon, wallet name, wallet plate */} + + {iconComponent} + + + {truncateLongName(this.props.name)} + + + {walletPlate} + + - - {/* Wallet balance */} - - - - {/* Tokens amount info */} - - - - {intl.formatMessage(messages.tokenTypes)}{':'} - - - {tokenTypes} - + {/* Wallet balance */} + + - - - NFTs{':'} - - - {nfts} - + {/* Tokens amount info */} + + + + {intl.formatMessage(messages.tokenTypes)} + {':'} + + + {tokenTypes} + + + + + NFTs{':'} + + + {nfts} + + + + + + + - - - - - - - )}} + ); + }} ); diff --git a/packages/yoroi-extension/app/components/transfer/cards/TransferCards.scss b/packages/yoroi-extension/app/components/transfer/cards/TransferCards.scss index 86fb38fe15..737783f665 100644 --- a/packages/yoroi-extension/app/components/transfer/cards/TransferCards.scss +++ b/packages/yoroi-extension/app/components/transfer/cards/TransferCards.scss @@ -22,7 +22,7 @@ } .tooltipSize { - width: 500px; + max-width: 500px; overflow-wrap: break-word; white-space: normal; } diff --git a/packages/yoroi-extension/app/components/uri/URIGenerateDialog.js b/packages/yoroi-extension/app/components/uri/URIGenerateDialog.js index 684a66cdac..b88d8e636f 100644 --- a/packages/yoroi-extension/app/components/uri/URIGenerateDialog.js +++ b/packages/yoroi-extension/app/components/uri/URIGenerateDialog.js @@ -142,7 +142,7 @@ export default class URIGenerateDialog extends Component { >
- +
({ backgroundImage: theme.palette.ds.bg_gradient_1, + borderRadius: '8px', + '&:hover': { + backgroundImage: theme.palette.ds.bg_gradient_2, + }, })); type Props = {| @@ -19,7 +23,7 @@ export default function AddWalletCard(props: Props): Node { return (
diff --git a/packages/yoroi-extension/app/components/wallet/assets/NFTDetails.js b/packages/yoroi-extension/app/components/wallet/assets/NFTDetails.js index bbc0e9c07f..442e9deadf 100644 --- a/packages/yoroi-extension/app/components/wallet/assets/NFTDetails.js +++ b/packages/yoroi-extension/app/components/wallet/assets/NFTDetails.js @@ -121,7 +121,7 @@ const SImageButton = styled(IconButton)(({ theme }) => ({ })); const STypography = styled(Typography)(({ theme }) => ({ - color: theme.palette.ds.el_gray_medium + color: theme.palette.ds.el_gray_medium, })); function NFTDetails({ nftInfo, network, intl, nextNftId, prevNftId, tab }: Props & Intl): Node { @@ -172,7 +172,9 @@ function NFTDetails({ nftInfo, network, intl, nextNftId, prevNftId, tab }: Props return ( }> - {intl.formatMessage(messages.back)} + + {intl.formatMessage(messages.back)} + ) => string | void = network => { - return isTestnet(network) ? 'https://testnet.cardanoscan.io/token' : 'https://cardanoscan.io/token'; + return isTestnet(network) ? 'https://preprod.cardanoscan.io/token' : 'https://cardanoscan.io/token'; }; function TokenDetails({ tokenInfo, network, intl }: Props & Intl): Node { diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/AddWalletDetailsStep.js b/packages/yoroi-extension/app/components/wallet/create-wallet/AddWalletDetailsStep.js index 9db496e052..9dd1ead00c 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/AddWalletDetailsStep.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/AddWalletDetailsStep.js @@ -13,16 +13,20 @@ import config from '../../../config'; import WalletNameAndPasswordTipsDialog from './WalletNameAndPasswordTipsDialog'; import TextField from '../../common/TextField'; import WalletPlate from './WalletPlate'; -import { - isValidWalletName, - isValidWalletPassword, - isValidRepeatPassword, -} from '../../../utils/validations'; +import { isValidWalletName, isValidWalletPassword, isValidRepeatPassword } from '../../../utils/validations'; import { observer } from 'mobx-react'; -import { Stack, Typography, Box } from '@mui/material'; +import { Stack, Typography, Box, styled } from '@mui/material'; import { TIPS_DIALOGS, isDialogShownBefore } from './steps'; import { ReactComponent as InfoIcon } from '../../../assets/images/info-icon-primary.inline.svg'; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + const messages: * = defineMessages({ createDesc: { id: 'wallet.create.forthStep.description', @@ -31,8 +35,7 @@ const messages: * = defineMessages({ }, restoreDesc: { id: 'wallet.restore.fourthStep.description', - defaultMessage: - '!!!Add your wallet name and password to complete the wallet restoration process.', + defaultMessage: '!!!Add your wallet name and password to complete the wallet restoration process.', }, enterWalletName: { id: 'wallet.create.forthStep.enterWalletNameInputLabel', @@ -44,8 +47,7 @@ const messages: * = defineMessages({ }, passwordHint: { id: 'wallet.create.forthStep.passwordHint', - defaultMessage: - '!!!Use a combination of letters, numbers and symbols to make your password stronger', + defaultMessage: '!!!Use a combination of letters, numbers and symbols to make your password stronger', }, repeatPasswordLabel: { id: 'wallet.create.forthStep.repeatPasswordLabel', @@ -82,10 +84,7 @@ export default class AddWalletDetailsStep extends Component { label: this.context.intl.formatMessage(messages.enterWalletName), value: '', validators: [ - ({ field }) => [ - isValidWalletName(field.value), - this.context.intl.formatMessage(globalMessages.invalidWalletName), - ], + ({ field }) => [isValidWalletName(field.value), this.context.intl.formatMessage(globalMessages.invalidWalletName)], ], }, walletPassword: { @@ -98,10 +97,7 @@ export default class AddWalletDetailsStep extends Component { if (repeatPasswordField.value.length > 0) { repeatPasswordField.validate({ showErrors: true }); } - return [ - isValidWalletPassword(field.value), - this.context.intl.formatMessage(globalMessages.invalidWalletPassword), - ]; + return [isValidWalletPassword(field.value), this.context.intl.formatMessage(globalMessages.invalidWalletPassword)]; }, ], }, @@ -133,15 +129,7 @@ export default class AddWalletDetailsStep extends Component { ); render(): Node { - const { - prevStep, - recoveryPhrase, - isDialogOpen, - openDialog, - closeDialog, - selectedNetwork, - isRecovery, - } = this.props; + const { prevStep, recoveryPhrase, isDialogOpen, openDialog, closeDialog, selectedNetwork, isRecovery } = this.props; const { form } = this; const { walletName, walletPassword, repeatPassword } = form.values(); const { intl } = this.context; @@ -155,8 +143,7 @@ export default class AddWalletDetailsStep extends Component { isValidWalletPassword(walletPassword) && isValidRepeatPassword(walletPassword, repeatPassword); - if (!recoveryPhrase) - throw new Error(`Recovery phrase is required to render AddWalletDetails component`); + if (!recoveryPhrase) throw new Error(`Recovery phrase is required to render AddWalletDetails component`); const descriptionMessage = Boolean(isRecovery) ? messages.restoreDesc : messages.createDesc; @@ -164,10 +151,10 @@ export default class AddWalletDetailsStep extends Component { - + - { onClick={() => openDialog(WalletNameAndPasswordTipsDialog)} > - + e.preventDefault()} component="form" autoComplete="off"> @@ -200,9 +187,7 @@ export default class AddWalletDetailsStep extends Component { {...walletPasswordField.bind()} done={walletPasswordField.isValid} error={walletPasswordField.error} - helperText={ - walletPasswordField.error || intl.formatMessage(messages.passwordHint) - } + helperText={walletPasswordField.error || intl.formatMessage(messages.passwordHint)} id="walletPasswordInput" /> @@ -224,6 +209,7 @@ export default class AddWalletDetailsStep extends Component { openDialog={openDialog} closeDialog={closeDialog} isDialogOpen={isDialogOpen} + borderRadius={4} /> { type: 'secondary', }, { - label: intl.formatMessage( - Boolean(isRecovery) ? globalMessages.restore : globalMessages.create - ), + label: intl.formatMessage(Boolean(isRecovery) ? globalMessages.restore : globalMessages.create), disabled: !isValidFields, onClick: () => { this.props.onSubmit(walletName, walletPassword); diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletPageHeader.js b/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletPageHeader.js index 53fa2e0312..ab979616b8 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletPageHeader.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletPageHeader.js @@ -32,7 +32,7 @@ function CreateWalletPageHeader(props: Props & Intl): Node { Yoroi - + {intl.formatMessage(messages.title)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletSteps.js b/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletSteps.js index 453454728c..08e6c2fecd 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletSteps.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/CreateWalletSteps.js @@ -3,10 +3,21 @@ import type { Node, ComponentType } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; import { observer } from 'mobx-react'; import type { $npm$ReactIntl$IntlShape } from 'react-intl'; -import { Stack, Box, Typography } from '@mui/material'; +import { Stack, Box, Typography, styled } from '@mui/material'; import { CREATE_WALLET_SETPS } from './steps'; import { ReactComponent as StepMarkIcon } from '../../../assets/images/add-wallet/step-mark.inline.svg'; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.bg_color_max, + }, + '& rect': { + fill: theme.palette.ds.text_primary_min, + }, + }, +})); + const messages: * = defineMessages({ firstStep: { id: 'wallet.create.firstStep', @@ -61,14 +72,7 @@ function CreateWalletSteps(props: Props & Intl): Node { return ( - + {steps.map(({ stepId, message }, idx) => { const isCurrentStep = currentStepIdx === idx; const isPrevStep = idx < currentStepIdx; @@ -76,9 +80,15 @@ function CreateWalletSteps(props: Props & Intl): Node { let stepColor = 'grey.400'; let cursor = 'pointer'; - if (isCurrentStep) stepColor = 'primary.600'; - else if (isPrevStep) stepColor = 'primary.300'; - if (isFutureStep) cursor = 'not-allowed'; + if (isCurrentStep) { + stepColor = 'ds.text_gray_medium'; + } else if (isPrevStep) { + stepColor = 'ds.text_primary_min'; + } + if (isFutureStep) { + stepColor = 'ds.text_gray_min'; + cursor = 'not-allowed'; + } return ( {isPrevStep ? ( - + + + ) : ( - {idx + 1} )} - + {intl.formatMessage(message)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/HowToSaveRecoveryPhraseTipsDialog.js b/packages/yoroi-extension/app/components/wallet/create-wallet/HowToSaveRecoveryPhraseTipsDialog.js index ddf5623c13..681e786692 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/HowToSaveRecoveryPhraseTipsDialog.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/HowToSaveRecoveryPhraseTipsDialog.js @@ -21,13 +21,11 @@ const messages: Object = defineMessages({ }, thirdTip: { id: 'wallet.create.dialog.howToSaveRecoveryPhrase.thirdTip', - defaultMessage: - '!!!Write the recovery phrase on a piece of paper and store in a secure location like a safety deposit box. ', + defaultMessage: '!!!Write the recovery phrase on a piece of paper and store in a secure location like a safety deposit box. ', }, forthTip: { id: 'wallet.create.dialog.howToSaveRecoveryPhrase.forthTip', - defaultMessage: - '!!!It is recommended to have 2 or 3 copies of the recovery phrase in different secure locations.', + defaultMessage: '!!!It is recommended to have 2 or 3 copies of the recovery phrase in different secure locations.', }, }); @@ -53,13 +51,13 @@ function HowToSaveRecoveryPhraseTipsDialog(props: Props & Intl): Node { return ( - + {intl.formatMessage(messages.title)} {tips.map(([tipId, tipTxt]) => ( - + {intl.formatMessage(tipTxt)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/LearnAboutRecoveryPhrase.js b/packages/yoroi-extension/app/components/wallet/create-wallet/LearnAboutRecoveryPhrase.js index 2ffe2aca70..d13ce3bc48 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/LearnAboutRecoveryPhrase.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/LearnAboutRecoveryPhrase.js @@ -134,7 +134,7 @@ function LearnAboutRecoveryPhrase(props: Props & Intl): Node { return ( - + @@ -155,7 +155,7 @@ function LearnAboutRecoveryPhrase(props: Props & Intl): Node { > {tips.map(tip => ( - + @@ -172,6 +172,7 @@ function LearnAboutRecoveryPhrase(props: Props & Intl): Node { display: 'block', py: '16px', mb: '20px', + color: 'ds.text_primary_medium', }} > {intl.formatMessage(infoDialogMessages.learnMore)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/RecoveryPhrase.js b/packages/yoroi-extension/app/components/wallet/create-wallet/RecoveryPhrase.js index 438bc680dc..98c8210328 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/RecoveryPhrase.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/RecoveryPhrase.js @@ -7,6 +7,14 @@ import { Box, Typography, Grid, Button, styled } from '@mui/material'; import { ReactComponent as OpenedEyeIcon } from '../../../assets/images/open-eye-primary.inline.svg'; import { ReactComponent as ClosedEyeIcon } from '../../../assets/images/close-eye-primary.inline.svg'; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.text_primary_medium, + }, + }, +})); + type Props = {| recoveryPhrase: Array | null, shouldShowRecoveryPhrase: boolean, @@ -45,6 +53,7 @@ function RecoveryPhrase(props: Props & Intl): Node { key={word} columns={7} sx={{ + backgroundColor: 'ds.primary_100', textAlign: 'center', borderRadius: '8px', display: 'flex', @@ -56,7 +65,8 @@ function RecoveryPhrase(props: Props & Intl): Node { }} id={'recoveryPhraseWord' + idx} > - - {shouldShowRecoveryPhrase ? : } - - {intl.formatMessage( - shouldShowRecoveryPhrase - ? messages.hideRecoveryPhraseBtn - : messages.showRecoveryPhraseBtn - )} + {shouldShowRecoveryPhrase ? ( + + {' '} + + ) : ( + + {' '} + + )} + + {intl.formatMessage(shouldShowRecoveryPhrase ? messages.hideRecoveryPhraseBtn : messages.showRecoveryPhraseBtn)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/SaveRecoveryPhraseStep.js b/packages/yoroi-extension/app/components/wallet/create-wallet/SaveRecoveryPhraseStep.js index ceceeca5cc..3f21831af1 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/SaveRecoveryPhraseStep.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/SaveRecoveryPhraseStep.js @@ -4,7 +4,7 @@ import type { Node, ComponentType } from 'react'; import { defineMessages, injectIntl, FormattedHTMLMessage } from 'react-intl'; import { observer } from 'mobx-react'; import type { $npm$ReactIntl$IntlShape } from 'react-intl'; -import { Stack, Typography, Box } from '@mui/material'; +import { Stack, Typography, Box, styled } from '@mui/material'; import StepController from './StepController'; import { CREATE_WALLET_SETPS, isDialogShownBefore, TIPS_DIALOGS } from './steps'; import HowToSaveRecoveryPhraseTipsDialog from './HowToSaveRecoveryPhraseTipsDialog'; @@ -20,6 +20,14 @@ const messages: * = defineMessages({ }, }); +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + type Intl = {| intl: $npm$ReactIntl$IntlShape, |}; @@ -44,14 +52,16 @@ function SaveRecoveryPhraseStep(props: Props & Intl): Node { - + openDialog(HowToSaveRecoveryPhraseTipsDialog)} > - + + + diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/SelectNetworkStep.js b/packages/yoroi-extension/app/components/wallet/create-wallet/SelectNetworkStep.js index d2f86b7334..ae7be3a65b 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/SelectNetworkStep.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/SelectNetworkStep.js @@ -5,7 +5,7 @@ import { observer } from 'mobx-react'; import type { $npm$ReactIntl$IntlShape } from 'react-intl'; import { Stack, Typography, Box, styled } from '@mui/material'; import type { NetworkRow } from '../../../api/ada/lib/storage/database/primitives/tables'; -import YoroiLogo from '../../../assets/images/yoroi-logo-shape-blue.inline.svg'; +import { ReactComponent as YoroiLogo } from '../../../assets/images/yoroi-logo-shape-blue.inline.svg'; import { networks } from '../../../api/ada/lib/storage/database/prepackaged/networks'; import styles from './SelectNetworkStep.scss'; import globalMessages from '../../../i18n/global-messages'; @@ -13,6 +13,21 @@ import StepController from './StepController'; const GradientBox = styled(Box)(({ theme }: any) => ({ backgroundImage: theme.palette.ds.bg_gradient_1, + '&:hover': { + backgroundImage: theme.palette.ds.bg_gradient_2, + }, +})); + +const LogoIconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& defs': { + '& linearGradient': { + '& stop': { + 'stop-color': theme.palette.ds.el_primary_medium, + }, + }, + }, + }, })); const messages: * = defineMessages({ @@ -68,15 +83,17 @@ function SelectNetworkStep(props: Props & Intl): Node { }} > - Yoroi + + + - + {intl.formatMessage(messages.title)} - + @@ -84,7 +101,7 @@ function SelectNetworkStep(props: Props & Intl): Node { {networksList.map(({ name, networkInfo }) => ( onSelect(networkInfo)}> - + {name} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/StepController.js b/packages/yoroi-extension/app/components/wallet/create-wallet/StepController.js index 4b8ee54aeb..19e2543a4d 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/StepController.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/StepController.js @@ -16,14 +16,7 @@ function StepController(props: Props): Node { const { actions } = props; return ( - + {actions.map(({ type, label, disabled, onClick }, idx) => { const isPrimary = type === 'primary'; return ( diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.js b/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.js index 138e72658f..79497fa481 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.js @@ -16,8 +16,7 @@ import { ampli } from '../../../../ampli/index'; const messages = defineMessages({ description: { id: 'wallet.create.thirdStep.description', - defaultMessage: - '!!!Select each word in the correct order to confirm your recovery phrase.', + defaultMessage: '!!!Select each word in the correct order to confirm your recovery phrase.', }, incorrectOrder: { id: 'wallet.create.thirdStep.incorrectOrder', @@ -86,13 +85,13 @@ function VerifyRecoveryPhraseStep(props: Props & Intl): Node { return ( - + {enteredRecoveryPhrase.map((word, idx) => { const isLastEnteredWord = - !isRecoveryPhraseEntered && - (idx === enteredRecoveryPhrase.length - 1 || - enteredRecoveryPhrase[idx + 1] === null); + !isRecoveryPhraseEntered && (idx === enteredRecoveryPhrase.length - 1 || enteredRecoveryPhrase[idx + 1] === null); const Word = ( - - + {idx + 1}. {word !== null && @@ -174,18 +177,15 @@ function VerifyRecoveryPhraseStep(props: Props & Intl): Node { })} - + + {sortedRecoveryPhrase.map(({ word, internalWordId }, idx) => { const isAdded = addedWordsIndxes.has(idx); - const wrongWordBorderColor = (wrondWordId, currentId) => wrongWordIdx === currentId ? 'ds.sys_magenta_500' : 'transparent'; - const wordBorderColor = (wrondWordId, currentId) => isAdded ? 'ds.primary_200' : wrongWordBorderColor(wrondWordId, currentId); - const isAddedOrIsWrong = isAdded || wrongWordIdx === idx + const wrongWordBorderColor = (wrondWordId, currentId) => + wrongWordIdx === currentId ? 'ds.sys_magenta_500' : 'transparent'; + const wordBorderColor = (wrondWordId, currentId) => + isAdded ? 'ds.primary_200' : wrongWordBorderColor(wrondWordId, currentId); + const isAddedOrIsWrong = isAdded || wrongWordIdx === idx; const button = ( - {word} @@ -230,7 +231,7 @@ function VerifyRecoveryPhraseStep(props: Props & Intl): Node { {wrongWordIdx !== null && ( - + {intl.formatMessage(messages.incorrectOrder)} )} @@ -238,7 +239,7 @@ function VerifyRecoveryPhraseStep(props: Props & Intl): Node { - + {intl.formatMessage(messages.verified)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.scss b/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.scss new file mode 100644 index 0000000000..9aa854ba29 --- /dev/null +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/VerifyRecoveryPhraseStep.scss @@ -0,0 +1,66 @@ +.component { + .verifyRecoveryPhraseArea { + // border: double 2px transparent; + border-radius: 8px; + // background-image: linear-gradient( + // 0deg, + // var(--yoroi-palette-common-white), + // var(--yoroi-palette-common-white) + // ), + // linear-gradient(269.97deg, #e4e8f7 0%, #c6f7ed 99.98%); + // background-origin: border-box; + // background-clip: content-box, border-box; + margin-bottom: 16px; + } + + .wordChip { + position: relative; + text-align: center; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + width: 123px; + height: 40px; + cursor: pointer; + + // background-image: linear-gradient(180deg, #e4e8f7 0%, #c6f7f7 100%), + // linear-gradient(180deg, #e4e8f7 0%, #c6f7f7 100%); + // background-origin: border-box; + // background-clip: content-box, border-box; + + &::before { + position: absolute; + content: ''; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + // background: linear-gradient(180deg, #93f5e1 0%, #c6f7ed 100%); + border-radius: 8px; + z-index: 1; + transition: opacity 200ms linear; + opacity: 0; + } + + &:not(.wordAdded):not(.wrongWord):hover::before { + opacity: 1; + } + + &.wordAdded { + border: double 2px transparent; + // background-image: linear-gradient( + // 0deg, + // var(--yoroi-palette-common-white), + // var(--yoroi-palette-common-white) + // ), + // linear-gradient(180deg, #e4e8f7 0%, #c6f7f7 100%); + cursor: not-allowed; + } + + &.wrongWord { + border: 2px solid #ff1351; + background: transparent; + } + } +} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletChecksumTipsDialog.js b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletChecksumTipsDialog.js index 6bac68acda..0e763df472 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletChecksumTipsDialog.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletChecksumTipsDialog.js @@ -18,13 +18,11 @@ const messages: Object = defineMessages({ }, secondTip: { id: 'wallet.create.dialog.walletChecksum.secondTip', - defaultMessage: - '!!!Plate number {plateText} is a auto-generated sign of four letters and four digits.', + defaultMessage: '!!!Plate number {plateText} is a auto-generated sign of four letters and four digits.', }, thirdTip: { id: 'wallet.create.dialog.walletChecksum.thirdTip', - defaultMessage: - '!!!Checksum and plate number are unique to your wallet and represent your public key.', + defaultMessage: '!!!Checksum and plate number are unique to your wallet and represent your public key.', }, }); @@ -49,15 +47,13 @@ function WalletChecksumTipsDialog(props: Props & Intl): Node { - + - - {plateImagePart} - + {plateImagePart} ), }} @@ -65,12 +61,12 @@ function WalletChecksumTipsDialog(props: Props & Intl): Node { - + - + {intl.formatMessage(messages.thirdTip)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletNameAndPasswordTipsDialog.js b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletNameAndPasswordTipsDialog.js index f92019ffe9..dea68acc2a 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletNameAndPasswordTipsDialog.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletNameAndPasswordTipsDialog.js @@ -13,13 +13,11 @@ const messages: Object = defineMessages({ }, walletNameFirstTip: { id: 'wallet.create.dialog.walletNameAndPassword.whatIsWalletName.firstTip', - defaultMessage: - '!!!It is a wallet identifier that helps you to easier find the exact wallet in your app', + defaultMessage: '!!!It is a wallet identifier that helps you to easier find the exact wallet in your app', }, walletNameSecondTip: { id: 'wallet.create.dialog.walletNameAndPassword.whatIsWalletName.secondTip', - defaultMessage: - '!!!You can have different wallet names for the same wallet account connected to different devices', + defaultMessage: '!!!You can have different wallet names for the same wallet account connected to different devices', }, whatIsWalletPassword: { id: 'wallet.create.dialog.walletNameAndPassword.whatIsWalletPassword', @@ -27,13 +25,11 @@ const messages: Object = defineMessages({ }, walletPasswordFirstTip: { id: 'wallet.create.dialog.walletNameAndPassword.whatIsWalletPassword.firstTip', - defaultMessage: - '!!!Password is an additional security layer used to confirm transactions from this device', + defaultMessage: '!!!Password is an additional security layer used to confirm transactions from this device', }, walletPasswordSecondTip: { id: 'wallet.create.dialog.walletNameAndPassword.whatIsWalletPassword.secondTip', - defaultMessage: - '!!!Both wallet name and password are stored locally, so you are only person who can change or restore it.', + defaultMessage: '!!!Both wallet name and password are stored locally, so you are only person who can change or restore it.', }, }); @@ -78,7 +74,7 @@ function CreateWalletPage(props: Props & Intl): Node { {tips.map(([tipId, tipTxt]) => ( - + {intl.formatMessage(tipTxt)} diff --git a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletPlate.js b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletPlate.js index f51156d63d..2b9f86bb64 100644 --- a/packages/yoroi-extension/app/components/wallet/create-wallet/WalletPlate.js +++ b/packages/yoroi-extension/app/components/wallet/create-wallet/WalletPlate.js @@ -1,7 +1,6 @@ // @flow import type { Node } from 'react'; -import { Stack, Typography } from '@mui/material'; -import { Box } from '@mui/system'; +import { Stack, Typography, styled, Box } from '@mui/material'; import { usePlate } from './plate'; import WalletAccountIcon from '../../topbar/WalletAccountIcon'; import { ReactComponent as InfoIcon } from '../../../assets/images/info-icon-primary.inline.svg'; @@ -10,32 +9,43 @@ import WalletChecksumTipsDialog from './WalletChecksumTipsDialog'; import { TIPS_DIALOGS } from './steps'; import type { ManageDialogsProps } from './CreateWalletPage'; +const IconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); + type Props = {| recoveryPhrase: Array, selectedNetwork: $ReadOnly, + borderRadius?: number, ...ManageDialogsProps, |}; function WalletPlate(props: Props): Node { - const { recoveryPhrase, selectedNetwork, openDialog, closeDialog, isDialogOpen } = props; + const { recoveryPhrase, selectedNetwork, openDialog, closeDialog, isDialogOpen, borderRadius } = props; const plate = usePlate(recoveryPhrase, selectedNetwork); + const radius = borderRadius != null && typeof borderRadius === 'number' ? `${borderRadius}px` : '0px'; - const plateImagePart = ( - - ); + const plateImagePart = ; return ( - - {plateImagePart} - {plate.TextPart} + + {plateImagePart} + + + {plate.TextPart} + + openDialog(WalletChecksumTipsDialog)} > - + closeDialog(TIPS_DIALOGS.WALLET_CHECKSUM)} diff --git a/packages/yoroi-extension/app/components/wallet/export/DateRange.js b/packages/yoroi-extension/app/components/wallet/export/DateRange.js index 949f9750d9..194902891a 100644 --- a/packages/yoroi-extension/app/components/wallet/export/DateRange.js +++ b/packages/yoroi-extension/app/components/wallet/export/DateRange.js @@ -79,7 +79,15 @@ export default class ExportTransactionDialog extends Component { }} className={componentId} renderInput={params => { - return ; + return ( + + ); }} /> ))} diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/common/CheckDialog.scss b/packages/yoroi-extension/app/components/wallet/hwConnect/common/CheckDialog.scss index 62a130bb2a..fa9eb2816c 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/common/CheckDialog.scss +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/common/CheckDialog.scss @@ -25,8 +25,6 @@ a { font-weight: 700; - color: var(--yoroi-palette-gray-700); - @include underline(var(--yoroi-palette-gray-800)); } } } @@ -66,7 +64,6 @@ .prerequisiteHeaderText { font-weight: 500; margin-left: 7px; - color: var(--yoroi-palette-gray-700); } li { diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/common/ConnectDialog.scss b/packages/yoroi-extension/app/components/wallet/hwConnect/common/ConnectDialog.scss index e74637eac3..4793df35e6 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/common/ConnectDialog.scss +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/common/ConnectDialog.scss @@ -21,7 +21,6 @@ :global(.YoroiClassic) { .component { .middleBlock { - background-color: var(--yoroi-hw-connect-dialog-middle-block-common-error-background-color); padding: 0px; text-align: center; } diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/common/HelpLinkBlock.scss b/packages/yoroi-extension/app/components/wallet/hwConnect/common/HelpLinkBlock.scss index b1018dda00..8cc277637f 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/common/HelpLinkBlock.scss +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/common/HelpLinkBlock.scss @@ -12,7 +12,6 @@ display: inline-flex; opacity: 0.7; text-decoration: none; - color: var(--yoroi-palette-gray-900); span { margin-left: 4px; diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/CheckDialog.js b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/CheckDialog.js index e6be576e96..308f033e7a 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/CheckDialog.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/CheckDialog.js @@ -16,14 +16,27 @@ import ProgressStepBlock from '../common/ProgressStepBlock'; import HelpLinkBlock from './HelpLinkBlock'; import HWErrorBlock from '../common/HWErrorBlock'; -import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; -import { ReactComponent as AboutPrerequisiteIconSVG } from '../../../../assets/images/hardware-wallet/check-prerequisite-header-icon.inline.svg'; -import { ReactComponent as AboutPrerequisiteTrezorSVG } from '../../../../assets/images/hardware-wallet/ledger/check.inline.svg'; -import { ReactComponent as AboutLedgerSVG } from '../../../../assets/images/hardware-wallet/ledger/check-modern.inline.svg'; +import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; +import { ReactComponent as AboutPrerequisiteIconSVG } from '../../../../assets/images/hardware-wallet/check-prerequisite-header-icon.inline.svg'; +import { ReactComponent as AboutPrerequisiteTrezorSVG } from '../../../../assets/images/hardware-wallet/ledger/check.inline.svg'; +import { ReactComponent as AboutLedgerSVG } from '../../../../assets/images/hardware-wallet/ledger/check-modern.inline.svg'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; import { ProgressInfo } from '../../../../types/HWConnectStoreTypes'; import styles from './CheckDialog.scss'; +import {} from '@mui/material'; +import { Link, List, ListItem, Typography, styled, Box } from '@mui/material'; +import { Stack } from '@mui/material'; + +const IconWrapper = styled(Box)(({ theme }) => ({ + marginRight: '8px', + marginLeft: '8px', + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); const messages = defineMessages({ aboutPrerequisite1Part1: { @@ -73,71 +86,82 @@ type Props = {| @observer export default class CheckDialog extends Component { - - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { const { intl } = this.context; - const { - progressInfo, - isActionProcessing, - error, - onExternalLinkClick, - submit, - cancel, - classicTheme, - } = this.props; + const { progressInfo, isActionProcessing, error, onExternalLinkClick, submit, cancel, classicTheme } = this.props; const middleBlock = (
{!classicTheme && }
-
- - + + + + + {intl.formatMessage(globalMessages.hwConnectDialogAboutPrerequisiteHeader)} - -
- + + + + + + + {intl.formatMessage(messages.aboutPrerequisite2)} + + + {intl.formatMessage(messages.aboutPrerequisite3)} + + + {intl.formatMessage(globalMessages.hwConnectDialogAboutPrerequisite4)} + + + {intl.formatMessage(messages.aboutPrerequisite5)} + +
{classicTheme && (
)} -
); +
+ ); - const dailogActions = [{ - label: intl.formatMessage(globalMessages.nextButtonLabel), - primary: true, - onClick: submit, - isSubmitting: isActionProcessing, - }]; + const dailogActions = [ + { + label: intl.formatMessage(globalMessages.nextButtonLabel), + primary: true, + onClick: submit, + isSubmitting: isActionProcessing, + }, + ]; return ( { > {middleBlock} - {error && - - } + {error && } - ); + + ); } } diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/ConnectDialog.js b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/ConnectDialog.js index 195119a8ec..352c4933b9 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/ConnectDialog.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/ConnectDialog.js @@ -17,9 +17,9 @@ import HelpLinkBlock from './HelpLinkBlock'; import HWErrorBlock from '../common/HWErrorBlock'; import connectLoadGIF from '../../../../assets/images/hardware-wallet/ledger/connect-load.gif'; -import { ReactComponent as ConnectErrorSVG } from '../../../../assets/images/hardware-wallet/ledger/connect-error.inline.svg'; +import { ReactComponent as ConnectErrorSVG } from '../../../../assets/images/hardware-wallet/ledger/connect-error.inline.svg'; -import { ReactComponent as ConnectErrorLedgerSVG } from '../../../../assets/images/hardware-wallet/ledger/connect-error-modern.inline.svg'; +import { ReactComponent as ConnectErrorLedgerSVG } from '../../../../assets/images/hardware-wallet/ledger/connect-error-modern.inline.svg'; import connectLoadLedgerGIF from '../../../../assets/images/hardware-wallet/ledger/connect-load-modern.inline.gif'; import { ProgressInfo } from '../../../../types/HWConnectStoreTypes'; @@ -30,6 +30,7 @@ import { Logger } from '../../../../utils/logging'; import styles from '../common/ConnectDialog.scss'; import headerMixin from '../../../mixins/HeaderBlock.scss'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import { Typography } from '@mui/material'; const connectStartGIF = connectLoadGIF; @@ -57,41 +58,37 @@ type Props = {| @observer export default class ConnectDialog extends Component { - - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { const { intl } = this.context; - const { - progressInfo, - isActionProcessing, - error, - onExternalLinkClick, - goBack, - submit, - cancel, - classicTheme, - } = this.props; + const { progressInfo, isActionProcessing, error, onExternalLinkClick, goBack, submit, cancel, classicTheme } = this.props; const introBlock = classicTheme ? ( -
- {intl.formatMessage(messages.connectIntroTextLine1)} + + + {intl.formatMessage(messages.connectIntroTextLine1)} +
- {intl.formatMessage(messages.connectIntroTextLine2)} + + {intl.formatMessage(messages.connectIntroTextLine2)} +
- {intl.formatMessage(globalMessages.hwConnectDialogConnectIntroTextLine3)} + + {intl.formatMessage(globalMessages.hwConnectDialogConnectIntroTextLine3)} +
-
+ ) : ( -
- + + {intl.formatMessage(messages.connectIntroTextLine1) + ' '} {intl.formatMessage(messages.connectIntroTextLine2) + ' '} {intl.formatMessage(globalMessages.hwConnectDialogConnectIntroTextLine3)} - -
+ + ); let middleBlock = null; @@ -99,40 +96,42 @@ export default class ConnectDialog extends Component { switch (progressInfo.stepState) { case StepState.LOAD: - backButton = (); + backButton = ; middleBlock = (
-
); + + ); break; case StepState.PROCESS: backButton = null; middleBlock = (
-
); + + ); break; case StepState.ERROR: - backButton = (); + backButton = ; middleBlock = (
- {classicTheme - ? - : - } -
); + {classicTheme ? : } + + ); break; default: Logger.error('ledger::ConnectDialog::render: something unexpected happened'); break; } - const dailogActions = [{ - label: intl.formatMessage(globalMessages.connectLabel), - primary: true, - isSubmitting: isActionProcessing, - onClick: submit, - }]; + const dailogActions = [ + { + label: intl.formatMessage(globalMessages.connectLabel), + primary: true, + isSubmitting: isActionProcessing, + onClick: submit, + }, + ]; return ( { {introBlock} {middleBlock} - {error && - - } + {error && } - ); + + ); } } diff --git a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/HelpLinkBlock.js b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/HelpLinkBlock.js index 23e14af7f9..5bf4044c7f 100644 --- a/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/HelpLinkBlock.js +++ b/packages/yoroi-extension/app/components/wallet/hwConnect/ledger/HelpLinkBlock.js @@ -4,9 +4,20 @@ import type { Node } from 'react'; import { observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; -import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; +import { ReactComponent as ExternalLinkSVG } from '../../../../assets/images/link-external.inline.svg'; import styles from '../common/HelpLinkBlock.scss'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import { Link, styled, Box } from '@mui/material'; + +const IconWrapper = styled(Box)(({ theme }) => ({ + marginRight: '8px', + marginLeft: '8px', + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, +})); const messages = defineMessages({ helpLinkYoroiWithLedger: { @@ -25,9 +36,8 @@ type Props = {| @observer export default class HelpLinkBlock extends Component { - - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { + intl: intlShape.isRequired, }; render(): Node { @@ -36,13 +46,17 @@ export default class HelpLinkBlock extends Component { return ( ); + + + + + + ); } } diff --git a/packages/yoroi-extension/app/components/wallet/receive/InternalHeader.js b/packages/yoroi-extension/app/components/wallet/receive/InternalHeader.js index 2d2e0228f4..495d6266e1 100644 --- a/packages/yoroi-extension/app/components/wallet/receive/InternalHeader.js +++ b/packages/yoroi-extension/app/components/wallet/receive/InternalHeader.js @@ -21,7 +21,7 @@ const messages = defineMessages({ }, blogLinkUrl: { id: 'wallet.receive.page.internal.learnMore', - defaultMessage: '!!!https://emurgo.io/en/blog/understanding-unspent-transaction-outputs-in-cardano', + defaultMessage: '!!!https://www.emurgo.io/press-news/yoroi-wallet-a-guide-to-the-receive-menu/', }, }); diff --git a/packages/yoroi-extension/app/components/wallet/receive/VerifyAddressDialog.js b/packages/yoroi-extension/app/components/wallet/receive/VerifyAddressDialog.js index c3037fab86..a9329dd649 100644 --- a/packages/yoroi-extension/app/components/wallet/receive/VerifyAddressDialog.js +++ b/packages/yoroi-extension/app/components/wallet/receive/VerifyAddressDialog.js @@ -60,6 +60,7 @@ type Props = {| +addressInfo: $ReadOnly, +classicTheme: boolean, +complexityLevel: ?ComplexityLevelType, + +isAddressBook: boolean, |}; @observer @@ -75,7 +76,7 @@ class VerifyAddressDialog extends Component { render(): Node { const { intl } = this.context; - const dialogActions = !this.props.isHardware + const dialogActions = !this.props.isHardware || (this.props.isHardware && this.props.isAddressBook) ? [] : [ { diff --git a/packages/yoroi-extension/app/components/wallet/restore/RestoreWalletPage.js b/packages/yoroi-extension/app/components/wallet/restore/RestoreWalletPage.js index 4380f52493..e0c72aa447 100644 --- a/packages/yoroi-extension/app/components/wallet/restore/RestoreWalletPage.js +++ b/packages/yoroi-extension/app/components/wallet/restore/RestoreWalletPage.js @@ -3,10 +3,10 @@ import type { Node, ComponentType } from 'react'; import type { $npm$ReactIntl$IntlShape } from 'react-intl'; import { useState } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; -import { Box, Typography } from '@mui/material'; +import { Box, Typography, styled } from '@mui/material'; import { observer } from 'mobx-react'; import { RESTORE_WALLET_STEPS, getFirstRestorationStep } from './steps'; -import YoroiLogo from '../../../assets/images/yoroi-logo-shape-blue.inline.svg'; +import { ReactComponent as YoroiLogo } from '../../../assets/images/yoroi-logo-shape-blue.inline.svg'; import SelectWalletTypeStep from './steps/type/SelectWalletTypeStep'; import Stepper from '../../common/stepper/Stepper'; import EnterRecoveryPhraseStep from './steps/phrase/EnterRecoveryPhraseStep'; @@ -44,6 +44,18 @@ const messages: * = defineMessages({ }, }); +const LogoIconWrapper = styled(Box)(({ theme }) => ({ + '& svg': { + '& defs': { + '& linearGradient': { + '& stop': { + 'stop-color': theme.palette.ds.el_primary_medium, + }, + }, + }, + }, +})); + type Intl = {| intl: $npm$ReactIntl$IntlShape, |}; @@ -64,21 +76,11 @@ type Props = {| function RestoreWalletPage(props: Props & Intl): Node { const { intl, stores, actions, restoreWallet, isDialogOpen, openDialog, closeDialog } = props; const { profile, router, wallets: walletsActions } = actions; - const { - walletRestore, - profile: profileData, - wallets, - tokenInfoStore, - } = stores; + const { walletRestore, profile: profileData, wallets, tokenInfoStore } = stores; const [currentStep, setCurrentStep] = useState(getFirstRestorationStep()); const [selectedRestoreMode, setSelectedRestoreMode] = useState(null); - const { - recoveryPhrase, - duplicatedWallet, - setRestoreWalletData, - resetRestoreWalletData, - } = useRestoreWallet(); + const { recoveryPhrase, duplicatedWallet, setRestoreWalletData, resetRestoreWalletData } = useRestoreWallet(); const getDuplicatedWalletData = () => { if (!duplicatedWallet) return null; @@ -132,12 +134,11 @@ function RestoreWalletPage(props: Props & Intl): Node { { resetRestoreWalletData(); - if (!environment.isDev() && !environment.isNightly()) - profile.setSelectedNetwork.trigger(networks.CardanoMainnet); + if (!environment.isDev() && !environment.isNightly()) profile.setSelectedNetwork.trigger(networks.CardanoMainnet); runInAction(() => { setSelectedRestoreMode(mode); setCurrentStep(RESTORE_WALLET_STEPS.ENTER_RECOVERY_PHRASE); - }) + }); ampli.restoreWalletEnterPhraseStepViewed({ recovery_phrase_lenght: mode.length === 15 ? '15' : '24', }); @@ -161,7 +162,7 @@ function RestoreWalletPage(props: Props & Intl): Node { isDialogOpen={isDialogOpen} openDialog={openDialog} closeDialog={closeDialog} - setCurrentStep={(step) => { + setCurrentStep={step => { setCurrentStep(step); ampli.restoreWalletDetailsStepViewed(); }} @@ -169,12 +170,8 @@ function RestoreWalletPage(props: Props & Intl): Node { if (!selectedRestoreMode) { throw new Error('unexpected nullish restore mode'); } - const isValid = walletRestore.isValidMnemonic( - { mnemonic: phrase, mode: selectedRestoreMode } - ); - ampli.restoreWalletEnterPhraseStepStatus( - { recovery_prhase_status: isValid } - ); + const isValid = walletRestore.isValidMnemonic({ mnemonic: phrase, mode: selectedRestoreMode }); + ampli.restoreWalletEnterPhraseStepStatus({ recovery_prhase_status: isValid }); return isValid; }} openDuplicatedWallet={lastDuplicatedWalletId => { @@ -189,12 +186,7 @@ function RestoreWalletPage(props: Props & Intl): Node { if (!selectedNetwork) { throw new Error('unexpectedly missing selected network'); } - const existingWallet = await isWalletExist( - importedWallets, - enteredRecoveryPhrase, - accountIndex, - selectedNetwork - ); + const existingWallet = await isWalletExist(importedWallets, enteredRecoveryPhrase, accountIndex, selectedNetwork); setRestoreWalletData({ duplicatedWallet: existingWallet, @@ -217,8 +209,7 @@ function RestoreWalletPage(props: Props & Intl): Node { selectedNetwork={forceNonNull(profileData.selectedNetwork)} onSubmit={(walletName: string, walletPassword: string) => { if (!recoveryPhrase) throw new Error('Recovery phrase must be generated first'); - if (!profileData.selectedNetwork) - throw new Error('Network must be selected to create a wallet. Should never happen'); + if (!profileData.selectedNetwork) throw new Error('Network must be selected to create a wallet. Should never happen'); restoreWallet({ walletName, walletPassword, recoveryPhrase }); ampli.restoreWalletDetailsSettled(); @@ -248,9 +239,11 @@ function RestoreWalletPage(props: Props & Intl): Node { }} > - Yoroi + + + - + {intl.formatMessage(messages.title)} diff --git a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/DuplicatedWalletDialog.js b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/DuplicatedWalletDialog.js index 38d05ff458..fc7f844c8d 100644 --- a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/DuplicatedWalletDialog.js +++ b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/DuplicatedWalletDialog.js @@ -2,12 +2,13 @@ import type { Node, ComponentType } from 'react'; import type { $npm$ReactIntl$IntlShape } from 'react-intl'; import { defineMessages, injectIntl } from 'react-intl'; -import { Typography, Box, Stack, Button, Dialog, Fade } from '@mui/material'; +import { Typography, Box, Stack, Button, Dialog, Fade, IconButton } from '@mui/material'; import { observer } from 'mobx-react'; import globalMessages from '../../../../../i18n/global-messages'; import React from 'react'; import { genLookupOrFail } from '../../../../../stores/stateless/tokenHelpers'; import WalletInfo from '../../../../common/walletInfo/WalletInfo'; +import { ReactComponent as CrossIcon } from '../../../../../assets/images/revamp/icons/cross.inline.svg'; import type { WalletChecksum } from '@emurgo/cip4-js'; import type { MultiToken } from '../../../../../api/common/lib/MultiToken'; import type { TokenInfoMap } from '../../../../../stores/toplevel/TokenInfoStore'; @@ -19,8 +20,7 @@ const messages: Object = defineMessages({ }, title: { id: 'wallet.restore.dialog.existingWallet.title', - defaultMessage: - '!!!This wallet already exists on your device, You can open it or go back and restore another wallet.', + defaultMessage: '!!!This wallet already exists on your device, You can open it or go back and restore another wallet.', }, openWallet: { id: 'wallet.restore.dialog.walletExist.openWallet', @@ -55,19 +55,35 @@ function DuplicatedWalletDialog(props: Props & Intl): Node { open={open} onClose={onClose} TransitionComponent={Transition} - id='duplicatedWalletDialog-dialog' + id="duplicatedWalletDialog-dialog" sx={{ - background: 'rgb(18 31 77 / 70%)', + backgroundColor: 'ds.bg_color_max', display: 'flex', justifyContent: 'center', alignItems: 'center', - '& .MuiPaper-root': { background: 'none', maxWidth: 'unset' }, + '& .MuiPaper-root': { maxWidth: 'unset' }, }} > + ({ + position: 'absolute', + right: 16, + top: 16, + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, + })} + > + + {intl.formatMessage(messages.dialogTitle)} - + {intl.formatMessage(messages.title)} @@ -112,8 +129,8 @@ function DuplicatedWalletDialog(props: Props & Intl): Node { color="primary" disableRipple={false} onClick={onClose} - style={{ width: '100%', height: '48px', fontSize: '16px' , borderWidth: 2}} - id='duplicatedWalletDialog-cancel-button' + style={{ width: '100%', height: '48px', fontSize: '16px', borderWidth: 2 }} + id="duplicatedWalletDialog-cancel-button" > {intl.formatMessage(globalMessages.cancel)} @@ -123,7 +140,7 @@ function DuplicatedWalletDialog(props: Props & Intl): Node { disableRipple={false} onClick={onNext} style={{ width: '100%', height: '48px', fontSize: '16px' }} - id='duplicatedWalletDialog-openWallet-button' + id="duplicatedWalletDialog-openWallet-button" > {intl.formatMessage(messages.openWallet)} diff --git a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/EnterRecoveryPhraseStep.js b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/EnterRecoveryPhraseStep.js index 8ba83e0c85..8be86db94e 100644 --- a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/EnterRecoveryPhraseStep.js +++ b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/EnterRecoveryPhraseStep.js @@ -103,7 +103,7 @@ function EnterRecoveryPhraseStep(props: Props & Intl): Node { justifyContent="center" maxWidth={length === 15 ? '636px' : '760px'} > - + diff --git a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/RestoreRecoveryPhraseForm.js b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/RestoreRecoveryPhraseForm.js index 9310cdbadd..cd96c0fc11 100644 --- a/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/RestoreRecoveryPhraseForm.js +++ b/packages/yoroi-extension/app/components/wallet/restore/steps/phrase/RestoreRecoveryPhraseForm.js @@ -137,29 +137,17 @@ export default class RestoreRecoveryPhraseForm extends Component { const { form } = this; const { recoveryPhrase } = form.values(); - const allWordsEntered = - recoveryPhrase.length === numberOfMnemonics && !recoveryPhrase.some(word => !word.value); + const allWordsEntered = recoveryPhrase.length === numberOfMnemonics && !recoveryPhrase.some(word => !word.value); const isValidPhrase = allWordsEntered && isValidMnemonic(recoveryPhrase); const mnemonicError = intl.formatMessage(messages.incorrectRecoveryPhrase); + const wordEntered = recoveryPhrase.some(word => Boolean(word.value)); + const clearAllButtonColor = wordEntered ? 'ds.text_primary_medium' : 'ds.text_primary_min'; if (isValidPhrase && !form.submitted) this.submit(); return ( - - + + {recoveryPhrase?.map((word, idx) => { const wordField = form.$(`recoveryPhrase[${idx}].value`); const fieldBind = wordField.bind(); @@ -186,7 +174,7 @@ export default class RestoreRecoveryPhraseForm extends Component { }} variant="body1" > - + {idx + 1}. @@ -216,17 +204,17 @@ export default class RestoreRecoveryPhraseForm extends Component { @@ -249,13 +239,7 @@ export default class RestoreRecoveryPhraseForm extends Component { - + {intl.formatMessage(messages.verified)} diff --git a/packages/yoroi-extension/app/components/wallet/send/TransactionSuccessDialog.js b/packages/yoroi-extension/app/components/wallet/send/TransactionSuccessDialog.js index 8115120c14..733ea19c4f 100644 --- a/packages/yoroi-extension/app/components/wallet/send/TransactionSuccessDialog.js +++ b/packages/yoroi-extension/app/components/wallet/send/TransactionSuccessDialog.js @@ -8,7 +8,7 @@ import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; import Dialog from '../../widgets/Dialog'; import { Stack, Typography } from '@mui/material'; import DialogCloseButton from '../../widgets/DialogCloseButton'; -import { ReactComponent as SuccessImg } from '../../../assets/images/transfer-success.inline.svg'; +import { ReactComponent as SuccessImg } from '../../../assets/images/revamp/tx-submitted.inline.svg'; import globalMessages from '../../../i18n/global-messages'; const messages = defineMessages({ @@ -47,7 +47,7 @@ export default class TransactionSuccessDialog extends Component { return ( { > - + + {intl.formatMessage(messages.title)} + + {intl.formatMessage(this.props.process === 'normal' ? messages.explanation : messages.sellSendDone)} diff --git a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormRevamp.js b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormRevamp.js index f8b2595fe2..28943b4f54 100644 --- a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormRevamp.js +++ b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormRevamp.js @@ -234,6 +234,20 @@ const SMemoTextField = styled(MemoTextField)(({ theme }) => ({ }, })); +const STextField = styled(TextField)(({ theme }) => ({ + 'input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active,input:-webkit-autofill:selected': { + WebkitBoxShadow: `0 0 0 30px ${theme.palette.ds.bg_color_max} inset !important`, + '-webkit-text-fill-color': `${theme.palette.ds.text_gray_medium}`, + }, + '& .MuiFormHelperText-root': { + marginInline: 0, + mt: 0.5, + fontSize: '0.750rem', + lineHeight: '1rem', + letterSpacing: '0.2px', + }, +})); + type State = {| currentStep: number, invalidMemo: boolean, @@ -612,7 +626,7 @@ export default class WalletSendFormRevamp extends Component { ) : null} - { ? intl.formatMessage(messages.receiverFieldLabelResolverSupported) : intl.formatMessage(messages.receiverFieldLabelDefault) } - sx={{ - '& .MuiFormHelperText-root': { - marginInline: 0, - mt: 0.5, - fontSize: '0.750rem', - lineHeight: '1rem', - letterSpacing: '0.2px', - }, - }} /> {domainResolverResult != null ? ( {intl.formatMessage(messages.receiverFieldLabelResolvedAddress)}:  @@ -681,8 +687,9 @@ export default class WalletSendFormRevamp extends Component { {memo ? memo.length : 0}/{MAX_MEMO_SIZE} @@ -801,7 +808,7 @@ export default class WalletSendFormRevamp extends Component { placeholder="0" /> - + ADA diff --git a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.js b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.js index 542b522360..dd7997d058 100644 --- a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.js +++ b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.js @@ -85,7 +85,11 @@ const SORTING_COLUMNS = { export const messages: Object = defineMessages({ nTokens: { id: 'wallet.send.form.dialog.nToken', - defaultMessage: '!!!Token ({number})', + defaultMessage: '!!!Tokens ({number})', + }, + title: { + id: 'wallet.send.form.dialog.title', + defaultMessage: '!!!Tokens', }, nameAndTicker: { id: 'wallet.assets.nameAndTicker', @@ -144,7 +148,9 @@ export default class AddTokenDialog extends Component { onSelect: ($ReadOnly) => void = token => { // Remove if it already in the list const selectedTokens = this.state.selectedTokens.filter(({ token: t }) => t.Identifier !== token.Identifier); - this.setState({ selectedTokens: [...selectedTokens, { token, included: true, amount: null }] }); + this.setState({ + selectedTokens: [...selectedTokens, { token, included: true, amount: this.getCurrentAmount(token) || null }], + }); }; onRemoveToken: ($ReadOnly) => void = token => { @@ -313,7 +319,7 @@ export default class AddTokenDialog extends Component { return ( { closeOnOverlayClick={false} className={styles.dialog} onClose={onClose} + styleContentOverride={{ paddingBottom: '0' }} withCloseButton scrollableContentClass="CurrentTokensList" > - + { width: '100%', fontSize: '14px', lineHeight: '22px', + '& input::placeholder': { + color: 'ds.text_gray_low', + }, }} placeholder={intl.formatMessage(messages.search)} /> @@ -378,12 +388,9 @@ export default class AddTokenDialog extends Component {
  • - + + {intl.formatMessage(messages.nameAndTicker)} +
  • @@ -391,19 +398,16 @@ export default class AddTokenDialog extends Component {
  • - + + {intl.formatMessage(messages.quantity)} +
  • 4 ? '4px' : '24px'} - pt="10px" + py="10px" className="CurrentTokensList" > {currentTokensList.map(token => ( diff --git a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.scss b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.scss index 5144dc91b2..a2610ba2fd 100644 --- a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.scss +++ b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/AddTokenDialog.scss @@ -46,10 +46,11 @@ .columns { width: 100%; display: grid; - grid-template-columns: 1.1fr 1fr 1fr; + grid-template-columns: 200px 200px 200px; + margin-top: 24px; li { - padding: 13px 24px; + padding: 8px 16px; text-align: left; display: flex; align-items: center; diff --git a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.js b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.js index 9fd8386054..6f472280a6 100644 --- a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.js +++ b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.js @@ -95,6 +95,8 @@ export default class SingleTokenRow extends Component { [styles.amountWrapper]: true, [styles.amountError]: !isValid && this.props.isTokenIncluded(token.info), [styles.inputFocused]: this.state.isInputFocused && this.props.isTokenIncluded(token.info), + [styles.inputSelected]: this.props.isTokenIncluded(token.info), + [styles.inputError]: !isValid, })} onClick={!this.props.isTokenIncluded(token.info) ? () => this.props.onAddToken(token.info) : null} border={this.props.isTokenIncluded(token.info) ? '2px solid' : 'none'} @@ -105,7 +107,7 @@ export default class SingleTokenRow extends Component { - {token.label.startsWith('asset') ? truncateAddressShort(token.label, 14) : token.label} + {truncateAddressShort(token.label, token.label.startsWith('asset') ? 14 : 12)} @@ -126,12 +128,15 @@ export default class SingleTokenRow extends Component { }} onBlur={() => { this.setState({ isInputFocused: false }); + if (!amount) { + this.props.onRemoveToken(token.info); + } }} autoFocus /> diff --git a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.scss b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.scss index c1db028784..3ec402e2aa 100644 --- a/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.scss +++ b/packages/yoroi-extension/app/components/wallet/send/WalletSendFormSteps/SingleTokenRow.scss @@ -1,21 +1,24 @@ .component { + &:not(:first-child) .amountWrapper { + margin-top: 20px; + } + .token { cursor: pointer; display: grid; - grid-template-columns: 1.1fr 1fr 1fr; + grid-template-columns: 200px 200px 200px; align-items: center; border-radius: 8px; width: calc(100% - 6px); - border:2px solid transparent; + border: 2px solid transparent; height: 56px; - margin-top: 20px; & > div { padding: 10px 20px; font-size: 16px; line-height: 24px; } - + .name { display: flex; align-items: center; @@ -34,32 +37,31 @@ } &:hover { - border:2px solid #DCE0E9; + border: 2px solid #dce0e9; border-radius: 8px; - } + } } .amountWrapper { display: grid; - grid-template-columns: 1.1fr 1fr 1fr; + grid-template-columns: 200px 1fr 1fr; align-items: center; border-radius: 8px; position: relative; width: 565px; height: 56px; - margin-top: 20px; & > div { - padding: 8px 22px; + padding: 8px 12px; } .error { position: absolute; - bottom: -20px; + bottom: -24px; right: 0; color: var(--yoroi-comp-input-error); font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif; - font-size:12px; - color:#FF1351; + font-size: 12px; + color: #ff1351; padding: 0; } @@ -67,6 +69,7 @@ display: flex; align-items: center; justify-content: flex-start; + overflow: hidden; .logo { margin-right: 16px; @@ -75,31 +78,30 @@ .amountInput { width: 100%; - height:24px; + height: 24px; margin: 0 0; - padding:0; + padding: 0; margin-bottom: 6px; - padding-right:10px; + padding-right: 10px; + input { text-align: right; font-size: 16px; line-height: 24px; width: 100%; - margin-top:-16px; + margin-top: -16px; } input::placeholder { font-size: 16px; line-height: 24px; } - } .close { position: absolute; height: 22px; width: 22px; - background-color: #f0f3f5; border-radius: 50%; display: flex; align-items: center; @@ -108,17 +110,29 @@ right: -12px; } - .close:hover { - background-color: lighten($color: #f0f3f5, $amount: 0.9); + .closeIcon svg rect { + fill: #f0f3f5; + } + + .closeIcon:hover { + color: lighten($color: #f0f3f5, $amount: 0.9); } } .amountError { - border: 2px solid #FF1351; - color:#FF1351; + border: 2px solid #ff1351; + color: #ff1351; } .inputFocused { - border:2px solid var(--yoroi-palette-gray-max) + border: 2px solid var(--yoroi-palette-gray-max) !important; + } + + .inputSelected { + border-color: #a7afc0; + } + + .inputError { + border-color: #ff1351 !important; } } diff --git a/packages/yoroi-extension/app/components/wallet/settings/RemoveWallet.js b/packages/yoroi-extension/app/components/wallet/settings/RemoveWallet.js index f905203b24..19dfd0870b 100644 --- a/packages/yoroi-extension/app/components/wallet/settings/RemoveWallet.js +++ b/packages/yoroi-extension/app/components/wallet/settings/RemoveWallet.js @@ -55,11 +55,7 @@ class RemoveWallet extends Component { {intl.formatMessage(messages.titleLabel)}
    - + {intl.formatMessage(messages.removeExplanation)} diff --git a/packages/yoroi-extension/app/components/wallet/summary/WalletSummaryRevamp.js b/packages/yoroi-extension/app/components/wallet/summary/WalletSummaryRevamp.js index ff4d7655f9..03a9ef548c 100644 --- a/packages/yoroi-extension/app/components/wallet/summary/WalletSummaryRevamp.js +++ b/packages/yoroi-extension/app/components/wallet/summary/WalletSummaryRevamp.js @@ -194,6 +194,7 @@ export default class WalletSummaryRevamp extends Component { textTransform: 'uppercase', margin: '2px', lineHeight: '21px', + color: 'ds.text_primary_medium', }} onClick={openExportTxToFileDialog} onKeyPress={openExportTxToFileDialog} @@ -224,21 +225,19 @@ export default class WalletSummaryRevamp extends Component { }} > - + {intl.formatMessage({ id: 'wallet.summary.page.type' })} - + {intl.formatMessage({ id: 'wallet.summary.page.status' })} - - - {intl.formatMessage(globalMessages.feeLabel)} - + + {intl.formatMessage(globalMessages.feeLabel)} - + {intl.formatMessage(globalMessages.amountLabel)} diff --git a/packages/yoroi-extension/app/components/wallet/transactions/TransactionRevamp.js b/packages/yoroi-extension/app/components/wallet/transactions/TransactionRevamp.js index a876326bd7..698fa3f60a 100644 --- a/packages/yoroi-extension/app/components/wallet/transactions/TransactionRevamp.js +++ b/packages/yoroi-extension/app/components/wallet/transactions/TransactionRevamp.js @@ -18,8 +18,7 @@ import { intlShape } from 'react-intl'; import moment from 'moment'; import classnames from 'classnames'; import BigNumber from 'bignumber.js'; -import { Button, Grid, Typography } from '@mui/material'; -import { Box } from '@mui/system'; +import { Grid, Typography, useTheme, styled, Box } from '@mui/material'; import { ReactComponent as AddMemoSvg } from '../../../assets/images/revamp/add-memo.inline.svg'; import { ReactComponent as EditSvg } from '../../../assets/images/edit.inline.svg'; import { ReactComponent as SendIcon } from '../../../assets/images/transaction/send.inline.svg'; @@ -665,7 +664,7 @@ export default class TransactionRevamp extends Component { )} - +
    { }); })} + {this.getWithdrawals(data, txIdFullInfoBasePart)}
    { - {this.getWithdrawals(data, txIdFullInfoBasePart)} - {this.getCertificate(data, txIdFullInfoBasePart)} + {/* Grid for additional info */} + + {/* tx info */} + + {this.getCertificate(data, txIdFullInfoBasePart)} - - {state === TxStatusCodes.IN_BLOCK && this.props.numberOfConfirmations != null && ( @@ -767,7 +768,7 @@ export default class TransactionRevamp extends Component { )} - + {intl.formatMessage(globalMessages.transactionId)} @@ -788,14 +789,10 @@ export default class TransactionRevamp extends Component { - {this.getMetadata(data)} - - - {this.props.memo != null ? ( -
    -

    - {intl.formatMessage(memoMessages.memoLabel)} - + + + {intl.formatMessage(memoMessages.memoLabel)} + {this.props.memo != null ? ( -

    - - {this.props.memo?.Content} - -
    - ) : ( -
    - -
    - )} + ) : ( + + )} +
    + + + {this.props.memo != null ? this.props.memo?.Content : '-'} + + +
    + {this.getMetadata(data)}
    @@ -930,44 +922,51 @@ export default class TransactionRevamp extends Component { return null; } return ( - -
    - - - {intl.formatMessage(globalMessages.withdrawalsLabel)}:{' '} - {data.withdrawals.length} - - - {intl.formatMessage(messages.addressType)} - - - {intl.formatMessage(globalMessages.amountLabel)} - - -
    - {data.withdrawals.map((address, addressIndex) => { - const addressRowId = `${txIdFullInfoBasePart}:withdrawalAddresses:address_${addressIndex}`; - return this.renderRow({ - kind: 'withdrawal', - data, - address, - addressIndex, - transform: amount => amount.abs().negated(), - addressRowId, - }); - })} -
    -
    -
    + + + + {intl.formatMessage(globalMessages.withdrawalsLabel)}:{' '} + {data.withdrawals.length} + + + {intl.formatMessage(messages.addressType)} + + + {intl.formatMessage(globalMessages.amountLabel)} + + + + {data.withdrawals.map((address, addressIndex) => { + const addressRowId = `${txIdFullInfoBasePart}:withdrawalAddresses:address_${addressIndex}`; + return this.renderRow({ + kind: 'withdrawal', + data, + address, + addressIndex, + transform: amount => amount.abs().negated(), + addressRowId, + }); + })} + ); }; @@ -976,7 +975,7 @@ export default class TransactionRevamp extends Component { const { intl } = this.context; const wrapCertificateText = (node, manyCerts) => ( - + {manyCerts ? intl.formatMessage(messages.certificatesLabel) : intl.formatMessage(messages.certificateLabel)} @@ -1038,11 +1037,14 @@ export default class TransactionRevamp extends Component { metadata = {JSON.stringify(data.metadata, null, 2)} } />; } return ( -
    -

    {intl.formatMessage(messages.transactionMetadata)}

    - - {metadata} -
    + + + {intl.formatMessage(messages.transactionMetadata)} + + + {metadata} + + ); } return null; @@ -1057,7 +1059,40 @@ const icons = { stake: StakeIcon, }; +const getColors = (ds, type) => { + const colorsByType = { + send: { bg: ds.primary_100, icon: ds.primary_600 }, + receive: { bg: ds.secondary_100, icon: ds.secondary_600 }, + reward: { bg: ds.secondary_100, icon: ds.secondary_600 }, + error: { bg: ds.magenta_100, icon: ds.magenta_500 }, + stake: { bg: ds.secondary_100, icon: ds.secondary_600 }, + }; + + return colorsByType[type] || { bg: ds.primary_100, icon: ds.primary_600 }; +}; + +const IconWrapper = styled(Box)(({ isDark, colors }) => ({ + '& svg': { + '& rect': { + fill: isDark && colors.bg, + }, + '& path': { + fill: isDark && colors.icon, + }, + }, +})); + const TypeIcon = ({ type }) => { const Icon = icons[type]; - return {Icon && }; + const theme = useTheme(); + const colors = getColors(theme.palette.ds, type); + const isDark = theme.name === 'dark-theme'; + + return ( + + + {Icon && } + + + ); }; diff --git a/packages/yoroi-extension/app/components/widgets/CodeBlock.js b/packages/yoroi-extension/app/components/widgets/CodeBlock.js index e5d2357fcd..837795ac5c 100644 --- a/packages/yoroi-extension/app/components/widgets/CodeBlock.js +++ b/packages/yoroi-extension/app/components/widgets/CodeBlock.js @@ -12,7 +12,7 @@ const CodeBlock: any = observer(({ code }: Props) => { return ( {code} diff --git a/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.js b/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.js index 1c5dfc4a80..425de41da6 100644 --- a/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.js +++ b/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.js @@ -98,7 +98,7 @@ class DangerousActionDialog extends Component { /> } id={id + '-acknowledgeAction-checkbox'} - sx={{ marginLeft: '-0px' }} + sx={{ marginLeft: '-0px', color: 'ds.text_gray_medium' }} />
    {error ?

    {intl.formatMessage(error, error.values)}

    : null} diff --git a/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.scss b/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.scss index cb2e458e25..e0ee06a4e8 100644 --- a/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.scss +++ b/packages/yoroi-extension/app/components/widgets/DangerousActionDialog.scss @@ -5,7 +5,6 @@ font-weight: 300; p { - color: var(--yoroi-support-settings-text); font-weight: 400; font-size: 14px; line-height: 19px; diff --git a/packages/yoroi-extension/app/components/widgets/LoadingSpinner.js b/packages/yoroi-extension/app/components/widgets/LoadingSpinner.js index e0d27638da..57229082ab 100644 --- a/packages/yoroi-extension/app/components/widgets/LoadingSpinner.js +++ b/packages/yoroi-extension/app/components/widgets/LoadingSpinner.js @@ -9,28 +9,47 @@ type Props = {| small?: boolean, large?: boolean, light?: boolean, + color?: number, id?: string, |}; @observer export default class LoadingSpinner extends Component { - static defaultProps: {|light: boolean, large: boolean, small: boolean, id: string|} = { + static defaultProps: {|light: boolean, large: boolean, small: boolean, color: number, id: string|} = { small: false, large: false, light: false, + color: 0, id: 'somewhere', }; root: ?HTMLElement; render(): Node { + const colorIsUsed = this.props.color != null && this.props.color >= 1 && this.props.color <= 3; + let colorStyles; + switch (this.props.color) { + case 1: + colorStyles = styles.blue; + break; + case 2: + colorStyles = styles.gray; + break; + case 3: + colorStyles = styles.white; + break; + default: + colorStyles = styles.light; + break; + } + const sizeIndex = 1 - (this.props.small ? 1 : 0) + (this.props.large ? 1 : 0); const sizeClass = ([styles.smallSize, styles.standardSize, styles.largeSize]) [sizeIndex]; - const kindClass = this.props.light === true + const kindClass = colorIsUsed ? colorStyles : this.props.light === true ? styles.light : styles.dark; const componentClasses = classnames([ diff --git a/packages/yoroi-extension/app/components/widgets/LoadingSpinner.scss b/packages/yoroi-extension/app/components/widgets/LoadingSpinner.scss index 1a71c647f2..093e68abb9 100644 --- a/packages/yoroi-extension/app/components/widgets/LoadingSpinner.scss +++ b/packages/yoroi-extension/app/components/widgets/LoadingSpinner.scss @@ -11,7 +11,15 @@ .light { background: url("../../assets/images/spinner-light.svg") no-repeat center; } - +.blue { + background: url("../../assets/images/spinner-blue-solid.svg") no-repeat center; +} +.gray { + background: url("../../assets/images/spinner-gray-solid.svg") no-repeat center; +} +.white { + background: url("../../assets/images/spinner-white-solid.svg") no-repeat center; +} .largeSize { margin: auto auto; width: 38px; diff --git a/packages/yoroi-extension/app/components/widgets/OpenInExplorer.js b/packages/yoroi-extension/app/components/widgets/OpenInExplorer.js index 5eb6599aae..3e3ec9f6ae 100644 --- a/packages/yoroi-extension/app/components/widgets/OpenInExplorer.js +++ b/packages/yoroi-extension/app/components/widgets/OpenInExplorer.js @@ -23,6 +23,6 @@ export default class OpenInExplorer extends Component { return {children} } // Cardano testnet - return {children} + return {children} } } diff --git a/packages/yoroi-extension/app/components/widgets/Support.js b/packages/yoroi-extension/app/components/widgets/Support.js index 37e0df0313..abdccd642c 100644 --- a/packages/yoroi-extension/app/components/widgets/Support.js +++ b/packages/yoroi-extension/app/components/widgets/Support.js @@ -35,8 +35,8 @@ export default class Support extends Component { } getUrl(): string | null { - if (!environment.userAgentInfo.isExtension()) return null; - const agent = environment.userAgentInfo.isFirefox() ? 'firefox' : 'chrome'; + if (!environment.isExtension()) return null; + const agent = environment.isFirefox() ? 'firefox' : 'chrome'; return `https://emurgo.github.io/yoroi-support/?source=${agent}&extensionId=${window.location.hostname}`; } diff --git a/packages/yoroi-extension/app/components/widgets/infoDialog.js b/packages/yoroi-extension/app/components/widgets/infoDialog.js index b1cdf9844f..852a0576fc 100644 --- a/packages/yoroi-extension/app/components/widgets/infoDialog.js +++ b/packages/yoroi-extension/app/components/widgets/infoDialog.js @@ -1,6 +1,6 @@ // @flow import Fade from '@mui/material/Fade'; -import { Dialog, Typography, Button, Stack, Link } from '@mui/material'; +import { Dialog, Typography, Button, Stack, Link, IconButton } from '@mui/material'; import React from 'react'; import type { Node, ComponentType } from 'react'; import { Box } from '@mui/system'; @@ -8,6 +8,7 @@ import type { $npm$ReactIntl$IntlShape } from 'react-intl'; import { defineMessages, injectIntl } from 'react-intl'; import globalMessages from '../../i18n/global-messages'; import { observer } from 'mobx-react'; +import { ReactComponent as CrossIcon } from '../../assets/images/revamp/icons/cross.inline.svg'; export const messages: Object = defineMessages({ dialogTitle: { @@ -43,26 +44,38 @@ function InfoDialog(props: Props & Intl): Node { onClose={onClose} TransitionComponent={Transition} sx={{ - background: 'ds.web_overlay', display: 'flex', justifyContent: 'center', alignItems: 'center', + background: 'ds.bg_color_max', '& .MuiPaper-root': { - background: 'none', maxWidth: 'unset', + backgroundImage: 'none', }, }} id="infoDialog" > + ({ + position: 'absolute', + right: 16, + top: 16, + '& svg': { + '& path': { + fill: theme.palette.ds.el_gray_medium, + }, + }, + })} + > + + {intl.formatMessage(messages.learnMore)} @@ -111,7 +126,7 @@ function InfoDialog(props: Props & Intl): Node { disableRipple={false} onClick={onClose} sx={{ - width: '176px', + width: '100%', }} id="infoDialogContinueButton" > diff --git a/packages/yoroi-extension/app/components/widgets/options/OptionBlock.js b/packages/yoroi-extension/app/components/widgets/options/OptionBlock.js index 864516ccbd..75dc3ce1ca 100644 --- a/packages/yoroi-extension/app/components/widgets/options/OptionBlock.js +++ b/packages/yoroi-extension/app/components/widgets/options/OptionBlock.js @@ -6,9 +6,16 @@ import { intlShape } from 'react-intl'; import classnames from 'classnames'; import globalMessages from '../../../i18n/global-messages'; -import { ReactComponent as ArrowDownSVG } from '../../../assets/images/expand-arrow-grey.inline.svg'; +import { ReactComponent as ArrowDownSVG } from '../../../assets/images/expand-arrow-grey.inline.svg'; import styles from './OptionBlock.scss'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import { Box, styled, Typography } from '@mui/material'; + +const GradientBox = styled(Box)(({ theme }: any) => ({ + backgroundImage: theme.palette.ds.bg_gradient_1, + marginBottom: '16px', + borderRadius: '8px', +})); type Props = {| +parentName: string, @@ -25,13 +32,13 @@ type State = {| @observer export default class OptionBlock extends Component { - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { + static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { intl: intlShape.isRequired, }; - static defaultProps: {|learnMoreText: void|} = { - learnMoreText: undefined - } + static defaultProps: {| learnMoreText: void |} = { + learnMoreText: undefined, + }; state: State = { showLearnMore: false, @@ -45,57 +52,40 @@ export default class OptionBlock extends Component { const { intl } = this.context; const { parentName, type, title, learnMoreText, onSubmit } = this.props; - const learnMoreTextBlockClasses = classnames([ - styles.learnMoreTextBlock, - this.state.showLearnMore && styles.showlearnMore, - ]); + const learnMoreTextBlockClasses = classnames([styles.learnMoreTextBlock, this.state.showLearnMore && styles.showlearnMore]); - const learnMoreButtonClasses = classnames([ - styles.learnMoreButton, - this.state.showLearnMore && styles.arrowUp, - ]); + const learnMoreButtonClasses = classnames([styles.learnMoreButton, this.state.showLearnMore && styles.arrowUp]); return ( -
  • -
    - {/* Submit button block */} - - {/* Learn more block */} - {(learnMoreText != null && learnMoreText !== '') - ? ( + +
  • +
    + {/* Submit button block */} + + {/* Learn more block */} + {learnMoreText != null && learnMoreText !== '' ? (
    -
    {learnMoreText}
    + {learnMoreText}
    - -
    ) - : null - } -
    -
  • +
    + ) : null} + + + ); } } diff --git a/packages/yoroi-extension/app/components/widgets/options/OptionBlock.scss b/packages/yoroi-extension/app/components/widgets/options/OptionBlock.scss index d73c8b70df..7246501603 100644 --- a/packages/yoroi-extension/app/components/widgets/options/OptionBlock.scss +++ b/packages/yoroi-extension/app/components/widgets/options/OptionBlock.scss @@ -1,7 +1,6 @@ @import '../../../themes/mixins/underline'; .optionBlockListItem { - box-shadow: 0 5px 20px 0px rgba(24, 26, 30, 0.08); border-radius: 8px; transition: 250ms; @@ -19,7 +18,6 @@ display: flex; align-items: center; padding: 11px 30px; - background-color: var(--yoroi-palette-common-white); width: 100%; cursor: pointer; transition: 100ms; @@ -28,7 +26,6 @@ .optionTitle { font-size: 18px; line-height: 22px; - color: var(--yoroi-wallet-add-option-dialog-item-title-color); text-align: left; font-weight: 500; transition: 100ms; @@ -57,23 +54,19 @@ } } - &:hover { - box-shadow: 0 5px 20px 0px rgba(24, 26, 30, 0.12); - } + } // LEARN MORE TEXT BLOCK .learnMoreTextBlock { a { @include underline(var(--yoroi-palette-gray-800)); - color: var(--yoroi-wallet-add-option-dialog-item-title-color); } overflow: hidden; max-height: 0; transition: 300ms linear; will-change: height; - background-color: var(--yoroi-palette-gray-50); .learnMoreTextWrapper { padding: 20px 40px 15px; @@ -93,7 +86,6 @@ // LEARN MORE BUTTON .learnMoreButton { color: var(--yoroi-palette-gray-400); - background-color: var(--yoroi-wallet-add-option-dialog-item-learn-more-button-bg-color); display: block; font-size: 14px; text-align: center; diff --git a/packages/yoroi-extension/app/connector/containers/SignTxContainer.js b/packages/yoroi-extension/app/connector/containers/SignTxContainer.js index 9355a8ddba..a5941aeac0 100644 --- a/packages/yoroi-extension/app/connector/containers/SignTxContainer.js +++ b/packages/yoroi-extension/app/connector/containers/SignTxContainer.js @@ -51,10 +51,10 @@ export default class SignTxContainer extends Component< // will throw a WrongPasswordError if password is wrong await getPrivateStakingKey({ publicDeriverId: deriver.publicDeriverId, password }); } + await this.props.actions.connector.confirmSignInTx.trigger(password); window.removeEventListener('beforeunload', this.onUnload); window.removeEventListener('unload', this.onUnload); - - await this.props.actions.connector.confirmSignInTx.trigger(password); + window.close(); }; onCancel: () => void = () => { window.removeEventListener('beforeunload', this.onUnload); diff --git a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js index b5fb9e2bff..5c7b730e80 100644 --- a/packages/yoroi-extension/app/connector/stores/ConnectorStore.js +++ b/packages/yoroi-extension/app/connector/stores/ConnectorStore.js @@ -361,7 +361,6 @@ export default class ConnectorStore extends Store { this.actions.connector.cancelSignInTx.remove(this._cancelSignInTx); await ampli.dappPopupSignTransactionSubmitted(); - this._closeWindow(); }; @action _cancelSignInTx: void => void = () => { diff --git a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js index fd96a0e43c..73553cebf7 100644 --- a/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js +++ b/packages/yoroi-extension/app/containers/NavBarContainerRevamp.js @@ -43,9 +43,9 @@ export default class NavBarContainerRevamp extends Component { }; addNewWallet: void => Promise = async () => { - await localStorage.unsetPortfolioFiatPair(); this.props.actions.dialogs.closeActiveDialog.trigger(); this.props.actions.router.goToRoute.trigger({ route: ROUTES.WALLETS.ADD }); + await localStorage.unsetPortfolioFiatPair(); }; onSelectWallet: number => Promise = async newWalletId => { diff --git a/packages/yoroi-extension/app/containers/profile/LanguageSelectionPage.js b/packages/yoroi-extension/app/containers/profile/LanguageSelectionPage.js index d2699437ff..83eaa41f73 100644 --- a/packages/yoroi-extension/app/containers/profile/LanguageSelectionPage.js +++ b/packages/yoroi-extension/app/containers/profile/LanguageSelectionPage.js @@ -87,6 +87,7 @@ export default class LanguageSelectionPage extends Component ); diff --git a/packages/yoroi-extension/app/containers/settings/categories/BlockchainSettingsPage.js b/packages/yoroi-extension/app/containers/settings/categories/BlockchainSettingsPage.js index caadf4342f..6bd10551e4 100644 --- a/packages/yoroi-extension/app/containers/settings/categories/BlockchainSettingsPage.js +++ b/packages/yoroi-extension/app/containers/settings/categories/BlockchainSettingsPage.js @@ -32,10 +32,10 @@ export default class BlockchainSettingsPage extends Component registerProtocols()} - isFirefox={environment.userAgentInfo.isFirefox()} + isFirefox={environment.isFirefox()} /> ) : null; diff --git a/packages/yoroi-extension/app/containers/settings/categories/RemoveWalletDialogContainer.js b/packages/yoroi-extension/app/containers/settings/categories/RemoveWalletDialogContainer.js index c8a69e9659..90d0ef75c0 100644 --- a/packages/yoroi-extension/app/containers/settings/categories/RemoveWalletDialogContainer.js +++ b/packages/yoroi-extension/app/containers/settings/categories/RemoveWalletDialogContainer.js @@ -13,6 +13,7 @@ import type { StoresAndActionsProps } from '../../../types/injectedProps.types'; import DangerousActionDialog from '../../../components/widgets/DangerousActionDialog'; import type { LayoutComponentMap } from '../../../styles/context/layout'; import { withLayout } from '../../../styles/context/layout'; +import { Typography } from '@mui/material'; type Props = {| ...StoresAndActionsProps, @@ -62,9 +63,7 @@ class RemoveWalletDialogContainer extends Component { const newWalletsNavigation = { ...walletsNavigation, // $FlowFixMe[invalid-computed-prop] - 'cardano': walletsNavigation.cardano.filter( - walletId => walletId !== selectedWalletId - ), + cardano: walletsNavigation.cardano.filter(walletId => walletId !== selectedWalletId), }; await this.props.actions.profile.updateSortedWalletList.trigger(newWalletsNavigation); @@ -100,8 +99,8 @@ class RemoveWalletDialogContainer extends Component { }} id="removeWalletDialog" > -

    {intl.formatMessage(messages.removeExplanation)}

    -

    {intl.formatMessage(dialogMessages.warning2)}

    + {intl.formatMessage(messages.removeExplanation)} + {intl.formatMessage(dialogMessages.warning2)} ); const DangerousActionDialogRevamp = ( @@ -122,8 +121,13 @@ class RemoveWalletDialogContainer extends Component { }} id="removeWalletDialog" > -

    {intl.formatMessage(messages.removeExplanation)}

    -

    {intl.formatMessage(dialogMessages.warning2)}

    + + {intl.formatMessage(messages.removeExplanation)} + + + {' '} + {intl.formatMessage(dialogMessages.warning2)} + ); diff --git a/packages/yoroi-extension/app/containers/settings/categories/SupportSettingsPage.js b/packages/yoroi-extension/app/containers/settings/categories/SupportSettingsPage.js index e0f6b21dac..103d4a4b56 100644 --- a/packages/yoroi-extension/app/containers/settings/categories/SupportSettingsPage.js +++ b/packages/yoroi-extension/app/containers/settings/categories/SupportSettingsPage.js @@ -8,6 +8,7 @@ import { downloadLogs } from '../../../utils/logging'; import type { StoresAndActionsProps } from '../../../types/injectedProps.types'; import IncludePublicKeyDialog from './IncludePublicKeyDialog'; import { ComplexityLevels } from '../../../types/complexityLevelType'; +import { ROUTES } from '../../../routes-config'; @observer export default class SupportSettingsPage extends Component { @@ -54,12 +55,14 @@ export default class SupportSettingsPage extends Component {this.getDialog()} actions.router.redirect.trigger({ route: ROUTES.TRANSFER.ROOT })} /> ); diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js index 63629bee5c..e55a7e385d 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/SwapPage.js @@ -33,6 +33,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import { ampli } from '../../../../ampli/index'; import { tokenInfoToAnalyticsFromAndToAssets } from '../swapAnalytics'; import { useSwapFeeDisplay } from '../hooks'; +import { downloadLogs } from '../../../utils/logging'; const messages = defineMessages({ sendUsingLedgerNano: { @@ -398,6 +399,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { onSuccess={() => { props.actions.router.goToRoute.trigger({ route: ROUTES.WALLETS.ROOT }); }} + onDownloadLogs={downloadLogs} /> )}
    @@ -422,7 +424,7 @@ function SwapPage(props: StoresAndActionsProps & Intl): Node { variant="primary" disabled={!isSwapEnabled || isButtonLoader} > - {(isButtonLoader && ) || (orderStep === 0 ? 'Swap' : intl(confirmationButtonMessage()))} + {(isButtonLoader && ) || (orderStep === 0 ? 'Swap' : intl(confirmationButtonMessage()))} )} diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/TxSubmittedStep.js b/packages/yoroi-extension/app/containers/swap/asset-swap/TxSubmittedStep.js index afed109988..45c94302b4 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/TxSubmittedStep.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/TxSubmittedStep.js @@ -8,9 +8,10 @@ type Props = {| txSubmitErrorState: State, onTryAgain: void => void, onSuccess: void => void, + onDownloadLogs: void => void, |}; -export default function TxSubmittedStep({ txSubmitErrorState, onTryAgain, onSuccess }: Props): React$Node { +export default function TxSubmittedStep({ txSubmitErrorState, onTryAgain, onSuccess, onDownloadLogs }: Props): React$Node { const isSuccessful = txSubmitErrorState.value == null; return ( @@ -32,7 +33,7 @@ export default function TxSubmittedStep({ txSubmitErrorState, onTryAgain, onSucc {!isSuccessful && ( - diff --git a/packages/yoroi-extension/app/containers/swap/asset-swap/actions/MiddleActions.js b/packages/yoroi-extension/app/containers/swap/asset-swap/actions/MiddleActions.js index 7f2860824c..90401aab01 100644 --- a/packages/yoroi-extension/app/containers/swap/asset-swap/actions/MiddleActions.js +++ b/packages/yoroi-extension/app/containers/swap/asset-swap/actions/MiddleActions.js @@ -4,16 +4,24 @@ import { ReactComponent as SwitchIcon } from '../../../../assets/images/revamp/i import { useSwapForm } from '../../context/swap-form'; export const MiddleActions = (): React$Node => { - const { clearSwapForm, switchTokens, onChangeLimitPrice } = useSwapForm(); + const { clearSwapForm, switchTokens, onChangeLimitPrice, buyTokenInfo = {} } = useSwapForm(); + + const handleSwitchTokens = () => { + // we have ticker on the buy side, so we can safely switch + if (buyTokenInfo?.ticker) { + onChangeLimitPrice(''); + return switchTokens(); + } + }; return ( { - onChangeLimitPrice(''); - return switchTokens(); + sx={{ + cursor: buyTokenInfo?.ticker ? 'pointer' : 'not-allowed', + color: buyTokenInfo?.ticker ? 'primary.500' : 'grayscale.400', }} + onClick={handleSwitchTokens} > diff --git a/packages/yoroi-extension/app/containers/transfer/Transfer.js b/packages/yoroi-extension/app/containers/transfer/Transfer.js index ef2293064b..fa1262add8 100644 --- a/packages/yoroi-extension/app/containers/transfer/Transfer.js +++ b/packages/yoroi-extension/app/containers/transfer/Transfer.js @@ -1,22 +1,17 @@ // @flow -import type { ComponentType, Node } from 'react'; +import type { Node } from 'react'; +import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; +import type { StoresAndActionsProps } from '../../types/injectedProps.types'; import { Component, lazy, Suspense } from 'react'; import { observer } from 'mobx-react'; -import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; import { intlShape } from 'react-intl'; -import type { StoresAndActionsProps } from '../../types/injectedProps.types'; import TopBarLayout from '../../components/layout/TopBarLayout'; import BannerContainer from '../banners/BannerContainer'; import SidebarContainer from '../SidebarContainer'; -import BackgroundColoredLayout from '../../components/layout/BackgroundColoredLayout'; import NoWalletMessage from '../wallet/NoWalletMessage'; -import UnsupportedWallet from '../wallet/UnsupportedWallet'; import NavBarTitle from '../../components/topbar/NavBarTitle'; -import NavBarContainer from '../NavBarContainer'; import globalMessages from '../../i18n/global-messages'; -import HorizontalLine from '../../components/widgets/HorizontalLine'; -import type { LayoutComponentMap } from '../../styles/context/layout'; -import { withLayout } from '../../styles/context/layout'; +import NavBarContainerRevamp from '../NavBarContainerRevamp'; export const WalletTransferPagePromise: void => Promise = () => import('./WalletTransferPage'); const WalletTransferPage = lazy(WalletTransferPagePromise); @@ -26,11 +21,8 @@ type Props = {| +children?: Node, |}; -type InjectedLayoutProps = {| +renderLayoutComponent: LayoutComponentMap => Node |}; -type AllProps = {| ...Props, ...InjectedLayoutProps |}; - @observer -class Transfer extends Component { +class Transfer extends Component { static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { intl: intlShape.isRequired, }; @@ -41,26 +33,17 @@ class Transfer extends Component { render(): Node { const { actions, stores } = this.props; - if (this.props.stores.profile.isRevampTheme) { - return null; - } const sidebarContainer = ; const navbar = ( - - } + title={} /> ); + return ( - } - navbar={navbar} - sidebar={sidebarContainer} - showInContainer - > + } navbar={navbar} sidebar={sidebarContainer}> {this.getContent()} ); @@ -72,24 +55,12 @@ class Transfer extends Component { if (wallet == null) { return ; } - // temporary solution: will need to handle more cases later for different currencies - if (wallet.isCardanoHaskell) { - return ; - } + return ( - <> - - - - - - - + + + ); }; } -export default (withLayout(Transfer): ComponentType); +export default Transfer; diff --git a/packages/yoroi-extension/app/containers/transfer/WalletTransferPage.js b/packages/yoroi-extension/app/containers/transfer/WalletTransferPage.js index 8189738564..6d5b9008f7 100644 --- a/packages/yoroi-extension/app/containers/transfer/WalletTransferPage.js +++ b/packages/yoroi-extension/app/containers/transfer/WalletTransferPage.js @@ -1,29 +1,15 @@ // @flow import type { Node } from 'react'; +import type { StoresAndActionsProps } from '../../types/injectedProps.types'; import { Component } from 'react'; import { observer } from 'mobx-react'; -import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; -import { intlShape } from 'react-intl'; - -import type { StoresAndActionsProps } from '../../types/injectedProps.types'; - +import { getTokenName } from '../../stores/stateless/tokenHelpers'; +import { truncateToken } from '../../utils/formatters'; import TransferTypeSelect from '../../components/transfer/cards/TransferTypeSelect'; -import { PublicDeriver } from '../../api/ada/lib/storage/models/PublicDeriver'; import YoroiTransferPage from './YoroiTransferPage'; -import { genLookupOrFail, getTokenName, } from '../../stores/stateless/tokenHelpers'; -import { truncateToken } from '../../utils/formatters'; - -type Props = {| - ...StoresAndActionsProps, - publicDeriver: PublicDeriver<>, -|}; @observer -export default class WalletTransferPage extends Component { - static contextTypes: {|intl: $npm$ReactIntl$IntlFormat|} = { - intl: intlShape.isRequired, - }; - +export default class WalletTransferPage extends Component { onClose: void => void = () => { this.props.actions.dialogs.closeActiveDialog.trigger(); }; @@ -31,21 +17,20 @@ export default class WalletTransferPage extends Component { // paper startTransferYoroiPaperFunds: void => void = () => { this.props.actions.yoroiTransfer.startTransferFunds.trigger(); - } + }; render(): Node { const { actions, stores } = this.props; - const defaultToken = this.props.publicDeriver.getParent().getDefaultToken(); - const defaultTokenInfo = genLookupOrFail(this.props.stores.tokenInfoStore.tokenInfo)({ - identifier: defaultToken.defaultIdentifier, - networkId: defaultToken.defaultNetworkId, - }); + const wallet = stores.wallets.selected; + if (wallet == null) { + return null; + } + + const defaultTokenInfo = stores.tokenInfoStore.getDefaultTokenInfo(wallet.networkId); + return ( <> - + ); diff --git a/packages/yoroi-extension/app/containers/wallet/WalletReceivePage.js b/packages/yoroi-extension/app/containers/wallet/WalletReceivePage.js index a29795a278..eb5017bd98 100644 --- a/packages/yoroi-extension/app/containers/wallet/WalletReceivePage.js +++ b/packages/yoroi-extension/app/containers/wallet/WalletReceivePage.js @@ -119,6 +119,7 @@ class WalletReceivePage extends Component { }; const isHwWallet = publicDeriver.type !== 'mnemonic'; + const isAddressBook = addressTypeStore.meta.name.group === AddressGroupTypes.addressBook; const onCopyAddressTooltip = (address, elementId) => { if (!uiNotifications.isOpen(elementId)) { @@ -193,7 +194,7 @@ class WalletReceivePage extends Component { /> ); } - if (addressTypeStore.meta.name.group === AddressGroupTypes.addressBook) { + if (isAddressBook) { return null; } if (addressTypeStore.meta.name.subgroup === AddressSubgroup.all) { @@ -357,6 +358,7 @@ class WalletReceivePage extends Component { cancel={actions.ada.hwVerifyAddress.closeAddressDetailDialog.trigger} classicTheme={profile.isClassicTheme} complexityLevel={profile.selectedComplexityLevel} + isAddressBook={isAddressBook} /> ) : null} diff --git a/packages/yoroi-extension/app/containers/wallet/WalletSendPage.js b/packages/yoroi-extension/app/containers/wallet/WalletSendPage.js index b91530bf7e..cec7aa9bd0 100644 --- a/packages/yoroi-extension/app/containers/wallet/WalletSendPage.js +++ b/packages/yoroi-extension/app/containers/wallet/WalletSendPage.js @@ -32,6 +32,9 @@ import AddNFTDialog from '../../components/wallet/send/WalletSendFormSteps/AddNF import AddTokenDialog from '../../components/wallet/send/WalletSendFormSteps/AddTokenDialog'; import { ampli } from '../../../ampli/index'; import { getNetworkById } from '../../api/ada/lib/storage/database/prepackaged/networks'; +import LoadingSpinner from '../../components/widgets/LoadingSpinner'; +import VerticallyCenteredLayout from '../../components/layout/VerticallyCenteredLayout'; +import FullscreenLayout from '../../components/layout/FullscreenLayout'; const messages = defineMessages({ txConfirmationLedgerNanoLine1: { @@ -95,8 +98,10 @@ class WalletSendPage extends Component { this.props.stores.substores.ada.addresses.getSupportedAddressDomainBannerState(); }); const { loadProtocolParametersRequest } = this.props.stores.protocolParameters; - loadProtocolParametersRequest.reset(); - loadProtocolParametersRequest.execute(); + if (!loadProtocolParametersRequest.wasExecuted && !loadProtocolParametersRequest.isExecuting) { + loadProtocolParametersRequest.reset(); + loadProtocolParametersRequest.execute(); + } ampli.sendInitiated(); } @@ -145,7 +150,13 @@ class WalletSendPage extends Component { } = this.props.stores; if (!protocolParameters.loadProtocolParametersRequest.wasExecuted) { - return null; + return ( + + + + + + ); } const { actions } = this.props; diff --git a/packages/yoroi-extension/app/containers/wallet/dialogs/ChangeWalletPasswordDialogContainer.js b/packages/yoroi-extension/app/containers/wallet/dialogs/ChangeWalletPasswordDialogContainer.js index 5af7f37df9..dafb951bc5 100644 --- a/packages/yoroi-extension/app/containers/wallet/dialogs/ChangeWalletPasswordDialogContainer.js +++ b/packages/yoroi-extension/app/containers/wallet/dialogs/ChangeWalletPasswordDialogContainer.js @@ -5,18 +5,16 @@ import { observer } from 'mobx-react'; import ChangeWalletPasswordDialog from '../../../components/wallet/settings/ChangeWalletPasswordDialog'; import type { StoresAndActionsProps } from '../../../types/injectedProps.types'; -type Props = {| - ...StoresAndActionsProps, +type LocalProps = {| publicDeriverId: number, |}; @observer -export default class ChangeWalletPasswordDialogContainer extends Component { +export default class ChangeWalletPasswordDialogContainer extends Component<{| ...StoresAndActionsProps, ...LocalProps |}> { render(): Node { const { actions } = this.props; - const { uiDialogs, profile } = this.props.stores; - const { walletSettings } = this.props.stores; + const { uiDialogs, profile, walletSettings } = this.props.stores; const { updateDataForActiveDialog } = actions.dialogs; const { changeSigningKeyRequest } = walletSettings; diff --git a/packages/yoroi-extension/app/containers/wallet/staking/SeizaFetcher.js b/packages/yoroi-extension/app/containers/wallet/staking/SeizaFetcher.js index 2c7c68eaf7..833e5e98cb 100644 --- a/packages/yoroi-extension/app/containers/wallet/staking/SeizaFetcher.js +++ b/packages/yoroi-extension/app/containers/wallet/staking/SeizaFetcher.js @@ -157,8 +157,8 @@ class SeizaFetcher extends Component { _getBrowserReplacement(): string { // 1) handle Yoroi running as an extension - if (environment.userAgentInfo.isExtension()) { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isExtension()) { + if (environment.isFirefox()) { return 'firefox&mozId=' + location.hostname; } // otherwise assume Chrome @@ -167,7 +167,7 @@ class SeizaFetcher extends Component { } // 2) Handle Yoroi running as a website - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { return 'firefox&host' + location.host; } // otherwise assume Chrome diff --git a/packages/yoroi-extension/app/containers/wallet/staking/StakingPageContent.js b/packages/yoroi-extension/app/containers/wallet/staking/StakingPageContent.js index 301e895e84..8998bd463f 100644 --- a/packages/yoroi-extension/app/containers/wallet/staking/StakingPageContent.js +++ b/packages/yoroi-extension/app/containers/wallet/staking/StakingPageContent.js @@ -31,7 +31,6 @@ import type { LayoutComponentMap } from '../../../styles/context/layout'; import type { StoresAndActionsProps } from '../../../types/injectedProps.types'; import type { $npm$ReactIntl$IntlFormat } from 'react-intl'; import { MultiToken } from '../../../api/common/lib/MultiToken'; -import type { WalletType } from '../../../../chrome/extension/background/types'; // populated by ConfigWebpackPlugin declare var CONFIG: ConfigType; @@ -40,13 +39,21 @@ type InjectedLayoutProps = {| +renderLayoutComponent: LayoutComponentMap => Node, |}; +type State = {| + govStatusFetched: boolean; +|} + type AllProps = {| ...StoresAndActionsProps, ...InjectedLayoutProps |}; @observer -class StakingPageContent extends Component { +class StakingPageContent extends Component { static contextTypes: {| intl: $npm$ReactIntl$IntlFormat |} = { intl: intlShape.isRequired, }; + state: State = { + govStatusFetched: false, + }; + onClose: void => void = () => { this.props.actions.dialogs.closeActiveDialog.trigger(); }; @@ -56,10 +63,14 @@ class StakingPageContent extends Component { if (wallet == null) { throw new Error(`${nameof(StakingPageContent)} no public deriver. Should never happen`); } - // Check governance only for certain network - if (wallet.type !== 'trezor') { - noop(this.props.stores.delegation.checkGovernanceStatus(wallet)); - } + this.props.stores.delegation.checkGovernanceStatus(wallet).then(() => { + this.setState({ + govStatusFetched: true, + }); + return null; + }).catch(e => { + console.error('Failed to fetch governance status', e); + }); if (this.props.stores.delegation.getPoolTransitionConfig(wallet).shouldUpdatePool) { const poolTransitionInfo = this.props.stores.delegation.getPoolTransitionInfo(wallet); if (poolTransitionInfo?.suggestedPool) { @@ -212,9 +223,17 @@ class StakingPageContent extends Component { const delegatedUtxo = stores.delegation.getDelegatedUtxoBalance(publicDeriver.publicDeriverId); const delegatedRewards = stores.delegation.getRewardBalanceOrZero(publicDeriver); - // remove special check after governance for trezor is added - const isTrezor = (publicDeriver.type: WalletType) === 'trezor'; - const isParticipatingToGovernance = stores.delegation.governanceStatus?.drepDelegation != null || isTrezor; + const isParticipatingToGovernance = stores.delegation.governanceStatus?.drepDelegation != null; + + const handleRewardsWithdrawal = async () => { + if (!isParticipatingToGovernance) { + this.props.actions.dialogs.open.trigger({ + dialog: GovernanceParticipateDialog, + }); + return; + } + this.createWithdrawalTx(false) // shouldDeregister=false + }; return ( @@ -230,17 +249,7 @@ class StakingPageContent extends Component { dialog: OverviewModal, }) } - withdrawRewards={ - isParticipatingToGovernance === false - ? async () => { - this.props.actions.dialogs.open.trigger({ - dialog: GovernanceParticipateDialog, - }); - } - : isStakeRegistered - ? async () => this.createWithdrawalTx(false) // shouldDeregister=false - : undefined - } + withdrawRewards={isStakeRegistered && this.state.govStatusFetched ? handleRewardsWithdrawal : undefined} unitOfAccount={this.toUnitOfAccount} getTokenInfo={genLookupOrFail(stores.tokenInfoStore.tokenInfo)} shouldHideBalance={stores.profile.shouldHideBalance} diff --git a/packages/yoroi-extension/app/containers/wallet/staking/WithdrawRewardsDialog.js b/packages/yoroi-extension/app/containers/wallet/staking/WithdrawRewardsDialog.js index 91bd1f10a1..46ab25c078 100644 --- a/packages/yoroi-extension/app/containers/wallet/staking/WithdrawRewardsDialog.js +++ b/packages/yoroi-extension/app/containers/wallet/staking/WithdrawRewardsDialog.js @@ -28,6 +28,7 @@ import RawHash from '../../../components/widgets/hashWrappers/RawHash'; import Warning from '../../../components/common/Warning'; import Dialog from '../../../components/widgets/Dialog'; import { getNetworkById } from '../../../api/ada/lib/storage/database/prepackaged/networks'; +import HorizintallyCenteredLayout from '../../../components/layout/HorizintallyCenteredLayout'; const messages = defineMessages({ dialogTitle: { @@ -167,10 +168,12 @@ export default class WithdrawRewardsDialog extends Component { if (!tentativeTx) return ( - + - + + + diff --git a/packages/yoroi-extension/app/coreUtils.js b/packages/yoroi-extension/app/coreUtils.js index 1d60daf755..adb055e7f8 100644 --- a/packages/yoroi-extension/app/coreUtils.js +++ b/packages/yoroi-extension/app/coreUtils.js @@ -162,7 +162,7 @@ export function fail(...params: any[]): T { /** * Returns the passed argument with no changes and just force-casts it to defined type */ -export function forceNonNull(t: ?T): T { +export function forceNonNull(t: ?T | null): T { // $FlowIgnore return t; } @@ -225,11 +225,13 @@ export function timeCached(fun: () => R, ttl: number): () => R { * @return same value or a copy in case the value is an object */ export function sanitizeForLog(v: any): any { + const fields: Array = ['password']; if (v != null && typeof v === 'object') { let r = Object.keys(v).reduce((o, k) => ({ ...o, [k]: sanitizeForLog(v[k]) }) , {}) - // $FlowIgnore[incompatible-use] - if (r.password != null) { - r = { ...r, password: '[sanitized]' }; + for (const f of fields) { + if (r[f] != null) { + r = { ...r, [f]: '[sanitized]' }; + } } return r; } diff --git a/packages/yoroi-extension/app/domain/CardanoShelleyTransaction.js b/packages/yoroi-extension/app/domain/CardanoShelleyTransaction.js index 4beaca3ff4..f4f3fa1322 100644 --- a/packages/yoroi-extension/app/domain/CardanoShelleyTransaction.js +++ b/packages/yoroi-extension/app/domain/CardanoShelleyTransaction.js @@ -219,7 +219,11 @@ export function deserializeTransactionCtorData( state: serializedData.state, errorMsg: serializedData.errorMsg, certificates: serializedData.certificates, - ttl: serializedData.ttl && new BigNumber(serializedData.ttl), + ttl: serializedData.ttl && new BigNumber( + typeof serializedData.ttl === 'object' + ? { ...serializedData.ttl, _isBigNumber: true } + : serializedData.ttl + ), metadata: serializedData.metadata, withdrawals: serializedData.withdrawals.map(({ address, value }) => ({ address, diff --git a/packages/yoroi-extension/app/domain/LedgerLocalizedError.js b/packages/yoroi-extension/app/domain/LedgerLocalizedError.js index 3df2297340..11ddc21e86 100644 --- a/packages/yoroi-extension/app/domain/LedgerLocalizedError.js +++ b/packages/yoroi-extension/app/domain/LedgerLocalizedError.js @@ -43,9 +43,9 @@ export const ledgerErrors: * = defineMessages({ id: 'wallet.hw.ledger.catalyst.cip36.unsupported', defaultMessage: '!!!Catalyst registration requires Ledger app version 6.', }, - deviceVersionNoDataSigning: { - id: 'wallet.hw.ledger.error.deviceVersionNoDataSigning', - defaultMessage: '!!!CIP-8 message signing not supported by your Ledger app version', + deviceVersionNoDataSigningSpecific: { + id: 'wallet.hw.ledger.error.deviceVersionNoDataSigningSpecific', + defaultMessage: '!!!CIP-8 message signing is only supported by Cardano app version 7.1.0 or above.', }, deviceStatusError: { id: 'wallet.hw.ledger.error.deviceStatus', @@ -83,7 +83,7 @@ export function convertToLocalizableError(error: Error): LocalizableError { } } if (/^DeviceVersionUnsupported/.test(error.message)) { - return new LocalizableError(ledgerErrors.deviceVersionNoDataSigning); + return new LocalizableError(ledgerErrors.deviceVersionNoDataSigningSpecific); } if (/Invalid data supplied to Ledger/.test(error.message)) { return new LocalizableError( @@ -95,6 +95,11 @@ export function convertToLocalizableError(error: Error): LocalizableError { ledgerErrors.cancelOnDeviceError101 ); } + if (/CIP-8 message signing not supported by Ledger app/.test(error.message)) { + return new LocalizableError( + ledgerErrors.deviceVersionNoDataSigningSpecific + ); + } // Ledger device related error happened, convert then to LocalizableError switch (error.message) { case 'TransportError: Failed to sign with Ledger device: U2F TIMEOUT': diff --git a/packages/yoroi-extension/app/domain/TrezorLocalizedError.js b/packages/yoroi-extension/app/domain/TrezorLocalizedError.js index 24253f8ae0..dff1116c16 100644 --- a/packages/yoroi-extension/app/domain/TrezorLocalizedError.js +++ b/packages/yoroi-extension/app/domain/TrezorLocalizedError.js @@ -20,6 +20,10 @@ const messages = defineMessages({ defaultMessage: '!!!Could not sign the transaction. Please ensure the passphrase you entered is the passhprase used to create this wallet.', }, + conwayNotSupportedByFirmwareError: { + id: 'wallet.send.trezor.error.conway.firmware', + defaultMessage: '!!!Conway features not supported by your Trezor firmware version. Please upgrade to 2.8.1 or above.', + }, }); /** Converts error(from API or Trezor API) to LocalizableError */ @@ -35,6 +39,8 @@ export function convertToLocalizableError(error: Error): LocalizableError { localizableError = new LocalizableError(messages.noWitnessError); } else if (/Cancelled/.test(error.message)) { localizableError = new LocalizableError(messages.signTxError101); + } else if (/Feature Conway not supported by device firmware/.test(error.message)) { + localizableError = new LocalizableError(messages.conwayNotSupportedByFirmwareError); } else { // Trezor device related error happend, convert then to LocalizableError switch (error.message) { diff --git a/packages/yoroi-extension/app/environment.js b/packages/yoroi-extension/app/environment.js index ce035f74ed..e2191559a9 100644 --- a/packages/yoroi-extension/app/environment.js +++ b/packages/yoroi-extension/app/environment.js @@ -7,6 +7,78 @@ import userAgentInfo from './utils/userAgentInfo'; // populated by ConfigWebpackPlugin declare var CONFIG: ConfigType; +declare var browser; + +const IS_FIREFOX_BROWSER_INFO: [boolean | null] = [null]; +if (typeof browser !== 'undefined') { + browser.runtime.getBrowserInfo().then(({ name }) => { + const isff = name === 'Firefox'; + console.debug(`isFirefox = ${String(isff)} / defined by browser info API`) + IS_FIREFOX_BROWSER_INFO[0] = isff; + return null; + }).catch(e => { + console.error('failed to call browser info API', e); + }); +} + +function isChromeProtocol(): boolean { + return location.protocol === 'chrome-extension:'; +} + +function isMozProtocol(): boolean { + return location.protocol === 'moz-extension:'; +} + +function isExtension(): boolean { + return isChromeProtocol() || isMozProtocol(); +} + +function isFirefox(): boolean { + if (IS_FIREFOX_BROWSER_INFO[0] != null) { + return IS_FIREFOX_BROWSER_INFO[0]; + } + + if (isMozProtocol()) { + return true; + } + // if an extension type that isn't Firefox, return false + if (isExtension()) { + return false; + } + + // $FlowExpectedError[cannot-resolve-name] InstallTrigger is a global from the browser + return typeof InstallTrigger !== 'undefined'; +} + +function isChrome(): boolean { + /** + * This method returns true for all browser that uses `chrome-extension:` protocol, + *hence it will return true for browsers like Google Chrome, Brave + */ + if (isChromeProtocol()) { + return true; + } + // if an extension type that isn't Chrome-based, return false + if (isExtension()) { + return false; + } + + return !!window.chrome + && (!!window.chrome.webstore || !!window.chrome.runtime) + && !isFirefox(); +} + +function canRegisterProtocol(): boolean { + // Moz-Extension specify the protocol in the manifest not at runtime + if (isExtension() && isFirefox()) { + return false; + } + // Can only register a protocol to a website if it's https + if (!isExtension() && window.location.protocol !== 'https:') { + return false; + } + return true; +} function getVersion(): string { const genManifest = require('../chrome/manifest.' + CONFIG.network.name); @@ -16,6 +88,8 @@ function getVersion(): string { return content.version; } +const FIREFOX_PRIVACY_POLICY_URL = 'https://addons.mozilla.org/en-US/firefox/addon/yoroi/privacy'; + export const environment = (( { ...process.env, @@ -41,6 +115,16 @@ export const environment = (( getWalletRefreshInterval: () => CONFIG.app.walletRefreshInterval, getServerStatusRefreshInterval: () => CONFIG.app.serverStatusRefreshInterval, userAgentInfo, + isFirefox, + isChrome, + isExtension, + canRegisterProtocol, + externalPrivacyPolicyURL: () => { + if (isFirefox()) { + return FIREFOX_PRIVACY_POLICY_URL; + } + return null; + } } ): { getNetworkName: void => Network, @@ -56,6 +140,11 @@ export const environment = (( isProduction: void => boolean, getWalletRefreshInterval: void => number, getServerStatusRefreshInterval: void => number, + isExtension: void => boolean, + isFirefox: void => boolean, + isChrome: void => boolean, + canRegisterProtocol: void => boolean, + externalPrivacyPolicyURL: void => ?string, userAgentInfo: UserAgentInfo, isLight: boolean, ... diff --git a/packages/yoroi-extension/app/i18n/locales/en-US.json b/packages/yoroi-extension/app/i18n/locales/en-US.json index 6d6485a998..501e9d078f 100644 --- a/packages/yoroi-extension/app/i18n/locales/en-US.json +++ b/packages/yoroi-extension/app/i18n/locales/en-US.json @@ -3,7 +3,7 @@ "api.errors.CannotSendBelowMinimumValueError": "A minimum of 1 ADA is required", "api.errors.GenericApiError": "An error occurred. Please retry.", "api.errors.IncorrectPasswordError": "Incorrect password. Please retype.", - "api.errors.NotEnoughMoneyToSendError": "Not enough balance.", + "api.errors.NotEnoughMoneyToSendError": "Not enough balance", "api.errors.PromiseNotCalledYetError": "Result accessed before execution finished.", "api.errors.ReportRequestError": "There was a problem sending the support request.", "api.errors.WalletAlreadyImportedError": "The wallet you are trying to import already exists.", @@ -226,6 +226,9 @@ "profile.analytics.accept": "Accept", "profile.analytics.allow": "Allow Yoroi analytics", "profile.analytics.learnMore": "Learn more about user insights", + "profile.analytics.seePrivacyNotice": "See Privacy Notice", + "profile.analytics.rejectionImpact": "Opting out won’t impact your experience", + "profile.analytics.collectedData": "Collected data includes: visited Yoroi extension pages, browser version, selected language, time of analytical events", "profile.analytics.line1": "Anonymous analytics data", "profile.analytics.line2": "You can always opt-out via Settings", "profile.analytics.line3": "We can not access private keys", @@ -308,6 +311,8 @@ "settings.noexternal.dialog.content": "Your memos are stored locally. They will not automatically sync with other Yoroi instances and will be lost if you delete Yoroi", "settings.noexternal.dialog.title": "No external storage", "settings.revamp.unitOfAccount.note": "Please note, that the coin price is approximate and may not match the price of any given trading platform. Any transactions based on this price approximates are done at your own risk", + "settings.support.paperWallet.title": "Paper Wallet", + "settings.support.paperWallet.button": "Transfer from Paper Wallet", "settings.support.faq.blogLinkUrl": "https://emurgo.io/en/blog/yoroi-custom-themes", "settings.support.faq.blogLinkWrapper": "blog post", "settings.support.faq.content": "If you are experiencing issues, please see the {faqLink} for guidance on known issues.", @@ -609,7 +614,7 @@ "wallet.hw.ledger.common.error.104": "Ledger device timeout, please retry.", "wallet.hw.ledger.common.error.105": "Network error. Please check your internet connection.", "wallet.hw.ledger.error.deviceStatus": "Invalid or oversized data for Ledger.", - "wallet.hw.ledger.error.deviceVersionNoDataSigning": "CIP-8 message signing not supported by your Ledger app version", + "wallet.hw.ledger.error.deviceVersionNoDataSigningSpecific": "CIP-8 message signing is only supported by Cardano app version 7.1.0 or above.", "wallet.hw.ledger.data.sign.unsupported.error": "The Ledger Cardano app does not support data signing at this memoment", "wallet.hw.trezor.data.sign.unsupported.error": "Trezor does not support data signing at this memoment", "wallet.hw.tx.hash.error": "The transaction hash computed by Yoroi extension and that by the device mismatch.", @@ -675,7 +680,7 @@ "wallet.receive.page.generateNewAddressButtonLabel": "Generate new address", "wallet.receive.page.generateURLLabel": "Generate URL", "wallet.receive.page.generatedAddressesSectionTitle": "Generated addresses", - "wallet.receive.page.internal.learnMore": "https://emurgo.io/en/blog/understanding-unspent-transaction-outputs-in-cardano", + "wallet.receive.page.internal.learnMore": "https://www.emurgo.io/press-news/yoroi-wallet-a-guide-to-the-receive-menu/", "wallet.receive.page.internalWarning1": "Internal addresses (or \"change\" addresses) maintain your privacy by obscuring which addresses belong to you on the blockchain.", "wallet.receive.page.internalWarning2": "addresses are shown here for personal auditing purposes and should never be used.", "wallet.receive.page.label": "Label", @@ -774,7 +779,8 @@ "wallet.send.form.dialog.maxNumberAllowed": "{number} Assets is maximum number allowed to be send in one transaction", "wallet.send.form.dialog.minAda": "Min-ADA: {minAda}", "wallet.send.form.dialog.nNft": "NFT ({number})", - "wallet.send.form.dialog.nToken": "Token ({number})", + "wallet.send.form.dialog.nToken": "Tokens ({number})", + "wallet.send.form.dialog.title": "Tokens", "wallet.send.form.dialog.noNFTsFound": "No NFTs found", "wallet.send.form.dialog.noNFTsYet": "There are no NFTs in your wallet yet", "wallet.send.form.dialog.noTokensFound": "No tokens found", @@ -821,6 +827,7 @@ "wallet.send.trezor.confirmationDialog.info.line.2": "A new tab will appear. Please follow the instructions in the new tab.", "wallet.send.trezor.confirmationDialog.submit": "Send using Trezor", "wallet.send.trezor.error.101": "Signing cancelled on Trezor device. Please retry", + "wallet.send.trezor.error.conway.firmware": "Conway features not supported by your Trezor firmware version. Please upgrade to 2.8.1 or above.", "wallet.send.trezor.error.noWitness": "Could not sign the transaction. Please ensure the passphrase you entered is the passhprase used to create this wallet.", "wallet.settings.blockchain.explorer.title": "Explorer settings", "wallet.settings.changePassword.dialog.currentPasswordFieldPlaceholder": "Type current password", @@ -1080,7 +1087,7 @@ "governance.noConfidenceInfo": "You are expressing a lack of trust for all proposals now and in the future.", "governance.learnMore": "Learn more About Governance", "governance.becomeADrep": "Want to became a Drep?", - "governance.drepId": "Drep ID (Fingerprint):", + "governance.drepId": "Drep ID (CIP 129):", "governance.statusSelected": "You have selected {status} as your governance status. You can change it at any time by clicking in the card bellow", "governance.statusPending": "You have chosen your governance status, this process may take a while.", "governance.registerGovernance": "Register in Governance", @@ -1119,7 +1126,7 @@ "portfolio.button.liquidityPool": "Liquidity pool", "portfolio.button.openOrders": "Open orders", "portfolio.button.lendAndBorrow": "Lend & Borrow", - "portfolio.tokenInfo.balance": "balance", + "portfolio.tokenInfo.balance": "Balance", "portfolio.tokenInfo.marketPrice": "Market price", "portfolio.tokenInfo.menuLabel.overview": "Overview", "portfolio.tokenInfo.menuLabel.performance": "Performance", diff --git a/packages/yoroi-extension/app/i18n/locales/hu-HU.json b/packages/yoroi-extension/app/i18n/locales/hu-HU.json index 235a06f275..163f6e5448 100644 --- a/packages/yoroi-extension/app/i18n/locales/hu-HU.json +++ b/packages/yoroi-extension/app/i18n/locales/hu-HU.json @@ -3,7 +3,7 @@ "api.errors.CannotSendBelowMinimumValueError": "A minimum of 1 ADA is required", "api.errors.GenericApiError": "An error occurred. Please retry.", "api.errors.IncorrectPasswordError": "Incorrect password. Please retype.", - "api.errors.NotEnoughMoneyToSendError": "Not enough balance.", + "api.errors.NotEnoughMoneyToSendError": "Not enough balance", "api.errors.PromiseNotCalledYetError": "Result accessed before execution finished.", "api.errors.ReportRequestError": "Probléma lépett fel az segítségkérés küldése közben.", "api.errors.WalletAlreadyImportedError": "A tárca importálása sikertelen, mert már létezik.", @@ -226,6 +226,9 @@ "profile.analytics.accept": "Accept", "profile.analytics.allow": "Allow Yoroi analytics", "profile.analytics.learnMore": "Learn more about user insights", + "profile.analytics.seePrivacyNotice": "See Privacy Notice", + "profile.analytics.rejectionImpact": "Opting out won’t impact your experience", + "profile.analytics.collectedData": "Collected data includes: visited Yoroi extension pages, browser version, selected language, time of analytical events", "profile.analytics.line1": "Anonymous analytics data", "profile.analytics.line2": "You can always opt-out via Settings", "profile.analytics.line3": "We can not access private keys", @@ -308,6 +311,8 @@ "settings.noexternal.dialog.content": "Your memos are stored locally. They will not automatically sync with other Yoroi instances and will be lost if you delete Yoroi", "settings.noexternal.dialog.title": "No external storage", "settings.revamp.unitOfAccount.note": "Please note, that the coin price is approximate and may not match the price of any given trading platform. Any transactions based on this price approximates are done at your own risk", + "settings.support.paperWallet.title": "Paper Wallet", + "settings.support.paperWallet.button": "Transfer from Paper Wallet", "settings.support.faq.blogLinkUrl": "https://emurgo.io/en/blog/yoroi-custom-themes", "settings.support.faq.blogLinkWrapper": "blog post", "settings.support.faq.content": "If you are experiencing issues, please see the {faqLink} for guidance on known issues.", @@ -609,7 +614,7 @@ "wallet.hw.ledger.common.error.104": "Ledger device timeout, please retry.", "wallet.hw.ledger.common.error.105": "Network error. Please check your internet connection.", "wallet.hw.ledger.error.deviceStatus": "Invalid or oversized data for Ledger.", - "wallet.hw.ledger.error.deviceVersionNoDataSigning": "CIP-8 message signing not supported by your Ledger app version", + "wallet.hw.ledger.error.deviceVersionNoDataSigningSpecific": "CIP-8 message signing is only supported by Cardano app version 7.1.0 or above.", "wallet.hw.ledger.data.sign.unsupported.error": "The Ledger Cardano app does not support data signing at this memoment", "wallet.hw.trezor.data.sign.unsupported.error": "Trezor does not support data signing at this memoment", "wallet.hw.tx.hash.error": "The transaction hash computed by Yoroi extension and that by the device mismatch.", @@ -675,7 +680,7 @@ "wallet.receive.page.generateNewAddressButtonLabel": "Generate new address", "wallet.receive.page.generateURLLabel": "Generate URL", "wallet.receive.page.generatedAddressesSectionTitle": "Generated addresses", - "wallet.receive.page.internal.learnMore": "https://emurgo.io/en/blog/understanding-unspent-transaction-outputs-in-cardano", + "wallet.receive.page.internal.learnMore": "https://www.emurgo.io/press-news/yoroi-wallet-a-guide-to-the-receive-menu/", "wallet.receive.page.internalWarning1": "Internal addresses (or \"change\" addresses) maintain your privacy by obscuring which addresses belong to you on the blockchain.", "wallet.receive.page.internalWarning2": "addresses are shown here for personal auditing purposes and should never be used.", "wallet.receive.page.label": "Label", @@ -774,7 +779,8 @@ "wallet.send.form.dialog.maxNumberAllowed": "{number} Assets is maximum number allowed to be send in one transaction", "wallet.send.form.dialog.minAda": "Min-ADA: {minAda}", "wallet.send.form.dialog.nNft": "NFT ({number})", - "wallet.send.form.dialog.nToken": "Token ({number})", + "wallet.send.form.dialog.nToken": "Tokens ({number})", + "wallet.send.form.dialog.title": "Tokens", "wallet.send.form.dialog.noNFTsFound": "No NFTs found", "wallet.send.form.dialog.noNFTsYet": "There are no NFTs in your wallet yet", "wallet.send.form.dialog.noTokensFound": "No tokens found", @@ -821,6 +827,7 @@ "wallet.send.trezor.confirmationDialog.info.line.2": "A new tab will appear. Please follow the instructions in the new tab.", "wallet.send.trezor.confirmationDialog.submit": "Send using Trezor", "wallet.send.trezor.error.101": "Signing cancelled on Trezor device. Please retry", + "wallet.send.trezor.error.conway.firmware": "Conway features not supported by your Trezor firmware version. Please upgrade to 2.8.1 or above.", "wallet.send.trezor.error.noWitness": "Could not sign the transaction. Please ensure the passphrase you entered is the passhprase used to create this wallet.", "wallet.settings.blockchain.explorer.title": "Explorer settings", "wallet.settings.changePassword.dialog.currentPasswordFieldPlaceholder": "Type current password", @@ -1080,7 +1087,7 @@ "governance.noConfidenceInfo": "You are expressing a lack of trust for all proposals now and in the future.", "governance.learnMore": "Learn more About Governance", "governance.becomeADrep": "Want to became a Drep?", - "governance.drepId": "Drep ID (Fingerprint):", + "governance.drepId": "Drep ID (CIP 129):", "governance.statusSelected": "You have selected {status} as your governance status. You can change it at any time by clicking in the card bellow", "governance.statusPending": "You have chosen your governance status, this process may take a while.", "governance.registerGovernance": "Register in Governance", @@ -1119,7 +1126,7 @@ "portfolio.button.liquidityPool": "Liquidity pool", "portfolio.button.openOrders": "Open orders", "portfolio.button.lendAndBorrow": "Lend & Borrow", - "portfolio.tokenInfo.balance": "balance", + "portfolio.tokenInfo.balance": "Balance", "portfolio.tokenInfo.marketPrice": "Market price", "portfolio.tokenInfo.menuLabel.overview": "Overview", "portfolio.tokenInfo.menuLabel.performance": "Performance", @@ -1172,6 +1179,6 @@ "portfolio.orderTable.header.assetPrice": "Asset price", "portfolio.orderTable.header.assetAmount": "Asset amount", "portfolio.orderTable.header.transactionId": "Transaction ID", - "portfolio.welcomeBanner.title": "Welcome to Yoroi", - "portfolio.welcomeBanner.description": "With new features and upgraded performance, transactions can be done faster and more securely than ever before." + "portfolio.welcomeBanner.title": "Start your crypto journey", + "portfolio.welcomeBanner.description": "Get started with Cardanos native currency, ADA. Its your key to unlocking a world of possibilities." } diff --git a/packages/yoroi-extension/app/i18n/locales/vi-VN.json b/packages/yoroi-extension/app/i18n/locales/vi-VN.json index 996e6b31af..bc33f8700e 100644 --- a/packages/yoroi-extension/app/i18n/locales/vi-VN.json +++ b/packages/yoroi-extension/app/i18n/locales/vi-VN.json @@ -3,7 +3,7 @@ "api.errors.CannotSendBelowMinimumValueError": "Cần tối thiểu 1 ADA", "api.errors.GenericApiError": "Đã xảy ra lỗi. Làm ơn hãy thử lại.", "api.errors.IncorrectPasswordError": "Incorrect password. Please retype.", - "api.errors.NotEnoughMoneyToSendError": "Not enough balance.", + "api.errors.NotEnoughMoneyToSendError": "Not enough balance", "api.errors.PromiseNotCalledYetError": "Kết quả được truy cập trước khi thực hiện xong.", "api.errors.ReportRequestError": "Đã xảy ra sự cố, hãy gửi yêu cầu hỗ trợ.", "api.errors.WalletAlreadyImportedError": "Ví bạn đang cố khôi phục đã tồn tại.", @@ -226,6 +226,9 @@ "profile.analytics.accept": "Accept", "profile.analytics.allow": "Allow Yoroi analytics", "profile.analytics.learnMore": "Learn more about user insights", + "profile.analytics.seePrivacyNotice": "See Privacy Notice", + "profile.analytics.rejectionImpact": "Opting out won’t impact your experience", + "profile.analytics.collectedData": "Collected data includes: visited Yoroi extension pages, browser version, selected language, time of analytical events", "profile.analytics.line1": "Anonymous analytics data", "profile.analytics.line2": "You can always opt-out via Settings", "profile.analytics.line3": "We can not access private keys", @@ -308,6 +311,8 @@ "settings.noexternal.dialog.content": "Bản ghi nhớ của bạn được lưu trữ cục bộ. Chúng sẽ không tự động đồng bộ với các phiên bản Yoroi khác và sẽ bị mất nếu bạn xóa Yoroi", "settings.noexternal.dialog.title": "Không có bộ nhớ ngoài", "settings.revamp.unitOfAccount.note": "Please note, that the coin price is approximate and may not match the price of any given trading platform. Any transactions based on this price approximates are done at your own risk", + "settings.support.paperWallet.title": "Paper Wallet", + "settings.support.paperWallet.button": "Transfer from Paper Wallet", "settings.support.faq.blogLinkUrl": "https://emurgo.io/en/blog/yoroi-custom-themes", "settings.support.faq.blogLinkWrapper": "bài đăng", "settings.support.faq.content": "Nếu bạn đang gặp sự cố, vui lòng xem {faqLink} để được hướng dẫn về các sự cố đã biết.", @@ -609,7 +614,7 @@ "wallet.hw.ledger.common.error.104": "Hết thời gian chờ của thiết bị sổ cái, vui lòng thử lại.", "wallet.hw.ledger.common.error.105": "Lỗi mạng. Xin vui lòng kiểm tra kết nối Internet của bạn.", "wallet.hw.ledger.error.deviceStatus": "Invalid or oversized data for Ledger.", - "wallet.hw.ledger.error.deviceVersionNoDataSigning": "CIP-8 message signing not supported by your Ledger app version", + "wallet.hw.ledger.error.deviceVersionNoDataSigningSpecific": "CIP-8 message signing is only supported by Cardano app version 7.1.0 or above.", "wallet.hw.ledger.data.sign.unsupported.error": "Ví Trezor không hỗ trợ ký dữ liệu tại thời điểm này", "wallet.hw.trezor.data.sign.unsupported.error": "Ví Trezor không hỗ trợ ký dữ liệu tại thời điểm này", "wallet.hw.tx.hash.error": "Giá trị hàm băm giao dịch được tính toán bởi tiện ích mở rộng Yoroi và từ thiết bị không khớp.", @@ -675,7 +680,7 @@ "wallet.receive.page.generateNewAddressButtonLabel": "Tạo địa chỉ mới", "wallet.receive.page.generateURLLabel": "Tạo URL", "wallet.receive.page.generatedAddressesSectionTitle": "Đã tạo các địa chỉ", - "wallet.receive.page.internal.learnMore": "https://emurgo.io/en/blog/understanding-unspent-transaction-outputs-in-cardano", + "wallet.receive.page.internal.learnMore": "https://www.emurgo.io/press-news/yoroi-wallet-a-guide-to-the-receive-menu/", "wallet.receive.page.internalWarning1": "Internal addresses (or \"change\" addresses) maintain your privacy by obscuring which addresses belong to you on the blockchain.", "wallet.receive.page.internalWarning2": "addresses are shown here for personal auditing purposes and should never be used.", "wallet.receive.page.label": "Nhãn", @@ -774,7 +779,8 @@ "wallet.send.form.dialog.maxNumberAllowed": "{number} tài sản là số lượng tối đa được phép gửi trong một giao dịch", "wallet.send.form.dialog.minAda": "Min-ADA: {minAda}", "wallet.send.form.dialog.nNft": "NFT ({number})", - "wallet.send.form.dialog.nToken": "Token ({number})", + "wallet.send.form.dialog.nToken": "Tokens ({number})", + "wallet.send.form.dialog.title": "Tokens", "wallet.send.form.dialog.noNFTsFound": "Không tìm thấy NFT", "wallet.send.form.dialog.noNFTsYet": "Chưa có NFT nào trong ví của bạn", "wallet.send.form.dialog.noTokensFound": "Không có token nào", @@ -821,6 +827,7 @@ "wallet.send.trezor.confirmationDialog.info.line.2": "Một tab mới sẽ xuất hiện. Vui lòng làm theo hướng dẫn trong tab mới.", "wallet.send.trezor.confirmationDialog.submit": "Gửi bằng Trezor", "wallet.send.trezor.error.101": "Việc ký đã bị hủy trên thiết bị Trezor. Làm ơn hãy thử lại", + "wallet.send.trezor.error.conway.firmware": "Conway features not supported by your Trezor firmware version. Please upgrade to 2.8.1 or above.", "wallet.send.trezor.error.noWitness": "Không thể ký giao dịch. Vui lòng đảm bảo cụm mật khẩu bạn đã nhập là cụm mật khẩu được sử dụng để tạo ví này.", "wallet.settings.blockchain.explorer.title": "Explorer settings", "wallet.settings.changePassword.dialog.currentPasswordFieldPlaceholder": "Type current password", @@ -1080,7 +1087,7 @@ "governance.noConfidenceInfo": "You are expressing a lack of trust for all proposals now and in the future.", "governance.learnMore": "Learn more About Governance", "governance.becomeADrep": "Want to became a Drep?", - "governance.drepId": "Drep ID (Fingerprint):", + "governance.drepId": "Drep ID (CIP 129):", "governance.statusSelected": "You have selected {status} as your governance status. You can change it at any time by clicking in the card bellow", "governance.statusPending": "You have chosen your governance status, this process may take a while.", "governance.registerGovernance": "Register in Governance", @@ -1119,7 +1126,7 @@ "portfolio.button.liquidityPool": "Liquidity pool", "portfolio.button.openOrders": "Open orders", "portfolio.button.lendAndBorrow": "Lend & Borrow", - "portfolio.tokenInfo.balance": "balance", + "portfolio.tokenInfo.balance": "Balance", "portfolio.tokenInfo.marketPrice": "Market price", "portfolio.tokenInfo.menuLabel.overview": "Overview", "portfolio.tokenInfo.menuLabel.performance": "Performance", diff --git a/packages/yoroi-extension/app/routes-config.js b/packages/yoroi-extension/app/routes-config.js index 8f35cd6939..b03d5abeca 100644 --- a/packages/yoroi-extension/app/routes-config.js +++ b/packages/yoroi-extension/app/routes-config.js @@ -42,6 +42,7 @@ export const ROUTES = { SUPPORT: '/settings/support', LEVEL_OF_COMPLEXITY: '/settings/level-of-complexity', ANALYTICS: '/settings/analytics', + PAPER_WALLET: '/settings/paper-wallet', }, TRANSFER: { ROOT: '/transfer', diff --git a/packages/yoroi-extension/app/stores/ada/AdaDelegationTransactionStore.js b/packages/yoroi-extension/app/stores/ada/AdaDelegationTransactionStore.js index f29a173354..b64cf9c457 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaDelegationTransactionStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaDelegationTransactionStore.js @@ -1,6 +1,6 @@ // @flow -import { observable, action, reaction } from 'mobx'; +import { observable, action, reaction, runInAction } from 'mobx'; import BigNumber from 'bignumber.js'; import Store from '../base/Store'; import LocalizedRequest from '../lib/LocalizedRequest'; @@ -27,6 +27,8 @@ export default class AdaDelegationTransactionStore extends Store mixed = reaction( () => [ @@ -146,45 +148,51 @@ export default class AdaDelegationTransactionStore extends Store { + this.error = error; + }); + throw error; } - await this.stores.substores.ada.wallets.adaSendAndRefresh({ - broadcastRequest: { - normal: { - wallet: request.wallet, - password: request.password, - signRequest: result.signTxRequest, - }, - }, - refreshWallet, - }); if (request.dialog) this.actions.dialogs.open.trigger({ dialog: request.dialog }); }; diff --git a/packages/yoroi-extension/app/stores/ada/AdaStateFetchStore.js b/packages/yoroi-extension/app/stores/ada/AdaStateFetchStore.js index 1b7493ca6c..a7b407e77e 100644 --- a/packages/yoroi-extension/app/stores/ada/AdaStateFetchStore.js +++ b/packages/yoroi-extension/app/stores/ada/AdaStateFetchStore.js @@ -25,10 +25,10 @@ export default class AdaStateFetchStore< () => environment.getVersion(), () => this.stores.profile.currentLocale, () => { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { return 'firefox'; } - if (environment.userAgentInfo.isChrome()) { + if (environment.isChrome()) { return 'chrome'; } return '-'; diff --git a/packages/yoroi-extension/app/stores/lib/TrezorWrapper.js b/packages/yoroi-extension/app/stores/lib/TrezorWrapper.js index 7e158467a9..ca1f4be7f2 100644 --- a/packages/yoroi-extension/app/stores/lib/TrezorWrapper.js +++ b/packages/yoroi-extension/app/stores/lib/TrezorWrapper.js @@ -29,7 +29,7 @@ export function getTrezorManifest(): Manifest { const trezorManifest: Manifest = { email: manifest.EMAIL, appUrl: (() => { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { // Set appUrl for `moz-extension:` protocol using browser (like Firefox) return manifest.appURL.FIREFOX; } diff --git a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js index 23125e88d5..9fdc42f127 100644 --- a/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js +++ b/packages/yoroi-extension/app/stores/stateless/sidebarCategories.js @@ -17,7 +17,6 @@ import environment from '../../environment'; import globalMessages, { connectorMessages } from '../../i18n/global-messages'; import { ROUTES } from '../../routes-config'; import type { WalletState } from '../../../chrome/extension/background/types'; -import { ReactComponent as assetsIcon } from '../../assets/images/sidebar/revamp/assets.inline.svg'; export type SidebarCategory = {| +className: string, @@ -131,13 +130,6 @@ export const allCategoriesRevamp: Array = [ label: globalMessages.sidebarSwap, isVisible: ({ selected }) => !selected?.isTestnet, }, - { - className: 'assets', - route: ROUTES.ASSETS.ROOT, - icon: assetsIcon, - label: globalMessages.sidebarAssets, - isVisible: () => environment.isProduction() || environment.isDev(), - }, { className: 'portfolio', route: ROUTES.PORTFOLIO.ROOT, @@ -172,7 +164,7 @@ export const allCategoriesRevamp: Array = [ route: '/governance', icon: governanceIcon, label: globalMessages.sidebarGovernance, - isVisible: ({ selected }) => selected != null && selected.type !== 'trezor', + isVisible: ({ selected }) => selected != null, }, { className: 'settings', diff --git a/packages/yoroi-extension/app/stores/toplevel/ProfileStore.js b/packages/yoroi-extension/app/stores/toplevel/ProfileStore.js index 6d431d8368..dbd9140d6f 100644 --- a/packages/yoroi-extension/app/stores/toplevel/ProfileStore.js +++ b/packages/yoroi-extension/app/stores/toplevel/ProfileStore.js @@ -22,9 +22,22 @@ export default class ProfileStore extends BaseProfileStore boolean | Promise, action: void => Promise |} = { + isDone: () => this.isAnalyticsOpted, + action: async () => { + const route = ROUTES.PROFILE.OPT_FOR_ANALYTICS; + if (this.stores.app.currentRoute === route) { + return; + } + this.actions.router.goToRoute.trigger({ route }); + }, + }; + /** Linear list of steps that need to be completed before app start */ @observable SETUP_STEPS: Array<{| isDone: void => boolean | Promise, action: void => Promise |}> = [ + // Firefox policy requires this to be the first + ...(environment.isFirefox() ? [this._analyticsStep] : []), { isDone: () => this.isCurrentLocaleSet, action: async () => { @@ -47,16 +60,7 @@ export default class ProfileStore extends BaseProfileStore this.isAnalyticsOpted, - action: async () => { - const route = ROUTES.PROFILE.OPT_FOR_ANALYTICS; - if (this.stores.app.currentRoute === route) { - return; - } - this.actions.router.goToRoute.trigger({ route }); - }, - }, + ...(environment.isFirefox() ? [] : [this._analyticsStep]), { isDone: () => this.isComplexityLevelSelected, action: async () => { @@ -78,7 +82,7 @@ export default class ProfileStore extends BaseProfileStore !environment.userAgentInfo.canRegisterProtocol() || this.isUriSchemeAccepted, + isDone: () => !environment.canRegisterProtocol() || this.isUriSchemeAccepted, action: async () => { const route = ROUTES.PROFILE.URI_PROMPT; if (this.stores.app.currentRoute === route) { @@ -112,7 +116,7 @@ export default class ProfileStore extends BaseProfileStore = new Map(); + setup(): void { + this.loadProtocolParametersRequest.execute(); + } + async loadProtocolParameters(): Promise { - for (const key of Object.keys(networks)) { + for (const key of listRelevantNetworkNamesForEnvironment()) { const networkId = networks[key].NetworkId; + if (networkId === networks.CardanoSanchoTestnet.NetworkId) continue; const protocolParameters = await getProtocolParameters({ networkId }); this.cache.set(networkId, protocolParameters); } diff --git a/packages/yoroi-extension/app/stores/toplevel/StateFetchStore.js b/packages/yoroi-extension/app/stores/toplevel/StateFetchStore.js index 4069caec18..3e0b46b8eb 100644 --- a/packages/yoroi-extension/app/stores/toplevel/StateFetchStore.js +++ b/packages/yoroi-extension/app/stores/toplevel/StateFetchStore.js @@ -26,10 +26,10 @@ export default class StateFetchStore< () => environment.getVersion(), () => this.stores.profile.currentLocale, () => { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { return 'firefox'; } - if (environment.userAgentInfo.isChrome()) { + if (environment.isChrome()) { return 'chrome'; } return '-'; diff --git a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js index 1bca0fbb65..f9f987564f 100644 --- a/packages/yoroi-extension/app/stores/toplevel/WalletStore.js +++ b/packages/yoroi-extension/app/stores/toplevel/WalletStore.js @@ -288,13 +288,12 @@ export default class WalletStore extends Store { ); this.selectedIndex = walletIndex; this.selectedWalletName = this.wallets[walletIndex].name; - // Cache select wallet this.api.localStorage.setSelectedWalletId(publicDeriverId); subscribe(publicDeriverId); }; - getLastSelectedWallet: void => ?WalletState = () => { - const walletId = this.api.localStorage.getSelectedWalletId(); + getLastSelectedWallet: void => Promise = async () => { + const walletId: ?number = await this.api.localStorage.getSelectedWalletId(); return this.wallets.find(wallet => wallet.publicDeriverId === walletId); }; diff --git a/packages/yoroi-extension/app/styles/themes/base-palettes/dark-palette.js b/packages/yoroi-extension/app/styles/themes/base-palettes/dark-palette.js index e4d690cc07..48cace5cf1 100644 --- a/packages/yoroi-extension/app/styles/themes/base-palettes/dark-palette.js +++ b/packages/yoroi-extension/app/styles/themes/base-palettes/dark-palette.js @@ -57,4 +57,5 @@ export const darkPalette = { bg_gradient_3: 'linear-gradient(23deg, #2E4BB0 15.04%, #2B3E7D 84.96%)', special_web_overlay: 'rgba(31, 35, 46, 0.80)', special_web_bg_sidebar: 'rgba(0, 0, 0, 0.16)', + light_shadow_dropdown_menu: `0px 4px 20px 0px #0000007A`, // dropdown shadow }; diff --git a/packages/yoroi-extension/app/styles/themes/base-palettes/light-palette.js b/packages/yoroi-extension/app/styles/themes/base-palettes/light-palette.js index 322e7087d1..fa1374a815 100644 --- a/packages/yoroi-extension/app/styles/themes/base-palettes/light-palette.js +++ b/packages/yoroi-extension/app/styles/themes/base-palettes/light-palette.js @@ -56,4 +56,5 @@ export const lightPalette = { bg_gradient_3: 'linear-gradient(30deg, #244ABF 0%, #4760FF 100%)', special_web_overlay: 'rgba(31, 35, 46, 0.80)', special_web_bg_sidebar: '#1F232ECC', + light_shadow_dropdown_menu: '0px 4px 10px 0px #181A1E29', }; diff --git a/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/dark-palette.js b/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/dark-palette.js index ba7dc0878f..d1eee0dd85 100644 --- a/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/dark-palette.js +++ b/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/dark-palette.js @@ -35,11 +35,11 @@ export const darkPalette = { black_static: '#000000', white_static: '#FFFFFF', - sys_magenta_700: '#FF6B92', - sys_magenta_600: '#FD3468', + sys_magenta_700: '#FFC0D0', + sys_magenta_600: '#FB9CB5', sys_magenta_500: '#FF7196', - sys_magenta_300: '#572835', - sys_magenta_100: '#2F171D', + sys_magenta_300: '#64303E', + sys_magenta_100: '#3B252A', sys_cyan_500: '#59B1F4', sys_cyan_100: '#112333', @@ -54,4 +54,5 @@ export const darkPalette = { 'linear-gradient(195.39deg, rgba(26, 227, 187, 0.26) 0.57%, rgba(75, 109, 222, 0.1) 41.65%, rgba(75, 109, 222, 0.16) 100%)', bg_gradient_2: 'linear-gradient(205.51deg, rgba(11, 153, 125, 0.49) -10.43%, rgba(8, 194, 157, 0.08) 100%)', bg_gradient_3: 'linear-gradient(30.09deg, #244ABF 0%, #4760FF 100%)', + light_shadow_dropdown_menu: `0px 4px 20px 0px #0000007A`, // dropdown shadow }; diff --git a/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/light-palette.js b/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/light-palette.js index a9627175ef..1903469dea 100644 --- a/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/light-palette.js +++ b/packages/yoroi-extension/app/styles/themes/revamp/base-palettes/light-palette.js @@ -53,4 +53,5 @@ export const lightPalette = { bg_gradient_1: 'linear-gradient(312.19deg, #C6F7ED 0%, #E4E8F7 100%)', bg_gradient_2: 'linear-gradient(180deg, #93F5E1 0%, #C6F7ED 100%)', bg_gradient_3: 'linear-gradient(30.09deg, #244ABF 0%, #4760FF 100%)', + light_shadow_dropdown_menu: '0px 4px 10px 0px #181A1E29', }; diff --git a/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/dark.js b/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/dark.js index 6dbb56a287..fec08ec73e 100644 --- a/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/dark.js +++ b/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/dark.js @@ -19,6 +19,8 @@ export const dark = { bg_color_max: darkPalette.gray_50, // bottom surface bg_color_min: darkPalette.gray_100, // upper surface + bg_color_contrast_min: darkPalette.gray_100, // dropdown selected\highlighted item + bg_color_contrast_high: darkPalette.gray_50 , // dropdown idle item el_primary_max: darkPalette.primary_700, // hover'nd pressed state, actianable elements el_primary_medium: darkPalette.primary_600, // actionable elements diff --git a/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/light.js b/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/light.js index 7f9e89ce81..6d9a8e4087 100644 --- a/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/light.js +++ b/packages/yoroi-extension/app/styles/themes/revamp/themed-palettes/light.js @@ -19,6 +19,8 @@ export const light = { bg_color_max: lightPalette.gray_min, // bottom surface bg_color_min: lightPalette.gray_100, // upper surface + bg_color_contrast_min: lightPalette.gray_100, // dropdown selected\highlighted surface + bg_color_contrast_high: lightPalette.gray_min , // dropdown idle item el_primary_max: lightPalette.primary_600, // hover'nd pressed state, actianable elements el_primary_medium: lightPalette.primary_500, // actionable elements diff --git a/packages/yoroi-extension/app/styles/themes/themed-palettes/dark.js b/packages/yoroi-extension/app/styles/themes/themed-palettes/dark.js index 20dda15ce0..c06fe9a46d 100644 --- a/packages/yoroi-extension/app/styles/themes/themed-palettes/dark.js +++ b/packages/yoroi-extension/app/styles/themes/themed-palettes/dark.js @@ -24,6 +24,8 @@ export const dark: DSColorPalette = { bg_color_max: darkPalette.gray_50, // bottom surface bg_color_min: darkPalette.gray_100, // upper surface + bg_color_contrast_min: darkPalette.gray_100, // dropdown selected\highlighted item + bg_color_contrast_high: darkPalette.gray_50 , // dropdown idle item el_primary_max: darkPalette.primary_700, // hover'nd pressed state, actianable elements el_primary_medium: darkPalette.primary_600, // actionable elements diff --git a/packages/yoroi-extension/app/styles/themes/themed-palettes/light.js b/packages/yoroi-extension/app/styles/themes/themed-palettes/light.js index 1a657d4470..622abfdc13 100644 --- a/packages/yoroi-extension/app/styles/themes/themed-palettes/light.js +++ b/packages/yoroi-extension/app/styles/themes/themed-palettes/light.js @@ -24,6 +24,8 @@ export const light: DSColorPalette = { bg_color_max: lightPalette.gray_min, // bottom surface bg_color_min: lightPalette.gray_100, // upper surface + bg_color_contrast_min: lightPalette.gray_100, // dropdown selected\highlighted surface + bg_color_contrast_high: lightPalette.gray_min , // dropdown idle item el_primary_max: lightPalette.primary_600, // hover'nd pressed state, actianable elements el_primary_medium: lightPalette.primary_500, // actionable elements diff --git a/packages/yoroi-extension/app/styles/themes/types.js b/packages/yoroi-extension/app/styles/themes/types.js index 438bebb6cb..25cface58e 100644 --- a/packages/yoroi-extension/app/styles/themes/types.js +++ b/packages/yoroi-extension/app/styles/themes/types.js @@ -61,6 +61,8 @@ export type DSColorPalette = {| text_info: string, bg_color_max: string, bg_color_min: string, + bg_color_contrast_min: string, + bg_color_contrast_high: string, el_primary_max: string, el_primary_medium: string, el_primary_min: string, @@ -75,4 +77,5 @@ export type DSColorPalette = {| web_sidebar_item_active_bg: string, mobile_overlay: string, mobile_bg_blur: string, + light_shadow_dropdown_menu: string, |}; diff --git a/packages/yoroi-extension/app/uri-protocols.js b/packages/yoroi-extension/app/uri-protocols.js index 22d52917e6..d04cf3c1e4 100644 --- a/packages/yoroi-extension/app/uri-protocols.js +++ b/packages/yoroi-extension/app/uri-protocols.js @@ -12,7 +12,7 @@ const cardanoURI = { }; const registerProtocols = () => { - if (!environment.userAgentInfo.canRegisterProtocol()) { + if (!environment.canRegisterProtocol()) { Logger.error(`uri-protocols:registerProtocols cannot use registerProtocolHandler on this page`); return; } diff --git a/packages/yoroi-extension/app/utils/userAgentInfo.js b/packages/yoroi-extension/app/utils/userAgentInfo.js index cfa0156b3b..c39dba82ba 100644 --- a/packages/yoroi-extension/app/utils/userAgentInfo.js +++ b/packages/yoroi-extension/app/utils/userAgentInfo.js @@ -5,57 +5,9 @@ import UAParser from 'ua-parser-js'; export class UserAgentInfo { // Refer: https://www.npmjs.com/package/ua-parser-js ua: { ... }; - - isChrome: void => boolean = () => { - /** - * This method returns true for all browser that uses `chrome-extension:` protocol, - *hence it will return true for browsers like Google Chrome, Brave - */ - if (location.protocol === 'chrome-extension:') { - return true; - } - // if an extension type that isn't Chrome-based, return false - if (this.isExtension()) { - return false; - } - - return !!window.chrome && - (!!window.chrome.webstore || !!window.chrome.runtime) && - !this.isFirefox(); - }; - isFirefox: void => boolean = () => { - if (location.protocol === 'moz-extension:') { - return true; - } - // if an extension type that isn't Firefox, return false - if (this.isExtension()) { - return false; - } - - // $FlowExpectedError[cannot-resolve-name] InstallTrigger is a global from the browser - return typeof InstallTrigger !== 'undefined'; - } - isExtension: void => boolean = () => { - return ( - location.protocol === 'chrome-extension:' || location.protocol === 'moz-extension:' - ); - } - constructor() { this.ua = (new UAParser()).getResult(); } - - canRegisterProtocol: (() => boolean) = () => { - // Moz-Extension specify the protocol in the manifest not at runtime - if (this.isExtension() && this.isFirefox()) { - return false; - } - // Can only register a protocol to a website if it's https - if (!this.isExtension() && window.location.protocol !== 'https:') { - return false; - } - return true; - } } export default (new UserAgentInfo(): UserAgentInfo); diff --git a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/index.js b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/index.js index f935d3711a..4b88c7b783 100644 --- a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/index.js +++ b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/index.js @@ -43,6 +43,7 @@ import { } from './connector'; import { GetProtocolParameters } from './protocolParameters'; import { subscribe } from '../../subscriptionManager'; +import { sanitizeForLog } from '../../../../../app/coreUtils'; const handlerMap = Object.freeze({ [GetHistoricalCoinPrices.typeTag]: GetHistoricalCoinPrices.handle, @@ -107,6 +108,7 @@ export function getHandler(typeTag: string): ?Handler { return async (request, send, sendResponse) => { try { const result = await handler(request.request); + console.debug(`BACKGROUND [${typeTag}] sending result: `, JSON.stringify(sanitizeForLog(result))); sendResponse(result); } catch (error) { sendResponse({ error: error.message }); diff --git a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/protocolParameters.js b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/protocolParameters.js index 93e4cdb8c0..109f64594b 100644 --- a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/protocolParameters.js +++ b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/protocolParameters.js @@ -206,7 +206,7 @@ class ProcolParameterApi { } export const GetProtocolParameters: HandlerType< - { networkId: number, ... }, + {| networkId: number |}, ProtocolParameters > = Object.freeze({ typeTag: 'get-protocol-parameters', diff --git a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/wallet.js b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/wallet.js index 3bdce74838..a7053b9f17 100644 --- a/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/wallet.js +++ b/packages/yoroi-extension/chrome/extension/background/handlers/yoroi/wallet.js @@ -65,6 +65,7 @@ export const CreateWallet: HandlerType = Object.freeze({ typeTag: 'remove-all-transactions', @@ -275,7 +276,7 @@ export const RemoveAllTransactions: HandlerType< }); export const PopAddress: HandlerType< - { publicDeriverId: number, ... }, + {| publicDeriverId: number |}, void > = Object.freeze({ typeTag: 'pop-address', @@ -354,6 +355,7 @@ export const RefreshTransactions: HandlerType< // initial transaction list loading txs = await adaApi.refreshTransactions(refreshTxRequest); } - return txs; + // $FlowIgnore + return JSON.stringify(txs); }, }); diff --git a/packages/yoroi-extension/chrome/extension/background/index.js b/packages/yoroi-extension/chrome/extension/background/index.js index 9df389ca06..feadd12e9f 100644 --- a/packages/yoroi-extension/chrome/extension/background/index.js +++ b/packages/yoroi-extension/chrome/extension/background/index.js @@ -9,11 +9,13 @@ import { environment } from '../../../app/environment'; import axios from 'axios'; import fetchAdapter from '@vespaiach/axios-fetch-adapter'; import { sanitizeForLog } from '../../../app/coreUtils'; +import LocalStorageApi from '../../../app/api/localStorage/index'; axios.defaults.adapter = fetchAdapter; /*:: declare var chrome; +declare var browser; */ const onYoroiIconClicked = () => { @@ -36,7 +38,11 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { } const handler = getHandler(message.type); if (handler) { - handler(message, sender, sendResponse); + const deserializedMessage = { + type: message.type, + request: JSON.parse(message.request), + }; + handler(deserializedMessage, sender, sendResponse); // Returning `true` is required by Firefox, see: // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage return true; @@ -47,3 +53,12 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { init().catch(console.error); startMonitorServerStatus(); startPoll(); + +if (environment.isFirefox()) { + browser.runtime.onInstalled.addListener(async () => { + const analyticsFlag = await new LocalStorageApi().loadIsAnalyticsAllowed(); + if (analyticsFlag == null) { + onYoroiIconClicked(); + } + }); +} diff --git a/packages/yoroi-extension/chrome/extension/background/subscriptionManager.js b/packages/yoroi-extension/chrome/extension/background/subscriptionManager.js index a04d09943b..bd69ca4799 100644 --- a/packages/yoroi-extension/chrome/extension/background/subscriptionManager.js +++ b/packages/yoroi-extension/chrome/extension/background/subscriptionManager.js @@ -68,6 +68,6 @@ declare var chrome; */ export function emitUpdateToSubscriptions(data: Object): void { for (const { tabId } of getSubscriptions()) { - chrome.tabs.sendMessage(tabId, data); + chrome.tabs.sendMessage(tabId, { type: 'yoroi-emit-update', data: JSON.stringify(data) }); } } diff --git a/packages/yoroi-extension/chrome/extension/background/utils.js b/packages/yoroi-extension/chrome/extension/background/utils.js index f2d45b5186..2e93c2f637 100644 --- a/packages/yoroi-extension/chrome/extension/background/utils.js +++ b/packages/yoroi-extension/chrome/extension/background/utils.js @@ -17,10 +17,10 @@ async function createFetcher( () => environment.getVersion(), () => locale, () => { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { return 'firefox'; } - if (environment.userAgentInfo.isChrome()) { + if (environment.isChrome()) { return 'chrome'; } return '-'; @@ -40,10 +40,10 @@ export async function getCommonStateFetcher(): Promise { () => environment.getVersion(), () => locale, () => { - if (environment.userAgentInfo.isFirefox()) { + if (environment.isFirefox()) { return 'firefox'; } - if (environment.userAgentInfo.isChrome()) { + if (environment.isChrome()) { return 'chrome'; } return '-'; diff --git a/packages/yoroi-extension/chrome/manifest-mv2.template.js b/packages/yoroi-extension/chrome/manifest-mv2.template.js index 0790a7ed93..b7ed82c466 100644 --- a/packages/yoroi-extension/chrome/manifest-mv2.template.js +++ b/packages/yoroi-extension/chrome/manifest-mv2.template.js @@ -73,7 +73,7 @@ export default ({ ], content_scripts: [ { - matches: ['*://connect.trezor.io/*/popup.html'], + matches: ['*://connect.trezor.io/*/popup.html*'], js: ['js/trezor-content-script.js'], }, ], diff --git a/packages/yoroi-extension/chrome/manifest.template.js b/packages/yoroi-extension/chrome/manifest.template.js index c9aff95ea4..2cd8114fae 100644 --- a/packages/yoroi-extension/chrome/manifest.template.js +++ b/packages/yoroi-extension/chrome/manifest.template.js @@ -75,7 +75,7 @@ export default ({ ], content_scripts: [ { - matches: ['*://connect.trezor.io/*/popup.html'], + matches: ['*://connect.trezor.io/*/popup.html*'], js: ['js/trezor-content-script.js'], }, ], diff --git a/packages/yoroi-extension/package-lock.json b/packages/yoroi-extension/package-lock.json index 0b1cd19393..192eae6cac 100644 --- a/packages/yoroi-extension/package-lock.json +++ b/packages/yoroi-extension/package-lock.json @@ -1,12 +1,12 @@ { "name": "yoroi", - "version": "5.4.311", + "version": "5.4.500", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "yoroi", - "version": "5.4.311", + "version": "5.4.500", "license": "MIT", "dependencies": { "@amplitude/analytics-browser": "^2.1.3", @@ -19,7 +19,7 @@ "@emurgo/cip14-js": "2.0.0", "@emurgo/cip4-js": "1.0.5", "@emurgo/cross-csl-browser": "5.1.2", - "@emurgo/yoroi-eutxo-txs": "0.0.2-alpha.8", + "@emurgo/yoroi-eutxo-txs": "0.0.3", "@emurgo/yoroi-lib": "1.2.3", "@ledgerhq/hw-transport-u2f": "5.36.0-deprecated", "@ledgerhq/hw-transport-webauthn": "5.36.0-deprecated", @@ -88,7 +88,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#692d366d4934382b5049e29683974e38156ccfc6", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37", @@ -2521,94 +2521,11 @@ "@emurgo/cross-csl-core": "5.1.2" } }, - "node_modules/@emurgo/cross-csl-browser/node_modules/@emurgo/cross-csl-core": { + "node_modules/@emurgo/cross-csl-core": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-5.1.2.tgz", "integrity": "sha512-+zR8DR/UEql/S5BBnA6sbEGKVRow7NHI896K8UDt5+W3J3cZVAZEsbm9faaH+DehpqvensVNHwxooxk30wEOpg==" }, - "node_modules/@emurgo/cross-csl-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-4.4.0.tgz", - "integrity": "sha512-R12cAHmkjeLb7g0+Og5zoi8is7jh5uONICaKLCvebqV6kHhCShSSHSdCbvqmCH3H8szPodkOkLp5qXNmxqfNxA==", - "dependencies": { - "@cardano-foundation/ledgerjs-hw-app-cardano": "^5.0.0", - "@types/mocha": "^9.1.1", - "axios": "^0.24.0", - "bech32": "^2.0.0", - "bignumber.js": "^9.0.1", - "blake2b": "^2.1.4", - "hash-wasm": "^4.9.0", - "mocha": "^10.0.0" - } - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@cardano-foundation/ledgerjs-hw-app-cardano": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-5.1.0.tgz", - "integrity": "sha512-ucuz/XbS/0ZD0Bal/GI/kiTm9jDIl8J+A7ypEqcAcBDGicFsyWmtPotOTwuDovTsiM8+eA/5OGTFX0oRqzxstQ==", - "dependencies": { - "@ledgerhq/hw-transport": "^5.12.0", - "@types/ledgerhq__hw-transport": "^4.21.3", - "base-x": "^3.0.5", - "bech32": "^1.1.4", - "blake2": "^4.0.2", - "int64-buffer": "^1.0.1" - } - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@cardano-foundation/ledgerjs-hw-app-cardano/node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@ledgerhq/devices": { - "version": "5.51.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz", - "integrity": "sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==", - "dependencies": { - "@ledgerhq/errors": "^5.50.0", - "@ledgerhq/logs": "^5.50.0", - "rxjs": "6", - "semver": "^7.3.5" - } - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@ledgerhq/errors": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz", - "integrity": "sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==" - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@ledgerhq/hw-transport": { - "version": "5.51.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz", - "integrity": "sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==", - "dependencies": { - "@ledgerhq/devices": "^5.51.1", - "@ledgerhq/errors": "^5.50.0", - "events": "^3.3.0" - } - }, - "node_modules/@emurgo/cross-csl-core/node_modules/@ledgerhq/logs": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz", - "integrity": "sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==" - }, - "node_modules/@emurgo/cross-csl-core/node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/@emurgo/cross-csl-core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/@emurgo/cross-csl-nodejs": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-nodejs/-/cross-csl-nodejs-5.1.2.tgz", @@ -2619,20 +2536,13 @@ "@emurgo/cross-csl-core": "5.1.2" } }, - "node_modules/@emurgo/cross-csl-nodejs/node_modules/@emurgo/cross-csl-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-5.1.2.tgz", - "integrity": "sha512-+zR8DR/UEql/S5BBnA6sbEGKVRow7NHI896K8UDt5+W3J3cZVAZEsbm9faaH+DehpqvensVNHwxooxk30wEOpg==", - "dev": true - }, "node_modules/@emurgo/yoroi-eutxo-txs": { - "version": "0.0.2-alpha.8", - "resolved": "https://registry.npmjs.org/@emurgo/yoroi-eutxo-txs/-/yoroi-eutxo-txs-0.0.2-alpha.8.tgz", - "integrity": "sha512-H9VdDrqLMsGSFRUyfNXEwBmabn+06Z27Fq1lcH7LiIy5HquiKoqZ7jbp4J5fQnnnYNkHchcZnSFP4wX2KGLApA==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@emurgo/yoroi-eutxo-txs/-/yoroi-eutxo-txs-0.0.3.tgz", + "integrity": "sha512-IHKRwVNCDtfNkj08U4FMr9XkgnMql54CrCX2Utag3iyV4SHtXlbST3YGb+K1eNv7VDGjMBRwGeCboudr7TKfuw==", "dependencies": { - "@cardano-foundation/ledgerjs-hw-app-cardano": "^5.0.0", - "@emurgo/cross-csl-core": "4.4.0", - "@ledgerhq/hw-transport-node-hid": "^6.27.2", + "@cardano-foundation/ledgerjs-hw-app-cardano": "7.1.3", + "@emurgo/cross-csl-core": "5.1.2", "axios": "^0.27.2", "bech32": "^2.0.0", "bignumber.js": "^9.1.0", @@ -2640,55 +2550,6 @@ "hash-wasm": "^4.9.0" } }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@cardano-foundation/ledgerjs-hw-app-cardano": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-5.1.0.tgz", - "integrity": "sha512-ucuz/XbS/0ZD0Bal/GI/kiTm9jDIl8J+A7ypEqcAcBDGicFsyWmtPotOTwuDovTsiM8+eA/5OGTFX0oRqzxstQ==", - "dependencies": { - "@ledgerhq/hw-transport": "^5.12.0", - "@types/ledgerhq__hw-transport": "^4.21.3", - "base-x": "^3.0.5", - "bech32": "^1.1.4", - "blake2": "^4.0.2", - "int64-buffer": "^1.0.1" - } - }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@cardano-foundation/ledgerjs-hw-app-cardano/node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@ledgerhq/devices": { - "version": "5.51.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-5.51.1.tgz", - "integrity": "sha512-4w+P0VkbjzEXC7kv8T1GJ/9AVaP9I6uasMZ/JcdwZBS3qwvKo5A5z9uGhP5c7TvItzcmPb44b5Mw2kT+WjUuAA==", - "dependencies": { - "@ledgerhq/errors": "^5.50.0", - "@ledgerhq/logs": "^5.50.0", - "rxjs": "6", - "semver": "^7.3.5" - } - }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@ledgerhq/errors": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-5.50.0.tgz", - "integrity": "sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==" - }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@ledgerhq/hw-transport": { - "version": "5.51.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-5.51.1.tgz", - "integrity": "sha512-6wDYdbWrw9VwHIcoDnqWBaDFyviyjZWv6H9vz9Vyhe4Qd7TIFmbTl/eWs6hZvtZBza9K8y7zD8ChHwRI4s9tSw==", - "dependencies": { - "@ledgerhq/devices": "^5.51.1", - "@ledgerhq/errors": "^5.50.0", - "events": "^3.3.0" - } - }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/@ledgerhq/logs": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-5.50.0.tgz", - "integrity": "sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==" - }, "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -2711,17 +2572,6 @@ "node": ">= 6" } }, - "node_modules/@emurgo/yoroi-eutxo-txs/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/@emurgo/yoroi-lib": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@emurgo/yoroi-lib/-/yoroi-lib-1.2.3.tgz", @@ -2737,11 +2587,6 @@ "easy-crc": "1.1.0" } }, - "node_modules/@emurgo/yoroi-lib/node_modules/@emurgo/cross-csl-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@emurgo/cross-csl-core/-/cross-csl-core-5.1.2.tgz", - "integrity": "sha512-+zR8DR/UEql/S5BBnA6sbEGKVRow7NHI896K8UDt5+W3J3cZVAZEsbm9faaH+DehpqvensVNHwxooxk30wEOpg==" - }, "node_modules/@emurgo/yoroi-lib/node_modules/axios": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", @@ -2881,6 +2726,70 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@ethereumjs/common": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-4.4.0.tgz", + "integrity": "sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w==", + "dependencies": { + "@ethereumjs/util": "^9.1.0" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-5.4.0.tgz", + "integrity": "sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA==", + "dependencies": { + "@ethereumjs/common": "^4.4.0", + "@ethereumjs/rlp": "^5.0.2", + "@ethereumjs/util": "^9.1.0", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@fivebinaries/coin-selection": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@fivebinaries/coin-selection/-/coin-selection-2.2.1.tgz", + "integrity": "sha512-iYFsYr7RY7TEvTqP9NKR4p/yf3Iybf9abUDR7lRjzanGsrLwVsREvIuyE05iRYFrvqarlk+gWRPsdR1N2hUBrg==", + "dependencies": { + "@emurgo/cardano-serialization-lib-browser": "^11.5.0", + "@emurgo/cardano-serialization-lib-nodejs": "11.5.0" + } + }, + "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-browser": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-11.5.0.tgz", + "integrity": "sha512-qchOJ9NYDUz10tzs5r5QhP9hK0p+ZOlRiBwPdTAxqAYLw/8emYBkQQLaS8T1DF6EkeudyrgS00ym5Trw1fo4iA==" + }, + "node_modules/@fivebinaries/coin-selection/node_modules/@emurgo/cardano-serialization-lib-nodejs": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-11.5.0.tgz", + "integrity": "sha512-IlVABlRgo9XaTR1NunwZpWcxnfEv04ba2l1vkUz4S1W7Jt36F4CtffP+jPeqBZGnAe+fnUwo0XjIJC3ZTNToNQ==" + }, "node_modules/@floating-ui/core": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", @@ -3761,33 +3670,6 @@ "events": "^3.3.0" } }, - "node_modules/@ledgerhq/hw-transport-node-hid": { - "version": "6.28.6", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.28.6.tgz", - "integrity": "sha512-USSTOO0zv9XtguWismP7/StnNS/s7Rz0JOGGaBhKe3Bzl7d5XPncUlmOvoNFzzY/QdasEoFs2QId1+ibJG71Vw==", - "dependencies": { - "@ledgerhq/devices": "^8.3.0", - "@ledgerhq/errors": "^6.16.4", - "@ledgerhq/hw-transport": "^6.30.6", - "@ledgerhq/hw-transport-node-hid-noevents": "^6.29.6", - "@ledgerhq/logs": "^6.12.0", - "lodash": "^4.17.21", - "node-hid": "^2.1.2", - "usb": "2.9.0" - } - }, - "node_modules/@ledgerhq/hw-transport-node-hid-noevents": { - "version": "6.29.6", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.29.6.tgz", - "integrity": "sha512-H1cGC4TLwSCxve3rbV7qfPJBZfy7VD7k9Czc9HOMDwQ9zHFtaoeiIotIMGjzHjfPtAGauMpAYvrpmEdBBX5sHg==", - "dependencies": { - "@ledgerhq/devices": "^8.3.0", - "@ledgerhq/errors": "^6.16.4", - "@ledgerhq/hw-transport": "^6.30.6", - "@ledgerhq/logs": "^6.12.0", - "node-hid": "^2.1.2" - } - }, "node_modules/@ledgerhq/hw-transport-u2f": { "version": "5.36.0-deprecated", "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-5.36.0-deprecated.tgz", @@ -4012,6 +3894,14 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, + "node_modules/@mobily/ts-belt": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", + "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", + "engines": { + "node": ">= 10.*" + } + }, "node_modules/@mui/base": { "version": "5.0.0-beta.40", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", @@ -4466,6 +4356,31 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/hashes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", @@ -5798,6 +5713,42 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sentry/core": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", @@ -5889,6 +5840,11 @@ "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", "dev": true }, + "node_modules/@sinclair/typebox": { + "version": "0.31.28", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz", + "integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==" + }, "node_modules/@sindresorhus/is": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", @@ -5919,6 +5875,55 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.95.5", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.5.tgz", + "integrity": "sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@solana/web3.js/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", @@ -6126,6 +6131,19 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -6148,43 +6166,77 @@ } }, "node_modules/@trezor/analytics": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.5.tgz", - "integrity": "sha512-XpgAsQDi8uZ+PmfCS6KUn+frUqR1ckOY9NdeC0PMGmkTzWm47oatvoyLSy2umd30T9M4h1LJECBqA80XpEV5MA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.2.0.tgz", + "integrity": "sha512-q3lJtHL0tXDEbjl/pENpmUVzVcTd9NW4G2gskY2OKLsUykWP0pqN+9YX41C/f2TvMePVEA67kzXTm9US2sB2eA==", "dependencies": { - "@trezor/env-utils": "1.0.4", - "@trezor/utils": "9.0.11" + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.15.tgz", - "integrity": "sha512-Y7QsggFUGk84yKY06eSuS3oTNwH+chz0fuCWMs7aKr4TxXsxILNwzoYg7Erecf+WZuydAdmjZRDT4QbmMUc65g==", - "dependencies": { - "@trezor/blockchain-link-types": "1.0.4", - "@trezor/blockchain-link-utils": "1.0.5", - "@trezor/utils": "9.0.11", - "@trezor/utxo-lib": "1.0.9", - "@types/web": "^0.0.100", - "bignumber.js": "^9.1.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.3.0.tgz", + "integrity": "sha512-kuDHXIVhiTzpCmqoCH3zzCtM2BK+MEIvlj+GpA9VHPQbMGM55YU6c7M2jtq3vbw1XdtyvmvTD/s7Y8/WZR+IMg==", + "dependencies": { + "@solana/buffer-layout": "^4.0.1", + "@solana/web3.js": "^1.95.0", + "@trezor/blockchain-link-types": "1.2.0", + "@trezor/blockchain-link-utils": "1.2.0", + "@trezor/utils": "9.2.0", + "@trezor/utxo-lib": "2.2.0", + "@types/web": "^0.0.138", "events": "^3.3.0", "ripple-lib": "^1.10.1", "socks-proxy-agent": "6.1.1", - "ws": "7.5.9" + "ws": "^8.18.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link-types": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.4.tgz", - "integrity": "sha512-EBX8Fi38mqIRStOQsUNbma1RwEP57B104N77p1CPHML3Kxu6M0DVcTulFKJKAJ6laQyfULzTeUYfEdn//dCcFA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.2.0.tgz", + "integrity": "sha512-MCukIR4R6IuzAS4I51j9r0KRYXGBNzqMAPh0Fc9gerWvEC9rNrcsbYYDJy/7wYsiAxHRVYiqUyq9yTjUzUkdUA==", + "dependencies": { + "@solana/web3.js": "^1.95.0", + "@trezor/type-utils": "1.1.0", + "@trezor/utxo-lib": "2.2.0", + "socks-proxy-agent": "6.1.1" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/blockchain-link-types/node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } }, "node_modules/@trezor/blockchain-link-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.5.tgz", - "integrity": "sha512-Kj8Zuy22ApV+FcLhMFdFVMAjbJwS4VaXndkz1OgjF7UHTb0jEJtIk5JSe5KNbvNUsyGcEAn9vZ+RogfZETOVGw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.2.0.tgz", + "integrity": "sha512-C9nMCbj5qaMvKzUXfMb1+nfPZd6StTeIBpQBFEnvHOcCl6p4Meab1HUSVJ+Dcd1Y+y0mhlWGcOw8ZvBTLIB/Pg==", "dependencies": { - "@trezor/utils": "9.0.11", - "bignumber.js": "^9.1.1" + "@mobily/ts-belt": "^3.13.1", + "@solana/web3.js": "^1.95.0", + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { @@ -6200,51 +6252,88 @@ "node": ">= 10" } }, + "node_modules/@trezor/blockchain-link/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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/@trezor/connect": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.1.tgz", - "integrity": "sha512-qIovN55BN5zciRiwIeEAHISjspy9jWkusBntk5z5SFmXw95KG6trms7GCodpbEuueboUS9Ts9xHorYwvqMmweg==", - "dependencies": { - "@trezor/blockchain-link": "2.1.15", - "@trezor/blockchain-link-types": "1.0.4", - "@trezor/connect-analytics": "1.0.4", - "@trezor/connect-common": "0.0.18", - "@trezor/transport": "1.1.14", - "@trezor/utils": "9.0.11", - "@trezor/utxo-lib": "1.0.9", - "bignumber.js": "^9.1.1", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.4.0.tgz", + "integrity": "sha512-gtY5coDzTEaJ/mrdXkRgpWARO/bWcEDFIuJMPjpEr27UzeTZy8loSFRA7jR3IsJXHyxJ7g8iLrd4jeuC9rdpow==", + "dependencies": { + "@babel/preset-typescript": "^7.24.7", + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/tx": "^5.3.0", + "@fivebinaries/coin-selection": "2.2.1", + "@trezor/blockchain-link": "2.3.0", + "@trezor/blockchain-link-types": "1.2.0", + "@trezor/connect-analytics": "1.2.0", + "@trezor/connect-common": "0.2.0", + "@trezor/protobuf": "1.2.0", + "@trezor/protocol": "1.2.0", + "@trezor/schema-utils": "1.2.0", + "@trezor/transport": "1.3.0", + "@trezor/utils": "9.2.0", + "@trezor/utxo-lib": "2.2.0", "blakejs": "^1.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", - "cross-fetch": "^3.1.6", - "events": "^3.3.0", - "randombytes": "2.1.0" + "cross-fetch": "^4.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-analytics": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.4.tgz", - "integrity": "sha512-GLD5CCh6hcXsovxM2Fyns25GbGRCJ3lgFhWQ9WyqkFveI41cwMGCJZuXSyGSWCeMpazOYdvpgyXMqc22J2tatg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.2.0.tgz", + "integrity": "sha512-tgbxoHQN8TUMjZ9k2XgIya3+nYcQFG+eUKNHzBe6zN2vyXuWF93jAph4uC42L+8YbYYya080BwCXjq0YfGZQgA==", "dependencies": { - "@trezor/analytics": "1.0.5" + "@trezor/analytics": "1.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.18.tgz", - "integrity": "sha512-tFian3z2ce/gQpjtFddr5NCKeJEEpV/t+Srb0Sa/STXqY/mTaADzti1aqp+/w4bL+1E2NNdAmCtsCl5AZc4a+A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.2.0.tgz", + "integrity": "sha512-yfLbOOBQyKoXblLGTjhArv0AxAUrxm+asOYT+WFR+SocuIxFlWLOEk80HYfowucPJ1aN0W8T/kTOPCO+x9pd+Q==", "dependencies": { - "@trezor/env-utils": "1.0.4" + "@trezor/env-utils": "1.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-web": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.1.1.tgz", - "integrity": "sha512-FDwdARtUAITO80bahfU5gR4NS0q85rOvtyCCtwGgbH04JpOvmmoaNgYdXwfYfPaZCd2ZxZZ4omBermVPaE/wvA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.4.0.tgz", + "integrity": "sha512-y3upWE6LA7Qq2uHiTcw3IOgT4vSYfG9fxUOBmtiEpBo5A0QHH7MNDk5eTVoKJ7Hcc2A/qOCR8aA++3hOXTZGrA==", "dependencies": { - "@trezor/connect": "9.1.1", - "@trezor/utils": "9.0.11", - "events": "^3.3.0" + "@trezor/connect": "9.4.0", + "@trezor/connect-common": "0.2.0", + "@trezor/utils": "9.2.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect/node_modules/base-x": { @@ -6269,92 +6358,140 @@ "bs58": "^5.0.0" } }, + "node_modules/@trezor/connect/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/@trezor/env-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.4.tgz", - "integrity": "sha512-V9DdjpCH6hyN7AYPEIV1WR44fmgN6d3iF8DtHYNljnMFOaan167DDVq51ZpSPAnyppulIEhdK7kuLDW3KPcnpw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.2.0.tgz", + "integrity": "sha512-dbOR+PIeReZW4iooN+DQIMWloZAV92jMGOTzEdcY6NA63nCV8QUSxoNZwZtU9nVRPeJLrT6cVkVG80nZjlplow==", "dependencies": { - "ua-parser-js": "^1.0.35" + "ua-parser-js": "^1.0.37" }, "peerDependencies": { - "expo-localization": "^14.1.1", - "react-native": "0.71.8", - "react-native-config": "^1.5.0" + "expo-constants": "*", + "expo-localization": "*", + "react-native": "*", + "tslib": "^2.6.2" }, "peerDependenciesMeta": { - "expo-localization": { + "expo-constants": { "optional": true }, - "react-native": { + "expo-localization": { "optional": true }, - "react-native-config": { + "react-native": { "optional": true } } }, - "node_modules/@trezor/transport": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.14.tgz", - "integrity": "sha512-KRurYZonsPugKyCJFEEkDi82gjD1lwNDEaROCwQvIHcdXO2spHj1XDlIWa8dgBVrglukJmYutqCzE+RtaMeVVQ==", + "node_modules/@trezor/protobuf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.2.0.tgz", + "integrity": "sha512-lc09F0MotgKx3W9+hPGY1f/egRgymNha6PQJTgTaXam/6yoP7MSA9obQlmvndJZymbdqLb9jbtigGuLgoxx6Bw==", "dependencies": { - "@trezor/utils": "9.0.11", - "bytebuffer": "^5.0.1", - "cross-fetch": "^3.1.6", - "json-stable-stringify": "^1.0.2", - "long": "^4.0.0", - "prettier": "2.8.8", - "protobufjs": "7.2.4", - "usb": "^2.9.0" + "@trezor/schema-utils": "1.2.0", + "protobufjs": "7.2.6" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@trezor/transport/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "node_modules/@trezor/protocol": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.2.0.tgz", + "integrity": "sha512-2dE/deXGszpnOAF1FHvx1QG8pwkwCm2UqN3lfD0mBobpvTjkLqNROuOCwDN/HApMV0f3OYoIVR6Y3mgkRfc42w==", + "peerDependencies": { + "tslib": "^2.6.2" + } }, - "node_modules/@trezor/transport/node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "node_modules/@trezor/schema-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@trezor/schema-utils/-/schema-utils-1.2.0.tgz", + "integrity": "sha512-LUvcNpYjrkOyThVqzMobWXl7W39apyp5tlaj0LRkCQFRvpt1q8eXynjdLb2ofJTiwrMvLLFB4NRRpD3hBqu1LQ==", "dependencies": { - "call-bind": "^1.0.5", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "@sinclair/typebox": "^0.31.28", + "ts-mixer": "^6.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@trezor/transport/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" + "node_modules/@trezor/transport": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.3.0.tgz", + "integrity": "sha512-rgUwtH63PJRoOftkLcIo4/ElkaKq/2ban4wf2y/8k7lseU4OQXl5yxBJS7dGc3rVtxSBd3QhL6TY3h9icrJUVQ==", + "dependencies": { + "@trezor/protobuf": "1.2.0", + "@trezor/protocol": "1.2.0", + "@trezor/utils": "9.2.0", + "cross-fetch": "^4.0.0", + "long": "^4.0.0", + "protobufjs": "7.2.6", + "usb": "^2.11.0" }, + "peerDependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@trezor/transport/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/@trezor/transport/node_modules/node-addon-api": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.2.2.tgz", + "integrity": "sha512-9emqXAKhVoNrQ792nLI/wpzPpJ/bj/YXxW0CvAau1+RdGBcCRF1Dmz7719zgVsQNrzHl9Tzn3ImZ4qWFarWL0A==", "engines": { - "node": ">=10.13.0" + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@trezor/transport/node_modules/usb": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.14.0.tgz", + "integrity": "sha512-I3lzVOH21BsO6qPYvx1C7Ji08lbuM0qmsEtNGAphqlhNME5cz/vExY+jIXZl+HQIRybI/sTxdyLab5tALsL69w==", + "hasInstallScript": true, + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.5.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" } }, + "node_modules/@trezor/type-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.0.tgz", + "integrity": "sha512-zoPN9ZmdYlr03WyCWEQY6xCHPfhsodENYHPcZMKObVsUlhtMh1Z7OSD/pzd/NzOPBAtSctNbldx4aFu9A88afw==" + }, "node_modules/@trezor/utils": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.11.tgz", - "integrity": "sha512-HJBgR6/VYjJX8AP/fNIcYC+gDNjP2JLfgYBrT/naupEwDQJcxfn8KgUBrR1/akm61g8CPOot/YEj4o5nXuRt/g==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.2.0.tgz", + "integrity": "sha512-OslmtISmVl2r5lS/BPagyaWYudT/fSiezrSaKA1aDctGKOrze1JkA7p5J1j0uUAgjf9HODCiH8+PBAVXjUZL8A==", + "dependencies": { + "bignumber.js": "^9.1.2" + }, + "peerDependencies": { + "tslib": "^2.6.2" + } }, "node_modules/@trezor/utxo-lib": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.9.tgz", - "integrity": "sha512-ezLJzAslhW6HVTyZWpfBmrXY5/hz5XKT0FkYRS7lhnf56LwtVPUkLvLqGtDPuV8djF04meXxoRNO8jjtnQgYqA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-2.2.0.tgz", + "integrity": "sha512-Fhu+QZjOMpiipmJWdRAwbJEVk4DtwZfh7jy67vjgliWlO9p8M5Ap3XzlbZGF9+mKLrACjv/yhN63XMqTbxVcqw==", "dependencies": { - "@trezor/utils": "9.0.11", + "@trezor/utils": "9.2.0", "bchaddrjs": "^0.5.2", "bech32": "^2.0.0", "bip66": "^1.1.5", @@ -6364,14 +6501,16 @@ "bn.js": "^5.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", - "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "int64-buffer": "^1.0.1", "pushdata-bitcoin": "^1.0.1", "tiny-secp256k1": "^1.1.6", "typeforce": "^1.18.0", "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.6" + "wif": "^4.0.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/utxo-lib/node_modules/base-x": { @@ -6396,6 +6535,14 @@ "bs58": "^5.0.0" } }, + "node_modules/@trezor/utxo-lib/node_modules/wif": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wif/-/wif-4.0.0.tgz", + "integrity": "sha512-kADznC+4AFJNXpT8rLhbsfI7EmAcorc5nWvAdKUchGmwXEBD3n55q0/GZ3DBmc6auAvuTSsr/utiKizuXdNYOQ==", + "dependencies": { + "bs58check": "^3.0.1" + } + }, "node_modules/@ts-nameof/common": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@ts-nameof/common/-/common-4.2.1.tgz", @@ -6507,7 +6654,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -6772,18 +6918,10 @@ "@types/node": "*" } }, - "node_modules/@types/ledgerhq__hw-transport": { - "version": "4.21.8", - "resolved": "https://registry.npmjs.org/@types/ledgerhq__hw-transport/-/ledgerhq__hw-transport-4.21.8.tgz", - "integrity": "sha512-uO2AJYZUVCwgyqgyy2/KW+JsQaO0hcwDdubRaHgF2ehO0ngGAY41PbE8qnPnmUw1uerMXONvL68QFioA7Y6C5g==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==" + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" }, "node_modules/@types/mdast": { "version": "3.0.15", @@ -6811,11 +6949,6 @@ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -7029,15 +7162,20 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==" }, "node_modules/@types/web": { - "version": "0.0.100", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.100.tgz", - "integrity": "sha512-8NDSrDsyF7qv93SQ7aNFk0NqpNb1QEC1meoEZW/+KGMHZWd0WOC2DiT9pVhS5+w5q+u9+2bkBCfUQpe9wbqiPA==" + "version": "0.0.138", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.138.tgz", + "integrity": "sha512-oQD74hl+cNCZdSWIupJCXZ2azTuB3MJ/mrWlgYt+v4pD7/Dr78gl5hKAdieZNf9NrAqwUez79bHtnFVSNSscWA==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -7063,16 +7201,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", - "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/type-utils": "8.12.2", - "@typescript-eslint/utils": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -7096,15 +7234,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz", - "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/typescript-estree": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4" }, "engines": { @@ -7124,13 +7262,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz", - "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7141,13 +7279,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz", - "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.12.2", - "@typescript-eslint/utils": "8.12.2", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -7158,6 +7296,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -7165,9 +7306,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz", - "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7178,13 +7319,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz", - "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/visitor-keys": "8.12.2", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -7230,15 +7371,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz", - "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.12.2", - "@typescript-eslint/types": "8.12.2", - "@typescript-eslint/typescript-estree": "8.12.2" + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7249,16 +7390,21 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz", - "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.12.2", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7269,12 +7415,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -8003,7 +8149,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -8180,6 +8325,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -9378,6 +9524,18 @@ "node": "*" } }, + "node_modules/bigint-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", + "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -9403,6 +9561,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "engines": { "node": ">=8" }, @@ -9457,6 +9616,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -9467,6 +9627,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -9490,6 +9651,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9503,6 +9665,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -9542,18 +9705,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/blake2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/blake2/-/blake2-4.1.1.tgz", - "integrity": "sha512-HUmkY0MUDUVgejJVNrpNKAva8C4IWD/Rd862sdexoSibu86b6iu0gO0/RjovO2lM5+w6JqjIEmkuAgGhfHlnJw==", - "hasInstallScript": true, - "dependencies": { - "nan": "^2.15.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/blake2b": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", @@ -9651,6 +9802,16 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9697,11 +9858,6 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -9934,6 +10090,19 @@ "node": ">=0.2.0" } }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -9949,25 +10118,6 @@ "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", "dev": true }, - "node_modules/bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "dependencies": { - "long": "~3" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/bytebuffer/node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -10391,6 +10541,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -11625,6 +11776,7 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dev": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -12265,14 +12417,6 @@ "node": ">=0.12" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -12432,6 +12576,17 @@ "uniq": "^1.0.1" } }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12480,14 +12635,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12500,15 +12647,7 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" - } + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/diff-sequences": { "version": "26.6.2", @@ -12919,6 +13058,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -13146,6 +13286,19 @@ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -13865,6 +14018,28 @@ "node": ">= 0.6" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -14004,14 +14179,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -14251,6 +14418,14 @@ "node": ">=8" } }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -14304,6 +14479,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -14510,6 +14690,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14525,6 +14706,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -14533,6 +14715,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, "bin": { "flat": "cli.js" } @@ -15022,7 +15205,8 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, "node_modules/fs-extra": { "version": "8.1.0", @@ -15065,6 +15249,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -15302,11 +15487,6 @@ "node": ">=0.10.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -15331,6 +15511,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -15744,6 +15925,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, "bin": { "he": "bin/he" } @@ -16179,7 +16361,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, "dependencies": { "ms": "^2.0.0" } @@ -16402,11 +16583,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -16753,6 +16929,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -16923,6 +17100,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -16962,6 +17140,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -17184,6 +17363,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { "node": ">=10" }, @@ -17243,6 +17423,14 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -17363,6 +17551,69 @@ "node": ">=8" } }, + "node_modules/jayson": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", + "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/jayson/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jdenticon": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jdenticon/-/jdenticon-3.2.0.tgz", @@ -19435,6 +19686,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -19459,10 +19715,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, "node_modules/jsonschema": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", @@ -19471,6 +19736,21 @@ "node": "*" } }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -19657,6 +19937,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -19753,6 +20034,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -19768,6 +20050,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -19782,6 +20065,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19797,6 +20081,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -19807,12 +20092,14 @@ "node_modules/log-symbols/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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/log-symbols/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==", + "dev": true, "engines": { "node": ">=8" } @@ -19821,6 +20108,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -20780,7 +21068,8 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "node_modules/minimist-options": { "version": "4.1.0", @@ -20940,7 +21229,8 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true }, "node_modules/mobx": { "version": "5.15.7", @@ -20951,236 +21241,57 @@ "url": "https://opencollective.com/mobx" } }, - "node_modules/mobx-react": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-6.3.1.tgz", - "integrity": "sha512-IOxdJGnRSNSJrL2uGpWO5w9JH5q5HoxEqwOF4gye1gmZYdjoYkkMzSGMDnRCUpN/BNzZcFoMdHXrjvkwO7KgaQ==", - "dependencies": { - "mobx-react-lite": "^2.2.0" - }, - "peerDependencies": { - "mobx": "^5.15.4 || ^4.15.4", - "react": "^16.8.0 || 16.9.0-alpha.0" - } - }, - "node_modules/mobx-react-form": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/mobx-react-form/-/mobx-react-form-2.0.8.tgz", - "integrity": "sha512-Z/JsXkN7B5xjG1tolHKytJiKmtLSdqkFKMco5AVagL8cQ0yJmE+iRZ212JKGHfkEKZrRWn7EDnX2STawIQFqxg==", - "dependencies": { - "lodash": "^4.17.11" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "mobx": "^2.5.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/mobx-react-lite": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-2.2.2.tgz", - "integrity": "sha512-2SlXALHIkyUPDsV4VTKVR9DW7K3Ksh1aaIv3NrNJygTbhXe2A9GrcKHZ2ovIiOp/BXilOcTYemfHHZubP431dg==", - "peerDependencies": { - "mobx": "^4.0.0 || ^5.0.0", - "react": "^16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mobx-react-router": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mobx-react-router/-/mobx-react-router-4.1.0.tgz", - "integrity": "sha512-2knsbDqVorWLngZWbdO8tr7xcZXaLpVFsFlCaGaoyZ+EP9erVGRxnlWGqKyFObs3EH1JPLyTDOJ2LPTxb/lB6Q==", - "deprecated": "Package transfered to @ibm/mobx-react-router", - "peerDependencies": { - "mobx": "^3.0.0 || ^4.0.0 || ^5.0.0", - "react-router": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/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/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mocha/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/mobx-react": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-6.3.1.tgz", + "integrity": "sha512-IOxdJGnRSNSJrL2uGpWO5w9JH5q5HoxEqwOF4gye1gmZYdjoYkkMzSGMDnRCUpN/BNzZcFoMdHXrjvkwO7KgaQ==", "dependencies": { - "randombytes": "^2.1.0" + "mobx-react-lite": "^2.2.0" + }, + "peerDependencies": { + "mobx": "^5.15.4 || ^4.15.4", + "react": "^16.8.0 || 16.9.0-alpha.0" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/mobx-react-form": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/mobx-react-form/-/mobx-react-form-2.0.8.tgz", + "integrity": "sha512-Z/JsXkN7B5xjG1tolHKytJiKmtLSdqkFKMco5AVagL8cQ0yJmE+iRZ212JKGHfkEKZrRWn7EDnX2STawIQFqxg==", "dependencies": { - "has-flag": "^4.0.0" + "lodash": "^4.17.11" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "peerDependencies": { + "mobx": "^2.5.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "node_modules/mobx-react-lite": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-2.2.2.tgz", + "integrity": "sha512-2SlXALHIkyUPDsV4VTKVR9DW7K3Ksh1aaIv3NrNJygTbhXe2A9GrcKHZ2ovIiOp/BXilOcTYemfHHZubP431dg==", + "peerDependencies": { + "mobx": "^4.0.0 || ^5.0.0", + "react": "^16.8.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-router": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mobx-react-router/-/mobx-react-router-4.1.0.tgz", + "integrity": "sha512-2knsbDqVorWLngZWbdO8tr7xcZXaLpVFsFlCaGaoyZ+EP9erVGRxnlWGqKyFObs3EH1JPLyTDOJ2LPTxb/lB6Q==", + "deprecated": "Package transfered to @ibm/mobx-react-router", + "peerDependencies": { + "mobx": "^3.0.0 || ^4.0.0 || ^5.0.0", + "react-router": "^4.0.0 || ^5.0.0" } }, "node_modules/moment": { @@ -21288,11 +21399,6 @@ "node": ">=0.10.0" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -21345,17 +21451,6 @@ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, - "node_modules/node-abi": { - "version": "3.63.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz", - "integrity": "sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -21552,23 +21647,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/node-hid": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-2.2.0.tgz", - "integrity": "sha512-vj48zh9j555DZzUhMc8tk/qw6xPFrDyPBH1ST1Z/hWaA/juBJw7IuSxPeOgpzNFNU36mGYj+THioRMt1xOdm/g==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^3.0.2", - "prebuild-install": "^7.1.1" - }, - "bin": { - "hid-showdevices": "src/show-devices.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -21743,6 +21821,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -22410,6 +22489,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -22424,6 +22504,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -23115,31 +23196,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -23298,9 +23354,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -23386,6 +23442,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -23581,28 +23638,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -23926,6 +23961,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -24521,6 +24557,69 @@ "lodash": "^4.17.15" } }, + "node_modules/rpc-websockets": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", + "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/rpc-websockets/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/rpc-websockets/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "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/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -25459,74 +25558,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -26243,6 +26274,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -26275,6 +26307,14 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -26478,6 +26518,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -26488,12 +26529,14 @@ "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -26509,6 +26552,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -26522,6 +26566,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -26720,6 +26765,11 @@ "node": ">=8" } }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -26735,8 +26785,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/throwback": { "version": "4.1.0", @@ -26756,9 +26805,9 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/tiny-secp256k1": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz", - "integrity": "sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", + "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", "hasInstallScript": true, "dependencies": { "bindings": "^1.3.0", @@ -26772,9 +26821,9 @@ } }, "node_modules/tiny-secp256k1/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/tiny-warning": { "version": "1.0.3", @@ -26940,11 +26989,11 @@ }, "node_modules/trezor-connect-flow": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", - "integrity": "sha512-XkgQsN8AVPs8ucg2qWUUY+u2lgBJnfzzBjC7SoHAp0N5VFI5vsi5CRJ4URbaC7kTMJwoOrjQ2rNyIgFEKYwm+Q==", + "resolved": "git+ssh://git@github.com/Emurgo/trezor-connect-flow.git#692d366d4934382b5049e29683974e38156ccfc6", + "integrity": "sha512-6+w/X+GsrwAodsDKLAnFAaWD9MzF+NJPRaN7eQ3cmHrGoyjKoir+GZlMUI4YLz5Q52TTWwlakGL+LZCKXcfHMw==", "license": "MIT", "dependencies": { - "@trezor/connect-web": "9.1.1" + "@trezor/connect-web": "9.4.0" } }, "node_modules/trim-newlines": { @@ -27080,6 +27129,11 @@ "node": ">=8" } }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -27131,6 +27185,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -27789,25 +27844,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/usb": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/usb/-/usb-2.9.0.tgz", - "integrity": "sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw==", - "hasInstallScript": true, - "dependencies": { - "@types/w3c-web-usb": "^1.0.6", - "node-addon-api": "^6.0.0", - "node-gyp-build": "^4.5.0" - }, - "engines": { - "node": ">=10.20.0 <11.x || >=12.17.0 <13.0 || >=14.0.0" - } - }, - "node_modules/usb/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -27825,6 +27861,19 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -28919,11 +28968,6 @@ "node": ">=0.10.0" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -29069,35 +29113,11 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, "engines": { "node": ">=10" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", @@ -29110,6 +29130,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, diff --git a/packages/yoroi-extension/package.json b/packages/yoroi-extension/package.json index 5777e1bef0..1c1da99856 100644 --- a/packages/yoroi-extension/package.json +++ b/packages/yoroi-extension/package.json @@ -1,6 +1,6 @@ { "name": "yoroi", - "version": "5.4.311", + "version": "5.4.500", "description": "Cardano ADA wallet", "scripts": { "dev-mv2": "rimraf dev/ && NODE_OPTIONS=--openssl-legacy-provider babel-node scripts-mv2/build --type=debug --env 'mainnet'", @@ -157,7 +157,7 @@ "@emurgo/cip14-js": "2.0.0", "@emurgo/cip4-js": "1.0.5", "@emurgo/cross-csl-browser": "5.1.2", - "@emurgo/yoroi-eutxo-txs": "0.0.2-alpha.8", + "@emurgo/yoroi-eutxo-txs": "0.0.3", "@emurgo/yoroi-lib": "1.2.3", "@ledgerhq/hw-transport-u2f": "5.36.0-deprecated", "@ledgerhq/hw-transport-webauthn": "5.36.0-deprecated", @@ -226,7 +226,7 @@ "semver": "7.6.0", "stream-browserify": "3.0.0", "tinycolor2": "1.4.2", - "trezor-connect-flow": "Emurgo/trezor-connect-flow#92d6d8c8faef25c0ea1d481aa1ecb4ba77ce539c", + "trezor-connect-flow": "Emurgo/trezor-connect-flow#692d366d4934382b5049e29683974e38156ccfc6", "ts-loader": "^9.5.1", "typescript": "^5.4.5", "ua-parser-js": "1.0.37", diff --git a/run-dev.sh b/run-dev.sh index 95483286cc..a08455035d 100644 --- a/run-dev.sh +++ b/run-dev.sh @@ -1 +1 @@ -nvm i && . install-all.sh && npm run dev:stable --prefix packages/yoroi-extension \ No newline at end of file +nvm i && . install-all.sh && npm run "dev${1:-:stable}" --prefix packages/yoroi-extension \ No newline at end of file