aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md3
-rw-r--r--app/_locales/en/messages.json184
-rw-r--r--app/_locales/fr/messages.json749
-rw-r--r--app/_locales/ht/messages.json3
-rw-r--r--app/_locales/ja/messages.json7
-rw-r--r--app/_locales/ko/messages.json3
-rw-r--r--app/scripts/background.js9
-rw-r--r--app/scripts/controllers/transactions/index.js1
-rw-r--r--app/scripts/lib/ipfsContent.js2
-rw-r--r--app/scripts/lib/message-manager.js2
-rw-r--r--app/scripts/lib/personal-message-manager.js2
-rw-r--r--app/scripts/metamask-controller.js4
-rw-r--r--development/verify-locale-strings.js5
-rw-r--r--docs/porting_to_new_environment.md2
-rw-r--r--docs/state_dump.md2
-rw-r--r--docs/translating-guide.md2
-rw-r--r--test/integration/lib/tx-list-items.js4
-rw-r--r--test/lib/mock-encryptor.js2
-rw-r--r--test/unit/app/controllers/metamask-controller-test.js2
-rw-r--r--test/unit/components/binary-renderer-test.js2
-rw-r--r--test/unit/development/sample-changelog.md4
-rw-r--r--ui/app/components/dropdowns/token-menu-dropdown.js9
-rw-r--r--ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js54
-rw-r--r--ui/app/components/pages/confirm-add-token/confirm-add-token.component.js46
-rw-r--r--ui/app/components/pages/keychains/reveal-seed.js28
-rw-r--r--ui/app/components/transaction-action/tests/transaction-action.component.test.js81
-rw-r--r--ui/app/components/transaction-action/transaction-action.component.js10
-rw-r--r--ui/app/helpers/common.util.js5
-rw-r--r--ui/app/helpers/tests/common.util.test.js27
-rw-r--r--ui/app/helpers/transactions.util.js8
-rw-r--r--ui/app/selectors/confirm-transaction.js7
-rw-r--r--ui/app/selectors/transactions.js2
32 files changed, 1014 insertions, 257 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fd41a559..aef455127 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
## Current Develop Branch
+- Update transaction statuses when switching networks.
+- [#5470](https://github.com/MetaMask/metamask-extension/pull/5470) 100% coverage in French locale, fixed the procedure to verify proposed locale.
+
## 4.12.0 Thursday September 27 2018
- Reintroduces changes from 4.10.0
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 89abb0e76..66f378ab8 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -3,7 +3,7 @@
"message": "Accept"
},
"accessingYourCamera": {
- "message": "Accesing your camera..."
+ "message": "Accessing your camera..."
},
"account": {
"message": "Account"
@@ -65,7 +65,7 @@
"message": "Attempt to Cancel?"
},
"attemptToCancelDescription": {
- "message": "Attempting to cancel does not guarantee your original transaction will be cancelled. If cancelled, you are still required to pay a transaction fee to the network."
+ "message": "Submitting this attempt does not guarantee your original transaction will be cancelled. If the cancellation attempt is successful, you will be charged the transaction fee above."
},
"attributions": {
"message": "Attributions"
@@ -99,7 +99,7 @@
"message": "Borrow With Dharma (Beta)"
},
"browserNotSupported": {
- "message": "Your Browser is not supported..."
+ "message": "Your Browser is not supported..."
},
"builtInCalifornia": {
"message": "MetaMask is designed and built in California."
@@ -167,6 +167,21 @@
"connecting": {
"message": "Connecting..."
},
+ "connectingToKovan": {
+ "message": "Connecting to Kovan Test Network"
+ },
+ "connectingToMainnet": {
+ "message": "Connecting to Main Ethereum Network"
+ },
+ "connectingToRopsten": {
+ "message": "Connecting to Ropsten Test Network"
+ },
+ "connectingToRinkeby": {
+ "message": "Connecting to Rinkeby Test Network"
+ },
+ "connectingToUnknown": {
+ "message": "Connecting to Unknown Network"
+ },
"connectToLedger": {
"message": "Connect to Ledger"
},
@@ -200,9 +215,6 @@
"copy": {
"message": "Copy"
},
- "copyContractAddress": {
- "message": "Copy Contract Address"
- },
"copyAddress": {
"message": "Copy address to clipboard"
},
@@ -237,6 +249,9 @@
"currentNetwork": {
"message": "Current Network"
},
+ "currentRpc": {
+ "message": "Current RPC"
+ },
"customGas": {
"message": "Customize Gas"
},
@@ -343,15 +358,6 @@
"enterPasswordContinue": {
"message": "Enter password to continue"
},
- "parameters": {
- "message": "Parameters"
- },
- "passwordNotLongEnough": {
- "message": "Password not long enough"
- },
- "passwordsDontMatch": {
- "message": "Passwords Don't Match"
- },
"etherscanView": {
"message": "View account on Etherscan"
},
@@ -507,6 +513,9 @@
"importUsingSeed": {
"message": "Import using account seed phrase"
},
+ "info": {
+ "message": "Info"
+ },
"infoHelp": {
"message": "Info & Help"
},
@@ -535,7 +544,7 @@
"message": "Invalid Request"
},
"invalidRPC": {
- "message": "Invalid RPC URI"
+ "message": "Invalid RPC URL"
},
"invalidSeedPhrase": {
"message": "Invalid seed phrase"
@@ -659,6 +668,9 @@
"newPassword": {
"message": "New Password (min 8 chars)"
},
+ "newPassword8Chars": {
+ "message": "New Password (min 8 chars)"
+ },
"newRecipient": {
"message": "New Recipient"
},
@@ -701,6 +713,13 @@
"oldUIMessage": {
"message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu."
},
+ "onlySendToEtherAddress": {
+ "message": "Only send ETH to an Ethereum address."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Only send $1 to an Ethereum account address.",
+ "description": "displays token symbol"
+ },
"openInTab": {
"message": "Open in tab"
},
@@ -708,9 +727,24 @@
"message": "or",
"description": "choice between creating or importing a new account"
},
+ "orderOneHere": {
+ "message": "Order a Trezor or Ledger and keep your funds in cold storage"
+ },
"origin": {
"message": "Origin"
},
+ "outgoing": {
+ "message": "Outgoing"
+ },
+ "parameters": {
+ "message": "Parameters"
+ },
+ "passwordNotLongEnough": {
+ "message": "Password not long enough"
+ },
+ "passwordsDontMatch": {
+ "message": "Passwords Don't Match"
+ },
"password": {
"message": "Password"
},
@@ -868,24 +902,6 @@
"rpc": {
"message": "Custom RPC"
},
- "currentRpc": {
- "message": "Current RPC"
- },
- "connectingToMainnet": {
- "message": "Connecting to Main Ethereum Network"
- },
- "connectingToRopsten": {
- "message": "Connecting to Ropsten Test Network"
- },
- "connectingToKovan": {
- "message": "Connecting to Kovan Test Network"
- },
- "connectingToRinkeby": {
- "message": "Connecting to Rinkeby Test Network"
- },
- "connectingToUnknown": {
- "message": "Connecting to Unknown Network"
- },
"sampleAccountName": {
"message": "E.g. My new account",
"description": "Help user understand concept of adding a human-readable name to their account"
@@ -893,15 +909,6 @@
"save": {
"message": "Save"
},
- "speedUp": {
- "message": "speed up"
- },
- "speedUpTitle": {
- "message": "Speed Up Transaction"
- },
- "speedUpSubtitle": {
- "message": "Increase your gas price to attempt to overwrite and speed up your transaction"
- },
"saveAsCsvFile": {
"message": "Save as CSV File"
},
@@ -912,6 +919,12 @@
"saveSeedAsFile": {
"message": "Save Seed Words As File"
},
+ "scanInstructions": {
+ "message": "Place the QR code in front of your camera"
+ },
+ "scanQrCode": {
+ "message": "Scan QR Code"
+ },
"search": {
"message": "Search"
},
@@ -921,15 +934,6 @@
"secretPhrase": {
"message": "Enter your secret twelve word phrase here to restore your vault."
},
- "showHexData": {
- "message": "Show Hex Data"
- },
- "showHexDataDescription": {
- "message": "Select this to show the hex data field on the send screen"
- },
- "newPassword8Chars": {
- "message": "New Password (min 8 chars)"
- },
"seedPhraseReq": {
"message": "Seed phrases are 12 words long"
},
@@ -966,19 +970,6 @@
"separateEachWord": {
"message": "Separate each word with a single space"
},
- "onlySendToEtherAddress": {
- "message": "Only send ETH to an Ethereum address."
- },
- "onlySendTokensToAccountAddress": {
- "message": "Only send $1 to an Ethereum account address.",
- "description": "displays token symbol"
- },
- "orderOneHere": {
- "message": "Order a Trezor or Ledger and keep your funds in cold storage"
- },
- "outgoing": {
- "message": "Outgoing"
- },
"searchTokens": {
"message": "Search Tokens"
},
@@ -1003,33 +994,6 @@
"settings": {
"message": "Settings"
},
- "step1HardwareWallet": {
- "message": "1. Connect Hardware Wallet"
- },
- "step1HardwareWalletMsg": {
- "message": "Connect your hardware wallet directly to your computer."
- },
- "step2HardwareWallet": {
- "message": "2. Select an Account"
- },
- "step2HardwareWalletMsg": {
- "message": "Select the account you want to view. You can only choose one at a time."
- },
- "step3HardwareWallet": {
- "message": "3. Start using dApps and more!"
- },
- "step3HardwareWalletMsg": {
- "message": "Use your hardware account like you would with any Ethereum account. Log in to dApps, send Eth, buy and store ERC20 tokens and Non-Fungible tokens like CryptoKitties."
- },
- "info": {
- "message": "Info"
- },
- "scanInstructions": {
- "message": "Place the QR code in front of your camera"
- },
- "scanQrCode": {
- "message": "Scan QR Code"
- },
"shapeshiftBuy": {
"message": "Buy with Shapeshift"
},
@@ -1039,6 +1003,12 @@
"showQRCode": {
"message": "Show QR Code"
},
+ "showHexData": {
+ "message": "Show Hex Data"
+ },
+ "showHexDataDescription": {
+ "message": "Select this to show the hex data field on the send screen"
+ },
"sign": {
"message": "Sign"
},
@@ -1063,6 +1033,15 @@
"spaceBetween": {
"message": "there can only be a space between words"
},
+ "speedUp": {
+ "message": "speed up"
+ },
+ "speedUpTitle": {
+ "message": "Speed Up Transaction"
+ },
+ "speedUpSubtitle": {
+ "message": "Increase your gas price to attempt to overwrite and speed up your transaction"
+ },
"status": {
"message": "Status"
},
@@ -1075,6 +1054,24 @@
"stateLogError": {
"message": "Error in retrieving state logs."
},
+ "step1HardwareWallet": {
+ "message": "1. Connect Hardware Wallet"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Connect your hardware wallet directly to your computer."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Select an Account"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Select the account you want to view. You can only choose one at a time."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Start using dApps and more!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Use your hardware account like you would with any Ethereum account. Log in to dApps, send Eth, buy and store ERC20 tokens and Non-Fungible tokens like CryptoKitties."
+ },
"submit": {
"message": "Submit"
},
@@ -1166,6 +1163,9 @@
"transfer": {
"message": "Transfer"
},
+ "transferFrom": {
+ "message": "Transfer From"
+ },
"transfers": {
"message": "Transfers"
},
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index 6f850d89b..55a7582ce 100644
--- a/app/_locales/fr/messages.json
+++ b/app/_locales/fr/messages.json
@@ -2,6 +2,9 @@
"accept": {
"message": "Accepter"
},
+ "accessingYourCamera": {
+ "message": "Accès à votre appareil photo..."
+ },
"account": {
"message": "Compte"
},
@@ -11,12 +14,30 @@
"accountName": {
"message": "Nom du compte"
},
+ "accountSelectionRequired": {
+ "message": "Vous devez selectionner un compte !"
+ },
+ "activityLog": {
+ "message": "Log d'activité"
+ },
"address": {
"message": "Adresse"
},
+ "addCustomToken": {
+ "message": "Ajouter un jeton personnalisé"
+ },
"addToken": {
"message": "Ajouter un jeton"
},
+ "addTokens": {
+ "message": "Ajouter des jetons"
+ },
+ "addSuggestedTokens": {
+ "message": "Ajouter les jetons suggérés"
+ },
+ "addAcquiredTokens": {
+ "message": "Ajouter les jetons que vous avez acquis par l'intermédiaire de MetaMask"
+ },
"amount": {
"message": "Montant"
},
@@ -31,8 +52,23 @@
"message": "MetaMask",
"description": "Le nom de l'application"
},
+ "approve": {
+ "message": "Approuver"
+ },
+ "approved": {
+ "message": "Approuvé"
+ },
"attemptingConnect": {
- "message": "Tentative de connexion à blockchain."
+ "message": "Tentative de connexion au réseau"
+ },
+ "attemptToCancel": {
+ "message": "Tenter d'annuler ?"
+ },
+ "attemptToCancelDescription": {
+ "message": "Faire une demande d'annulation ne garantit pas que votre transaction originale sera bien annulée. Dans le cas où l'annulation réussit, vous payerez les frais de transaction indiqués ci-dessus."
+ },
+ "attributions": {
+ "message": "Attributions"
},
"available": {
"message": "Disponible"
@@ -43,6 +79,9 @@
"balance": {
"message": "Balance:"
},
+ "balances": {
+ "message": "Balance(s) de(s) jeton(s)"
+ },
"balanceIsInsufficientGas": {
"message": "Solde insuffisant pour le total actuel de gaz"
},
@@ -53,9 +92,18 @@
"message": "doit être supérieur ou égal à $1 et inférieur ou égal à $2",
"description": "helper pour la saisie hexadécimale en entrée décimale"
},
+ "blockiesIdenticon": {
+ "message": "Utiliser les Identicon Blockies"
+ },
"borrowDharma": {
"message": "Emprunter avec Dharma (Bêta)"
},
+ "browserNotSupported": {
+ "message": "Votre navigateur internet n'est pas supporté..."
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask est designé et developpé en Californie."
+ },
"buy": {
"message": "Acheter"
},
@@ -63,17 +111,44 @@
"message": "Acheter sur Coinbase"
},
"buyCoinbaseExplainer": {
- "message": "Coinbase est le moyen le plus populaire au monde d'acheter et de vendre du Bitcoin, de l'Ethereum et du Litecoin."
+ "message": "Coinbase est le moyen le plus populaire d'acheter et de vendre des Ethers."
+ },
+ "bytes": {
+ "message": "Bytes"
+ },
+ "ok": {
+ "message": "Ok"
},
"cancel": {
"message": "Annuler"
},
+ "cancelAttempt": {
+ "message": "Annuler la tentative."
+ },
+ "cancellationGasFee": {
+ "message": "Frais en gas de l'annulation"
+ },
+ "cancelN": {
+ "message": "Annuler toutes les transactions $1"
+ },
+ "classicInterface": {
+ "message": "Utiliser l'interface classique"
+ },
"clickCopy": {
"message": "Cliquer pour copier"
},
+ "close": {
+ "message": "Fermer"
+ },
+ "chromeRequiredForHardwareWallets":{
+ "message": "Pour connecter votre portefeuille hardware, vous devez utiliser MetaMask pour Google Chrome."
+ },
"confirm": {
"message": "Confirmer"
},
+ "confirmed": {
+ "message": "Confirmé"
+ },
"confirmContract": {
"message": "Confirmer le contrat"
},
@@ -83,6 +158,39 @@
"confirmTransaction": {
"message": "Confirmer la transaction"
},
+ "connectHardwareWallet": {
+ "message": "Connecter un portefeuille hardware"
+ },
+ "connect": {
+ "message": "Connecter"
+ },
+ "connecting": {
+ "message": "Connection..."
+ },
+ "connectingToKovan": {
+ "message": "Connection au réseau de test Kovan"
+ },
+ "connectingToMainnet": {
+ "message": "Connection au Réseau principal Ethereum"
+ },
+ "connectingToRopsten": {
+ "message": "Connection au réseau de test Ropsten"
+ },
+ "connectingToRinkeby": {
+ "message": "Connection au réseau de test Rinkeby"
+ },
+ "connectingToUnknown": {
+ "message": "Connection à un réseau inconnu"
+ },
+ "connectToLedger": {
+ "message": "Connecter un Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Connecter un Trezor"
+ },
+ "continue": {
+ "message": "Continuer"
+ },
"continueToCoinbase": {
"message": "Continuer vers Coinbase"
},
@@ -101,9 +209,15 @@
"copiedExclamation": {
"message": "Copié!"
},
+ "copiedSafe": {
+ "message": "Copié de manière sécurisé"
+ },
"copy": {
"message": "Copier"
},
+ "copyAddress": {
+ "message": "Copier l'addresse dans le presse-papier"
+ },
"copyToClipboard": {
"message": "Copier dans le presse-papier"
},
@@ -120,14 +234,29 @@
"message": "Créer un compte"
},
"createDen": {
- "message": "Créer"
+ "message": "Créer un antre"
},
"crypto": {
"message": "Crypto",
"description": "Type d'échange (cryptocurrencies)"
},
+ "currentConversion": {
+ "message": "Conversion actuelle"
+ },
+ "currentLanguage": {
+ "message": "Langue actuelle"
+ },
+ "currentNetwork": {
+ "message": "Réseau actuel"
+ },
+ "currentRpc": {
+ "message": "RPC Actuel"
+ },
"customGas": {
- "message": "Personnaliser le Gaz"
+ "message": "Personnaliser le gaz"
+ },
+ "customToken": {
+ "message": "Jeton personnalisé"
},
"customize": {
"message": "Personnaliser"
@@ -135,39 +264,45 @@
"customRPC": {
"message": "RPC personnalisé"
},
+ "decimalsMustZerotoTen": {
+ "message": "Les décimales doivent être plus grandes que 0 et inférieures à 36."
+ },
+ "decimal": {
+ "message": "Décimales de précision"
+ },
"defaultNetwork": {
- "message": "Le réseau par défaut pour les transactions Ether est Main Net."
+ "message": "Le réseau par défaut pour les transactions Ether est le \"Réseau principal Ethereum\"."
},
"denExplainer": {
"message": "Votre DEN est votre stockage crypté par mot de passe dans MetaMask."
},
"deposit": {
- "message": "Dépôt"
+ "message": "Déposer"
},
"depositBTC": {
"message": "Déposez vos BTC à l'adresse ci-dessous:"
},
"depositCoin": {
- "message": "Déposez votre $1 à l'adresse ci-dessous",
- "description": "Indique à l'utilisateur quelle monnaie il a choisi de déposer avec shapeshift"
+ "message": "Déposer votre $1 à l'adresse ci-dessous",
+ "description": "Indique à l'utilisateur quelle monnaie il a choisi de déposer avec Shapeshift"
},
"depositEth": {
- "message": "Dépôt Eth"
+ "message": "Déposer Eth"
},
"depositEther": {
- "message": "Dépôt Ether"
+ "message": "Déposer de l'Ether"
},
"depositFiat": {
- "message": "Dépôt de monnaie-fiat"
+ "message": "Déposer de la monnaie-fiat"
},
"depositFromAccount": {
- "message": "Dépôt d'un autre compte"
+ "message": "Déposer depuis un autre compte"
},
"depositShapeShift": {
- "message": "Déposez avec ShapeShift"
+ "message": "Déposer avec ShapeShift"
},
"depositShapeShiftExplainer": {
- "message": "Si vous possédez d'autres crypto-monnaies, vous pouvez échanger et déposer de l'Ether directement dans votre portefeuille MetaMask. Aucun compte n'est requis."
+ "message": "Si vous possédez d'autres crypto-monnaies, vous pouvez échanger et déposer de l'Ether directement dans votre portefeuille MetaMask via Shapeshift. Aucun compte n'est requis."
},
"details": {
"message": "Détails"
@@ -182,7 +317,19 @@
"message": "Si vous avez déjà de l'Ether, le moyen le plus rapide d'obtenir des Ether dans votre nouveau portefeuille est par dépôt direct."
},
"done": {
- "message": "Fait"
+ "message": "Terminé"
+ },
+ "downloadGoogleChrome": {
+ "message": "Télécharger Google Chrome"
+ },
+ "downloadStateLogs": {
+ "message": "Télécharger les Logs d'état"
+ },
+ "dontHaveAHardwareWallet": {
+ "message": "Vous n'avez pas de portefeuille hardware ?"
+ },
+ "dropped": {
+ "message": "Déconnecté"
},
"edit": {
"message": "Modifier"
@@ -190,12 +337,27 @@
"editAccountName": {
"message": "Modifier le nom du compte"
},
+ "editingTransaction": {
+ "message": "Modifier votre transaction"
+ },
+ "emailUs": {
+ "message": "Envoyez-nous un email !"
+ },
"encryptNewDen": {
"message": "Chiffrer votre nouveau DEN"
},
+ "ensNameNotFound": {
+ "message": "Nom ENS inconnu"
+ },
"enterPassword": {
"message": "Entrer le mot de passe"
},
+ "enterPasswordConfirm": {
+ "message": "Enter your password to confirm"
+ },
+ "enterPasswordContinue": {
+ "message": "Enter password to continue"
+ },
"etherscanView": {
"message": "Afficher le compte sur Etherscan"
},
@@ -219,30 +381,45 @@
"message": "L'importation de fichier ne fonctionne pas? Cliquez ici!",
"description": "Aide l'utilisateur à importer son compte à partir d'un fichier JSON"
},
+ "followTwitter": {
+ "message": "Suivez-nous sur Twitter"
+ },
+ "forgetDevice": {
+ "message": "Oublier cet appareil"
+ },
"from": {
"message": "de"
},
+ "fromToSame": {
+ "message": "Les addresses d'origine et de destination doivent être différentes"
+ },
"fromShapeShift": {
- "message": "ShapeShift de"
+ "message": "de ShapeShift"
+ },
+ "functionType": {
+ "message": "Type de fonction"
},
"gas": {
"message": "Gas",
- "description": "Indication courte du coût du gaz"
+ "description": "Indication brève du coût du gaz"
},
"gasFee": {
- "message": "Frais de gaz"
+ "message": "Coût en gaz"
},
"gasLimit": {
- "message": "Limite de gaz"
+ "message": "Quantité max. de gaz"
},
"gasLimitCalculation": {
- "message": "Nous calculons la limite de gaz suggérée en fonction des taux de réussite du réseau."
+ "message": "Nous calculons la quantité max. de gaz suggérée en fonction du code exécuté."
},
"gasLimitRequired": {
- "message": "Limite de gaz requise"
+ "message": "Quantité max. de gaz requise"
},
"gasLimitTooLow": {
- "message": "La limite de gaz doit être d'au moins 21000"
+ "message": "La quantité max. de gaz doit être d'au moins 21000"
+ },
+ "generatingSeed": {
+ "message": "Generation de la Seed..."
},
"gasPrice": {
"message": "Prix du gaz (GWEI)"
@@ -253,6 +430,9 @@
"gasPriceRequired": {
"message": "Prix du gaz requis"
},
+ "generatingTransaction": {
+ "message": "Préparation de la transaction"
+ },
"getEther": {
"message": "Obtenir des Ether"
},
@@ -260,14 +440,38 @@
"message": "Obtenir de l'Ether d'une faucet pour $1",
"description": "Affiche le nom du réseau pour la faucet d'Ether"
},
+ "getHelp": {
+ "message": "Obtenir de l'aide."
+ },
"greaterThanMin": {
"message": "doit être supérieur ou égal à $1.",
"description": "helper pour la saisie hexadécimale en entrée décimale"
},
+ "hardware": {
+ "message": "hardware"
+ },
+ "hardwareWalletConnected": {
+ "message": "Portefeuille hardware connecté"
+ },
+ "hardwareWallets": {
+ "message": "Connecter un portefeuille hardware"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Selectionnez le portefeuille hardware que vous voulez utiliser avec MetaMask"
+ },
+ "havingTroubleConnecting": {
+ "message": "Un problème de connection ?"
+ },
"here": {
"message": "ici",
"description": "comme dans -cliquer ici- pour plus d'informations (en rapport avec troubleTokenBalances)"
},
+ "hereList": {
+ "message": "Voici une liste !!!!"
+ },
+ "hexData": {
+ "message": "Data Hex"
+ },
"hide": {
"message": "Cacher"
},
@@ -277,15 +481,24 @@
"hideTokenPrompt": {
"message": "Masquer le jeton?"
},
+ "history": {
+ "message": "Historique"
+ },
"howToDeposit": {
"message": "Comment voulez-vous déposer de l'Ether?"
},
+ "holdEther": {
+ "message": "Cela vous permet de conserver vos Ethers et vos jetons afin d'utiliser directement des applications décentralisées."
+ },
"import": {
"message": "Importer",
"description": "Bouton pour importer un compte à partir d'un fichier sélectionné"
},
"importAccount": {
- "message": "Importer compte"
+ "message": "Importer un compte"
+ },
+ "importAccountMsg": {
+ "message":" Les comptes importés ne seront pas associés avec votre phrase Seed que vous avez créé au départ dans MetaMask. Obtenir plus d'information sur les comptes importés"
},
"importAnAccount": {
"message": "Importer un compte"
@@ -297,32 +510,80 @@
"message": "Importé",
"description": "statut indiquant qu'un compte a été entièrement chargé dans le trousseau de clés"
},
+ "importUsingSeed": {
+ "message": "Importer à partir de la phrase Seed du compte"
+ },
+ "info": {
+ "message": "Info"
+ },
"infoHelp": {
"message": "Info & Aide"
},
+ "initialTransactionConfirmed": {
+ "message": "Votre transaction initiale a été confirmée par le réseau. Cliquez sur OK pour retourner à l'écran précédent."
+ },
+ "insufficientFunds": {
+ "message": "Insufficient funds."
+ },
+ "insufficientTokens": {
+ "message": "Insufficient tokens."
+ },
"invalidAddress": {
"message": "Adresse invalide"
},
+ "invalidAddressRecipient": {
+ "message": "L'adresse du destinataire n'est pas valide"
+ },
"invalidGasParams": {
"message": "Paramètres de gaz invalides"
},
"invalidInput": {
- "message": "Entrée non valide."
+ "message": "Saisie non valide."
},
"invalidRequest": {
"message": "Requête invalide"
},
+ "invalidRPC": {
+ "message": "URL RPC invalide"
+ },
+ "invalidSeedPhrase": {
+ "message": "Phrase Seed invalide"
+ },
+ "jsonFail": {
+ "message": "Il y a eu un problème. Veuillez vérifier que votre fichier json a le bon format."
+ },
"jsonFile": {
"message": "Fichier JSON",
"description": "format d'importation d'un compte"
},
+ "keepTrackTokens": {
+ "message": "Garder la trace des jetons que vous avez acheté avec votre compte MetaMask."
+ },
"kovan": {
"message": "Réseau de test Kovan"
},
+ "knowledgeDataBase": {
+ "message": "Visitez notre base de connaissances"
+ },
+ "max": {
+ "message": "Max"
+ },
+ "learnMore": {
+ "message": "En savoir plus"
+ },
+ "ledgerAccountRestriction": {
+ "message": "Vous devez d'abord utiliser le dernier compte que vous avez créé avant de pouvoir en créer un autre."
+ },
"lessThanMax": {
"message": "doit être inférieur ou égal à $1.",
"description": "helper pour la saisie hexadécimale en entrée décimale"
},
+ "likeToAddTokens": {
+ "message": "Souhaitez-vous ajouter ces jetons ?"
+ },
+ "links": {
+ "message": "Liens"
+ },
"limit": {
"message": "Limite"
},
@@ -335,26 +596,47 @@
"localhost": {
"message": "Localhost 8545"
},
+ "login": {
+ "message": "Connexion"
+ },
"logout": {
"message": "Déconnexion"
},
"loose": {
"message": "Vacant"
},
+ "loweCaseWords": {
+ "message": "Les mots seed n'ont que des caractères en minuscules"
+ },
"mainnet": {
"message": "Réseau principal Ethereum"
},
+ "menu": {
+ "message": "Menu"
+ },
"message": {
"message": "Message"
},
+ "metamaskDescription": {
+ "message": "MetaMask est un coffre sécurisé pour votre identité sur Ethereum."
+ },
+ "metamaskSeedWords": {
+ "message": "Mots Seed pour MetaMask"
+ },
+ "metamaskVersion": {
+ "message": "Version de MetaMask"
+ },
"min": {
"message": "Minimum"
},
"myAccounts": {
"message": "Mes comptes"
},
+ "mustSelectOne": {
+ "message": "Vous devez selectionner au moins 1 jeton."
+ },
"needEtherInWallet": {
- "message": "Pour interagir avec des applications décentralisées à l'aide de MetaMask, vous aurez besoin d'Ether dans votre portefeuille."
+ "message": "Pour interagir avec des applications décentralisées à l'aide de MetaMask, vous avez besoin d'Ether dans votre portefeuille."
},
"needImportFile": {
"message": "Vous devez sélectionner un fichier à importer.",
@@ -364,9 +646,15 @@
"message": "Vous devez entrer un mot de passe pour le fichier sélectionné.",
"description": "Mot de passe et fichier requis pour importer un compte"
},
+ "negativeETH": {
+ "message": "Vous ne pouvez envoyer des montants négatifs d'ETH."
+ },
"networks": {
"message": "Réseaux"
},
+ "nevermind": {
+ "message": "Abandonner"
+ },
"newAccount": {
"message": "Nouveau compte"
},
@@ -380,9 +668,15 @@
"newPassword": {
"message": "Nouveau mot de passe (min 8 caractères)"
},
+ "newPassword8Chars": {
+ "message": "Nouveau mot de passe (min 8 caractères)"
+ },
"newRecipient": {
"message": "Nouveau destinataire"
},
+ "newRPC": {
+ "message": "Nouvelle URL RPC"
+ },
"next": {
"message": "Suivant"
},
@@ -392,31 +686,77 @@
"noDeposits": {
"message": "Aucun dépôt reçu"
},
+ "noConversionRateAvailable":{
+ "message": "Aucun taux de conversion disponible"
+ },
"noTransactionHistory": {
"message": "Aucun historique de transaction."
},
"noTransactions": {
"message": "Aucune transaction"
},
+ "notFound": {
+ "message": "Non trouvé"
+ },
"notStarted": {
"message": "Pas démarré"
},
+ "noWebcamFoundTitle": {
+ "message": "Webcam introuvable"
+ },
+ "noWebcamFound": {
+ "message": "La caméra de votre ordinateur n'a pas été trouvée. Veuillez réessayer."
+ },
"oldUI": {
"message": "Ancienne interface utilisateur"
},
"oldUIMessage": {
- "message": "Vous êtes revenu à l'ancienne interface utilisateur.Vous pouvez revenir à la nouvelle interface via l'option dans le menu déroulant en haut à droite."
+ "message": "Vous êtes revenu à l'ancienne interface utilisateur. Vous pouvez revenir à la nouvelle interface via l'option dans le menu déroulant en haut à droite."
+ },
+ "onlySendToEtherAddress": {
+ "message": "N'envoyez de l'Ether que sur une adresse Ethereum."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "N'envoyez des $1 que sur une adresse Ethereum.",
+ "description": "displays token symbol"
+ },
+ "openInTab": {
+ "message": "Ouvrir dans un onglet"
},
"or": {
"message": "ou",
"description": "choix entre la création ou l'importation d'un nouveau compte"
},
+ "orderOneHere": {
+ "message": "Commander un Trezor ou un Ledger et conserver vos fonds en \"cold storage\""
+ },
+ "origin": {
+ "message": "Origine"
+ },
+ "outgoing": {
+ "message": "Sortie"
+ },
+ "parameters": {
+ "message": "Paramètres"
+ },
+ "passwordNotLongEnough": {
+ "message": "Mot de passe trop court"
+ },
+ "passwordsDontMatch": {
+ "message": "Les mots de passe ne correspondent pas"
+ },
+ "password": {
+ "message": "Mot de passe"
+ },
+ "passwordCorrect": {
+ "message": "Veuillez vérifier votre mot de passe."
+ },
"passwordMismatch": {
"message": "les mots de passe ne correspondent pas",
- "description": "dans le processus de création de mot de passe, les deux nouveaux champs de mot de passe ne correspondent pas"
+ "description": "dans le processus de création de mot de passe, les deux mot de passe saisis ne sont pas identiques."
},
"passwordShort": {
- "message": "mot de passe pas assez long",
+ "message": "Mot de passe trop court",
"description": "dans le processus de création de mot de passe, le mot de passe n'est pas assez long pour être sécurisé"
},
"pastePrivateKey": {
@@ -426,9 +766,24 @@
"pasteSeed": {
"message": "Collez votre seed phrase ici!"
},
+ "pending": {
+ "message": "En attente"
+ },
+ "personalAddressDetected": {
+ "message": "Votre adresse personnelle a été détectée. Veuillez saisir à la place l'adresse du contrat du jeton."
+ },
"pleaseReviewTransaction": {
"message": "Veuillez vérifier votre transaction."
},
+ "popularTokens": {
+ "message": "Jetons populaires"
+ },
+ "prev": {
+ "message": "Préc."
+ },
+ "privacyMsg": {
+ "message": "Politique de Confidentialité"
+ },
"privateKey": {
"message": "Clé privée",
"description": "sélectionnez ce type de fichier à utiliser pour importer un compte"
@@ -442,12 +797,18 @@
"qrCode": {
"message": "Afficher le QR Code"
},
+ "queue": {
+ "message": "File d'attente"
+ },
"readdToken": {
- "message": "Vous pouvez ajouter ce jeton dans le futur en allant sur “Ajouter un jeton” dans le menu des options de votre compte."
+ "message": "Vous pourrez ajouter à nouveau ce jeton en allant sur “Ajouter un jeton” dans le menu des options de votre compte."
},
"readMore": {
"message": "En savoir plus ici."
},
+ "readMore2": {
+ "message": "En savoir plus."
+ },
"receive": {
"message": "Recevoir"
},
@@ -457,44 +818,176 @@
"refundAddress": {
"message": "Votre adresse de remboursement"
},
+ "reject": {
+ "message": "Rejeter"
+ },
+ "rejectAll": {
+ "message": "Tout rejeter"
+ },
+ "rejectTxsN": {
+ "message": "Rejeter les transactions $1"
+ },
+ "rejectTxsDescription": {
+ "message": "Vous êtes sur le point de rejetter en groupe les transactions $1."
+ },
"rejected": {
"message": "Rejeté"
},
+ "reset": {
+ "message": "Reinitialiser"
+ },
+ "resetAccount": {
+ "message": "Reinitialiser le compte"
+ },
+ "resetAccountDescription": {
+ "message": "Reinitialiser votre compte va effacer votre historique de transactions."
+ },
+ "restoreFromSeed": {
+ "message": "Restaurer le compte ?"
+ },
+ "restoreVault": {
+ "message": "Restaurer le Coffre"
+ },
+ "restoreAccountWithSeed": {
+ "message": "Restaurer votre compte avec une phrase Seed."
+ },
"required": {
"message": "Obligatoire"
},
"retryWithMoreGas": {
- "message": "Réessayez avec un prix plus élevé du gaz ici"
+ "message": "Réessayer avec un prix de gaz plus élevé"
+ },
+ "walletSeed": {
+ "message": "Seed du portefeuille"
+ },
+ "restore": {
+ "message": "Restaurer"
+ },
+ "revealSeedWords": {
+ "message": "Révéler les mots Seed"
+ },
+ "revealSeedWordsTitle": {
+ "message": "Phrase Seed"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Si jamais vous changez de navigateur ou d'ordinateur, vos aurez besoin de cette phrase seed pour accéder à vos comptes. Sauvegardez la quelque part de sûr et secret."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "Ne communiquez PAS cette phrase à quelqu'un !"
+ },
+ "revealSeedWordsWarning": {
+ "message": "Ces mots peuvent être utilisés pour voler tous vos comptes."
},
"revert": {
"message": "Rétablir"
},
+ "remove": {
+ "message": "Supprimer"
+ },
+ "removeAccount": {
+ "message": "Suprimer le compte"
+ },
+ "removeAccountDescription": {
+ "message": "Ce compte va être supprimé de votre portefeuille. Veuillez vérifier que vous avez la phrase Seed originale de ce compte ou la clé privée pour ce compte importé avant de continuer. Vous pouvez importer ou créer à nouveau des comptes à partir du menu des comptes."
+ },
+ "readyToConnect": {
+ "message": "Prêt à se connecter ?"
+ },
"rinkeby": {
"message": "Réseau de test Rinkeby"
},
"ropsten": {
"message": "Réseau de test Ropsten"
},
+ "rpc": {
+ "message": "RPC Personnalisé"
+ },
"sampleAccountName": {
- "message": "Par exemple mon nouveau compte",
+ "message": "Par exemple: \"mon nouveau compte\" ",
"description": "Aidez l'utilisateur à comprendre le concept d'ajout d'un nom lisible par un humain à son compte"
},
"save": {
"message": "Enregistrer"
},
+ "saveAsCsvFile": {
+ "message": "Enregistrer comme fichier CSV"
+ },
"saveAsFile": {
"message": "Enregistrer dans un fichier",
"description": "Processus d'exportation de compte"
},
+ "saveSeedAsFile": {
+ "message": "Enregistrer la phrase Seed dans un fichier"
+ },
+ "scanInstructions": {
+ "message": "Placez le QR code devant votre appareil photo"
+ },
+ "scanQrCode": {
+ "message": "Scannez le QR Code"
+ },
+ "search": {
+ "message": "Rechercher"
+ },
+ "searchResults": {
+ "message": "Resultats de la recherche"
+ },
+ "secretPhrase": {
+ "message": "Entrez vos 12 mots secrets de votre phrase Seed pour restaurer votre coffre."
+ },
+ "seedPhraseReq": {
+ "message": "Les phrases Seed sont composées de 12 mots"
+ },
+ "select": {
+ "message": "Selectionner"
+ },
+ "selectCurrency": {
+ "message": "Selectionner Devise"
+ },
+ "selectLocale": {
+ "message": "Selectionner la localisation"
+ },
"selectService": {
"message": "Sélectionner un service"
},
+ "selectType": {
+ "message": "Selectionner le type"
+ },
"send": {
"message": "Envoyer"
},
+ "sendETH": {
+ "message": "Envoyer des ETH"
+ },
"sendTokens": {
"message": "Envoyer des jetons"
},
+ "sentEther": {
+ "message": "Ether envoyé"
+ },
+ "sentTokens": {
+ "message": "Jetons envoyés"
+ },
+ "separateEachWord": {
+ "message": "Separez chaque mot avec un espace simple"
+ },
+ "searchTokens": {
+ "message": "Rechercher des jetons"
+ },
+ "selectAnAddress": {
+ "message": "Selectionner une adresse"
+ },
+ "selectAnAccount": {
+ "message": "Selectionner un compte"
+ },
+ "selectAnAccountHelp": {
+ "message": "Selectionner le compte à afficher dans MetaMask"
+ },
+ "selectHdPath": {
+ "message": "Selectioner le \"Path HD\""
+ },
+ "selectPathHelp": {
+ "message": "Si vos comptes Ledger n'apparaissent pas ci-dessous, essayez de selectionner le path \"Legacy (MEW / MyCrypto)\""
+ },
"sendTokensAnywhere": {
"message": "Envoyer des jetons à toute personne possédant un compte Ethereum"
},
@@ -510,9 +1003,21 @@
"showQRCode": {
"message": "Afficher le QR Code"
},
+ "showHexData": {
+ "message": "Afficher les données Hex"
+ },
+ "showHexDataDescription": {
+ "message": "Selectionner ici pour afficher le champs de données hex dans l'écran d'envoi"
+ },
"sign": {
"message": "Signer"
},
+ "signatureRequest": {
+ "message": "Demande de Signature"
+ },
+ "signed": {
+ "message": "Signé"
+ },
"signMessage": {
"message": "Signer le message"
},
@@ -525,17 +1030,68 @@
"sigRequested": {
"message": "Signature demandée"
},
+ "spaceBetween": {
+ "message": "il ne peut y avoir qu'un seul espace entre les mots"
+ },
+ "speedUp": {
+ "message": "accélérer"
+ },
+ "speedUpTitle": {
+ "message": "Accélérer la Transaction"
+ },
+ "speedUpSubtitle": {
+ "message": "Augmenter le prix du gas pour tenter de remplacer et d'accélérer votre transaction"
+ },
"status": {
"message": "Statut"
},
+ "stateLogs": {
+ "message": "Logs d'Etat"
+ },
+ "stateLogsDescription": {
+ "message": "Les logs d'Etat contiennent les adresses publiques de vos comptes et vos transactions envoyées."
+ },
+ "stateLogError": {
+ "message": "Erreur lors du chargement des logs d'Etat."
+ },
+ "step1HardwareWallet": {
+ "message": "1. Connecter le portefeuille hardware"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Connectez votre portefeuille hardware directement à votre ordinateur."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Selectionnez un compte"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Selectionnez le compte que vous voulez afficher. Vous ne pouvez en afficher qu'un seul à la fois."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Vous pouvez maintenant utiliser des dApps et autres... !"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Utilisez ce compte de votre portefeuille hardware comme n'importe quel compte Ethereum. Connectez vous à des dApps, envoyez de l'Eth, achetez et conservez des jetons ERC20 et Non-Fungible comme CryptoKitties."
+ },
"submit": {
"message": "Soumettre"
},
+ "submitted": {
+ "message": "Envoyé"
+ },
+ "supportCenter": {
+ "message": "Visitez notre centre d'aide"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "Le symbol doit avoir entre 0 et 10 caractères."
+ },
"takesTooLong": {
- "message": "Prend trop de temps?"
+ "message": "Cela prend trop de temps ?"
+ },
+ "terms": {
+ "message": "Conditions d'Utilisation"
},
"testFaucet": {
- "message": "Test Faucet"
+ "message": "Faucet Testnet"
},
"to": {
"message": "Destinataire"
@@ -544,25 +1100,88 @@
"message": "$1 à ETH via ShapeShift",
"description": "le système remplira le type de dépôt au début du message"
},
+ "token": {
+ "message": "Jeton"
+ },
+ "tokenAddress": {
+ "message": "Addresse du Jeton"
+ },
+ "tokenAlreadyAdded": {
+ "message": "Ce Jeton a déjà été ajouté."
+ },
"tokenBalance": {
- "message": "Votre solde de jeton est:"
+ "message": "Votre solde de jeton est :"
+ },
+ "tokenSelection": {
+ "message": "Recherchez des tokens or sélectionnez en parmi notre liste de jetons populaires."
+ },
+ "tokenSymbol": {
+ "message": "Symbole du Jeton"
+ },
+ "tokenWarning1": {
+ "message": "Garder la trace des jetons achetésvia MetaMask. Si vous en avez acheté avec un autre compte, ces jetons n'apparaîtront pas ici."
},
"total": {
"message": "Total"
},
+ "transaction": {
+ "message": "transaction"
+ },
+ "transactionConfirmed": {
+ "message": "Transaction confirmée sur $2."
+ },
+ "transactionCreated": {
+ "message": "Transaction crée avec une valeur de $1 sur $2."
+ },
+ "transactionWithNonce": {
+ "message": "Transaction $1"
+ },
+ "transactionDropped": {
+ "message": "Transaction abandonnée sur $2."
+ },
+ "transactionSubmitted": {
+ "message": "Transaction envoyée sur $2."
+ },
+ "transactionUpdated": {
+ "message": "Transaction mise à jour sur $2."
+ },
+ "transactionUpdatedGas": {
+ "message": "Transaction mise à jour avec un prix de gaz de $1 sur $2."
+ },
+ "transactions": {
+ "message": "transactions"
+ },
+ "transactionError": {
+ "message": "Erreur de Transaction. Une Exception a été rencontrée dans l'exécution du code du contrat."
+ },
"transactionMemo": {
"message": "Mémo de transaction (optionnel)"
},
"transactionNumber": {
"message": "Numéro de transaction"
},
+ "transfer": {
+ "message": "Transfert"
+ },
+ "transferFrom": {
+ "message": "Transfert Depuis"
+ },
"transfers": {
"message": "Transferts"
},
+ "trezorHardwareWallet": {
+ "message": "Portefeuille hardware TREZOR"
+ },
"troubleTokenBalances": {
- "message": "Nous avons eu du mal à charger votre balance de jetons, vous pouvez la consulter ",
+ "message": "Nous avons eu du mal à charger votre balance de jetons, vous pouvez la consulter ici :",
"description": "Suivi par un lien (ici) pour voir les soldes des jetons"
},
+ "tryAgain": {
+ "message": "Essayez à nouveau"
+ },
+ "twelveWords": {
+ "message": "Ces 12 mots sont la seule manière de restaurer vos comptes MetaMask.\nEnregistrez les quelquepart de sûr et secret."
+ },
"typePassword": {
"message": "Entrez votre mot de passe"
},
@@ -572,18 +1191,48 @@
"uiWelcomeMessage": {
"message": "Vous utilisez maintenant la nouvelle interface utilisateur MetaMask. Jetez un coup d'oeil, essayez de nouvelles fonctionnalités comme l'envoi de jetons, et faites-nous savoir si vous avez des problèmes."
},
+ "unapproved": {
+ "message": "Non autorisé"
+ },
"unavailable": {
"message": "Indisponible"
},
+ "units": {
+ "message": "unités"
+ },
"unknown": {
"message": "Inconnu"
},
+ "unknownFunction": {
+ "message": "Fonction inconnue"
+ },
"unknownNetwork": {
"message": "Réseau privé inconnu"
},
"unknownNetworkId": {
"message": "ID réseau inconnu"
},
+ "unknownQrCode": {
+ "message": "Erreur: Nous n'avons pas pu identifier le QR code"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Ooops ! Il y a eu un problème...."
+ },
+ "unknownCameraError": {
+ "message": "Une erreur s'est produite lors de l'accès à votre appareil photo. Veuillez reessayer..."
+ },
+ "unlock": {
+ "message": "Déverrouiller"
+ },
+ "unlockMessage": {
+ "message": "Le web décentralisé vous attend"
+ },
+ "updatedWithDate": {
+ "message": "Mis à jour $1"
+ },
+ "uriErrorMsg": {
+ "message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié."
+ },
"usaOnly": {
"message": "Etats-Unis seulement",
"description": "Utiliser cet échange est limité aux personnes à l'intérieur des Etats-Unis"
@@ -591,19 +1240,49 @@
"usedByClients": {
"message": "Utilisé par une variété de clients différents"
},
+ "useOldUI": {
+ "message": "Utiliser l'ancienne interface."
+ },
+ "validFileImport": {
+ "message": "Vous devez selectionner un fichier valide à importer."
+ },
+ "vaultCreated": {
+ "message": "Coffre créé"
+ },
"viewAccount": {
"message": "Afficher le compte"
},
+ "viewOnEtherscan": {
+ "message": "Voir sur Etherscan"
+ },
+ "visitWebSite": {
+ "message": "Visitez notre site web"
+ },
"warning": {
"message": "Avertissement"
},
+ "welcomeBack": {
+ "message": "Bienvenue à nouveau !"
+ },
+ "welcomeBeta": {
+ "message": "Bienvenue dans la Beta de MetaMask"
+ },
"whatsThis": {
"message": "Qu'est-ce que c'est?"
},
+ "yesLetsTry": {
+ "message": "Oui, essayons"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Vous devez autoriser l'accès à votre appareil pour utiliser cette fonctionnalité."
+ },
"yourSigRequested": {
"message": "Votre signature est demandée"
},
"youSign": {
"message": "Vous signez"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "Votre phrase Seed privée"
}
}
diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json
index 2b9c93d3f..50a0ec2bb 100644
--- a/app/_locales/ht/messages.json
+++ b/app/_locales/ht/messages.json
@@ -185,9 +185,6 @@
"copy": {
"message": "Kopye"
},
- "copyContractAddress": {
- "message": "Kopi Kontra Adrès"
- },
"copyAddress": {
"message": "Kopi adrès clipboard"
},
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index c9d192139..2088ae270 100644
--- a/app/_locales/ja/messages.json
+++ b/app/_locales/ja/messages.json
@@ -16,7 +16,7 @@
},
"addCustomToken": {
"message": "カスタムトークンを追加"
- },
+ },
"addToken": {
"message": "トークンを追加"
},
@@ -122,9 +122,6 @@
"copy": {
"message": "コピー"
},
- "copyContractAddress": {
- "message": "コントラクトアドレスをコピー"
- },
"copyToClipboard": {
"message": "クリップボードへコピー"
},
@@ -164,7 +161,7 @@
},
"decimal": {
"message": "小数点桁数"
- },
+ },
"defaultNetwork": {
"message": "デフォルトのEther送受信ネットワークはメインネットです。"
},
diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json
index 30d032357..754aeca6e 100644
--- a/app/_locales/ko/messages.json
+++ b/app/_locales/ko/messages.json
@@ -146,9 +146,6 @@
"copy": {
"message": "복사"
},
- "copyContractAddress": {
- "message": "컨트랙트 주소 복사"
- },
"copyToClipboard": {
"message": "클립보드로 복사"
},
diff --git a/app/scripts/background.js b/app/scripts/background.js
index ae450352e..0343e134c 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -38,7 +38,6 @@ const {
const firstTimeState = Object.assign({}, rawFirstTimeState, global.METAMASK_TEST_CONFIG)
const STORAGE_KEY = 'metamask-config'
-const METAMASK_DEBUG = process.env.METAMASK_DEBUG
log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn')
@@ -462,11 +461,3 @@ function showWatchAssetUi () {
}
)
}
-
-// On first install, open a window to MetaMask website to how-it-works.
-extension.runtime.onInstalled.addListener(function (details) {
- if ((details.reason === 'install') && (!METAMASK_DEBUG)) {
- extension.tabs.create({url: 'https://metamask.io/#how-it-works'})
- }
-})
-
diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index e2965ceb6..ebd49f882 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -530,6 +530,7 @@ class TransactionController extends EventEmitter {
Updates the memStore in transaction controller
*/
_updateMemstore () {
+ this.pendingTxTracker.updatePendingTxs()
const unapprovedTxs = this.txStateManager.getUnapprovedTxList()
const selectedAddressTxList = this.txStateManager.getFilteredTxList({
from: this.getSelectedAddress(),
diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js
index 62a808b90..8b08453c4 100644
--- a/app/scripts/lib/ipfsContent.js
+++ b/app/scripts/lib/ipfsContent.js
@@ -36,7 +36,7 @@ module.exports = function (provider) {
return { cancel: true }
}
- extension.webRequest.onErrorOccurred.addListener(ipfsContent, {urls: ['*://*.eth/']})
+ extension.webRequest.onErrorOccurred.addListener(ipfsContent, {urls: ['*://*.eth/'], types: ['main_frame']})
return {
remove () {
diff --git a/app/scripts/lib/message-manager.js b/app/scripts/lib/message-manager.js
index 47925b94b..e86629590 100644
--- a/app/scripts/lib/message-manager.js
+++ b/app/scripts/lib/message-manager.js
@@ -272,6 +272,6 @@ function normalizeMsgData (data) {
return data
} else {
// data is unicode, convert to hex
- return ethUtil.bufferToHex(new Buffer(data, 'utf8'))
+ return ethUtil.bufferToHex(Buffer.from(data, 'utf8'))
}
}
diff --git a/app/scripts/lib/personal-message-manager.js b/app/scripts/lib/personal-message-manager.js
index fc2cccdf1..fdb94f5ec 100644
--- a/app/scripts/lib/personal-message-manager.js
+++ b/app/scripts/lib/personal-message-manager.js
@@ -285,7 +285,7 @@ module.exports = class PersonalMessageManager extends EventEmitter {
log.debug(`Message was not hex encoded, interpreting as utf8.`)
}
- return ethUtil.bufferToHex(new Buffer(data, 'utf8'))
+ return ethUtil.bufferToHex(Buffer.from(data, 'utf8'))
}
}
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index a59be7744..493877345 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -556,6 +556,8 @@ module.exports = class MetamaskController extends EventEmitter {
}
await this.preferencesController.syncAddresses(accounts)
+ await this.balancesController.updateAllBalances()
+ await this.txController.pendingTxTracker.updatePendingTxs()
return this.keyringController.fullUpdate()
}
@@ -1373,7 +1375,7 @@ module.exports = class MetamaskController extends EventEmitter {
})
.map(number => number.div(GWEI_BN).toNumber())
- const percentileNum = percentile(50, lowestPrices)
+ const percentileNum = percentile(65, lowestPrices)
const percentileNumBn = new BN(percentileNum)
return '0x' + percentileNumBn.mul(GWEI_BN).toString(16)
}
diff --git a/development/verify-locale-strings.js b/development/verify-locale-strings.js
index 0eef2b35d..0f408ea39 100644
--- a/development/verify-locale-strings.js
+++ b/development/verify-locale-strings.js
@@ -20,7 +20,7 @@ const specifiedLocale = process.argv[2]
if (specifiedLocale) {
console.log(`Verifying selected locale "${specifiedLocale}":\n\n`)
const locale = localeIndex.find(localeMeta => localeMeta.code === specifiedLocale)
- verifyLocale({ locale })
+ verifyLocale(locale)
} else {
console.log('Verifying all locales:\n\n')
localeIndex.forEach(localeMeta => {
@@ -30,11 +30,10 @@ if (specifiedLocale) {
}
-function verifyLocale ({ localeMeta }) {
+function verifyLocale (localeMeta) {
const localeCode = localeMeta.code
const localeName = localeMeta.name
let targetLocale, englishLocale
-
try {
const localeFilePath = path.join(process.cwd(), 'app', '_locales', localeCode, 'messages.json')
targetLocale = JSON.parse(fs.readFileSync(localeFilePath, 'utf8'))
diff --git a/docs/porting_to_new_environment.md b/docs/porting_to_new_environment.md
index 975d9e32e..d901f2b78 100644
--- a/docs/porting_to_new_environment.md
+++ b/docs/porting_to_new_environment.md
@@ -21,7 +21,7 @@ The core functionality of MetaMask all lives in what we call [The MetaMask Contr
When calling `new MetaMask(opts)`, many platform-specific options are configured. The keys on `opts` are as follows:
- initState: The last emitted state, used for restoring persistent state between sessions.
-- platform: The `platform` object defines a variety of platform-specific functions, including opening the confirmation view, and opening web sites.
+- platform: The `platform` object defines a variety of platform-specific functions, including opening the confirmation view, and opening websites.
- encryptor - An object that provides access to the desired encryption methods.
##### Encryptor
diff --git a/docs/state_dump.md b/docs/state_dump.md
index ecb863982..855445dca 100644
--- a/docs/state_dump.md
+++ b/docs/state_dump.md
@@ -11,5 +11,5 @@ To take a state dump, follow these steps:
3. In case it isn't already selected, click the "Console" tab in the new Developer Tools window.
4. In the console, type this command exactly: `logState()`. This should print a bunch of JSON text into your console.
5. Copy that printed JSON text
-6. *Optional*: Annonymize that text if you'd like (you may change all instances of an account address to another valid account address, for example) We may automate the anonymization in the future.
+6. *Optional*: Anonymize that text if you'd like (you may change all instances of an account address to another valid account address, for example) We may automate the anonymization in the future.
7. Send that JSON text to the developer, ideally pasting it in the issue regarding the bug.
diff --git a/docs/translating-guide.md b/docs/translating-guide.md
index 8b2bc1785..684316e4f 100644
--- a/docs/translating-guide.md
+++ b/docs/translating-guide.md
@@ -8,7 +8,7 @@ The MetaMask browser extension supports new translations added in the form of ne
- Each supported language is represented by a folder in `app/_locales` whose name is that language's subtag (example: `app/_locales/es/`). (look up a language subtag using the [r12a "Find" tool](https://r12a.github.io/app-subtags/) or this [wikipedia list](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)).
- Inside that folder there should be a `messages.json`.
-- An easy way to start your translation is to first **make a copy** of `app/_locales/en/messages.json` (the english translation), and then **translate the `message` key** for each in-app message.
+- An easy way to start your translation is to first **make a copy** of `app/_locales/en/messages.json` (the English translation), and then **translate the `message` key** for each in-app message.
- **The `description` key** is just to add context for what the translation is about, it **does not need to be translated**.
- Add the language to the [locales index](https://github.com/MetaMask/metamask-extension/blob/master/app/_locales/index.json) `app/_locales/index.json`
diff --git a/test/integration/lib/tx-list-items.js b/test/integration/lib/tx-list-items.js
index f64a8d7de..ed4f82074 100644
--- a/test/integration/lib/tx-list-items.js
+++ b/test/integration/lib/tx-list-items.js
@@ -32,7 +32,7 @@ async function runTxListItemsTest (assert, done) {
const txListItems = await queryAsync($, '.transaction-list-item')
assert.equal(txListItems.length, 8, 'all tx list items are rendered')
- const retryTxGrid = await findAsync($(txListItems[1]), '.transaction-list-item__grid')
+ const retryTxGrid = await findAsync($(txListItems[2]), '.transaction-list-item__grid')
retryTxGrid[0].click()
const retryTxDetails = await findAsync($, '.transaction-list-item-details')
const headerButtons = await findAsync($(retryTxDetails[0]), '.transaction-list-item-details__header-button')
@@ -42,7 +42,7 @@ async function runTxListItemsTest (assert, done) {
const approvedTxRenderedStatus = await findAsync($(approvedTx), '.transaction-list-item__status')
assert.equal(approvedTxRenderedStatus[0].textContent, 'pending', 'approvedTx has correct label')
- const unapprovedMsg = txListItems[3]
+ const unapprovedMsg = txListItems[0]
const unapprovedMsgDescription = await findAsync($(unapprovedMsg), '.transaction-list-item__action')
assert.equal(unapprovedMsgDescription[0].textContent, 'Signature Request', 'unapprovedMsg has correct description')
diff --git a/test/lib/mock-encryptor.js b/test/lib/mock-encryptor.js
index 48aa9e52c..852c536c2 100644
--- a/test/lib/mock-encryptor.js
+++ b/test/lib/mock-encryptor.js
@@ -1,5 +1,5 @@
var mockHex = '0xabcdef0123456789'
-var mockKey = new Buffer(32)
+var mockKey = Buffer.alloc(32)
let cacheVal
module.exports = {
diff --git a/test/unit/app/controllers/metamask-controller-test.js b/test/unit/app/controllers/metamask-controller-test.js
index e7a28bedb..17be2c028 100644
--- a/test/unit/app/controllers/metamask-controller-test.js
+++ b/test/unit/app/controllers/metamask-controller-test.js
@@ -116,7 +116,7 @@ describe('MetaMaskController', function () {
}
const gasPrice = metamaskController.getGasPrice()
- assert.equal(gasPrice, '0x3b9aca00', 'accurately estimates 50th percentile accepted gas price')
+ assert.equal(gasPrice, '0x174876e800', 'accurately estimates 65th percentile accepted gas price')
metamaskController.recentBlocksController = realRecentBlocksController
})
diff --git a/test/unit/components/binary-renderer-test.js b/test/unit/components/binary-renderer-test.js
index 7bf9250cc..e428c26ad 100644
--- a/test/unit/components/binary-renderer-test.js
+++ b/test/unit/components/binary-renderer-test.js
@@ -4,7 +4,7 @@ var BinaryRenderer = require('../../../old-ui/app/components/binary-renderer')
describe('BinaryRenderer', function () {
let binaryRenderer
const message = 'Hello, world!'
- const buffer = new Buffer(message, 'utf8')
+ const buffer = Buffer.from(message, 'utf8')
const hex = buffer.toString('hex')
beforeEach(function () {
diff --git a/test/unit/development/sample-changelog.md b/test/unit/development/sample-changelog.md
index 8fc9d2145..fd980e375 100644
--- a/test/unit/development/sample-changelog.md
+++ b/test/unit/development/sample-changelog.md
@@ -67,7 +67,7 @@
- Estimating gas limit for simple ether sends now faster & cheaper, by avoiding VM usage on recipients with no code.
- Add an extra px to address for Firefox clipping.
- Fix Firefox scrollbar.
-- Open metamask popup for transaction confirmation before gas estimation finishes and add a loading screen over transaction confirmation.
+- Open MetaMask popup for transaction confirmation before gas estimation finishes and add a loading screen over transaction confirmation.
- Fix bug that prevented eth_signTypedData from signing bytes.
- Further improve gas price estimation.
@@ -330,7 +330,7 @@ rollback to 3.10.0 due to bug
## 3.7.7 2017-6-8
-- Fix bug where metamask would show old data after computer being asleep or disconnected from the internet.
+- Fix bug where MetaMask would show old data after computer being asleep or disconnected from the internet.
## 3.7.6 2017-6-5
diff --git a/ui/app/components/dropdowns/token-menu-dropdown.js b/ui/app/components/dropdowns/token-menu-dropdown.js
index 5a794c7c1..8a072b1bc 100644
--- a/ui/app/components/dropdowns/token-menu-dropdown.js
+++ b/ui/app/components/dropdowns/token-menu-dropdown.js
@@ -5,7 +5,6 @@ const inherits = require('util').inherits
const connect = require('react-redux').connect
const actions = require('../../actions')
const genAccountLink = require('etherscan-link').createAccountLink
-const copyToClipboard = require('copy-to-clipboard')
const { Menu, Item, CloseArea } = require('./components/menu')
TokenMenuDropdown.contextTypes = {
@@ -59,14 +58,6 @@ TokenMenuDropdown.prototype.render = function () {
h(Item, {
onClick: (e) => {
e.stopPropagation()
- copyToClipboard(this.props.token.address)
- this.props.onClose()
- },
- text: this.context.t('copyContractAddress'),
- }),
- h(Item, {
- onClick: (e) => {
- e.stopPropagation()
const url = genAccountLink(this.props.token.address, this.props.network)
global.platform.openWindow({ url })
this.props.onClose()
diff --git a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js b/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js
index c24e1e0ea..ee5d6fa64 100644
--- a/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js
+++ b/ui/app/components/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js
@@ -90,35 +90,31 @@ export default class ConfirmAddSuggestedToken extends Component {
</div>
</div>
<div className="page-container__footer">
- <Button
- type="default"
- large
- className="page-container__footer-button"
- onClick={() => {
- removeSuggestedTokens()
- .then(() => {
- history.push(DEFAULT_ROUTE)
- })
- }}
- >
- { this.context.t('cancel') }
- </Button>
- <Button
- type="primary"
- large
- className="page-container__footer-button"
- onClick={() => {
- addToken(pendingToken)
- .then(() => {
- removeSuggestedTokens()
- .then(() => {
- history.push(DEFAULT_ROUTE)
- })
- })
- }}
- >
- { this.context.t('addToken') }
- </Button>
+ <header>
+ <Button
+ type="default"
+ large
+ className="page-container__footer-button"
+ onClick={() => {
+ removeSuggestedTokens()
+ .then(() => history.push(DEFAULT_ROUTE))
+ }}
+ >
+ { this.context.t('cancel') }
+ </Button>
+ <Button
+ type="primary"
+ large
+ className="page-container__footer-button"
+ onClick={() => {
+ addToken(pendingToken)
+ .then(() => removeSuggestedTokens())
+ .then(() => history.push(DEFAULT_ROUTE))
+ }}
+ >
+ { this.context.t('addToken') }
+ </Button>
+ </header>
</div>
</div>
)
diff --git a/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js b/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js
index 3dcc8cda9..d3fec79d7 100644
--- a/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js
+++ b/ui/app/components/pages/confirm-add-token/confirm-add-token.component.js
@@ -86,28 +86,30 @@ export default class ConfirmAddToken extends Component {
</div>
</div>
<div className="page-container__footer">
- <Button
- type="default"
- large
- className="page-container__footer-button"
- onClick={() => history.push(ADD_TOKEN_ROUTE)}
- >
- { this.context.t('back') }
- </Button>
- <Button
- type="primary"
- large
- className="page-container__footer-button"
- onClick={() => {
- addTokens(pendingTokens)
- .then(() => {
- clearPendingTokens()
- history.push(DEFAULT_ROUTE)
- })
- }}
- >
- { this.context.t('addTokens') }
- </Button>
+ <header>
+ <Button
+ type="default"
+ large
+ className="page-container__footer-button"
+ onClick={() => history.push(ADD_TOKEN_ROUTE)}
+ >
+ { this.context.t('back') }
+ </Button>
+ <Button
+ type="primary"
+ large
+ className="page-container__footer-button"
+ onClick={() => {
+ addTokens(pendingTokens)
+ .then(() => {
+ clearPendingTokens()
+ history.push(DEFAULT_ROUTE)
+ })
+ }}
+ >
+ { this.context.t('addTokens') }
+ </Button>
+ </header>
</div>
</div>
)
diff --git a/ui/app/components/pages/keychains/reveal-seed.js b/ui/app/components/pages/keychains/reveal-seed.js
index 7782b541c..32557066f 100644
--- a/ui/app/components/pages/keychains/reveal-seed.js
+++ b/ui/app/components/pages/keychains/reveal-seed.js
@@ -108,19 +108,21 @@ class RevealSeedPage extends Component {
renderPasswordPromptFooter () {
return (
h('.page-container__footer', [
- h(Button, {
- type: 'default',
- large: true,
- className: 'page-container__footer-button',
- onClick: () => this.props.history.push(DEFAULT_ROUTE),
- }, this.context.t('cancel')),
- h(Button, {
- type: 'primary',
- large: true,
- className: 'page-container__footer-button',
- onClick: event => this.handleSubmit(event),
- disabled: this.state.password === '',
- }, this.context.t('next')),
+ h('header', [
+ h(Button, {
+ type: 'default',
+ large: true,
+ className: 'page-container__footer-button',
+ onClick: () => this.props.history.push(DEFAULT_ROUTE),
+ }, this.context.t('cancel')),
+ h(Button, {
+ type: 'primary',
+ large: true,
+ className: 'page-container__footer-button',
+ onClick: event => this.handleSubmit(event),
+ disabled: this.state.password === '',
+ }, this.context.t('next')),
+ ]),
])
)
}
diff --git a/ui/app/components/transaction-action/tests/transaction-action.component.test.js b/ui/app/components/transaction-action/tests/transaction-action.component.test.js
index 9352c7b43..b22a9db39 100644
--- a/ui/app/components/transaction-action/tests/transaction-action.component.test.js
+++ b/ui/app/components/transaction-action/tests/transaction-action.component.test.js
@@ -6,14 +6,18 @@ import TransactionAction from '../transaction-action.component'
describe('TransactionAction Component', () => {
const t = key => key
- global.eth = {
- getCode: sinon.stub().callsFake(address => {
- const code = address === 'approveAddress' ? 'contract' : '0x'
- return Promise.resolve(code)
- }),
- }
+
describe('Outgoing transaction', () => {
+ beforeEach(() => {
+ global.eth = {
+ getCode: sinon.stub().callsFake(address => {
+ const code = address === 'approveAddress' ? 'contract' : '0x'
+ return Promise.resolve(code)
+ }),
+ }
+ })
+
it('should render -- when methodData is still fetching', () => {
const methodData = { data: {}, done: false, error: null }
const transaction = {
@@ -69,7 +73,7 @@ describe('TransactionAction Component', () => {
assert.equal(wrapper.text(), 'sentEther')
})
- it('should render Approved', () => {
+ it('should render Approved', async () => {
const methodData = {
data: {
name: 'Approve',
@@ -97,15 +101,62 @@ describe('TransactionAction Component', () => {
},
}
- const wrapper = shallow(<TransactionAction
- methodData={methodData}
- transaction={transaction}
- className="transaction-action"
- />, { context: { t }})
+ const wrapper = shallow(
+ <TransactionAction
+ methodData={methodData}
+ transaction={transaction}
+ className="test-class"
+ />,
+ { context: { t } }
+ )
- assert.equal(wrapper.find('.transaction-action').length, 1)
- wrapper.setState({ transactionAction: 'approve' })
- assert.equal(wrapper.text(), 'approve')
+ assert.ok(wrapper)
+ assert.equal(wrapper.find('.test-class').length, 1)
+ await wrapper.instance().getTransactionAction()
+ assert.equal(wrapper.state('transactionAction'), 'approve')
+ })
+
+ it('should render Accept Fulfillment', async () => {
+ const methodData = {
+ data: {
+ name: 'AcceptFulfillment',
+ params: [
+ { type: 'address' },
+ { type: 'uint256' },
+ ],
+ },
+ done: true,
+ error: null,
+ }
+ const transaction = {
+ id: 1,
+ status: 'confirmed',
+ submittedTime: 1534045442919,
+ time: 1534045440641,
+ txParams: {
+ from: '0xc5ae6383e126f901dcb06131d97a88745bfa88d6',
+ gas: '0x5208',
+ gasPrice: '0x3b9aca00',
+ nonce: '0x96',
+ to: 'approveAddress',
+ value: '0x2386f26fc10000',
+ data: '0x095ea7b300000000000000000000000050a9d56c2b8ba9a5c7f2c08c3d26e0499f23a7060000000000000000000000000000000000000000000000000000000000000003',
+ },
+ }
+
+ const wrapper = shallow(
+ <TransactionAction
+ methodData={methodData}
+ transaction={transaction}
+ className="test-class"
+ />,
+ { context: { t }}
+ )
+
+ assert.ok(wrapper)
+ assert.equal(wrapper.find('.test-class').length, 1)
+ await wrapper.instance().getTransactionAction()
+ assert.equal(wrapper.state('transactionAction'), ' Accept Fulfillment')
})
})
})
diff --git a/ui/app/components/transaction-action/transaction-action.component.js b/ui/app/components/transaction-action/transaction-action.component.js
index 1729b878c..1de91cb71 100644
--- a/ui/app/components/transaction-action/transaction-action.component.js
+++ b/ui/app/components/transaction-action/transaction-action.component.js
@@ -1,6 +1,8 @@
import React, { PureComponent } from 'react'
import PropTypes from 'prop-types'
+import classnames from 'classnames'
import { getTransactionActionKey } from '../../helpers/transactions.util'
+import { camelCaseToCapitalize } from '../../helpers/common.util'
export default class TransactionAction extends PureComponent {
static contextTypes = {
@@ -29,13 +31,17 @@ export default class TransactionAction extends PureComponent {
const { transactionAction } = this.state
const { transaction, methodData } = this.props
const { data, done } = methodData
+ const { name = '' } = data
if (!done || transactionAction) {
return
}
const actionKey = await getTransactionActionKey(transaction, data)
- const action = actionKey && this.context.t(actionKey)
+ const action = actionKey
+ ? this.context.t(actionKey)
+ : camelCaseToCapitalize(name)
+
this.setState({ transactionAction: action })
}
@@ -44,7 +50,7 @@ export default class TransactionAction extends PureComponent {
const { transactionAction } = this.state
return (
- <div className={className}>
+ <div className={classnames('transaction-action', className)}>
{ (done && transactionAction) || '--' }
</div>
)
diff --git a/ui/app/helpers/common.util.js b/ui/app/helpers/common.util.js
new file mode 100644
index 000000000..0c02481e6
--- /dev/null
+++ b/ui/app/helpers/common.util.js
@@ -0,0 +1,5 @@
+export function camelCaseToCapitalize (str = '') {
+ return str
+ .replace(/([A-Z])/g, ' $1')
+ .replace(/^./, str => str.toUpperCase())
+}
diff --git a/ui/app/helpers/tests/common.util.test.js b/ui/app/helpers/tests/common.util.test.js
new file mode 100644
index 000000000..a52b91a10
--- /dev/null
+++ b/ui/app/helpers/tests/common.util.test.js
@@ -0,0 +1,27 @@
+import * as utils from '../common.util'
+import assert from 'assert'
+
+describe('Common utils', () => {
+ describe('camelCaseToCapitalize', () => {
+ it('should return a capitalized string from a camel-cased string', () => {
+ const tests = [
+ {
+ test: undefined,
+ expected: '',
+ },
+ {
+ test: '',
+ expected: '',
+ },
+ {
+ test: 'thisIsATest',
+ expected: 'This Is A Test',
+ },
+ ]
+
+ tests.forEach(({ test, expected }) => {
+ assert.equal(utils.camelCaseToCapitalize(test), expected)
+ })
+ })
+ })
+})
diff --git a/ui/app/helpers/transactions.util.js b/ui/app/helpers/transactions.util.js
index 8b87bb538..f7d249e63 100644
--- a/ui/app/helpers/transactions.util.js
+++ b/ui/app/helpers/transactions.util.js
@@ -44,6 +44,12 @@ export function isConfirmDeployContract (txData = {}) {
return !txParams.to
}
+/**
+ * Returns the action of a transaction as a key to be passed into the translator.
+ * @param {Object} transaction - txData object
+ * @param {Object} methodData - Data returned from eth-method-registry
+ * @returns {string|undefined}
+ */
export async function getTransactionActionKey (transaction, methodData) {
const { txParams: { data, to } = {}, msgParams, type } = transaction
@@ -81,7 +87,7 @@ export async function getTransactionActionKey (transaction, methodData) {
case TOKEN_METHOD_TRANSFER_FROM:
return TRANSFER_FROM_ACTION_KEY
default:
- return name
+ return undefined
}
} else {
return SEND_ETHER_ACTION_KEY
diff --git a/ui/app/selectors/confirm-transaction.js b/ui/app/selectors/confirm-transaction.js
index 6e760c429..86b10bac3 100644
--- a/ui/app/selectors/confirm-transaction.js
+++ b/ui/app/selectors/confirm-transaction.js
@@ -126,7 +126,8 @@ const TOKEN_PARAM_VALUE = '_value'
export const tokenAmountAndToAddressSelector = createSelector(
tokenDataParamsSelector,
- params => {
+ tokenDecimalsSelector,
+ (params, tokenDecimals) => {
let toAddress = ''
let tokenAmount = 0
@@ -136,6 +137,10 @@ export const tokenAmountAndToAddressSelector = createSelector(
toAddress = toParam ? toParam.value : params[0].value
const value = valueParam ? Number(valueParam.value) : Number(params[1].value)
tokenAmount = roundExponential(value)
+
+ if (tokenDecimals) {
+ tokenAmount = calcTokenAmount(value, tokenDecimals)
+ }
}
return {
diff --git a/ui/app/selectors/transactions.js b/ui/app/selectors/transactions.js
index 3e9843722..479002794 100644
--- a/ui/app/selectors/transactions.js
+++ b/ui/app/selectors/transactions.js
@@ -39,7 +39,7 @@ export const transactionsSelector = createSelector(
export const pendingTransactionsSelector = createSelector(
transactionsSelector,
(transactions = []) => (
- transactions.filter(transaction => transaction.status in pendingStatusHash)
+ transactions.filter(transaction => transaction.status in pendingStatusHash).reverse()
)
)