Merge remote-tracking branch 'origin/develop' into master-sync
@ -343,7 +343,7 @@ jobs:
|
||||
command: |
|
||||
if .circleci/scripts/test-run-e2e.sh
|
||||
then
|
||||
yarn test:e2e:chrome
|
||||
yarn test:e2e:chrome --retries 2
|
||||
fi
|
||||
no_output_timeout: 20m
|
||||
- store_artifacts:
|
||||
@ -370,7 +370,7 @@ jobs:
|
||||
command: |
|
||||
if .circleci/scripts/test-run-e2e.sh
|
||||
then
|
||||
yarn test:e2e:chrome:metrics
|
||||
yarn test:e2e:chrome:metrics --retries 2
|
||||
fi
|
||||
no_output_timeout: 20m
|
||||
- store_artifacts:
|
||||
@ -397,7 +397,7 @@ jobs:
|
||||
command: |
|
||||
if .circleci/scripts/test-run-e2e.sh
|
||||
then
|
||||
yarn test:e2e:firefox
|
||||
yarn test:e2e:firefox --retries 2
|
||||
fi
|
||||
no_output_timeout: 20m
|
||||
- store_artifacts:
|
||||
@ -424,7 +424,7 @@ jobs:
|
||||
command: |
|
||||
if .circleci/scripts/test-run-e2e.sh
|
||||
then
|
||||
yarn test:e2e:firefox:metrics
|
||||
yarn test:e2e:firefox:metrics --retries 2
|
||||
fi
|
||||
no_output_timeout: 20m
|
||||
- store_artifacts:
|
||||
@ -448,7 +448,7 @@ jobs:
|
||||
command: mv ./builds-test ./builds
|
||||
- run:
|
||||
name: Run page load benchmark
|
||||
command: yarn benchmark:chrome --out test-artifacts/chrome/benchmark/pageload.json
|
||||
command: yarn benchmark:chrome --out test-artifacts/chrome/benchmark/pageload.json --retries 2
|
||||
- store_artifacts:
|
||||
path: test-artifacts
|
||||
destination: test-artifacts
|
||||
|
@ -14,7 +14,10 @@ wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}"
|
||||
|
||||
if [[ $(shasum -a 512 "${CHROME_BINARY}" | cut '--delimiter= ' -f1) != "${CHROME_BINARY_SHA512SUM}" ]]
|
||||
then
|
||||
echo "Google Chrome binary checksum did not match."
|
||||
exit 1
|
||||
else
|
||||
echo "Google Chrome binary checksum verified."
|
||||
fi
|
||||
|
||||
(sudo dpkg -i "${CHROME_BINARY}" || sudo apt-get -fy install)
|
||||
|
@ -260,7 +260,7 @@ const state = {
|
||||
}
|
||||
},
|
||||
"assetImages": {
|
||||
"0xad6d458402f60fd3bd25163575031acdce07538d": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xaD6D458402F60fD3Bd25163575031ACDce07538D/logo.png"
|
||||
"0xad6d458402f60fd3bd25163575031acdce07538d": "./images/logo.png"
|
||||
},
|
||||
"hiddenTokens": [],
|
||||
"suggestedTokens": {},
|
||||
@ -271,7 +271,7 @@ const state = {
|
||||
"ipfsGateway": "dweb.link",
|
||||
"infuraBlocked": false,
|
||||
"migratedPrivacyMode": false,
|
||||
"selectedAddress": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
|
||||
"selectedAddress": "0x9d0ba4ddac06032527b140912ec808ab9451b788",
|
||||
"metaMetricsId": "0xc2377d11fec1c3b7dd88c4854240ee5e3ed0d9f63b00456d98d80320337b827f",
|
||||
"conversionDate": 1620710825.03,
|
||||
"conversionRate": 3910.28,
|
||||
|
1615
CHANGELOG.md
@ -5,7 +5,7 @@ Hey! We are hiring JavaScript Engineers! [Apply here](https://boards.greenhouse.
|
||||
|
||||
You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us).
|
||||
|
||||
For [general questions](https://metamask.zendesk.com/hc/en-us/community/topics/360000682532-General), [feature requests](https://metamask.zendesk.com/hc/en-us/community/topics/360000682552-Feature-Requests-Ideas), or [developer questions](https://metamask.zendesk.com/hc/en-us/community/topics/360001751291-Developer-Questions), visit our [Community Forum](https://metamask.zendesk.com/hc/en-us/community/topics).
|
||||
For [general questions](https://community.metamask.io/c/learn/26), [feature requests](https://community.metamask.io/c/feature-requests-ideas/13), or [developer questions](https://community.metamask.io/c/developer-questions/11), visit our [Community Forum](https://community.metamask.io/).
|
||||
|
||||
MetaMask supports Firefox, Google Chrome, and Chromium-based browsers. We recommend using the latest available browser version.
|
||||
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "ማሰሺያዎት አልተደገፈም..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ካሊፎርኒያ ውስጥ ተዘጋጅቶ የተገነባ ነው።"
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "ETH በ Wyre ይግዙ"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "متصفحك غير مدعوم..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "تم تصميم وإنشاء MetaMask في ولاية كاليفورنيا."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "قم بشراء عملة إيثير بواسطة Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Браузърът ви не се поддържа ..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask е проектиран и създаден в Калифорния."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Купете ETH с Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "আপনার ব্রাউজার সমর্থিত নয়..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ক্যালিফোর্নিয়াতে ডিজাইন করা এবং নির্মিত।"
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Wyre দিয়ে ETH ক্রয় করুন"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "El teu navegador no és suportat..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ha estat dissenyat i desenvolupat a Califòrnia."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Compra ETH amb Wyre"
|
||||
},
|
||||
|
@ -46,9 +46,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "Použít Blockies Identicon"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask je navržen a vytvořen v Kalifornii."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Zrušit"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Din browser er ikke understøttet..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask er designet og bygget i Californien."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Køb ETH med Wyre"
|
||||
},
|
||||
|
@ -140,9 +140,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Ihr Browser wird nicht unterstützt …"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask wurde in Kalifornien entwickelt und gebaut."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "ETH mit Wyre kaufen"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Το Πρόγραμμα Περιήγησής σας δεν υποστηρίζεται..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "Το MetaMask έχει σχεδιαστεί και αναπτυχθεί στην Καλιφόρνια."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Αγοράστε ETH με το Wyre"
|
||||
},
|
||||
|
@ -97,6 +97,9 @@
|
||||
"addTokens": {
|
||||
"message": "Add Tokens"
|
||||
},
|
||||
"addressBookIcon": {
|
||||
"message": "Address book icon"
|
||||
},
|
||||
"advanced": {
|
||||
"message": "Advanced"
|
||||
},
|
||||
@ -150,6 +153,9 @@
|
||||
"amount": {
|
||||
"message": "Amount"
|
||||
},
|
||||
"amountGasFee": {
|
||||
"message": "Amount + Gas Fee"
|
||||
},
|
||||
"amountWithColon": {
|
||||
"message": "Amount:"
|
||||
},
|
||||
@ -223,7 +229,7 @@
|
||||
"message": "This secret code is required to recover your wallet in case you lose your device, forget your password, have to re-install MetaMask, or want to access your wallet on another device."
|
||||
},
|
||||
"backupApprovalNotice": {
|
||||
"message": "Backup your Secret Recovery code to keep your wallet and funds secure."
|
||||
"message": "Backup your Secret Recovery Phrase to keep your wallet and funds secure."
|
||||
},
|
||||
"backupNow": {
|
||||
"message": "Backup now"
|
||||
@ -253,15 +259,21 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Your Browser is not supported..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Build your contact list"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask is designed and built in California."
|
||||
"builtAroundTheWorld": {
|
||||
"message": "MetaMask is designed and built around the world."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Buy"
|
||||
},
|
||||
"buyWithTransak": {
|
||||
"message": "Buy ETH with Transak"
|
||||
},
|
||||
"buyWithTransakDescription": {
|
||||
"message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. ETH deposits into your MetaMask account."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Buy ETH with Wyre"
|
||||
},
|
||||
@ -310,6 +322,9 @@
|
||||
"confirmSecretBackupPhrase": {
|
||||
"message": "Confirm your Secret Backup Phrase"
|
||||
},
|
||||
"confirmSeedPhrase": {
|
||||
"message": "Confirm Seed Phrase"
|
||||
},
|
||||
"confirmed": {
|
||||
"message": "Confirmed"
|
||||
},
|
||||
@ -414,6 +429,9 @@
|
||||
"continue": {
|
||||
"message": "Continue"
|
||||
},
|
||||
"continueToTransak": {
|
||||
"message": "Continue to Transak"
|
||||
},
|
||||
"continueToWyre": {
|
||||
"message": "Continue to Wyre"
|
||||
},
|
||||
@ -456,6 +474,9 @@
|
||||
"createAccount": {
|
||||
"message": "Create Account"
|
||||
},
|
||||
"createNewWallet": {
|
||||
"message": "Create a new wallet"
|
||||
},
|
||||
"createPassword": {
|
||||
"message": "Create Password"
|
||||
},
|
||||
@ -492,6 +513,9 @@
|
||||
"customToken": {
|
||||
"message": "Custom Token"
|
||||
},
|
||||
"data": {
|
||||
"message": "Data"
|
||||
},
|
||||
"dataBackupFoundInfo": {
|
||||
"message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?"
|
||||
},
|
||||
@ -599,6 +623,42 @@
|
||||
"editContact": {
|
||||
"message": "Edit Contact"
|
||||
},
|
||||
"editGasEducationButtonText": {
|
||||
"message": "How should I choose?"
|
||||
},
|
||||
"editGasEducationHighExplanation": {
|
||||
"message": "This is best for swaps or other time sensitive transactions. If a swap takes too long to process it will often fail and you may lose funds."
|
||||
},
|
||||
"editGasEducationLearnMoreLinkText": {
|
||||
"message": "Learn more about customizing gas."
|
||||
},
|
||||
"editGasEducationLowExplanation": {
|
||||
"message": "Low A lower gas fee should only be selected for transactions where processing time is less important. With a lower fee, it can be be hard to predict when (or if) your transaction with be successful."
|
||||
},
|
||||
"editGasEducationMediumExplanation": {
|
||||
"message": "A medium gas fee is good for sending, withdrawing or other non-time sensitive but important transactions."
|
||||
},
|
||||
"editGasEducationModalIntro": {
|
||||
"message": "The right gas amount to select depends on the type of transaction and how important it is."
|
||||
},
|
||||
"editGasEducationModalTitle": {
|
||||
"message": "How to choose?"
|
||||
},
|
||||
"editGasHigh": {
|
||||
"message": "High"
|
||||
},
|
||||
"editGasLow": {
|
||||
"message": "Low"
|
||||
},
|
||||
"editGasMedium": {
|
||||
"message": "Medium"
|
||||
},
|
||||
"editGasPriceTooltip": {
|
||||
"message": "This network uses an older version of gas pricing which requires a “Gas price” field. Gas price is the maximum amount you are willing to pay per unit of gas."
|
||||
},
|
||||
"editGasTitle": {
|
||||
"message": "Edit gas fee"
|
||||
},
|
||||
"editNonceField": {
|
||||
"message": "Edit Nonce"
|
||||
},
|
||||
@ -786,6 +846,19 @@
|
||||
"functionType": {
|
||||
"message": "Function Type"
|
||||
},
|
||||
"gasDisplayAcknowledgeDappButtonText": {
|
||||
"message": "Edit app suggestion"
|
||||
},
|
||||
"gasDisplayDappWarning": {
|
||||
"message": "This gas fee has been suggested by the app $1. It’s using legacy gas estimation which may be inaccurate. However, editing this gas fee may cause unintended consequences. Please reach out to the app team if you have questions.",
|
||||
"description": "$1 represents the Dapp's origin"
|
||||
},
|
||||
"gasFee": {
|
||||
"message": "Gas Fee"
|
||||
},
|
||||
"gasFeeEstimate": {
|
||||
"message": "Estimate"
|
||||
},
|
||||
"gasLimit": {
|
||||
"message": "Gas Limit"
|
||||
},
|
||||
@ -1070,9 +1143,19 @@
|
||||
"makeAnotherSwap": {
|
||||
"message": "Create a new swap"
|
||||
},
|
||||
"makeSureNoOneWatching": {
|
||||
"message": "Make sure no one is watching your screen",
|
||||
"description": "Warning to users to be care while creating and saving their new seed phrase"
|
||||
},
|
||||
"max": {
|
||||
"message": "Max"
|
||||
},
|
||||
"maxFee": {
|
||||
"message": "Max fee"
|
||||
},
|
||||
"maxPriorityFee": {
|
||||
"message": "Max priority fee"
|
||||
},
|
||||
"memo": {
|
||||
"message": "memo"
|
||||
},
|
||||
@ -1367,6 +1450,9 @@
|
||||
"onlyConnectTrust": {
|
||||
"message": "Only connect with sites you trust."
|
||||
},
|
||||
"optional": {
|
||||
"message": "Optional"
|
||||
},
|
||||
"optionalBlockExplorerUrl": {
|
||||
"message": "Block Explorer URL (optional)"
|
||||
},
|
||||
@ -1391,6 +1477,12 @@
|
||||
"passwordNotLongEnough": {
|
||||
"message": "Password not long enough"
|
||||
},
|
||||
"passwordSetupDetails": {
|
||||
"message": "This password will unlock your MetaMask wallet only on this device. MetaMask can not recover this password."
|
||||
},
|
||||
"passwordTermsWarning": {
|
||||
"message": "I understand that MetaMask cannot recover this password for me. $1"
|
||||
},
|
||||
"passwordsDontMatch": {
|
||||
"message": "Passwords Don't Match"
|
||||
},
|
||||
@ -1466,6 +1558,9 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Search, public address (0x), or ENS"
|
||||
},
|
||||
"recommendedGasLabel": {
|
||||
"message": "Recommended"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Start here"
|
||||
},
|
||||
@ -1611,12 +1706,21 @@
|
||||
"secretPhrase": {
|
||||
"message": "Enter your secret phrase here to restore your vault."
|
||||
},
|
||||
"secureWallet": {
|
||||
"message": "Secure Wallet"
|
||||
},
|
||||
"securityAndPrivacy": {
|
||||
"message": "Security & Privacy"
|
||||
},
|
||||
"securitySettingsDescription": {
|
||||
"message": "Privacy settings and wallet Secret Recovery Phrase"
|
||||
},
|
||||
"seedPhraseConfirm": {
|
||||
"message": "Confirm Secret Recovery Phrase"
|
||||
},
|
||||
"seedPhraseEnterMissingWords": {
|
||||
"message": "Confirm Secret Recovery Phrase"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Write down and store in multiple secret places."
|
||||
},
|
||||
@ -1662,6 +1766,12 @@
|
||||
"seedPhraseReq": {
|
||||
"message": "Secret Recovery Phrases contain 12, 15, 18, 21, or 24 words"
|
||||
},
|
||||
"seedPhraseWriteDownDetails": {
|
||||
"message": "Write down this 12-word Secret Recovery Phrase and save it in a place that you trust and only you can access."
|
||||
},
|
||||
"seedPhraseWriteDownHeader": {
|
||||
"message": "Write down your Secret Recovery Phrase"
|
||||
},
|
||||
"selectAHigherGasFee": {
|
||||
"message": "Select a higher gas fee to accelerate the processing of your transaction.*"
|
||||
},
|
||||
@ -1721,6 +1831,9 @@
|
||||
"settings": {
|
||||
"message": "Settings"
|
||||
},
|
||||
"show": {
|
||||
"message": "Show"
|
||||
},
|
||||
"showAdvancedGasInline": {
|
||||
"message": "Advanced gas controls"
|
||||
},
|
||||
@ -1784,6 +1897,15 @@
|
||||
"speedUpCancellation": {
|
||||
"message": "Speed up this cancellation"
|
||||
},
|
||||
"speedUpExplanation": {
|
||||
"message": "We’ve restimated the gas fee based on current network conditions and have increased it by at least 10% (required by the network)."
|
||||
},
|
||||
"speedUpPopoverTitle": {
|
||||
"message": "Speed up transaction"
|
||||
},
|
||||
"speedUpTooltipText": {
|
||||
"message": "New gas fee"
|
||||
},
|
||||
"speedUpTransaction": {
|
||||
"message": "Speed up this transaction"
|
||||
},
|
||||
@ -2198,6 +2320,9 @@
|
||||
"symbolBetweenZeroTwelve": {
|
||||
"message": "Symbol must be 11 characters or fewer."
|
||||
},
|
||||
"syncInProgress": {
|
||||
"message": "Sync in progress"
|
||||
},
|
||||
"syncWithMobile": {
|
||||
"message": "Sync with mobile"
|
||||
},
|
||||
@ -2289,6 +2414,12 @@
|
||||
"transactionCreated": {
|
||||
"message": "Transaction created with a value of $1 at $2."
|
||||
},
|
||||
"transactionDetailGasHeading": {
|
||||
"message": "Estimated gas fee"
|
||||
},
|
||||
"transactionDetailGasTotalSubtitle": {
|
||||
"message": "Amount + gas fee"
|
||||
},
|
||||
"transactionDropped": {
|
||||
"message": "Transaction dropped at $2."
|
||||
},
|
||||
@ -2424,6 +2555,9 @@
|
||||
"viewContact": {
|
||||
"message": "View Contact"
|
||||
},
|
||||
"viewFullTransactionDetails": {
|
||||
"message": "View full transaction details"
|
||||
},
|
||||
"viewMore": {
|
||||
"message": "View More"
|
||||
},
|
||||
|
@ -6,7 +6,7 @@
|
||||
"message": "Versión, centro de soporte técnico e información de contacto"
|
||||
},
|
||||
"acceleratingATransaction": {
|
||||
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
|
||||
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
|
||||
},
|
||||
"acceptTermsOfUse": {
|
||||
"message": "Leí y estoy de acuerdo con $1",
|
||||
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Agregar contacto"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Esto permitirá que la red se utilice en MetaMask."
|
||||
},
|
||||
@ -85,7 +89,7 @@
|
||||
"message": "Agregar a la libreta de direcciones"
|
||||
},
|
||||
"addToAddressBookModalPlaceholder": {
|
||||
"message": "p. ej., John D."
|
||||
"message": "p. ej., John D."
|
||||
},
|
||||
"addToken": {
|
||||
"message": "Agregar token"
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "El explorador no es compatible…"
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Cree su lista de contactos"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask se diseñó y compiló en California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Comprar"
|
||||
},
|
||||
@ -268,7 +269,7 @@
|
||||
"message": "Bytes"
|
||||
},
|
||||
"canToggleInSettings": {
|
||||
"message": "Puede volver a activar esta notificación desde Configuración > Alertas."
|
||||
"message": "Puede volver a activar esta notificación desde Configuración -> Alertas."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Cancelar"
|
||||
@ -285,8 +286,11 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "El identificador de cadena que se utiliza para firmar transacciones en esta red."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "En este momento, la red $1 está utilizando este identificador de cadena."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
|
||||
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
|
||||
},
|
||||
"clickToRevealSeed": {
|
||||
"message": "Haga clic aquí para revelar las palabras secretas"
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Continuar a Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Contrato"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Está enviando tokens a la dirección de contrato del token. Esto puede provocar la pérdida de los tokens."
|
||||
},
|
||||
@ -572,7 +579,7 @@
|
||||
"message": "No volver a mostrar"
|
||||
},
|
||||
"downloadGoogleChrome": {
|
||||
"message": "Descargar Google Chrome"
|
||||
"message": "Descargar Google Chrome"
|
||||
},
|
||||
"downloadSecretBackup": {
|
||||
"message": "Descargue esta frase secreta de respaldo y guárdela en un medio de almacenamiento o disco duro externo cifrado."
|
||||
@ -626,6 +633,10 @@
|
||||
"endOfFlowMessage6": {
|
||||
"message": "Si necesita volver a crear una copia de seguridad de la frase secreta de recuperación, puede encontrarla en Configuración -> Seguridad."
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "Si tiene preguntas o nota movimientos sospechosos, comuníquese con soporte técnico $1.",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "MetaMask no puede recuperar la frase secreta de recuperación."
|
||||
},
|
||||
@ -770,7 +781,7 @@
|
||||
"message": "El límite de gas es la cantidad máxima de unidades de gas que está dispuesto a gastar."
|
||||
},
|
||||
"gasLimitTooLow": {
|
||||
"message": "El límite de gas debe ser al menos 21 000"
|
||||
"message": "El límite de gas debe ser al menos 21 000"
|
||||
},
|
||||
"gasLimitTooLowWithDynamicFee": {
|
||||
"message": "El límite de gas debe ser al menos $1",
|
||||
@ -885,6 +896,16 @@
|
||||
"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?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Importar cartera"
|
||||
},
|
||||
@ -956,7 +977,7 @@
|
||||
"message": "Número no válido. Quite todos los ceros iniciales."
|
||||
},
|
||||
"invalidRPC": {
|
||||
"message": "Dirección URL de RPC no válida"
|
||||
"message": "Dirección URL de RPC no válida"
|
||||
},
|
||||
"invalidSeedPhrase": {
|
||||
"message": "Frase secreta de recuperación no válida"
|
||||
@ -1023,7 +1044,7 @@
|
||||
"message": "Cargando tokens…"
|
||||
},
|
||||
"localhost": {
|
||||
"message": "Host local 8545"
|
||||
"message": "Host local 8545"
|
||||
},
|
||||
"lock": {
|
||||
"message": "Bloquear"
|
||||
@ -1110,7 +1131,7 @@
|
||||
"message": "Escriba su contraseña para confirmar que es usted."
|
||||
},
|
||||
"mustSelectOne": {
|
||||
"message": "Debe seleccionar al menos 1 token."
|
||||
"message": "Debe seleccionar al menos 1 token."
|
||||
},
|
||||
"myAccounts": {
|
||||
"message": "Mis cuentas"
|
||||
@ -1160,10 +1181,10 @@
|
||||
"message": "Agregar y editar redes RPC personalizadas"
|
||||
},
|
||||
"networkURL": {
|
||||
"message": "Dirección URL de la red"
|
||||
"message": "Dirección URL de la red"
|
||||
},
|
||||
"networkURLDefinition": {
|
||||
"message": "La dirección URL que se utilizó para acceder a esta red."
|
||||
"message": "La dirección URL que se utilizó para acceder a esta red."
|
||||
},
|
||||
"networks": {
|
||||
"message": "Redes"
|
||||
@ -1191,7 +1212,7 @@
|
||||
"message": "Red nueva"
|
||||
},
|
||||
"newPassword": {
|
||||
"message": "Contraseña nueva (mín. de 8 caracteres)"
|
||||
"message": "Contraseña nueva (mín. de 8 caracteres)"
|
||||
},
|
||||
"newToMetaMask": {
|
||||
"message": "¿Es nuevo en MetaMask?"
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "Su \"frase de recuperación\" ahora se llama \"frase secreta de recuperación.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "A partir de la versión 91 de Chrome, la API que habilitaba nuestro soporte para Ledger (U2F) ya no es compatible con carteras de hardware. MetaMask ha implementado un nuevo soporte para Ledger Live mediante el cual usted puede seguir conectándose a su dispositivo Ledger a través de la aplicación de escritorio Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Cuando interactúe con su cuenta de Ledger a través de MetaMask, se abrirá una nueva pestaña y se le pedirá que abra la aplicación Ledger Live. Una vez que se abra la aplicación, se le pedirá que otorgue permiso para establecer una conexión WebSocket con su cuenta de MetaMask. ¡Eso es todo!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "A fin de habilitar el soporte para Live Ledger, haga clic en Configuración > Avanzada > Utilizar Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Actualización del soporte para Ledger destinada a usuarios de Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "de"
|
||||
},
|
||||
@ -1372,7 +1409,7 @@
|
||||
"message": "Moneda principal"
|
||||
},
|
||||
"primaryCurrencySettingDescription": {
|
||||
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
|
||||
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
|
||||
},
|
||||
"privacyMsg": {
|
||||
"message": "Política de privacidad"
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Búsqueda, dirección pública (0x) o ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Iniciar aquí"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Entendido"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Guarde siempre su frase secreta de recuperación en un lugar seguro y secreto."
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "¿Necesita volver a crear una copia de seguridad de su frase secreta de recuperación?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "No comparta nunca su frase secreta de recuperación con nadie."
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "El equipo de MetaMask nunca le pedirá su frase secreta de recuperación."
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Mediante su frase secreta de recuperación, se controlan todas sus cuentas."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Proteja sus fondos."
|
||||
},
|
||||
"reject": {
|
||||
"message": "Rechazar"
|
||||
},
|
||||
@ -1421,7 +1482,7 @@
|
||||
"message": "Rechazar todo"
|
||||
},
|
||||
"rejectTxsDescription": {
|
||||
"message": "Está a punto de rechazar $1 transacciones en lote."
|
||||
"message": "Está a punto de rechazar $1 transacciones en lote."
|
||||
},
|
||||
"rejectTxsN": {
|
||||
"message": "Rechazar $1 transacciones"
|
||||
@ -1439,7 +1500,7 @@
|
||||
"message": "Quitar cuenta"
|
||||
},
|
||||
"removeAccountDescription": {
|
||||
"message": "Esta cuenta se quitará de la cartera. Antes de continuar, asegúrese de tener la frase secreta de recuperación original o la clave privada de esta cuenta importada. Puede importar o crear cuentas nuevamente desde el menú desplegable de la cuenta."
|
||||
"message": "Esta cuenta se quitará de la cartera. Antes de continuar, asegúrese de tener la frase secreta de recuperación original o la clave privada de esta cuenta importada. Puede importar o crear cuentas nuevamente en la lista desplegable de la cuenta. "
|
||||
},
|
||||
"requestsAwaitingAcknowledgement": {
|
||||
"message": "solicitudes en espera de confirmación"
|
||||
@ -1536,11 +1597,47 @@
|
||||
"message": "Ingrese su frase secreta aquí para restaurar su bóveda."
|
||||
},
|
||||
"securityAndPrivacy": {
|
||||
"message": "Seguridad y privacidad"
|
||||
"message": "Seguridad y privacidad"
|
||||
},
|
||||
"securitySettingsDescription": {
|
||||
"message": "Configuración de privacidad y frase secreta de recuperación de la cartera"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Escríbala y guárdela en varios lugares secretos."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "Guárdela en un administrador de contraseñas"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "Guárdela en una caja fuerte."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "Guárdela en una bóveda bancaria."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "Su frase secreta de recuperación es la “llave maestra” de su cartera y sus fondos."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "Si alguien le pide su frase de recuperación, es posible que tenga intenciones de estafarlo."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "Nunca comparta su frase secreta de recuperación, ni siquiera con MetaMask."
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "¿Qué es una frase de recuperación?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "¿Debería compartir mi frase de recuperación?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "¿Cómo guardo mi frase de recuperación?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "Proteger su cartera"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "Antes de comenzar, mire este breve video para aprender sobre su frase de recuperación y sobre cómo mantener segura su cartera."
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "Separar cada palabra con un solo espacio"
|
||||
},
|
||||
@ -1548,7 +1645,7 @@
|
||||
"message": "Pegar la frase secreta de recuperación desde el Portapapeles"
|
||||
},
|
||||
"seedPhraseReq": {
|
||||
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
|
||||
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
|
||||
},
|
||||
"selectAHigherGasFee": {
|
||||
"message": "Seleccione una cuota de gas más alta para acelerar el procesamiento de la transacción.*"
|
||||
@ -1867,7 +1964,7 @@
|
||||
"message": "Cuota de MetaMask"
|
||||
},
|
||||
"swapMetaMaskFeeDescription": {
|
||||
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
|
||||
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
|
||||
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
|
||||
},
|
||||
"swapNQuotes": {
|
||||
@ -1890,9 +1987,18 @@
|
||||
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
|
||||
},
|
||||
"swapPriceDifferenceTitle": {
|
||||
"message": "Diferencia de precio de ~$1 %",
|
||||
"message": "Diferencia de precio de ~$1 %",
|
||||
"description": "$1 is a number (ex: 1.23) that represents the price difference."
|
||||
},
|
||||
"swapPriceImpactTooltip": {
|
||||
"message": "El impacto sobre el precio es la diferencia entre el precio actual del mercado y el monto recibido durante la ejecución de la transacción. El impacto sobre el precio es una función del tamaño de su transacción respecto de la dimensión del fondo de liquidez."
|
||||
},
|
||||
"swapPriceUnavailableDescription": {
|
||||
"message": "No se pudo determinar el impacto sobre el precio debido a la falta de datos de los precios del mercado. Antes de realizar el canje, confirme que está de acuerdo con la cantidad de tokens que está a punto de recibir."
|
||||
},
|
||||
"swapPriceUnavailableTitle": {
|
||||
"message": "Antes de continuar, verifique su tasa"
|
||||
},
|
||||
"swapProcessing": {
|
||||
"message": "Procesamiento"
|
||||
},
|
||||
@ -1903,7 +2009,7 @@
|
||||
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
|
||||
},
|
||||
"swapQuoteIncludesRate": {
|
||||
"message": "La cotización incluye una cuota de MetaMask de $1 %",
|
||||
"message": "La cotización incluye una cuota de MetaMask de $1 %",
|
||||
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
|
||||
},
|
||||
"swapQuoteNofN": {
|
||||
@ -1994,6 +2100,9 @@
|
||||
"message": "Canjear $1 por $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Este token se añadió de forma manual."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Siempre confirme la dirección del token en $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2009,7 +2118,7 @@
|
||||
"message": "Transacción completa"
|
||||
},
|
||||
"swapTwoTransactions": {
|
||||
"message": "2 transacciones"
|
||||
"message": "2 transacciones"
|
||||
},
|
||||
"swapUnknown": {
|
||||
"message": "Desconocido"
|
||||
@ -2026,13 +2135,13 @@
|
||||
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
|
||||
},
|
||||
"swapZeroSlippage": {
|
||||
"message": "0 % de desfase"
|
||||
"message": "0 % de desfase"
|
||||
},
|
||||
"swapsAdvancedOptions": {
|
||||
"message": "Opciones avanzadas"
|
||||
},
|
||||
"swapsExcessiveSlippageWarning": {
|
||||
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
|
||||
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
|
||||
},
|
||||
"swapsMaxSlippage": {
|
||||
"message": "Tolerancia de desfase"
|
||||
@ -2072,7 +2181,7 @@
|
||||
"message": "Símbolo"
|
||||
},
|
||||
"symbolBetweenZeroTwelve": {
|
||||
"message": "El símbolo debe tener 11 caracteres o menos."
|
||||
"message": "El símbolo debe tener 11 caracteres o menos."
|
||||
},
|
||||
"syncWithMobile": {
|
||||
"message": "Sincronizar con dispositivo móvil"
|
||||
@ -2261,7 +2370,7 @@
|
||||
"message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "La dirección URL ya está en la lista de redes existentes"
|
||||
"message": "En este momento, la red $1 está utilizando esta dirección URL."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Usar detección de phishing"
|
||||
@ -2283,6 +2392,10 @@
|
||||
"message": "Comprobar este token en $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Verifique este token en $1 y asegúrese de que sea el token con el que quiere realizar la transacción.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Ver cuenta"
|
||||
},
|
||||
@ -2317,7 +2430,7 @@
|
||||
"message": "Frase secreta de recuperación de la cartera"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
|
||||
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
|
@ -6,7 +6,7 @@
|
||||
"message": "Versión, centro de soporte técnico e información de contacto"
|
||||
},
|
||||
"acceleratingATransaction": {
|
||||
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
|
||||
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
|
||||
},
|
||||
"acceptTermsOfUse": {
|
||||
"message": "Leí y estoy de acuerdo con $1",
|
||||
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Agregar contacto"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Esto permitirá que la red se utilice en MetaMask."
|
||||
},
|
||||
@ -85,7 +89,7 @@
|
||||
"message": "Agregar a la libreta de direcciones"
|
||||
},
|
||||
"addToAddressBookModalPlaceholder": {
|
||||
"message": "p. ej., John D."
|
||||
"message": "p. ej., John D."
|
||||
},
|
||||
"addToken": {
|
||||
"message": "Agregar token"
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "El explorador no es compatible…"
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Cree su lista de contactos"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask se diseñó y compiló en California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Comprar"
|
||||
},
|
||||
@ -268,7 +269,7 @@
|
||||
"message": "Bytes"
|
||||
},
|
||||
"canToggleInSettings": {
|
||||
"message": "Puede volver a activar esta notificación desde Configuración > Alertas."
|
||||
"message": "Puede volver a activar esta notificación desde Configuración -> Alertas."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Cancelar"
|
||||
@ -285,8 +286,11 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "El identificador de cadena que se utiliza para firmar transacciones en esta red."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "En este momento, la red $1 está utilizando este identificador de cadena."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
|
||||
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
|
||||
},
|
||||
"clickToRevealSeed": {
|
||||
"message": "Haga clic aquí para revelar las palabras secretas"
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Continuar a Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Contrato"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Está enviando tokens a la dirección de contrato del token. Esto puede provocar la pérdida de los tokens."
|
||||
},
|
||||
@ -572,7 +579,7 @@
|
||||
"message": "No volver a mostrar"
|
||||
},
|
||||
"downloadGoogleChrome": {
|
||||
"message": "Descargar Google Chrome"
|
||||
"message": "Descargar Google Chrome"
|
||||
},
|
||||
"downloadSecretBackup": {
|
||||
"message": "Descargue esta frase secreta de respaldo y guárdela en un medio de almacenamiento o disco duro externo cifrado."
|
||||
@ -774,7 +781,7 @@
|
||||
"message": "El límite de gas es la cantidad máxima de unidades de gas que está dispuesto a gastar."
|
||||
},
|
||||
"gasLimitTooLow": {
|
||||
"message": "El límite de gas debe ser al menos 21 000"
|
||||
"message": "El límite de gas debe ser al menos 21 000"
|
||||
},
|
||||
"gasLimitTooLowWithDynamicFee": {
|
||||
"message": "El límite de gas debe ser al menos $1",
|
||||
@ -893,6 +900,12 @@
|
||||
"message": "o $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "¿Desea importar el token?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Importar cartera"
|
||||
},
|
||||
@ -964,7 +977,7 @@
|
||||
"message": "Número no válido. Quite todos los ceros iniciales."
|
||||
},
|
||||
"invalidRPC": {
|
||||
"message": "Dirección URL de RPC no válida"
|
||||
"message": "Dirección URL de RPC no válida"
|
||||
},
|
||||
"invalidSeedPhrase": {
|
||||
"message": "Frase secreta de recuperación no válida"
|
||||
@ -1031,7 +1044,7 @@
|
||||
"message": "Cargando tokens…"
|
||||
},
|
||||
"localhost": {
|
||||
"message": "Host local 8545"
|
||||
"message": "Host local 8545"
|
||||
},
|
||||
"lock": {
|
||||
"message": "Bloquear"
|
||||
@ -1118,7 +1131,7 @@
|
||||
"message": "Escriba su contraseña para confirmar que es usted."
|
||||
},
|
||||
"mustSelectOne": {
|
||||
"message": "Debe seleccionar al menos 1 token."
|
||||
"message": "Debe seleccionar al menos 1 token."
|
||||
},
|
||||
"myAccounts": {
|
||||
"message": "Mis cuentas"
|
||||
@ -1168,10 +1181,10 @@
|
||||
"message": "Agregar y editar redes RPC personalizadas"
|
||||
},
|
||||
"networkURL": {
|
||||
"message": "Dirección URL de la red"
|
||||
"message": "Dirección URL de la red"
|
||||
},
|
||||
"networkURLDefinition": {
|
||||
"message": "La dirección URL que se utilizó para acceder a esta red."
|
||||
"message": "La dirección URL que se utilizó para acceder a esta red."
|
||||
},
|
||||
"networks": {
|
||||
"message": "Redes"
|
||||
@ -1199,7 +1212,7 @@
|
||||
"message": "Red nueva"
|
||||
},
|
||||
"newPassword": {
|
||||
"message": "Contraseña nueva (mín. de 8 caracteres)"
|
||||
"message": "Contraseña nueva (mín. de 8 caracteres)"
|
||||
},
|
||||
"newToMetaMask": {
|
||||
"message": "¿Es nuevo en MetaMask?"
|
||||
@ -1295,6 +1308,22 @@
|
||||
"message": "Su \"frase de recuperación\" ahora se llama \"frase secreta de recuperación.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "A partir de la versión 91 de Chrome, la API que habilitaba nuestro soporte para Ledger (U2F) ya no es compatible con carteras de hardware. MetaMask ha implementado un nuevo soporte para Ledger Live mediante el cual usted puede seguir conectándose a su dispositivo Ledger a través de la aplicación de escritorio Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Cuando interactúe con su cuenta de Ledger a través de MetaMask, se abrirá una nueva pestaña y se le pedirá que abra la aplicación Ledger Live. Una vez que se abra la aplicación, se le pedirá que otorgue permiso para establecer una conexión WebSocket con su cuenta de MetaMask. ¡Eso es todo!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "A fin de habilitar el soporte para Live Ledger, haga clic en Configuración > Avanzada > Utilizar Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Actualización del soporte para Ledger destinada a usuarios de Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "de"
|
||||
},
|
||||
@ -1380,7 +1409,7 @@
|
||||
"message": "Moneda principal"
|
||||
},
|
||||
"primaryCurrencySettingDescription": {
|
||||
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
|
||||
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
|
||||
},
|
||||
"privacyMsg": {
|
||||
"message": "Política de privacidad"
|
||||
@ -1422,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Búsqueda, dirección pública (0x) o ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Iniciar aquí"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Entendido"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Guarde siempre su frase secreta de recuperación en un lugar seguro y secreto."
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "¿Necesita volver a crear una copia de seguridad de su frase secreta de recuperación?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "No comparta nunca su frase secreta de recuperación con nadie."
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "El equipo de MetaMask nunca le pedirá su frase secreta de recuperación."
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Mediante su frase secreta de recuperación, se controlan todas sus cuentas."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Proteja sus fondos."
|
||||
},
|
||||
"reject": {
|
||||
"message": "Rechazar"
|
||||
},
|
||||
@ -1429,7 +1482,7 @@
|
||||
"message": "Rechazar todo"
|
||||
},
|
||||
"rejectTxsDescription": {
|
||||
"message": "Está a punto de rechazar $1 transacciones en lote."
|
||||
"message": "Está a punto de rechazar $1 transacciones en lote."
|
||||
},
|
||||
"rejectTxsN": {
|
||||
"message": "Rechazar $1 transacciones"
|
||||
@ -1544,7 +1597,7 @@
|
||||
"message": "Ingrese su frase secreta aquí para restaurar su bóveda."
|
||||
},
|
||||
"securityAndPrivacy": {
|
||||
"message": "Seguridad y privacidad"
|
||||
"message": "Seguridad y privacidad"
|
||||
},
|
||||
"securitySettingsDescription": {
|
||||
"message": "Configuración de privacidad y frase secreta de recuperación de la cartera"
|
||||
@ -1592,7 +1645,7 @@
|
||||
"message": "Pegar la frase secreta de recuperación desde el Portapapeles"
|
||||
},
|
||||
"seedPhraseReq": {
|
||||
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
|
||||
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
|
||||
},
|
||||
"selectAHigherGasFee": {
|
||||
"message": "Seleccione una cuota de gas más alta para acelerar el procesamiento de la transacción.*"
|
||||
@ -1911,7 +1964,7 @@
|
||||
"message": "Cuota de MetaMask"
|
||||
},
|
||||
"swapMetaMaskFeeDescription": {
|
||||
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
|
||||
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
|
||||
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
|
||||
},
|
||||
"swapNQuotes": {
|
||||
@ -1934,9 +1987,18 @@
|
||||
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
|
||||
},
|
||||
"swapPriceDifferenceTitle": {
|
||||
"message": "Diferencia de precio de ~$1 %",
|
||||
"message": "Diferencia de precio de ~$1 %",
|
||||
"description": "$1 is a number (ex: 1.23) that represents the price difference."
|
||||
},
|
||||
"swapPriceImpactTooltip": {
|
||||
"message": "El impacto sobre el precio es la diferencia entre el precio actual del mercado y el monto recibido durante la ejecución de la transacción. El impacto sobre el precio es una función del tamaño de su transacción respecto de la dimensión del fondo de liquidez."
|
||||
},
|
||||
"swapPriceUnavailableDescription": {
|
||||
"message": "No se pudo determinar el impacto sobre el precio debido a la falta de datos de los precios del mercado. Antes de realizar el canje, confirme que está de acuerdo con la cantidad de tokens que está a punto de recibir."
|
||||
},
|
||||
"swapPriceUnavailableTitle": {
|
||||
"message": "Antes de continuar, verifique su tasa"
|
||||
},
|
||||
"swapProcessing": {
|
||||
"message": "Procesamiento"
|
||||
},
|
||||
@ -1947,7 +2009,7 @@
|
||||
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
|
||||
},
|
||||
"swapQuoteIncludesRate": {
|
||||
"message": "La cotización incluye una cuota de MetaMask de $1 %",
|
||||
"message": "La cotización incluye una cuota de MetaMask de $1 %",
|
||||
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
|
||||
},
|
||||
"swapQuoteNofN": {
|
||||
@ -2038,6 +2100,9 @@
|
||||
"message": "Canjear $1 por $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Este token se añadió de forma manual."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Siempre confirme la dirección del token en $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2053,7 +2118,7 @@
|
||||
"message": "Transacción completa"
|
||||
},
|
||||
"swapTwoTransactions": {
|
||||
"message": "2 transacciones"
|
||||
"message": "2 transacciones"
|
||||
},
|
||||
"swapUnknown": {
|
||||
"message": "Desconocido"
|
||||
@ -2070,13 +2135,13 @@
|
||||
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
|
||||
},
|
||||
"swapZeroSlippage": {
|
||||
"message": "0 % de desfase"
|
||||
"message": "0 % de desfase"
|
||||
},
|
||||
"swapsAdvancedOptions": {
|
||||
"message": "Opciones avanzadas"
|
||||
},
|
||||
"swapsExcessiveSlippageWarning": {
|
||||
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
|
||||
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
|
||||
},
|
||||
"swapsMaxSlippage": {
|
||||
"message": "Tolerancia de desfase"
|
||||
@ -2116,7 +2181,7 @@
|
||||
"message": "Símbolo"
|
||||
},
|
||||
"symbolBetweenZeroTwelve": {
|
||||
"message": "El símbolo debe tener 11 caracteres o menos."
|
||||
"message": "El símbolo debe tener 11 caracteres o menos."
|
||||
},
|
||||
"syncWithMobile": {
|
||||
"message": "Sincronizar con dispositivo móvil"
|
||||
@ -2305,7 +2370,7 @@
|
||||
"message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "La dirección URL ya está en la lista de redes existentes"
|
||||
"message": "En este momento, la red $1 está utilizando esta dirección URL."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Usar detección de phishing"
|
||||
@ -2327,6 +2392,10 @@
|
||||
"message": "Comprobar este token en $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Verifique este token en $1 y asegúrese de que sea el token con el que quiere realizar la transacción.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Ver cuenta"
|
||||
},
|
||||
@ -2361,7 +2430,7 @@
|
||||
"message": "Frase secreta de recuperación de la cartera"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
|
||||
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Teie lehitsejat ei toetata..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask on projekteeritud ja loodud Californias."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Ostke ETH-d Wyre'iga"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "مرورگر شما پشتیبانی نمیشود"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask در کالیفورنیا طراحی و ساخته شده است."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "ETH را توسط Wyre خریداری نمایید"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Selaintasi ei tueta..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask on suunniteltu ja koottu Kaliforniassa."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Osta ETH:ta Wyrella"
|
||||
},
|
||||
|
@ -128,9 +128,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Hindi sinusuportahan ang iyong Browser..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "Ang MetaMask ay dinisenyo at binuo sa California."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Bumili ng ETH gamit ang Wyre"
|
||||
},
|
||||
|
@ -137,9 +137,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Votre navigateur internet n'est pas supporté..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask est designé et developpé en Californie."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Acheter ETH avec Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "הדפדפן שלך אינו נתמך..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask תוכנן ונבנה בקליפורניה."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "רכישת את'ר עם Wyre"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "संपर्क जोड़ें"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "टोकन नहीं मिल रहा है? आप अपने पते को चिपकाकर मैन्युअल रूप से किसी भी टोकन को जोड़ सकते हैं। टोकन अनुबंध पते $1 पर मिल सकते हैं।",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "इससे इस नेटवर्क को MetaMask के अंदर उपयोग करने की अनुमति मिलेगी।"
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "आपका ब्राउज़र समर्थित नहीं है..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "अपनी संपर्क सूची बनाएं"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask को कैलिफोर्निया में डिज़ाइन और निर्मित किया गया है।"
|
||||
},
|
||||
"buy": {
|
||||
"message": "खरीदें"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "इस नेटवर्क के लिए लेन-देन पर हस्ताक्षर करने के लिए उपयोग की जाने वाली चेन ID।"
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "यह चेन ID वर्तमान में $1 नेटवर्क द्वारा उपयोग किया जाता है।"
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "अपने हार्डवेयर वॉलेट से कनेक्ट करने के लिए आपको Google Chrome पर MetaMask का उपयोग करने की आवश्यकता है।"
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Wyre पर जारी रखें"
|
||||
},
|
||||
"contract": {
|
||||
"message": "अनुबंध"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "आप टोकन के अनुबंध पते पर टोकन भेज रहे हैं। इसके परिणामस्वरूप इन टोकनों का नुकसान हो सकता है।"
|
||||
},
|
||||
@ -624,7 +631,11 @@
|
||||
"message": "फ़िशिंग से सावधान रहें! MetaMask कभी भी अनायास ही आपके गुप्त रिकवरी फ्रेज़ के बारे में नहीं पूछेगा।"
|
||||
},
|
||||
"endOfFlowMessage6": {
|
||||
"message": "यदि आपको अपने गुप्त रिकवरी फ्रेज़ को फिर से बैकअप लेने की आवश्यकता है, तो आप इसे सेटिंग्स -> सुरक्षा में पा सकते हैं।"
|
||||
"message": "यदि आपको अपने गुप्त रिकवरी फ्रेज़ को फिर से बैकअप लेने की आवश्यकता है, तो आप इसे सेटिंग -> सुरक्षा में पा सकते हैं।"
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "यदि आपको कभी कुछ पूछना हो या कुछ गड़बड़ लगे, तो हमारी सहायता $1 से संपर्क करें।",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "MetaMask आपके गुप्त रिकवरी फ्रेज़ को पुनर्प्राप्त नहीं कर सकता है।"
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "गुप्त रिकवरी फ्रेज़ के साथ एक खाता आयात करें"
|
||||
},
|
||||
"importAccountText": {
|
||||
"message": "या $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "टोकन का आयात करें?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "कोई भी किसी भी नाम के साथ एक टोकन बना सकता है, जिसमें मौजूदा टोकन के नकली संस्करण शामिल हैं। अपने जोखिम पर जोड़ें और व्यापार करें!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "वॉलेट आयात करें"
|
||||
},
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "आपके \"सीड फ्रेज़\" को अब आपका \"गुप्त रिकवरी फ्रेज़\" कहा जाता है।",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Chrome के संस्करण 91 से, वह API जो हमारे Ledger सपोर्ट (U2F) को सक्षम करती है वह अब हार्डवेयर वॉलेट का समर्थन नहीं करती। MetaMask ने एक नया Ledger Live सपोर्ट लागू किया है, जिसकी मदद से आप Ledger Live डेस्कटॉप ऐप के माध्यम से अपने Ledger डिवाइस से कनेक्ट करना जारी रख सकते हैं।",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "MetaMask में अपने Ledger खाते पर काम करते समय, एक नया टैब खुल जाएगा और आपको Ledger Live ऐप खोलने के लिए कहा जाएगा। ऐप खुलने के बाद, आपको अपने MetaMask खाते के लिए एक WebSocket कनेक्शन को अनुमति देने के लिए कहा जाएगा। बस इतना ही!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "आप सेटिंग > उन्नत > Ledger Live का उपयोग करें पर क्लिक करके Ledger Live सहायता को सक्षम कर सकते हैं।",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Chrome उपयोगकर्ताओं के लिए Ledger सहायता अद्यतन",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "/"
|
||||
},
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "खोज, सार्वजनिक पता (0x) या ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "यहाँ से प्रारंभ करें"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "समझ गया"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "अपने गुप्त रिकवरी फ्रेज़ को हमेशा सुरक्षित और गुप्त स्थान पर रखें।"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "अपने गुप्त रिकवरी फ्रेज़ को फिर से बैकअप करने की आवश्यकता है?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "कभी भी अपना गुप्त रिकवरी फ्रेज़ किसी के साथ साझा न करें"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "MetaMask टीम कभी भी आपके गुप्त रिकवरी फ्रेज़ के बारे में नहीं पूछेगा"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "आपका गुप्त रिकवरी फ्रेज़ आपके सभी खातों को नियंत्रित करता है।"
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "अपने धन को सुरक्षित रखें"
|
||||
},
|
||||
"reject": {
|
||||
"message": "अस्वीकार करें"
|
||||
},
|
||||
@ -1541,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "गोपनीयता सेटिंग्स और वॉलेट का गुप्त रिकवरी फ्रेज़"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "लिख लें और कई गुप्त स्थानों में स्टोर करें।"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "पासवर्ड मैनेजर में सहेजें"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "सेफ़ डिपोज़िट बॉक्स में स्टोर करें।"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "बैंक की तिजोरी में रखें।"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "आपका रिकवरी फ्रेज़ आपके वॉलेट और धन के लिए “मास्टर कुंजी” है।"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "यदि कोई व्यक्ति आपका रिकवरी फ्रेज़ मांगता है, तो सबसे अधिक संभावना है कि वे आपको धोखा देने का प्रयास कर रहे हैं।"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "कभी भी अपना रिकवरी फ्रेज़ साझा न करें, MetaMask के साथ भी नहीं!"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "रिकवरी फ्रेज़ क्या है?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "क्या मुझे अपना रिकवरी फ्रेज़ साझा करना चाहिए?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "मैं अपना रिकवरी फ्रेज़ कैसे सहेजूं?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "अपने वॉलेट को सुरक्षित करें"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "शुरुआत करने से पहले, अपने रिकवरी फ्रेज़ और अपने वॉलेट को सुरक्षित रखने के तरीके के बारे में जानने के लिए यह छोटा-सा वीडियो देखें।"
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "प्रत्येक शब्द को एक रिक्ति से अलग करें"
|
||||
},
|
||||
@ -2003,6 +2100,9 @@
|
||||
"message": "$1 से $2 में स्वैप करें",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "इस टोकन को मैन्युअल रूप से जोड़ा गया है।"
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "हमेशा $1 पर टोकन पते की पुष्टि करें।",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2270,7 +2370,7 @@
|
||||
"message": "URL को उपयुक्त HTTP/HTTPS उपसर्ग की आवश्यकता होती है।"
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "URL नेटवर्क की मौजूदा सूची में पहले से मौजूद है"
|
||||
"message": "यह URL वर्तमान में $1 नेटवर्क द्वारा उपयोग किया जाता है।"
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "फ़िशिंग डिटेक्शन का उपयोग करें"
|
||||
@ -2292,6 +2392,10 @@
|
||||
"message": "इस टोकन को $1 पर सत्यापित करें",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "इस टोकन को $1 पर सत्यापित करें और सुनिश्चित करें कि यह वही टोकन है जिससे आप व्यापार करना चाहते हैं।",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "खाता देखें"
|
||||
},
|
||||
@ -2325,6 +2429,10 @@
|
||||
"walletSeedRestore": {
|
||||
"message": "वॉलेट का गुप्त रिकवरी फ्रेज़"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "हमने देखा है कि वर्तमान वेबसाइट ने हटाए गए window.web3 API का उपयोग करने की कोशिश की। यदि साइट में गड़बड़ी लगती है, तो कृपया अधिक जानकारी के लिए $1 पर क्लिक करें।",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "MetaMask में आपका स्वागत है"
|
||||
},
|
||||
|
@ -43,9 +43,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "ब्लॉकीज पहचान का उपयोग करें"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "मेटामास्क कैलिफ़ोर्निया में डिज़ाइन और बनाया गया है।"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "रद्द करें"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Vaš se preglednik ne podržava..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask je osmišljen i izrađen u Kaliforniji."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kupi ETH Wyerom"
|
||||
},
|
||||
|
@ -73,9 +73,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Navigatè ou a pa sipòte..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask fèt e bati nan California."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Anile"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Az ön böngészője nem támogatott..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "A MetaMaskot Kaliforniában tervezték és hozták létre."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Vásároljon ETH-t a Wyre-rel"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Tambah kontak"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Tidak dapat menemukan token? Anda dapat menambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Ini akan memungkinkan jaringan ini digunakan dengan MetaMask."
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Browser Anda tidak didukung..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Buat daftar kontak Anda"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask didesain dan didirikan di California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Beli"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "ID rantai digunakan untuk menandatangani transaksi untuk jaringan ini."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "ID Rantai ini saat ini digunakan oleh jaringan $1."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Anda perlu menggunakan MetaMask di Google Chrome untuk terhubung ke Dompet Perangkat Keras Anda."
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Lanjutkan ke Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Kontrak"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Anda mengirim token ke alamat kontrak token. Ini dapat mengakibatkan token ini hilang."
|
||||
},
|
||||
@ -626,6 +633,10 @@
|
||||
"endOfFlowMessage6": {
|
||||
"message": "Jika Anda perlu mencadangkan Frasa Pemulihan Rahasia lagi, Anda dapat menemukannya di Pengaturan -> Keamanan."
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "Jika Anda memiliki pertanyaan atau melihat sesuatu yang mencurigakan, hubungi dukungan $1 kami.",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "MetaMask tidak dapat memulihkan Frasa Pemulihan Rahasia Anda."
|
||||
},
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "Impor akun dengan Frasa Pemulihan Rahasia"
|
||||
},
|
||||
"importAccountText": {
|
||||
"message": "atau $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "Impor token?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Siapa pun dapat membuat token dengan nama apa pun, termasuk versi palsu dari token yang ada. Tambahkan dan perdagangkan dengan risiko Anda sendiri!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Impor dompet"
|
||||
},
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "\"Frasa Pemulihan\" Anda kini disebut \"Frasa Pemulihan Rahasia.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Pada Chrome versi 91, API yang memungkinkan dukungan Ledger (U2F) kami tidak lagi mendukung dompet perangkat keras. MetaMask telah menerapkan dukungan Ledger Live baru yang memungkinkan Anda terus terhubung ke perangkat Ledger Anda melalui aplikasi desktop Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Saat berinteraksi dengan akun Ledger Anda di MetaMask, tab baru akan terbuka dan Anda akan diminta untuk membuka aplikasi Ledger Live. Setelah aplikasi tersebut terbuka, Anda akan diminta untuk mengizinkan koneksi WebSocket ke akun MetaMask Anda. Tidak diperlukan tindakan lebih lanjut.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "Anda dapat mengaktifkan dukungan Ledger Live dengan mengklik Pengaturan > Lanjutan > Gunakan Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Pembaruan Dukungan Ledger untuk Pengguna Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "dari"
|
||||
},
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Cari, alamat publik (0x), atau ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Mulai di sini"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Mengerti"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Jaga selalu Frasa Pemulihan Rahasia Anda di tempat yang aman dan rahasia"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "Perlu mencadangkan Frasa Pemulihan Rahasia Anda lagi?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "Jangan membagikan Frasa Pemulihan Rahasia Anda kepada siapa pun"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "Tim MetaMask tidak akan pernah meminta Frasa Pemulihan Rahasia Anda"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Frasa Pemulihan Rahasia Anda mengendalikan semua akun Anda."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Lindungi dana Anda"
|
||||
},
|
||||
"reject": {
|
||||
"message": "Tolak"
|
||||
},
|
||||
@ -1439,7 +1500,7 @@
|
||||
"message": "Hapus akun"
|
||||
},
|
||||
"removeAccountDescription": {
|
||||
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari drop down akun. "
|
||||
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari akun drop down. "
|
||||
},
|
||||
"requestsAwaitingAcknowledgement": {
|
||||
"message": "permintaan menunggu untuk diakui"
|
||||
@ -1541,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "Pengaturan privasi dan Frasa Pemulihan Rahasia dompet"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Tuliskan dan simpan di beberapa tempat rahasia."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "Simpan dalam pengelola kata sandi"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "Simpan di kotak deposit yang aman."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "Simpan di vault bank."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "Frasa pemulihan Anda adalah “kunci induk” ke dompet dan dana Anda."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "Jika seseorang menanyakan frasa pemulihan Anda, kemungkinan mereka akan mencoba menipu Anda."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "Jangan pernah membagikan frasa pemulihan Anda bahkan kepada MetaMask!"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "Apa itu frasa pemulihan?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "Haruskah saya membagikan frasa pemulihan saya?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "Bagaimana cara menyimpan frasa pemulihan saya?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "Amankan dompet Anda"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "Sebelum memulai, lihat video singkat ini untuk mempelajari tentang frasa pemulihan Anda dan cara menjaga keamanan dompet Anda."
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "Pisahkan setiap kata dengan satu spasi"
|
||||
},
|
||||
@ -2003,6 +2100,9 @@
|
||||
"message": "Tukar $1 untuk $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Token ini telah ditambahkan secara manual."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Selalu konfirmasikan alamat token di $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2270,7 +2370,7 @@
|
||||
"message": "URL memerlukan awalan HTTP/HTTPS yang sesuai."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "URL sudah ada dalam daftar jaringan yang ada"
|
||||
"message": "URL ini saat ini digunakan oleh jaringan $1."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Menggunakan Deteksi Phishing"
|
||||
@ -2292,6 +2392,10 @@
|
||||
"message": "Verifikasikan token ini di $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Verifikasi token ini di $1 dan pastikan ini adalah token yang ingin Anda perdagangkan.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Lihat Akun"
|
||||
},
|
||||
@ -2325,6 +2429,10 @@
|
||||
"walletSeedRestore": {
|
||||
"message": "Frasa Pemulihan Rahasia Dompet"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Kami melihat situs web saat ini mencoba menggunakan API window.web3 yang dihapus. Jika situs tersebut tampak bermasalah, silakan klik $1 untuk informasi selengkapnya.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "Selamat datang di MetaMask"
|
||||
},
|
||||
|
@ -217,9 +217,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Il tuo Browser non è supportato..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask è progettato e realizzato in California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Compra"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "連絡先の追加"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "トークンを発見できませんか?アドレスをペーストすることで手動でトークンを追加することができます。トークン コントラクト アドレスは $1 にあります。",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "これにより、このネットワークは MetaMask 内で使用できるようになります。"
|
||||
},
|
||||
@ -109,7 +113,7 @@
|
||||
"message": "アグリゲーター ネットワーク料金"
|
||||
},
|
||||
"alertDisableTooltip": {
|
||||
"message": "\"設定 > 警告\" の設定で変更できます"
|
||||
"message": "これは、[\"設定 > 警告\"] で変更できます"
|
||||
},
|
||||
"alertSettingsUnconnectedAccount": {
|
||||
"message": "選択した未接続のアカウントを使用して Web サイトをブラウズしています"
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "ご使用のブラウザーはサポートされていません..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "連絡先リストを作成する"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask はカリフォルニアで設計および作成されました。"
|
||||
},
|
||||
"buy": {
|
||||
"message": "購入"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "このネットワークのトランザクションの署名に使用されるチェーン ID。"
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "このチェーン ID は現在 $1 ネットワークで使用しています。"
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "ハードウェア ウォレットに接続するには、MetaMask on Google Chrome を使用する必要があります。"
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Wyre に進む"
|
||||
},
|
||||
"contract": {
|
||||
"message": "コントラクト"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "トークンのコントラクト アドレスにトークンを送信しています。これにより、これらのトークンが失われる可能性があります。"
|
||||
},
|
||||
@ -624,7 +631,11 @@
|
||||
"message": "フィッシングにご注意ください!MetaMask の動作として、シークレット リカバリー フレーズを要求することは絶対にありません。"
|
||||
},
|
||||
"endOfFlowMessage6": {
|
||||
"message": "シークレット リカバリー フレーズを再度バックアップする場合は、[設定] -> [セキュリティとプライバシー] にアクセスしてください。"
|
||||
"message": "シークレット リカバリー フレーズを再度バックアップする場合は、[設定] -> [セキュリティ] でそれを見つけることができます。"
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "ご質問、または不審な点がある場合は、当社のサポート $1 までお問い合わせください。",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "MetaMask はシークレット リカバリー フレーズを復元できません。"
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "シークレット リカバリー フレーズを使用してアカウントをインポートする:"
|
||||
},
|
||||
"importAccountText": {
|
||||
"message": "または $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "トークンをインポートしますか?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "誰でも既存のトークンの偽バージョンを含めて、任意の名前でトークンを作成することができます。自己責任で追加およびトレードしてください。"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "ウォレットのインポート"
|
||||
},
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "これで、\"シード フレーズ\" は \"シークレット リカバリー フレーズ\" と呼ばれます。",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Chrome バージョン 91 以降は、レジャーのサポート (U2F) を可能にした API がハードウェア ウォレットをサポートしなくなります。MetaMask では、ユーザーがレジャー ライブのデスクトップ アプリを介して、レジャー デバイスに継続的に接続することができる新しいレジャー ライブのサポートを導入しました。",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "MetaMask のレジャーのアカウントを使用する際は、新しいタブが開き、レジャー ライブのアプリを開くよう指示されます。アプリが開いたら、WebSocket 接続を MetaMask のアカウントに許可するよう指示されます。以上です。",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "[設定] > [詳細] > [レジャー ライブを使用] の順にクリックすることで、レジャー ライブのサポートを有効にすることができます。",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Chrome ユーザー向けのレジャーのサポートの更新",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "中の"
|
||||
},
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "検索、パブリック アドレス (0x)、または ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "ここから開始"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "OK"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "シークレット リカバリー フレーズは常に安全かつ秘密の場所に保管してください"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "シークレット リカバリー フレーズのバックアップが必要ですか?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "シークレット リカバリー フレーズは誰とも決して共有しないでください"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "MetaMask チームが、ユーザーのシークレット リカバリー フレーズを確認することは絶対にありません"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "シークレット リカバリー フレーズは、ご利用のすべてのアカウントを制御します。"
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "資産を保護してください"
|
||||
},
|
||||
"reject": {
|
||||
"message": "拒否"
|
||||
},
|
||||
@ -1541,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "プライバシーの設定とシークレット リカバリー フレーズ"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "書き留めて、複数の秘密の場所に保存します。"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "パスワード マネージャーに保存する"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "セーフティ ボックスに保管する。"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "銀行の金庫に保管する。"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "あなたのリカバリー フレーズは、ウォレットと資金への「マスターキー」です。"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "誰かがあなたのリカバリー フレーズを尋ねてきたら、おそらくあなたを騙そうとしているのです。"
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "MetaMask を共有しても、リカバリ フレーズは決して共有しないでください。"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "リカバリー フレーズとは何ですか?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "リカバリーフレーズは共有すべきですか?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "リカバリー フレーズはどのように保存すべきですか?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "ウォレットの保護"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "始める前に、この短いビデオを見て、リカバリー フレーズとウォレットを安全に保つ方法について確認してください。"
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "単語ごとにスペースを 1 つ置いて分離します"
|
||||
},
|
||||
@ -1893,6 +1990,15 @@
|
||||
"message": "約 $1% の価格差",
|
||||
"description": "$1 is a number (ex: 1.23) that represents the price difference."
|
||||
},
|
||||
"swapPriceImpactTooltip": {
|
||||
"message": "プライスインパクトとは、現在の市場価格と取引の約定時に受け取った金額の差のことです。プライスインパクトとは、流動性プールの大きさに対するあなたのトレードの大きさを表わす関数です。"
|
||||
},
|
||||
"swapPriceUnavailableDescription": {
|
||||
"message": "市場価格のデータが不足しているため、プライスインパクトを測定できませんでした。スワップする前に、これから受領するトークンの額に問題がないか確認してください。"
|
||||
},
|
||||
"swapPriceUnavailableTitle": {
|
||||
"message": "続行する前にレートを確認してください"
|
||||
},
|
||||
"swapProcessing": {
|
||||
"message": "処理中"
|
||||
},
|
||||
@ -1994,6 +2100,9 @@
|
||||
"message": "$1 を $2 にスワップ",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "このトークンは手動で追加されました。"
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "常に $1 のトークン アドレスを確認してください。",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2261,7 +2370,7 @@
|
||||
"message": "URL には適切な HTTP/HTTPS プレフィックスが必要です。"
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "URL はネットワークの既存のリストに既に存在します"
|
||||
"message": "この URL は現在 $1 ネットワークで使用しています。"
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "フィッシング検出を使用"
|
||||
@ -2283,6 +2392,10 @@
|
||||
"message": "このトークンを $1 で検証",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "このトークンを $1 で検証して、それがトレードしたいトークンであることを確認してください。",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "アカウントを表示"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "ನಿಮ್ಮ ಬ್ರೌಸರ್ ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ಅನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು ಕ್ಯಾಲಿಫೋರ್ನಿಯಾದಲ್ಲಿ ನಿರ್ಮಿಸಲಾಗಿದೆ."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Wyre ನೊಂದಿಗೆ ETH ಖರೀದಿಸಿ"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Jūsų naršyklė neatpažįstama..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "„MetaMask“ suprojektuota ir įdiegta Kalifornijoje."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Pirkti ETH su „Wyre“"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Jūsu pārlūkprogramma netiek atbalstīta..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ir izstrādāta un izveidota Kalifornijā."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Pirkt ETH ar Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Pelayar anda tidak disokong..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask direka dan dibina di California."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Beli ETH dengan Wyre"
|
||||
},
|
||||
|
@ -40,9 +40,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "Gebruik Blockies Identicon"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask is ontworpen en gebouwd in Californië."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Annuleer"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Nettleseren din støttes ikke ..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ble bygget og designet i California."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kjøp ETH med Wyre"
|
||||
},
|
||||
|
@ -6,7 +6,7 @@
|
||||
"message": "Bersyon, support center, at impormasyon sa pakikipag-ugnayan"
|
||||
},
|
||||
"acceleratingATransaction": {
|
||||
"message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas, mas magiging malaki ang tsansang mas mabilis na maproseso ng network, pero hindi ito palaging ginagarantiya."
|
||||
"message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas, mas magiging malaki ang tsansang mas mabilis na maiproseso ng network, pero hindi ito palaging ginagarantiya."
|
||||
},
|
||||
"acceptTermsOfUse": {
|
||||
"message": "Nabasa ko at sumasang-ayon ako sa $1",
|
||||
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Magdagdag ng contact"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Walang makitang token? Puwede kang manual na magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Makikita ang mga address ng kontrata ng token sa $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Bibigyang-daan nito na magamit ang network na ito sa MetaMask."
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Hindi sinusuportahan ang iyong Browser..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Buuin ang iyong listahan ng contact"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "Ang MetaMask ay idinisenyo at binuo sa California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Bumili"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "Ginagamit ang chain ID para maglagda ng mga transaksyon para sa network na ito."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "Kasalukuyang ginagamit ng $1 network ang Chain ID na ito."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Kailangan mong gamitin ang MetaMask sa Google Chrome para maikonekta sa iyong Hardware Wallet."
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Magpatuloy sa Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Kontrata"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Magpapadala ka ng mga token sa address ng kontrata ng token. Posible itong magresulta sa pagkawala ng mga token na ito."
|
||||
},
|
||||
@ -641,7 +648,7 @@
|
||||
"description": "$1 is the return value of eth_chainId from an RPC endpoint"
|
||||
},
|
||||
"ensNotFoundOnCurrentNetwork": {
|
||||
"message": "Hindi nahanapa ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet."
|
||||
"message": "Hindi nahanap ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet."
|
||||
},
|
||||
"ensRegistrationError": {
|
||||
"message": "Nagka-error sa pag-register ng ENS name"
|
||||
@ -694,7 +701,7 @@
|
||||
"message": "Mga Tinatantyang Tagal ng Pagproseso"
|
||||
},
|
||||
"ethGasPriceFetchWarning": {
|
||||
"message": "Ibinibigay ang backup na presyo ng gas dahil hindi available ang pangunahing serbisyo sa pagtatantiya ng gas sa ngayon."
|
||||
"message": "Ibinibigay ang backup na presyo ng gas dahil hindi available ang pangunahing serbisyo sa pagtatantya ng gas sa ngayon."
|
||||
},
|
||||
"eth_accounts": {
|
||||
"message": "Tingnan ang mga address ng iyong mga pinapayagang account (kinakailangan)",
|
||||
@ -793,7 +800,7 @@
|
||||
"message": "Sobrang Baba ng Presyo ng Gas"
|
||||
},
|
||||
"gasPriceFetchFailed": {
|
||||
"message": "Hindi nagtagumpay ang pagtatantiya ng presyo ng gas dahil sa error sa network."
|
||||
"message": "Hindi nagtagumpay ang pagtatantya ng presyo ng gas dahil sa error sa network."
|
||||
},
|
||||
"gasPriceInfoTooltipContent": {
|
||||
"message": "Tinutukoy ng presyo ng gas ang halaga ng Ether na handa mong bayaran para sa bawat unit ng gas."
|
||||
@ -893,6 +900,12 @@
|
||||
"message": "o $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "Mag-import ng token?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Sinuman ay makakagawa ng token na may anumang pangalan, kasama ang mga pekeng bersyon ng mga token na mayroon na. Magdagdag at mag-trade sa sarili mong pananagutan!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Mag-import ng wallet"
|
||||
},
|
||||
@ -1022,7 +1035,7 @@
|
||||
"message": "Mga Link"
|
||||
},
|
||||
"loadMore": {
|
||||
"message": "Matuto Pa"
|
||||
"message": "Mag-load Pa"
|
||||
},
|
||||
"loading": {
|
||||
"message": "Nilo-load..."
|
||||
@ -1127,7 +1140,7 @@
|
||||
"message": "Pangalan"
|
||||
},
|
||||
"needEtherInWallet": {
|
||||
"message": "Para makaugnayan ang mga decentralized ma application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet."
|
||||
"message": "Para makaugnayan ang mga decentralized na application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet."
|
||||
},
|
||||
"needHelp": {
|
||||
"message": "Kailangan ng tulong? Makipag-ugnayan sa $1",
|
||||
@ -1162,7 +1175,7 @@
|
||||
"message": "Testnet"
|
||||
},
|
||||
"networkSettingsChainIdDescription": {
|
||||
"message": "Ginagaamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal."
|
||||
"message": "Ginagamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal."
|
||||
},
|
||||
"networkSettingsDescription": {
|
||||
"message": "Magdagdag at mag-edit ng mga custom na RPC network"
|
||||
@ -1214,7 +1227,7 @@
|
||||
"message": "Susunod"
|
||||
},
|
||||
"nextNonceWarning": {
|
||||
"message": "Mas mataas ang noncesa iminumungkahing nonce na $1",
|
||||
"message": "Mas mataas ang nonce sa iminumungkahing nonce na $1",
|
||||
"description": "The next nonce according to MetaMask's internal logic"
|
||||
},
|
||||
"noAccountsFound": {
|
||||
@ -1295,6 +1308,22 @@
|
||||
"message": "Tinatawag na ngayong \"Secret Recovery Phrase\" mo ang iyong \"Seed Phrase.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Simula sa Chrome version 91, hindi na susuportahan ng API na nag-enable sa aming Ledger support (U2F) ang mga hardware wallet. Nagpatupad ang MetaMask ng bagong Ledger Live support na nagbibigay-daan sa iyong patuloy na ikonekta ang Ledger device mo sa pamamagitan ng Ledger Live desktop app.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Kapag ginagamit ang iyong Ledger account sa MetaMask, may bagong tab na magbubukas at hihilingin sa iyong buksan ang Ledger Live app. Kapag nagbukas ang app, hihilingin sa iyong payagan ang isang koneksyon ng WebSocket sa MetaMask account mo. Iyon lang!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "Puwede mong i-enable ang Ledger Live support sa pamamagitan ng pag-click sa Mga Setting > Advanced > Gamitin ang Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Update sa Ledger Support para sa Mga Chrome User",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "ng"
|
||||
},
|
||||
@ -1422,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Maghanap, pampublikong address (0x), o ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Magsimula rito"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "OK"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Palaging panatilihin ang iyong Secret Recovery Phrase sa isang ligtas at lihim na lugar"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "Kailangan ulit i-back up ang Secret Recovery Phrase mo?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "Huwag kailanman ipaalam sa iba ang iyong Secret Recovery Phrase"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "Hindi kailanman hihingin ng MetaMask team ang iyong Secret Recovery Phrase"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Kinokontrol ng iyong Secret Recovery Phrase ang lahat ng iyong account."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Protektahan ang iyong pondo!"
|
||||
},
|
||||
"reject": {
|
||||
"message": "Tanggihan"
|
||||
},
|
||||
@ -1866,7 +1919,7 @@
|
||||
"message": "Ito ay pagtatantya ng bayarin sa network na gagamitin para kumpletuhin ang iyong pag-swap. Posibleng magbago ang aktuwal na halaga ayon sa mga kundisyon ng network."
|
||||
},
|
||||
"swapFailedErrorDescriptionWithSupportLink": {
|
||||
"message": "May mga hindi pagtatagumpay sa transkasyon na nangyayari at narito kami para tumulong. Kung magpapatuloy ang isyung ito, puwede kang makipag-ugnayan sa aming suporta sa customer sa $1 para sa karagdagang tulong.",
|
||||
"message": "May mga hindi pagtatagumpay sa transaksyon na nangyayari at narito kami para tumulong. Kung magpapatuloy ang isyung ito, puwede kang makipag-ugnayan sa aming suporta sa customer sa $1 para sa karagdagang tulong.",
|
||||
"description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io"
|
||||
},
|
||||
"swapFailedErrorTitle": {
|
||||
@ -1898,7 +1951,7 @@
|
||||
"message": "Posibleng hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage."
|
||||
},
|
||||
"swapMaxNetworkFeeInfo": {
|
||||
"message": "Aang “$1” ay ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
|
||||
"message": "“$1” ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
|
||||
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
|
||||
},
|
||||
"swapMaxNetworkFees": {
|
||||
@ -2047,6 +2100,9 @@
|
||||
"message": "I-swap ang $1 sa $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Manual na idinagdag ang token na ito."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Palaging kumpirmahin ang address ng token sa $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2314,7 +2370,7 @@
|
||||
"message": "Kinakailangan ng mga URL ang naaangkop na HTTP/HTTPS prefix."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "Nasa kasalukuyang listahan ng mga network na ang URL"
|
||||
"message": "Kasalukuyang ginagamit ng $1 network ang URL na ito."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Gumamit ng Pag-detect ng Phishing"
|
||||
@ -2336,6 +2392,10 @@
|
||||
"message": "I-verify ang token na ito sa $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "I-verify ang token na ito sa $1 at tiyaking ito ang token na gusto mong i-trade.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Tingnan ang Account"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Twoja przeglądarka nie jest obsługiwana..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask został zaprojektowany i stworzony w Kaliforni."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kup ETH poprzez Wyre"
|
||||
},
|
||||
|
@ -43,9 +43,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "Usar Blockies Identicon"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask é desenhada e construída na California."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Cancelar"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Adicionar contato"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Não conseguiu encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contato do token podem ser encontrados em $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Isso permitirá esta rede ser usada dentro do MetaMask."
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Seu navegador não é compatível..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Crie sua lista de contatos"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "O MetaMask é projetado e construído na Califórnia."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Comprar"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "O ID da chain usado para assinar transações para essa rede."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "O ID da chain é usado no momento pela rede $1."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Você precisa usar MetaMask no Google Chrome para se conectar com sua carteira de hardware."
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Continuar para o Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Contrato"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Você está enviando tokens ao endereço de contrato do token. Isso pode resultar na perda destes tokens."
|
||||
},
|
||||
@ -626,6 +633,10 @@
|
||||
"endOfFlowMessage6": {
|
||||
"message": "Se você precisar fazer backup da sua Frase de recuperação secreta novamente, encontre-a em Configurações -> Segurança."
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "Se você tiver alguma pergunta ou vir algo suspeito, entre em contato com o atendimento ao cliente em $1.",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "O MetaMask não pode recuperar sua Frase de recuperação secreta."
|
||||
},
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "Importe uma conta com a Frase de recuperação secreta"
|
||||
},
|
||||
"importAccountText": {
|
||||
"message": "ou $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "Importar token?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Qualquer pessoa pode criar um token com um nome, incluindo versões falsas de tokens existentes. Adicione e negocie, assumindo o risco sozinho!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Importar carteira"
|
||||
},
|
||||
@ -961,6 +982,12 @@
|
||||
"invalidSeedPhrase": {
|
||||
"message": "Frase de recuperação secreta inválida"
|
||||
},
|
||||
"ipfsGateway": {
|
||||
"message": "Gateway IPFS"
|
||||
},
|
||||
"ipfsGatewayDescription": {
|
||||
"message": "Informe o URL do gateway de CID do IPFS para usar com resolução de conteúdo de ENS."
|
||||
},
|
||||
"jsonFile": {
|
||||
"message": "Arquivo JSON",
|
||||
"description": "format for importing an account"
|
||||
@ -1104,7 +1131,7 @@
|
||||
"message": "Informe sua senha para confirmar que é você mesmo!"
|
||||
},
|
||||
"mustSelectOne": {
|
||||
"message": "Selecione pelo menos 1 token."
|
||||
"message": "Selecione pelo menos 1 token."
|
||||
},
|
||||
"myAccounts": {
|
||||
"message": "Minhas contas"
|
||||
@ -1281,8 +1308,24 @@
|
||||
"message": "A sua \"Frase Semente\" agora é chamada de sua \"Frase Secreta de Recuperação.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "A partir do Chrome versão 91, a API que permitia nosso suporte ao Ledger (U2F) não é mais compatível com carteiras de hardware. O MetaMask implementou um novo suporte ao Ledger Live que permite continuar conectando o seu dispositivo Ledger device por meio do aplicativo de desktop Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Ao interagir com sua conta do Ledger no MetaMask, uma nova aba será aberta e você deverá abrir o aplicativo Ledger Live. Quando o aplicativo for aberto, você precisará permitir uma conexão do WebSocket com sua conta do MetaMask. É isso!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "Você pode habilitar o suporte do Ledger Live clicando em Configurações > Avançadas > Usar Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Atualização de suporte do Ledger para usuários do Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": " de "
|
||||
"message": "de"
|
||||
},
|
||||
"off": {
|
||||
"message": "Desativado"
|
||||
@ -1408,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Busca, endereço público (0x) ou ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Iniciar aqui"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Entendi"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Mantenha sempre o sigilo e proteja a sua Frase de Recuperação Secreta."
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "Precisa fazer backup da sua Frase de recuperação Secreta novamente?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "Nunca compartilhe a sua Frase de recuperação secreta com ninguém"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "A equipe do MetaMask jamais pedirá sua Frase de recuperação secreta."
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Sua Frase de recuperação secreta controla todas as suas contas."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Proteja seu dinheiro"
|
||||
},
|
||||
"reject": {
|
||||
"message": "Rejeitar"
|
||||
},
|
||||
@ -1456,6 +1523,16 @@
|
||||
"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"
|
||||
},
|
||||
"retryTransaction": {
|
||||
"message": "Refazer transação"
|
||||
},
|
||||
"reusedTokenNameWarning": {
|
||||
"message": "O token aqui reutiliza um símbolo de outro token que você observa; isso pode causar confusões ou induzir ao erro."
|
||||
},
|
||||
"revealSeedWords": {
|
||||
"message": "Revelar Frase de recuperação secreta"
|
||||
},
|
||||
@ -1525,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "Configurações de privacidade e Frase de recuperação secreta"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Anote e guarde em vários locais secretos."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "Salve em um gerenciador de senhas"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "Guarde dentro de um cofre."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "Guarde em um cofre-forte bancário."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "A sua frase de recuperação é a “chave-mestra” para sua carteira e seus fundos."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "Caso alguém lhe peça a sua frase de recuperação, essa pessoa provavelmente está tentando dar um golpe em você."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "Jamais compartilhe a sua frase de recuperação, mesmo com o MetaMask!"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "O que é uma frase de recuperação?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "Devo compartilhar minha frase de recuperação?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "Como salvo minha frase de recuperação?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "Proteger sua carteira"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "Antes de iniciar, assista esse vídeo curto para aprender sobre sua frase de recuperação e sobre como manter sua carteira segura."
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "Separe cada palavra com um único espaço"
|
||||
},
|
||||
@ -1987,6 +2100,9 @@
|
||||
"message": "Swap $1 para $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Este token foi adicionado manualmente."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Sempre confirme o endereço do token em $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2254,7 +2370,7 @@
|
||||
"message": "Os URLs precisam do prefixo HTTP/HTTPS adequado."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "O URL já está presente na lista de redes existente"
|
||||
"message": "O ID da chain é usado no momento pela rede $1."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Usar detecção de phishing"
|
||||
@ -2276,6 +2392,10 @@
|
||||
"message": "Verificar este token em $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Verifique este token em $1 garanta que seja o token que você deseja negociar.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Exibir conta"
|
||||
},
|
||||
@ -2309,6 +2429,10 @@
|
||||
"walletSeedRestore": {
|
||||
"message": "Frase de recuperação secreta da carteira"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Percebemos que o site atual tentou usar a API window.web3 removida. Se o site parecer estar corrompido, clique em $1 para obter mais informações.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "Bem-vindo(a) ao MetaMask"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Browserul dvs. nu este compatibil..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask este concepută și creată în California."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Cumpărați ETH cu Wyre"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Добавить контакт"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Невозможно найти токен? Вы можете вручную добавить любой токен, вставив его адрес. Контактные адреса токена можно найти на $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Это позволит использовать ее в MetaMask."
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Ваш браузер не поддерживается..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Создайте список контактов"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask разработан и построен в Калифорнии."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Купить"
|
||||
},
|
||||
@ -280,11 +281,14 @@
|
||||
"message": "Отменено"
|
||||
},
|
||||
"chainId": {
|
||||
"message": "Идентификатор цепи"
|
||||
"message": "Идентификатор цепочки"
|
||||
},
|
||||
"chainIdDefinition": {
|
||||
"message": "Идентификатор цепочки, используемый для подписания транзакций для этой сети."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "Этот идентификатор цепочки в настоящее время используется сетью $1."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Вам необходимо использовать MetaMask в Google Chrome, чтобы подключиться к аппаратному кошельку."
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Продолжить к Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Контракт"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Вы отправляете токены на адрес контракта токена. Это может привести к потере токенов."
|
||||
},
|
||||
@ -626,6 +633,10 @@
|
||||
"endOfFlowMessage6": {
|
||||
"message": "Если вам нужно снова создать резервную копию секретной фразы восстановления, вы можете найти ее в Настройки -> Безопасность."
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "Если у вас возникнут вопросы или вы увидите что-то подозрительное, обратитесь в службу поддержки $1.",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "Просто помните, что MetaMask не может восстановить секретную фразу восстановления."
|
||||
},
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "Импортировать счет с секретной фразой восстановления"
|
||||
},
|
||||
"importAccountText": {
|
||||
"message": "или $1",
|
||||
"description": "$1 represents the text from `importAccountLinkText` as a link"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "Импортировать токен?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Кто угодно может создать токен с любым именем, включая поддельные версии существующих токенов. Добавляйте и торгуйте на свой страх и риск!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Импортировать кошелек"
|
||||
},
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "Исходная фраза теперь называется секретной фразой восстановления.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Начиная с Chrome версии 91, API, обеспечивающий поддержку нашего Ledger (U2F), аппаратные кошельки больше не поддерживаются. MetaMask реализовала новую поддержку Ledger Live, которая позволяет продолжать подключаться к устройству Ledger через настольное приложение Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "При взаимодействии с вашим счетом Ledger в MetaMask откроется новая вкладка, и вам будет предложено открыть приложение Ledger Live. Когда приложение откроется, вам будет предложено разрешить WebSocket-соединение с вашим счетом MetaMask. Вот и все!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "Вы можете включить поддержку Ledger Live, нажав «Настройки» > «Дополнительно» > «Использовать Ledger Live».",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Обновление поддержки Ledger для пользователей Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "из"
|
||||
},
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Поиск, публичный адрес (0x) или ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Начать здесь"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Понятно"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Всегда храните свою секретную фразу восстановления в надежном и секретном месте"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "Нужно снова сделать резервную копию секретной фразы восстановления?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "Никогда никому не сообщайте свою секретную фразу восстановления"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "Команда MetaMask никогда неожиданно не запросит вашу секретную фразу восстановления"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Ваша секретная фраза восстановления контролирует все ваши счета."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Защитите свои активы"
|
||||
},
|
||||
"reject": {
|
||||
"message": "Отклонить"
|
||||
},
|
||||
@ -1473,7 +1534,7 @@
|
||||
"message": "Токен здесь повторно использует символ из другого токена, который вы смотрите, это может запутать или ввести в заблуждение."
|
||||
},
|
||||
"revealSeedWords": {
|
||||
"message": "Показать секретную фразу восстановления"
|
||||
"message": "Раскрыть секретную фразу восстановления"
|
||||
},
|
||||
"revealSeedWordsDescription": {
|
||||
"message": "Если вы меняете браузер или переходите на другой компьютер, вам понадобится эта секретная фраза восстановления для доступа к своим счетам. Сохраните ее в безопасном секретном месте."
|
||||
@ -1541,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "Настройки конфиденциальности и секретная фраза восстановления кошелька"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Запишите и храните в нескольких секретных местах."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "В диспетчере паролей."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "В банковской ячейке."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "В банковском сейфе."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "Фраза восстановления — это главный ключ к кошельку и средствам в нем."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "Если кто-нибудь интересуется вашей фразой восстановления, этот человек, скорее всего, пытается вас обмануть."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "Не сообщайте свою фразу восстановления никому, даже сотрудникам MetaMask."
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "Что такое фраза восстановления?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "Можно ли сообщать кому-либо свою фразу восстановления?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "Как хранить фразу восстановления?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "Защитите свой кошелек"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "Прежде чем приступить к работе, посмотрите это короткое видео о том, что такое фраза восстановления и как обезопасить кошелек."
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "Отделяйте каждое слово одним пробелом"
|
||||
},
|
||||
@ -2003,6 +2100,9 @@
|
||||
"message": "Своп $1 на $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Этот токен был добавлен вручную."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Всегда проверяйте адрес токена на $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2270,7 +2370,7 @@
|
||||
"message": "Для URL требуется соответствующий префикс HTTP/HTTPS."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "URL уже присутствует в имеющемся списке сетей"
|
||||
"message": "Это URL в настоящее время используется сетью $1."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Использовать обнаружение фишинга"
|
||||
@ -2292,6 +2392,10 @@
|
||||
"message": "Проверить этот токен на $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Проверьте этот токен на $1 и убедитесь, что это тот токен, которым вы хотите торговать.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Посмотреть счет"
|
||||
},
|
||||
@ -2325,6 +2429,10 @@
|
||||
"walletSeedRestore": {
|
||||
"message": "Секретная фраза восстановления кошелька"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Мы заметили, что текущий веб-сайт пытался использовать удаленный API window.web3. Если сайт не работает, нажмите $1 для получения дополнительной информации.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "Добро пожаловать в MetaMask"
|
||||
},
|
||||
|
@ -137,9 +137,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Váš prehliadač nie je podporovaný..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask je navržen a vytvořen v Kalifornii."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kúpte ETH s Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Vaš brskalnik ni podptrt ..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask je zasnovan in ustvarjen v Kaliforniji."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kupi ETH z Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Vaš pregledač nije podržan..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask je dizajniran i izgrađen u Kaliforniji."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Kupite ETH preko servisa Wyre"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Din webbläsare stöds inte..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask är skapat och utformat i Kalifornien."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Köp ETH med Wyre"
|
||||
},
|
||||
|
@ -140,9 +140,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Kivinjari chaku hakiwezeshwi..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask imeundwa na kutengenezwa California."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Nunua ETH kwa kutumia Wyre"
|
||||
},
|
||||
|
@ -55,9 +55,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "ப்ளாக்கிஸ் ஐடென்டிகோன் பயன்பாட்டு"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "மேடமஸ்க் வடிவமைக்கப்பட்டு கலிபோர்னியாவில் கட்டப்பட்டுள்ளது."
|
||||
},
|
||||
"cancel": {
|
||||
"message": "ரத்து செய்"
|
||||
},
|
||||
|
@ -49,9 +49,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "ใช้งาน Blockies Identicon"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask ออกแบบและพัฒนาที่แคลิฟอร์เนีย"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "ยกเลิก"
|
||||
},
|
||||
|
@ -211,9 +211,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Hindi sinusuportahan ang iyong Browser..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "Ang MetaMask ay idinisenyo at binuo sa California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Bilhin"
|
||||
},
|
||||
|
@ -46,9 +46,6 @@
|
||||
"blockiesIdenticon": {
|
||||
"message": "Blockies Identicon kullan"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask California'da tasarlandı ve yaratıldı"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Vazgeç"
|
||||
},
|
||||
|
@ -143,9 +143,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Ваш браузер не підтримується..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask розроблено й створено в Каліфорнії."
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Купити ETH через Wyre"
|
||||
},
|
||||
|
@ -52,6 +52,10 @@
|
||||
"addContact": {
|
||||
"message": "Thêm người liên hệ"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Bạn không tìm thấy token? Bạn có thể dán địa chỉ của bất kỳ token nào để thêm token đó theo cách thủ công. Bạn có thể tìm thấy địa chỉ hợp đồng token trên $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Thao tác này sẽ cho phép sử dụng mạng này trong MetaMask."
|
||||
},
|
||||
@ -249,12 +253,9 @@
|
||||
"browserNotSupported": {
|
||||
"message": "Trình duyệt của bạn không được hỗ trợ..."
|
||||
},
|
||||
"builContactList": {
|
||||
"buildContactList": {
|
||||
"message": "Xây dựng danh sách liên hệ của bạn"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask được thiết kế và phát triển tại California."
|
||||
},
|
||||
"buy": {
|
||||
"message": "Mua"
|
||||
},
|
||||
@ -285,6 +286,9 @@
|
||||
"chainIdDefinition": {
|
||||
"message": "Mã chuỗi được dùng để ký các giao dịch cho mạng này."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "Mạng $1 hiện đang sử dụng mã chuỗi này."
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Bạn cần sử dụng MetaMask trên Google Chrome để kết nối với Ví cứng của bạn."
|
||||
},
|
||||
@ -410,6 +414,9 @@
|
||||
"continueToWyre": {
|
||||
"message": "Tiếp tục chuyển đến Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Hợp đồng"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Bạn đang gửi token đến địa chỉ hợp đồng của token. Điều này có thể khiến bạn bị mất những token này."
|
||||
},
|
||||
@ -624,7 +631,11 @@
|
||||
"message": "Hãy cẩn thận với hoạt động lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi Cụm mật khẩu khôi phục bí mật của bạn."
|
||||
},
|
||||
"endOfFlowMessage6": {
|
||||
"message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong Cài đặt -> Bảo mật."
|
||||
"message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong phần Cài đặt -> Bảo mật."
|
||||
},
|
||||
"endOfFlowMessage7": {
|
||||
"message": "Nếu bạn có thắc mắc hoặc thấy điều gì đó đáng ngờ, hãy liên hệ với bộ phận hỗ trợ của chúng tôi $1.",
|
||||
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
|
||||
},
|
||||
"endOfFlowMessage8": {
|
||||
"message": "MetaMask không thể khôi phục Cụm mật khẩu khôi phục bí mật của bạn."
|
||||
@ -885,6 +896,16 @@
|
||||
"importAccountSeedPhrase": {
|
||||
"message": "Nhập một tài khoản 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"
|
||||
},
|
||||
"importTokenQuestion": {
|
||||
"message": "Bạn muốn nhập token?"
|
||||
},
|
||||
"importTokenWarning": {
|
||||
"message": "Bất kỳ ai cũng tạo được token bằng bất kỳ tên nào, kể cả phiên bản giả của token hiện có. Bạn tự chịu rủi ro khi thêm và giao dịch!"
|
||||
},
|
||||
"importWallet": {
|
||||
"message": "Nhập ví"
|
||||
},
|
||||
@ -1287,6 +1308,22 @@
|
||||
"message": "Từ giờ, \"Cụm mật khẩu gốc\" sẽ được gọi là \"Cụm mật khẩu khôi phục bí mật.\"",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
|
||||
},
|
||||
"notifications6DescriptionOne": {
|
||||
"message": "Kể từ phiên bản Chrome 91, API từng cho phép hỗ trợ Ledger (U2F) của chúng tôi không còn hỗ trợ ví cứng nữa. MetaMask đã triển khai một tính năng hỗ trợ Ledger Live mới cho phép bạn tiếp tục kết nối với thiết bị Ledger của mình thông qua ứng dụng Ledger Live trên máy tính.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionThree": {
|
||||
"message": "Khi tương tác với tài khoản Ledger của bạn trong MetaMask, một tab mới sẽ mở ra và bạn sẽ được yêu cầu mở ứng dụng Ledger Live. Khi ứng dụng này mở ra, bạn sẽ được yêu cầu cho phép kết nối WebSocket với tài khoản MetaMask của mình. Đơn giản vậy thôi!",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6DescriptionTwo": {
|
||||
"message": "Bạn có thể kích hoạt tính năng hỗ trợ Ledger Live bằng cách nhấp vào phần Cài đặt > Nâng cao > Sử dụng Ledger Live.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
|
||||
},
|
||||
"notifications6Title": {
|
||||
"message": "Thông tin cập nhật về việc hỗ trợ Ledger cho người dùng Chrome",
|
||||
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
|
||||
},
|
||||
"ofTextNofM": {
|
||||
"message": "trên"
|
||||
},
|
||||
@ -1414,6 +1451,30 @@
|
||||
"recipientAddressPlaceholder": {
|
||||
"message": "Tìm kiếm, địa chỉ công khai (0x) hoặc ENS"
|
||||
},
|
||||
"recoveryPhraseReminderBackupStart": {
|
||||
"message": "Bắt đầu tại đây"
|
||||
},
|
||||
"recoveryPhraseReminderConfirm": {
|
||||
"message": "Đã hiểu"
|
||||
},
|
||||
"recoveryPhraseReminderHasBackedUp": {
|
||||
"message": "Luôn lưu giữ Cụm mật khẩu khôi phục bí mật ở nơi an toàn và bí mật"
|
||||
},
|
||||
"recoveryPhraseReminderHasNotBackedUp": {
|
||||
"message": "Bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật?"
|
||||
},
|
||||
"recoveryPhraseReminderItemOne": {
|
||||
"message": "Tuyệt đối không cho ai biết Cụm mật khẩu khôi phục bí mật"
|
||||
},
|
||||
"recoveryPhraseReminderItemTwo": {
|
||||
"message": "Nhóm MetaMask sẽ không bao giờ hỏi Cụm mật khẩu khôi phục bí mật của bạn"
|
||||
},
|
||||
"recoveryPhraseReminderSubText": {
|
||||
"message": "Cụm mật khẩu khôi phục bí mật sẽ kiểm soát mọi thứ trong tài khoản của bạn."
|
||||
},
|
||||
"recoveryPhraseReminderTitle": {
|
||||
"message": "Bảo vệ tiền của bạn"
|
||||
},
|
||||
"reject": {
|
||||
"message": "Từ chối"
|
||||
},
|
||||
@ -1439,7 +1500,7 @@
|
||||
"message": "Xóa tài khoản"
|
||||
},
|
||||
"removeAccountDescription": {
|
||||
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Xin đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
|
||||
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Hãy đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
|
||||
},
|
||||
"requestsAwaitingAcknowledgement": {
|
||||
"message": "yêu cầu đang chờ xác nhận"
|
||||
@ -1473,10 +1534,10 @@
|
||||
"message": "Một token trong đây sử dụng lại ký hiệu của một token khác mà bạn thấy, điều này có thể gây nhầm lẫn hoặc mang tính lừa dối."
|
||||
},
|
||||
"revealSeedWords": {
|
||||
"message": "Hiện cụm mật khẩu khôi phục bí mật"
|
||||
"message": "Hiện Cụm mật khẩu khôi phục bí mật"
|
||||
},
|
||||
"revealSeedWordsDescription": {
|
||||
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần Cụm mật khẩu khôi phục bí mật này để truy cập tài khoản của mình. Hãy lưu cụm mật khẩu gốc này ở nơi an toàn và bí mật."
|
||||
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần Cụm mật khẩu khôi phục bí mật này để truy cập tài khoản của mình. Hãy lưu Cụm mật khẩu khôi phục bí mật này ở nơi an toàn và bí mật."
|
||||
},
|
||||
"revealSeedWordsTitle": {
|
||||
"message": "Cụm mật khẩu khôi phục bí mật"
|
||||
@ -1541,6 +1602,42 @@
|
||||
"securitySettingsDescription": {
|
||||
"message": "Các cài đặt quyền riêng tư và Cụm mật khẩu khôi phục bí mật của ví"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletFour": {
|
||||
"message": "Viết ra và cất ở nhiều nơi bí mật."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletOne": {
|
||||
"message": "Lưu trong một trình quản lý mật khẩu"
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletThree": {
|
||||
"message": "Lưu giữ trong hộp ký gửi an toàn."
|
||||
},
|
||||
"seedPhraseIntroSidebarBulletTwo": {
|
||||
"message": "Lưu giữ trong két an toàn."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyOne": {
|
||||
"message": "Cụm mật khẩu khôi phục bí mật là “chìa khóa chính” để truy cập ví và số tiền của bạn."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyThree": {
|
||||
"message": "Nếu ai đó hỏi bạn cụm mật khẩu khôi phục bí mật, thì họ đang cố gắng lừa đảo bạn."
|
||||
},
|
||||
"seedPhraseIntroSidebarCopyTwo": {
|
||||
"message": "Đừng bao giờ cho ai biết cụm mật khẩu khôi phục bí mật, kể cả MetaMask!"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleOne": {
|
||||
"message": "Cụm mật khẩu khôi phục là gì?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleThree": {
|
||||
"message": "Tôi có nên cho ai biết cụm mật khẩu khôi phục bí mật của mình không?"
|
||||
},
|
||||
"seedPhraseIntroSidebarTitleTwo": {
|
||||
"message": "Tôi lưu cụm mật khẩu khôi phục của mình bằng cách nào?"
|
||||
},
|
||||
"seedPhraseIntroTitle": {
|
||||
"message": "Bảo mật cho ví của bạn"
|
||||
},
|
||||
"seedPhraseIntroTitleCopy": {
|
||||
"message": "Trước khi bắt đầu, hãy xem video ngắn này để tìm hiểu thêm về cụm mật khẩu khôi phục bí mật của bạn và cách bảo vệ ví của bạn."
|
||||
},
|
||||
"seedPhrasePlaceholder": {
|
||||
"message": "Phân tách mỗi từ bằng một dấu cách"
|
||||
},
|
||||
@ -1841,7 +1938,7 @@
|
||||
"message": "Đang hoàn tất..."
|
||||
},
|
||||
"swapFromTo": {
|
||||
"message": "Hoán đổi $1 sang $2",
|
||||
"message": "Giao dịch hoán đổi $1 sang $2",
|
||||
"description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token"
|
||||
},
|
||||
"swapGasFeesSplit": {
|
||||
@ -2003,6 +2100,9 @@
|
||||
"message": "Hoán đổi $1 sang $2",
|
||||
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
|
||||
},
|
||||
"swapTokenVerificationAddedManually": {
|
||||
"message": "Token này đã được thêm theo cách thủ công."
|
||||
},
|
||||
"swapTokenVerificationMessage": {
|
||||
"message": "Luôn xác nhận địa chỉ token trên $1.",
|
||||
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
|
||||
@ -2270,7 +2370,7 @@
|
||||
"message": "URL phải có tiền tố HTTP/HTTPS phù hợp."
|
||||
},
|
||||
"urlExistsErrorMsg": {
|
||||
"message": "URL đã có trong danh sách mạng hiện tại"
|
||||
"message": "Mạng $1 hiện đang sử dụng URL này."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Sử dụng tính năng Phát hiện lừa đảo"
|
||||
@ -2292,6 +2392,10 @@
|
||||
"message": "Xác minh token này trên $1",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"verifyThisUnconfirmedTokenOn": {
|
||||
"message": "Hãy xác minh token này trên $1 và đảm bảo đây là token bạn muốn giao dịch.",
|
||||
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
|
||||
},
|
||||
"viewAccount": {
|
||||
"message": "Xem tài khoản"
|
||||
},
|
||||
@ -2325,6 +2429,10 @@
|
||||
"walletSeedRestore": {
|
||||
"message": "Cụm mật khẩu khôi phục bí mật của ví"
|
||||
},
|
||||
"web3ShimUsageNotification": {
|
||||
"message": "Chúng tôi nhận thấy rằng trang web hiện tại đã cố dùng API window.web3 đã bị xóa. Nếu trang web có vẻ như đã bị lỗi, vui lòng nhấp vào $1 để biết thêm thông tin.",
|
||||
"description": "$1 is a clickable link."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "Chào mừng bạn đến với MetaMask"
|
||||
},
|
||||
|
@ -217,9 +217,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "您的浏览器不支持该功能……"
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask在加利福尼亚设计和制造。"
|
||||
},
|
||||
"buy": {
|
||||
"message": "购买"
|
||||
},
|
||||
|
@ -149,9 +149,6 @@
|
||||
"browserNotSupported": {
|
||||
"message": "您的瀏覽器尚未支援..."
|
||||
},
|
||||
"builtInCalifornia": {
|
||||
"message": "MetaMask 是在加州設計製造"
|
||||
},
|
||||
"buy": {
|
||||
"message": "買"
|
||||
},
|
||||
|
@ -1,4 +0,0 @@
|
||||
<svg fill="#f7861c" height="24" viewBox="113.789 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M134.613 6.85h-3.499l-2.035-2.009-.006-.006-.004-.003a1.698 1.698 0 00-1.189-.482h-4.23c-.491 0-.93.209-1.238.539l-.003-.005-1.991 1.966h-3.571c-.935 0-1.691.747-1.691 1.667v10c0 .92.757 1.668 1.691 1.668h17.768a1.68 1.68 0 001.691-1.668v-10a1.682 1.682 0 00-1.693-1.667zm.846 11.668a.843.843 0 01-.846.834h-17.768a.841.841 0 01-.846-.834v-10c0-.459.38-.833.846-.833h3.922l.248-.245 1.024-1.011.021.062.971-1.035a.843.843 0 01.618-.271h4.23c.223 0 .435.086.602.247l2.033 2.008.247.245H134.613c.465 0 .846.374.846.833z"/>
|
||||
<path d="M125.729 9.351c-2.104 0-3.808 1.678-3.808 3.749 0 2.072 1.703 3.752 3.808 3.752 2.104 0 3.808-1.68 3.808-3.752s-1.704-3.749-3.808-3.749zm0 6.667c-1.633 0-2.962-1.31-2.962-2.918s1.329-2.916 2.962-2.916 2.961 1.307 2.961 2.916-1.328 2.918-2.961 2.918z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 920 B |
@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.6483 7.41741C14.3482 7.41741 15.8272 8.36346 16.5874 9.75779L18.8081 8.36985C17.5833 6.23784 15.2835 4.802 12.6483 4.802C9.11954 4.802 6.19214 7.37666 5.64216 10.7499H2.125C1.50368 10.7499 1 11.2536 1 11.8749C1 12.4962 1.50368 12.9999 2.125 12.9999H5.63386C6.16206 16.3987 9.1014 18.9999 12.6483 18.9999C15.2235 18.9999 17.4784 17.6287 18.7228 15.5766L16.5042 14.1901C15.7225 15.5041 14.2882 16.3845 12.6483 16.3845C10.1721 16.3845 8.16472 14.3772 8.16472 11.901C8.16472 9.42476 10.1721 7.41741 12.6483 7.41741ZM11.7002 11.9999C11.7002 12.5522 12.1479 12.9999 12.7002 12.9999C13.2525 12.9999 13.7002 12.5522 13.7002 11.9999C13.7002 11.4476 13.2525 10.9999 12.7002 10.9999C12.1479 10.9999 11.7002 11.4476 11.7002 11.9999ZM12.7002 14.9999C11.0433 14.9999 9.7002 13.6568 9.7002 11.9999C9.7002 10.3431 11.0433 8.99992 12.7002 8.99992C13.9109 8.99992 14.9542 9.71715 15.4282 10.7499H21.8751C22.4965 10.7499 23.0001 11.2536 23.0001 11.8749C23.0001 12.4962 22.4965 12.9999 21.8751 12.9999H15.5295C15.1177 14.1651 14.0064 14.9999 12.7002 14.9999Z" fill="white"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,5 +0,0 @@
|
||||
<svg fill="#f7861c" height="24" viewBox="189.192 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M204.655 7.169h-8.962a1.99 1.99 0 00-1.991 1.991v8.963c0 1.1.892 1.99 1.991 1.99h8.962a1.99 1.99 0 001.991-1.99V9.16c0-1.1-.89-1.991-1.991-1.991zm.996 10.954a.995.995 0 01-.996.994h-8.962a.995.995 0 01-.995-.994V9.16c0-.55.446-.996.995-.996h8.962c.55 0 .996.446.996.996z"/>
|
||||
<path d="M196.689 11.152h6.969v-.996h-6.969zM196.689 13.144h6.969v-.996h-6.969zM196.689 15.135h6.969v-.996h-6.969zM196.689 17.126h3.982v-.994h-3.982z"/>
|
||||
<path d="M207.643 4.182h-8.962a1.99 1.99 0 00-1.991 1.991h.995c0-.549.446-.996.996-.996h8.962c.549 0 .995.447.995.996v8.962c0 .55-.446.997-.995.997v.994a1.99 1.99 0 001.991-1.991V6.172a1.99 1.99 0 00-1.991-1.99z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 783 B |
@ -1,3 +0,0 @@
|
||||
<svg height="48.381" viewBox="0 0 15 45.357" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 0v7.5l10 15-10 15v7.857L15 22.5z" fill="#f7861c" fill-rule="evenodd"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 186 B |
@ -1,3 +0,0 @@
|
||||
<svg height="24" viewBox="51.64 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M67.495 2.012C65.976.858 64.266.461 62.096.461c-1.646 0-3.053.337-4.168 1.087-1.646 1.121-2.419 3.003-2.419 5.979h4.241c0-.794-.078-1.65.385-2.384.465-.734 1.11-1.297 2.22-1.297 1.126 0 1.707.325 2.254.999.464.574.641 1.258.641 1.987 0 .63-.321 1.209-.701 1.734a3.713 3.713 0 01-.834.85s-2.293 1.364-3.098 2.656c-.602.961-.817 2.166-.866 3.606-.006.105.031.32.396.32h3.412s.388-.243.393-.342c.021-.526.089-1.331.183-1.635.182-.575.534-1.076 1.087-1.507l1.144-.791c1.032-.807 1.854-1.463 2.22-1.982.623-.851 1.06-1.899 1.06-3.142-.002-2.024-.749-3.521-2.151-4.587zm-5.691 16.183c-1.431-.044-2.613.95-2.661 2.501-.046 1.557 1.075 2.578 2.512 2.623 1.489.044 2.645-.916 2.688-2.468.045-1.552-1.049-2.612-2.539-2.656z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 833 B |
@ -1,3 +0,0 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.2 5.6H8.8V4H7.2V5.6ZM8 14.4C4.472 14.4 1.6 11.528 1.6 8C1.6 4.472 4.472 1.6 8 1.6C11.528 1.6 14.4 4.472 14.4 8C14.4 11.528 11.528 14.4 8 14.4ZM8 0C6.94943 0 5.90914 0.206926 4.93853 0.608964C3.96793 1.011 3.08601 1.60028 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.08601 14.3997 3.96793 14.989 4.93853 15.391C5.90914 15.7931 6.94943 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8C16 6.94943 15.7931 5.90914 15.391 4.93853C14.989 3.96793 14.3997 3.08601 13.6569 2.34315C12.914 1.60028 12.0321 1.011 11.0615 0.608964C10.0909 0.206926 9.05058 0 8 0ZM7.2 12H8.8V7.2H7.2V12Z" fill="#037DD6"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 787 B |
@ -1,3 +0,0 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.4 8C14.4 9.69739 13.7257 11.3253 12.5255 12.5255C11.3253 13.7257 9.69739 14.4 8 14.4C6.30261 14.4 4.67475 13.7257 3.47452 12.5255C2.27428 11.3253 1.6 9.69739 1.6 8C1.6 6.30261 2.27428 4.67475 3.47452 3.47452C4.67475 2.27428 6.30261 1.6 8 1.6C8.608 1.6 9.2 1.688 9.76 1.848L11.016 0.592C10.088 0.208 9.072 0 8 0C6.94943 0 5.90914 0.206926 4.93853 0.608964C3.96793 1.011 3.08601 1.60028 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.08601 14.3997 3.96793 14.989 4.93853 15.391C5.90914 15.7931 6.94943 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8H14.4ZM4.728 6.464L3.6 7.6L7.2 11.2L15.2 3.2L14.072 2.064L7.2 8.936L4.728 6.464Z" fill="#28A745"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 842 B |
@ -1 +0,0 @@
|
||||
<svg fill="none" height="15" viewBox="0 0 20 15" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#6a737d"><rect height="3" rx="1.5" width="20"/><rect height="3" rx="1.5" width="20" y="6"/><rect height="3" rx="1.5" width="20" y="12"/></g></svg>
|
Before Width: | Height: | Size: 250 B |
@ -1 +0,0 @@
|
||||
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#6a737d"><path clip-rule="evenodd" d="m7.99984 2.00001c-3.31371 0-6 2.68629-6 5.99999s2.68629 6 6 6c3.31366 0 5.99996-2.6863 5.99996-6s-2.6863-5.99999-5.99996-5.99999zm-7.333336 5.99999c0-4.05008 3.283246-7.333328 7.333336-7.333328 4.05006 0 7.33336 3.283248 7.33336 7.333328 0 4.0501-3.2833 7.3333-7.33336 7.3333-4.05009 0-7.333336-3.2832-7.333336-7.3333z" fill-rule="evenodd"/><path clip-rule="evenodd" d="m7.99984 7.33334c.36819 0 .66666.29847.66666.66666v2.6667c0 .3682-.29847.6666-.66666.6666s-.66667-.2984-.66667-.6666v-2.6667c0-.36819.29848-.66666.66667-.66666z" fill-rule="evenodd"/><path d="m8.6665 5.33334c0 .36819-.29847.66666-.66666.66666s-.66667-.29847-.66667-.66666.29848-.66667.66667-.66667.66666.29848.66666.66667z"/></g></svg>
|
Before Width: | Height: | Size: 847 B |
@ -1,11 +0,0 @@
|
||||
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="a" fill="#fff">
|
||||
<path d="M0 82.118h126.527V0H0z" fill-rule="evenodd"/>
|
||||
</mask>
|
||||
<g fill="#1b243d" fill-rule="evenodd">
|
||||
<path d="M7.881 97.273a2.224 2.224 0 00-.67-.534 1.739 1.739 0 00-.808-.198H1v8.536h.958v-7.674h4.268c.2 0 .381.052.54.157s.294.237.404.397c.11.159.193.337.253.533s.088.386.088.568c0 .164-.022.337-.068.52-.045.182-.12.35-.226.506s-.234.283-.389.383-.343.15-.56.15H4.993v.862h1.437c.283 0 .55-.066.8-.198s.472-.31.664-.533c.191-.224.341-.48.451-.767s.164-.59.164-.91c0-.356-.057-.688-.17-.998s-.268-.577-.459-.8M17.43 102.116a3.52 3.52 0 01-.746 1.073 3.598 3.598 0 01-1.094.739c-.415.183-.855.274-1.32.274s-.905-.091-1.32-.274a3.499 3.499 0 01-1.088-.74 3.57 3.57 0 01-.739-1.072 3.125 3.125 0 01-.273-1.293c0-.447.091-.878.273-1.293s.429-.777.739-1.088a3.63 3.63 0 011.094-.745c.42-.187.862-.28 1.328-.28.464 0 .904.093 1.319.28s.778.436 1.088.745c.31.31.556.673.739 1.088.182.415.273.846.273 1.293 0 .456-.091.887-.273 1.293m-.089-4.351c-.388-.387-.846-.695-1.375-.923s-1.094-.342-1.696-.342-1.168.114-1.696.342c-.53.228-.988.536-1.375.923a4.384 4.384 0 00-.924 1.369 4.155 4.155 0 00-.342 1.675c0 .593.114 1.152.342 1.676a4.324 4.324 0 002.299 2.291c.528.229 1.094.342 1.696.342s1.167-.113 1.696-.342a4.346 4.346 0 001.375-.923c.387-.387.695-.843.923-1.368a4.156 4.156 0 00.342-1.676c0-.592-.114-1.151-.342-1.675a4.398 4.398 0 00-.923-1.37M27.225 97.273a2.249 2.249 0 00-.67-.534 1.739 1.739 0 00-.808-.198h-5.403v8.536h.957v-7.674h4.269c.2 0 .38.052.54.157.159.105.294.237.404.397.109.159.193.337.253.533.059.196.088.386.088.568 0 .164-.023.337-.068.52-.046.182-.121.35-.226.506s-.234.283-.39.383a1.01 1.01 0 01-.56.15h-1.314l2.285 4.46h1.026l-1.82-3.598c.283 0 .55-.066.8-.198s.47-.31.658-.533c.186-.224.334-.48.444-.767.109-.287.164-.59.164-.91 0-.356-.057-.688-.171-.998s-.267-.577-.458-.8M36.87 96.54h-7.457v.862h3.242v7.674h.958v-7.673h3.256zM36.308 105.077h6.115l-.589-.861h-4.02l2.967-6.075 3.448 6.936h1.067l-4.515-8.987zM47.786 96.54h-.958v8.536h6.499v-.86h-5.541zM67.047 104.27l-5.403-7.729h-1.6v8.536H61v-7.743l5.5 7.743h1.504v-8.536h-.958zM69.92 105.077h6.498v-.861h-5.54v-6.813h5.54v-.862H69.92z"/>
|
||||
<path d="M71.218 78.479h4.091v-.861h-4.091zM77.292 74.403h3.242v7.674h.958v-7.674h3.256v-.862h-7.456zM95.828 81.366L91.67 73.09l-4.09 8.208V73.54h-.958v8.536h1.642L91.67 75.1l3.448 6.977h1.67V73.54h-.959zM106.02 79.116a3.585 3.585 0 01-1.84 1.812c-.415.183-.855.274-1.32.274s-.905-.091-1.32-.274a3.499 3.499 0 01-1.088-.74 3.57 3.57 0 01-.739-1.072 3.125 3.125 0 01-.273-1.293c0-.447.091-.878.273-1.293s.43-.777.74-1.088a3.63 3.63 0 011.093-.745c.42-.187.863-.28 1.328-.28s.905.093 1.32.28a3.66 3.66 0 011.087.745c.31.31.556.673.74 1.088.181.415.272.846.272 1.293 0 .456-.09.887-.273 1.293m-.089-4.351c-.388-.387-.846-.695-1.375-.923s-1.094-.342-1.696-.342-1.168.114-1.696.342c-.53.228-.988.536-1.375.923a4.384 4.384 0 00-.924 1.369 4.155 4.155 0 00-.342 1.675c0 .593.114 1.152.342 1.676a4.324 4.324 0 002.299 2.291c.528.229 1.094.342 1.696.342s1.167-.113 1.696-.342a4.346 4.346 0 001.375-.923c.388-.387.695-.843.923-1.368a4.156 4.156 0 00.342-1.676c0-.592-.114-1.151-.342-1.675a4.381 4.381 0 00-.923-1.37M115.815 74.273a2.236 2.236 0 00-.67-.534 1.739 1.739 0 00-.808-.198h-5.403v8.536h.957v-7.674h4.27c.2 0 .38.052.54.157.158.105.293.237.403.397.11.159.193.337.253.533s.088.386.088.568c0 .164-.023.337-.068.52-.046.182-.12.35-.226.506s-.234.283-.39.383a1.01 1.01 0 01-.56.15h-1.314l2.285 4.46h1.026l-1.82-3.598c.283 0 .55-.066.801-.198.25-.132.47-.31.657-.533.186-.224.334-.48.444-.767.11-.287.164-.59.164-.91 0-.356-.057-.688-.17-.998s-.268-.577-.459-.8M126.527 73.54h-1.04l-2.12 4.31 2.12 4.227h1.04l-2.093-4.227zM119.208 73.54h-.958v8.536h.958v-3.802h2.9v-.863h-2.9zM72.463 48.06c-5.114 0-10.873-1.958-16.216-5.515-.481-.32-1.004-.311-1.168.019-.165.33.09.857.572 1.177 5.797 3.859 12.046 5.984 17.594 5.984 4.597 0 8.294-1.444 10.69-4.177 2.35-2.678 3.253-6.346 2.61-10.606-.065-.438-.527-.906-1.031-1.046-.503-.14-.858.102-.792.54.592 3.926-.24 7.307-2.406 9.775-2.208 2.519-5.616 3.849-9.853 3.849M84.508 28.475c-.216-.46-.764-.833-1.223-.833-.46 0-.657.373-.442.833.402.854.751 1.714 1.037 2.556.154.456.672.873 1.156.932a.868.868 0 00.112.008c.411 0 .626-.306.483-.725a26.647 26.647 0 00-1.123-2.771M71.577 13.692c-6-4.171-12.501-6.468-18.307-6.468-4.643 0-8.363 1.47-10.757 4.254-2.316 2.69-3.205 6.52-2.503 10.78.072.44.538.906 1.04 1.04.093.024.18.036.26.036.358 0 .579-.23.52-.59-.646-3.926.174-7.455 2.308-9.936 2.206-2.564 5.634-3.92 9.915-3.92 5.35 0 11.343 2.117 16.873 5.962.475.33 1.005.339 1.185.019s-.06-.847-.534-1.177M42.636 25.918c-.156-.456-.673-.874-1.157-.933s-.75.262-.594.718c.309.913.687 1.845 1.123 2.771.214.46.762.832 1.222.832s.658-.372.442-.832a24.811 24.811 0 01-1.036-2.556M48.954 5.599a.766.766 0 00.12-.01 21.005 21.005 0 013.31-.251c.46 0 .656-.373.441-.833-.216-.46-.764-.832-1.224-.832-1.23 0-2.423.09-3.546.27-.423.068-.538.49-.257.946.256.413.751.71 1.156.71" mask="url(#a)" transform="translate(1 23)"/>
|
||||
<path d="M38.456 28.475c3.134 6.669 8.685 12.927 15.63 17.62.238.162.487.242.699.242.214 0 .389-.082.475-.247.17-.326-.08-.854-.56-1.177-6.477-4.38-11.655-10.216-14.58-16.438-2.42-5.15-3.055-10.024-1.836-14.095 1.18-3.944 4.108-6.851 8.243-8.186.385-.124.427-.583.095-1.026-.333-.443-.913-.7-1.297-.577-4.434 1.432-7.573 4.548-8.838 8.774-1.306 4.365-.625 9.589 1.969 15.11M77.442 51.359a21.003 21.003 0 01-3.311.253c-.46 0-.657.372-.44.832.215.459.763.832 1.223.832 1.23 0 2.423-.091 3.547-.271.422-.067.537-.49.256-.945-.281-.454-.852-.768-1.275-.701M88.059 28.474c-3.134-6.668-8.684-12.926-15.627-17.619-.478-.324-1.004-.32-1.174.005-.17.327.08.854.558 1.177 6.478 4.38 11.655 10.216 14.579 16.437 2.369 5.04 3.028 9.831 1.906 13.854-1.084 3.89-3.854 6.821-7.8 8.25-.375.137-.401.603-.06 1.042.28.357.716.586 1.072.586a.663.663 0 00.229-.037c4.229-1.534 7.198-4.674 8.36-8.844 1.203-4.313.497-9.448-2.043-14.85" mask="url(#a)" transform="translate(1 23)"/>
|
||||
<path d="M36.572 28.475c-.216-.46-.764-.833-1.224-.833-.46 0-.657.373-.441.833 2.796 5.948 7.293 11.64 13.007 16.465.269.227.582.348.842.348.167 0 .313-.05.41-.154.248-.268.09-.787-.352-1.161-5.378-4.54-9.611-9.9-12.242-15.498M56.817 49.565a52.978 52.978 0 01-4.954-3.201c-.469-.341-1.007-.367-1.204-.06-.196.309.025.835.493 1.176a56.127 56.127 0 005.262 3.399c.207.119.414.176.592.176.248 0 .442-.111.507-.322.111-.363-.2-.886-.696-1.168M75.8 55.16c-4.868 0-10.25-1.321-15.57-3.823-.506-.238-.958-.112-1.01.282-.053.394.314.905.82 1.143 5.651 2.659 11.371 4.063 16.542 4.063.46 0 .656-.372.441-.832-.217-.46-.764-.832-1.224-.832M71.843 8.673a53.081 53.081 0 0110.553 8.787c3.203 3.468 5.743 7.174 7.548 11.014.216.46.763.832 1.223.832s.657-.372.441-.832c-1.917-4.079-4.615-8.016-8.02-11.702a56.342 56.342 0 00-11.209-9.334c-.486-.308-1-.282-1.148.06-.148.341.126.867.612 1.175M64.115 4.657a48.191 48.191 0 014.428 2.09 1.2 1.2 0 00.555.154c.26 0 .46-.12.516-.348.09-.375-.24-.894-.74-1.162a51.183 51.183 0 00-4.704-2.219c-.507-.207-.931-.044-.947.366-.015.411.385.911.892 1.12M50.716 1.788c2.948 0 6.07.478 9.276 1.419.103.03.2.045.29.045.346 0 .567-.218.522-.565-.057-.435-.51-.907-1.016-1.056-3.408-1-6.723-1.508-9.855-1.508-.459 0-.657.373-.44.833.215.459.763.832 1.223.832M36.791 1.572c.31-.21.234-.712-.168-1.12-.402-.409-.979-.57-1.29-.359-3.009 2.043-5.134 4.845-6.315 8.327-.12.358.181.881.674 1.171.213.124.426.185.61.185.242 0 .433-.106.502-.309 1.12-3.3 3.134-5.957 5.987-7.895M29.356 10.908c-.503-.25-.967-.14-1.036.246a21.216 21.216 0 00-.287 2.495c-.022.407.37.91.878 1.124.154.065.3.096.43.096.3 0 .514-.162.53-.445.045-.805.136-1.6.272-2.365.068-.386-.284-.9-.787-1.15M96.823 47.358c-.493-.29-.991-.233-1.112.124-1.12 3.3-3.135 5.957-5.988 7.895-.309.21-.234.712.168 1.12.283.288.651.453.953.453.128 0 .245-.03.337-.093 3.01-2.045 5.135-4.847 6.316-8.328.12-.358-.181-.882-.674-1.171M97.608 41.939c-.507-.211-.934-.05-.952.358-.04.884-.135 1.756-.284 2.592-.068.386.284.902.787 1.152.182.089.36.133.515.133.272 0 .477-.133.52-.38.157-.881.258-1.801.3-2.735.018-.408-.378-.91-.886-1.12M70.794 44.51c-8.842 0-19.416-7.194-23.571-16.036-4.156-8.84-.343-16.035 8.499-16.035s19.416 7.194 23.57 16.035c4.156 8.842.344 16.035-8.498 16.035M54.94 10.775c-9.76 0-13.968 7.94-9.382 17.7 4.587 9.76 16.258 17.7 26.018 17.7s13.968-7.94 9.382-17.7c-4.587-9.76-16.26-17.7-26.018-17.7M36.994 5.788c-.446-.37-1.004-.45-1.247-.178-1.528 1.714-2.616 3.766-3.233 6.1-.098.37.227.89.725 1.163.199.109.397.162.567.162.256 0 .454-.118.512-.34.582-2.198 1.606-4.13 3.045-5.743.242-.273.077-.793-.37-1.164M90.57 51.558c1.633-1.757 2.788-3.883 3.432-6.318.098-.37-.226-.892-.725-1.164s-.982-.193-1.08.178c-.606 2.293-1.694 4.295-3.231 5.95-.25.266-.091.787.352 1.16.269.227.582.348.842.348.167 0 .312-.05.41-.154" mask="url(#a)" transform="translate(1 23)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 8.7 KiB |
BIN
app/images/logo.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
@ -1,3 +0,0 @@
|
||||
<svg fill="none" height="24" width="20" xmlns="http://www.w3.org/2000/svg">
|
||||
<path clip-rule="evenodd" d="M0 9.715V3.572l10-2.7 10 2.7v6.143c0 6.33-4.2 11.69-10 13.52-5.8-1.83-10-7.19-10-13.52zm15.388 1.013l.235.17-.541.639.824 2.563-.763 2.616-2.67-.738-.517.426-1.055.733H9.098l-1.054-.733-.518-.426-2.67.738L4.1 14.1l.819-2.563-.542-.639.236-.17-.377-.346.287-.227-.376-.288.254-.19-.4-1.93.593-1.792 3.818 1.433h3.178l3.818-1.433L16 7.748l-.396 1.93.25.189-.377.288.287.227zm-8.003 2.437l1.086-.5.452.958zm3.384.458l.45-.959 1.088.501zM9.242 14.9h1.2l.209.166.117 1.112-.108-.11H9.027l-.104.11.112-1.112z" fill="#fff" fill-rule="evenodd"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 654 B |
@ -1,3 +0,0 @@
|
||||
<svg viewBox="0 0 252 251.7" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M211.3 103.9h-60.7c-2 0-3.6-1.6-3.6-3.6V3.6c0-3.5-4.5-5-6.6-2.2l-102.7 140c-1.8 2.4 0 5.8 2.9 5.8h60.7c2 0 3.6 1.6 3.6 3.6v96.6c0 3.5 4.5 5 6.6 2.2l102.7-140c1.8-2.3.1-5.7-2.9-5.7z" fill="#757575"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 284 B |
Before Width: | Height: | Size: 5.9 KiB |
@ -1,6 +0,0 @@
|
||||
<svg height="28" width="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path d="M27 14c0 7.18-5.82 13-13 13S1 21.18 1 14 6.82 1 14 1s13 5.82 13 13z" stroke="#4a4a4a"/>
|
||||
<path d="M7 18s1.787-6.164 7.762-6.164V9L20 13.373 14.762 18v-2.836S10.54 14.463 7 18" fill="#4a4a4a"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 337 B |
@ -1,18 +0,0 @@
|
||||
<svg viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M33 36v-1a6 6 0 00-6-6H9a6 6 0 00-6 6v1z" fill="#66757f"/>
|
||||
<path d="M12 27.482C13.672 29.057 15.746 30 18 30s4.327-.944 6-2.518V26H12z" fill="#ef9645"/>
|
||||
<path d="M26.75 20.435c1.188.208 2.619.129 2.416.917-.479 1.854-2.604 1.167-2.979 1.188-.375.02.563-2.105.563-2.105z" fill="#66757f"/>
|
||||
<path d="M27.062 20.645c1.875.25 2.541.416 1.166.958-.772.305-2.243 4.803-3.331 4.118-1.087-.685 2.165-5.076 2.165-5.076z" fill="#292f33"/>
|
||||
<path d="M9.255 20.435c-1.188.208-2.619.129-2.416.917.479 1.854 2.604 1.167 2.979 1.188.375.02-.563-2.105-.563-2.105z" fill="#66757f"/>
|
||||
<path d="M8.943 20.645c-1.875.25-2.541.416-1.166.958.772.305 2.243 4.803 3.331 4.118s-2.165-5.076-2.165-5.076z" fill="#292f33"/>
|
||||
<path d="M8.055 11.031c-1.953 0-2.305 3.164-.664 3.594 0 0-1.367 3.32 1.953 3.32-.547-1.68-1.562-4.414-.781-6.406m19.38-.508c1.953 0 2.305 3.164.664 3.594 0 0 1.367 3.32-1.953 3.32.547-1.68 1.562-4.414.781-6.406" fill="#ffac33"/>
|
||||
<ellipse cx="18" cy="15.5" fill="#ffdc5d" rx="10" ry="12.5"/>
|
||||
<path d="M14 17a1 1 0 01-1-1v-1a1 1 0 012 0v1a1 1 0 01-1 1zm8 0a1 1 0 01-1-1v-1a1 1 0 112 0v1a1 1 0 01-1 1z" fill="#662113"/>
|
||||
<path d="M19 20.5a.5.5 0 01-.5.5h-1a.5.5 0 010-1h1a.5.5 0 01.5.5z" fill="#c1694f"/>
|
||||
<path clip-rule="evenodd" d="M7.657 14.788c.148.147.888.591 1.036 1.034s.445 2.954 1.333 3.693c.916.762 4.37.478 5.032.149 1.48-.738 1.662-2.798 1.924-3.842.148-.591 1.036-.591 1.036-.591s.888 0 1.036.591c.262 1.044.444 3.104 1.924 3.841.662.33 4.116.614 5.034-.147.887-.739 1.183-3.25 1.331-3.694.146-.443.888-.886 1.035-1.034.148-.148.148-.739 0-.887-.296-.295-3.788-.559-7.548-.148-.75.082-1.035.295-2.812.295-1.776 0-2.062-.214-2.812-.295-3.759-.411-7.252-.148-7.548.148-.149.148-.149.74-.001.887z" fill="#292f33" fill-rule="evenodd"/>
|
||||
<path d="M7.858 8.395S9.217-.506 13.79.023c3.512.406 4.89.825 7.833.097 1.947-.482 4.065 1.136 5.342 4.379a27.72 27.72 0 011.224 4.041s3.938-.385 4.165 1.732c.228 2.117-4.354 4.716-15.889 4.716C10 14.987 3.33 12.63 3.013 10.657s4.845-2.262 4.845-2.262z" fill="#66757f"/>
|
||||
<path d="M8.125 7.15s-.27 1.104-.406 1.871c-.136.768.226 1.296 2.705 1.824 3.287.7 10.679.692 15.058-.383 1.759-.432 2.886-.72 2.751-1.583-.167-1.068-.196-1.066-.541-2.208 0 0-1.477.502-3.427.96-2.66.624-9.964.911-13.481.144-1.874-.41-2.659-.625-2.659-.625zm-.136 13.953c-.354.145 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.852 2.894-.771 3.418s2.047 1.916 2.208 2.56c.161.645-1.229 5.961-1.229 5.961l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.241-1.008 0-1 0-1z" fill="#292f33"/>
|
||||
<path d="M6.989 21.144c-.354.146 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.664 2.894-.583 3.418s1.859 1.916 2.021 2.561c.16.644-1.231 5.96-1.231 5.96l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.24-1.008.001-1 .001-1z" fill="#66757f"/>
|
||||
<path d="M28.052 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.976 2.892 2.896 3.416-.081.524-4.172 1.918-4.333 2.562-.161.645 1.229 5.961 1.229 5.961l8.729-.252c2.565-8.844 2.883-8.501 4.104-13.604.241-1.008 0-1 0-1z" fill="#292f33"/>
|
||||
<path d="M28.958 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.977 2.892 2.896 3.416s-4.172 1.918-4.333 2.562c-.161.645 1.229 5.961 1.229 5.961l8.657.01c2.565-8.844 2.955-8.763 4.177-13.866.24-1.008-.001-1-.001-1z" fill="#66757f"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 118 KiB |
@ -1,5 +0,0 @@
|
||||
<svg fill="#f7861c" height="24" viewBox="78.469 0 29.477 24" width="29.477" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M90.437 9.087c0 1.669 1.423 4.766 3.177 4.766 1.755 0 3.177-3.097 3.177-4.766 0-1.668-1.422-3.021-3.177-3.021s-3.177 1.352-3.177 3.021z"/>
|
||||
<path d="M93.613 17.091h4.042c1.108 0 1.503-.249 1.503-.84 0-1.21-1.158-2.147-2.867-2.62-.713.861-1.619 1.467-2.678 1.467-1.057 0-1.964-.605-2.676-1.467-1.709.473-2.867 1.41-2.867 2.62 0 .591.395.84 1.502.84zM86.392 4.841a10.252 10.252 0 017.268-3.006c1.47 0 2.892.304 4.225.902.166.075.36.039.488-.09l.558-.556a.438.438 0 00-.121-.705A12.001 12.001 0 0093.66.22c-1.545 0-3.052.292-4.478.869a11.794 11.794 0 00-3.933 2.609 11.798 11.798 0 00-3.325 6.495 12.001 12.001 0 00.17 4.684l-.732-.497a.438.438 0 00-.608.117l-.45.664a.44.44 0 00.117.609l2.638 1.787.259.177a.437.437 0 00.345.063.437.437 0 00.264-.18l1.965-2.897a.44.44 0 00-.118-.608l-.665-.45a.436.436 0 00-.607.116l-.741 1.093a10.333 10.333 0 01-.22-4.541 10.19 10.19 0 012.851-5.489z"/>
|
||||
<path d="M106.979 8.028a.44.44 0 00-.226-.248l-2.443-1.142-.727-.34a.44.44 0 00-.583.211l-1.482 3.17a.438.438 0 00.212.582l.728.34a.442.442 0 00.335.015.439.439 0 00.247-.226l.509-1.087c.43 1.52.505 3.12.213 4.694a10.211 10.211 0 01-2.832 5.382 10.257 10.257 0 01-7.268 3.005c-1.393 0-2.743-.273-4.018-.812a.44.44 0 00-.48.095l-.561.561a.438.438 0 00.129.709A12.015 12.015 0 0093.661 24a11.862 11.862 0 008.412-3.478 11.803 11.803 0 003.304-6.378 11.895 11.895 0 00-.273-5.281l.939.439a.438.438 0 00.583-.211l.34-.727a.43.43 0 00.013-.336z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
112
app/images/transak.svg
Normal file
@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 2066.8 800" style="enable-background:new 0 0 2066.8 800;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:url(#SVGID_1_);}
|
||||
.st1{fill:#2970E2;}
|
||||
.st2{fill:#D1D9E6;}
|
||||
.st3{fill:#FFFFFF;}
|
||||
.st4{fill:url(#SVGID_2_);}
|
||||
</style>
|
||||
<g id="transparent_1_">
|
||||
<g id="logo_4_">
|
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="119.932" y1="155.9459" x2="624.022" y2="547.843" gradientTransform="matrix(1 0 0 1 0 50)">
|
||||
<stop offset="0.1304" style="stop-color:#3495F7"/>
|
||||
<stop offset="0.3063" style="stop-color:#2B87F2"/>
|
||||
<stop offset="0.6392" style="stop-color:#1461E5"/>
|
||||
<stop offset="0.7232" style="stop-color:#0E57E1"/>
|
||||
</linearGradient>
|
||||
<path class="st0" d="M566.4,640.4H175.3c-22,0-39.8-17.8-39.8-39.8V201.5c0-22,17.8-39.8,39.8-39.8h391.2
|
||||
c22,0,39.8,17.8,39.8,39.8v399.1C606.3,622.5,588.5,640.4,566.4,640.4z"/>
|
||||
<path class="st1" d="M606.3,451.6v148.9c0,22-17.8,39.8-39.8,39.8H417.6L606.3,451.6z"/>
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st2" d="M293.4,449.7l138.9-144.4c10.6-10.6,27.2-9.8,38.3,1.2l80.3,77.4c8.5,8.2,8.3,24.4,0.4,33.1
|
||||
c-10.3,10.3-21.9,11-37.5,0.4l-58.2-63L309.3,493.5c-9.8,7.6-19.8,14-35.2,4.1c-5.3-7.1,5.2-21,1.1-25.1L293.4,449.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M287.1,498.2c-11.9-0.4-21.2-8.1-21.2-17.3l0.7-165.1c0-9.1,8.5-20.2,20.4-20.6
|
||||
c15.8,0,22.7,12.8,22.7,22.3v163.8C309.8,490.8,299.5,498.5,287.1,498.2z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st2" d="M449.1,502.7c-14.7,0-20.9-10.9-20.9-19.5V331.8c0-8.5,9.1-18.9,20.9-19.3c12.3-0.4,22.5,10,22.5,18.9
|
||||
v149.7C471.6,491.7,464.3,502.7,449.1,502.7z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st3" d="M282.1,500c-9.1-0.4-16.2-8.1-16.2-17.3V317.6c0-9.1,7.1-20.2,16.2-20.6c9.5-0.4,17.5,10.6,17.5,20.2v166
|
||||
C299.6,492.7,291.7,500.4,282.1,500z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M444.5,501.7c-9.3,0-16.9-10.8-16.9-20.2V318.9c0-9.3,7.6-16.9,16.9-16.9c9.3,0,16.9,7.6,16.9,16.9v162.7
|
||||
C461.3,490.8,453.8,501.7,444.5,501.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path class="st3" d="M282.8,498.4c-5.5,0-11-2.1-15.1-6.3l-76.5-76.7c-8.3-8.4-8.3-21.9,0.1-30.3c8.4-8.3,21.9-8.3,30.3,0.1
|
||||
l61.6,62l147.4-140.3c8.3-7.9,21.3-7.9,29.6,0.1l80.2,77.4c8.5,8.2,8.7,21.7,0.6,30.3c-8.1,8.5-21.7,8.7-30.3,0.6l-65.5-63.1
|
||||
L297.5,492.5C293.4,496.4,288.1,498.4,282.8,498.4z"/>
|
||||
</g>
|
||||
</g>
|
||||
<path class="st3" d="M429.7,378.8l-9.3,8.8c0,0,2.6-14.7-4.9-7.6c-7.6,7.2,11.6-18.2,11.6-18.2l3.9,4.9L429.7,378.8z"/>
|
||||
<path class="st3" d="M461.3,376.6c0,0,0.5-9,10.3,6.4v-12.1l-10.6-5.5L461.3,376.6z"/>
|
||||
<path class="st3" d="M299.7,419.2c0,0,1.4,10,10.2-2.9v12.1l-10.6,5.5L299.7,419.2z"/>
|
||||
</g>
|
||||
</g>
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="712.4824" y1="419.8029" x2="1947.4551" y2="419.8029">
|
||||
<stop offset="0" style="stop-color:#3495F7"/>
|
||||
<stop offset="0.4939" style="stop-color:#1461E5"/>
|
||||
<stop offset="1" style="stop-color:#0E57E1"/>
|
||||
</linearGradient>
|
||||
<path class="st4" d="M809.3,337.3l2.1,0.7c0.3,5.7,0.5,16.4,0.5,32.1c0,1-1.5,1.4-4.5,1.4h-20.7c-1.9,0-2.9,1.5-2.9,4.5v122.8
|
||||
c0,0.2-0.4,0.5-1.2,1.1c-0.8,0.6-1.3,0.8-1.7,0.8h-37.4l-1.7-1.4c-0.5-0.5-0.7-37.8-0.7-111.9v-14.8c-19.2,0-28.8-1.2-28.8-3.6
|
||||
v-30.5c0-0.2,0.6-0.6,1.9-1.4h42.8c2.2,0.3,3.6,0.6,4,0.7c0.5,0,0.7-0.2,0.7-0.7H809.3z M868.1,336.9h65.9
|
||||
c15.1,0,28.4,5.5,39.9,16.5c11.5,11,17.3,24.2,17.3,39.4c0,11.9-3.4,22.2-10.1,30.9c-6.7,8.7-15.8,15.5-27.3,20.2
|
||||
c-0.5,0-0.7,0.4-0.7,1.2v0.2c0.2,0.2,0.2,0.3,0.2,0.5l40.7,49.7c0.5,0.8,1,1.7,1.4,2.6s0.8,1.6,1.1,2c0.2,0.4,0.4,0.7,0.4,0.8
|
||||
c0,0.5-2.6,0.9-7.9,1.3c-5.2,0.4-8.7,0.6-10.5,0.6c-1.3,0-2.1-0.2-2.6-0.7h-25.5c-1.6-0.2-2.9-1-4-2.6l-33.1-39
|
||||
c-0.2-0.2-0.5-0.6-1-1.2c-0.5-0.6-1-1.1-1.4-1.4c-0.5-0.3-1-0.5-1.4-0.5c-0.3,0-0.7,1-1.2,3.1v38.6c0,1.3-0.5,1.9-1.4,1.9h-32.4
|
||||
c-2.9,0-4.8-0.6-5.7-1.9c-1-1.3-1.6-3.4-1.9-6.4c0-14.1,0.1-32,0.4-53.7c0.2-21.7,0.4-38,0.4-48.9c0-1.7-0.1-8.1-0.2-19l-0.5-16.4
|
||||
C867.4,343.1,867.8,337.2,868.1,336.9z M948.3,392.3c0-4.4-1-8.3-3.1-11.7c-4-6.2-12.2-9.3-24.8-9.3c-2.2,0-5.6,0.2-10,0.5
|
||||
l-2.1,2.4c0,2.1-0.1,5.3-0.2,9.6c-0.2,4.4-0.3,8.1-0.4,11.1c-0.1,3-0.1,5.2-0.1,6.4c0,10.6,1,16.6,2.9,17.9h2.6
|
||||
c13.2-0.3,22.3-2.1,27.5-5.5C945.8,410.4,948.3,403.3,948.3,392.3z M1102.8,335h28.3c0.8,0,3.1,4.4,6.8,13.1
|
||||
c3.7,8.7,5.6,13.6,5.6,14.5c3.3,8.7,21.3,53.1,54,133c0,2.2-1,3.6-2.9,4.2c-1.9,0.6-5.4,0.8-10.5,0.8l-12.1-0.2
|
||||
c-8.1-0.2-14.2-0.2-18.3-0.2c-0.3-1-1-2.6-1.9-5c-1-2.4-1.7-4.2-2.3-5.5c-0.6-1.3-1.4-2.9-2.5-4.8c-1.1-1.9-2.3-3.6-3.6-5.2
|
||||
c-1.1,0-3.3-0.2-6.7-0.6c-3.3-0.4-6.3-0.6-9-0.6l-29.8,0.5c-0.5,0-1.9-0.1-4.3-0.2c-2.4-0.2-3.7-0.2-3.8-0.2
|
||||
c-2.9,0-5.3,3.7-7.4,11.2c-2.1,7.5-3.8,11.7-5.2,12.6c-4.3,0.2-9.6,0-15.8-0.4c-6.3-0.4-11.5-0.6-15.8-0.6c-6.7,0-10-1-10-2.9
|
||||
c0-0.3,0-0.7,0.1-1.2c0.1-0.5,0.1-0.8,0.1-1l13.8-40c2.1-4.1,4.6-10.3,7.5-18.6c2.9-8.2,4.8-13.3,5.6-15.2
|
||||
c3.2-8.2,8.6-22,16.3-41.2c7.7-19.2,13.5-34,17.5-44.5C1096.8,335.6,1098.8,335,1102.8,335z M1105.2,446.1h6.2
|
||||
c11.4-0.3,17.1-1,17.1-1.9c0-2.9-2.5-10.1-7.4-21.7c-1.9-4.6-3-7.1-3.3-7.6l-3.1-7.4c-0.8,0-3.5,5.5-8,16.4
|
||||
c-4.5,10.9-6.8,17.4-6.8,19.3C1099.9,445.1,1101.7,446.1,1105.2,446.1z M1388.2,426.3c0,0.3-0.1,1-0.2,2.1
|
||||
c-0.2,1.1-0.3,2.2-0.5,3.3l-0.2,1.4c0,6.8,0.2,17.1,0.5,30.7c0.3,13.6,0.5,23.8,0.5,30.5c0,4.6-1,6.9-2.9,6.9h-30.9
|
||||
c-2.5,0-4.4-0.9-5.5-2.6l-29.3-43.8c-0.2-0.6-0.9-1.7-2.1-3.1c-1.3-1.4-1.9-2.2-1.9-2.4l-24-34.7l-2.9-3.1l-0.5,1
|
||||
c0,58.9-0.7,88.3-2.1,88.3h-37.6l-1.4-0.7c0-12.2,0.2-33.2,0.5-63c0.3-29.8,0.5-51.8,0.5-66.3c0-10.9-0.2-19.2-0.5-24.8l1-6.9
|
||||
l4.8-1l30,1c0.8,0,1.7,0.8,2.9,2.4c1.1,1.6,1.8,2.9,2.1,3.8l22.4,32.4c0.3,0.6,0.9,1.5,1.8,2.7c0.9,1.2,1.5,2.1,1.8,2.7l30.7,42.1
|
||||
c0.5,1.1,1.1,1.7,1.9,1.7c0.5,0,0.7-0.2,0.7-0.7v-85.9l1.4-1.2c0.2-0.2,3.6-0.2,10.2-0.2c18.7,0,28.1,0.3,28.1,1l1,1.4V426.3z
|
||||
M1513.3,448.5c-2.4-2.4-5.4-4.8-9.2-7.3c-3.7-2.5-8-5.1-12.9-7.9c-4.8-2.8-7.8-4.6-8.9-5.4c-20.5-13-30.7-28.7-30.7-47.1
|
||||
c0-15.4,5.4-26.9,16.2-34.5c10.8-7.6,24.8-11.4,41.9-11.4c9.4,0,18.8,1.9,28.3,5.7c1.7,0.6,4.6,1.9,8.4,3.8c3.9,1.9,5.8,3.3,5.8,4
|
||||
l-0.2,1.2c0,0.2-0.2,0.4-0.5,0.8c-0.3,0.4-0.5,0.8-0.5,1.1c-4.9,10.2-9.7,18.4-14.3,24.8c-0.2,0.5-0.6,0.7-1.2,0.7
|
||||
c-0.6,0-4.3-1.3-10.9-3.9c-6.7-2.6-11.8-3.9-15.5-3.9c-3.5,0-6.7,1-9.8,2.9c-3,1.9-4.5,4.5-4.5,7.9c0,4.3,2.4,8.3,7.1,12.1
|
||||
c3.2,2.4,9.5,6.6,19,12.6c2.1,1.4,4.8,3.3,8.1,5.6c3.3,2.3,5.9,4.1,7.9,5.5c1.9,1.3,4,3,6.4,5c2.4,2,4.4,3.9,5.9,5.8
|
||||
c3.8,4.9,6.4,9.4,7.7,13.3c1.3,4,2,8.8,2,14.5c0,14.9-5.6,27.2-16.9,36.8c-11.3,9.6-24.7,14.4-40.2,14.4c-17,0-32.9-4.1-47.8-12.4
|
||||
c-6.7-4.1-10-6.6-10-7.4v-1c7-12.7,12.8-22.5,17.4-29.5c2.2,0,4.8,1.1,7.7,3.3c2.9,2.2,4.6,3.4,5.1,3.6c8.4,4.3,18,6.4,28.8,6.4
|
||||
c9.4,0,14-3.5,14-10.5C1517.4,455.2,1516,452,1513.3,448.5z M1671.1,335h28.3c0.8,0,3.1,4.4,6.8,13.1c3.7,8.7,5.6,13.6,5.6,14.5
|
||||
c3.3,8.7,21.3,53.1,54,133c0,2.2-1,3.6-2.9,4.2c-1.9,0.6-5.4,0.8-10.5,0.8l-12.1-0.2c-8.1-0.2-14.2-0.2-18.3-0.2
|
||||
c-0.3-1-1-2.6-1.9-5c-1-2.4-1.7-4.2-2.3-5.5c-0.6-1.3-1.4-2.9-2.5-4.8c-1.1-1.9-2.3-3.6-3.6-5.2c-1.1,0-3.3-0.2-6.7-0.6
|
||||
c-3.3-0.4-6.3-0.6-9-0.6l-29.8,0.5c-0.5,0-1.9-0.1-4.3-0.2c-2.4-0.2-3.7-0.2-3.8-0.2c-2.9,0-5.3,3.7-7.4,11.2
|
||||
c-2.1,7.5-3.8,11.7-5.2,12.6c-4.3,0.2-9.6,0-15.8-0.4c-6.3-0.4-11.5-0.6-15.8-0.6c-6.7,0-10-1-10-2.9c0-0.3,0-0.7,0.1-1.2
|
||||
c0.1-0.5,0.1-0.8,0.1-1l13.8-40c2.1-4.1,4.6-10.3,7.5-18.6c2.9-8.2,4.8-13.3,5.6-15.2c3.2-8.2,8.6-22,16.3-41.2
|
||||
c7.7-19.2,13.5-34,17.5-44.5C1665.1,335.6,1667.2,335,1671.1,335z M1673.5,446.1h6.2c11.4-0.3,17.1-1,17.1-1.9
|
||||
c0-2.9-2.5-10.1-7.4-21.7c-1.9-4.6-3-7.1-3.3-7.6l-3.1-7.4c-0.8,0-3.5,5.5-8,16.4s-6.8,17.4-6.8,19.3
|
||||
C1668.3,445.1,1670,446.1,1673.5,446.1z M1851.1,334c4.9,0,7.4,0.9,7.4,2.6v48.6c0,1.6,0.2,2.4,0.5,2.4c1.1,0,2.5-1,4.2-3.1
|
||||
c1.7-2.1,3.4-4.4,5.1-7c1.7-2.6,3.1-4.3,4-5.1l26.7-36.2c0.8-1,1.9-1.4,3.3-1.4h35.2l5.7,1c0.3,0,0.5,0.3,0.5,1
|
||||
c0,1.1-0.2,1.8-0.5,2.1l-10.2,16.2l-1.4,1l-30.5,40.7c-0.5,0.5-0.7,1.1-0.7,1.9c0,1.1,0.2,2.1,0.7,2.9l46.2,95.4c0,0.2,0,0.4,0,0.7
|
||||
l0.2,0.7c0,2.7-4.8,4-14.3,4c-5.6,0-12-0.2-19.4-0.7c-7.4-0.5-11.5-0.7-12.3-0.7l-1.7-1.2c-1-1-9.8-19.3-26.7-55
|
||||
c-0.2-1.3-1.3-3.8-3.3-7.6c-0.5,0-2.3,2.2-5.6,6.7c-3.3,4.4-5,7.1-5.4,7.9c0,2.9,0,7.5,0.1,13.8c0.1,6.3,0.1,12.3,0.1,17.8
|
||||
c0,11.3-1.3,17.1-3.8,17.6c-3.2,0-7.1,0.1-11.9,0.4c-4.8,0.2-8,0.4-9.8,0.4c-2.7,0-6.3-0.3-10.9-1c-4.6-0.6-6.9-1.2-6.9-1.7v-81.9
|
||||
c1-7.6,1.4-12,1.4-13.1c0-7.1-0.3-17.8-1-32.1c-0.6-14.3-1-24.9-1-31.9c0-2.9,0.6-4.6,1.9-5.2C1825.4,334.2,1836.6,334,1851.1,334z
|
||||
"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.4 KiB |
1
app/scripts/constants/on-ramp.js
Normal file
@ -0,0 +1 @@
|
||||
export const TRANSAK_API_KEY = '25ac1309-a49b-4411-b20e-5e56c61a5b1c'; // It's a public key, which will be included in a URL for Transak.
|
@ -30,6 +30,9 @@ describe('DetectTokensController', function () {
|
||||
'0x7e57e2',
|
||||
'0xbc86727e770de68b1060c91f6bb6945c73e10388',
|
||||
]);
|
||||
sandbox
|
||||
.stub(network, 'getLatestBlock')
|
||||
.callsFake(() => Promise.resolve({}));
|
||||
sandbox
|
||||
.stub(preferences, '_detectIsERC721')
|
||||
.returns(Promise.resolve(false));
|
||||
|
@ -34,8 +34,10 @@ const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
|
||||
* @typedef {Object} EtherscanTransaction
|
||||
* @property {string} blockNumber - The number of the block this transaction was found in, in decimal
|
||||
* @property {string} from - The hex-prefixed address of the sender
|
||||
* @property {string} gas - The gas limit, in decimal WEI
|
||||
* @property {string} gasPrice - The gas price, in decimal WEI
|
||||
* @property {string} gas - The gas limit, in decimal GWEI
|
||||
* @property {string} [gasPrice] - The gas price, in decimal WEI
|
||||
* @property {string} [maxFeePerGas] - The maximum fee per gas, inclusive of tip, in decimal WEI
|
||||
* @property {string} [maxPriorityFeePerGas] - The maximum tip per gas in decimal WEI
|
||||
* @property {string} hash - The hex-prefixed transaction hash
|
||||
* @property {string} isError - Whether the transaction was confirmed or failed (0 for confirmed, 1 for failed)
|
||||
* @property {string} nonce - The transaction nonce, in decimal
|
||||
@ -267,6 +269,25 @@ export default class IncomingTransactionsController {
|
||||
etherscanTransaction.isError === '0'
|
||||
? TRANSACTION_STATUSES.CONFIRMED
|
||||
: TRANSACTION_STATUSES.FAILED;
|
||||
const txParams = {
|
||||
from: etherscanTransaction.from,
|
||||
gas: bnToHex(new BN(etherscanTransaction.gas)),
|
||||
nonce: bnToHex(new BN(etherscanTransaction.nonce)),
|
||||
to: etherscanTransaction.to,
|
||||
value: bnToHex(new BN(etherscanTransaction.value)),
|
||||
};
|
||||
|
||||
if (etherscanTransaction.gasPrice) {
|
||||
txParams.gasPrice = bnToHex(new BN(etherscanTransaction.gasPrice));
|
||||
} else if (etherscanTransaction.maxFeePerGas) {
|
||||
txParams.maxFeePerGas = bnToHex(
|
||||
new BN(etherscanTransaction.maxFeePerGas),
|
||||
);
|
||||
txParams.maxPriorityFeePerGas = bnToHex(
|
||||
new BN(etherscanTransaction.maxPriorityFeePerGas),
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
blockNumber: etherscanTransaction.blockNumber,
|
||||
id: createId(),
|
||||
@ -274,14 +295,7 @@ export default class IncomingTransactionsController {
|
||||
metamaskNetworkId: CHAIN_ID_TO_NETWORK_ID_MAP[chainId],
|
||||
status,
|
||||
time,
|
||||
txParams: {
|
||||
from: etherscanTransaction.from,
|
||||
gas: bnToHex(new BN(etherscanTransaction.gas)),
|
||||
gasPrice: bnToHex(new BN(etherscanTransaction.gasPrice)),
|
||||
nonce: bnToHex(new BN(etherscanTransaction.nonce)),
|
||||
to: etherscanTransaction.to,
|
||||
value: bnToHex(new BN(etherscanTransaction.value)),
|
||||
},
|
||||
txParams,
|
||||
hash: etherscanTransaction.hash,
|
||||
type: TRANSACTION_TYPES.INCOMING,
|
||||
};
|
||||
|
@ -103,15 +103,34 @@ function getMockBlockTracker() {
|
||||
/**
|
||||
* Returns a transaction object matching the expected format returned
|
||||
* by the Etherscan API
|
||||
*
|
||||
* @param {string} [toAddress] - The hex-prefixed address of the recipient
|
||||
* @param {number} [blockNumber] - The block number for the transaction
|
||||
* @param {Object} [params] - options bag
|
||||
* @param {string} [params.toAddress] - The hex-prefixed address of the recipient
|
||||
* @param {number} [params.blockNumber] - The block number for the transaction
|
||||
* @param {boolean} [params.useEIP1559] - Use EIP-1559 gas fields
|
||||
* @param
|
||||
* @returns {EtherscanTransaction}
|
||||
*/
|
||||
const getFakeEtherscanTransaction = (
|
||||
const getFakeEtherscanTransaction = ({
|
||||
toAddress = MOCK_SELECTED_ADDRESS,
|
||||
blockNumber = 10,
|
||||
) => {
|
||||
useEIP1559 = false,
|
||||
hash = '0xfake',
|
||||
} = {}) => {
|
||||
if (useEIP1559) {
|
||||
return {
|
||||
blockNumber: blockNumber.toString(),
|
||||
from: '0xfake',
|
||||
gas: '0',
|
||||
maxFeePerGas: '10',
|
||||
maxPriorityFeePerGas: '1',
|
||||
hash,
|
||||
isError: '0',
|
||||
nonce: '100',
|
||||
timeStamp: '16000000000000',
|
||||
to: toAddress,
|
||||
value: '0',
|
||||
};
|
||||
}
|
||||
return {
|
||||
blockNumber: blockNumber.toString(),
|
||||
from: '0xfake',
|
||||
@ -243,7 +262,13 @@ describe('IncomingTransactionsController', function () {
|
||||
200,
|
||||
JSON.stringify({
|
||||
status: '1',
|
||||
result: [getFakeEtherscanTransaction()],
|
||||
result: [
|
||||
getFakeEtherscanTransaction(),
|
||||
getFakeEtherscanTransaction({
|
||||
hash: '0xfakeeip1559',
|
||||
useEIP1559: true,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
);
|
||||
const updateStateStub = sinon.stub(
|
||||
@ -263,6 +288,9 @@ describe('IncomingTransactionsController', function () {
|
||||
|
||||
const actualStateWithoutGenerated = cloneDeep(actualState);
|
||||
delete actualStateWithoutGenerated?.incomingTransactions?.['0xfake']?.id;
|
||||
delete actualStateWithoutGenerated?.incomingTransactions?.[
|
||||
'0xfakeeip1559'
|
||||
]?.id;
|
||||
|
||||
assert.ok(
|
||||
typeof generatedTxId === 'number' && generatedTxId > 0,
|
||||
@ -290,6 +318,24 @@ describe('IncomingTransactionsController', function () {
|
||||
value: '0x0',
|
||||
},
|
||||
},
|
||||
'0xfakeeip1559': {
|
||||
blockNumber: '10',
|
||||
hash: '0xfakeeip1559',
|
||||
metamaskNetworkId: ROPSTEN_NETWORK_ID,
|
||||
chainId: ROPSTEN_CHAIN_ID,
|
||||
status: TRANSACTION_STATUSES.CONFIRMED,
|
||||
time: 16000000000000000,
|
||||
type: TRANSACTION_TYPES.INCOMING,
|
||||
txParams: {
|
||||
from: '0xfake',
|
||||
gas: '0x0',
|
||||
maxFeePerGas: '0xa',
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
nonce: '0x64',
|
||||
to: '0x0101',
|
||||
value: '0x0',
|
||||
},
|
||||
},
|
||||
},
|
||||
incomingTxLastFetchedBlockByChainId: {
|
||||
...getNonEmptyInitState().incomingTxLastFetchedBlockByChainId,
|
||||
@ -509,7 +555,11 @@ describe('IncomingTransactionsController', function () {
|
||||
200,
|
||||
JSON.stringify({
|
||||
status: '1',
|
||||
result: [getFakeEtherscanTransaction(NEW_MOCK_SELECTED_ADDRESS)],
|
||||
result: [
|
||||
getFakeEtherscanTransaction({
|
||||
toAddress: NEW_MOCK_SELECTED_ADDRESS,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
);
|
||||
const updateStateStub = sinon.stub(
|
||||
@ -586,7 +636,9 @@ describe('IncomingTransactionsController', function () {
|
||||
// reply with a valid request for any supported network, so that this test has every opportunity to fail
|
||||
nockEtherscanApiForAllChains({
|
||||
status: '1',
|
||||
result: [getFakeEtherscanTransaction(NEW_MOCK_SELECTED_ADDRESS)],
|
||||
result: [
|
||||
getFakeEtherscanTransaction({ toAddress: NEW_MOCK_SELECTED_ADDRESS }),
|
||||
],
|
||||
});
|
||||
const updateStateStub = sinon.stub(
|
||||
incomingTransactionsController.store,
|
||||
@ -954,7 +1006,9 @@ describe('IncomingTransactionsController', function () {
|
||||
|
||||
describe('_getNewIncomingTransactions', function () {
|
||||
const ADDRESS_TO_FETCH_FOR = '0xfakeaddress';
|
||||
const FETCHED_TX = getFakeEtherscanTransaction(ADDRESS_TO_FETCH_FOR);
|
||||
const FETCHED_TX = getFakeEtherscanTransaction({
|
||||
toAddress: ADDRESS_TO_FETCH_FOR,
|
||||
});
|
||||
const mockFetch = sinon.stub().returns(
|
||||
Promise.resolve({
|
||||
json: () => Promise.resolve({ status: '1', result: [FETCHED_TX] }),
|
||||
@ -1212,5 +1266,53 @@ describe('IncomingTransactionsController', function () {
|
||||
type: TRANSACTION_TYPES.INCOMING,
|
||||
});
|
||||
});
|
||||
|
||||
it('should return the expected data when the tx uses EIP-1559 fields', function () {
|
||||
const incomingTransactionsController = new IncomingTransactionsController(
|
||||
{
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(ROPSTEN_CHAIN_ID),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
|
||||
const result = incomingTransactionsController._normalizeTxFromEtherscan(
|
||||
{
|
||||
timeStamp: '4444',
|
||||
isError: '0',
|
||||
blockNumber: 333,
|
||||
from: '0xa',
|
||||
gas: '11',
|
||||
maxFeePerGas: '12',
|
||||
maxPriorityFeePerGas: '1',
|
||||
nonce: '13',
|
||||
to: '0xe',
|
||||
value: '15',
|
||||
hash: '0xg',
|
||||
},
|
||||
ROPSTEN_CHAIN_ID,
|
||||
);
|
||||
|
||||
assert.deepStrictEqual(result, {
|
||||
blockNumber: 333,
|
||||
id: 54321,
|
||||
metamaskNetworkId: ROPSTEN_NETWORK_ID,
|
||||
chainId: ROPSTEN_CHAIN_ID,
|
||||
status: TRANSACTION_STATUSES.CONFIRMED,
|
||||
time: 4444000,
|
||||
txParams: {
|
||||
from: '0xa',
|
||||
gas: '0xb',
|
||||
maxFeePerGas: '0xc',
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
nonce: '0xd',
|
||||
to: '0xe',
|
||||
value: '0xf',
|
||||
},
|
||||
hash: '0xg',
|
||||
type: TRANSACTION_TYPES.INCOMING,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { createScaffoldMiddleware, mergeMiddleware } from 'json-rpc-engine';
|
||||
import createBlockReRefMiddleware from 'eth-json-rpc-middleware/block-ref';
|
||||
import createBlockRefMiddleware from 'eth-json-rpc-middleware/block-ref';
|
||||
import createRetryOnEmptyMiddleware from 'eth-json-rpc-middleware/retryOnEmpty';
|
||||
import createBlockCacheMiddleware from 'eth-json-rpc-middleware/block-cache';
|
||||
import createInflightMiddleware from 'eth-json-rpc-middleware/inflight-cache';
|
||||
import createInflightCacheMiddleware from 'eth-json-rpc-middleware/inflight-cache';
|
||||
import createBlockTrackerInspectorMiddleware from 'eth-json-rpc-middleware/block-tracker-inspector';
|
||||
import providerFromMiddleware from 'eth-json-rpc-middleware/providerFromMiddleware';
|
||||
import createInfuraMiddleware from 'eth-json-rpc-infura';
|
||||
@ -23,8 +23,8 @@ export default function createInfuraClient({ network, projectId }) {
|
||||
const networkMiddleware = mergeMiddleware([
|
||||
createNetworkAndChainIdMiddleware({ network }),
|
||||
createBlockCacheMiddleware({ blockTracker }),
|
||||
createInflightMiddleware(),
|
||||
createBlockReRefMiddleware({ blockTracker, provider: infuraProvider }),
|
||||
createInflightCacheMiddleware(),
|
||||
createBlockRefMiddleware({ blockTracker, provider: infuraProvider }),
|
||||
createRetryOnEmptyMiddleware({ blockTracker, provider: infuraProvider }),
|
||||
createBlockTrackerInspectorMiddleware({ blockTracker }),
|
||||
infuraMiddleware,
|
||||
|
@ -1,11 +1,13 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import sinon from 'sinon';
|
||||
import { getNetworkDisplayName } from './util';
|
||||
import NetworkController from './network';
|
||||
import NetworkController, { NETWORK_EVENTS } from './network';
|
||||
|
||||
describe('NetworkController', function () {
|
||||
describe('controller', function () {
|
||||
let networkController;
|
||||
let getLatestBlockStub;
|
||||
let setProviderTypeAndWait;
|
||||
const noop = () => undefined;
|
||||
const networkControllerProviderConfig = {
|
||||
getAccounts: noop,
|
||||
@ -13,7 +15,21 @@ describe('NetworkController', function () {
|
||||
|
||||
beforeEach(function () {
|
||||
networkController = new NetworkController();
|
||||
getLatestBlockStub = sinon
|
||||
.stub(networkController, 'getLatestBlock')
|
||||
.callsFake(() => Promise.resolve({}));
|
||||
networkController.setInfuraProjectId('foo');
|
||||
setProviderTypeAndWait = () =>
|
||||
new Promise((resolve) => {
|
||||
networkController.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
|
||||
resolve();
|
||||
});
|
||||
networkController.setProviderType('mainnet');
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
getLatestBlockStub.reset();
|
||||
});
|
||||
|
||||
describe('#provider', function () {
|
||||
@ -67,6 +83,59 @@ describe('NetworkController', function () {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getEIP1559Compatibility', function () {
|
||||
it('should return false when baseFeePerGas is not in the block header', async function () {
|
||||
networkController.initializeProvider(networkControllerProviderConfig);
|
||||
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
|
||||
assert.equal(supportsEIP1559, false);
|
||||
});
|
||||
|
||||
it('should return true when baseFeePerGas is in block header', async function () {
|
||||
networkController.initializeProvider(networkControllerProviderConfig);
|
||||
getLatestBlockStub.callsFake(() =>
|
||||
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
||||
);
|
||||
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
|
||||
assert.equal(supportsEIP1559, true);
|
||||
});
|
||||
|
||||
it('should store EIP1559 support in state to reduce calls to getLatestBlock', async function () {
|
||||
networkController.initializeProvider(networkControllerProviderConfig);
|
||||
getLatestBlockStub.callsFake(() =>
|
||||
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
||||
);
|
||||
await networkController.getEIP1559Compatibility();
|
||||
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
|
||||
assert.equal(getLatestBlockStub.calledOnce, true);
|
||||
assert.equal(supportsEIP1559, true);
|
||||
});
|
||||
|
||||
it('should clear stored EIP1559 support when changing networks', async function () {
|
||||
networkController.initializeProvider(networkControllerProviderConfig);
|
||||
networkController.consoleThis = true;
|
||||
getLatestBlockStub.callsFake(() =>
|
||||
Promise.resolve({ baseFeePerGas: '0xa ' }),
|
||||
);
|
||||
await networkController.getEIP1559Compatibility();
|
||||
assert.equal(
|
||||
networkController.networkDetails.getState().EIPS[1559],
|
||||
true,
|
||||
);
|
||||
getLatestBlockStub.callsFake(() => Promise.resolve({}));
|
||||
await setProviderTypeAndWait('mainnet');
|
||||
assert.equal(
|
||||
networkController.networkDetails.getState().EIPS[1559],
|
||||
undefined,
|
||||
);
|
||||
await networkController.getEIP1559Compatibility();
|
||||
assert.equal(
|
||||
networkController.networkDetails.getState().EIPS[1559],
|
||||
false,
|
||||
);
|
||||
assert.equal(getLatestBlockStub.calledTwice, true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('utils', function () {
|
||||
|
@ -51,6 +51,10 @@ const defaultProviderConfig = {
|
||||
...defaultProviderConfigOpts,
|
||||
};
|
||||
|
||||
const defaultNetworkDetailsState = {
|
||||
EIPS: { 1559: undefined },
|
||||
};
|
||||
|
||||
export const NETWORK_EVENTS = {
|
||||
// Fired after the actively selected network is changed
|
||||
NETWORK_DID_CHANGE: 'networkDidChange',
|
||||
@ -74,10 +78,21 @@ export default class NetworkController extends EventEmitter {
|
||||
this.providerStore.getState(),
|
||||
);
|
||||
this.networkStore = new ObservableStore('loading');
|
||||
// We need to keep track of a few details about the current network
|
||||
// Ideally we'd merge this.networkStore with this new store, but doing so
|
||||
// will require a decent sized refactor of how we're accessing network
|
||||
// state. Currently this is only used for detecting EIP 1559 support but
|
||||
// can be extended to track other network details.
|
||||
this.networkDetails = new ObservableStore(
|
||||
opts.networkDetails || {
|
||||
...defaultNetworkDetailsState,
|
||||
},
|
||||
);
|
||||
this.store = new ComposedStore({
|
||||
provider: this.providerStore,
|
||||
previousProviderStore: this.previousProviderStore,
|
||||
network: this.networkStore,
|
||||
networkDetails: this.networkDetails,
|
||||
});
|
||||
|
||||
// provider and block tracker
|
||||
@ -120,6 +135,42 @@ export default class NetworkController extends EventEmitter {
|
||||
return { provider, blockTracker };
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to return the latest block for the current network
|
||||
* @returns {Object} Block header
|
||||
*/
|
||||
getLatestBlock() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { provider } = this.getProviderAndBlockTracker();
|
||||
const ethQuery = new EthQuery(provider);
|
||||
ethQuery.sendAsync(
|
||||
{ method: 'eth_getBlockByNumber', params: ['latest', false] },
|
||||
(err, block) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
return resolve(block);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to check if the block header contains fields that indicate EIP 1559
|
||||
* support (baseFeePerGas).
|
||||
* @returns {Promise<boolean>} true if current network supports EIP 1559
|
||||
*/
|
||||
async getEIP1559Compatibility() {
|
||||
const { EIPS } = this.networkDetails.getState();
|
||||
if (EIPS[1559] !== undefined) {
|
||||
return EIPS[1559];
|
||||
}
|
||||
const latestBlock = await this.getLatestBlock();
|
||||
const supportsEIP1559 = latestBlock.baseFeePerGas !== undefined;
|
||||
this.setNetworkEIPSupport(1559, supportsEIP1559);
|
||||
return supportsEIP1559;
|
||||
}
|
||||
|
||||
verifyNetwork() {
|
||||
// Check network when restoring connectivity:
|
||||
if (this.isNetworkLoading()) {
|
||||
@ -135,6 +186,26 @@ export default class NetworkController extends EventEmitter {
|
||||
this.networkStore.putState(network);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set EIP support indication in the networkDetails store
|
||||
* @param {number} EIPNumber - The number of the EIP to mark support for
|
||||
* @param {boolean} isSupported - True if the EIP is supported
|
||||
*/
|
||||
setNetworkEIPSupport(EIPNumber, isSupported) {
|
||||
this.networkDetails.updateState({
|
||||
EIPS: {
|
||||
[EIPNumber]: isSupported,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset EIP support to default (no support)
|
||||
*/
|
||||
clearNetworkDetails() {
|
||||
this.networkDetails.putState({ ...defaultNetworkDetailsState });
|
||||
}
|
||||
|
||||
isNetworkLoading() {
|
||||
return this.getNetworkState() === 'loading';
|
||||
}
|
||||
@ -154,6 +225,8 @@ export default class NetworkController extends EventEmitter {
|
||||
'NetworkController - lookupNetwork aborted due to missing chainId',
|
||||
);
|
||||
this.setNetworkState('loading');
|
||||
// keep network details in sync with network state
|
||||
this.clearNetworkDetails();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -174,10 +247,14 @@ export default class NetworkController extends EventEmitter {
|
||||
if (initialNetwork === currentNetwork) {
|
||||
if (err) {
|
||||
this.setNetworkState('loading');
|
||||
// keep network details in sync with network state
|
||||
this.clearNetworkDetails();
|
||||
return;
|
||||
}
|
||||
|
||||
this.setNetworkState(networkVersion);
|
||||
// look up EIP-1559 support
|
||||
this.getEIP1559Compatibility();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -298,9 +375,15 @@ export default class NetworkController extends EventEmitter {
|
||||
}
|
||||
|
||||
_switchNetwork(opts) {
|
||||
// Indicate to subscribers that network is about to change
|
||||
this.emit(NETWORK_EVENTS.NETWORK_WILL_CHANGE);
|
||||
// Set loading state
|
||||
this.setNetworkState('loading');
|
||||
// Reset network details
|
||||
this.clearNetworkDetails();
|
||||
// Configure the provider appropriately
|
||||
this._configureProvider(opts);
|
||||
// Notify subscribers that network has changed
|
||||
this.emit(NETWORK_EVENTS.NETWORK_DID_CHANGE, opts.type);
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,9 @@ describe('preferences controller', function () {
|
||||
network.initializeProvider(networkControllerProviderConfig);
|
||||
provider = network.getProviderAndBlockTracker().provider;
|
||||
|
||||
sandbox
|
||||
.stub(network, 'getLatestBlock')
|
||||
.callsFake(() => Promise.resolve({}));
|
||||
sandbox.stub(network, 'getCurrentChainId').callsFake(() => currentChainId);
|
||||
sandbox
|
||||
.stub(network, 'getProviderConfig')
|
||||
|
@ -6,7 +6,7 @@ import { mapValues, cloneDeep } from 'lodash';
|
||||
import abi from 'human-standard-token-abi';
|
||||
import { calcTokenAmount } from '../../../ui/helpers/utils/token-util';
|
||||
import { calcGasTotal } from '../../../ui/pages/send/send.utils';
|
||||
import { conversionUtil } from '../../../ui/helpers/utils/conversion-util';
|
||||
import { conversionUtil } from '../../../shared/modules/conversion.utils';
|
||||
import {
|
||||
DEFAULT_ERC20_APPROVE_GAS,
|
||||
QUOTES_EXPIRED_ERROR,
|
||||
|
@ -1,10 +1,11 @@
|
||||
import EventEmitter from 'safe-event-emitter';
|
||||
import { ObservableStore } from '@metamask/obs-store';
|
||||
import { bufferToHex, keccak, toBuffer } from 'ethereumjs-util';
|
||||
import Transaction from 'ethereumjs-tx';
|
||||
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';
|
||||
@ -25,7 +26,12 @@ import {
|
||||
} from '../../../../shared/constants/transaction';
|
||||
import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller';
|
||||
import { GAS_LIMITS } from '../../../../shared/constants/gas';
|
||||
import { CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP } from '../../../../shared/constants/network';
|
||||
import {
|
||||
HARDFORKS,
|
||||
MAINNET,
|
||||
NETWORK_TYPE_RPC,
|
||||
CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP,
|
||||
} from '../../../../shared/constants/network';
|
||||
import { isEIP1559Transaction } from '../../../../shared/modules/transaction.utils';
|
||||
import TransactionStateManager from './tx-state-manager';
|
||||
import TxGasUtil from './tx-gas-utils';
|
||||
@ -44,6 +50,16 @@ export const TRANSACTION_EVENTS = {
|
||||
SUBMITTED: 'Transaction Submitted',
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {Object} CustomGasSettings
|
||||
* @property {string} [gas] - The gas limit to use for the transaction
|
||||
* @property {string} [gasPrice] - The gasPrice to use for a legacy transaction
|
||||
* @property {string} [maxFeePerGas] - The maximum amount to pay per gas on a
|
||||
* EIP-1559 transaction
|
||||
* @property {string} [maxPriorityFeePerGas] - The maximum amount of paid fee
|
||||
* to be distributed to miner in an EIP-1559 transaction
|
||||
*/
|
||||
|
||||
/**
|
||||
Transaction Controller is an aggregate of sub-controllers and trackers
|
||||
composing them in a way to be exposed to the metamask controller
|
||||
@ -64,7 +80,7 @@ export const TRANSACTION_EVENTS = {
|
||||
@param {Object} opts.networkStore - an observable store for network number
|
||||
@param {Object} opts.blockTracker - An instance of eth-blocktracker
|
||||
@param {Object} opts.provider - A network provider.
|
||||
@param {Function} opts.signTransaction - function the signs an ethereumjs-tx
|
||||
@param {Function} opts.signTransaction - function the signs an @ethereumjs/tx
|
||||
@param {Object} opts.getPermittedAccounts - get accounts that an origin has permissions for
|
||||
@param {Function} opts.signTransaction - ethTx signer that returns a rawTx
|
||||
@param {number} [opts.txHistoryLimit] - number *optional* for limiting how many transactions are in state
|
||||
@ -76,6 +92,8 @@ export default class TransactionController extends EventEmitter {
|
||||
super();
|
||||
this.networkStore = opts.networkStore || new ObservableStore({});
|
||||
this._getCurrentChainId = opts.getCurrentChainId;
|
||||
this.getProviderConfig = opts.getProviderConfig;
|
||||
this.getEIP1559Compatibility = opts.getEIP1559Compatibility;
|
||||
this.preferencesStore = opts.preferencesStore || new ObservableStore({});
|
||||
this.provider = opts.provider;
|
||||
this.getPermittedAccounts = opts.getPermittedAccounts;
|
||||
@ -157,6 +175,58 @@ export default class TransactionController extends EventEmitter {
|
||||
return integerChainId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ethereumjs/tx uses @ethereumjs/common as a configuration tool for
|
||||
* specifying which chain, network, hardfork and EIPs to support for
|
||||
* a transaction. By referencing this configuration, and analyzing the fields
|
||||
* specified in txParams, @ethereumjs/tx is able to determine which EIP-2718
|
||||
* transaction type to use.
|
||||
* @returns {Common} common configuration object
|
||||
*/
|
||||
async getCommonConfiguration() {
|
||||
const { type, nickname: name } = this.getProviderConfig();
|
||||
const supportsEIP1559 = await this.getEIP1559Compatibility();
|
||||
|
||||
// This logic below will have to be updated each time a hardfork happens
|
||||
// that carries with it a new Transaction type. It is inconsequential for
|
||||
// hardforks that do not include new types.
|
||||
const hardfork = supportsEIP1559 ? HARDFORKS.LONDON : HARDFORKS.BERLIN;
|
||||
|
||||
// type will be one of our default network names or 'rpc'. the default
|
||||
// network names are sufficient configuration, simply pass the name as the
|
||||
// chain argument in the constructor.
|
||||
if (type !== NETWORK_TYPE_RPC) {
|
||||
return new Common({
|
||||
chain: type,
|
||||
hardfork,
|
||||
});
|
||||
}
|
||||
|
||||
// For 'rpc' we need to use the same basic configuration as mainnet,
|
||||
// since we only support EVM compatible chains, and then override the
|
||||
// name, chainId and networkId properties. This is done using the
|
||||
// `forCustomChain` static method on the Common class.
|
||||
const chainId = parseInt(this._getCurrentChainId(), 16);
|
||||
const networkId = this.networkStore.getState();
|
||||
|
||||
const customChainParams = {
|
||||
name,
|
||||
chainId,
|
||||
// It is improbable for a transaction to be signed while the network
|
||||
// is loading for two reasons.
|
||||
// 1. Pending, unconfirmed transactions are wiped on network change
|
||||
// 2. The UI is unusable (loading indicator) when network is loading.
|
||||
// setting the networkId to 0 is for type safety and to explicity lead
|
||||
// the transaction to failing if a user is able to get to this branch
|
||||
// on a custom network that requires valid network id. I have not ran
|
||||
// into this limitation on any network I have attempted, even when
|
||||
// hardcoding networkId to 'loading'.
|
||||
networkId: networkId === 'loading' ? 0 : parseInt(networkId, 10),
|
||||
};
|
||||
|
||||
return Common.forCustomChain(MAINNET, customChainParams, hardfork);
|
||||
}
|
||||
|
||||
/**
|
||||
Adds a tx to the txlist
|
||||
@emits ${txMeta.id}:unapproved
|
||||
@ -250,6 +320,7 @@ export default class TransactionController extends EventEmitter {
|
||||
*/
|
||||
let txMeta = this.txStateManager.generateTxMeta({
|
||||
txParams: normalizedTxParams,
|
||||
origin,
|
||||
});
|
||||
|
||||
if (origin === 'metamask') {
|
||||
@ -273,8 +344,6 @@ export default class TransactionController extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
txMeta.origin = origin;
|
||||
|
||||
const { type, getCodeResponse } = await this._determineTransactionType(
|
||||
txParams,
|
||||
);
|
||||
@ -328,7 +397,12 @@ export default class TransactionController extends EventEmitter {
|
||||
if (simulationFails) {
|
||||
txMeta.simulationFails = simulationFails;
|
||||
}
|
||||
if (defaultGasPrice && !txMeta.txParams.gasPrice) {
|
||||
if (
|
||||
defaultGasPrice &&
|
||||
!txMeta.txParams.gasPrice &&
|
||||
!txMeta.txParams.maxPriorityFeePerGas &&
|
||||
!txMeta.txParams.maxFeePerGas
|
||||
) {
|
||||
txMeta.txParams.gasPrice = defaultGasPrice;
|
||||
}
|
||||
if (defaultGasLimit && !txMeta.txParams.gas) {
|
||||
@ -343,7 +417,10 @@ export default class TransactionController extends EventEmitter {
|
||||
* @returns {Promise<string|undefined>} The default gas price
|
||||
*/
|
||||
async _getDefaultGasPrice(txMeta) {
|
||||
if (txMeta.txParams.gasPrice) {
|
||||
if (
|
||||
txMeta.txParams.gasPrice ||
|
||||
(txMeta.txParams.maxFeePerGas && txMeta.txParams.maxPriorityFeePerGas)
|
||||
) {
|
||||
return undefined;
|
||||
}
|
||||
const gasPrice = await this.query.gasPrice();
|
||||
@ -401,32 +478,105 @@ export default class TransactionController extends EventEmitter {
|
||||
return { gasLimit, simulationFails };
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a TransactionMeta object, generate new gas params such that if the
|
||||
* transaction was an EIP1559 transaction, it only has EIP1559 gas fields,
|
||||
* otherwise it only has gasPrice. Will use whatever custom values are
|
||||
* specified in customGasSettings, or falls back to incrementing by a percent
|
||||
* which is defined by specifying a numerator. 11 is a 10% bump, 12 would be
|
||||
* a 20% bump, and so on.
|
||||
* @param {import(
|
||||
* '../../../../shared/constants/transaction'
|
||||
* ).TransactionMeta} originalTxMeta - Original transaction to use as base
|
||||
* @param {CustomGasSettings} [customGasSettings] - overrides for the gas
|
||||
* fields to use instead of the multiplier
|
||||
* @param {number} [incrementNumerator] - Numerator from which to generate a
|
||||
* percentage bump of gas price. E.g 11 would be a 10% bump over base.
|
||||
* @returns {{ newGasParams: CustomGasSettings, previousGasParams: CustomGasSettings }}
|
||||
*/
|
||||
generateNewGasParams(
|
||||
originalTxMeta,
|
||||
customGasSettings = {},
|
||||
incrementNumerator = 11,
|
||||
) {
|
||||
const { txParams } = originalTxMeta;
|
||||
const previousGasParams = {};
|
||||
const newGasParams = {};
|
||||
if (customGasSettings.gasLimit) {
|
||||
newGasParams.gas = customGasSettings?.gas ?? GAS_LIMITS.SIMPLE;
|
||||
}
|
||||
|
||||
if (isEIP1559Transaction(originalTxMeta)) {
|
||||
previousGasParams.maxFeePerGas = txParams.maxFeePerGas;
|
||||
previousGasParams.maxPriorityFeePerGas = txParams.maxPriorityFeePerGas;
|
||||
newGasParams.maxFeePerGas =
|
||||
customGasSettings?.maxFeePerGas ||
|
||||
bnToHex(
|
||||
BnMultiplyByFraction(
|
||||
hexToBn(txParams.maxFeePerGas),
|
||||
incrementNumerator,
|
||||
10,
|
||||
),
|
||||
);
|
||||
newGasParams.maxPriorityFeePerGas =
|
||||
customGasSettings?.maxPriorityFeePerGas ||
|
||||
bnToHex(
|
||||
BnMultiplyByFraction(
|
||||
hexToBn(txParams.maxPriorityFeePerGas),
|
||||
incrementNumerator,
|
||||
10,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
previousGasParams.gasPrice = txParams.gasPrice;
|
||||
newGasParams.gasPrice =
|
||||
customGasSettings?.gasPrice ||
|
||||
bnToHex(
|
||||
BnMultiplyByFraction(
|
||||
hexToBn(txParams.gasPrice),
|
||||
incrementNumerator,
|
||||
10,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return { previousGasParams, newGasParams };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new approved transaction to attempt to cancel a previously submitted transaction. The
|
||||
* new transaction contains the same nonce as the previous, is a basic ETH transfer of 0x value to
|
||||
* the sender's address, and has a higher gasPrice than that of the previous transaction.
|
||||
* @param {number} originalTxId - the id of the txMeta that you want to attempt to cancel
|
||||
* @param {string} [customGasPrice] - the hex value to use for the cancel transaction
|
||||
* @param {CustomGasSettings} [customGasSettings] - overrides to use for gas
|
||||
* params instead of allowing this method to generate them
|
||||
* @returns {txMeta}
|
||||
*/
|
||||
async createCancelTransaction(originalTxId, customGasPrice, customGasLimit) {
|
||||
async createCancelTransaction(originalTxId, customGasSettings) {
|
||||
const originalTxMeta = this.txStateManager.getTransaction(originalTxId);
|
||||
const { txParams } = originalTxMeta;
|
||||
const { gasPrice: lastGasPrice, from, nonce } = txParams;
|
||||
const { from, nonce } = txParams;
|
||||
|
||||
const { previousGasParams, newGasParams } = this.generateNewGasParams(
|
||||
originalTxMeta,
|
||||
{
|
||||
...customGasSettings,
|
||||
// We want to override the previous transactions gasLimit because it
|
||||
// will now be a simple send instead of whatever it was before such
|
||||
// as a token transfer or contract call.
|
||||
gasLimit: customGasSettings.gasLimit || GAS_LIMITS.SIMPLE,
|
||||
},
|
||||
);
|
||||
|
||||
const newGasPrice =
|
||||
customGasPrice ||
|
||||
bnToHex(BnMultiplyByFraction(hexToBn(lastGasPrice), 11, 10));
|
||||
const newTxMeta = this.txStateManager.generateTxMeta({
|
||||
txParams: {
|
||||
from,
|
||||
to: from,
|
||||
nonce,
|
||||
gas: customGasLimit || GAS_LIMITS.SIMPLE,
|
||||
value: '0x0',
|
||||
gasPrice: newGasPrice,
|
||||
...newGasParams,
|
||||
},
|
||||
lastGasPrice,
|
||||
previousGasParams,
|
||||
loadingDefaults: false,
|
||||
status: TRANSACTION_STATUSES.APPROVED,
|
||||
type: TRANSACTION_TYPES.CANCEL,
|
||||
@ -443,34 +593,30 @@ export default class TransactionController extends EventEmitter {
|
||||
* the same gas limit and a 10% higher gas price, though it is possible to set a custom value for
|
||||
* each instead.
|
||||
* @param {number} originalTxId - the id of the txMeta that you want to speed up
|
||||
* @param {string} [customGasPrice] - The new custom gas price, in hex
|
||||
* @param {string} [customGasLimit] - The new custom gas limt, in hex
|
||||
* @param {CustomGasSettings} [customGasSettings] - overrides to use for gas
|
||||
* params instead of allowing this method to generate them
|
||||
* @returns {txMeta}
|
||||
*/
|
||||
async createSpeedUpTransaction(originalTxId, customGasPrice, customGasLimit) {
|
||||
async createSpeedUpTransaction(originalTxId, customGasSettings) {
|
||||
const originalTxMeta = this.txStateManager.getTransaction(originalTxId);
|
||||
const { txParams } = originalTxMeta;
|
||||
const { gasPrice: lastGasPrice } = txParams;
|
||||
|
||||
const newGasPrice =
|
||||
customGasPrice ||
|
||||
bnToHex(BnMultiplyByFraction(hexToBn(lastGasPrice), 11, 10));
|
||||
const { previousGasParams, newGasParams } = this.generateNewGasParams(
|
||||
originalTxMeta,
|
||||
customGasSettings,
|
||||
);
|
||||
|
||||
const newTxMeta = this.txStateManager.generateTxMeta({
|
||||
txParams: {
|
||||
...txParams,
|
||||
gasPrice: newGasPrice,
|
||||
...newGasParams,
|
||||
},
|
||||
lastGasPrice,
|
||||
previousGasParams,
|
||||
loadingDefaults: false,
|
||||
status: TRANSACTION_STATUSES.APPROVED,
|
||||
type: TRANSACTION_TYPES.RETRY,
|
||||
});
|
||||
|
||||
if (customGasLimit) {
|
||||
newTxMeta.txParams.gas = customGasLimit;
|
||||
}
|
||||
|
||||
this.addTransaction(newTxMeta);
|
||||
await this.approveTransaction(newTxMeta.id);
|
||||
return newTxMeta;
|
||||
@ -529,9 +675,9 @@ export default class TransactionController extends EventEmitter {
|
||||
customNonceValue = Number(customNonceValue);
|
||||
nonceLock = await this.nonceTracker.getNonceLock(fromAddress);
|
||||
// add nonce to txParams
|
||||
// if txMeta has lastGasPrice then it is a retry at same nonce with higher
|
||||
// gas price transaction and their for the nonce should not be calculated
|
||||
const nonce = txMeta.lastGasPrice
|
||||
// if txMeta has previousGasParams then it is a retry at same nonce with
|
||||
// higher gas settings and therefor the nonce should not be recalculated
|
||||
const nonce = txMeta.previousGasParams
|
||||
? txMeta.txParams.nonce
|
||||
: nonceLock.nextNonce;
|
||||
const customOrNonce =
|
||||
@ -580,17 +726,22 @@ export default class TransactionController extends EventEmitter {
|
||||
const txMeta = this.txStateManager.getTransaction(txId);
|
||||
// add network/chain id
|
||||
const chainId = this.getChainId();
|
||||
const txParams = { ...txMeta.txParams, chainId };
|
||||
const txParams = {
|
||||
...txMeta.txParams,
|
||||
chainId,
|
||||
gasLimit: txMeta.txParams.gas,
|
||||
};
|
||||
// sign tx
|
||||
const fromAddress = txParams.from;
|
||||
const ethTx = new Transaction(txParams);
|
||||
await this.signEthTx(ethTx, fromAddress);
|
||||
const common = await this.getCommonConfiguration();
|
||||
const unsignedEthTx = TransactionFactory.fromTxData(txParams, { common });
|
||||
const signedEthTx = await this.signEthTx(unsignedEthTx, fromAddress);
|
||||
|
||||
// add r,s,v values for provider request purposes see createMetamaskMiddleware
|
||||
// and JSON rpc standard for further explanation
|
||||
txMeta.r = bufferToHex(ethTx.r);
|
||||
txMeta.s = bufferToHex(ethTx.s);
|
||||
txMeta.v = bufferToHex(ethTx.v);
|
||||
txMeta.r = bufferToHex(signedEthTx.r);
|
||||
txMeta.s = bufferToHex(signedEthTx.s);
|
||||
txMeta.v = bufferToHex(signedEthTx.v);
|
||||
|
||||
this.txStateManager.updateTransaction(
|
||||
txMeta,
|
||||
@ -599,7 +750,7 @@ export default class TransactionController extends EventEmitter {
|
||||
|
||||
// set state to signed
|
||||
this.txStateManager.setTxStatusSigned(txMeta.id);
|
||||
const rawTx = bufferToHex(ethTx.serialize());
|
||||
const rawTx = bufferToHex(signedEthTx.serialize());
|
||||
return rawTx;
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import EventEmitter from 'events';
|
||||
import { toBuffer } from 'ethereumjs-util';
|
||||
import EthTx from 'ethereumjs-tx';
|
||||
import { TransactionFactory } from '@ethereumjs/tx';
|
||||
import { ObservableStore } from '@metamask/obs-store';
|
||||
import sinon from 'sinon';
|
||||
|
||||
@ -20,6 +20,9 @@ import TransactionController, { TRANSACTION_EVENTS } from '.';
|
||||
const noop = () => true;
|
||||
const currentNetworkId = '42';
|
||||
const currentChainId = '0x2a';
|
||||
const providerConfig = {
|
||||
type: 'kovan',
|
||||
};
|
||||
|
||||
const VALID_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||
const VALID_ADDRESS_TWO = '0x0000000000000000000000000000000000000001';
|
||||
@ -36,6 +39,7 @@ describe('Transaction Controller', function () {
|
||||
};
|
||||
provider = createTestProviderTools({ scaffold: providerResultStub })
|
||||
.provider;
|
||||
|
||||
fromAccount = getTestAccounts()[0];
|
||||
const blockTrackerStub = new EventEmitter();
|
||||
blockTrackerStub.getCurrentBlock = noop;
|
||||
@ -46,13 +50,14 @@ describe('Transaction Controller', function () {
|
||||
return '0xee6b2800';
|
||||
},
|
||||
networkStore: new ObservableStore(currentNetworkId),
|
||||
getEIP1559Compatibility: () => Promise.resolve(true),
|
||||
txHistoryLimit: 10,
|
||||
blockTracker: blockTrackerStub,
|
||||
signTransaction: (ethTx) =>
|
||||
new Promise((resolve) => {
|
||||
ethTx.sign(fromAccount.key);
|
||||
resolve();
|
||||
resolve(ethTx.sign(fromAccount.key));
|
||||
}),
|
||||
getProviderConfig: () => providerConfig,
|
||||
getPermittedAccounts: () => undefined,
|
||||
getCurrentChainId: () => currentChainId,
|
||||
getParticipateInMetrics: () => false,
|
||||
@ -565,8 +570,8 @@ describe('Transaction Controller', function () {
|
||||
noop,
|
||||
);
|
||||
const rawTx = await txController.signTransaction('1');
|
||||
const ethTx = new EthTx(toBuffer(rawTx));
|
||||
assert.equal(ethTx.getChainId(), 42);
|
||||
const ethTx = TransactionFactory.fromSerializedData(toBuffer(rawTx));
|
||||
assert.equal(ethTx.common.chainIdBN().toNumber(), 42);
|
||||
});
|
||||
});
|
||||
|
||||
@ -734,11 +739,11 @@ describe('Transaction Controller', function () {
|
||||
const addTransactionArgs = addTransactionSpy.getCall(0).args[0];
|
||||
assert.deepEqual(addTransactionArgs.txParams, expectedTxParams);
|
||||
|
||||
const { lastGasPrice, type } = addTransactionArgs;
|
||||
const { previousGasParams, type } = addTransactionArgs;
|
||||
assert.deepEqual(
|
||||
{ lastGasPrice, type },
|
||||
{ gasPrice: previousGasParams.gasPrice, type },
|
||||
{
|
||||
lastGasPrice: '0xa',
|
||||
gasPrice: '0xa',
|
||||
type: TRANSACTION_TYPES.RETRY,
|
||||
},
|
||||
);
|
||||
@ -757,11 +762,11 @@ describe('Transaction Controller', function () {
|
||||
|
||||
assert.deepEqual(result.txParams, expectedTxParams);
|
||||
|
||||
const { lastGasPrice, type } = result;
|
||||
const { previousGasParams, type } = result;
|
||||
assert.deepEqual(
|
||||
{ lastGasPrice, type },
|
||||
{ gasPrice: previousGasParams.gasPrice, type },
|
||||
{
|
||||
lastGasPrice: '0xa',
|
||||
gasPrice: '0xa',
|
||||
type: TRANSACTION_TYPES.RETRY,
|
||||
},
|
||||
);
|
||||
|
@ -1,17 +1,23 @@
|
||||
import { ethErrors } from 'eth-rpc-errors';
|
||||
import { addHexPrefix } from '../../../lib/util';
|
||||
import { TRANSACTION_STATUSES } from '../../../../../shared/constants/transaction';
|
||||
import {
|
||||
TRANSACTION_ENVELOPE_TYPES,
|
||||
TRANSACTION_STATUSES,
|
||||
} from '../../../../../shared/constants/transaction';
|
||||
import { isValidHexAddress } from '../../../../../shared/modules/hexstring-utils';
|
||||
|
||||
const normalizers = {
|
||||
from: (from) => addHexPrefix(from),
|
||||
from: addHexPrefix,
|
||||
to: (to, lowerCase) =>
|
||||
lowerCase ? addHexPrefix(to).toLowerCase() : addHexPrefix(to),
|
||||
nonce: (nonce) => addHexPrefix(nonce),
|
||||
value: (value) => addHexPrefix(value),
|
||||
data: (data) => addHexPrefix(data),
|
||||
gas: (gas) => addHexPrefix(gas),
|
||||
gasPrice: (gasPrice) => addHexPrefix(gasPrice),
|
||||
nonce: addHexPrefix,
|
||||
value: addHexPrefix,
|
||||
data: addHexPrefix,
|
||||
gas: addHexPrefix,
|
||||
gasPrice: addHexPrefix,
|
||||
maxFeePerGas: addHexPrefix,
|
||||
maxPriorityFeePerGas: addHexPrefix,
|
||||
type: addHexPrefix,
|
||||
};
|
||||
|
||||
export function normalizeAndValidateTxParams(txParams, lowerCase = true) {
|
||||
@ -38,6 +44,78 @@ export function normalizeTxParams(txParams, lowerCase = true) {
|
||||
return normalizedTxParams;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given two fields, ensure that the second field is not included in txParams,
|
||||
* and if it is throw an invalidParams error.
|
||||
* @param {Object} txParams - the transaction parameters object
|
||||
* @param {string} fieldBeingValidated - the current field being validated
|
||||
* @param {string} mutuallyExclusiveField - the field to ensure is not provided
|
||||
* @throws {ethErrors.rpc.invalidParams} - throws if mutuallyExclusiveField is
|
||||
* present in txParams.
|
||||
*/
|
||||
function ensureMutuallyExclusiveFieldsNotProvided(
|
||||
txParams,
|
||||
fieldBeingValidated,
|
||||
mutuallyExclusiveField,
|
||||
) {
|
||||
if (typeof txParams[mutuallyExclusiveField] !== 'undefined') {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction params: specified ${fieldBeingValidated} but also included ${mutuallyExclusiveField}, these cannot be mixed`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the provided value for field is a string, throws an
|
||||
* invalidParams error if field is not a string.
|
||||
* @param {Object} txParams - the transaction parameters object
|
||||
* @param {string} field - the current field being validated
|
||||
* @throws {ethErrors.rpc.invalidParams} - throws if field is not a string
|
||||
*/
|
||||
function ensureFieldIsString(txParams, field) {
|
||||
if (typeof txParams[field] !== 'string') {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction params: ${field} is not a string. got: (${txParams[field]})`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the provided txParams has the proper 'type' specified for the
|
||||
* given field, if it is provided. If types do not match throws an
|
||||
* invalidParams error.
|
||||
* @param {Object} txParams - the transaction parameters object
|
||||
* @param {'gasPrice' | 'maxFeePerGas' | 'maxPriorityFeePerGas'} field - the
|
||||
* current field being validated
|
||||
* @throws {ethErrors.rpc.invalidParams} - throws if type does not match the
|
||||
* expectations for provided field.
|
||||
*/
|
||||
function ensureProperTransactionEnvelopeTypeProvided(txParams, field) {
|
||||
switch (field) {
|
||||
case 'maxFeePerGas':
|
||||
case 'maxPriorityFeePerGas':
|
||||
if (
|
||||
txParams.type &&
|
||||
txParams.type !== TRANSACTION_ENVELOPE_TYPES.FEE_MARKET
|
||||
) {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction envelope type: specified type "${txParams.type}" but including maxFeePerGas and maxPriorityFeePerGas requires type: "${TRANSACTION_ENVELOPE_TYPES.FEE_MARKET}"`,
|
||||
);
|
||||
}
|
||||
break;
|
||||
case 'gasPrice':
|
||||
default:
|
||||
if (
|
||||
txParams.type &&
|
||||
txParams.type === TRANSACTION_ENVELOPE_TYPES.FEE_MARKET
|
||||
) {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction envelope type: specified type "${txParams.type}" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the given tx parameters
|
||||
* @param {Object} txParams - the tx params
|
||||
@ -64,12 +142,43 @@ export function validateTxParams(txParams) {
|
||||
case 'to':
|
||||
validateRecipient(txParams);
|
||||
break;
|
||||
case 'gasPrice':
|
||||
ensureProperTransactionEnvelopeTypeProvided(txParams, 'gasPrice');
|
||||
ensureMutuallyExclusiveFieldsNotProvided(
|
||||
txParams,
|
||||
'gasPrice',
|
||||
'maxFeePerGas',
|
||||
);
|
||||
ensureMutuallyExclusiveFieldsNotProvided(
|
||||
txParams,
|
||||
'gasPrice',
|
||||
'maxPriorityFeePerGas',
|
||||
);
|
||||
ensureFieldIsString(txParams, 'gasPrice');
|
||||
break;
|
||||
case 'maxFeePerGas':
|
||||
ensureProperTransactionEnvelopeTypeProvided(txParams, 'maxFeePerGas');
|
||||
ensureMutuallyExclusiveFieldsNotProvided(
|
||||
txParams,
|
||||
'maxFeePerGas',
|
||||
'gasPrice',
|
||||
);
|
||||
ensureFieldIsString(txParams, 'maxFeePerGas');
|
||||
break;
|
||||
case 'maxPriorityFeePerGas':
|
||||
ensureProperTransactionEnvelopeTypeProvided(
|
||||
txParams,
|
||||
'maxPriorityFeePerGas',
|
||||
);
|
||||
ensureMutuallyExclusiveFieldsNotProvided(
|
||||
txParams,
|
||||
'maxPriorityFeePerGas',
|
||||
'gasPrice',
|
||||
);
|
||||
ensureFieldIsString(txParams, 'maxPriorityFeePerGas');
|
||||
break;
|
||||
case 'value':
|
||||
if (typeof value !== 'string') {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction params: ${key} is not a string. got: (${value})`,
|
||||
);
|
||||
}
|
||||
ensureFieldIsString(txParams, 'value');
|
||||
if (value.toString().includes('-')) {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction value "${value}": not a positive number.`,
|
||||
@ -90,11 +199,7 @@ export function validateTxParams(txParams) {
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (typeof value !== 'string') {
|
||||
throw ethErrors.rpc.invalidParams(
|
||||
`Invalid transaction params: ${key} is not a string. got: (${value})`,
|
||||
);
|
||||
}
|
||||
ensureFieldIsString(txParams, key);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import { TRANSACTION_ENVELOPE_TYPES } from '../../../../../shared/constants/transaction';
|
||||
import { BURN_ADDRESS } from '../../../../../shared/modules/hexstring-utils';
|
||||
import * as txUtils from './util';
|
||||
|
||||
describe('txUtils', function () {
|
||||
@ -48,6 +50,239 @@ describe('txUtils', function () {
|
||||
message: 'Invalid transaction value "-0x01": not a positive number.',
|
||||
});
|
||||
});
|
||||
|
||||
describe('when validating gasPrice', function () {
|
||||
it('should error when specifying incorrect type', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message: `Invalid transaction envelope type: specified type "0x2" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when gasPrice is not a string', function () {
|
||||
const txParams = {
|
||||
gasPrice: 1,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: gasPrice is not a string. got: (1)',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when specifying maxFeePerGas', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
maxFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: specified gasPrice but also included maxFeePerGas, these cannot be mixed',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when specifying maxPriorityFeePerGas', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: specified gasPrice but also included maxPriorityFeePerGas, these cannot be mixed',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should validate if gasPrice is set with no type or EIP-1559 gas fields', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
|
||||
it('should validate if gasPrice is set with a type of "0x0"', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
});
|
||||
|
||||
describe('when validating maxFeePerGas', function () {
|
||||
it('should error when specifying incorrect type', function () {
|
||||
const txParams = {
|
||||
maxFeePerGas: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction envelope type: specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when maxFeePerGas is not a string', function () {
|
||||
const txParams = {
|
||||
maxFeePerGas: 1,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: maxFeePerGas is not a string. got: (1)',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when specifying gasPrice', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
maxFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: specified gasPrice but also included maxFeePerGas, these cannot be mixed',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should validate if maxFeePerGas is set with no type or gasPrice field', function () {
|
||||
const txParams = {
|
||||
maxFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
|
||||
it('should validate if maxFeePerGas is set with a type of "0x2"', function () {
|
||||
const txParams = {
|
||||
maxFeePerGas: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
});
|
||||
|
||||
describe('when validating maxPriorityFeePerGas', function () {
|
||||
it('should error when specifying incorrect type', function () {
|
||||
const txParams = {
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction envelope type: specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when maxFeePerGas is not a string', function () {
|
||||
const txParams = {
|
||||
maxPriorityFeePerGas: 1,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: maxPriorityFeePerGas is not a string. got: (1)',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should error when specifying gasPrice', function () {
|
||||
const txParams = {
|
||||
gasPrice: '0x1',
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
|
||||
assert.throws(
|
||||
() => {
|
||||
txUtils.validateTxParams(txParams);
|
||||
},
|
||||
{
|
||||
message:
|
||||
'Invalid transaction params: specified gasPrice but also included maxPriorityFeePerGas, these cannot be mixed',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('should validate if maxPriorityFeePerGas is set with no type or gasPrice field', function () {
|
||||
const txParams = {
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
|
||||
it('should validate if maxPriorityFeePerGas is set with a type of "0x2"', function () {
|
||||
const txParams = {
|
||||
maxPriorityFeePerGas: '0x1',
|
||||
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
|
||||
to: BURN_ADDRESS,
|
||||
};
|
||||
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('#normalizeTxParams', function () {
|
||||
@ -58,6 +293,10 @@ describe('txUtils', function () {
|
||||
to: null,
|
||||
data: '68656c6c6f20776f726c64',
|
||||
random: 'hello world',
|
||||
gasPrice: '1',
|
||||
maxFeePerGas: '1',
|
||||
maxPriorityFeePerGas: '1',
|
||||
type: '1',
|
||||
};
|
||||
|
||||
let normalizedTxParams = txUtils.normalizeTxParams(txParams);
|
||||
@ -89,6 +328,28 @@ describe('txUtils', function () {
|
||||
'0x',
|
||||
'to should be hex-prefixed',
|
||||
);
|
||||
|
||||
assert.equal(
|
||||
normalizedTxParams.gasPrice,
|
||||
'0x1',
|
||||
'gasPrice should be hex-prefixed',
|
||||
);
|
||||
|
||||
assert.equal(
|
||||
normalizedTxParams.maxFeePerGas,
|
||||
'0x1',
|
||||
'maxFeePerGas should be hex-prefixed',
|
||||
);
|
||||
assert.equal(
|
||||
normalizedTxParams.maxPriorityFeePerGas,
|
||||
'0x1',
|
||||
'maxPriorityFeePerGas should be hex-prefixed',
|
||||
);
|
||||
assert.equal(
|
||||
normalizedTxParams.type,
|
||||
'0x1',
|
||||
'type should be hex-prefixed',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -62,8 +62,11 @@ export default class TxGasUtil {
|
||||
// `eth_estimateGas` can fail if the user has insufficient balance for the
|
||||
// value being sent, or for the gas cost. We don't want to check their
|
||||
// balance here, we just want the gas estimate. The gas price is removed
|
||||
// to skip those balance checks. We check balance elsewhere.
|
||||
// to skip those balance checks. We check balance elsewhere. We also delete
|
||||
// maxFeePerGas and maxPriorityFeePerGas to support EIP-1559 txs.
|
||||
delete txParams.gasPrice;
|
||||
delete txParams.maxFeePerGas;
|
||||
delete txParams.maxPriorityFeePerGas;
|
||||
|
||||
// estimate tx gas requirements
|
||||
return await this.query.estimateGas(txParams);
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import Transaction from 'ethereumjs-tx';
|
||||
import { TransactionFactory } from '@ethereumjs/tx';
|
||||
import Common from '@ethereumjs/common';
|
||||
import { hexToBn, bnToHex } from '../../lib/util';
|
||||
import TxUtils from './tx-gas-utils';
|
||||
|
||||
@ -31,8 +32,14 @@ describe('txUtils', function () {
|
||||
nonce: '0x3',
|
||||
chainId: 42,
|
||||
};
|
||||
const ethTx = new Transaction(txParams);
|
||||
assert.equal(ethTx.getChainId(), 42, 'chainId is set from tx params');
|
||||
const ethTx = TransactionFactory.fromTxData(txParams, {
|
||||
common: new Common({ chain: 'kovan' }),
|
||||
});
|
||||
assert.equal(
|
||||
ethTx.common.chainIdBN().toNumber(),
|
||||
42,
|
||||
'chainId is set from tx params',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -72,12 +72,45 @@ export default class TransactionStateManager extends EventEmitter {
|
||||
* overwriting default keys of the TransactionMeta
|
||||
* @returns {TransactionMeta} the default txMeta object
|
||||
*/
|
||||
generateTxMeta(opts) {
|
||||
generateTxMeta(opts = {}) {
|
||||
const netId = this.getNetwork();
|
||||
const chainId = this.getCurrentChainId();
|
||||
if (netId === 'loading') {
|
||||
throw new Error('MetaMask is having trouble connecting to the network');
|
||||
}
|
||||
|
||||
let dappSuggestedGasFees = null;
|
||||
|
||||
// If we are dealing with a transaction suggested by a dapp and not
|
||||
// an internally created metamask transaction, we need to keep record of
|
||||
// the originally submitted gasParams.
|
||||
if (
|
||||
opts.txParams &&
|
||||
typeof opts.origin === 'string' &&
|
||||
opts.origin !== 'metamask'
|
||||
) {
|
||||
if (typeof opts.txParams.gasPrice !== 'undefined') {
|
||||
dappSuggestedGasFees = {
|
||||
gasPrice: opts.txParams.gasPrice,
|
||||
};
|
||||
} else if (
|
||||
typeof opts.txParams.maxFeePerGas !== 'undefined' ||
|
||||
typeof opts.txParams.maxPriorityFeePerGas !== 'undefined'
|
||||
) {
|
||||
dappSuggestedGasFees = {
|
||||
maxPriorityFeePerGas: opts.txParams.maxPriorityFeePerGas,
|
||||
maxFeePerGas: opts.txParams.maxFeePerGas,
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof opts.txParams.gas !== 'undefined') {
|
||||
dappSuggestedGasFees = {
|
||||
...dappSuggestedGasFees,
|
||||
gas: opts.txParams.gas,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
id: createId(),
|
||||
time: new Date().getTime(),
|
||||
@ -85,6 +118,7 @@ export default class TransactionStateManager extends EventEmitter {
|
||||
metamaskNetworkId: netId,
|
||||
chainId,
|
||||
loadingDefaults: true,
|
||||
dappSuggestedGasFees,
|
||||
...opts,
|
||||
};
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import {
|
||||
RINKEBY_CHAIN_ID,
|
||||
KOVAN_NETWORK_ID,
|
||||
} from '../../../../shared/constants/network';
|
||||
import { GAS_LIMITS } from '../../../../shared/constants/gas';
|
||||
import TxStateManager from './tx-state-manager';
|
||||
import { snapshotFromTxMeta } from './lib/tx-state-history-helpers';
|
||||
|
||||
@ -1074,6 +1075,136 @@ describe('TransactionStateManager', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe('#generateTxMeta', function () {
|
||||
it('generates a txMeta object when supplied no parameters', function () {
|
||||
// There are currently not safety checks for missing 'opts' but we should
|
||||
// at least enforce txParams. This is done in the transaction controller
|
||||
// before *calling* this method, but we should perhaps ensure that
|
||||
// txParams is provided and validated in this method.
|
||||
// TODO: this test should fail.
|
||||
const generatedTransaction = txStateManager.generateTxMeta();
|
||||
assert.ok(generatedTransaction);
|
||||
});
|
||||
|
||||
it('generates a txMeta object with txParams specified', function () {
|
||||
const txParams = {
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
gasPrice: '0x0',
|
||||
};
|
||||
const generatedTransaction = txStateManager.generateTxMeta({
|
||||
txParams,
|
||||
});
|
||||
assert.ok(generatedTransaction);
|
||||
assert.strictEqual(generatedTransaction.txParams, txParams);
|
||||
});
|
||||
|
||||
it('generates a txMeta object with txParams specified using EIP-1559 fields', function () {
|
||||
const txParams = {
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
maxFeePerGas: '0x0',
|
||||
maxPriorityFeePerGas: '0x0',
|
||||
};
|
||||
const generatedTransaction = txStateManager.generateTxMeta({
|
||||
txParams,
|
||||
});
|
||||
assert.ok(generatedTransaction);
|
||||
assert.strictEqual(generatedTransaction.txParams, txParams);
|
||||
});
|
||||
|
||||
it('records dappSuggestedGasFees when origin is provided and is not "metamask"', function () {
|
||||
const eip1559GasFeeFields = {
|
||||
maxFeePerGas: '0x0',
|
||||
maxPriorityFeePerGas: '0x0',
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
};
|
||||
|
||||
const legacyGasFeeFields = {
|
||||
gasPrice: '0x0',
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
};
|
||||
|
||||
const eip1559TxParams = {
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
...eip1559GasFeeFields,
|
||||
};
|
||||
|
||||
const legacyTxParams = {
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
...legacyGasFeeFields,
|
||||
};
|
||||
const eip1559GeneratedTransaction = txStateManager.generateTxMeta({
|
||||
txParams: eip1559TxParams,
|
||||
origin: 'adappt.com',
|
||||
});
|
||||
const legacyGeneratedTransaction = txStateManager.generateTxMeta({
|
||||
txParams: legacyTxParams,
|
||||
origin: 'adappt.com',
|
||||
});
|
||||
assert.ok(
|
||||
eip1559GeneratedTransaction,
|
||||
'generated EIP1559 transaction should be truthy',
|
||||
);
|
||||
assert.deepStrictEqual(
|
||||
eip1559GeneratedTransaction.dappSuggestedGasFees,
|
||||
eip1559GasFeeFields,
|
||||
'generated EIP1559 transaction should have appropriate dappSuggestedGasFees',
|
||||
);
|
||||
|
||||
assert.ok(
|
||||
legacyGeneratedTransaction,
|
||||
'generated legacy transaction should be truthy',
|
||||
);
|
||||
assert.deepStrictEqual(
|
||||
legacyGeneratedTransaction.dappSuggestedGasFees,
|
||||
legacyGasFeeFields,
|
||||
'generated legacy transaction should have appropriate dappSuggestedGasFees',
|
||||
);
|
||||
});
|
||||
|
||||
it('does not record dappSuggestedGasFees when transaction origin is "metamask"', function () {
|
||||
const txParams = {
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
maxFeePerGas: '0x0',
|
||||
maxPriorityFeePerGas: '0x0',
|
||||
};
|
||||
const generatedTransaction = txStateManager.generateTxMeta({
|
||||
txParams,
|
||||
origin: 'metamask',
|
||||
});
|
||||
assert.ok(generatedTransaction);
|
||||
assert.strictEqual(generatedTransaction.dappSuggestedGasFees, null);
|
||||
});
|
||||
|
||||
it('does not record dappSuggestedGasFees when transaction origin is not provided', function () {
|
||||
const txParams = {
|
||||
gas: GAS_LIMITS.SIMPLE,
|
||||
from: '0x0000',
|
||||
to: '0x000',
|
||||
value: '0x0',
|
||||
maxFeePerGas: '0x0',
|
||||
maxPriorityFeePerGas: '0x0',
|
||||
};
|
||||
const generatedTransaction = txStateManager.generateTxMeta({
|
||||
txParams,
|
||||
});
|
||||
assert.ok(generatedTransaction);
|
||||
assert.strictEqual(generatedTransaction.dappSuggestedGasFees, null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#clearUnapprovedTxs', function () {
|
||||
it('removes unapproved transactions', function () {
|
||||
const txMetas = [
|
||||
|
@ -1,3 +1,6 @@
|
||||
import log from 'loglevel';
|
||||
|
||||
import { METASWAP_CHAINID_API_HOST_MAP } from '../../../shared/constants/swaps';
|
||||
import {
|
||||
GOERLI_CHAIN_ID,
|
||||
KOVAN_CHAIN_ID,
|
||||
@ -5,6 +8,54 @@ import {
|
||||
RINKEBY_CHAIN_ID,
|
||||
ROPSTEN_CHAIN_ID,
|
||||
} from '../../../shared/constants/network';
|
||||
import { SECOND } from '../../../shared/constants/time';
|
||||
import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout';
|
||||
import { TRANSAK_API_KEY } from '../constants/on-ramp';
|
||||
|
||||
const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
|
||||
|
||||
/**
|
||||
* Create a Wyre purchase URL.
|
||||
* @param {String} address Ethereum destination address
|
||||
* @returns String
|
||||
*/
|
||||
const createWyrePurchaseUrl = async (address) => {
|
||||
const fiatOnRampUrlApi = `${METASWAP_CHAINID_API_HOST_MAP[MAINNET_CHAIN_ID]}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${address}`;
|
||||
const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=ethereum:${address}&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`;
|
||||
try {
|
||||
const response = await fetchWithTimeout(fiatOnRampUrlApi, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
const parsedResponse = await response.json();
|
||||
if (response.ok && parsedResponse.url) {
|
||||
return parsedResponse.url;
|
||||
}
|
||||
log.warn('Failed to create a Wyre purchase URL', parsedResponse);
|
||||
} catch (err) {
|
||||
log.warn('Failed to create a Wyre purchase URL', err);
|
||||
}
|
||||
return wyrePurchaseUrlFallback; // In case the API call would fail, we return a fallback URL for Wyre's Checkout.
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a Transak Checkout URL.
|
||||
* API docs here: https://www.notion.so/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238
|
||||
* @param {String} address Ethereum destination address
|
||||
* @returns String
|
||||
*/
|
||||
const createTransakUrl = (address) => {
|
||||
const queryParams = new URLSearchParams({
|
||||
apiKey: TRANSAK_API_KEY,
|
||||
hostURL: 'https://metamask.io',
|
||||
defaultCryptoCurrency: 'ETH',
|
||||
walletAddress: address,
|
||||
});
|
||||
return `https://global.transak.com/?${queryParams}`;
|
||||
};
|
||||
|
||||
/**
|
||||
* Gives the caller a url at which the user can acquire eth, depending on the network they are in
|
||||
@ -16,7 +67,7 @@ import {
|
||||
* chainId does not match any of the specified cases, or if no chainId is given, returns undefined.
|
||||
*
|
||||
*/
|
||||
export default function getBuyEthUrl({ chainId, address, service }) {
|
||||
export default async function getBuyEthUrl({ chainId, address, service }) {
|
||||
// default service by network if not specified
|
||||
if (!service) {
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
@ -25,7 +76,9 @@ export default function getBuyEthUrl({ chainId, address, service }) {
|
||||
|
||||
switch (service) {
|
||||
case 'wyre':
|
||||
return `https://pay.sendwyre.com/purchase?dest=ethereum:${address}&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`;
|
||||
return await createWyrePurchaseUrl(address);
|
||||
case 'transak':
|
||||
return createTransakUrl(address);
|
||||
case 'metamask-faucet':
|
||||
return 'https://faucet.metamask.io/';
|
||||
case 'rinkeby-faucet':
|
||||
|
@ -1,49 +1,76 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import nock from 'nock';
|
||||
import {
|
||||
KOVAN_CHAIN_ID,
|
||||
MAINNET_CHAIN_ID,
|
||||
RINKEBY_CHAIN_ID,
|
||||
ROPSTEN_CHAIN_ID,
|
||||
} from '../../../shared/constants/network';
|
||||
import { TRANSAK_API_KEY } from '../constants/on-ramp';
|
||||
import getBuyEthUrl from './buy-eth-url';
|
||||
|
||||
describe('buy-eth-url', function () {
|
||||
const mainnet = {
|
||||
chainId: MAINNET_CHAIN_ID,
|
||||
amount: 5,
|
||||
address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
|
||||
};
|
||||
const ropsten = {
|
||||
chainId: ROPSTEN_CHAIN_ID,
|
||||
};
|
||||
const rinkeby = {
|
||||
chainId: RINKEBY_CHAIN_ID,
|
||||
};
|
||||
const kovan = {
|
||||
chainId: KOVAN_CHAIN_ID,
|
||||
};
|
||||
const WYRE_ACCOUNT_ID = 'AC-7AG3W4XH4N2';
|
||||
const ETH_ADDRESS = '0x0dcd5d886577d5581b0c524242ef2ee70be3e7bc';
|
||||
const MAINNET = {
|
||||
chainId: MAINNET_CHAIN_ID,
|
||||
amount: 5,
|
||||
address: ETH_ADDRESS,
|
||||
};
|
||||
const ROPSTEN = {
|
||||
chainId: ROPSTEN_CHAIN_ID,
|
||||
};
|
||||
const RINKEBY = {
|
||||
chainId: RINKEBY_CHAIN_ID,
|
||||
};
|
||||
const KOVAN = {
|
||||
chainId: KOVAN_CHAIN_ID,
|
||||
};
|
||||
|
||||
it('returns wyre url with address for network 1', function () {
|
||||
const wyreUrl = getBuyEthUrl(mainnet);
|
||||
describe('buy-eth-url', function () {
|
||||
it('returns Wyre url with an ETH address for Ethereum mainnet', async function () {
|
||||
nock('https://api.metaswap.codefi.network')
|
||||
.get(`/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`)
|
||||
.reply(200, {
|
||||
url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
|
||||
});
|
||||
const wyreUrl = await getBuyEthUrl(MAINNET);
|
||||
assert.equal(
|
||||
wyreUrl,
|
||||
`https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
|
||||
);
|
||||
nock.cleanAll();
|
||||
});
|
||||
|
||||
it('returns a fallback Wyre url if /orders/reserve API call fails', async function () {
|
||||
const wyreUrl = await getBuyEthUrl(MAINNET);
|
||||
|
||||
assert.equal(
|
||||
wyreUrl,
|
||||
'https://pay.sendwyre.com/purchase?dest=ethereum:0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card',
|
||||
`https://pay.sendwyre.com/purchase?dest=ethereum:${ETH_ADDRESS}&destCurrency=ETH&accountId=${WYRE_ACCOUNT_ID}&paymentMethod=debit-card`,
|
||||
);
|
||||
});
|
||||
|
||||
it('returns metamask ropsten faucet for network 3', function () {
|
||||
const ropstenUrl = getBuyEthUrl(ropsten);
|
||||
it('returns Transak url with an ETH address for Ethereum mainnet', async function () {
|
||||
const transakUrl = await getBuyEthUrl({ ...MAINNET, service: 'transak' });
|
||||
|
||||
assert.equal(
|
||||
transakUrl,
|
||||
`https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&defaultCryptoCurrency=ETH&walletAddress=${ETH_ADDRESS}`,
|
||||
);
|
||||
});
|
||||
|
||||
it('returns metamask ropsten faucet for network 3', async function () {
|
||||
const ropstenUrl = await getBuyEthUrl(ROPSTEN);
|
||||
assert.equal(ropstenUrl, 'https://faucet.metamask.io/');
|
||||
});
|
||||
|
||||
it('returns rinkeby dapp for network 4', function () {
|
||||
const rinkebyUrl = getBuyEthUrl(rinkeby);
|
||||
it('returns rinkeby dapp for network 4', async function () {
|
||||
const rinkebyUrl = await getBuyEthUrl(RINKEBY);
|
||||
assert.equal(rinkebyUrl, 'https://www.rinkeby.io/');
|
||||
});
|
||||
|
||||
it('returns kovan github test faucet for network 42', function () {
|
||||
const kovanUrl = getBuyEthUrl(kovan);
|
||||
it('returns kovan github test faucet for network 42', async function () {
|
||||
const kovanUrl = await getBuyEthUrl(KOVAN);
|
||||
assert.equal(kovanUrl, 'https://github.com/kovan-testnet/faucet');
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
import EventEmitter from 'events';
|
||||
import assert from 'assert';
|
||||
import { strict as assert } from 'assert';
|
||||
import { ObservableStore } from '@metamask/obs-store';
|
||||
import { ethErrors } from 'eth-rpc-errors';
|
||||
import { typedSignatureHash, TYPED_MESSAGE_SCHEMA } from 'eth-sig-util';
|
||||
@ -177,7 +177,7 @@ export default class TypedMessageManager extends EventEmitter {
|
||||
break;
|
||||
case 'V3':
|
||||
case 'V4': {
|
||||
assert.strictEqual(
|
||||
assert.equal(
|
||||
typeof params.data,
|
||||
'string',
|
||||
'"params.data" must be a string.',
|
||||
@ -191,18 +191,21 @@ export default class TypedMessageManager extends EventEmitter {
|
||||
data.primaryType in data.types,
|
||||
`Primary type of "${data.primaryType}" has no type definition.`,
|
||||
);
|
||||
assert.strictEqual(
|
||||
assert.equal(
|
||||
validation.errors.length,
|
||||
0,
|
||||
'Signing data must conform to EIP-712 schema. See https://git.io/fNtcx.',
|
||||
);
|
||||
const { chainId } = data.domain;
|
||||
let { chainId } = data.domain;
|
||||
if (chainId) {
|
||||
const activeChainId = parseInt(this._getCurrentChainId(), 16);
|
||||
assert.ok(
|
||||
!Number.isNaN(activeChainId),
|
||||
`Cannot sign messages for chainId "${chainId}", because MetaMask is switching networks.`,
|
||||
);
|
||||
if (typeof chainId === 'string') {
|
||||
chainId = parseInt(chainId, 16);
|
||||
}
|
||||
assert.equal(
|
||||
chainId,
|
||||
activeChainId,
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import extension from 'extensionizer';
|
||||
import { stripHexPrefix } from 'ethereumjs-util';
|
||||
import BN from 'bn.js';
|
||||
@ -74,39 +73,6 @@ const getPlatform = (_) => {
|
||||
return PLATFORM_FIREFOX;
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks whether a given balance of ETH, represented as a hex string, is sufficient to pay a value plus a gas fee
|
||||
*
|
||||
* @param {Object} txParams - Contains data about a transaction
|
||||
* @param {string} txParams.gas - The gas for a transaction
|
||||
* @param {string} txParams.gasPrice - The price per gas for the transaction
|
||||
* @param {string} txParams.value - The value of ETH to send
|
||||
* @param {string} hexBalance - A balance of ETH represented as a hex string
|
||||
* @returns {boolean} Whether the balance is greater than or equal to the value plus the value of gas times gasPrice
|
||||
*
|
||||
*/
|
||||
function sufficientBalance(txParams, hexBalance) {
|
||||
// validate hexBalance is a hex string
|
||||
assert.equal(
|
||||
typeof hexBalance,
|
||||
'string',
|
||||
'sufficientBalance - hexBalance is not a hex string',
|
||||
);
|
||||
assert.equal(
|
||||
hexBalance.slice(0, 2),
|
||||
'0x',
|
||||
'sufficientBalance - hexBalance is not a hex string',
|
||||
);
|
||||
|
||||
const balance = hexToBn(hexBalance);
|
||||
const value = hexToBn(txParams.value);
|
||||
const gasLimit = hexToBn(txParams.gas);
|
||||
const gasPrice = hexToBn(txParams.gasPrice);
|
||||
|
||||
const maxCost = value.add(gasLimit.mul(gasPrice));
|
||||
return balance.gte(maxCost);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a hex string to a BN object
|
||||
*
|
||||
@ -196,7 +162,6 @@ function getChainType(chainId) {
|
||||
export {
|
||||
getPlatform,
|
||||
getEnvironmentType,
|
||||
sufficientBalance,
|
||||
hexToBn,
|
||||
BnMultiplyByFraction,
|
||||
checkForError,
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
ENVIRONMENT_TYPE_FULLSCREEN,
|
||||
ENVIRONMENT_TYPE_BACKGROUND,
|
||||
} from '../../../shared/constants/app';
|
||||
import { getEnvironmentType, sufficientBalance } from './util';
|
||||
import { getEnvironmentType } from './util';
|
||||
|
||||
describe('app utils', function () {
|
||||
describe('getEnvironmentType', function () {
|
||||
@ -68,44 +68,6 @@ describe('app utils', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe('SufficientBalance', function () {
|
||||
it('returns true if max tx cost is equal to balance.', function () {
|
||||
const tx = {
|
||||
value: '0x1',
|
||||
gas: '0x2',
|
||||
gasPrice: '0x3',
|
||||
};
|
||||
const balance = '0x8';
|
||||
|
||||
const result = sufficientBalance(tx, balance);
|
||||
assert.ok(result, 'sufficient balance found.');
|
||||
});
|
||||
|
||||
it('returns true if max tx cost is less than balance.', function () {
|
||||
const tx = {
|
||||
value: '0x1',
|
||||
gas: '0x2',
|
||||
gasPrice: '0x3',
|
||||
};
|
||||
const balance = '0x9';
|
||||
|
||||
const result = sufficientBalance(tx, balance);
|
||||
assert.ok(result, 'sufficient balance found.');
|
||||
});
|
||||
|
||||
it('returns false if max tx cost is more than balance.', function () {
|
||||
const tx = {
|
||||
value: '0x1',
|
||||
gas: '0x2',
|
||||
gasPrice: '0x3',
|
||||
};
|
||||
const balance = '0x6';
|
||||
|
||||
const result = sufficientBalance(tx, balance);
|
||||
assert.ok(!result, 'insufficient balance found.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('isPrefixedFormattedHexString', function () {
|
||||
it('should return true for valid hex strings', function () {
|
||||
assert.equal(
|
||||
|
@ -24,6 +24,7 @@ import {
|
||||
CurrencyRateController,
|
||||
PhishingController,
|
||||
NotificationController,
|
||||
GasFeeController,
|
||||
} from '@metamask/controllers';
|
||||
import { TRANSACTION_STATUSES } from '../../shared/constants/transaction';
|
||||
import { MAINNET_CHAIN_ID } from '../../shared/constants/network';
|
||||
@ -73,6 +74,16 @@ export const METAMASK_CONTROLLER_EVENTS = {
|
||||
UPDATE_BADGE: 'updateBadge',
|
||||
};
|
||||
|
||||
/**
|
||||
* Accounts can be instantiated from simple, HD or the two hardware wallet
|
||||
* keyring types. Both simple and HD are treated as default but we do special
|
||||
* case accounts managed by a hardware wallet.
|
||||
*/
|
||||
const KEYRING_TYPES = {
|
||||
LEDGER: 'Ledger Hardware',
|
||||
TREZOR: 'Trezor Hardware',
|
||||
};
|
||||
|
||||
export default class MetamaskController extends EventEmitter {
|
||||
/**
|
||||
* @constructor
|
||||
@ -164,6 +175,32 @@ export default class MetamaskController extends EventEmitter {
|
||||
initState: initState.MetaMetricsController,
|
||||
});
|
||||
|
||||
const gasFeeMessenger = controllerMessenger.getRestricted({
|
||||
name: 'GasFeeController',
|
||||
});
|
||||
|
||||
this.gasFeeController = new GasFeeController({
|
||||
interval: 10000,
|
||||
messenger: gasFeeMessenger,
|
||||
getProvider: () =>
|
||||
this.networkController.getProviderAndBlockTracker().provider,
|
||||
onNetworkStateChange: this.networkController.on.bind(
|
||||
this.networkController,
|
||||
NETWORK_EVENTS.NETWORK_DID_CHANGE,
|
||||
),
|
||||
getCurrentNetworkEIP1559Compatibility: this.networkController.getEIP1559Compatibility.bind(
|
||||
this.networkController,
|
||||
),
|
||||
getCurrentAccountEIP1559Compatibility: this.getCurrentAccountEIP1559Compatibility.bind(
|
||||
this,
|
||||
),
|
||||
getCurrentNetworkLegacyGasAPICompatibility: () =>
|
||||
this.networkController.getCurrentChainId() === MAINNET_CHAIN_ID,
|
||||
getChainId: this.networkController.getCurrentChainId.bind(
|
||||
this.networkController,
|
||||
),
|
||||
});
|
||||
|
||||
this.appStateController = new AppStateController({
|
||||
addUnlockListener: this.on.bind(this, 'unlock'),
|
||||
isUnlocked: this.isUnlocked.bind(this),
|
||||
@ -326,6 +363,12 @@ export default class MetamaskController extends EventEmitter {
|
||||
getPermittedAccounts: this.permissionsController.getAccounts.bind(
|
||||
this.permissionsController,
|
||||
),
|
||||
getProviderConfig: this.networkController.getProviderConfig.bind(
|
||||
this.networkController,
|
||||
),
|
||||
getEIP1559Compatibility: this.networkController.getEIP1559Compatibility.bind(
|
||||
this.networkController,
|
||||
),
|
||||
networkStore: this.networkController.networkStore,
|
||||
getCurrentChainId: this.networkController.getCurrentChainId.bind(
|
||||
this.networkController,
|
||||
@ -454,6 +497,7 @@ export default class MetamaskController extends EventEmitter {
|
||||
PermissionsMetadata: this.permissionsController.store,
|
||||
ThreeBoxController: this.threeBoxController.store,
|
||||
NotificationController: this.notificationController,
|
||||
GasFeeController: this.gasFeeController,
|
||||
});
|
||||
|
||||
this.memStore = new ComposableObservableStore({
|
||||
@ -485,6 +529,7 @@ export default class MetamaskController extends EventEmitter {
|
||||
EnsController: this.ensController.store,
|
||||
ApprovalController: this.approvalController,
|
||||
NotificationController: this.notificationController,
|
||||
GasFeeController: this.gasFeeController,
|
||||
},
|
||||
controllerMessenger,
|
||||
});
|
||||
@ -1011,6 +1056,17 @@ export default class MetamaskController extends EventEmitter {
|
||||
this.notificationController.updateViewed,
|
||||
this.notificationController,
|
||||
),
|
||||
|
||||
// GasFeeController
|
||||
getGasFeeEstimatesAndStartPolling: nodeify(
|
||||
this.gasFeeController.getGasFeeEstimatesAndStartPolling,
|
||||
this.gasFeeController,
|
||||
),
|
||||
|
||||
disconnectGasFeeEstimatePoller: nodeify(
|
||||
this.gasFeeController.disconnectPoller,
|
||||
this.gasFeeController,
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
@ -1786,7 +1842,7 @@ export default class MetamaskController extends EventEmitter {
|
||||
const keyring = await this.keyringController.getKeyringForAccount(address);
|
||||
|
||||
switch (keyring.type) {
|
||||
case 'Ledger Hardware': {
|
||||
case KEYRING_TYPES.LEDGER: {
|
||||
return new Promise((_, reject) => {
|
||||
reject(
|
||||
new Error('Ledger does not support eth_getEncryptionPublicKey.'),
|
||||
@ -1794,7 +1850,7 @@ export default class MetamaskController extends EventEmitter {
|
||||
});
|
||||
}
|
||||
|
||||
case 'Trezor Hardware': {
|
||||
case KEYRING_TYPES.TREZOR: {
|
||||
return new Promise((_, reject) => {
|
||||
reject(
|
||||
new Error('Trezor does not support eth_getEncryptionPublicKey.'),
|
||||
@ -1933,32 +1989,63 @@ export default class MetamaskController extends EventEmitter {
|
||||
cb(null, this.getState());
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to return a boolean if the keyring for the currently selected
|
||||
* account is a ledger or trezor keyring.
|
||||
* TODO: remove this method when Ledger and Trezor release their supported
|
||||
* client utilities for EIP-1559
|
||||
* @returns {boolean} true if the keyring type supports EIP-1559
|
||||
*/
|
||||
getCurrentAccountEIP1559Compatibility() {
|
||||
const selectedAddress = this.preferencesController.getSelectedAddress();
|
||||
const keyring = this.keyringController.getKeyringForAccount(
|
||||
selectedAddress,
|
||||
);
|
||||
return (
|
||||
keyring.type !== KEYRING_TYPES.LEDGER &&
|
||||
keyring.type !== KEYRING_TYPES.TREZOR
|
||||
);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
// END (VAULT / KEYRING RELATED METHODS)
|
||||
//=============================================================================
|
||||
|
||||
/**
|
||||
* Allows a user to attempt to cancel a previously submitted transaction by creating a new
|
||||
* transaction.
|
||||
* @param {number} originalTxId - the id of the txMeta that you want to attempt to cancel
|
||||
* @param {string} [customGasPrice] - the hex value to use for the cancel transaction
|
||||
* Allows a user to attempt to cancel a previously submitted transaction
|
||||
* by creating a new transaction.
|
||||
* @param {number} originalTxId - the id of the txMeta that you want to
|
||||
* attempt to cancel
|
||||
* @param {import(
|
||||
* './controllers/transactions'
|
||||
* ).CustomGasSettings} [customGasSettings] - overrides to use for gas params
|
||||
* instead of allowing this method to generate them
|
||||
* @returns {Object} MetaMask state
|
||||
*/
|
||||
async createCancelTransaction(originalTxId, customGasPrice, customGasLimit) {
|
||||
async createCancelTransaction(originalTxId, customGasSettings) {
|
||||
await this.txController.createCancelTransaction(
|
||||
originalTxId,
|
||||
customGasPrice,
|
||||
customGasLimit,
|
||||
customGasSettings,
|
||||
);
|
||||
const state = await this.getState();
|
||||
return state;
|
||||
}
|
||||
|
||||
async createSpeedUpTransaction(originalTxId, customGasPrice, customGasLimit) {
|
||||
/**
|
||||
* Allows a user to attempt to speed up a previously submitted transaction
|
||||
* by creating a new transaction.
|
||||
* @param {number} originalTxId - the id of the txMeta that you want to
|
||||
* attempt to speed up
|
||||
* @param {import(
|
||||
* './controllers/transactions'
|
||||
* ).CustomGasSettings} [customGasSettings] - overrides to use for gas params
|
||||
* instead of allowing this method to generate them
|
||||
* @returns {Object} MetaMask state
|
||||
*/
|
||||
async createSpeedUpTransaction(originalTxId, customGasSettings) {
|
||||
await this.txController.createSpeedUpTransaction(
|
||||
originalTxId,
|
||||
customGasPrice,
|
||||
customGasLimit,
|
||||
customGasSettings,
|
||||
);
|
||||
const state = await this.getState();
|
||||
return state;
|
||||
|
@ -21,6 +21,11 @@ const firstTimeState = {
|
||||
rpcUrl: 'http://localhost:8545',
|
||||
chainId: '0x539',
|
||||
},
|
||||
networkDetails: {
|
||||
EIPS: {
|
||||
1559: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|