1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 01:39:44 +01:00

Merge remote-tracking branch 'origin/develop' into master-sync

This commit is contained in:
ryanml 2022-03-11 13:17:47 -07:00
commit 8b6c88c711
405 changed files with 11886 additions and 3654 deletions

View File

@ -53,6 +53,9 @@ workflows:
- prep-build-test:
requires:
- prep-deps
- prep-build-test-flask:
requires:
- prep-deps
- prep-build-test-metrics:
requires:
- prep-deps
@ -78,6 +81,12 @@ workflows:
- test-e2e-firefox:
requires:
- prep-build-test
- test-e2e-chrome-snaps:
requires:
- prep-build-test-flask
- test-e2e-firefox-snaps:
requires:
- prep-build-test-flask
- test-e2e-chrome-metrics:
requires:
- prep-build-test-metrics
@ -130,6 +139,8 @@ workflows:
- test-e2e-firefox
- test-e2e-chrome-metrics
- test-e2e-firefox-metrics
- test-e2e-chrome-snaps
- test-e2e-firefox-snaps
- benchmark:
requires:
- prep-build-test
@ -283,6 +294,28 @@ jobs:
- dist-flask
- builds-flask
prep-build-test-flask:
executor: node-browsers-medium-plus
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Build extension for testing
command: yarn build:test:flask
- run:
name: Move test build to 'dist-test' to avoid conflict with production build
command: mv ./dist ./dist-test-flask
- run:
name: Move test zips to 'builds-test' to avoid conflict with production build
command: mv ./builds ./builds-test-flask
- persist_to_workspace:
root: .
paths:
- dist-test-flask
- builds-test-flask
prep-build-test:
executor: node-browsers-medium-plus
steps:
@ -465,6 +498,60 @@ jobs:
path: test-artifacts
destination: test-artifacts
test-e2e-firefox-snaps:
executor: node-browsers
steps:
- checkout
- run:
name: Install Firefox
command: ./.circleci/scripts/firefox-install.sh
- attach_workspace:
at: .
- run:
name: Move test build to dist
command: mv ./dist-test-flask ./dist
- run:
name: Move test zips to builds
command: mv ./builds-test-flask ./builds
- run:
name: test:e2e:firefox:snaps
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:firefox:snaps --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
path: test-artifacts
destination: test-artifacts
test-e2e-chrome-snaps:
executor: node-browsers
steps:
- checkout
- run:
name: Re-Install Chrome
command: ./.circleci/scripts/chrome-install.sh
- attach_workspace:
at: .
- run:
name: Move test build to dist
command: mv ./dist-test-flask ./dist
- run:
name: Move test zips to builds
command: mv ./builds-test-flask ./builds
- run:
name: test:e2e:chrome:snaps
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome:snaps --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
path: test-artifacts
destination: test-artifacts
test-e2e-chrome-metrics:
executor: node-browsers
steps:

View File

@ -5,12 +5,12 @@ set -u
set -o pipefail
# To get the latest version, see <https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable>
CHROME_VERSION='98.0.4758.80-1'
CHROME_VERSION='99.0.4844.51-1'
CHROME_BINARY="google-chrome-stable_${CHROME_VERSION}_amd64.deb"
CHROME_BINARY_URL="https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_BINARY}"
# To retrieve this checksum, run the `wget` and `shasum` commands below
CHROME_BINARY_SHA512SUM='83d151f05017ee1f255f4134ee84efdb5c7826d6c64d43e6d402bef1569e4800806be0f87af3cacd240917cacaeedb9cae5833ccbc65740482f6aafbef9b38e7'
CHROME_BINARY_SHA512SUM='f0fa5c6c23d9e8373aafa14622ed4362cbf3a101691ce309864e4aa0030dc3bf7b8e7c8ce294c06106b26eb6b8dc0f2b80376bf2a49d703fc9f6597961b9432e'
wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}"

View File

@ -18,6 +18,7 @@ ignores:
- '@metamask/auto-changelog' # invoked as `auto-changelog`
- '@metamask/forwarder'
- '@metamask/test-dapp'
- '@metamask/design-tokens' # Only imported in index.css
- '@sentry/cli' # invoked as `sentry-cli`
- 'chromedriver'
- 'depcheck' # ooo meta
@ -34,6 +35,7 @@ ignores:
- '@storybook/core'
- '@storybook/addon-essentials'
- '@storybook/addon-a11y'
- 'storybook-dark-mode'
- 'style-loader'
- 'css-loader'
- 'sass-loader'

9
.eslintrc.babel.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = {
parser: '@babel/eslint-parser',
plugins: ['@babel'],
rules: {
'@babel/no-invalid-this': 'error',
// Prettier handles this
'@babel/semi': 'off',
},
};

67
.eslintrc.base.js Normal file
View File

@ -0,0 +1,67 @@
const path = require('path');
module.exports = {
extends: [
'@metamask/eslint-config',
path.resolve(__dirname, '.eslintrc.jsdoc.js'),
],
globals: {
document: 'readonly',
window: 'readonly',
},
rules: {
'default-param-last': 'off',
'prefer-object-spread': 'error',
'require-atomic-updates': 'off',
// This is the same as our default config, but for the noted exceptions
'spaced-comment': [
'error',
'always',
{
markers: [
'global',
'globals',
'eslint',
'eslint-disable',
'*package',
'!',
',',
// Local additions
'/:', // This is for our code fences
],
exceptions: ['=', '-'],
},
],
'no-invalid-this': 'off',
// TODO: remove this override
'padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: 'directive',
next: '*',
},
{
blankLine: 'any',
prev: 'directive',
next: 'directive',
},
// Disabled temporarily to reduce conflicts while PR queue is large
// {
// blankLine: 'always',
// prev: ['multiline-block-like', 'multiline-expression'],
// next: ['multiline-block-like', 'multiline-expression'],
// },
],
// It is common to import modules without assigning them to variables in
// a browser context. For instance, we may import polyfills which change
// global variables, or we may import stylesheets.
'import/no-unassigned-import': 'off',
},
};

View File

@ -1,132 +1,112 @@
const path = require('path');
const { version: reactVersion } = require('react/package.json');
module.exports = {
root: true,
parser: '@babel/eslint-parser',
// Ignore files which are also in .prettierignore
ignorePatterns: [
'app/vendor/**',
'builds/**/*',
'dist/**/*',
'development/chromereload.js',
],
overrides: [
/**
* == Modules ==
*
* The first two sections here, which cover module syntax, are mutually
* exclusive: the set of files covered between them may NOT overlap. This is
* because we do not allow a file to use two different styles for specifying
* imports and exports (however theoretically possible it may be).
*/
{
/**
* Modules (CommonJS module syntax)
*
* This is code that uses `require()` and `module.exports` to import and
* export other modules.
*/
files: [
'.eslintrc.js',
'.eslintrc.*.js',
'.mocharc.js',
'*.config.js',
'development/**/*.js',
'test/e2e/**/*.js',
'test/helpers/*.js',
'test/lib/wait-until-called.js',
],
extends: [
path.resolve(__dirname, '.eslintrc.base.js'),
path.resolve(__dirname, '.eslintrc.node.js'),
path.resolve(__dirname, '.eslintrc.babel.js'),
],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2017,
},
rules: {
// This rule does not work with CommonJS modules. We will just have to
// trust that all of the files specified above are indeed modules.
'import/unambiguous': 'off',
},
},
/**
* Modules (ES module syntax)
*
* This is code that explicitly uses `import`/`export` instead of
* `require`/`module.exports`.
*/
{
files: [
'app/**/*.js',
'shared/**/*.js',
'ui/**/*.js',
'**/*.test.js',
'test/lib/**/*.js',
'test/mocks/**/*.js',
'test/jest/**/*.js',
'test/stub/**/*.js',
'test/unit-global/**/*.js',
],
// TODO: Convert these files to modern JS
excludedFiles: ['test/lib/wait-until-called.js'],
extends: [
path.resolve(__dirname, '.eslintrc.base.js'),
path.resolve(__dirname, '.eslintrc.node.js'),
path.resolve(__dirname, '.eslintrc.babel.js'),
],
parserOptions: {
sourceType: 'module',
},
},
/**
* == Everything else ==
*
* The sections from here on out may overlap with each other in various
* ways depending on their function.
*/
/**
* React-specific code
*
* Code in this category contains JSX and hence needs to be run through the
* React plugin.
*/
{
files: [
'test/lib/render-helpers.js',
'test/jest/rendering.js',
'ui/**/*.js',
],
extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'],
parserOptions: {
ecmaFeatures: {
experimentalObjectRestSpread: true,
impliedStrict: true,
modules: true,
blockBindings: true,
arrowFunctions: true,
objectLiteralShorthandMethods: true,
objectLiteralShorthandProperties: true,
templateStrings: true,
classes: true,
jsx: true,
},
},
ignorePatterns: [
'!.eslintrc.js',
'!.mocharc.js',
'node_modules/**',
'dist/**',
'builds/**',
'test-*/**',
'docs/**',
'coverage/',
'jest-coverage/',
'development/chromereload.js',
'app/vendor/**',
'test/e2e/send-eth-with-private-key-test/**',
'nyc_output/**',
'.vscode/**',
'lavamoat/*/policy.json',
'storybook-build/**',
],
extends: ['@metamask/eslint-config', '@metamask/eslint-config-nodejs'],
plugins: ['@babel', 'import', 'jsdoc'],
globals: {
document: 'readonly',
window: 'readonly',
},
rules: {
'default-param-last': 'off',
'prefer-object-spread': 'error',
'require-atomic-updates': 'off',
// This is the same as our default config, but for the noted exceptions
'spaced-comment': [
'error',
'always',
{
markers: [
'global',
'globals',
'eslint',
'eslint-disable',
'*package',
'!',
',',
// Local additions
'/:', // This is for our code fences
],
exceptions: ['=', '-'],
},
],
'import/no-unassigned-import': 'off',
'no-invalid-this': 'off',
'@babel/no-invalid-this': 'error',
// Prettier handles this
'@babel/semi': 'off',
'node/no-process-env': 'off',
// Allow tag `jest-environment` to work around Jest bug
// See: https://github.com/facebook/jest/issues/7780
'jsdoc/check-tag-names': ['error', { definedTags: ['jest-environment'] }],
// TODO: remove this override
'padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: 'directive',
next: '*',
},
{
blankLine: 'any',
prev: 'directive',
next: 'directive',
},
// Disabled temporarily to reduce conflicts while PR queue is large
// {
// blankLine: 'always',
// prev: ['multiline-block-like', 'multiline-expression'],
// next: ['multiline-block-like', 'multiline-expression'],
// },
],
// TODO: re-enable these rules
'node/no-sync': 'off',
'node/no-unpublished-import': 'off',
'node/no-unpublished-require': 'off',
'jsdoc/match-description': 'off',
'jsdoc/require-description': 'off',
'jsdoc/require-jsdoc': 'off',
'jsdoc/require-param-description': 'off',
'jsdoc/require-param-type': 'off',
'jsdoc/require-returns-description': 'off',
'jsdoc/require-returns-type': 'off',
'jsdoc/require-returns': 'off',
'jsdoc/valid-types': 'off',
},
overrides: [
{
files: ['ui/**/*.js', 'test/lib/render-helpers.js', 'test/jest/*.js'],
plugins: ['react'],
extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'],
rules: {
'react/no-unused-prop-types': 'error',
'react/no-unused-state': 'error',
@ -139,74 +119,100 @@ module.exports = {
'react/default-props-match-prop-types': 'error',
'react/jsx-no-duplicate-props': 'error',
},
settings: {
react: {
// If this is set to 'detect', ESLint will import React in order to
// find its version. Because we run ESLint in the build system under
// LavaMoat, this means that detecting the React version requires a
// LavaMoat policy for all of React, in the build system. That's a
// no-go, so we grab it from React's package.json.
version: reactVersion,
},
},
},
/**
* Mocha tests
*
* These are files that make use of globals and syntax introduced by the
* Mocha library.
*/
{
files: ['test/e2e/**/*.spec.js'],
extends: ['@metamask/eslint-config-mocha'],
rules: {
'mocha/no-hooks-for-single-case': 'off',
'mocha/no-setup-in-describe': 'off',
},
},
{
files: ['app/scripts/migrations/*.js', '*.stories.js'],
rules: {
'import/no-anonymous-default-export': ['error', { allowObject: true }],
},
},
{
files: ['app/scripts/migrations/*.js'],
rules: {
'node/global-require': 'off',
},
},
{
files: ['**/*.test.js'],
files: [
'**/*.test.js',
'test/lib/wait-until-called.js',
'test/e2e/**/*.spec.js',
],
excludedFiles: [
'ui/**/*.test.js',
'ui/__mocks__/*.js',
'shared/**/*.test.js',
'development/**/*.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'app/scripts/lib/**/*.test.js',
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'development/**/*.test.js',
'shared/**/*.test.js',
'ui/**/*.test.js',
'ui/__mocks__/*.js',
],
extends: ['@metamask/eslint-config-mocha'],
rules: {
// In Mocha tests, it is common to use `this` to store values or do
// things like force the test to fail.
'@babel/no-invalid-this': 'off',
'mocha/no-setup-in-describe': 'off',
},
},
/**
* Jest tests
*
* These are files that make use of globals and syntax introduced by the
* Jest library.
*/
{
files: ['**/__snapshots__/*.snap'],
plugins: ['jest'],
files: [
'**/__snapshots__/*.snap',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'app/scripts/lib/**/*.test.js',
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'development/**/*.test.js',
'shared/**/*.test.js',
'test/jest/*.js',
'test/helpers/*.js',
'ui/**/*.test.js',
'ui/__mocks__/*.js',
],
extends: ['@metamask/eslint-config-jest'],
parserOptions: {
sourceType: 'module',
},
rules: {
'import/unambiguous': 'off',
'import/named': 'off',
'jest/no-large-snapshots': [
'error',
{ maxSize: 50, inlineMaxSize: 50 },
],
},
},
{
files: [
'ui/**/*.test.js',
'ui/__mocks__/*.js',
'shared/**/*.test.js',
'development/**/*.test.js',
'app/scripts/lib/**/*.test.js',
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
],
extends: ['@metamask/eslint-config-jest'],
rules: {
'jest/no-restricted-matchers': 'off',
'import/unambiguous': 'off',
'import/named': 'off',
},
},
/**
* Migrations
*/
{
files: ['app/scripts/migrations/*.js', '**/*.stories.js'],
rules: {
'import/no-anonymous-default-export': ['error', { allowObject: true }],
},
},
/**
* Executables and related files
*
* These are files that run in a Node context. They are either designed to
* run as executables (in which case they will have a shebang at the top) or
* are dependencies of executables (in which case they may use
* `process.exit` to exit).
*/
{
files: [
'development/**/*.js',
@ -218,27 +224,9 @@ module.exports = {
'node/shebang': 'off',
},
},
{
files: [
'.eslintrc.js',
'.mocharc.js',
'babel.config.js',
'jest.config.js',
'nyc.config.js',
'stylelint.config.js',
'app/scripts/lockdown-run.js',
'app/scripts/lockdown-more.js',
'development/**/*.js',
'test/e2e/**/*.js',
'test/env.js',
'test/setup.js',
'test/helpers/protect-intrinsics-helpers.js',
'test/lib/wait-until-called.js',
],
parserOptions: {
sourceType: 'script',
},
},
/**
* Lockdown files
*/
{
files: [
'app/scripts/lockdown-run.js',
@ -251,19 +239,11 @@ module.exports = {
Compartment: 'readonly',
},
},
{
files: ['app/scripts/lockdown-run.js', 'app/scripts/lockdown-more.js'],
parserOptions: {
sourceType: 'script',
},
},
],
settings: {
jsdoc: {
mode: 'typescript',
},
react: {
// If this is set to 'detect', ESLint will import React in order to find
// its version. Because we run ESLint in the build system under LavaMoat,
// this means that detecting the React version requires a LavaMoat policy
// for all of React, in the build system. That's a no-go, so we grab it
// from React's package.json.
version: reactVersion,
},
},
};

23
.eslintrc.jsdoc.js Normal file
View File

@ -0,0 +1,23 @@
module.exports = {
// Note that jsdoc is already in the `plugins` array thanks to
// @metamask/eslint-config — this just extends the config there
rules: {
// Allow tag `jest-environment` to work around Jest bug
// See: https://github.com/facebook/jest/issues/7780
'jsdoc/check-tag-names': ['error', { definedTags: ['jest-environment'] }],
'jsdoc/match-description': 'off',
'jsdoc/require-description': 'off',
'jsdoc/require-jsdoc': 'off',
'jsdoc/require-param-description': 'off',
'jsdoc/require-param-type': 'off',
'jsdoc/require-returns-description': 'off',
'jsdoc/require-returns-type': 'off',
'jsdoc/require-returns': 'off',
'jsdoc/valid-types': 'off',
},
settings: {
jsdoc: {
mode: 'typescript',
},
},
};

10
.eslintrc.node.js Normal file
View File

@ -0,0 +1,10 @@
module.exports = {
extends: ['@metamask/eslint-config-nodejs'],
rules: {
'node/no-process-env': 'off',
// TODO: re-enable these rules
'node/no-sync': 'off',
'node/no-unpublished-import': 'off',
'node/no-unpublished-require': 'off',
},
};

View File

@ -89,6 +89,7 @@ body:
- Trezor
- Keystone
- GridPlus Lattice1
- AirGap Vault
- Other (please elaborate in the "Additional Context" section)
- type: textarea
id: additional

View File

@ -10,3 +10,4 @@ app/vendor/**
.vscode/**
test/e2e/send-eth-with-private-key-test/**
*.scss
development/chromereload.js

View File

@ -0,0 +1,201 @@
import { Meta } from '@storybook/addon-docs';
import ActionaleMessage from '../ui/components/ui/actionable-message';
import designTokenDiagramImage from './images/design.token.graphic.svg';
<Meta title="Design Tokens / Color" />
# Color
Color is used to express style and communicate meaning.
<ActionaleMessage
type="warning"
message="We are in the process of consolidating all of our colors, making them accessible and enabling theming. Many of the colors used throughout the codebase are deprecated please follow the guide below to ensure you are using the correct colors when building MetaMask UI"
/>
<br />
## Design tokens
We are importing design tokens as CSS variables from [@metamask/design-tokens](https://github.com/MetaMask/design-tokens) repo to help consolidate colors and enable theming across all MetaMask products.
### Token tiers
We follow a 3 tiered system for color design tokens and css variables.
<div
style={{
textAlign: 'center',
backgroundColor: 'var(--color-background-alternative)',
padding: 32,
}}
>
<img width="80%" src={designTokenDiagramImage} />
</div>
<br />
<br />
### **Brand colors** (tier 1)
These colors **SHOULD NOT** be used in your styles directly. They are used as a reference for the [theme colors](#theme-colors-tier-2). Brand colors should just keep track of every color used in our app.
#### Example of brand color css variables
```css
/** !!!DO NOT USE BRAND COLORS DIRECTLY IN YOUR CODE!!! */
var(--brand-colors-white-white000)
var(--brand-colors-white-white010)
var(--brand-colors-grey-grey030)
```
### **Theme colors** (tier 2)
Theme colors are color agnostic, semantically neutral and theme compatible design tokens that you can use in your code and styles. Please refer to the description of each token for it's intended purpose in [@metamask/design-tokens](https://github.com/MetaMask/design-tokens/blob/main/src/figma/tokens.json#L329-L554).
#### Example of theme color css variables
```css
/** Backgrounds */
var(--color-background-default)
var(--color-background-alternative)
/** Text */
var(--color-text-default)
var(--color-text-alternative)
var(--color-text-muted)
/** Icons */
var(--color-icon-default)
var(--color-icon-muted)
/** Borders */
var(--color-border-default)
var(--color-border-muted)
/** Overlays */
var(--color-overlay-default)
var(--color-overlay-inverse)
/** User Actions */
var(--color-primary-default)
var(--color-primary-alternative)
var(--color-primary-muted)
var(--color-primary-inverse)
var(--color-primary-disabled)
var(--color-secondary-default)
var(--color-secondary-alternative)
var(--color-secondary-muted)
var(--color-secondary-inverse)
var(--color-secondary-disabled)
/** States */
/** Error */
var(--color-error-default)
var(--color-error-alternative)
var(--color-error-muted)
var(--color-error-inverse)
var(--color-error-disabled)
/** Warning */
var(--color-warning-default)
var(--color-warning-alternative)
var(--color-warning-muted)
var(--color-warning-inverse)
var(--color-warning-disabled)
/** Success */
var(--color-success-default)
var(--color-success-alternative)
var(--color-success-muted)
var(--color-success-inverse)
var(--color-success-disabled)
/** Info */
var(--color-info-default)
var(--color-info-alternative)
var(--color-info-muted)
var(--color-info-inverse)
var(--color-info-disabled)
```
### **Component colors** (tier 3)
Another level of abstraction is component tier colors that you can define at the top of your styles and use at the component specific level.
```scss
.button {
--color-background-primary: var(--color-primary-default);
--color-text-primary: var(--color-primary-inverse);
--color-border-primary: var(--color-primary-default);
--color-background-primary-hover: var(--color-primary-alternative);
--color-border-primary-hover: var(--color-primary-alternative);
.btn-primary {
background-color: var(--color-background-primary);
color: var(--color-text-primary);
border: 1px solid var(--color-border-primary);
&:hover {
background-color: var(--color-background-primary-hover);
border: 1px solid var(--color-border-primary-hover);
}
/** btn-primary css continued... */
}
}
```
## Takeaways
- Do not use static HEX values in your code. Use the [theme colors](#theme-colors-tier-2). If one does not exist for your use case ask the designer or [create an issue](https://github.com/MetaMask/metamask-extension/issues/new) and tag it with a `design-system` label.
- Make sure the design token you are using is for it's intended purpose. Please refer to the description of each token in [@metamask/design-tokens](https://github.com/MetaMask/design-tokens/blob/main/src/figma/tokens.json#L329-L554).
### ❌ Don't do this
Don't use static hex values or brand color tokens in your code.
```css
/**
* Don't do this
* Static hex values create inconsistency and will break UI when using dark mode
**/
.card {
background-color: #ffffff;
color: #24272a;
}
/**
* Don't do this
* Not theme compatible and will break UI when using dark theme
**/
.card {
background-color: var(--brand-colors-white-white000);
color: var(--brand-colors-grey-grey800);
}
```
### ✅ Do this
Do use component tiered and [theme colors](#theme-colors-tier-2) in your styles and code
```css
.card {
--color-background: var(--color-background-default);
--color-text: var(--color-text-default);
background-color: var(--color-background);
color: var(--color-text);
}
```
<br />
## References
- [@metamask/design-tokens](https://github.com/MetaMask/design-tokens)
- [Figma brand colors library](https://www.figma.com/file/cBAUPFMnbv6tHR1J8KvBI2/Brand-Colors?node-id=0%3A1) (internal use only)
- [Figma theme colors library](https://www.figma.com/file/kdFzEC7xzSNw7cXteqgzDW/Light-Theme-Colors?node-id=0%3A1) (internal use only)
- [Figma dark theme colors library](https://www.figma.com/file/rLKsoqpjyoKauYnFDcBIbO/Dark-Theme-Colors?node-id=0%3A1) (internal use only)

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -14,6 +14,7 @@ module.exports = {
'@storybook/addon-a11y',
'@storybook/addon-knobs',
'./i18n-party-addon/register.js',
'storybook-dark-mode',
],
// Uses babel.config.js settings and prevents "Missing class properties transform" error
babel: async (options) => ({ overrides: options.overrides }),

View File

@ -1,12 +1,10 @@
// .storybook/YourTheme.js
import { create } from '@storybook/theming';
import logo from '../app/images/logo/metamask-logo-horizontal.svg';
export default create({
base: 'light',
brandTitle: 'MetaMask Storybook',
brandImage: logo,
// Typography
fontBase: 'Euclid, Roboto, Helvetica, Arial, sans-serif',

View File

@ -1,4 +1,4 @@
import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { addDecorator, addParameters } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { Provider } from 'react-redux';
@ -13,13 +13,14 @@ import { Router } from 'react-router-dom';
import { createBrowserHistory } from 'history';
import { _setBackgroundConnection } from '../ui/store/actions';
import MetaMaskStorybookTheme from './metamask-storybook-theme';
import addons from '@storybook/addons';
addParameters({
backgrounds: {
default: 'light',
default: 'default',
values: [
{ name: 'light', value: '#FFFFFF' },
{ name: 'dark', value: '#333333' },
{ name: 'default', value: 'var(--color-background-default)' },
{ name: 'alternative', value: 'var(--color-background-alternative)' },
],
},
docs: {
@ -27,7 +28,13 @@ addParameters({
},
options: {
storySort: {
order: ['Getting Started', 'Components', ['UI', 'App'], 'Pages'],
order: [
'Getting Started',
'Design Tokens',
'Components',
['UI', 'App'],
'Pages',
],
},
},
});
@ -66,8 +73,29 @@ const proxiedBackground = new Proxy(
_setBackgroundConnection(proxiedBackground);
const metamaskDecorator = (story, context) => {
const [isDark, setDark] = useState(false);
const channel = addons.getChannel();
const currentLocale = context.globals.locale;
const current = allLocales[currentLocale];
useEffect(() => {
channel.on('DARK_MODE', setDark);
return () => channel.off('DARK_MODE', setDark);
}, [channel, setDark]);
useEffect(() => {
const currentTheme = document.documentElement.getAttribute('data-theme');
if (!currentTheme)
document.documentElement.setAttribute('data-theme', 'light');
if (currentTheme === 'light' && isDark) {
document.documentElement.setAttribute('data-theme', 'dark');
} else if (currentTheme === 'dark' && !isDark) {
document.documentElement.setAttribute('data-theme', 'light');
}
}, [isDark]);
return (
<Provider store={store}>
<Router history={history}>

View File

@ -750,9 +750,6 @@
"restore": {
"message": "እነበረበት መልስ"
},
"restoreAccountWithSeed": {
"message": "መለያዎን በዘር ሐረግ ወደነበረበት ይመልሱ"
},
"revealSeedWords": {
"message": "የዘር ቃላትን ይግለጹ"
},

View File

@ -766,9 +766,6 @@
"restore": {
"message": "استعادة"
},
"restoreAccountWithSeed": {
"message": "قم باستعادة حسابك بواسطة عبارة الأمان"
},
"revealSeedWords": {
"message": "كشف كلمات عبارات الأمان"
},

View File

@ -761,9 +761,6 @@
"restore": {
"message": "Възстановяване"
},
"restoreAccountWithSeed": {
"message": "Възстановете акаунта си с фраза зародиш"
},
"revealSeedWords": {
"message": "Разкрий думите зародиш"
},

View File

@ -765,9 +765,6 @@
"restore": {
"message": "পুনরুদ্ধার করুন"
},
"restoreAccountWithSeed": {
"message": "সীড ফ্রেজ দিয়ে আপনার অ্যাকাউন্ট রিস্টোর করুন"
},
"revealSeedWords": {
"message": "সীড শব্দগুলি প্রকাশ করুন"
},

View File

@ -743,9 +743,6 @@
"restore": {
"message": "Restaura"
},
"restoreAccountWithSeed": {
"message": "Restaura el teu compte amb Frase de Recuperació"
},
"revealSeedWords": {
"message": "Revelar Paraules de Recuperació"
},

View File

@ -746,9 +746,6 @@
"restore": {
"message": "Gendan"
},
"restoreAccountWithSeed": {
"message": "Gendan din konto med Seed-sætning"
},
"revealSeedWords": {
"message": "Vis Seedord"
},

View File

@ -1279,19 +1279,12 @@
"importAccountError": {
"message": "Fehler beim Importieren des Kontos."
},
"importAccountLinkText": {
"message": "mit einer Geheime Wiederherstellungsphrase importieren"
},
"importAccountMsg": {
"message": " Importierte Accounts werden nicht mit der Seed-Wörterfolge deines ursprünglichen MetaMask Accounts verknüpft. Erfahre mehr über importierte Accounts."
},
"importAccountSeedPhrase": {
"message": "Ein Konto mit einem Seed-Schlüssel importieren"
},
"importAccountText": {
"message": "oder $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Geben Sie die Geheime Wiederherstellungsphrase (alias Seed Phrase) ein, die Sie beim Erstellen Ihrer Wallet erhalten haben. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1532,7 +1525,7 @@
"message": "niedrig"
},
"mainnet": {
"message": "Athereum Hauptnetz"
"message": "Ethereum Hauptnetz"
},
"makeAnotherSwap": {
"message": "Eine neue Wallet erstellen"
@ -1745,9 +1738,6 @@
"message": "Konto $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Sammelobjekt wurde nicht hinzugefügt, weil: $1"
},
"newCollectibleAddedMessage": {
"message": "Sammelobjekt wurde erfolgreich hinzugefügt!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Wiederherstellen"
},
"restoreAccountWithSeed": {
"message": "Ihr Konto mit mnemonischer Phrase wiederherstellen"
},
"restoreWalletPreferences": {
"message": "$1 hat ein Backup Ihrer Daten gefunden. Möchten Sie die Präferenzen Ihrer Wallet wiederherstellen?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Nur das erste Konto auf dieser Wallet wird automatisch geladen. Wenn Sie nach Abschluss dieses Vorgangs weitere Konten hinzufügen möchten, klicken Sie auf das Dropdown-Menü und wählen Sie dann Konto erstellen."
},
"secretPhraseWarning": {
"message": "Wenn Sie eine andere geheime Wiederherstellungsphrase verwenden, werden Ihre aktuelle Wallet, Ihre Konten und Vermögenswerte dauerhaft aus dieser App entfernt. Diese Aktion kann nicht rückgängig gemacht werden."
},
"secretRecoveryPhrase": {
"message": "Geheime Wiederherstellungsphrase"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Σφάλμα εισαγωγής λογαριασμού."
},
"importAccountLinkText": {
"message": "εισαγωγή χρησιμοποιώντας τη Μυστική Φράση Ανάκτησης"
},
"importAccountMsg": {
"message": "Οι λογαριασμοί που εισάγονται δεν θα συσχετιστούν με τη Μυστική Φράση Ανάκτησης του λογαριασμού σας MetaTask που δημιουργήθηκε αρχικά. Μάθετε περισσότερα για τους εισηγμένους λογαριασμούς"
},
"importAccountSeedPhrase": {
"message": "Εισαγωγή λογαριασμού με Μυστική Φράση Ανάκτησης"
},
"importAccountText": {
"message": "ή $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Εισάγετε τη Μυστική Φράση Ανάκτησης (δλδ Seed Phrase) που σας δόθηκε όταν δημιουργήσατε το πορτοφόλι σας. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Λογαριασμός $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Το Collectible δεν προστέθηκε επειδή: $1"
},
"newCollectibleAddedMessage": {
"message": "Το Collectible προστέθηκε με επιτυχία!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Επαναφορά"
},
"restoreAccountWithSeed": {
"message": "Επαναφέρετε τον Λογαριασμό σας με Φράση Επαναφοράς"
},
"restoreWalletPreferences": {
"message": "Βρέθηκε ένα αντίγραφο ασφαλείας των δεδομένων σας από το $1. Θα θέλατε να επαναφέρετε τις προτιμήσεις του πορτοφολιού σας;",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Μόνο ο πρώτος λογαριασμός σε αυτό το πορτοφόλι θα φορτώσει αυτόματα. Μετά την ολοκλήρωση αυτής της διαδικασίας, για να προσθέσετε επιπλέον λογαριασμούς, κάντε κλικ στο αναπτυσσόμενο μενού και, στη συνέχεια, επιλέξτε Δημιουργία Λογαριασμού."
},
"secretPhraseWarning": {
"message": "Αν κάνετε επαναφορά χρησιμοποιώντας μια άλλη Μυστική Φράση Ανάκτησης, το τρέχον πορτοφόλι, οι λογαριασμοί και τα περιουσιακά στοιχεία σας θα αφαιρεθούν από αυτή την εφαρμογή μόνιμα. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί."
},
"secretRecoveryPhrase": {
"message": "Μυστική Φράση Ανάκτησης"
},

View File

@ -42,7 +42,7 @@
"message": "QR-based HW Wallet"
},
"QRHardwareWalletSteps2Description": {
"message": "AirGap Vault & Ngrave (Coming Soon)"
"message": "Ngrave (Coming Soon)"
},
"about": {
"message": "About"
@ -58,6 +58,10 @@
"message": "$1 may access and spend up to this max amount",
"description": "$1 is the url of the site requesting ability to spend"
},
"accessAndSpendNoticeNFT": {
"message": "$1 may access and spend this asset",
"description": "$1 is the url of the site requesting ability to spend"
},
"accessingYourCamera": {
"message": "Accessing your camera..."
},
@ -98,6 +102,9 @@
"addANetwork": {
"message": "Add a network"
},
"addANetworkManually": {
"message": "Add a network manually"
},
"addANickname": {
"message": "Add a nickname"
},
@ -137,6 +144,9 @@
"addFriendsAndAddresses": {
"message": "Add friends and addresses you trust"
},
"addFromAListOfPopularNetworks": {
"message": "Add from a list of popular networks or add a network manually. Only interact with the entities you trust."
},
"addMemo": {
"message": "Add memo"
},
@ -191,6 +201,12 @@
"aggregatorFeeCost": {
"message": "Aggregator network fee"
},
"airgapVault": {
"message": "AirGap Vault"
},
"airgapVaultTutorial": {
"message": " (Tutorials)"
},
"alertDisableTooltip": {
"message": "This can be changed in \"Settings > Alerts\""
},
@ -267,6 +283,9 @@
"approvedAmountWithColon": {
"message": "Approved amount:"
},
"approvedAsset": {
"message": "Approved asset"
},
"areYouDeveloper": {
"message": "Are you a developer?"
},
@ -400,6 +419,13 @@
"message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. $1 deposits into your MetaMask account.",
"description": "$1 represents the cypto symbol to be purchased"
},
"buyEth": {
"message": "Buy ETH"
},
"buyOther": {
"message": "Buy $1 or deposit from another account.",
"description": "$1 is a token symbol"
},
"buyWithWyre": {
"message": "Buy ETH with Wyre"
},
@ -467,6 +493,9 @@
"close": {
"message": "Close"
},
"collectibleAddFailedMessage": {
"message": "NFT cant be added as the ownership details do not match. Make sure you have entered correct information."
},
"collectibleAddressError": {
"message": "This token is an NFT. Add on the $1",
"description": "$1 is a clickable link with text defined by the 'importNFTPage' key"
@ -612,6 +641,9 @@
"convertTokenToNFTDescription": {
"message": "We've detected that this asset is an NFT. Metamask now has full native support for NFTs. Would you like to remove it from your token list and add it as an NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Weve detected that this asset has been added as an NFT. Would you like to remove it from your token list?"
},
"copiedExclamation": {
"message": "Copied!"
},
@ -691,6 +723,9 @@
"customGasSubTitle": {
"message": "Increasing fee may decrease processing times, but it is not guaranteed."
},
"customNetworks": {
"message": "Custom networks"
},
"customSpendLimit": {
"message": "Custom Spend Limit"
},
@ -714,6 +749,9 @@
"message": "$1 has recommended this price.",
"description": "$1 represents the Dapp's origin"
},
"darkTheme": {
"message": "Dark"
},
"data": {
"message": "Data"
},
@ -749,6 +787,9 @@
"decryptRequest": {
"message": "Decrypt request"
},
"defaultTheme": {
"message": "Default"
},
"delete": {
"message": "Delete"
},
@ -814,6 +855,9 @@
"dontShowThisAgain": {
"message": "Don't show this again"
},
"downArrow": {
"message": "down arrow"
},
"downloadGoogleChrome": {
"message": "Download Google Chrome"
},
@ -989,7 +1033,7 @@
"message": "Use OpenSea's API to fetch NFT data. NFT auto-detection relies on OpenSea's API, and will not be available when this is turned off."
},
"enableSmartTransactions": {
"message": "Enable smart transactions"
"message": "Enable Smart Transactions"
},
"enableToken": {
"message": "enable $1",
@ -1206,6 +1250,9 @@
"forgetDevice": {
"message": "Forget this device"
},
"forgotPassword": {
"message": "Forgot password?"
},
"from": {
"message": "From"
},
@ -1334,6 +1381,9 @@
"goerli": {
"message": "Goerli Test Network"
},
"gotIt": {
"message": "Got it!"
},
"grantedToWithColon": {
"message": "Granted to:"
},
@ -1372,6 +1422,9 @@
"hide": {
"message": "Hide"
},
"hideSeedPhrase": {
"message": "Hide seed phrase"
},
"hideToken": {
"message": "Hide token"
},
@ -1408,19 +1461,12 @@
"importAccountError": {
"message": "Error importing account."
},
"importAccountLinkText": {
"message": "import using Secret Recovery Phrase"
},
"importAccountMsg": {
"message": "Imported accounts will not be associated with your originally created MetaMask account Secret Recovery Phrase. Learn more about imported accounts"
},
"importAccountSeedPhrase": {
"message": "Import a wallet with Secret Recovery Phrase"
},
"importAccountText": {
"message": "or $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Enter your Secret Recovery Phrase (aka Seed Phrase) that you were given when you created your wallet. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1478,6 +1524,10 @@
"insufficientBalance": {
"message": "Insufficient balance."
},
"insufficientCurrency": {
"message": "You do not have enough $1 in your account to pay for transaction fees on $2 network.",
"description": "$1 is currency, $2 is network"
},
"insufficientFunds": {
"message": "Insufficient funds."
},
@ -1647,6 +1697,9 @@
"letsGoSetUp": {
"message": "Yes, lets get set up!"
},
"levelArrow": {
"message": "level arrow"
},
"likeToImportTokens": {
"message": "Would you like to import these tokens?"
},
@ -1677,6 +1730,10 @@
"lockTimeTooGreat": {
"message": "Lock time is too great"
},
"logo": {
"message": "$1 logo",
"description": "$1 is the name of the ticker"
},
"low": {
"message": "Low"
},
@ -1815,6 +1872,12 @@
"missingNFT": {
"message": "Don't see your NFT?"
},
"missingSetting": {
"message": "Can't find a setting?"
},
"missingSettingRequest": {
"message": "Request here"
},
"missingToken": {
"message": "Don't see your token?"
},
@ -1926,9 +1989,6 @@
"message": "Account $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Collectible was not added because: $1"
},
"newCollectibleAddedMessage": {
"message": "Collectible was successfully added!"
},
@ -1948,7 +2008,7 @@
"message": "“$1” was successfully added!"
},
"newPassword": {
"message": "New password (min 8 chars)"
"message": "New password (8 characters min)"
},
"newToMetaMask": {
"message": "New to MetaMask?"
@ -2199,6 +2259,9 @@
"onlyConnectTrust": {
"message": "Only connect with sites you trust."
},
"onlyInteractWith": {
"message": "Only interact with entities you trust."
},
"openFullScreenForLedgerWebHid": {
"message": "Open MetaMask in full screen to connect your ledger via WebHID.",
"description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid."
@ -2215,6 +2278,9 @@
"or": {
"message": "or"
},
"orDeposit": {
"message": "or deposit from another account."
},
"origin": {
"message": "Origin"
},
@ -2236,11 +2302,18 @@
"passwordSetupDetails": {
"message": "This password will unlock your MetaMask wallet only on this device. MetaMask can not recover this password."
},
"passwordStrength": {
"message": "Password strength: $1",
"description": "Return password strength to the user when user wants to create password."
},
"passwordStrengthDescription": {
"message": "A strong password can improve the security of your wallet should your device be stolen or compromised."
},
"passwordTermsWarning": {
"message": "I understand that MetaMask cannot recover this password for me. $1"
},
"passwordsDontMatch": {
"message": "Passwords Don't Match"
"message": "Passwords don't match"
},
"pastePrivateKey": {
"message": "Enter your private key string here:",
@ -2299,6 +2372,9 @@
"personalAddressDetected": {
"message": "Personal address detected. Input the token contract address."
},
"pleaseConfirm": {
"message": "Please confirm"
},
"plusXMore": {
"message": "+ $1 more",
"description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items"
@ -2356,6 +2432,12 @@
"queued": {
"message": "Queued"
},
"reAddAccounts": {
"message": "re-add any other accounts"
},
"reAdded": {
"message": "re-added"
},
"readdToken": {
"message": "You can add this token back in the future by going to “Import token” in your accounts options menu."
},
@ -2434,6 +2516,10 @@
"removeSnap": {
"message": "Remove Snap"
},
"removeSnapConfirmation": {
"message": "Are you sure you want to remove $1?",
"description": "$1 represents the name of the snap"
},
"removeSnapDescription": {
"message": "This action will delete the snap, its data and revoke your given permissions."
},
@ -2455,12 +2541,21 @@
"resetAccountDescription": {
"message": "Resetting your account will clear your transaction history. This will not change the balances in your accounts or require you to re-enter your Secret Recovery Phrase."
},
"resetWallet": {
"message": "Reset Wallet"
},
"resetWalletSubHeader": {
"message": "MetaMask does not keep a copy of your password. If youre having trouble unlocking your account, you will need to reset your wallet. You can do this by providing the Secret Recovery Phrase you used when you set up your wallet."
},
"resetWalletUsingSRP": {
"message": "This action will delete your current wallet and Secret Recovery Phrase from this device, along with the list of accounts youve curated. After resetting with a Secret Recovery Phrase, youll see a list of accounts based on the Secret Recovery Phrase you use to reset. This new list will automatically include accounts that have a balance. Youll also be able to $1 created previously. Custom accounts that youve imported will need to be $2, and any custom tokens youve added to an account will need to be $3 as well."
},
"resetWalletWarning": {
"message": "Make sure youre using the correct Secret Recovery Phrase before proceeding. You will not be able to undo this."
},
"restore": {
"message": "Restore"
},
"restoreAccountWithSeed": {
"message": "Restore your Account with Secret Recovery Phrase"
},
"restoreWalletPreferences": {
"message": "A backup of your data from $1 has been found. Would you like to restore your wallet preferences?",
"description": "$1 is the date at which the data was backed up"
@ -2483,6 +2578,9 @@
"revealSeedWordsWarningTitle": {
"message": "DO NOT share this phrase with anyone!"
},
"revealTheSeedPhrase": {
"message": "Reveal seed phrase"
},
"rinkeby": {
"message": "Rinkeby Test Network"
},
@ -2516,6 +2614,9 @@
"searchResults": {
"message": "Search Results"
},
"searchSettings": {
"message": "Search in settings"
},
"searchTokens": {
"message": "Search Tokens"
},
@ -2528,9 +2629,6 @@
"secretPhrase": {
"message": "Only the first account on this wallet will auto load. After completing this process, to add additional accounts, click the drop down menu, then select Create Account."
},
"secretPhraseWarning": {
"message": "If you restore using another Secret Recovery Phrase, your current wallet, accounts and assets will be removed from this app permanently. This action cannot be undone."
},
"secretRecoveryPhrase": {
"message": "Secret Recovery Phrase"
},
@ -2553,22 +2651,22 @@
"message": "Secure my wallet (recommended)"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Write down and store in multiple secret places."
"message": "Write down and store in multiple secret places"
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Save in a password manager"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Store in a safe-deposit box."
"message": "Store in a safe deposit box"
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Store in a bank vault."
"message": "Store in a bank vault"
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Your Secret Recovery Phrase is a 12-word phrase that is the “master key” to your wallet and your funds"
},
"seedPhraseIntroSidebarCopyThree": {
"message": "If someone asks for your recovery phrase they are likely trying to scam you and steal your wallet funds"
"message": "If someone asks for your recovery phrase they are likely trying to scam you and steal your wallet funds."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Never, ever share your Secret Recovery Phrase, not even with MetaMask!"
@ -2668,6 +2766,9 @@
"settings": {
"message": "Settings"
},
"settingsSearchMatchingNotFound": {
"message": "No matching results found"
},
"show": {
"message": "Show"
},
@ -2889,20 +2990,23 @@
"storePhrase": {
"message": "Store this phrase in a password manager like 1Password."
},
"strong": {
"message": "Strong"
},
"stxAreHere": {
"message": "Smart transactions are here!"
"message": "Smart Transactions are here!"
},
"stxBenefit1": {
"message": "Decrease transaction costs"
"message": "Minimize transaction costs"
},
"stxBenefit2": {
"message": "Reduce failures & minimize costs"
"message": "Reduce transaction failures"
},
"stxBenefit3": {
"message": "Protect from front-running"
"message": "Eliminate stuck transactions"
},
"stxBenefit4": {
"message": "Eliminate stuck transactions"
"message": "Prevent front-running"
},
"stxCancelled": {
"message": "Swap would have failed"
@ -2914,7 +3018,7 @@
"message": "Try your swap again. Well be here to protect you against similar risks next time."
},
"stxDescription": {
"message": "Smart transactions use MetaMask smart contracts to simulate transactions before submitting in order to..."
"message": "MetaMask Swaps just got a whole lot smarter! Enabling Smart Transactions will allow MetaMask to programmatically optimize your Swap to help:"
},
"stxFailure": {
"message": "Swap failed"
@ -2936,7 +3040,7 @@
"message": "Privately submitting the Swap..."
},
"stxSubDescription": {
"message": "Enabling allows MetaMask to simulate transactions, proactively cancel bad transactions and sign MetaMask Swaps transactions for you."
"message": "* Smart Transactions will attempt to submit your transaction privately, multiple times. If all attempts fail, the transaction will be broadcast publicly to ensure your Swap successfully goes through."
},
"stxSuccess": {
"message": "Swap complete!"
@ -3367,6 +3471,12 @@
"testFaucet": {
"message": "Test Faucet"
},
"theme": {
"message": "Theme"
},
"themeDescription": {
"message": "Choose your preferred MetaMask theme."
},
"thisWillCreate": {
"message": "This will create a new wallet and Secret Recovery Phrase"
},
@ -3606,6 +3716,12 @@
"message": "Sending collectible (ERC-721) tokens is not currently supported",
"description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending"
},
"unverifiedContractAddressMessage": {
"message": "We cannot verify this contract. Make sure you trust this address."
},
"upArrow": {
"message": "up arrow"
},
"updatedWithDate": {
"message": "Updated $1"
},
@ -3633,6 +3749,9 @@
"useTokenDetectionDescription": {
"message": "We use third-party APIs to detect and display new tokens sent to your wallet. Turn off if you dont want MetaMask to pull data from those services."
},
"useTokenDetectionPrivacyDesc": {
"message": "Automatically displaying tokens sent to your account involves communication with third party servers to fetch tokens images. Those serves will have access to your IP address."
},
"usedByClients": {
"message": "Used by a variety of different clients"
},
@ -3710,6 +3829,9 @@
"walletCreationSuccessTitle": {
"message": "Wallet creation successful"
},
"weak": {
"message": "Weak"
},
"web3ShimUsageNotification": {
"message": "We noticed that the current website tried to use the removed window.web3 API. If the site appears to be broken, please click $1 for more information.",
"description": "$1 is a clickable link."

View File

@ -826,19 +826,12 @@
"importAccount": {
"message": "Importar cuenta"
},
"importAccountLinkText": {
"message": "importar con la frase secreta de recuperación"
},
"importAccountMsg": {
"message": " Las cuentas importadas no se asociarán con la frase secreta de recuperación de la cuenta original de MetaMask. Más información sobre las cuentas importadas "
},
"importAccountSeedPhrase": {
"message": "Importar una cuenta con la frase secreta de recuperación"
},
"importAccountText": {
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "¿Desea importar el token?"
},
@ -1421,9 +1414,6 @@
"restore": {
"message": "Restaurar"
},
"restoreAccountWithSeed": {
"message": "Restaurar la cuenta con la frase secreta de recuperación"
},
"restoreWalletPreferences": {
"message": "Se encontró una copia de seguridad de los datos de $1. ¿Desea restaurar las preferencias de cartera?",
"description": "$1 is the date at which the data was backed up"

View File

@ -1322,19 +1322,12 @@
"importAccountError": {
"message": "Error al importar la cuenta."
},
"importAccountLinkText": {
"message": "importar con la frase secreta de recuperación"
},
"importAccountMsg": {
"message": "Las cuentas importadas no se asociarán con la frase secreta de recuperación de la cuenta original de MetaMask. Aprenda más sobre las cuentas importadas"
},
"importAccountSeedPhrase": {
"message": "Importar una cartera con la frase secreta de recuperación"
},
"importAccountText": {
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Ingrese su frase secreta de recuperación (también conocida como Frase Semilla) que recibió al crear su cartera. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1794,9 +1787,6 @@
"message": "Cuenta $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "No se añadió el coleccionable porque: $1"
},
"newCollectibleAddedMessage": {
"message": "¡El coleccionable fue añadido con éxito!"
},
@ -2278,9 +2268,6 @@
"restore": {
"message": "Restaurar"
},
"restoreAccountWithSeed": {
"message": "Restaurar la cuenta con la frase secreta de recuperación"
},
"restoreWalletPreferences": {
"message": "Se encontró una copia de seguridad de los datos de $1. ¿Desea restaurar las preferencias de cartera?",
"description": "$1 is the date at which the data was backed up"
@ -2346,10 +2333,7 @@
"message": "ADVERTENCIA: No revele su frase de respaldo. Cualquier persona que tenga esta frase puede robarle los ethers."
},
"secretPhrase": {
"message": "Solo la primera cuenta de esta cartera se cargará automáticamente. Después de llevar a cabo este proceso, para agregar cuentas adicionales haga clic en el menú desplegable y luego seleccione Crear cuenta."
},
"secretPhraseWarning": {
"message": "Si restablece utilizando otra frase secreta de recuperación, su cartera actual, sus cuentas y sus activos se eliminarán de esta aplicación de forma permanente. Esta acción es irreversible."
"message": "Ingrese su frase secreta aquí para restaurar su bóveda."
},
"secretRecoveryPhrase": {
"message": "Frase secreta de recuperación"

View File

@ -755,9 +755,6 @@
"restore": {
"message": "Taasta"
},
"restoreAccountWithSeed": {
"message": "Taastage konto seemnefraasi abil"
},
"revealSeedWords": {
"message": "Kuva seemnesõnu"
},

View File

@ -765,9 +765,6 @@
"restore": {
"message": "بازیابی"
},
"restoreAccountWithSeed": {
"message": "حساب تان را با عبارت بازیاب، بازیابی کنید"
},
"revealSeedWords": {
"message": "کلمات بازیاب را آشکار کنید"
},

View File

@ -762,9 +762,6 @@
"restore": {
"message": "Palauta"
},
"restoreAccountWithSeed": {
"message": "Palauta tilisi käyttäen salaustekstiä (seed phrase)"
},
"revealSeedWords": {
"message": "Paljasta salaussanat"
},

View File

@ -689,9 +689,6 @@
"restore": {
"message": "Ipanumbalik"
},
"restoreAccountWithSeed": {
"message": "I-restore ang iyong Account gamit ang Seed Phrase"
},
"revealSeedWords": {
"message": "Ipakita ang Seed Words"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Erreur dimportation de compte."
},
"importAccountLinkText": {
"message": "importer en utilisant la phrase secrète de récupération"
},
"importAccountMsg": {
"message": "Les comptes importés ne seront pas associés à la phrase secrète de récupération que vous avez créée au départ dans MetaMask. En savoir plus sur les comptes importés"
},
"importAccountSeedPhrase": {
"message": "Importez un compte avec une phrase mnémotechnique"
},
"importAccountText": {
"message": "ou $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Saisissez la phrase secrète de récupération (aussi appelée «phrase mnémonique» ou «seed») qui vous a été attribuée lors de la création de votre portefeuille. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Compte $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Le collectible na pas été ajouté, car: $1"
},
"newCollectibleAddedMessage": {
"message": "Le collectible a été ajouté avec succès!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Restaurer"
},
"restoreAccountWithSeed": {
"message": "Restaurer votre compte avec une phrase Seed."
},
"restoreWalletPreferences": {
"message": "Une sauvegarde de vos données de $1 a été trouvée. Voulez-vous restaurer vos préférences de portefeuille?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Seul le premier compte de ce portefeuille sera chargé automatiquement. Après avoir terminé ce processus, pour ajouter des comptes supplémentaires, cliquez sur le menu déroulant, puis sélectionnez Créer un compte."
},
"secretPhraseWarning": {
"message": "Si vous effectuez une restauration à laide dune autre phrase secrète de récupération, votre portefeuille, vos comptes et vos actifs actuels seront définitivement supprimés de cette application. Cette action est irréversible."
},
"secretRecoveryPhrase": {
"message": "Phrase secrète de récupération"
},

View File

@ -762,9 +762,6 @@
"restore": {
"message": "שחזר"
},
"restoreAccountWithSeed": {
"message": "שחזר את חשבונך באמצעות צירוף הגרעין"
},
"revealSeedWords": {
"message": "גלה מילות Seed"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "खाता आयात करने में त्रुटि।"
},
"importAccountLinkText": {
"message": "गुप्त रिकवरी फ्रेज का उपयोग करके आयात करें"
},
"importAccountMsg": {
"message": "आयातित खाते आपके मूल रूप से बनाए गए MetaMask खाते के गुप्त रिकवरी फ्रेज से संबद्ध नहीं होंगे। आयातित खातों के बारे में अधिक जानें"
},
"importAccountSeedPhrase": {
"message": "गुप्त रिकवरी फ्रेज के साथ एक खाता आयात करें"
},
"importAccountText": {
"message": "या $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "अपना सीक्रेट रिकवरी फ्रेज (उर्फ सीड फ्रेज) दर्ज करें जो आपको अपना वॉलेट बनाने पर दिया गया था। $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "खाता $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "संग्रहणीय नहीं जोड़ा गया था क्योंकि: $1"
},
"newCollectibleAddedMessage": {
"message": "संग्रहणीय सफलतापूर्वक जोड़ा गया!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "पुनर्स्थापित करें"
},
"restoreAccountWithSeed": {
"message": "गुप्त रिकवरी फ्रेज के साथ अपने खाते को पुनर्स्थापित करें"
},
"restoreWalletPreferences": {
"message": "$1 से आपके डेटा का बैकअप मिला है। क्या आप अपनी वॉलेट वरीयताओं को पुनर्स्थापित करना चाहते हैं?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "इस वॉलेट पर केवल पहला खाता स्वतः लोड होगा। इस प्रक्रिया को पूरा करने के बाद, अतिरिक्त खाते जोड़ने के लिए, ड्रॉप डाउन मेन्यू पर क्लिक करें, फिर खाता बनाएं चुनें।"
},
"secretPhraseWarning": {
"message": "यदि आप किसी दूसरे सीक्रेट रिकवरी फ्रेज का उपयोग कर पुनर्स्थापित करते हैं, तो इस ऐप से आपके वर्तमान वॉलेट, अकाउंट, और संपति स्थायी रूप से हटा दिये जाएंगे। यह क्रिया पूर्ववत नहीं की जा सकती।"
},
"secretRecoveryPhrase": {
"message": "सीक्रेट रिकवरी फ्रेज"
},

View File

@ -758,9 +758,6 @@
"restore": {
"message": "Vrati"
},
"restoreAccountWithSeed": {
"message": "Obnovite svoj račun početnom rečenicom"
},
"revealSeedWords": {
"message": "Otkrij početne riječi"
},

View File

@ -479,9 +479,6 @@
"restore": {
"message": "Retabli"
},
"restoreAccountWithSeed": {
"message": "Retabli kont ou avèk yo Seed Fraz"
},
"revealSeedWords": {
"message": "Revele Seed Mo Yo"
},

View File

@ -758,9 +758,6 @@
"restore": {
"message": "Visszaállítás"
},
"restoreAccountWithSeed": {
"message": "Fiók helyreállítása a seed mondat segítségével"
},
"revealSeedWords": {
"message": "Seed szavak megjelenítése"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Galat saat mengimpor akun."
},
"importAccountLinkText": {
"message": "impor menggunakan Frasa Pemulihan Rahasia"
},
"importAccountMsg": {
"message": "Akun yang diimpor tidak akan dikaitkan dengan Frasa Pemulihan Rahasia akun MetaMask yang asli dibuat. Pelajari selengkapnya tentang akun yang diimpor"
},
"importAccountSeedPhrase": {
"message": "Impor dompet dengan Frasa Pemulihan Rahasia"
},
"importAccountText": {
"message": "atau $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Masukkan Frasa Pemulihan Rahasia Anda (alias Frasa Benih) yang diberikan saat Anda membuat dompet. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Akun $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Koleksi tidak ditambahkan karena: $1"
},
"newCollectibleAddedMessage": {
"message": "Koleksi berhasil ditambahkan!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Pulihkan"
},
"restoreAccountWithSeed": {
"message": "Pulihkan Akun dengan Frasa Pemulihan Rahasia"
},
"restoreWalletPreferences": {
"message": "Cadangan data Anda dari $1 telah ditemukan. Pulihkan preferensi dompet Anda?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Hanya akun pertama di dompet ini yang akan dimuat secara otomatis. Setelah proses ini selesai, untuk menambahkan akun tambahan, klik menu drop down, lalu pilih Buat Akun."
},
"secretPhraseWarning": {
"message": "Jika Anda memulihkan menggunakan Frasa Pemulihan Rahasia lainnya, dompet, akun, dan aset Anda saat ini akan dihapus dari aplikasi ini secara permanen. Tindakan ini tidak dapat dibatalkan."
},
"secretRecoveryPhrase": {
"message": "Frasa Pemulihan Rahasia"
},

View File

@ -1152,9 +1152,6 @@
"restore": {
"message": "Ripristina"
},
"restoreAccountWithSeed": {
"message": "Ripristina Account con la Frase Seed"
},
"restoreWalletPreferences": {
"message": "È stato trovato un backup dei tuoi dati da $1. Vuoi ripristinare le preferenze del portafoglio?",
"description": "$1 is the date at which the data was backed up"

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "アカウントのインポート中にエラーが発生しました。"
},
"importAccountLinkText": {
"message": "シークレットリカバリーフレーズを使用してインポート"
},
"importAccountMsg": {
"message": " インポートされたアカウントは、最初に作成したMetaMaskアカウントのシークレットリカバリーフレーズと関連付けられません。インポートされたアカウントの詳細を表示"
},
"importAccountSeedPhrase": {
"message": "シークレットリカバリーフレーズを使用してウォレットをインポート"
},
"importAccountText": {
"message": "または$1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "ウォレットの作成時に提供されたシークレットリカバリーフレーズ (シードフレーズ) を入力してください。$1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "アカウント$1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "次の理由により、コレクティブルは追加されませんでした: $1"
},
"newCollectibleAddedMessage": {
"message": "コレクティブルが追加されました!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "復元"
},
"restoreAccountWithSeed": {
"message": "シークレットリカバリーフレーズでアカウントを復元"
},
"restoreWalletPreferences": {
"message": "$1のデータのバックアップが見つかりました。ウォレットの基本設定を復元しますか?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "このウォレットの最初のアカウントのみが自動的に読み込まれます。 このプロセスの完了後、他のアカウントを追加するには、ドロップダウンメニューをクリックし、[アカウントを作成] を選択します。"
},
"secretPhraseWarning": {
"message": "別のシークレットリカバリーフレーズを使用して復元すると、現在のウォレット、アカウント、アセットは永久にこのアプリから削除されます。この操作は元に戻せません。"
},
"secretRecoveryPhrase": {
"message": "シークレットリカバリーフレーズ"
},

View File

@ -765,9 +765,6 @@
"restore": {
"message": "ಮರುಸ್ಥಾಪನೆ"
},
"restoreAccountWithSeed": {
"message": "ಸೀಡ್ ಫ್ರೇಸ್‌ನೊಂದಿಗೆ ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಮರುಸ್ಥಾಪಿಸಿ"
},
"revealSeedWords": {
"message": "ಸೀಡ್ ವರ್ಡ್ಸ್ ಬಹಿರಂಗಪಡಿಸಿ"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "계정 가져오기 오류"
},
"importAccountLinkText": {
"message": "비밀 복구 구문을 사용해 가져오기"
},
"importAccountMsg": {
"message": "가져온 계정은 본래 생성한 MetaMask 계정 비밀 복구 구문과 연결하지 못합니다. 가져온 계정에 대해 자세히 알아보기"
},
"importAccountSeedPhrase": {
"message": "비밀 복구 구문으로 계정 가져오기"
},
"importAccountText": {
"message": "또는 $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "지갑을 만들 때 받은 비밀 복구 구문(시드 구문)을 입력하세요. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "계정 $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "다음 이유 때문에 수집 금액이 추가되지 않았습니다: $1"
},
"newCollectibleAddedMessage": {
"message": "수집이 성공적으로 추가되었습니다!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "복구"
},
"restoreAccountWithSeed": {
"message": "비밀 복구 구문으로 계정 복구"
},
"restoreWalletPreferences": {
"message": "$1의 데이터 백업이 발견되었습니다. 지갑 환경설정을 복원할까요?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "금고를 복구하려면 비밀 구문을 여기에 입력하세요."
},
"secretPhraseWarning": {
"message": "다른 비밀 복구 구문을 사용하여 복구하면 현재 지갑, 계정 및 자산이 이 앱에서 영구적으로 제거됩니다. 이 작업은 취소할 수 없습니다."
},
"secretRecoveryPhrase": {
"message": "비밀 복구 구문"
},

View File

@ -765,9 +765,6 @@
"restore": {
"message": "Atkurti"
},
"restoreAccountWithSeed": {
"message": "Atkurti paskyrą naudojant atkūrimo frazę"
},
"revealSeedWords": {
"message": "Atskleisti atkūrimo žodžius"
},

View File

@ -761,9 +761,6 @@
"restore": {
"message": "Atjaunot"
},
"restoreAccountWithSeed": {
"message": "Atjaunojiet savu kontu ar atkopšanas frāzi"
},
"revealSeedWords": {
"message": "Parādīt atkopšanas vārdus"
},

View File

@ -745,9 +745,6 @@
"restore": {
"message": "Pulihkan"
},
"restoreAccountWithSeed": {
"message": "Pulihkan Akaun anda dengan Ungkapan Benih"
},
"revealSeedWords": {
"message": "Dedahkan Ungkapan Benih"
},

View File

@ -752,9 +752,6 @@
"restore": {
"message": "Gjenopprett"
},
"restoreAccountWithSeed": {
"message": "Gjenopprett konto med frøfrase"
},
"revealSeedWords": {
"message": "Vis frøord"
},

View File

@ -842,19 +842,12 @@
"importAccount": {
"message": "Mag-import ng Account"
},
"importAccountLinkText": {
"message": "i-import gamit ang Secret Recovery Phrase"
},
"importAccountMsg": {
"message": " Ang mga na-import na account ay hindi mauugnay sa orihinal mong nagawang Secret Recovery Phrase ng MetaMask account. Matuto pa tungkol sa mga na-import account "
},
"importAccountSeedPhrase": {
"message": "Mag-import ng account gamit ang Secret Recovery Phrase"
},
"importAccountText": {
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Mag-import ng token?"
},
@ -1446,9 +1439,6 @@
"restore": {
"message": "I-restore"
},
"restoreAccountWithSeed": {
"message": "I-restore ang iyong Account gamit ang Secret Recovery Phrase"
},
"restoreWalletPreferences": {
"message": "Nakita ang backup ng iyong data mula sa $1. Gusto mo bang i-restore ang mga kagustuhan mo sa wallet?",
"description": "$1 is the date at which the data was backed up"

View File

@ -759,9 +759,6 @@
"restore": {
"message": "Przywróć"
},
"restoreAccountWithSeed": {
"message": "Przywróć konto frazą seed"
},
"revealSeedWords": {
"message": "Pokaż słowa seed"
},

View File

@ -1306,19 +1306,12 @@
"importAccountError": {
"message": "Erro de importação de conta."
},
"importAccountLinkText": {
"message": "importe usando a Frase de Recuperação Secreta"
},
"importAccountMsg": {
"message": "As contas importadas não estarão associadas à Frase de Recuperação Secreta da conta da MetaMask criada originalmente. Saiba mais sobre as contas importadas"
},
"importAccountSeedPhrase": {
"message": "Importe uma carteira com a Frase de Recuperação Secreta"
},
"importAccountText": {
"message": "ou $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Digite sua Frase de Recuperação Secreta (ou seja, a frase seed) que lhe foi dada quando você criou a sua carteira. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1778,9 +1771,6 @@
"message": "Conta $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "O colecionável não foi adicionado pelo seguinte motivo: $1"
},
"newCollectibleAddedMessage": {
"message": "O colecionável foi adicionado com sucesso!"
},
@ -2262,9 +2252,6 @@
"restore": {
"message": "Restaurar"
},
"restoreAccountWithSeed": {
"message": "Restaure sua conta com a Frase de Recuperação Secreta"
},
"restoreWalletPreferences": {
"message": "Encontramos um backup dos seus dados de $1. Gostaria de restaurar as preferências da sua carteira?",
"description": "$1 is the date at which the data was backed up"
@ -2332,9 +2319,6 @@
"secretPhrase": {
"message": "Somente a primeira conta nessa carteira será carregada automaticamente. Após concluir esse processo, para adicionar mais contas, clique no menu suspenso e selecione Criar Conta."
},
"secretPhraseWarning": {
"message": "Se você restaurar usando outra Frase de Recuperação Secreta, sua carteira, conta e ativos atuais serão removidos permanentemente deste aplicativo. Essa ação será irreversível."
},
"secretRecoveryPhrase": {
"message": "Frase de Recuperação Secreta"
},

View File

@ -752,9 +752,6 @@
"restore": {
"message": "Restabilește"
},
"restoreAccountWithSeed": {
"message": "Restaurați-vă contul folosind fraza inițială"
},
"revealSeedWords": {
"message": "Arată cuvintele din seed"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Ошибка импорта счета."
},
"importAccountLinkText": {
"message": "импортировать с использованием секретной фразы для восстановления"
},
"importAccountMsg": {
"message": "Импортированные счета не будут связаны с секретной фразой для восстановления вашего изначально созданного счета MetaMask. Узнайте больше об импортированных счетах"
},
"importAccountSeedPhrase": {
"message": "Импорт кошелька с помощью секретной фразы для восстановления"
},
"importAccountText": {
"message": "или $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Введите секретную фразу для восстановления (также известную как «сид-фраза»), которую вы получили при создании кошелька. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Счет $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Причина, по которой не был добавлен коллекционный актив: $1"
},
"newCollectibleAddedMessage": {
"message": "Коллекционный актив успешно добавлен!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Восстановить"
},
"restoreAccountWithSeed": {
"message": "Восстановите свой счет с помощью секретной фразы для восстановления"
},
"restoreWalletPreferences": {
"message": "Найдена резервная копия ваших данных из $1. Хотите восстановить настройки кошелька?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Автоматически загружается только первый счет в этом кошельке. Для добавления дополнительных счетов, после завершения этого процесса нажмите на выпадающее меню, а затем выберите «Создать счет»."
},
"secretPhraseWarning": {
"message": "Если вы выполняете восстановление с использованием другой секретной фразы для восстановления, ваш текущий кошелек, счета и активы будут удалены из этого приложения без возможности восстановления. Это действие нельзя отменить."
},
"secretRecoveryPhrase": {
"message": "Секретная фраза для восстановления"
},

View File

@ -734,9 +734,6 @@
"restore": {
"message": "Obnoviť"
},
"restoreAccountWithSeed": {
"message": "Obnoviť účet pomocou seed frázy"
},
"revealSeedWords": {
"message": "Zobrazit slova klíčové fráze"
},

View File

@ -753,9 +753,6 @@
"restore": {
"message": "Obnovi"
},
"restoreAccountWithSeed": {
"message": "Obnovi račun z seed phrase"
},
"revealSeedWords": {
"message": "Razkrij seed words"
},

View File

@ -756,9 +756,6 @@
"restore": {
"message": "Поново отвори"
},
"restoreAccountWithSeed": {
"message": "Povratite svoj nalog uz pomoć seed fraze"
},
"revealSeedWords": {
"message": "Otkrivanje početnih reči"
},

View File

@ -749,9 +749,6 @@
"restore": {
"message": "Återställ"
},
"restoreAccountWithSeed": {
"message": "Återställ ditt konto med seedphrase"
},
"revealSeedWords": {
"message": "Visa seed-ord"
},

View File

@ -743,9 +743,6 @@
"restore": {
"message": "Rejesha"
},
"restoreAccountWithSeed": {
"message": "Rejesha Akaunti yako kwa kutumia Kirai Kianzio."
},
"revealSeedWords": {
"message": "Onyesha Maneno ya Kianzio"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Error sa pag-import ng account."
},
"importAccountLinkText": {
"message": "i-import gamit ang Secret Recovery Phrase"
},
"importAccountMsg": {
"message": "Ang mga na-import na account ay hindi mauugnay sa orihinal mong nagawang Secret Recovery Phrase ng MetaMask account. Matuto pa tungkol sa mga na-import account"
},
"importAccountSeedPhrase": {
"message": "Mag-import ng account gamit ang Secret Recovery Phrase"
},
"importAccountText": {
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Ilagay ang iyong Secret Recovery Phrase (kilala rin bilang Seed Phrase) na ibinigay sa iyo noong gumawa ka ng iyong wallet. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Account $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Ang collectible ay hindi idinagdag dahil: $1"
},
"newCollectibleAddedMessage": {
"message": "Ang collectible ay tagumpay na naidagdag!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "I-restore"
},
"restoreAccountWithSeed": {
"message": "I-restore ang iyong Account gamit ang Secret Recovery Phrase"
},
"restoreWalletPreferences": {
"message": "Nakita ang backup ng iyong data mula sa $1. Gusto mo bang i-restore ang mga kagustuhan mo sa wallet?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Ang unang account lang sa wallet na ito ang awtomatikong maglo-load. Pagkatapos makumpleto ang prosesong ito, upang magdagdag ng mga karagdagang account, i-click ang drop down na menu, pagkatapos ay piliin ang Gumawa ng Account."
},
"secretPhraseWarning": {
"message": "Kapag nagre-restore ka gamit ang isa pang Secret Recovery Phrase, permanenteng aalisin sa app na ito ang iyong kasalukuyang wallet, mga account, at asset. Ang gawaing ito ay hindi pwedeng baguhin."
},
"secretRecoveryPhrase": {
"message": "Secret Recovery Phrase"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Hesap içe aktarılırken hata oluştu."
},
"importAccountLinkText": {
"message": "Gizli Kurtarma İfadesi kullanarak içe aktar"
},
"importAccountMsg": {
"message": "İçe aktarılan hesaplar ilk olarak oluşturduğunuz MetaMask hesabı Gizli Kurtarma ifadenizle ilişkilendirilmez. İçe aktarılan hesaplar hakkında daha fazla bilgi edinin"
},
"importAccountSeedPhrase": {
"message": "Gizli Kurtarma İfadesi ile bir cüzdanı içe aktarın"
},
"importAccountText": {
"message": "veya $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Cüzdanınızı oluşturduğunuzda size verilen Gizli Kurtarma İfadenizi (başka bir deyişle Tohum İfadesi) girin. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Hesap $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Tahsil edilebilir tutar eklenmedi ve sebebi: $1"
},
"newCollectibleAddedMessage": {
"message": "Tahsil edilebilir tutar başarılı bir şekilde eklendi!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Geri Yükle"
},
"restoreAccountWithSeed": {
"message": "Gizli Kurtarma İfadesi ile Hesabınızı geri yükleyin"
},
"restoreWalletPreferences": {
"message": "Verilerinizin $1 tarihinden bir yedeği bulundu. Cüzdan tercihlerinizi geri yüklemek ister misiniz?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Sadece bu cüzdandaki ilk hesap otomatik olarak yüklenecektir. Bu işlem tamamlandıktan sonra ilave hesaplar eklemek için açılır menüye tıklayın ardından Hesap Oluştur seçeneğini seçin."
},
"secretPhraseWarning": {
"message": "Başka bir Gizli Kurtarma İfadesini kullanarak geri yükleme işlemi yaparsanız mevcut cüzdan, hesap ve varlıklarınız bu uygulamadan kalıcı olarak silinir. Bu işlem geri alınamaz."
},
"secretRecoveryPhrase": {
"message": "Gizli Kurtarma İfadesi"
},

View File

@ -765,9 +765,6 @@
"restore": {
"message": "Відновити"
},
"restoreAccountWithSeed": {
"message": "Відновіть ваш обліковий запис за допомогою seed-фрази"
},
"revealSeedWords": {
"message": "Показати мнемонічні слова"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "Lỗi khi nhập tài khoản."
},
"importAccountLinkText": {
"message": "nhập bằng Cụm mật khẩu khôi phục bí mật"
},
"importAccountMsg": {
"message": "Tài khoản đã nhập sẽ không được liên kết với Cụm mật khẩu khôi phục bí mật cho tài khoản MetaMask đã tạo ban đầu của bạn. Tìm hiểu thêm về các tài khoản đã nhập"
},
"importAccountSeedPhrase": {
"message": "Nhập một ví bằng Cụm mật khẩu khôi phục bí mật"
},
"importAccountText": {
"message": "hoặc $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "Nhập Cụm Mật Khẩu Khôi Phục Bí Mật (còn được gọi là Cụm Mật Khẩu Gốc) mà bạn được cấp khi tạo ví. $1",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "Tài khoản $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Bộ sưu tập đã không được thêm vì: $1"
},
"newCollectibleAddedMessage": {
"message": "Bộ sưu tập đã được thêm thành công!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "Khôi phục"
},
"restoreAccountWithSeed": {
"message": "Khôi phục tài khoản của bạn bằng cụm mật khẩu khôi phục bí mật"
},
"restoreWalletPreferences": {
"message": "Đã tìm thấy bản sao lưu dữ liệu của bạn từ $1. Bạn có muốn khôi phục các tùy chọn ưu tiên trong ví của mình không?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "Chỉ tự động tải tài khoản đầu tên trên ví. Sau khi hoàn tất quá trình này, để thêm tài khoản bổ sung, hãy nhấn vào trình đơn thả xuống và chọn Tạo tài khoản."
},
"secretPhraseWarning": {
"message": "Nếu bạn khôi phục bằng cách sử dụng một Cụm Mật Khẩu Khôi Phục Bí Mật khác, thì ví, tài khoản và tài sản hiện tại của bạn sẽ bị xóa khỏi ứng dụng này vĩnh viễn. Không thể hoàn tác hành động này."
},
"secretRecoveryPhrase": {
"message": "Cụm Mật Khẩu Khôi Phục Bí Mật"
},

View File

@ -1273,19 +1273,12 @@
"importAccountError": {
"message": "导入帐户时出错。"
},
"importAccountLinkText": {
"message": "使用账户助记词导入"
},
"importAccountMsg": {
"message": "导入的账户将不会与最初创建的 MetaMask 账户助记词相关联。了解更多有关导入账户的信息 。"
},
"importAccountSeedPhrase": {
"message": "使用账户助记词导入账户"
},
"importAccountText": {
"message": "或 $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importExistingWalletDescription": {
"message": "输入您创建$1钱包时提供的保密恢复短语或Seed Phrase。",
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
@ -1745,9 +1738,6 @@
"message": "账户 $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "未添加收藏,因为:$1"
},
"newCollectibleAddedMessage": {
"message": "收藏已成功添加!"
},
@ -2229,9 +2219,6 @@
"restore": {
"message": "恢复"
},
"restoreAccountWithSeed": {
"message": "使用账户助记词恢复您的账户"
},
"restoreWalletPreferences": {
"message": "已找到于 $1 的数据备份。您想恢复您的钱包设置吗?",
"description": "$1 is the date at which the data was backed up"
@ -2299,9 +2286,6 @@
"secretPhrase": {
"message": "只有这个钱包上的第一个帐户将自动加载。 完成此流程后,点击下拉菜单,然后选择创建账户。"
},
"secretPhraseWarning": {
"message": "如果您使用另一个账户助记词来还原,您当前的钱包、帐户和资产将永久从这个应用中移除。 此操作不能撤消。"
},
"secretRecoveryPhrase": {
"message": "账户助记词"
},

View File

@ -747,9 +747,6 @@
"resetAccountDescription": {
"message": "重置帳戶將清除您的交易紀錄"
},
"restoreAccountWithSeed": {
"message": "透過助憶詞還原您的帳戶"
},
"revealSeedWords": {
"message": "顯示助憶詞"
},

View File

@ -1,148 +0,0 @@
<svg width="1533" height="242" viewBox="0 0 1533 242" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M1157.95 121.694C1151.15 117.195 1143.65 113.996 1136.55 109.997C1131.95 107.398 1127.05 105.098 1123.05 101.799C1116.24 96.2 1117.64 85.2024 1124.75 80.4035C1134.95 73.605 1151.85 77.4042 1153.65 91.3011C1153.65 91.601 1153.95 91.801 1154.25 91.801H1169.66C1170.06 91.801 1170.36 91.501 1170.26 91.1011C1169.46 81.5033 1165.75 73.505 1158.95 68.4062C1152.45 63.5073 1145.05 60.9078 1137.15 60.9078C1096.44 60.9078 1092.74 103.998 1114.64 117.595C1117.14 119.195 1138.65 129.992 1146.25 134.691C1153.85 139.39 1156.25 147.988 1152.95 154.787C1149.95 160.986 1142.15 165.285 1134.35 164.785C1125.85 164.285 1119.24 159.686 1116.94 152.487C1116.54 151.188 1116.34 148.688 1116.34 147.589C1116.34 147.289 1116.04 146.989 1115.74 146.989H1099.04C1098.74 146.989 1098.44 147.289 1098.44 147.589C1098.44 159.686 1101.44 166.384 1109.64 172.483C1117.34 178.282 1125.75 180.681 1134.45 180.681C1157.25 180.681 1169.06 167.784 1171.46 154.387C1173.56 141.29 1169.66 129.493 1157.95 121.694V121.694Z" fill="white"/>
<path d="M432.694 63.1091H425.293H417.191C416.891 63.1091 416.691 63.3091 416.591 63.509L402.888 108.698C402.688 109.298 401.888 109.298 401.688 108.698L387.985 63.509C387.885 63.2091 387.685 63.1091 387.384 63.1091H379.283H371.881H361.879C361.579 63.1091 361.279 63.4091 361.279 63.709V179.082C361.279 179.382 361.579 179.682 361.879 179.682H378.583C378.883 179.682 379.183 179.382 379.183 179.082V91.4025C379.183 90.7027 380.183 90.6027 380.383 91.2025L394.186 136.692L395.186 139.891C395.286 140.191 395.486 140.291 395.786 140.291H408.589C408.889 140.291 409.089 140.091 409.189 139.891L410.189 136.692L423.992 91.2025C424.192 90.5027 425.193 90.7027 425.193 91.4025V179.082C425.193 179.382 425.493 179.682 425.793 179.682H442.496C442.796 179.682 443.097 179.382 443.097 179.082V63.709C443.097 63.4091 442.796 63.1091 442.496 63.1091H432.694Z" fill="white"/>
<path d="M902.197 63.1091C901.897 63.1091 901.697 63.3091 901.597 63.509L887.894 108.698C887.694 109.298 886.894 109.298 886.694 108.698L872.991 63.509C872.891 63.2091 872.691 63.1091 872.39 63.1091H846.985C846.685 63.1091 846.385 63.4091 846.385 63.709V179.082C846.385 179.382 846.685 179.682 846.985 179.682H863.689C863.989 179.682 864.289 179.382 864.289 179.082V91.4025C864.289 90.7027 865.289 90.6027 865.489 91.2025L879.292 136.692L880.292 139.891C880.392 140.191 880.592 140.291 880.892 140.291H893.695C893.995 140.291 894.195 140.091 894.295 139.891L895.295 136.692L909.098 91.2025C909.299 90.5027 910.299 90.7027 910.299 91.4025V179.082C910.299 179.382 910.599 179.682 910.899 179.682H927.603C927.903 179.682 928.203 179.382 928.203 179.082V63.709C928.203 63.4091 927.903 63.1091 927.603 63.1091H902.197Z" fill="white"/>
<path d="M686.749 63.1091H655.642H638.938H607.832C607.532 63.1091 607.231 63.4091 607.231 63.709V78.1056C607.231 78.4055 607.532 78.7055 607.832 78.7055H638.338V179.082C638.338 179.382 638.638 179.682 638.938 179.682H655.642C655.942 179.682 656.242 179.382 656.242 179.082V78.7055H686.749C687.049 78.7055 687.349 78.4055 687.349 78.1056V63.709C687.349 63.4091 687.149 63.1091 686.749 63.1091V63.1091Z" fill="white"/>
<path d="M785.272 179.681H800.475C800.875 179.681 801.175 179.281 801.075 178.881L769.668 63.1082C769.568 62.8082 769.368 62.7083 769.068 62.7083H763.267H753.065H747.264C746.964 62.7083 746.763 62.9082 746.663 63.1082L715.257 178.881C715.157 179.281 715.457 179.681 715.857 179.681H731.06C731.36 179.681 731.56 179.481 731.66 179.281L740.762 145.589C740.862 145.289 741.062 145.189 741.362 145.189H774.97C775.27 145.189 775.47 145.389 775.57 145.589L784.672 179.281C784.772 179.481 785.072 179.681 785.272 179.681V179.681ZM745.363 128.693L757.566 83.6034C757.766 83.0035 758.566 83.0035 758.766 83.6034L770.969 128.693C771.069 129.093 770.769 129.493 770.369 129.493H745.963C745.563 129.493 745.263 129.093 745.363 128.693V128.693Z" fill="white"/>
<path d="M1044.53 179.681H1059.73C1060.13 179.681 1060.43 179.281 1060.33 178.881L1028.93 63.1082C1028.83 62.8082 1028.63 62.7083 1028.33 62.7083H1022.52H1012.32H1006.52C1006.22 62.7083 1006.02 62.9082 1005.92 63.1082L974.514 178.881C974.414 179.281 974.714 179.681 975.114 179.681H990.317C990.618 179.681 990.818 179.481 990.918 179.281L1000.02 145.589C1000.12 145.289 1000.32 145.189 1000.62 145.189H1034.23C1034.53 145.189 1034.73 145.389 1034.83 145.589L1043.93 179.281C1044.03 179.481 1044.23 179.681 1044.53 179.681V179.681ZM1004.62 128.693L1016.82 83.6034C1017.02 83.0035 1017.82 83.0035 1018.02 83.6034L1030.23 128.693C1030.33 129.093 1030.03 129.493 1029.63 129.493H1005.22C1004.82 129.493 1004.52 129.093 1004.62 128.693V128.693Z" fill="white"/>
<path d="M510.909 162.584V126.793C510.909 126.493 511.209 126.193 511.509 126.193H556.019C556.319 126.193 556.619 125.893 556.619 125.593V111.196C556.619 110.896 556.319 110.596 556.019 110.596H511.509C511.209 110.596 510.909 110.296 510.909 109.997V79.4037C510.909 79.1038 511.209 78.8039 511.509 78.8039H562.121C562.421 78.8039 562.721 78.5039 562.721 78.204V63.8074C562.721 63.5074 562.421 63.2075 562.121 63.2075H510.909H493.606C493.305 63.2075 493.005 63.5074 493.005 63.8074V78.8039V110.696V126.293V163.284V179.08C493.005 179.38 493.305 179.68 493.606 179.68H510.909H564.221C564.521 179.68 564.821 179.38 564.821 179.08V163.884C564.821 163.584 564.521 163.284 564.221 163.284H511.409C511.109 163.184 510.909 162.984 510.909 162.584Z" fill="white"/>
<path d="M1310.58 178.681L1252.77 118.995C1252.57 118.795 1252.57 118.395 1252.77 118.195L1304.78 64.2074C1305.18 63.8075 1304.88 63.2076 1304.38 63.2076H1283.08C1282.88 63.2076 1282.78 63.3076 1282.68 63.4076L1238.57 109.197C1238.17 109.597 1237.57 109.297 1237.57 108.797V63.8075C1237.57 63.5076 1237.27 63.2076 1236.97 63.2076H1220.26C1219.96 63.2076 1219.66 63.5076 1219.66 63.8075V179.181C1219.66 179.48 1219.96 179.78 1220.26 179.78H1236.97C1237.27 179.78 1237.57 179.48 1237.57 179.181V128.392C1237.57 127.893 1238.27 127.593 1238.57 127.993L1288.58 179.58C1288.68 179.68 1288.88 179.78 1288.98 179.78H1310.28C1310.68 179.68 1310.98 178.981 1310.58 178.681V178.681Z" fill="white"/>
<path d="M1512.38 110.091H1359.98C1348.59 110.091 1339.36 100.86 1339.36 89.4845V44.6061C1339.36 33.231 1348.59 24 1359.98 24H1512.38C1523.76 24 1533 33.231 1533 44.6061V89.4845C1533 100.876 1523.76 110.091 1512.38 110.091Z" fill="#F66A0A"/>
<path d="M1371.47 48.027H1386.48C1388.08 48.027 1389.62 48.3377 1391.06 48.9592C1392.5 49.5807 1393.76 50.4149 1394.86 51.478C1395.94 52.5411 1396.79 53.8004 1397.41 55.2397C1398.04 56.679 1398.35 58.2164 1398.35 59.8683C1398.35 61.2912 1398.09 62.567 1397.56 63.7118C1397.04 64.8567 1396.35 65.8544 1395.48 66.7213C1397.17 67.5881 1398.53 68.8311 1399.59 70.483C1400.64 72.1349 1401.17 74.0158 1401.17 76.1583C1401.17 77.8102 1400.85 79.3313 1400.23 80.7542C1399.61 82.1771 1398.76 83.4202 1397.68 84.4833C1396.6 85.5464 1395.3 86.3805 1393.83 86.9856C1392.35 87.5908 1390.75 87.8852 1389.03 87.8852H1371.49V48.027H1371.47ZM1385.46 64.1371C1386.66 64.1371 1387.65 63.7609 1388.44 62.9922C1389.23 62.2235 1389.62 61.3076 1389.62 60.2118C1389.62 59.1323 1389.23 58.1837 1388.44 57.3823C1387.65 56.5809 1386.66 56.172 1385.46 56.172H1380.4V64.1371H1385.46V64.1371ZM1388.28 79.6748C1389.47 79.6748 1390.47 79.2986 1391.26 78.5299C1392.04 77.7612 1392.44 76.8126 1392.44 75.7004C1392.44 74.6209 1392.03 73.6723 1391.22 72.8873C1390.42 72.1022 1389.42 71.7097 1388.21 71.7097H1380.4V79.6748H1388.28Z" fill="white"/>
<path d="M1407.16 48.0112H1432.45V56.5488H1416.08V63.6798H1429.07V72.2173H1416.08V79.3483H1432.45V87.8858H1407.16V48.0112Z" fill="white"/>
<path d="M1446.43 56.5311H1436.26V47.9935H1465.71V56.5311H1455.42V87.8518H1446.43V56.5311Z" fill="white"/>
<path d="M1479.92 48.0112H1488.01L1505.09 87.8531H1495.76L1492.22 79.43H1475.69L1472.16 87.8531H1462.82L1479.92 48.0112ZM1478.92 71.6939H1488.98L1483.98 59.7381L1478.92 71.6939Z" fill="white"/>
<g clip-path="url(#clip1)">
<path d="M145.555 130.761L149.839 72.3187L167.281 30.6899H92.7188L110.161 72.3187L114.445 130.761L115.771 149.195L115.873 194.572H144.127L144.229 149.195L145.555 130.761Z" fill="url(#paint0_linear)"/>
<path d="M240.11 119.518L186.764 104.021L202.88 128.229L178.808 174.821L210.632 174.416H257.96L240.11 119.518Z" fill="url(#paint1_linear)"/>
<path d="M73.2366 104.021L19.8902 119.518L2.14209 174.416H49.4705L81.1927 174.821L57.1205 128.229L73.2366 104.021Z" fill="url(#paint2_linear)"/>
<path d="M150.859 160.033L144.127 194.572L149.023 197.914L178.807 174.821L179.725 151.626L150.859 160.033Z" fill="url(#paint3_linear)"/>
<path d="M80.3765 151.626L81.1925 174.821L110.977 197.914L115.873 194.572L109.141 160.033L80.3765 151.626Z" fill="url(#paint4_linear)"/>
<path d="M251.432 79.7125L260 38.3876L247.148 0L149.023 72.3186L185.642 104.933L240.11 119.518L251.84 105.844L246.74 102.198L254.9 94.8042L248.678 89.9425L256.838 83.764L251.432 79.7125Z" fill="url(#paint5_linear)"/>
<path d="M0 38.3876L8.67007 79.7125L3.16202 83.764L11.3221 89.9425L5.10004 94.8042L13.2601 102.198L8.16006 105.844L19.8902 119.518L74.4606 104.933L110.977 72.3186L12.8521 0L0 38.3876Z" fill="url(#paint6_linear)"/>
<path d="M57.1206 128.229L80.3768 151.626L81.1928 174.821L57.1206 128.229Z" fill="url(#paint7_linear)"/>
<path d="M202.88 128.229L178.808 174.821L179.726 151.626L202.88 128.229Z" fill="url(#paint8_linear)"/>
<path d="M183.602 214.626L149.023 197.914L151.777 220.298L151.471 229.718L183.602 214.626Z" fill="#D7C1B3" stroke="#D7C1B3" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M76.3989 214.626L108.529 229.718L108.325 220.298L110.977 197.914L76.3989 214.626Z" fill="#D7C1B3" stroke="#D7C1B3" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M210.632 174.415L183.602 214.626L241.436 230.427L257.96 174.415H210.632Z" fill="url(#paint9_linear)"/>
<path d="M2.14209 174.415L18.5642 230.427L76.3987 214.626L49.4705 174.415H2.14209Z" fill="url(#paint10_linear)"/>
<path d="M12.8521 0L110.977 72.3186L95.5747 30.6898L12.8521 0Z" fill="url(#paint11_linear)"/>
<path d="M164.425 30.6898L149.023 72.3186L247.148 0L164.425 30.6898Z" fill="url(#paint12_linear)"/>
<path d="M73.2367 104.021L57.1206 128.229L114.445 130.761L110.977 72.3186L73.2367 104.021Z" fill="url(#paint13_linear)"/>
<path d="M186.763 104.021L149.023 72.3186L145.555 130.761L202.879 128.229L186.763 104.021Z" fill="url(#paint14_linear)"/>
<path d="M76.3989 214.626L110.977 197.914L81.193 174.821L76.3989 214.626Z" fill="url(#paint15_linear)"/>
<path d="M149.023 197.914L183.602 214.626L178.808 174.821L149.023 197.914Z" fill="url(#paint16_linear)"/>
<path d="M76.3989 214.626L81.1929 174.82L49.4707 174.415L76.3989 214.626Z" fill="url(#paint17_linear)"/>
<path d="M178.808 174.82L183.602 214.626L210.632 174.415L178.808 174.82Z" fill="url(#paint18_linear)"/>
<path d="M202.88 128.229L145.556 130.761L150.86 160.033L159.326 142.409L179.726 151.626L202.88 128.229Z" fill="url(#paint19_linear)"/>
<path d="M80.3773 151.626L100.675 142.409L109.141 160.033L114.446 130.761L57.1211 128.229L80.3773 151.626Z" fill="url(#paint20_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M144.229 149.195L150.859 160.033L145.555 130.761L144.229 149.195ZM144.229 149.195L144.229 149.195L144.127 194.571L150.859 160.033L144.229 149.195Z" fill="url(#paint21_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M114.445 130.761L109.141 160.033L115.873 194.571L115.771 149.195L115.771 149.195L114.445 130.761Z" fill="url(#paint22_linear)"/>
<path d="M151.655 229.596L151.778 220.298L149.228 218.07H110.773L108.325 220.298L108.529 229.718L76.3989 214.626L87.619 223.742L110.467 239.441H149.534L172.382 223.742L183.602 214.626L151.655 229.596Z" fill="#C0AD9E" stroke="#C0AD9E" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M149.023 197.914L144.127 194.571H115.873L110.977 197.914L108.325 220.298L110.773 218.07H149.227L151.777 220.298L149.023 197.914Z" fill="#161616" stroke="#161616" stroke-width="0.142167" stroke-miterlimit="10" stroke-linejoin="round"/>
<path d="M159.325 142.409L150.859 160.033L179.726 151.626L159.325 142.409Z" fill="#161616"/>
<path d="M100.675 142.409L109.141 160.033L80.377 151.626L100.675 142.409Z" fill="#161616"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear" x1="130" y1="30.6899" x2="130" y2="194.572" gradientUnits="userSpaceOnUse">
<stop stop-color="#21FF47"/>
<stop offset="1" stop-color="#BCD8F0"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="218.384" y1="104.021" x2="218.384" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#1CAD68"/>
<stop offset="1" stop-color="#77BDD4"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="41.6674" y1="104.021" x2="41.6674" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#1CAD68"/>
<stop offset="1" stop-color="#77BDD4"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="161.926" y1="151.626" x2="161.926" y2="197.914" gradientUnits="userSpaceOnUse">
<stop stop-color="#7BCBC8"/>
<stop offset="1" stop-color="#87B9E6"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="98.1246" y1="151.626" x2="98.1246" y2="197.914" gradientUnits="userSpaceOnUse">
<stop stop-color="#7BCBC8"/>
<stop offset="1" stop-color="#87B9E6"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="204.512" y1="0" x2="204.512" y2="119.518" gradientUnits="userSpaceOnUse">
<stop stop-color="#007715"/>
<stop offset="1" stop-color="#0A3424"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="55.4884" y1="0" x2="55.4884" y2="119.518" gradientUnits="userSpaceOnUse">
<stop stop-color="#007715"/>
<stop offset="1" stop-color="#0A3424"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="69.1567" y1="128.229" x2="69.1567" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="190.844" y1="128.229" x2="190.844" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="220.781" y1="174.415" x2="220.781" y2="230.427" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="39.2704" y1="174.415" x2="39.2704" y2="230.427" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="61.9144" y1="0" x2="61.9144" y2="72.3186" gradientUnits="userSpaceOnUse">
<stop stop-color="#01EA28"/>
<stop offset="1" stop-color="#10D24F"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="198.085" y1="0" x2="198.085" y2="72.3186" gradientUnits="userSpaceOnUse">
<stop stop-color="#01EA28"/>
<stop offset="1" stop-color="#10D24F"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="85.7828" y1="72.3186" x2="85.7828" y2="130.761" gradientUnits="userSpaceOnUse">
<stop stop-color="#12DB56"/>
<stop offset="1" stop-color="#4CC9A3"/>
</linearGradient>
<linearGradient id="paint14_linear" x1="174.217" y1="72.3186" x2="174.217" y2="130.761" gradientUnits="userSpaceOnUse">
<stop stop-color="#12DB56"/>
<stop offset="1" stop-color="#4CC9A3"/>
</linearGradient>
<linearGradient id="paint15_linear" x1="93.6881" y1="174.821" x2="93.6881" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint16_linear" x1="166.313" y1="174.821" x2="166.313" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint17_linear" x1="65.3318" y1="174.415" x2="65.3318" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#32809D"/>
<stop offset="1" stop-color="#477DD5"/>
</linearGradient>
<linearGradient id="paint18_linear" x1="194.72" y1="174.415" x2="194.72" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#32809D"/>
<stop offset="1" stop-color="#477DD5"/>
</linearGradient>
<linearGradient id="paint19_linear" x1="174.218" y1="128.229" x2="174.218" y2="160.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#239777"/>
<stop offset="1" stop-color="#2C8A8D"/>
</linearGradient>
<linearGradient id="paint20_linear" x1="85.7833" y1="128.229" x2="85.7833" y2="160.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#239777"/>
<stop offset="1" stop-color="#2C8A8D"/>
</linearGradient>
<linearGradient id="paint21_linear" x1="147.493" y1="130.761" x2="147.493" y2="194.571" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint22_linear" x1="112.507" y1="130.761" x2="112.507" y2="194.571" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<clipPath id="clip0">
<rect width="1533" height="242" fill="white"/>
</clipPath>
<clipPath id="clip1">
<rect width="260" height="239.948" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,148 +0,0 @@
<svg width="1533" height="242" viewBox="0 0 1533 242" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M1157.95 121.694C1151.15 117.195 1143.65 113.996 1136.55 109.997C1131.95 107.398 1127.05 105.098 1123.05 101.799C1116.24 96.2 1117.64 85.2024 1124.75 80.4035C1134.95 73.605 1151.85 77.4042 1153.65 91.3011C1153.65 91.601 1153.95 91.801 1154.25 91.801H1169.66C1170.06 91.801 1170.36 91.501 1170.26 91.1011C1169.46 81.5033 1165.75 73.505 1158.95 68.4062C1152.45 63.5073 1145.05 60.9078 1137.15 60.9078C1096.44 60.9078 1092.74 103.998 1114.64 117.595C1117.14 119.195 1138.65 129.992 1146.25 134.691C1153.85 139.39 1156.25 147.988 1152.95 154.787C1149.95 160.986 1142.15 165.285 1134.35 164.785C1125.85 164.285 1119.24 159.686 1116.94 152.487C1116.54 151.188 1116.34 148.688 1116.34 147.589C1116.34 147.289 1116.04 146.989 1115.74 146.989H1099.04C1098.74 146.989 1098.44 147.289 1098.44 147.589C1098.44 159.686 1101.44 166.384 1109.64 172.483C1117.34 178.282 1125.75 180.681 1134.45 180.681C1157.25 180.681 1169.06 167.784 1171.46 154.387C1173.56 141.29 1169.66 129.493 1157.95 121.694V121.694Z" fill="#24292E"/>
<path d="M432.694 63.1091H425.293H417.191C416.891 63.1091 416.691 63.3091 416.591 63.509L402.888 108.698C402.688 109.298 401.888 109.298 401.688 108.698L387.985 63.509C387.885 63.2091 387.685 63.1091 387.384 63.1091H379.283H371.881H361.879C361.579 63.1091 361.279 63.4091 361.279 63.709V179.082C361.279 179.382 361.579 179.682 361.879 179.682H378.583C378.883 179.682 379.183 179.382 379.183 179.082V91.4025C379.183 90.7027 380.183 90.6027 380.383 91.2025L394.186 136.692L395.186 139.891C395.286 140.191 395.486 140.291 395.786 140.291H408.589C408.889 140.291 409.089 140.091 409.189 139.891L410.189 136.692L423.992 91.2025C424.192 90.5027 425.193 90.7027 425.193 91.4025V179.082C425.193 179.382 425.493 179.682 425.793 179.682H442.496C442.796 179.682 443.097 179.382 443.097 179.082V63.709C443.097 63.4091 442.796 63.1091 442.496 63.1091H432.694Z" fill="#24292E"/>
<path d="M902.197 63.1091C901.897 63.1091 901.697 63.3091 901.597 63.509L887.894 108.698C887.694 109.298 886.894 109.298 886.694 108.698L872.991 63.509C872.891 63.2091 872.691 63.1091 872.39 63.1091H846.985C846.685 63.1091 846.385 63.4091 846.385 63.709V179.082C846.385 179.382 846.685 179.682 846.985 179.682H863.689C863.989 179.682 864.289 179.382 864.289 179.082V91.4025C864.289 90.7027 865.289 90.6027 865.489 91.2025L879.292 136.692L880.292 139.891C880.392 140.191 880.592 140.291 880.892 140.291H893.695C893.995 140.291 894.195 140.091 894.295 139.891L895.295 136.692L909.098 91.2025C909.299 90.5027 910.299 90.7027 910.299 91.4025V179.082C910.299 179.382 910.599 179.682 910.899 179.682H927.603C927.903 179.682 928.203 179.382 928.203 179.082V63.709C928.203 63.4091 927.903 63.1091 927.603 63.1091H902.197Z" fill="#24292E"/>
<path d="M686.749 63.1091H655.642H638.938H607.832C607.532 63.1091 607.231 63.4091 607.231 63.709V78.1056C607.231 78.4055 607.532 78.7055 607.832 78.7055H638.338V179.082C638.338 179.382 638.638 179.682 638.938 179.682H655.642C655.942 179.682 656.242 179.382 656.242 179.082V78.7055H686.749C687.049 78.7055 687.349 78.4055 687.349 78.1056V63.709C687.349 63.4091 687.149 63.1091 686.749 63.1091V63.1091Z" fill="#24292E"/>
<path d="M785.272 179.681H800.475C800.875 179.681 801.175 179.281 801.075 178.881L769.668 63.1082C769.568 62.8082 769.368 62.7083 769.068 62.7083H763.267H753.065H747.264C746.964 62.7083 746.763 62.9082 746.663 63.1082L715.257 178.881C715.157 179.281 715.457 179.681 715.857 179.681H731.06C731.36 179.681 731.56 179.481 731.66 179.281L740.762 145.589C740.862 145.289 741.062 145.189 741.362 145.189H774.97C775.27 145.189 775.47 145.389 775.57 145.589L784.672 179.281C784.772 179.481 785.072 179.681 785.272 179.681V179.681ZM745.363 128.693L757.566 83.6034C757.766 83.0035 758.566 83.0035 758.766 83.6034L770.969 128.693C771.069 129.093 770.769 129.493 770.369 129.493H745.963C745.563 129.493 745.263 129.093 745.363 128.693V128.693Z" fill="#24292E"/>
<path d="M1044.53 179.681H1059.73C1060.13 179.681 1060.43 179.281 1060.33 178.881L1028.93 63.1082C1028.83 62.8082 1028.63 62.7083 1028.33 62.7083H1022.52H1012.32H1006.52C1006.22 62.7083 1006.02 62.9082 1005.92 63.1082L974.514 178.881C974.414 179.281 974.714 179.681 975.114 179.681H990.317C990.618 179.681 990.818 179.481 990.918 179.281L1000.02 145.589C1000.12 145.289 1000.32 145.189 1000.62 145.189H1034.23C1034.53 145.189 1034.73 145.389 1034.83 145.589L1043.93 179.281C1044.03 179.481 1044.23 179.681 1044.53 179.681V179.681ZM1004.62 128.693L1016.82 83.6034C1017.02 83.0035 1017.82 83.0035 1018.02 83.6034L1030.23 128.693C1030.33 129.093 1030.03 129.493 1029.63 129.493H1005.22C1004.82 129.493 1004.52 129.093 1004.62 128.693V128.693Z" fill="#24292E"/>
<path d="M510.909 162.584V126.793C510.909 126.493 511.209 126.193 511.509 126.193H556.019C556.319 126.193 556.619 125.893 556.619 125.593V111.196C556.619 110.896 556.319 110.596 556.019 110.596H511.509C511.209 110.596 510.909 110.296 510.909 109.997V79.4037C510.909 79.1038 511.209 78.8039 511.509 78.8039H562.121C562.421 78.8039 562.721 78.5039 562.721 78.204V63.8074C562.721 63.5074 562.421 63.2075 562.121 63.2075H510.909H493.606C493.305 63.2075 493.005 63.5074 493.005 63.8074V78.8039V110.696V126.293V163.284V179.08C493.005 179.38 493.305 179.68 493.606 179.68H510.909H564.221C564.521 179.68 564.821 179.38 564.821 179.08V163.884C564.821 163.584 564.521 163.284 564.221 163.284H511.409C511.109 163.184 510.909 162.984 510.909 162.584Z" fill="#24292E"/>
<path d="M1310.58 178.681L1252.77 118.995C1252.57 118.795 1252.57 118.395 1252.77 118.195L1304.78 64.2074C1305.18 63.8075 1304.88 63.2076 1304.38 63.2076H1283.08C1282.88 63.2076 1282.78 63.3076 1282.68 63.4076L1238.57 109.197C1238.17 109.597 1237.57 109.297 1237.57 108.797V63.8075C1237.57 63.5076 1237.27 63.2076 1236.97 63.2076H1220.26C1219.96 63.2076 1219.66 63.5076 1219.66 63.8075V179.181C1219.66 179.48 1219.96 179.78 1220.26 179.78H1236.97C1237.27 179.78 1237.57 179.48 1237.57 179.181V128.392C1237.57 127.893 1238.27 127.593 1238.57 127.993L1288.58 179.58C1288.68 179.68 1288.88 179.78 1288.98 179.78H1310.28C1310.68 179.68 1310.98 178.981 1310.58 178.681V178.681Z" fill="#24292E"/>
<path d="M1512.38 110.091H1359.98C1348.59 110.091 1339.36 100.86 1339.36 89.4845V44.6061C1339.36 33.231 1348.59 24 1359.98 24H1512.38C1523.76 24 1533 33.231 1533 44.6061V89.4845C1533 100.876 1523.76 110.091 1512.38 110.091Z" fill="#F66A0A"/>
<path d="M1371.47 48.027H1386.48C1388.08 48.027 1389.62 48.3377 1391.06 48.9592C1392.5 49.5807 1393.76 50.4149 1394.86 51.478C1395.94 52.5411 1396.79 53.8004 1397.41 55.2397C1398.04 56.679 1398.35 58.2164 1398.35 59.8683C1398.35 61.2912 1398.09 62.567 1397.56 63.7118C1397.04 64.8567 1396.35 65.8544 1395.48 66.7213C1397.17 67.5881 1398.53 68.8311 1399.59 70.483C1400.64 72.1349 1401.17 74.0158 1401.17 76.1583C1401.17 77.8102 1400.85 79.3313 1400.23 80.7542C1399.61 82.1771 1398.76 83.4202 1397.68 84.4833C1396.6 85.5464 1395.3 86.3805 1393.83 86.9856C1392.35 87.5908 1390.75 87.8852 1389.03 87.8852H1371.49V48.027H1371.47ZM1385.46 64.1371C1386.66 64.1371 1387.65 63.7609 1388.44 62.9922C1389.23 62.2235 1389.62 61.3076 1389.62 60.2118C1389.62 59.1323 1389.23 58.1837 1388.44 57.3823C1387.65 56.5809 1386.66 56.172 1385.46 56.172H1380.4V64.1371H1385.46V64.1371ZM1388.28 79.6748C1389.47 79.6748 1390.47 79.2986 1391.26 78.5299C1392.04 77.7612 1392.44 76.8126 1392.44 75.7004C1392.44 74.6209 1392.03 73.6723 1391.22 72.8873C1390.42 72.1022 1389.42 71.7097 1388.21 71.7097H1380.4V79.6748H1388.28Z" fill="white"/>
<path d="M1407.16 48.0112H1432.45V56.5488H1416.08V63.6798H1429.07V72.2173H1416.08V79.3483H1432.45V87.8858H1407.16V48.0112Z" fill="white"/>
<path d="M1446.43 56.5311H1436.26V47.9935H1465.71V56.5311H1455.42V87.8518H1446.43V56.5311Z" fill="white"/>
<path d="M1479.92 48.0112H1488.01L1505.09 87.8531H1495.76L1492.22 79.43H1475.69L1472.16 87.8531H1462.82L1479.92 48.0112ZM1478.92 71.6939H1488.98L1483.98 59.7381L1478.92 71.6939Z" fill="white"/>
<g clip-path="url(#clip1)">
<path d="M145.555 130.761L149.839 72.3187L167.281 30.6899H92.7188L110.161 72.3187L114.445 130.761L115.771 149.195L115.873 194.572H144.127L144.229 149.195L145.555 130.761Z" fill="url(#paint0_linear)"/>
<path d="M240.11 119.518L186.764 104.021L202.88 128.229L178.808 174.821L210.632 174.416H257.96L240.11 119.518Z" fill="url(#paint1_linear)"/>
<path d="M73.2366 104.021L19.8902 119.518L2.14209 174.416H49.4705L81.1927 174.821L57.1205 128.229L73.2366 104.021Z" fill="url(#paint2_linear)"/>
<path d="M150.859 160.033L144.127 194.572L149.023 197.914L178.807 174.821L179.725 151.626L150.859 160.033Z" fill="url(#paint3_linear)"/>
<path d="M80.3765 151.626L81.1925 174.821L110.977 197.914L115.873 194.572L109.141 160.033L80.3765 151.626Z" fill="url(#paint4_linear)"/>
<path d="M251.432 79.7125L260 38.3876L247.148 0L149.023 72.3186L185.642 104.933L240.11 119.518L251.84 105.844L246.74 102.198L254.9 94.8042L248.678 89.9425L256.838 83.764L251.432 79.7125Z" fill="url(#paint5_linear)"/>
<path d="M0 38.3876L8.67007 79.7125L3.16202 83.764L11.3221 89.9425L5.10004 94.8042L13.2601 102.198L8.16006 105.844L19.8902 119.518L74.4606 104.933L110.977 72.3186L12.8521 0L0 38.3876Z" fill="url(#paint6_linear)"/>
<path d="M57.1206 128.229L80.3768 151.626L81.1928 174.821L57.1206 128.229Z" fill="url(#paint7_linear)"/>
<path d="M202.88 128.229L178.808 174.821L179.726 151.626L202.88 128.229Z" fill="url(#paint8_linear)"/>
<path d="M183.602 214.626L149.023 197.914L151.777 220.298L151.471 229.718L183.602 214.626Z" fill="#D7C1B3" stroke="#D7C1B3" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M76.3989 214.626L108.529 229.718L108.325 220.298L110.977 197.914L76.3989 214.626Z" fill="#D7C1B3" stroke="#D7C1B3" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M210.632 174.415L183.602 214.626L241.436 230.427L257.96 174.415H210.632Z" fill="url(#paint9_linear)"/>
<path d="M2.14209 174.415L18.5642 230.427L76.3987 214.626L49.4705 174.415H2.14209Z" fill="url(#paint10_linear)"/>
<path d="M12.8521 0L110.977 72.3186L95.5747 30.6898L12.8521 0Z" fill="url(#paint11_linear)"/>
<path d="M164.425 30.6898L149.023 72.3186L247.148 0L164.425 30.6898Z" fill="url(#paint12_linear)"/>
<path d="M73.2367 104.021L57.1206 128.229L114.445 130.761L110.977 72.3186L73.2367 104.021Z" fill="url(#paint13_linear)"/>
<path d="M186.763 104.021L149.023 72.3186L145.555 130.761L202.879 128.229L186.763 104.021Z" fill="url(#paint14_linear)"/>
<path d="M76.3989 214.626L110.977 197.914L81.193 174.821L76.3989 214.626Z" fill="url(#paint15_linear)"/>
<path d="M149.023 197.914L183.602 214.626L178.808 174.821L149.023 197.914Z" fill="url(#paint16_linear)"/>
<path d="M76.3989 214.626L81.1929 174.82L49.4707 174.415L76.3989 214.626Z" fill="url(#paint17_linear)"/>
<path d="M178.808 174.82L183.602 214.626L210.632 174.415L178.808 174.82Z" fill="url(#paint18_linear)"/>
<path d="M202.88 128.229L145.556 130.761L150.86 160.033L159.326 142.409L179.726 151.626L202.88 128.229Z" fill="url(#paint19_linear)"/>
<path d="M80.3773 151.626L100.675 142.409L109.141 160.033L114.446 130.761L57.1211 128.229L80.3773 151.626Z" fill="url(#paint20_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M144.229 149.195L150.859 160.033L145.555 130.761L144.229 149.195ZM144.229 149.195L144.229 149.195L144.127 194.571L150.859 160.033L144.229 149.195Z" fill="url(#paint21_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M114.445 130.761L109.141 160.033L115.873 194.571L115.771 149.195L115.771 149.195L114.445 130.761Z" fill="url(#paint22_linear)"/>
<path d="M151.655 229.596L151.778 220.298L149.228 218.07H110.773L108.325 220.298L108.529 229.718L76.3989 214.626L87.619 223.742L110.467 239.441H149.534L172.382 223.742L183.602 214.626L151.655 229.596Z" fill="#C0AD9E" stroke="#C0AD9E" stroke-width="1.42167" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M149.023 197.914L144.127 194.571H115.873L110.977 197.914L108.325 220.298L110.773 218.07H149.227L151.777 220.298L149.023 197.914Z" fill="#161616" stroke="#161616" stroke-width="0.142167" stroke-miterlimit="10" stroke-linejoin="round"/>
<path d="M159.325 142.409L150.859 160.033L179.726 151.626L159.325 142.409Z" fill="#161616"/>
<path d="M100.675 142.409L109.141 160.033L80.377 151.626L100.675 142.409Z" fill="#161616"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear" x1="130" y1="30.6899" x2="130" y2="194.572" gradientUnits="userSpaceOnUse">
<stop stop-color="#21FF47"/>
<stop offset="1" stop-color="#BCD8F0"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="218.384" y1="104.021" x2="218.384" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#1CAD68"/>
<stop offset="1" stop-color="#77BDD4"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="41.6674" y1="104.021" x2="41.6674" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#1CAD68"/>
<stop offset="1" stop-color="#77BDD4"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="161.926" y1="151.626" x2="161.926" y2="197.914" gradientUnits="userSpaceOnUse">
<stop stop-color="#7BCBC8"/>
<stop offset="1" stop-color="#87B9E6"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="98.1246" y1="151.626" x2="98.1246" y2="197.914" gradientUnits="userSpaceOnUse">
<stop stop-color="#7BCBC8"/>
<stop offset="1" stop-color="#87B9E6"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="204.512" y1="0" x2="204.512" y2="119.518" gradientUnits="userSpaceOnUse">
<stop stop-color="#007715"/>
<stop offset="1" stop-color="#0A3424"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="55.4884" y1="0" x2="55.4884" y2="119.518" gradientUnits="userSpaceOnUse">
<stop stop-color="#007715"/>
<stop offset="1" stop-color="#0A3424"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="69.1567" y1="128.229" x2="69.1567" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="190.844" y1="128.229" x2="190.844" y2="174.821" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="220.781" y1="174.415" x2="220.781" y2="230.427" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="39.2704" y1="174.415" x2="39.2704" y2="230.427" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="61.9144" y1="0" x2="61.9144" y2="72.3186" gradientUnits="userSpaceOnUse">
<stop stop-color="#01EA28"/>
<stop offset="1" stop-color="#10D24F"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="198.085" y1="0" x2="198.085" y2="72.3186" gradientUnits="userSpaceOnUse">
<stop stop-color="#01EA28"/>
<stop offset="1" stop-color="#10D24F"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="85.7828" y1="72.3186" x2="85.7828" y2="130.761" gradientUnits="userSpaceOnUse">
<stop stop-color="#12DB56"/>
<stop offset="1" stop-color="#4CC9A3"/>
</linearGradient>
<linearGradient id="paint14_linear" x1="174.217" y1="72.3186" x2="174.217" y2="130.761" gradientUnits="userSpaceOnUse">
<stop stop-color="#12DB56"/>
<stop offset="1" stop-color="#4CC9A3"/>
</linearGradient>
<linearGradient id="paint15_linear" x1="93.6881" y1="174.821" x2="93.6881" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint16_linear" x1="166.313" y1="174.821" x2="166.313" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#5BAECB"/>
<stop offset="1" stop-color="#4160C1"/>
</linearGradient>
<linearGradient id="paint17_linear" x1="65.3318" y1="174.415" x2="65.3318" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#32809D"/>
<stop offset="1" stop-color="#477DD5"/>
</linearGradient>
<linearGradient id="paint18_linear" x1="194.72" y1="174.415" x2="194.72" y2="214.626" gradientUnits="userSpaceOnUse">
<stop stop-color="#32809D"/>
<stop offset="1" stop-color="#477DD5"/>
</linearGradient>
<linearGradient id="paint19_linear" x1="174.218" y1="128.229" x2="174.218" y2="160.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#239777"/>
<stop offset="1" stop-color="#2C8A8D"/>
</linearGradient>
<linearGradient id="paint20_linear" x1="85.7833" y1="128.229" x2="85.7833" y2="160.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#239777"/>
<stop offset="1" stop-color="#2C8A8D"/>
</linearGradient>
<linearGradient id="paint21_linear" x1="147.493" y1="130.761" x2="147.493" y2="194.571" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<linearGradient id="paint22_linear" x1="112.507" y1="130.761" x2="112.507" y2="194.571" gradientUnits="userSpaceOnUse">
<stop stop-color="#42C4A0"/>
<stop offset="1" stop-color="#51ACC7"/>
</linearGradient>
<clipPath id="clip0">
<rect width="1533" height="242" fill="white"/>
</clipPath>
<clipPath id="clip1">
<rect width="260" height="239.948" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,116 +0,0 @@
<svg width="1532" height="247" viewBox="0 0 1532 247" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M148.354 134.603L152.72 74.4431L170.498 31.5908H94.5015L112.279 74.4431L116.645 134.603L117.997 153.579L118.101 200.289H146.898L147.002 153.579L148.354 134.603Z" fill="url(#paint0_linear)"/>
<path d="M244.727 123.029L190.355 107.077L206.781 131.996L182.246 179.957L214.682 179.54H262.92L244.727 123.029Z" fill="url(#paint1_linear)"/>
<path d="M74.6449 107.077L20.2726 123.029L2.18311 179.54H50.4216L82.7539 179.957L58.2188 131.996L74.6449 107.077Z" fill="url(#paint2_linear)"/>
<path d="M153.76 164.735L146.899 200.289L151.889 203.729L182.246 179.957L183.182 156.081L153.76 164.735Z" fill="#ACACAC"/>
<path d="M81.9224 156.081L82.7541 179.957L113.111 203.729L118.101 200.289L111.24 164.735L81.9224 156.081Z" fill="#ACACAC"/>
<path d="M256.267 82.0553L265 39.5158L251.9 0L151.889 74.4441L189.211 108.017L244.727 123.031L256.683 108.955L251.485 105.202L259.802 97.5906L253.46 92.5859L261.777 86.2258L256.267 82.0553Z" fill="url(#paint3_linear)"/>
<path d="M8.73266 82.0553L-0.000171178 39.5158L13.0991 0L113.111 74.4441L75.7884 108.017L20.2725 123.031L8.31682 108.955L13.5149 105.202L5.19795 97.5906L11.5396 92.5859L3.22265 86.2258L8.73266 82.0553Z" fill="url(#paint4_linear)"/>
<path d="M58.2188 131.997L81.9222 156.082L82.7539 179.958L58.2188 131.997Z" fill="#8D8D8D"/>
<path d="M206.781 131.997L182.246 179.958L183.181 156.082L206.781 131.997Z" fill="#8D8D8D"/>
<path d="M187.132 220.935L151.889 203.731L154.696 226.774L154.384 236.47L187.132 220.935Z" fill="#FF9F5A"/>
<path d="M77.8677 220.934L110.616 236.469L110.408 226.773L113.111 203.73L77.8677 220.934Z" fill="#FF9F5A"/>
<path d="M214.682 179.542L187.132 220.935L246.079 237.2L262.921 179.542H214.682Z" fill="url(#paint5_linear)"/>
<path d="M2.18311 179.542L18.921 237.2L77.8677 220.935L50.4216 179.542H2.18311Z" fill="url(#paint6_linear)"/>
<path d="M13.0991 0L113.111 74.4441L97.4126 31.5918L13.0991 0Z" fill="#757575"/>
<path d="M167.587 31.5918L151.889 74.4441L251.9 0L167.587 31.5918Z" fill="#757575"/>
<path d="M74.6448 107.079L58.2188 131.998L116.646 134.604L113.111 74.4443L74.6448 107.079Z" fill="url(#paint7_linear)"/>
<path d="M190.355 107.079L151.889 74.4443L148.354 134.604L206.781 131.998L190.355 107.079Z" fill="url(#paint8_linear)"/>
<path d="M77.8677 220.934L113.111 203.731L82.7539 179.959L77.8677 220.934Z" fill="url(#paint9_linear)"/>
<path d="M151.889 203.731L187.132 220.934L182.246 179.959L151.889 203.731Z" fill="url(#paint10_linear)"/>
<path d="M182.246 179.958L187.132 220.934L214.682 179.541L182.246 179.958Z" fill="url(#paint11_linear)"/>
<path d="M82.7539 179.958L77.8677 220.934L50.3177 179.541L82.7539 179.958Z" fill="url(#paint12_linear)"/>
<path d="M206.781 131.997L148.354 134.604L153.761 164.736L162.389 146.594L183.182 156.082L206.781 131.997Z" fill="#666666"/>
<path d="M81.9222 156.082L102.611 146.594L111.24 164.736L116.646 134.604L58.2188 131.997L81.9222 156.082Z" fill="#666666"/>
<path d="M153.76 164.736L147.002 153.579L148.354 134.604L153.76 164.736Z" fill="#8D8D8D"/>
<path d="M111.24 164.736L116.646 134.604L117.997 153.579L111.24 164.736Z" fill="#8D8D8D"/>
<path d="M147.003 153.58L153.76 164.736L146.899 200.29L147.003 153.58Z" fill="#8D8D8D"/>
<path d="M117.997 153.58L118.101 200.29L111.24 164.736L117.997 153.58Z" fill="#8D8D8D"/>
<path d="M154.571 236.345L154.696 226.773L152.097 224.48H112.903L110.408 226.773L110.616 236.47L77.8677 220.935L89.3035 230.318L112.591 246.479H152.409L175.696 230.318L187.132 220.935L154.571 236.345Z" fill="#DF7554"/>
<path d="M151.889 203.731L146.899 200.29H118.101L113.111 203.731L110.408 226.773L112.903 224.479H152.097L154.696 226.773L151.889 203.731Z" fill="#161616" stroke="#161616" stroke-width="0.0657594" stroke-miterlimit="10" stroke-linejoin="round"/>
<path d="M162.389 146.594L153.76 164.736L183.182 156.082L162.389 146.594Z" fill="#161616"/>
<path d="M102.611 146.594L111.24 164.736L81.9224 156.082L102.611 146.594Z" fill="#161616"/>
<path d="M256.683 108.955L251.485 105.202L259.802 97.5905L253.46 92.5859L261.777 86.2258L256.267 82.0553L265 39.5158L251.901 0L167.587 31.5918H97.4127L13.0993 0L0 39.5158L8.8368 82.0553L3.22283 86.2258L11.5398 92.5859L5.19812 97.5905L13.5151 105.202L8.31699 108.955L20.2727 123.031L2.18321 179.542L18.9211 237.199L77.8678 220.934L113.111 203.731L110.231 227.044L112.903 224.583L152.097 224.479L154.696 226.773L151.889 203.731L187.132 220.934L246.079 237.199L262.921 179.542L244.727 123.031L256.683 108.955Z" fill="url(#paint13_linear)" fill-opacity="0.1" style="mix-blend-mode:color-dodge"/>
<path d="M256.683 108.955L251.485 105.202L259.802 97.5905L253.46 92.5859L261.777 86.2258L256.267 82.0553L265 39.5158L251.901 0L167.587 31.5918H97.4127L13.0993 0L0 39.5158L8.8368 82.0553L3.22283 86.2258L11.5398 92.5859L5.19812 97.5905L13.5151 105.202L8.31699 108.955L20.2727 123.031L2.18321 179.542L18.9211 237.199L77.8678 220.934L113.111 203.731L117.997 200.186H125.275H139.829H147.107L151.889 203.731L187.132 220.934L246.079 237.199L262.921 179.542L244.727 123.031L256.683 108.955Z" fill="url(#paint14_radial)" style="mix-blend-mode:overlay"/>
</g>
<path d="M1166.17 120.732C1159.42 116.127 1151.72 112.742 1144.35 108.759C1139.75 106.295 1134.84 103.855 1130.83 100.47C1124.08 94.944 1125.3 83.5933 1132.67 78.6647C1143.11 71.9189 1160.02 75.603 1161.86 89.7167C1161.86 90.0154 1162.16 90.339 1162.48 90.339H1178.15C1178.44 90.339 1178.77 90.0403 1178.77 89.7167C1177.85 79.8844 1174.16 71.9189 1167.41 66.6916C1160.94 61.763 1153.27 59 1145.27 59C1104.11 59 1100.42 102.611 1122.54 116.426C1125 117.969 1146.82 129.021 1154.49 133.626C1162.16 138.53 1164.62 147.143 1161.24 153.888C1158.17 160.335 1150.18 164.318 1142.48 164.019C1133.89 163.721 1127.12 158.792 1124.98 151.424C1124.68 150.204 1124.36 147.74 1124.36 146.52C1124.36 146.222 1124.06 145.898 1123.73 145.898H1106.85C1106.55 145.898 1106.23 146.197 1106.23 146.52C1106.23 158.792 1109.29 165.563 1117.58 171.711C1125.25 177.536 1133.87 180 1142.78 180C1165.82 180 1177.8 166.807 1180.26 153.291C1182.13 140.372 1178.14 128.399 1166.17 120.732Z" fill="white"/>
<path d="M433.192 61.4634H425.522H417.229C416.931 61.4634 416.607 61.7621 416.607 61.7621L402.786 107.514C402.487 108.136 401.865 108.136 401.566 107.514L388.044 61.7621C388.044 61.4634 387.745 61.4634 387.421 61.4634H379.129H371.758H361.623C361.299 61.4634 361 61.7621 361 62.0608V178.754C361 179.053 361.299 179.377 361.623 179.377H378.506C378.805 179.377 379.129 179.078 379.129 178.754V90.0145C379.129 89.3922 380.05 89.0935 380.349 89.7158L394.469 135.766L395.39 138.828C395.39 139.126 395.689 139.126 396.013 139.126H408.912C409.211 139.126 409.535 138.828 409.535 138.828L410.456 135.766L424.576 89.7158C424.576 89.0935 425.497 89.4171 425.497 90.0145V178.754C425.497 179.053 425.796 179.377 426.12 179.377H443.003C443.302 179.377 443.626 179.078 443.626 178.754V62.0608C443.626 61.7621 443.327 61.4385 443.003 61.4385L433.192 61.4634Z" fill="white"/>
<path d="M907.506 61.4634C907.207 61.4634 906.883 61.7621 906.883 61.7621L893.063 107.514C892.764 108.136 892.141 108.136 891.842 107.514L878.022 61.7621C878.022 61.4634 877.723 61.4634 877.399 61.4634H851.6C851.301 61.4634 850.978 61.7621 850.978 62.0857V178.779C850.978 179.078 851.276 179.402 851.6 179.402H868.484C868.783 179.402 869.106 179.103 869.106 178.779V90.0145C869.106 89.3922 870.028 89.0935 870.327 89.7158L884.446 135.766L885.368 138.828C885.368 139.126 885.667 139.126 885.99 139.126H898.89C899.189 139.126 899.512 138.828 899.512 138.828L900.434 135.766L914.553 89.7158C914.852 89.0935 915.773 89.0935 915.773 90.0145V178.754C915.773 179.053 916.072 179.377 916.396 179.377H933.28C933.579 179.377 933.902 179.078 933.902 178.754V62.0608C933.902 61.7621 933.604 61.4385 933.28 61.4385L907.506 61.4634Z" fill="white"/>
<path d="M690.01 61.4648H658.359H641.475H610.148C609.849 61.4648 609.525 61.7635 609.525 62.0871V76.5245C609.525 76.8232 609.824 77.1468 610.148 77.1468H640.877V178.482C640.877 178.781 641.176 179.104 641.5 179.104H658.384C658.683 179.104 659.006 178.806 659.006 178.482V77.1219H689.711C690.01 77.1219 690.333 76.8232 690.333 76.4996V62.0623C690.632 61.7635 690.309 61.4648 690.01 61.4648Z" fill="white"/>
<path d="M789.545 179.377H804.91C805.208 179.377 805.532 179.078 805.532 178.456L773.582 61.4637C773.582 61.165 773.284 61.165 772.96 61.165H767.133H756.699H751.17C750.872 61.165 750.548 61.4637 750.548 61.4637L718.897 178.456C718.897 178.755 719.196 179.377 719.52 179.377H734.884C735.183 179.377 735.507 179.078 735.507 179.078L744.721 145.001C744.721 144.703 745.02 144.703 745.343 144.703H779.435C779.733 144.703 780.057 145.001 780.057 145.001L789.271 179.078C788.922 179.054 789.246 179.377 789.545 179.377ZM749.004 127.776L761.281 82.3232C761.58 81.7009 762.202 81.7009 762.501 82.3232L774.778 127.776C774.778 128.075 774.479 128.697 774.155 128.697H749.577C749.303 128.398 749.004 128.1 749.004 127.776Z" fill="white"/>
<path d="M1051.59 179.377H1066.96C1067.26 179.377 1067.58 179.078 1067.58 178.456L1035.63 61.4637C1035.63 61.165 1035.33 61.165 1035.01 61.165H1029.18H1018.75H1012.92C1012.62 61.165 1012.3 61.4637 1012.3 61.4637L980.646 178.456C980.646 178.755 980.944 179.377 981.268 179.377H996.633C996.932 179.377 997.255 179.078 997.255 179.078L1006.47 145.001C1006.47 144.703 1006.77 144.703 1007.09 144.703H1041.18C1041.48 144.703 1041.81 145.001 1041.81 145.001L1051.02 179.078C1050.97 179.054 1051.27 179.377 1051.59 179.377ZM1011.03 127.776L1023.3 82.3232C1023.6 81.7009 1024.22 81.7009 1024.52 82.3232L1036.8 127.776C1036.8 128.075 1036.5 128.697 1036.18 128.697H1011.6C1011.35 128.398 1011.03 128.1 1011.03 127.776Z" fill="white"/>
<path d="M512.132 162.176V125.934C512.132 125.635 512.431 125.311 512.755 125.311H557.604C557.903 125.311 558.227 125.013 558.227 124.689V110.252C558.227 109.953 557.928 109.629 557.604 109.629H512.755C512.456 109.629 512.132 109.331 512.132 109.007V77.7427C512.132 77.444 512.431 77.1204 512.755 77.1204H563.755C564.054 77.1204 564.377 76.8217 564.377 76.4981V62.0608C564.377 61.7621 564.079 61.4385 563.755 61.4385H512.132H494.626C494.327 61.4385 494.003 61.7372 494.003 62.0608V77.0955V109.331V124.988V162.45V178.406C494.003 178.705 494.302 179.028 494.626 179.028H512.132H566.195C566.494 179.028 566.818 178.73 566.818 178.406V163.048C566.818 162.749 566.519 162.425 566.195 162.425H512.755C512.456 162.799 512.132 162.475 512.132 162.176Z" fill="white"/>
<path d="M1320.39 178.132L1262.02 117.645C1261.72 117.346 1261.72 117.022 1262.02 116.724L1314.54 62.3844C1314.83 62.0857 1314.54 61.4634 1314.24 61.4634H1292.72C1292.42 61.4634 1292.42 61.4634 1292.42 61.7621L1247.87 108.136C1247.57 108.435 1246.95 108.136 1246.95 107.837V62.0608C1246.95 61.7621 1246.65 61.4385 1246.33 61.4385H1229.44C1229.15 61.4385 1228.82 61.7372 1228.82 62.0608V178.754C1228.82 179.053 1229.12 179.377 1229.44 179.377H1246.33C1246.63 179.377 1246.95 179.078 1246.95 178.754V127.178C1246.95 126.556 1247.57 126.257 1247.87 126.88L1298.25 179.078L1298.55 179.377H1320.06C1320.69 179.377 1320.99 178.754 1320.39 178.132Z" fill="white"/>
<rect x="1338" y="27" width="194" height="84" rx="12" fill="#24292E"/>
<path d="M1358 50.6376H1380.89V58.7139H1366.33V65.515H1377.7V73.5913H1366.33V88.3624H1358V50.6376Z" fill="white"/>
<path d="M1386.55 50.6376H1394.87V80.2861H1410.28V88.3624H1386.55V50.6376Z" fill="white"/>
<path d="M1427.39 50.6376H1434.94L1450.86 88.3624H1442.17L1438.87 80.3924H1423.46L1420.16 88.3624H1411.47L1427.39 50.6376ZM1426.45 73.0599H1435.83L1431.16 61.7425L1426.45 73.0599Z" fill="white"/>
<path d="M1464.82 89C1461.85 89 1459.18 88.4155 1456.81 87.2466C1454.43 86.0422 1452.51 84.3774 1451.04 82.252L1457.43 76.7793C1458.34 78.1253 1459.51 79.188 1460.94 79.9673C1462.38 80.7112 1463.77 81.0831 1465.13 81.0831C1466.53 81.0831 1467.63 80.7997 1468.43 80.233C1469.24 79.6308 1469.64 78.8692 1469.64 77.9482C1469.64 76.9918 1469.24 76.1594 1468.43 75.451C1467.67 74.7425 1466.34 74.0695 1464.45 73.4319L1461.83 72.5286C1458.8 71.5014 1456.47 70.0845 1454.87 68.2779C1453.26 66.436 1452.46 64.2221 1452.46 61.6362C1452.46 59.7943 1452.77 58.1649 1453.4 56.748C1454.06 55.2956 1454.95 54.0736 1456.07 53.0817C1457.22 52.0899 1458.59 51.3283 1460.16 50.797C1461.73 50.2657 1463.44 50 1465.29 50C1467.56 50 1469.69 50.3896 1471.68 51.1689C1473.67 51.9482 1475.54 53.2943 1477.29 55.2071L1471.84 61.0518C1470.97 59.9891 1469.97 59.2098 1468.85 58.7139C1467.74 58.1826 1466.58 57.9169 1465.4 57.9169C1464.84 57.9169 1464.28 57.97 1463.72 58.0763C1463.2 58.1826 1462.73 58.3597 1462.31 58.6076C1461.89 58.8556 1461.54 59.1567 1461.26 59.5109C1461.01 59.8651 1460.89 60.2902 1460.89 60.7861C1460.89 61.8134 1461.35 62.6281 1462.25 63.2302C1463.2 63.797 1464.66 64.4346 1466.65 65.1431L1469.27 66.0995C1471.96 67.0913 1474.11 68.5082 1475.72 70.3501C1477.36 72.1921 1478.16 74.53 1478.13 77.3638C1478.13 79.064 1477.79 80.6403 1477.13 82.0926C1476.47 83.5095 1475.54 84.7316 1474.35 85.7589C1473.2 86.7861 1471.81 87.5831 1470.16 88.1499C1468.56 88.7166 1466.78 89 1464.82 89Z" fill="white"/>
<path d="M1492.17 71.4659V88.3624H1483.9V50.6376H1492.17V66.4183L1504.8 50.6376H1515.01L1500.35 68.7561L1518 88.3624H1507.31L1492.17 71.4659Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear" x1="132.5" y1="31.5908" x2="132.5" y2="200.289" gradientUnits="userSpaceOnUse">
<stop stop-color="#8F8F8F"/>
<stop offset="1" stop-color="#AEAEAE"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="222.583" y1="107.077" x2="222.583" y2="179.957" gradientUnits="userSpaceOnUse">
<stop stop-color="#696969"/>
<stop offset="1" stop-color="#A6A6A6"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="42.4685" y1="107.077" x2="42.4685" y2="179.957" gradientUnits="userSpaceOnUse">
<stop stop-color="#696969"/>
<stop offset="1" stop-color="#A6A6A6"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="184.533" y1="102.178" x2="279.867" y2="27.8973" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1B1B"/>
<stop offset="1" stop-color="#565656"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="80.4668" y1="102.178" x2="-14.8672" y2="27.8973" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1B1B"/>
<stop offset="1" stop-color="#565656"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="225.027" y1="179.542" x2="225.027" y2="237.2" gradientUnits="userSpaceOnUse">
<stop stop-color="#787878"/>
<stop offset="1" stop-color="#5E5E5E"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="40.0254" y1="179.542" x2="40.0254" y2="237.2" gradientUnits="userSpaceOnUse">
<stop stop-color="#787878"/>
<stop offset="1" stop-color="#5E5E5E"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="87.4322" y1="74.4443" x2="87.4322" y2="134.604" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7A7A"/>
<stop offset="1" stop-color="#949494"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="177.568" y1="74.4443" x2="177.568" y2="134.604" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7A7A"/>
<stop offset="1" stop-color="#949494"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="95.4893" y1="245.645" x2="95.4893" y2="-25.2885" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7C7D"/>
<stop offset="1" stop-color="#CECECF"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="169.51" y1="245.645" x2="169.51" y2="-25.2885" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7C7D"/>
<stop offset="1" stop-color="#CECECF"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="198.464" y1="126.784" x2="198.464" y2="234.065" gradientUnits="userSpaceOnUse">
<stop stop-color="#3E3E3E"/>
<stop offset="1" stop-color="#616161"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="66.5358" y1="126.784" x2="66.5358" y2="234.065" gradientUnits="userSpaceOnUse">
<stop stop-color="#3E3E3E"/>
<stop offset="1" stop-color="#616161"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="132.032" y1="31.279" x2="132.032" y2="258.573" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF60DC"/>
<stop offset="1" stop-color="#6B71FF"/>
</linearGradient>
<radialGradient id="paint14_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(132.032 26.5872) rotate(90) scale(218.953 244.615)">
<stop stop-color="#FF60DC"/>
<stop offset="1" stop-color="#6B71FF"/>
</radialGradient>
<clipPath id="clip0">
<rect width="265" height="247" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,116 +0,0 @@
<svg width="1532" height="247" viewBox="0 0 1532 247" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M148.354 134.603L152.72 74.4431L170.498 31.5908H94.5015L112.279 74.4431L116.645 134.603L117.997 153.579L118.101 200.289H146.898L147.002 153.579L148.354 134.603Z" fill="url(#paint0_linear)"/>
<path d="M244.727 123.029L190.355 107.077L206.781 131.996L182.246 179.957L214.682 179.54H262.92L244.727 123.029Z" fill="url(#paint1_linear)"/>
<path d="M74.6449 107.077L20.2726 123.029L2.18311 179.54H50.4216L82.7539 179.957L58.2188 131.996L74.6449 107.077Z" fill="url(#paint2_linear)"/>
<path d="M153.76 164.735L146.899 200.289L151.889 203.729L182.246 179.957L183.182 156.081L153.76 164.735Z" fill="#ACACAC"/>
<path d="M81.9224 156.081L82.7541 179.957L113.111 203.729L118.101 200.289L111.24 164.735L81.9224 156.081Z" fill="#ACACAC"/>
<path d="M256.267 82.0553L265 39.5158L251.9 0L151.889 74.4441L189.211 108.017L244.727 123.031L256.683 108.955L251.485 105.202L259.802 97.5906L253.46 92.5859L261.777 86.2258L256.267 82.0553Z" fill="url(#paint3_linear)"/>
<path d="M8.73266 82.0553L-0.000171178 39.5158L13.0991 0L113.111 74.4441L75.7884 108.017L20.2725 123.031L8.31682 108.955L13.5149 105.202L5.19795 97.5906L11.5396 92.5859L3.22265 86.2258L8.73266 82.0553Z" fill="url(#paint4_linear)"/>
<path d="M58.2188 131.997L81.9222 156.082L82.7539 179.958L58.2188 131.997Z" fill="#8D8D8D"/>
<path d="M206.781 131.997L182.246 179.958L183.181 156.082L206.781 131.997Z" fill="#8D8D8D"/>
<path d="M187.132 220.935L151.889 203.731L154.696 226.774L154.384 236.47L187.132 220.935Z" fill="#FF9F5A"/>
<path d="M77.8677 220.934L110.616 236.469L110.408 226.773L113.111 203.73L77.8677 220.934Z" fill="#FF9F5A"/>
<path d="M214.682 179.542L187.132 220.935L246.079 237.2L262.921 179.542H214.682Z" fill="url(#paint5_linear)"/>
<path d="M2.18311 179.542L18.921 237.2L77.8677 220.935L50.4216 179.542H2.18311Z" fill="url(#paint6_linear)"/>
<path d="M13.0991 0L113.111 74.4441L97.4126 31.5918L13.0991 0Z" fill="#757575"/>
<path d="M167.587 31.5918L151.889 74.4441L251.9 0L167.587 31.5918Z" fill="#757575"/>
<path d="M74.6448 107.079L58.2188 131.998L116.646 134.604L113.111 74.4443L74.6448 107.079Z" fill="url(#paint7_linear)"/>
<path d="M190.355 107.079L151.889 74.4443L148.354 134.604L206.781 131.998L190.355 107.079Z" fill="url(#paint8_linear)"/>
<path d="M77.8677 220.934L113.111 203.731L82.7539 179.959L77.8677 220.934Z" fill="url(#paint9_linear)"/>
<path d="M151.889 203.731L187.132 220.934L182.246 179.959L151.889 203.731Z" fill="url(#paint10_linear)"/>
<path d="M182.246 179.958L187.132 220.934L214.682 179.541L182.246 179.958Z" fill="url(#paint11_linear)"/>
<path d="M82.7539 179.958L77.8677 220.934L50.3177 179.541L82.7539 179.958Z" fill="url(#paint12_linear)"/>
<path d="M206.781 131.997L148.354 134.604L153.761 164.736L162.389 146.594L183.182 156.082L206.781 131.997Z" fill="#666666"/>
<path d="M81.9222 156.082L102.611 146.594L111.24 164.736L116.646 134.604L58.2188 131.997L81.9222 156.082Z" fill="#666666"/>
<path d="M153.76 164.736L147.002 153.579L148.354 134.604L153.76 164.736Z" fill="#8D8D8D"/>
<path d="M111.24 164.736L116.646 134.604L117.997 153.579L111.24 164.736Z" fill="#8D8D8D"/>
<path d="M147.003 153.58L153.76 164.736L146.899 200.29L147.003 153.58Z" fill="#8D8D8D"/>
<path d="M117.997 153.58L118.101 200.29L111.24 164.736L117.997 153.58Z" fill="#8D8D8D"/>
<path d="M154.571 236.345L154.696 226.773L152.097 224.48H112.903L110.408 226.773L110.616 236.47L77.8677 220.935L89.3035 230.318L112.591 246.479H152.409L175.696 230.318L187.132 220.935L154.571 236.345Z" fill="#DF7554"/>
<path d="M151.889 203.731L146.899 200.29H118.101L113.111 203.731L110.408 226.773L112.903 224.479H152.097L154.696 226.773L151.889 203.731Z" fill="#161616" stroke="#161616" stroke-width="0.0657594" stroke-miterlimit="10" stroke-linejoin="round"/>
<path d="M162.389 146.594L153.76 164.736L183.182 156.082L162.389 146.594Z" fill="#161616"/>
<path d="M102.611 146.594L111.24 164.736L81.9224 156.082L102.611 146.594Z" fill="#161616"/>
<path d="M256.683 108.955L251.485 105.202L259.802 97.5905L253.46 92.5859L261.777 86.2258L256.267 82.0553L265 39.5158L251.901 0L167.587 31.5918H97.4127L13.0993 0L0 39.5158L8.8368 82.0553L3.22283 86.2258L11.5398 92.5859L5.19812 97.5905L13.5151 105.202L8.31699 108.955L20.2727 123.031L2.18321 179.542L18.9211 237.199L77.8678 220.934L113.111 203.731L110.231 227.044L112.903 224.583L152.097 224.479L154.696 226.773L151.889 203.731L187.132 220.934L246.079 237.199L262.921 179.542L244.727 123.031L256.683 108.955Z" fill="url(#paint13_linear)" fill-opacity="0.1" style="mix-blend-mode:color-dodge"/>
<path d="M256.683 108.955L251.485 105.202L259.802 97.5905L253.46 92.5859L261.777 86.2258L256.267 82.0553L265 39.5158L251.901 0L167.587 31.5918H97.4127L13.0993 0L0 39.5158L8.8368 82.0553L3.22283 86.2258L11.5398 92.5859L5.19812 97.5905L13.5151 105.202L8.31699 108.955L20.2727 123.031L2.18321 179.542L18.9211 237.199L77.8678 220.934L113.111 203.731L117.997 200.186H125.275H139.829H147.107L151.889 203.731L187.132 220.934L246.079 237.199L262.921 179.542L244.727 123.031L256.683 108.955Z" fill="url(#paint14_radial)" style="mix-blend-mode:overlay"/>
</g>
<path d="M1166.17 120.732C1159.42 116.127 1151.72 112.742 1144.35 108.759C1139.75 106.295 1134.84 103.855 1130.83 100.47C1124.08 94.944 1125.3 83.5933 1132.67 78.6647C1143.11 71.9189 1160.02 75.603 1161.86 89.7167C1161.86 90.0154 1162.16 90.339 1162.48 90.339H1178.15C1178.44 90.339 1178.77 90.0403 1178.77 89.7167C1177.85 79.8844 1174.16 71.9189 1167.41 66.6916C1160.94 61.763 1153.27 59 1145.27 59C1104.11 59 1100.42 102.611 1122.54 116.426C1125 117.969 1146.82 129.021 1154.49 133.626C1162.16 138.53 1164.62 147.143 1161.24 153.888C1158.17 160.335 1150.18 164.318 1142.48 164.019C1133.89 163.721 1127.12 158.792 1124.98 151.424C1124.68 150.204 1124.36 147.74 1124.36 146.52C1124.36 146.222 1124.06 145.898 1123.73 145.898H1106.85C1106.55 145.898 1106.23 146.197 1106.23 146.52C1106.23 158.792 1109.29 165.563 1117.58 171.711C1125.25 177.536 1133.87 180 1142.78 180C1165.82 180 1177.8 166.807 1180.26 153.291C1182.13 140.372 1178.14 128.399 1166.17 120.732Z" fill="#24292E"/>
<path d="M433.192 61.4634H425.522H417.229C416.931 61.4634 416.607 61.7621 416.607 61.7621L402.786 107.514C402.487 108.136 401.865 108.136 401.566 107.514L388.044 61.7621C388.044 61.4634 387.745 61.4634 387.421 61.4634H379.129H371.758H361.623C361.299 61.4634 361 61.7621 361 62.0608V178.754C361 179.053 361.299 179.377 361.623 179.377H378.506C378.805 179.377 379.129 179.078 379.129 178.754V90.0145C379.129 89.3922 380.05 89.0935 380.349 89.7158L394.469 135.766L395.39 138.828C395.39 139.126 395.689 139.126 396.013 139.126H408.912C409.211 139.126 409.535 138.828 409.535 138.828L410.456 135.766L424.576 89.7158C424.576 89.0935 425.497 89.4171 425.497 90.0145V178.754C425.497 179.053 425.796 179.377 426.12 179.377H443.003C443.302 179.377 443.626 179.078 443.626 178.754V62.0608C443.626 61.7621 443.327 61.4385 443.003 61.4385L433.192 61.4634Z" fill="#24292E"/>
<path d="M907.506 61.4634C907.207 61.4634 906.883 61.7621 906.883 61.7621L893.063 107.514C892.764 108.136 892.141 108.136 891.842 107.514L878.022 61.7621C878.022 61.4634 877.723 61.4634 877.399 61.4634H851.6C851.301 61.4634 850.978 61.7621 850.978 62.0857V178.779C850.978 179.078 851.276 179.402 851.6 179.402H868.484C868.783 179.402 869.106 179.103 869.106 178.779V90.0145C869.106 89.3922 870.028 89.0935 870.327 89.7158L884.446 135.766L885.368 138.828C885.368 139.126 885.667 139.126 885.99 139.126H898.89C899.189 139.126 899.512 138.828 899.512 138.828L900.434 135.766L914.553 89.7158C914.852 89.0935 915.773 89.0935 915.773 90.0145V178.754C915.773 179.053 916.072 179.377 916.396 179.377H933.28C933.579 179.377 933.902 179.078 933.902 178.754V62.0608C933.902 61.7621 933.604 61.4385 933.28 61.4385L907.506 61.4634Z" fill="#24292E"/>
<path d="M690.01 61.4648H658.359H641.475H610.148C609.849 61.4648 609.525 61.7635 609.525 62.0871V76.5245C609.525 76.8232 609.824 77.1468 610.148 77.1468H640.877V178.482C640.877 178.781 641.176 179.104 641.5 179.104H658.384C658.683 179.104 659.006 178.806 659.006 178.482V77.1219H689.711C690.01 77.1219 690.333 76.8232 690.333 76.4996V62.0623C690.632 61.7635 690.309 61.4648 690.01 61.4648Z" fill="#24292E"/>
<path d="M789.545 179.377H804.91C805.208 179.377 805.532 179.078 805.532 178.456L773.582 61.4637C773.582 61.165 773.284 61.165 772.96 61.165H767.133H756.699H751.17C750.872 61.165 750.548 61.4637 750.548 61.4637L718.897 178.456C718.897 178.755 719.196 179.377 719.52 179.377H734.884C735.183 179.377 735.507 179.078 735.507 179.078L744.721 145.001C744.721 144.703 745.02 144.703 745.343 144.703H779.435C779.733 144.703 780.057 145.001 780.057 145.001L789.271 179.078C788.922 179.054 789.246 179.377 789.545 179.377ZM749.004 127.776L761.281 82.3232C761.58 81.7009 762.202 81.7009 762.501 82.3232L774.778 127.776C774.778 128.075 774.479 128.697 774.155 128.697H749.577C749.303 128.398 749.004 128.1 749.004 127.776Z" fill="#24292E"/>
<path d="M1051.59 179.377H1066.96C1067.26 179.377 1067.58 179.078 1067.58 178.456L1035.63 61.4637C1035.63 61.165 1035.33 61.165 1035.01 61.165H1029.18H1018.75H1012.92C1012.62 61.165 1012.3 61.4637 1012.3 61.4637L980.646 178.456C980.646 178.755 980.944 179.377 981.268 179.377H996.633C996.932 179.377 997.255 179.078 997.255 179.078L1006.47 145.001C1006.47 144.703 1006.77 144.703 1007.09 144.703H1041.18C1041.48 144.703 1041.81 145.001 1041.81 145.001L1051.02 179.078C1050.97 179.054 1051.27 179.377 1051.59 179.377ZM1011.03 127.776L1023.3 82.3232C1023.6 81.7009 1024.22 81.7009 1024.52 82.3232L1036.8 127.776C1036.8 128.075 1036.5 128.697 1036.18 128.697H1011.6C1011.35 128.398 1011.03 128.1 1011.03 127.776Z" fill="#24292E"/>
<path d="M512.132 162.176V125.934C512.132 125.635 512.431 125.311 512.755 125.311H557.604C557.903 125.311 558.227 125.013 558.227 124.689V110.252C558.227 109.953 557.928 109.629 557.604 109.629H512.755C512.456 109.629 512.132 109.331 512.132 109.007V77.7427C512.132 77.444 512.431 77.1204 512.755 77.1204H563.755C564.054 77.1204 564.377 76.8217 564.377 76.4981V62.0608C564.377 61.7621 564.079 61.4385 563.755 61.4385H512.132H494.626C494.327 61.4385 494.003 61.7372 494.003 62.0608V77.0955V109.331V124.988V162.45V178.406C494.003 178.705 494.302 179.028 494.626 179.028H512.132H566.195C566.494 179.028 566.818 178.73 566.818 178.406V163.048C566.818 162.749 566.519 162.425 566.195 162.425H512.755C512.456 162.799 512.132 162.475 512.132 162.176Z" fill="#24292E"/>
<path d="M1320.39 178.132L1262.02 117.645C1261.72 117.346 1261.72 117.022 1262.02 116.724L1314.54 62.3844C1314.83 62.0857 1314.54 61.4634 1314.24 61.4634H1292.72C1292.42 61.4634 1292.42 61.4634 1292.42 61.7621L1247.87 108.136C1247.57 108.435 1246.95 108.136 1246.95 107.837V62.0608C1246.95 61.7621 1246.65 61.4385 1246.33 61.4385H1229.44C1229.15 61.4385 1228.82 61.7372 1228.82 62.0608V178.754C1228.82 179.053 1229.12 179.377 1229.44 179.377H1246.33C1246.63 179.377 1246.95 179.078 1246.95 178.754V127.178C1246.95 126.556 1247.57 126.257 1247.87 126.88L1298.25 179.078L1298.55 179.377H1320.06C1320.69 179.377 1320.99 178.754 1320.39 178.132Z" fill="#24292E"/>
<rect x="1338" y="27" width="194" height="84" rx="12" fill="#24292E"/>
<path d="M1358 50.6376H1380.89V58.7139H1366.33V65.515H1377.7V73.5913H1366.33V88.3624H1358V50.6376Z" fill="white"/>
<path d="M1386.55 50.6376H1394.87V80.2861H1410.28V88.3624H1386.55V50.6376Z" fill="white"/>
<path d="M1427.39 50.6376H1434.94L1450.86 88.3624H1442.17L1438.87 80.3924H1423.46L1420.16 88.3624H1411.47L1427.39 50.6376ZM1426.45 73.0599H1435.83L1431.16 61.7425L1426.45 73.0599Z" fill="white"/>
<path d="M1464.82 89C1461.85 89 1459.18 88.4155 1456.81 87.2466C1454.43 86.0422 1452.51 84.3774 1451.04 82.252L1457.43 76.7793C1458.34 78.1253 1459.51 79.188 1460.94 79.9673C1462.38 80.7112 1463.77 81.0831 1465.13 81.0831C1466.53 81.0831 1467.63 80.7997 1468.43 80.233C1469.24 79.6308 1469.64 78.8692 1469.64 77.9482C1469.64 76.9918 1469.24 76.1594 1468.43 75.451C1467.67 74.7425 1466.34 74.0695 1464.45 73.4319L1461.83 72.5286C1458.8 71.5014 1456.47 70.0845 1454.87 68.2779C1453.26 66.436 1452.46 64.2221 1452.46 61.6362C1452.46 59.7943 1452.77 58.1649 1453.4 56.748C1454.06 55.2956 1454.95 54.0736 1456.07 53.0817C1457.22 52.0899 1458.59 51.3283 1460.16 50.797C1461.73 50.2657 1463.44 50 1465.29 50C1467.56 50 1469.69 50.3896 1471.68 51.1689C1473.67 51.9482 1475.54 53.2943 1477.29 55.2071L1471.84 61.0518C1470.97 59.9891 1469.97 59.2098 1468.85 58.7139C1467.74 58.1826 1466.58 57.9169 1465.4 57.9169C1464.84 57.9169 1464.28 57.97 1463.72 58.0763C1463.2 58.1826 1462.73 58.3597 1462.31 58.6076C1461.89 58.8556 1461.54 59.1567 1461.26 59.5109C1461.01 59.8651 1460.89 60.2902 1460.89 60.7861C1460.89 61.8134 1461.35 62.6281 1462.25 63.2302C1463.2 63.797 1464.66 64.4346 1466.65 65.1431L1469.27 66.0995C1471.96 67.0913 1474.11 68.5082 1475.72 70.3501C1477.36 72.1921 1478.16 74.53 1478.13 77.3638C1478.13 79.064 1477.79 80.6403 1477.13 82.0926C1476.47 83.5095 1475.54 84.7316 1474.35 85.7589C1473.2 86.7861 1471.81 87.5831 1470.16 88.1499C1468.56 88.7166 1466.78 89 1464.82 89Z" fill="white"/>
<path d="M1492.17 71.4659V88.3624H1483.9V50.6376H1492.17V66.4183L1504.8 50.6376H1515.01L1500.35 68.7561L1518 88.3624H1507.31L1492.17 71.4659Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear" x1="132.5" y1="31.5908" x2="132.5" y2="200.289" gradientUnits="userSpaceOnUse">
<stop stop-color="#8F8F8F"/>
<stop offset="1" stop-color="#AEAEAE"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="222.583" y1="107.077" x2="222.583" y2="179.957" gradientUnits="userSpaceOnUse">
<stop stop-color="#696969"/>
<stop offset="1" stop-color="#A6A6A6"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="42.4685" y1="107.077" x2="42.4685" y2="179.957" gradientUnits="userSpaceOnUse">
<stop stop-color="#696969"/>
<stop offset="1" stop-color="#A6A6A6"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="184.533" y1="102.178" x2="279.867" y2="27.8973" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1B1B"/>
<stop offset="1" stop-color="#565656"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="80.4668" y1="102.178" x2="-14.8672" y2="27.8973" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1B1B"/>
<stop offset="1" stop-color="#565656"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="225.027" y1="179.542" x2="225.027" y2="237.2" gradientUnits="userSpaceOnUse">
<stop stop-color="#787878"/>
<stop offset="1" stop-color="#5E5E5E"/>
</linearGradient>
<linearGradient id="paint6_linear" x1="40.0254" y1="179.542" x2="40.0254" y2="237.2" gradientUnits="userSpaceOnUse">
<stop stop-color="#787878"/>
<stop offset="1" stop-color="#5E5E5E"/>
</linearGradient>
<linearGradient id="paint7_linear" x1="87.4322" y1="74.4443" x2="87.4322" y2="134.604" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7A7A"/>
<stop offset="1" stop-color="#949494"/>
</linearGradient>
<linearGradient id="paint8_linear" x1="177.568" y1="74.4443" x2="177.568" y2="134.604" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7A7A"/>
<stop offset="1" stop-color="#949494"/>
</linearGradient>
<linearGradient id="paint9_linear" x1="95.4893" y1="245.645" x2="95.4893" y2="-25.2885" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7C7D"/>
<stop offset="1" stop-color="#CECECF"/>
</linearGradient>
<linearGradient id="paint10_linear" x1="169.51" y1="245.645" x2="169.51" y2="-25.2885" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7C7D"/>
<stop offset="1" stop-color="#CECECF"/>
</linearGradient>
<linearGradient id="paint11_linear" x1="198.464" y1="126.784" x2="198.464" y2="234.065" gradientUnits="userSpaceOnUse">
<stop stop-color="#3E3E3E"/>
<stop offset="1" stop-color="#616161"/>
</linearGradient>
<linearGradient id="paint12_linear" x1="66.5358" y1="126.784" x2="66.5358" y2="234.065" gradientUnits="userSpaceOnUse">
<stop stop-color="#3E3E3E"/>
<stop offset="1" stop-color="#616161"/>
</linearGradient>
<linearGradient id="paint13_linear" x1="132.032" y1="31.279" x2="132.032" y2="258.573" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF60DC"/>
<stop offset="1" stop-color="#6B71FF"/>
</linearGradient>
<radialGradient id="paint14_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(132.032 26.5872) rotate(90) scale(218.953 244.615)">
<stop stop-color="#FF60DC"/>
<stop offset="1" stop-color="#6B71FF"/>
</radialGradient>
<clipPath id="clip0">
<rect width="265" height="247" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

9
app/images/arbitrum.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,3 +0,0 @@
<svg height="15" width="9" xmlns="http://www.w3.org/2000/svg">
<path d="M8.126 14.063L2 7.631 8.315 1" fill="none" stroke="#000" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 159 B

View File

@ -1,3 +0,0 @@
<svg height="15" width="9" xmlns="http://www.w3.org/2000/svg">
<path d="M8.126 14.063L2 7.631 8.315 1" fill="none" stroke="#3099f2" stroke-width="2"/>
</svg>

Before

Width:  |  Height:  |  Size: 162 B

View File

@ -1,3 +0,0 @@
<svg viewBox="0 0 10 14" fill="#6A737D" xmlns="http://www.w3.org/2000/svg">
<path d="M8.90625 7.53125C9.1875 7.25 9.1875 6.78125 8.90625 6.5L2.84375 0.40625C2.53125 0.125 2.0625 0.125 1.78125 0.40625L1.0625 1.125C0.78125 1.40625 0.78125 1.875 1.0625 2.1875L5.875 7L1.0625 11.8438C0.78125 12.1562 0.78125 12.625 1.0625 12.9062L1.78125 13.625C2.0625 13.9062 2.53125 13.9062 2.84375 13.625L8.90625 7.53125Z" fill="#6A737D"/>
</svg>

Before

Width:  |  Height:  |  Size: 429 B

View File

@ -1 +0,0 @@
<svg fill="none" height="7" viewBox="0 0 11 7" width="11" xmlns="http://www.w3.org/2000/svg"><path d="m1 1 4.57143 4.57143 4.56927-4.56923" stroke="#545556"/></svg>

Before

Width:  |  Height:  |  Size: 164 B

View File

@ -1,26 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="16" height="16" fill="#E5E5E5"/>
<g clip-path="url(#clip0_0_1)">
<rect width="413" height="679" transform="translate(-57 -402)" fill="white"/>
<g filter="url(#filter0_d_0_1)">
<path d="M-31 -376C-31 -380.418 -27.4183 -384 -23 -384H321C325.418 -384 329 -380.418 329 -376V252C329 256.418 325.418 260 321 260H-23C-27.4183 260 -31 256.418 -31 252V-376Z" fill="white"/>
</g>
<circle cx="8" cy="8" r="7.5" fill="#F2F3F4" stroke="#D6D9DC"/>
<line x1="4.1001" y1="7.83325" x2="11.7668" y2="7.83325" stroke="#D6D9DC" stroke-linecap="round"/>
</g>
<rect x="-2918.5" y="-1621.5" width="9747" height="4874" stroke="black"/>
<defs>
<filter id="filter0_d_0_1" x="-58" y="-409" width="414" height="698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="13.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.12594 0 0 0 0 0.182502 0 0 0 0 0.305378 0 0 0 0.26 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_0_1"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_0_1" result="shape"/>
</filter>
<clipPath id="clip0_0_1">
<rect width="413" height="679" fill="white" transform="translate(-57 -402)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

5
app/images/optimism.svg Normal file
View File

@ -0,0 +1,5 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="250" cy="250" r="250" fill="#FF0420"/>
<path d="M177.133 316.446C162.247 316.446 150.051 312.943 140.544 305.938C131.162 298.808 126.471 288.676 126.471 275.541C126.471 272.789 126.784 269.411 127.409 265.408C129.036 256.402 131.35 245.581 134.352 232.947C142.858 198.547 164.812 181.347 200.213 181.347C209.845 181.347 218.476 182.973 226.107 186.225C233.738 189.352 239.742 194.106 244.12 200.486C248.498 206.74 250.688 214.246 250.688 223.002C250.688 225.629 250.375 228.944 249.749 232.947C247.873 244.08 245.621 254.901 242.994 265.408C238.616 282.546 231.048 295.368 220.29 303.874C209.532 312.255 195.147 316.446 177.133 316.446ZM179.76 289.426C186.766 289.426 192.707 287.362 197.586 283.234C202.59 279.106 206.155 272.789 208.281 264.283C211.158 252.524 213.348 242.266 214.849 233.51C215.349 230.883 215.599 228.194 215.599 225.441C215.599 214.058 209.657 208.366 197.774 208.366C190.768 208.366 184.764 210.43 179.76 214.558C174.882 218.687 171.379 225.004 169.253 233.51C167.001 241.891 164.749 252.149 162.498 264.283C161.997 266.784 161.747 269.411 161.747 272.163C161.747 283.672 167.752 289.426 179.76 289.426Z" fill="white"/>
<path d="M259.303 314.57C257.927 314.57 256.863 314.132 256.113 313.256C255.487 312.255 255.3 311.13 255.55 309.879L281.444 187.914C281.694 186.538 282.382 185.412 283.508 184.536C284.634 183.661 285.822 183.223 287.073 183.223H336.985C350.87 183.223 362.003 186.1 370.384 191.854C378.891 197.609 383.144 205.927 383.144 216.81C383.144 219.937 382.769 223.19 382.018 226.567C378.891 240.953 372.574 251.586 363.067 258.466C353.685 265.346 340.8 268.786 324.413 268.786H299.082L290.451 309.879C290.2 311.255 289.512 312.38 288.387 313.256C287.261 314.132 286.072 314.57 284.822 314.57H259.303ZM325.727 242.892C330.98 242.892 335.546 241.453 339.424 238.576C343.427 235.699 346.054 231.571 347.305 226.192C347.68 224.065 347.868 222.189 347.868 220.563C347.868 216.935 346.805 214.183 344.678 212.307C342.551 210.305 338.924 209.305 333.795 209.305H311.278L304.148 242.892H325.727Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

3
app/images/times.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.42237 13.347C9.42237 13.5827 9.33819 13.7847 9.16983 13.9531C9.00147 14.1214 8.79944 14.2056 8.56374 14.2056L6.84648 14.2056C6.61078 14.2056 6.40875 14.1214 6.24039 13.9531C6.07203 13.7847 5.98785 13.5827 5.98785 13.347L5.98785 9.63466L2.27554 9.63466C2.03984 9.63466 1.83781 9.55048 1.66945 9.38212C1.50109 9.21377 1.41691 9.01174 1.41691 8.77603L1.41691 7.05877C1.41691 6.82307 1.50109 6.62104 1.66945 6.45268C1.83781 6.28432 2.03984 6.20014 2.27554 6.20014L5.98785 6.20014V2.48783C5.98785 2.25213 6.07203 2.0501 6.24039 1.88174C6.40875 1.71338 6.61078 1.6292 6.84648 1.6292H8.56374C8.79944 1.6292 9.00147 1.71338 9.16983 1.88174C9.33819 2.0501 9.42237 2.25213 9.42237 2.48783L9.42237 6.20014H13.1347C13.3704 6.20014 13.5724 6.28432 13.7408 6.45268C13.9091 6.62104 13.9933 6.82307 13.9933 7.05877V8.77603C13.9933 9.01173 13.9091 9.21377 13.7408 9.38212C13.5724 9.55048 13.3704 9.63466 13.1347 9.63466H9.42237L9.42237 13.347Z" fill="#6A737D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -16,6 +16,7 @@ import {
ENVIRONMENT_TYPE_POPUP,
ENVIRONMENT_TYPE_NOTIFICATION,
ENVIRONMENT_TYPE_FULLSCREEN,
PLATFORM_FIREFOX,
} from '../../shared/constants/app';
import { SECOND } from '../../shared/constants/time';
import {
@ -38,6 +39,7 @@ import rawFirstTimeState from './first-time-state';
import getFirstPreferredLangCode from './lib/get-first-preferred-lang-code';
import getObjStructure from './lib/getObjStructure';
import setupEnsIpfsResolver from './lib/ens-ipfs/setup';
import { getPlatform } from './lib/util';
/* eslint-enable import/first */
const { sentry } = global;
@ -345,12 +347,22 @@ function setupController(initState, initLangCode) {
*/
function connectRemote(remotePort) {
const processName = remotePort.name;
const isMetaMaskInternalProcess = metamaskInternalProcessHash[processName];
if (metamaskBlockedPorts.includes(remotePort.name)) {
return;
}
let isMetaMaskInternalProcess = false;
const sourcePlatform = getPlatform();
if (sourcePlatform === PLATFORM_FIREFOX) {
isMetaMaskInternalProcess = metamaskInternalProcessHash[processName];
} else {
isMetaMaskInternalProcess =
remotePort.sender.origin ===
`chrome-extension://${extension.runtime.id}`;
}
if (isMetaMaskInternalProcess) {
const portStream = new PortStream(remotePort);
// communication with popup

View File

@ -3,8 +3,8 @@ import { warn } from 'loglevel';
import SINGLE_CALL_BALANCES_ABI from 'single-call-balance-checker-abi';
import { SINGLE_CALL_BALANCES_ADDRESS } from '../constants/contracts';
import { MINUTE } from '../../../shared/constants/time';
import { isEqualCaseInsensitive } from '../../../ui/helpers/utils/util';
import { MAINNET_CHAIN_ID } from '../../../shared/constants/network';
import { isEqualCaseInsensitive } from '../../../shared/modules/string-utils';
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = MINUTE * 3;

View File

@ -69,7 +69,7 @@ export default class OnboardingController {
* @param {string} tabId - The id of the tab registering
*/
registerOnboarding = async (location, tabId) => {
if (this.completedOnboarding) {
if (this.store.getState().completedOnboarding) {
log.debug('Ignoring registerOnboarding; user already onboarded');
return;
}

View File

@ -68,6 +68,7 @@ export default class PreferencesController {
ledgerTransportType: window.navigator.hid
? LEDGER_TRANSPORT_TYPES.WEBHID
: LEDGER_TRANSPORT_TYPES.U2F,
theme: 'default',
...opts.initState,
};
@ -169,6 +170,15 @@ export default class PreferencesController {
this.store.updateState({ eip1559V2Enabled: val });
}
/**
* Setter for the `theme` property
*
* @param {string} val - 'default' or 'dark' value based on the mode selected by user.
*/
setTheme(val) {
this.store.updateState({ theme: val });
}
/**
* Add new methodData to state, to avoid requesting this information again through Infura
*

View File

@ -351,4 +351,18 @@ describe('preferences controller', function () {
);
});
});
describe('setTheme', function () {
it('should default to value "default"', function () {
const state = preferencesController.store.getState();
assert.equal(state.theme, 'default');
});
it('should set the setTheme property in state', function () {
const state = preferencesController.store.getState();
assert.equal(state.theme, 'default');
preferencesController.setTheme('dark');
assert.equal(preferencesController.store.getState().theme, 'dark');
});
});
});

View File

@ -28,7 +28,7 @@ import {
} from '../../../ui/pages/swaps/swaps.util';
import fetchWithCache from '../../../ui/helpers/utils/fetch-with-cache';
import { MINUTE, SECOND } from '../../../shared/constants/time';
import { isEqualCaseInsensitive } from '../../../ui/helpers/utils/util';
import { isEqualCaseInsensitive } from '../../../shared/modules/string-utils';
import { NETWORK_EVENTS } from './network';
// The MAX_GAS_LIMIT is a number that is higher than the maximum gas costs we have observed on any aggregator

View File

@ -3,13 +3,12 @@ import { ObservableStore } from '@metamask/obs-store';
import { bufferToHex, keccak, toBuffer, isHexString } from 'ethereumjs-util';
import EthQuery from 'ethjs-query';
import { ethErrors } from 'eth-rpc-errors';
import abi from 'human-standard-token-abi';
import Common from '@ethereumjs/common';
import { TransactionFactory } from '@ethereumjs/tx';
import { ethers } from 'ethers';
import NonceTracker from 'nonce-tracker';
import log from 'loglevel';
import BigNumber from 'bignumber.js';
import { merge, pickBy } from 'lodash';
import cleanErrorStack from '../../lib/cleanErrorStack';
import {
hexToBn,
@ -46,16 +45,15 @@ import {
NETWORK_TYPE_RPC,
CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP,
} from '../../../../shared/constants/network';
import { isEIP1559Transaction } from '../../../../shared/modules/transaction.utils';
import { readAddressAsContract } from '../../../../shared/modules/contract-utils';
import { isEqualCaseInsensitive } from '../../../../ui/helpers/utils/util';
import {
determineTransactionType,
isEIP1559Transaction,
} from '../../../../shared/modules/transaction.utils';
import TransactionStateManager from './tx-state-manager';
import TxGasUtil from './tx-gas-utils';
import PendingTransactionTracker from './pending-tx-tracker';
import * as txUtils from './lib/util';
const hstInterface = new ethers.utils.Interface(abi);
const MAX_MEMSTORE_TX_LIST_SIZE = 100; // Number of transactions (by unique nonces) to keep in memory
const SWAP_TRANSACTION_TYPES = [
@ -130,6 +128,8 @@ export default class TransactionController extends EventEmitter {
this.updateEventFragment = opts.updateEventFragment;
this.finalizeEventFragment = opts.finalizeEventFragment;
this.getEventFragmentById = opts.getEventFragmentById;
this.getDeviceModel = opts.getDeviceModel;
this.getAccountType = opts.getAccountType;
this.memStore = new ObservableStore({});
this.query = new EthQuery(this.provider);
@ -347,6 +347,235 @@ export default class TransactionController extends EventEmitter {
});
}
// ====================================================================================================================================================
/**
* @param {number} txId
* @returns {TransactionMeta} the txMeta who matches the given id if none found
* for the network returns undefined
*/
_getTransaction(txId) {
const { transactions } = this.store.getState();
return transactions[txId];
}
_checkIfTxStatusIsUnapproved(txId) {
return (
this.txStateManager.getTransaction(txId).status ===
TRANSACTION_STATUSES.UNAPPROVED
);
}
_updateTransaction(txId, proposedUpdate, note) {
const txMeta = this.txStateManager.getTransaction(txId);
const updated = merge(txMeta, proposedUpdate);
this.txStateManager.updateTransaction(updated, note);
}
/**
*
* @param {string} txId - transaction id
* @param {object} editableParams - holds the editable parameters
* @param {object} editableParams.data
* @param {string} editableParams.from
* @param {string} editableParams.to
* @param {string} editableParams.value
*/
updateEditableParams(txId, { data, from, to, value }) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
const editableParams = {
txParams: {
data,
from,
to,
value,
},
};
// only update what is defined
editableParams.txParams = pickBy(editableParams.txParams);
const note = `Update Editable Params for ${txId}`;
this._updateTransaction(txId, editableParams, note);
}
/**
* updates the gas fees of the transaction with id if the transaction state is unapproved
*
* @param {string} txId - transaction id
* @param {object} txGasFees - holds the gas fees parameters
* @param {string} txGasFees.gasLimit
* @param {string} txGasFees.gasPrice
* @param {string} txGasFees.maxPriorityFeePerGas
* @param {string} txGasFees.maxFeePerGas
* @param {string} txGasFees.estimateUsed
* @param {string} txGasFees.estimateSuggested
* @param {string} txGasFees.defaultGasEstimates
* @param {string} txGasFees.gas
* @param {string} txGasFees.originalGasEstimate
*/
updateTransactionGasFees(
txId,
{
gas,
gasLimit,
gasPrice,
maxPriorityFeePerGas,
maxFeePerGas,
estimateUsed,
estimateSuggested,
defaultGasEstimates,
originalGasEstimate,
},
) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
let txGasFees = {
txParams: {
gas,
gasLimit,
gasPrice,
maxPriorityFeePerGas,
maxFeePerGas,
},
estimateUsed,
estimateSuggested,
defaultGasEstimates,
originalGasEstimate,
};
// only update what is defined
txGasFees.txParams = pickBy(txGasFees.txParams);
txGasFees = pickBy(txGasFees);
const note = `Update Transaction Gas Fees for ${txId}`;
this._updateTransaction(txId, txGasFees, note);
}
/**
* updates the estimate base fees of the transaction with id if the transaction state is unapproved
*
* @param {string} txId - transaction id
* @param {object} txEstimateBaseFees - holds the estimate base fees parameters
* @param {string} txEstimateBaseFees.estimatedBaseFee
* @param {string} txEstimateBaseFees.decEstimatedBaseFee
*/
updateTransactionEstimatedBaseFee(
txId,
{ estimatedBaseFee, decEstimatedBaseFee },
) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
let txEstimateBaseFees = { estimatedBaseFee, decEstimatedBaseFee };
// only update what is defined
txEstimateBaseFees = pickBy(txEstimateBaseFees);
const note = `Update Transaction Estimated Base Fees for ${txId}`;
this._updateTransaction(txId, txEstimateBaseFees, note);
}
/**
* updates a swap approval transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapApprovalTransaction - holds the metadata and token symbol
* @param {string} swapApprovalTransaction.type
* @param {string} swapApprovalTransaction.sourceTokenSymbol
*/
updateSwapApprovalTransaction(txId, { type, sourceTokenSymbol }) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
let swapApprovalTransaction = { type, sourceTokenSymbol };
// only update what is defined
swapApprovalTransaction = pickBy(swapApprovalTransaction);
const note = `Update Swap Approval Transaction for ${txId}`;
this._updateTransaction(txId, swapApprovalTransaction, note);
}
/**
* updates a swap transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapTransaction - holds the metadata
* @param {string} swapTransaction.sourceTokenSymbol
* @param {string} swapTransaction.destinationTokenSymbol
* @param {string} swapTransaction.type
* @param {string} swapTransaction.destinationTokenDecimals
* @param {string} swapTransaction.destinationTokenAddress
* @param {string} swapTransaction.swapMetaData
* @param {string} swapTransaction.swapTokenValue
* @param {string} swapTransaction.estimatedBaseFee
* @param {string} swapTransaction.approvalTxId
*/
updateSwapTransaction(
txId,
{
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
},
) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
let swapTransaction = {
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
};
// only update what is defined
swapTransaction = pickBy(swapTransaction);
const note = `Update Swap Transaction for ${txId}`;
this._updateTransaction(txId, swapTransaction, note);
}
/**
* updates a transaction's user settings only if the transaction state is unapproved
*
* @param {string} txId
* @param {object} userSettings - holds the metadata
* @param {string} userSettings.userEditedGasLimit
* @param {string} userSettings.userFeeLevel
*/
updateTransactionUserSettings(txId, { userEditedGasLimit, userFeeLevel }) {
if (!this._checkIfTxStatusIsUnapproved(txId)) {
return;
}
let userSettings = { userEditedGasLimit, userFeeLevel };
// only update what is defined
userSettings = pickBy(userSettings);
const note = `Update User Settings for ${txId}`;
this._updateTransaction(txId, userSettings, note);
}
// ====================================================================================================================================================
/**
* Validates and generates a txMeta with defaults and puts it in txStateManager
* store.
@ -376,7 +605,7 @@ export default class TransactionController extends EventEmitter {
* `generateTxMeta` adds the default txMeta properties to the passed object.
* These include the tx's `id`. As we use the id for determining order of
* txes in the tx-state-manager, it is necessary to call the asynchronous
* method `this._determineTransactionType` after `generateTxMeta`.
* method `determineTransactionType` after `generateTxMeta`.
*/
let txMeta = this.txStateManager.generateTxMeta({
txParams: normalizedTxParams,
@ -404,8 +633,9 @@ export default class TransactionController extends EventEmitter {
}
}
const { type, getCodeResponse } = await this._determineTransactionType(
const { type, getCodeResponse } = await determineTransactionType(
txParams,
this.query,
);
txMeta.type = transactionType || type;
@ -1461,67 +1691,6 @@ export default class TransactionController extends EventEmitter {
});
}
/**
* @typedef { 'transfer' | 'approve' | 'transferfrom' | 'contractInteraction'| 'simpleSend' } InferrableTransactionTypes
*/
/**
* @typedef {Object} InferTransactionTypeResult
* @property {InferrableTransactionTypes} type - The type of transaction
* @property {string} getCodeResponse - The contract code, in hex format if
* it exists. '0x0' or '0x' are also indicators of non-existent contract
* code
*/
/**
* Determines the type of the transaction by analyzing the txParams.
* This method will return one of the types defined in shared/constants/transactions
* It will never return TRANSACTION_TYPE_CANCEL or TRANSACTION_TYPE_RETRY as these
* represent specific events that we control from the extension and are added manually
* at transaction creation.
*
* @param {Object} txParams - Parameters for the transaction
* @returns {InferTransactionTypeResult}
*/
async _determineTransactionType(txParams) {
const { data, to } = txParams;
let name;
try {
name = data && hstInterface.parseTransaction({ data }).name;
} catch (error) {
log.debug('Failed to parse transaction data.', error, data);
}
const tokenMethodName = [
TRANSACTION_TYPES.TOKEN_METHOD_APPROVE,
TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER,
TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER_FROM,
].find((methodName) => isEqualCaseInsensitive(methodName, name));
let result;
if (data && tokenMethodName) {
result = tokenMethodName;
} else if (data && !to) {
result = TRANSACTION_TYPES.DEPLOY_CONTRACT;
}
let contractCode;
if (!result) {
const {
contractCode: resultCode,
isContractAddress,
} = await readAddressAsContract(this.query, to);
contractCode = resultCode;
result = isContractAddress
? TRANSACTION_TYPES.CONTRACT_INTERACTION
: TRANSACTION_TYPES.SIMPLE_SEND;
}
return { type: result, getCodeResponse: contractCode };
}
/**
* Sets other txMeta statuses to dropped if the txMeta that has been confirmed has other transactions
* in the list have the same nonce
@ -1735,6 +1904,8 @@ export default class TransactionController extends EventEmitter {
eip_1559_version: eip1559Version,
gas_edit_type: 'none',
gas_edit_attempted: 'none',
account_type: await this.getAccountType(this.getSelectedAddress()),
device_model: await this.getDeviceModel(this.getSelectedAddress()),
};
const sensitiveProperties = {

View File

@ -82,6 +82,8 @@ describe('Transaction Controller', function () {
getEventFragmentById: () =>
fragmentExists === false ? undefined : { id: 0 },
getEIP1559GasFeeEstimates: () => undefined,
getAccountType: () => 'MetaMask',
getDeviceModel: () => 'N/A',
});
txController.nonceTracker.getNonceLock = () =>
Promise.resolve({ nextNonce: 0, releaseLock: noop });
@ -1303,156 +1305,6 @@ describe('Transaction Controller', function () {
});
});
describe('#_determineTransactionType', function () {
it('should return a simple send type when to is truthy but data is falsy', async function () {
const result = await txController._determineTransactionType({
to: '0xabc',
data: '',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.SIMPLE_SEND,
getCodeResponse: null,
});
});
it('should return a token transfer type when data is for the respective method call', async function () {
const result = await txController._determineTransactionType({
to: '0xabc',
data:
'0xa9059cbb0000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C970000000000000000000000000000000000000000000000000000000000000000a',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER,
getCodeResponse: undefined,
});
});
it('should return a token approve type when data is for the respective method call', async function () {
const result = await txController._determineTransactionType({
to: '0xabc',
data:
'0x095ea7b30000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C9700000000000000000000000000000000000000000000000000000000000000005',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.TOKEN_METHOD_APPROVE,
getCodeResponse: undefined,
});
});
it('should return a contract deployment type when to is falsy and there is data', async function () {
const result = await txController._determineTransactionType({
to: '',
data: '0xabd',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.DEPLOY_CONTRACT,
getCodeResponse: undefined,
});
});
it('should return a simple send type with a 0x getCodeResponse when there is data and but the to address is not a contract address', async function () {
const result = await txController._determineTransactionType({
to: '0x9e673399f795D01116e9A8B2dD2F156705131ee9',
data: '0xabd',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.SIMPLE_SEND,
getCodeResponse: '0x',
});
});
it('should return a simple send type with a null getCodeResponse when to is truthy and there is data and but getCode returns an error', async function () {
const result = await txController._determineTransactionType({
to: '0xabc',
data: '0xabd',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.SIMPLE_SEND,
getCodeResponse: null,
});
});
it('should return a contract interaction type with the correct getCodeResponse when to is truthy and there is data and it is not a token transaction', async function () {
const _providerResultStub = {
// 1 gwei
eth_gasPrice: '0x0de0b6b3a7640000',
// by default, all accounts are external accounts (not contracts)
eth_getCode: '0xa',
};
const _provider = createTestProviderTools({
scaffold: _providerResultStub,
}).provider;
const _fromAccount = getTestAccounts()[0];
const _blockTrackerStub = new EventEmitter();
_blockTrackerStub.getCurrentBlock = noop;
_blockTrackerStub.getLatestBlock = noop;
const _txController = new TransactionController({
provider: _provider,
getGasPrice() {
return '0xee6b2800';
},
networkStore: new ObservableStore(currentNetworkId),
getCurrentChainId: () => currentChainId,
txHistoryLimit: 10,
blockTracker: _blockTrackerStub,
signTransaction: (ethTx) =>
new Promise((resolve) => {
ethTx.sign(_fromAccount.key);
resolve();
}),
getParticipateInMetrics: () => false,
});
const result = await _txController._determineTransactionType({
to: '0x9e673399f795D01116e9A8B2dD2F156705131ee9',
data: 'abd',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.CONTRACT_INTERACTION,
getCodeResponse: '0x0a',
});
});
it('should return a contract interaction type with the correct getCodeResponse when to is a contract address and data is falsy', async function () {
const _providerResultStub = {
// 1 gwei
eth_gasPrice: '0x0de0b6b3a7640000',
// by default, all accounts are external accounts (not contracts)
eth_getCode: '0xa',
};
const _provider = createTestProviderTools({
scaffold: _providerResultStub,
}).provider;
const _fromAccount = getTestAccounts()[0];
const _blockTrackerStub = new EventEmitter();
_blockTrackerStub.getCurrentBlock = noop;
_blockTrackerStub.getLatestBlock = noop;
const _txController = new TransactionController({
provider: _provider,
getGasPrice() {
return '0xee6b2800';
},
networkStore: new ObservableStore(currentNetworkId),
getCurrentChainId: () => currentChainId,
txHistoryLimit: 10,
blockTracker: _blockTrackerStub,
signTransaction: (ethTx) =>
new Promise((resolve) => {
ethTx.sign(_fromAccount.key);
resolve();
}),
getParticipateInMetrics: () => false,
});
const result = await _txController._determineTransactionType({
to: '0x9e673399f795D01116e9A8B2dD2F156705131ee9',
data: '',
});
assert.deepEqual(result, {
type: TRANSACTION_TYPES.CONTRACT_INTERACTION,
getCodeResponse: '0x0a',
});
});
});
describe('#getPendingTransactions', function () {
it('should show only submitted and approved transactions as pending transaction', function () {
txController.txStateManager._addTransactionsToState([
@ -1616,6 +1468,8 @@ describe('Transaction Controller', function () {
referrer: 'metamask',
source: 'user',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
default_gas: '0.000031501',
@ -1691,6 +1545,8 @@ describe('Transaction Controller', function () {
referrer: 'metamask',
source: 'user',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
default_gas: '0.000031501',
@ -1776,6 +1632,8 @@ describe('Transaction Controller', function () {
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
default_gas: '0.000031501',
@ -1853,6 +1711,8 @@ describe('Transaction Controller', function () {
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
default_gas: '0.000031501',
@ -1930,6 +1790,8 @@ describe('Transaction Controller', function () {
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
gas_price: '2',
@ -1989,6 +1851,8 @@ describe('Transaction Controller', function () {
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
baz: 3.0,
@ -2058,6 +1922,8 @@ describe('Transaction Controller', function () {
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
device_model: 'N/A',
},
sensitiveProperties: {
baz: 3.0,
@ -2159,4 +2025,202 @@ describe('Transaction Controller', function () {
assert.deepEqual(result, expectedParams);
});
});
describe('update transaction methods', function () {
let txStateManager;
beforeEach(function () {
txStateManager = txController.txStateManager;
txStateManager.addTransaction({
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
gasLimit: '0x001',
gasPrice: '0x002',
// max fees can not be mixed with gasPrice
// maxPriorityFeePerGas: '0x003',
// maxFeePerGas: '0x004',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x005',
estimatedBaseFee: '0x006',
decEstimatedBaseFee: '6',
type: 'swap',
sourceTokenSymbol: 'ETH',
destinationTokenSymbol: 'UNI',
destinationTokenDecimals: 16,
destinationTokenAddress: VALID_ADDRESS,
swapMetaData: {},
swapTokenValue: '0x007',
userEditedGasLimit: '0x008',
userFeeLevel: 'medium',
});
});
it('updates transaction gas fees', function () {
// test update gasFees
txController.updateTransactionGasFees('1', {
gasPrice: '0x0022',
gasLimit: '0x0011',
});
let result = txStateManager.getTransaction('1');
assert.equal(result.txParams.gasPrice, '0x0022');
// TODO: weird behavior here...only gasPrice gets returned.
// assert.equal(result.txParams.gasLimit, '0x0011');
// test update maxPriorityFeePerGas
txStateManager.addTransaction({
id: '2',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
maxPriorityFeePerGas: '0x003',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x005',
});
txController.updateTransactionGasFees('2', {
maxPriorityFeePerGas: '0x0033',
});
result = txStateManager.getTransaction('2');
assert.equal(result.txParams.maxPriorityFeePerGas, '0x0033');
// test update maxFeePerGas
txStateManager.addTransaction({
id: '3',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
maxPriorityFeePerGas: '0x003',
maxFeePerGas: '0x004',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x005',
});
txController.updateTransactionGasFees('3', { maxFeePerGas: '0x0044' });
result = txStateManager.getTransaction('3');
assert.equal(result.txParams.maxFeePerGas, '0x0044');
// test update estimate used
txController.updateTransactionGasFees('3', { estimateUsed: '0x0055' });
result = txStateManager.getTransaction('3');
assert.equal(result.estimateUsed, '0x0055');
});
it('updates estimated base fee', function () {
txController.updateTransactionEstimatedBaseFee('1', {
estimatedBaseFee: '0x0066',
decEstimatedBaseFee: '66',
});
const result = txStateManager.getTransaction('1');
assert.equal(result.estimatedBaseFee, '0x0066');
assert.equal(result.decEstimatedBaseFee, '66');
});
it('updates swap approval transaction', function () {
txController.updateSwapApprovalTransaction('1', {
type: 'swapApproval',
sourceTokenSymbol: 'XBN',
});
const result = txStateManager.getTransaction('1');
assert.equal(result.type, 'swapApproval');
assert.equal(result.sourceTokenSymbol, 'XBN');
});
it('updates swap transaction', function () {
txController.updateSwapTransaction('1', {
sourceTokenSymbol: 'BTCX',
destinationTokenSymbol: 'ETH',
});
const result = txStateManager.getTransaction('1');
assert.equal(result.sourceTokenSymbol, 'BTCX');
assert.equal(result.destinationTokenSymbol, 'ETH');
assert.equal(result.destinationTokenDecimals, 16);
assert.equal(result.destinationTokenAddress, VALID_ADDRESS);
assert.equal(result.swapTokenValue, '0x007');
txController.updateSwapTransaction('1', {
type: 'swapped',
destinationTokenDecimals: 8,
destinationTokenAddress: VALID_ADDRESS_TWO,
swapTokenValue: '0x0077',
});
assert.equal(result.sourceTokenSymbol, 'BTCX');
assert.equal(result.destinationTokenSymbol, 'ETH');
assert.equal(result.type, 'swapped');
assert.equal(result.destinationTokenDecimals, 8);
assert.equal(result.destinationTokenAddress, VALID_ADDRESS_TWO);
assert.equal(result.swapTokenValue, '0x0077');
});
it('updates transaction user settings', function () {
txController.updateTransactionUserSettings('1', {
userEditedGasLimit: '0x0088',
userFeeLevel: 'high',
});
const result = txStateManager.getTransaction('1');
assert.equal(result.userEditedGasLimit, '0x0088');
assert.equal(result.userFeeLevel, 'high');
});
it('does not update if status is not unapproved', function () {
txStateManager.addTransaction({
id: '4',
status: TRANSACTION_STATUSES.APPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
maxPriorityFeePerGas: '0x007',
maxFeePerGas: '0x008',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x009',
});
txController.updateTransactionGasFees('4', { maxFeePerGas: '0x0088' });
let result = txStateManager.getTransaction('4');
assert.equal(result.txParams.maxFeePerGas, '0x008');
// test update estimate used
txController.updateTransactionGasFees('4', { estimateUsed: '0x0099' });
result = txStateManager.getTransaction('4');
assert.equal(result.estimateUsed, '0x009');
});
it('does not update unknown parameters in update method', function () {
txController.updateSwapTransaction('1', {
type: 'swapped',
destinationTokenDecimals: 8,
destinationTokenAddress: VALID_ADDRESS_TWO,
swapTokenValue: '0x011',
gasPrice: '0x12',
});
let result = txStateManager.getTransaction('1');
assert.equal(result.type, 'swapped');
assert.equal(result.destinationTokenDecimals, 8);
assert.equal(result.destinationTokenAddress, VALID_ADDRESS_TWO);
assert.equal(result.swapTokenValue, '0x011');
assert.equal(result.txParams.gasPrice, '0x002'); // not updated even though it's passed in to update
txController.updateTransactionGasFees('1', {
estimateUsed: '0x13',
gasPrice: '0x14',
destinationTokenAddress: VALID_ADDRESS,
});
result = txStateManager.getTransaction('1');
assert.equal(result.estimateUsed, '0x13');
assert.equal(result.txParams.gasPrice, '0x14');
assert.equal(result.destinationTokenAddress, VALID_ADDRESS_TWO); // not updated even though it's passed in to update
});
});
});

View File

@ -9,7 +9,11 @@ import createFilterMiddleware from 'eth-json-rpc-filters';
import createSubscriptionManager from 'eth-json-rpc-filters/subscriptionManager';
import { providerAsMiddleware } from 'eth-json-rpc-middleware';
import KeyringController from 'eth-keyring-controller';
import { errorCodes as rpcErrorCodes, ethErrors } from 'eth-rpc-errors';
import {
errorCodes as rpcErrorCodes,
EthereumRpcError,
ethErrors,
} from 'eth-rpc-errors';
import { Mutex } from 'await-semaphore';
import { stripHexPrefix } from 'ethereumjs-util';
import log from 'loglevel';
@ -34,16 +38,12 @@ import {
CollectiblesController,
AssetsContractController,
CollectibleDetectionController,
} from '@metamask/controllers';
import SmartTransactionsController from '@metamask/smart-transactions-controller';
import {
PermissionController,
SubjectMetadataController,
} from '@metamask/controllers';
import SmartTransactionsController from '@metamask/smart-transactions-controller';
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController,
///: END:ONLY_INCLUDE_IN
} from '@metamask/snap-controllers';
///: BEGIN:ONLY_INCLUDE_IN(flask)
import { SnapController } from '@metamask/snap-controllers';
import { IframeExecutionService } from '@metamask/iframe-execution-environment-service';
///: END:ONLY_INCLUDE_IN
@ -74,6 +74,7 @@ import { MILLISECOND } from '../../shared/constants/time';
import {
///: BEGIN:ONLY_INCLUDE_IN(flask)
MESSAGE_TYPE,
PLATFORM_FIREFOX,
///: END:ONLY_INCLUDE_IN
POLLING_TOKEN_ENVIRONMENT_TYPES,
SUBJECT_TYPES,
@ -82,7 +83,7 @@ import {
import { hexToDecimal } from '../../ui/helpers/utils/conversions.util';
import { getTokenValueParam } from '../../ui/helpers/utils/token-util';
import { getTransactionData } from '../../ui/helpers/utils/transactions.util';
import { isEqualCaseInsensitive } from '../../ui/helpers/utils/util';
import { isEqualCaseInsensitive } from '../../shared/modules/string-utils';
import ComposableObservableStore from './lib/ComposableObservableStore';
import AccountTracker from './lib/account-tracker';
import createLoggerMiddleware from './lib/createLoggerMiddleware';
@ -134,6 +135,10 @@ import {
///: END:ONLY_INCLUDE_IN
} from './controllers/permissions';
///: BEGIN:ONLY_INCLUDE_IN(flask)
import { getPlatform } from './lib/util';
///: END:ONLY_INCLUDE_IN
export const METAMASK_CONTROLLER_EVENTS = {
// Fired after state changes that impact the extension badge (unapproved msg count)
// The process of updating the badge happens in app/scripts/background.js.
@ -230,9 +235,15 @@ export default class MetamaskController extends EventEmitter {
state: initState.TokensController,
});
this.assetsContractController = new AssetsContractController({
this.assetsContractController = new AssetsContractController(
{
onPreferencesStateChange: (listener) =>
this.preferencesController.store.subscribe(listener),
},
{
provider: this.provider,
});
},
);
this.collectiblesController = new CollectiblesController(
{
@ -601,7 +612,10 @@ export default class MetamaskController extends EventEmitter {
],
});
const usingFirefox = getPlatform() === PLATFORM_FIREFOX;
this.snapController = new SnapController({
npmRegistryUrl: usingFirefox ? 'https://registry.npmjs.cf/' : undefined,
endowmentPermissionNames: Object.values(EndowmentPermissions),
terminateAllSnaps: this.workerController.terminateAllSnaps.bind(
this.workerController,
@ -700,6 +714,8 @@ export default class MetamaskController extends EventEmitter {
getExternalPendingTransactions: this.getExternalPendingTransactions.bind(
this,
),
getAccountType: this.getAccountType.bind(this),
getDeviceModel: this.getDeviceModel.bind(this),
});
this.txController.on('newUnapprovedTx', () => opts.showUserConfirmation());
@ -1269,7 +1285,6 @@ export default class MetamaskController extends EventEmitter {
appStateController,
collectiblesController,
collectibleDetectionController,
assetsContractController,
currencyRateController,
detectTokensController,
ensController,
@ -1422,11 +1437,10 @@ export default class MetamaskController extends EventEmitter {
setEIP1559V2Enabled: preferencesController.setEIP1559V2Enabled.bind(
preferencesController,
),
setTheme: preferencesController.setTheme.bind(preferencesController),
// AssetsContractController
getTokenStandardAndDetails: assetsContractController.getTokenStandardAndDetails.bind(
assetsContractController,
),
getTokenStandardAndDetails: this.getTokenStandardAndDetails.bind(this),
// CollectiblesController
addCollectible: collectiblesController.addCollectible.bind(
@ -1523,6 +1537,20 @@ export default class MetamaskController extends EventEmitter {
),
getTransactions: txController.getTransactions.bind(txController),
updateEditableParams: txController.updateEditableParams.bind(
txController,
),
updateTransactionGasFees: txController.updateTransactionGasFees.bind(
txController,
),
updateSwapApprovalTransaction: txController.updateSwapApprovalTransaction.bind(
txController,
),
updateSwapTransaction: txController.updateSwapTransaction.bind(
txController,
),
// messageManager
signMessage: this.signMessage.bind(this),
cancelMessage: this.cancelMessage.bind(this),
@ -1707,7 +1735,12 @@ export default class MetamaskController extends EventEmitter {
resolvePendingApproval: approvalController.accept.bind(
approvalController,
),
rejectPendingApproval: approvalController.reject.bind(approvalController),
rejectPendingApproval: async (id, error) => {
approvalController.reject(
id,
new EthereumRpcError(error.code, error.message, error.data),
);
},
// Notifications
updateViewedNotifications: notificationController.updateViewed.bind(
@ -1749,6 +1782,19 @@ export default class MetamaskController extends EventEmitter {
};
}
async getTokenStandardAndDetails(address, userAddress, tokenId) {
const details = await this.assetsContractController.getTokenStandardAndDetails(
address,
userAddress,
tokenId,
);
return {
...details,
decimals: details?.decimals?.toString(10),
balance: details?.balance?.toString(10),
};
}
//=============================================================================
// VAULT / KEYRING RELATED METHODS
//=============================================================================
@ -2189,6 +2235,54 @@ export default class MetamaskController extends EventEmitter {
return true;
}
/**
* Retrieves the keyring for the selected address and using the .type returns
* a subtype for the account. Either 'hardware', 'imported' or 'MetaMask'.
*
* @param {string} address - Address to retrieve keyring for
* @returns {'hardware' | 'imported' | 'MetaMask'}
*/
async getAccountType(address) {
const keyring = await this.keyringController.getKeyringForAccount(address);
switch (keyring.type) {
case KEYRING_TYPES.TREZOR:
case KEYRING_TYPES.LATTICE:
case KEYRING_TYPES.QR:
case KEYRING_TYPES.LEDGER:
return 'hardware';
case KEYRING_TYPES.IMPORTED:
return 'imported';
default:
return 'MetaMask';
}
}
/**
* Retrieves the keyring for the selected address and using the .type
* determines if a more specific name for the device is available. Returns
* 'N/A' for non hardware wallets.
*
* @param {string} address - Address to retrieve keyring for
* @returns {'ledger' | 'lattice' | 'N/A' | string}
*/
async getDeviceModel(address) {
const keyring = await this.keyringController.getKeyringForAccount(address);
switch (keyring.type) {
case KEYRING_TYPES.TREZOR:
return keyring.getModel();
case KEYRING_TYPES.QR:
return keyring.getName();
case KEYRING_TYPES.LEDGER:
// TODO: get model after ledger keyring exposes method
return DEVICE_NAMES.LEDGER;
case KEYRING_TYPES.LATTICE:
// TODO: get model after lattice keyring exposes method
return DEVICE_NAMES.LATTICE;
default:
return 'N/A';
}
}
/**
* get hardware account label
*

View File

@ -1,6 +1,7 @@
# The MetaMask Build System
> _tl;dr_ `yarn dist` for prod, `yarn start` for local development
> _tl;dr_ `yarn dist` for prod, `yarn start` for local development.
> Add `--build-type flask` to build Flask, our canary distribution with more experimental features.
This directory contains the MetaMask build system, which is used to build the MetaMask Extension such that it can be used in a supported browser.
From the repository root, the build system entry file is located at [`./development/build/index.js`](https://github.com/MetaMask/metamask-extension/blob/develop/development/build/index.js).
@ -40,7 +41,8 @@ Commands:
e2e tests.
Options:
--build-type The "type" of build to create. One of: "beta", "main"
--build-type The "type" of build to create. One of: "beta", "flask",
"main"
[string] [default: "main"]
--lint-fence-files Whether files with code fences should be linted after
fences have been removed by the code fencing transform.

View File

@ -4,13 +4,13 @@ const gulpZip = require('gulp-zip');
const del = require('del');
const pify = require('pify');
const pump = pify(require('pump'));
const { version } = require('../../package.json');
const { BuildType } = require('../lib/build-type');
const { createTask, composeParallel } = require('./task');
const { BuildType } = require('./utils');
module.exports = createEtcTasks;
function createEtcTasks({ browserPlatforms, buildType, livereload }) {
function createEtcTasks({ browserPlatforms, buildType, livereload, version }) {
const clean = createTask('clean', async function clean() {
await del(['./dist/*']);
await Promise.all(
@ -28,14 +28,16 @@ function createEtcTasks({ browserPlatforms, buildType, livereload }) {
const zip = createTask(
'zip',
composeParallel(
...browserPlatforms.map((platform) => createZipTask(platform, buildType)),
...browserPlatforms.map((platform) =>
createZipTask(platform, buildType, version),
),
),
);
return { clean, reload, zip };
}
function createZipTask(platform, buildType) {
function createZipTask(platform, buildType, version) {
return async () => {
const path =
buildType === BuildType.main

View File

@ -7,6 +7,8 @@ const path = require('path');
const livereload = require('gulp-livereload');
const minimist = require('minimist');
const { sync: globby } = require('globby');
const { getVersion } = require('../lib/get-version');
const { BuildType } = require('../lib/build-type');
const {
createTask,
composeSeries,
@ -18,7 +20,7 @@ const createScriptTasks = require('./scripts');
const createStyleTasks = require('./styles');
const createStaticAssetTasks = require('./static');
const createEtcTasks = require('./etc');
const { BuildType, getBrowserVersionMap } = require('./utils');
const { getBrowserVersionMap } = require('./utils');
// Packages required dynamically via browserify configuration in dependencies
// Required for LavaMoat policy generation
@ -58,11 +60,12 @@ function defineAndRunBuildTasks() {
shouldIncludeLockdown,
shouldLintFenceFiles,
skipStats,
version,
} = parseArgv();
const browserPlatforms = ['firefox', 'chrome', 'brave', 'opera'];
const browserVersionMap = getBrowserVersionMap(browserPlatforms);
const browserVersionMap = getBrowserVersionMap(browserPlatforms, version);
const ignoredFiles = getIgnoredFiles(buildType);
@ -89,12 +92,14 @@ function defineAndRunBuildTasks() {
livereload,
policyOnly,
shouldLintFenceFiles,
version,
});
const { clean, reload, zip } = createEtcTasks({
livereload,
browserPlatforms,
buildType,
version,
});
// build for development (livereload)
@ -162,6 +167,7 @@ function defineAndRunBuildTasks() {
function parseArgv() {
const NamedArgs = {
BuildType: 'build-type',
BuildVersion: 'build-version',
LintFenceFiles: 'lint-fence-files',
Lockdown: 'lockdown',
PolicyOnly: 'policy-only',
@ -175,9 +181,10 @@ function parseArgv() {
NamedArgs.PolicyOnly,
NamedArgs.SkipStats,
],
string: [NamedArgs.BuildType],
string: [NamedArgs.BuildType, NamedArgs.BuildVersion],
default: {
[NamedArgs.BuildType]: BuildType.main,
[NamedArgs.BuildVersion]: '0',
[NamedArgs.LintFenceFiles]: true,
[NamedArgs.Lockdown]: true,
[NamedArgs.PolicyOnly]: false,
@ -201,6 +208,14 @@ function parseArgv() {
throw new Error(`MetaMask build: Invalid build type: "${buildType}"`);
}
const rawBuildVersion = argv[NamedArgs.BuildVersion];
const buildVersion = Number.parseInt(rawBuildVersion, 10);
if (rawBuildVersion.match(/^\d+$/u) === null || Number.isNaN(buildVersion)) {
throw new Error(
`MetaMask build: Invalid build version: "${rawBuildVersion}"`,
);
}
// Manually default this to `false` for dev builds only.
const shouldLintFenceFiles = process.argv.includes(
`--${NamedArgs.LintFenceFiles}`,
@ -210,6 +225,8 @@ function parseArgv() {
const policyOnly = argv[NamedArgs.PolicyOnly];
const version = getVersion(buildType, buildVersion);
return {
buildType,
entryTask,
@ -218,6 +235,7 @@ function parseArgv() {
shouldIncludeLockdown: argv[NamedArgs.Lockdown],
shouldLintFenceFiles,
skipStats: argv[NamedArgs.SkipStats],
version,
};
}

View File

@ -3,9 +3,9 @@ const path = require('path');
const { mergeWith, cloneDeep } = require('lodash');
const baseManifest = require('../../app/manifest/_base.json');
const { BuildType } = require('../lib/build-type');
const { createTask, composeSeries } = require('./task');
const { BuildType } = require('./utils');
module.exports = createManifestTasks;

View File

@ -34,6 +34,7 @@ const metamaskrc = require('rc')('metamask', {
INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID,
ONBOARDING_V2: process.env.ONBOARDING_V2,
COLLECTIBLES_V1: process.env.COLLECTIBLES_V1,
DARK_MODE_V1: process.env.DARK_MODE_V1,
SEGMENT_HOST: process.env.SEGMENT_HOST,
SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY,
SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY,
@ -45,7 +46,7 @@ const metamaskrc = require('rc')('metamask', {
});
const { streamFlatMap } = require('../stream-flat-map.js');
const { version } = require('../../package.json');
const { BuildType } = require('../lib/build-type');
const {
createTask,
@ -56,7 +57,6 @@ const {
const {
createRemoveFencedCodeTransform,
} = require('./transforms/remove-fenced-code');
const { BuildType } = require('./utils');
/**
* The build environment. This describes the environment this build was produced in.
@ -147,6 +147,7 @@ function createScriptTasks({
livereload,
shouldLintFenceFiles,
policyOnly,
version,
}) {
// internal tasks
const core = {
@ -192,6 +193,7 @@ function createScriptTasks({
policyOnly,
shouldLintFenceFiles,
testing,
version,
}),
);
@ -344,6 +346,7 @@ function createFactoredBuild({
policyOnly,
shouldLintFenceFiles,
testing,
version,
}) {
return async function () {
// create bundler setup and apply defaults
@ -355,7 +358,12 @@ function createFactoredBuild({
const reloadOnChange = Boolean(devMode);
const minify = Boolean(devMode) === false;
const envVars = getEnvironmentVariables({ buildType, devMode, testing });
const envVars = getEnvironmentVariables({
buildType,
devMode,
testing,
version,
});
setupBundlerDefaults(buildConfiguration, {
buildType,
devMode,
@ -780,7 +788,7 @@ async function bundleIt(buildConfiguration, { reloadOnChange }) {
}
}
function getEnvironmentVariables({ buildType, devMode, testing }) {
function getEnvironmentVariables({ buildType, devMode, testing, version }) {
const environment = getEnvironment({ devMode, testing });
if (environment === ENVIRONMENT.PRODUCTION && !process.env.SENTRY_DSN) {
throw new Error('Missing SENTRY_DSN environment variable');
@ -803,6 +811,7 @@ function getEnvironmentVariables({ buildType, devMode, testing }) {
SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1',
ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1',
COLLECTIBLES_V1: metamaskrc.COLLECTIBLES_V1 === '1',
DARK_MODE_V1: metamaskrc.DARK_MODE_V1 === '1',
};
}

View File

@ -4,9 +4,9 @@ const watch = require('gulp-watch');
const glob = require('fast-glob');
const locales = require('../../app/_locales/index.json');
const { BuildType } = require('../lib/build-type');
const { createTask, composeSeries } = require('./task');
const { BuildType } = require('./utils');
const EMPTY_JS_FILE = './development/empty.js';

View File

@ -1,6 +1,6 @@
const path = require('path');
const { PassThrough, Transform } = require('stream');
const { BuildType } = require('../utils');
const { BuildType } = require('../../lib/build-type');
const { lintTransformedFile } = require('./utils');
const hasKey = (obj, key) => Reflect.hasOwnProperty.call(obj, key);

View File

@ -1,5 +1,5 @@
const deepFreeze = require('deep-freeze-strict');
const { BuildType } = require('../utils');
const { BuildType } = require('../../lib/build-type');
const {
createRemoveFencedCodeTransform,
removeFencedCode,

View File

@ -1,11 +1,17 @@
const { ESLint } = require('eslint');
const eslintrc = require('../../../.eslintrc.js');
eslintrc.overrides.forEach((override) => {
const rules = override.rules ?? {};
// We don't want linting to fail for purely stylistic reasons.
eslintrc.rules['prettier/prettier'] = 'off';
rules['prettier/prettier'] = 'off';
// Sometimes we use `let` instead of `const` to assign variables depending on
// the build type.
eslintrc.rules['prefer-const'] = 'off';
rules['prefer-const'] = 'off';
override.rules = rules;
});
// Remove all test-related overrides. We will never lint test files here.
eslintrc.overrides = eslintrc.overrides.filter((override) => {

View File

@ -1,16 +1,5 @@
const semver = require('semver');
const { version } = require('../../package.json');
/**
* The distribution this build is intended for.
*
* This should be kept in-sync with the `BuildType` map in `shared/constants/app.js`.
*/
const BuildType = {
beta: 'beta',
flask: 'flask',
main: 'main',
};
const { BuildType } = require('../lib/build-type');
/**
* Map the current version to a format that is compatible with each browser.
@ -20,11 +9,12 @@ const BuildType = {
* where the build version is a positive integer.
*
* @param {string[]} platforms - A list of browsers to generate versions for.
* @param {string} version - The current version.
* @returns {Object} An object with the browser as the key and the browser-specific version object
* as the value. For example, the version `9.6.0-beta.1` would return the object
* `{ firefox: { version: '9.6.0.beta1' }, chrome: { version: '9.6.0.1', version_name: '9.6.0-beta.1' } }`.
*/
function getBrowserVersionMap(platforms) {
function getBrowserVersionMap(platforms, version) {
const major = semver.major(version);
const minor = semver.minor(version);
const patch = semver.patch(version);
@ -62,6 +52,5 @@ function getBrowserVersionMap(platforms) {
}
module.exports = {
BuildType,
getBrowserVersionMap,
};

View File

@ -0,0 +1,12 @@
/**
* The distribution this build is intended for.
*
* This should be kept in-sync with the `BuildType` map in `shared/constants/app.js`.
*/
const BuildType = {
beta: 'beta',
flask: 'flask',
main: 'main',
};
module.exports = { BuildType };

View File

@ -0,0 +1,21 @@
const { version: manifestVersion } = require('../../package.json');
const { BuildType } = require('./build-type');
/**
* Get the current version of the MetaMask extension. The base manifest version
* is modified according to the build type and version.
*
* The build version is needed because certain build types (such as beta) may
* be released multiple times during the release process.
*
* @param {BuildType} buildType - The build type.
* @param {number} buildVersion - The build version.
* @returns {string} The MetaMask extension version.
*/
function getVersion(buildType, buildVersion) {
return buildType === BuildType.main
? manifestVersion
: `${manifestVersion}-${buildType}.${buildVersion}`;
}
module.exports = { getVersion };

View File

@ -1,7 +1,7 @@
function setupMocking(server) {
server.forAnyRequest().thenPassThrough();
async function setupMocking(server, testSpecificMock) {
await server.forAnyRequest().thenPassThrough();
server
await server
.forOptions('https://gas-api.metaswap.codefi.network/networks/1/gasPrices')
.thenCallback(() => {
return {
@ -14,7 +14,7 @@ function setupMocking(server) {
};
});
server
await server
.forGet('https://gas-api.metaswap.codefi.network/networks/1/gasPrices')
.thenCallback(() => {
return {
@ -27,6 +27,8 @@ function setupMocking(server) {
},
};
});
testSpecificMock(server);
}
module.exports = { setupMocking };

View File

@ -2,13 +2,16 @@
![Load dev build](./load-dev-build-chrome.gif)
* Create a local build of MetaMask using your preferred method.
* You can find build instructions in the [readme](https://github.com/MetaMask/metamask-extension#readme).
* Open `Settings` > `Extensions`.
* Or go straight to [chrome://extensions](chrome://extensions).
* Check "Developer mode".
* Alternatively, use the URL `chrome://extensions/` in your address bar
* At the top, click `Load Unpacked Extension`.
* Navigate to your `metamask-plugin/dist/chrome` folder.
* Navigate to your `metamask-extension/dist/chrome` folder.
* Click `Select`.
* Change to your locale via `chrome://settings/languages`
* Restart the browser and test the plugin in your locale
* Restart the browser and test the extension in your locale
You now have the plugin, and can click 'inspect views: background plugin' to view its dev console.
Your dev build is now added to Chrome, and you can click `Inspect views
background.html` in its card on the extension settings page to view its dev console.

View File

@ -1,14 +1,11 @@
# Add Custom Build to Firefox
Go to the url `about:debugging#addons`.
Click the button `Load Temporary Add-On`.
Select the file `dist/firefox/manifest.json`.
You can optionally enable debugging, and click `Debug`, for a console window that logs all of Metamask's processes to a single console.
* Create a local build of MetaMask using your preferred method.
* You can find build instructions in the [readme](https://github.com/MetaMask/metamask-extension#readme).
* Go to the url `about:debugging#addons`.
* Click the button `Load Temporary Add-On`.
* Select the file `metamask-extension/dist/firefox/manifest.json`.
* You can optionally enable debugging, and click `Debug`, for a console window that logs all of Metamask's processes to a single console.
If you have problems debugging, try connecting to the IRC channel `#webextensions` on `irc.mozilla.org`.
For longer questions, use the StackOverflow tag `firefox-addons`.

Some files were not shown because too many files have changed in this diff Show More