diff options
46 files changed, 1507 insertions, 189 deletions
@@ -35,7 +35,6 @@ "globals": { "document": false, - "log": true, "navigator": false, "web3": true, "window": false diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 6dc5ecc6b..000000000 --- a/.jshintrc +++ /dev/null @@ -1,27 +0,0 @@ -{ - "node": true, - "browser": true, - "esnext": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, - "globals" : { - "chrome": true, - "crypto": true, - "describe": true, - "it": true - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f8c1c6b8..7a9d85d7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Improved performance of 3D fox logo. +- Fix bug that prevents setting language locale in settings. ## 4.5.5 Fri Apr 06 2018 diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json new file mode 100644 index 000000000..6a4ebc8a5 --- /dev/null +++ b/app/_locales/cs/messages.json @@ -0,0 +1,912 @@ +{ + "accept": { + "message": "Přijmout" + }, + "account": { + "message": "Účet" + }, + "accountDetails": { + "message": "Detaily účtu" + }, + "accountName": { + "message": "Název účtu" + }, + "address": { + "message": "Adresa" + }, + "addCustomToken": { + "message": "Přidat vlastní token" + }, + "addToken": { + "message": "Přidat token" + }, + "addTokens": { + "message": "Přidat tokeny" + }, + "amount": { + "message": "Částka" + }, + "amountPlusGas": { + "message": "Částka + palivo" + }, + "appDescription": { + "message": "Ethereum rozšíření prohlížeče", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approved": { + "message": "Schváleno" + }, + "attemptingConnect": { + "message": "Pokouším se připojit k blockchainu." + }, + "attributions": { + "message": "Zásluhy" + }, + "available": { + "message": "Dostupné" + }, + "back": { + "message": "Zpět" + }, + "balance": { + "message": "Zůstatek:" + }, + "balances": { + "message": "Zůstatek tokenu" + }, + "balanceIsInsufficientGas": { + "message": "Nedostatek prostředků pro aktuální množství paliva" + }, + "beta": { + "message": "BETA" + }, + "betweenMinAndMax": { + "message": "musí být větší nebo roven $1 a menší nebo roven $2.", + "description": "helper for inputting hex as decimal input" + }, + "blockiesIdenticon": { + "message": "Použít Blockies Identicon" + }, + "borrowDharma": { + "message": "Pújčit si přes Dharma (Beta)" + }, + "builtInCalifornia": { + "message": "MetaMask je navržen a vytvořen v Kalifornii." + }, + "buy": { + "message": "Koupit" + }, + "buyCoinbase": { + "message": "Nákup na Coinbase" + }, + "buyCoinbaseExplainer": { + "message": "Coinbase je světově nejoblíbenější místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu." + }, + "ok": { + "message": "Ok" + }, + "cancel": { + "message": "Zrušit" + }, + "classicInterface": { + "message": "Použít klasické rozhraní" + }, + "clickCopy": { + "message": "Kliknutím zkopírovat" + }, + "confirm": { + "message": "Potvrdit" + }, + "confirmed": { + "message": "Potvrzeno" + }, + "confirmContract": { + "message": "Potvrdit kontrakt" + }, + "confirmPassword": { + "message": "Potvrdit heslo" + }, + "confirmTransaction": { + "message": "Potvrdit transakci" + }, + "continue": { + "message": "Pokračovat" + }, + "continueToCoinbase": { + "message": "Přejít na Coinbase" + }, + "contractDeployment": { + "message": "Nasazení kontraktu" + }, + "conversionProgress": { + "message": "Provádí se převod" + }, + "copiedButton": { + "message": "Zkopírováno" + }, + "copiedClipboard": { + "message": "Zkopírováno do schránky" + }, + "copiedExclamation": { + "message": "Zkopírováno!" + }, + "copiedSafe": { + "message": "Zkopíroval jsem to na bezpečné místo" + }, + "copy": { + "message": "Kopírovat" + }, + "copyToClipboard": { + "message": "Kopírovat do schránky" + }, + "copyButton": { + "message": " Kopírovat " + }, + "copyPrivateKey": { + "message": "Toto je váš privátní klíč (kliknutím zkopírujte)" + }, + "create": { + "message": "Vytvořit" + }, + "createAccount": { + "message": "Vytvořit účet" + }, + "createDen": { + "message": "Vytvořit" + }, + "crypto": { + "message": "Krypto", + "description": "Exchange type (cryptocurrencies)" + }, + "currentConversion": { + "message": "Aktuální převod" + }, + "currentNetwork": { + "message": "Aktuální síť" + }, + "customGas": { + "message": "Nastavit palivo" + }, + "customToken": { + "message": "Vlastní token" + }, + "customize": { + "message": "Nastavit" + }, + "customRPC": { + "message": "Vlastní RPC" + }, + "decimalsMustZerotoTen": { + "message": "Desetinných míst musí být od 0 do 36." + }, + "decimal": { + "message": "Počet desetinných míst přesnosti" + }, + "defaultNetwork": { + "message": "Výchozí síť pro Etherové transakce je Main Net." + }, + "denExplainer": { + "message": "Váš DEN je heslem šifrované uložiště v MetaMasku." + }, + "deposit": { + "message": "Vklad" + }, + "depositBTC": { + "message": "Vložte BTC na níže uvedenou adresu:" + }, + "depositCoin": { + "message": "Vložte $1 na níže uvedenou adresu", + "description": "Tells the user what coin they have selected to deposit with shapeshift" + }, + "depositEth": { + "message": "Vložit Eth" + }, + "depositEther": { + "message": "Vložit Ether" + }, + "depositFiat": { + "message": "Vklad s fiat měnou" + }, + "depositFromAccount": { + "message": "Vložte z jiného účtu" + }, + "depositShapeShift": { + "message": "Vklad přes ShapeShift" + }, + "depositShapeShiftExplainer": { + "message": "Pokud vlastníte jiné kryptoměny, můžete je směnit Ether a vložit ho přímo do peněženky MetaMask. Bez založení účtu." + }, + "details": { + "message": "Podrobnosti" + }, + "directDeposit": { + "message": "Přímý vklad" + }, + "directDepositEther": { + "message": "Vložit Ether přímo" + }, + "directDepositEtherExplainer": { + "message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem." + }, + "done": { + "message": "Hotovo" + }, + "downloadStateLogs": { + "message": "Stáhnout stavové protokoly" + }, + "dropped": { + "message": "Zrušeno" + }, + "edit": { + "message": "Upravit" + }, + "editAccountName": { + "message": "Upravit název účtu" + }, + "emailUs": { + "message": "Napište nám e-mail!" + }, + "encryptNewDen": { + "message": "Zašifrujte svůj nový DEN" + }, + "enterPassword": { + "message": "Zadejte heslo" + }, + "enterPasswordConfirm": { + "message": "Zadejte heslo k potvrzení" + }, + "passwordNotLongEnough": { + "message": "Heslo není dost dlouhé" + }, + "passwordsDontMatch": { + "message": "Hesla nejsou stejná" + }, + "etherscanView": { + "message": "Prohlédněte si účet na Etherscan" + }, + "exchangeRate": { + "message": "Směnný kurz" + }, + "exportPrivateKey": { + "message": "Exportovat privátní klíč" + }, + "exportPrivateKeyWarning": { + "message": "Exportujte privátní klíč na vlastní riziko." + }, + "failed": { + "message": "Neúspěšné" + }, + "fiat": { + "message": "FIAT", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Import souboru nefunguje? Klikněte sem!", + "description": "Helps user import their account from a JSON file" + }, + "followTwitter": { + "message": "Sledujte nás na Twitteru" + }, + "from": { + "message": "Od" + }, + "fromToSame": { + "message": "Adresy odesílatele a příjemce nemohou být stejné" + }, + "fromShapeShift": { + "message": "Z ShapeShift" + }, + "gas": { + "message": "Palivo", + "description": "Short indication of gas cost" + }, + "gasFee": { + "message": "Poplatek za palivo" + }, + "gasLimit": { + "message": "Limit paliva" + }, + "gasLimitCalculation": { + "message": "Počítáme doporučený limit paliva na základě úspěšnosti v síti." + }, + "gasLimitRequired": { + "message": "Limit paliva je povinný" + }, + "gasLimitTooLow": { + "message": "Limit paliva musí být alespoň 21000" + }, + "generatingSeed": { + "message": "Generuji klíčovou frázi..." + }, + "gasPrice": { + "message": "Cena paliva (GWEI)" + }, + "gasPriceCalculation": { + "message": "Počítáme doporučenou cenu paliva na základě úspěšnosti v síti." + }, + "gasPriceRequired": { + "message": "Cena paliva je povinná" + }, + "getEther": { + "message": "Získejte Ether" + }, + "getEtherFromFaucet": { + "message": "Získejte Ether z faucetu za $1.", + "description": "Displays network name for Ether faucet" + }, + "greaterThanMin": { + "message": "musí být větší nebo roven $1.", + "description": "helper for inputting hex as decimal input" + }, + "here": { + "message": "zde", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hereList": { + "message": "Tady je seznam!!!!" + }, + "hide": { + "message": "Skrýt" + }, + "hideToken": { + "message": "Skrýt token" + }, + "hideTokenPrompt": { + "message": "Skrýt token?" + }, + "howToDeposit": { + "message": "Jakým způsobem chcete vložit Ether?" + }, + "holdEther": { + "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím." + }, + "import": { + "message": "Import", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Import účtu" + }, + "importAccountMsg": { + "message":"Importované účty nebudou spojeny s vaší původní MetaMaskovou klíčovou frází. Zjistěte více o importovaných účtech " + }, + "importAnAccount": { + "message": "Import účtu" + }, + "importDen": { + "message": "Import existujícího DEN" + }, + "imported": { + "message": "Importováno", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "infoHelp": { + "message": "Informace a nápověda" + }, + "insufficientFunds": { + "message": "Nedostatek finančních prostředků." + }, + "insufficientTokens": { + "message": "Nedostatek tokenů." + }, + "invalidAddress": { + "message": "Neplatná adresa" + }, + "invalidAddressRecipient": { + "message": "Adresa příjemce je neplatná" + }, + "invalidGasParams": { + "message": "Neplatná parametry paliva" + }, + "invalidInput": { + "message": "Neplatný vstup." + }, + "invalidRequest": { + "message": "Neplatný požadavek" + }, + "invalidRPC": { + "message": "Neplatné RPC URI" + }, + "jsonFail": { + "message": "Něco se pokazilo. Prosím, ujistěte se, že váš JSON soubor má správný formát." + }, + "jsonFile": { + "message": "JSON soubor", + "description": "format for importing an account" + }, + "keepTrackTokens": { + "message": "Udržujte si záznamy o tokenech, které jste koupili s účtem v MetaMasku." + }, + "kovan": { + "message": "Kovan Test Network" + }, + "knowledgeDataBase": { + "message": "Navštivte naši Knowledge Base" + }, + "max": { + "message": "Max" + }, + "learnMore": { + "message": "Zjistěte více." + }, + "lessThanMax": { + "message": "musí být menší nebo roven $1.", + "description": "helper for inputting hex as decimal input" + }, + "likeToAddTokens": { + "message": "Chcete přidat tyto tokeny?" + }, + "links": { + "message": "Odkazy" + }, + "limit": { + "message": "Limit" + }, + "loading": { + "message": "Načítám..." + }, + "loadingTokens": { + "message": "Načítám tokeny..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "login": { + "message": "Přihlásit" + }, + "logout": { + "message": "Odhlásit" + }, + "loose": { + "message": "Nevázané" + }, + "loweCaseWords": { + "message": "slova klíčové fráze mají pouze malá písmena" + }, + "mainnet": { + "message": "Main Ethereum Network" + }, + "message": { + "message": "Zpráva" + }, + "metamaskDescription": { + "message": "MetaMask je bezpečný osobní trezor pro Ethereum." + }, + "min": { + "message": "Minimum" + }, + "myAccounts": { + "message": "Moje účty" + }, + "mustSelectOne": { + "message": "Musíte zvolit aspoň 1 token." + }, + "needEtherInWallet": { + "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi." + }, + "needImportFile": { + "message": "Musíte zvolit soubor k importu.", + "description": "User is important an account and needs to add a file to continue" + }, + "needImportPassword": { + "message": "Musíte zadat heslo pro zvolený soubor.", + "description": "Password and file needed to import an account" + }, + "negativeETH": { + "message": "Nelze odeslat zápornou částku ETH." + }, + "networks": { + "message": "Sítě" + }, + "newAccount": { + "message": "Nový účet" + }, + "newAccountNumberName": { + "message": "Účet $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContract": { + "message": "Nový kontrakt" + }, + "newPassword": { + "message": "Nové heslo (min 8 znaků)" + }, + "newRecipient": { + "message": "Nový příjemce" + }, + "newRPC": { + "message": "Nová RPC URL" + }, + "next": { + "message": "Další" + }, + "noAddressForName": { + "message": "Pro toto jméno nebyla nastavena žádná adresa." + }, + "noDeposits": { + "message": "Žádný vklad" + }, + "noTransactionHistory": { + "message": "Žádná historie transakcí." + }, + "noTransactions": { + "message": "Žádné transakce" + }, + "notStarted": { + "message": "Nezačalo" + }, + "oldUI": { + "message": "Staré rozhraní" + }, + "oldUIMessage": { + "message": "Vrátili jste se ke starému rozhraní. Můžete přepnout na nové rozhraní v nastavení v pravém horním menu." + }, + "or": { + "message": "nebo", + "description": "choice between creating or importing a new account" + }, + "passwordCorrect": { + "message": "Ujistěte se, že je vaše heslo správně." + }, + "passwordMismatch": { + "message": "hesla nesouhlasí", + "description": "in password creation process, the two new password fields did not match" + }, + "passwordShort": { + "message": "heslo je krátké", + "description": "in password creation process, the password is not long enough to be secure" + }, + "pastePrivateKey": { + "message": "Vložte zde svůj privátní klíč:", + "description": "For importing an account from a private key" + }, + "pasteSeed": { + "message": "Svou klíčovou frázi vložte zde!" + }, + "personalAddressDetected": { + "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu." + }, + "pleaseReviewTransaction": { + "message": "Zkontrolujte si transakci." + }, + "popularTokens": { + "message": "Oblíbené tokeny" + }, + "privacyMsg": { + "message": "Zásady ochrany osobních údajů" + }, + "privateKey": { + "message": "Privátní klíč", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Upozornění: Nikdy nezveřejněte tento klíč. Kdokoli může s vaším privátním klíčem odcizit vaše aktiva z účtu." + }, + "privateNetwork": { + "message": "Soukromá síť" + }, + "qrCode": { + "message": "Ukázat QR kód" + }, + "readdToken": { + "message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu." + }, + "readMore": { + "message": "Přečtěte si více zde." + }, + "readMore2": { + "message": "Přečtěte si více." + }, + "receive": { + "message": "Obrdžet" + }, + "recipientAddress": { + "message": "Adresa příjemce" + }, + "refundAddress": { + "message": "Adresa pro vrácení peněz" + }, + "rejected": { + "message": "Odmítnuto" + }, + "resetAccount": { + "message": "Resetovat účet" + }, + "restoreFromSeed": { + "message": "Obnovit z seed fráze" + }, + "restoreVault": { + "message": "Obnovit trezor" + }, + "required": { + "message": "Povinné" + }, + "retryWithMoreGas": { + "message": "Opakujte s vyšší cenou paliva" + }, + "walletSeed": { + "message": "Klíčová fráze peněženky" + }, + "revealSeedWords": { + "message": "Zobrazit slova klíčové fráze" + }, + "revealSeedWordsWarning": { + "message": "Nebnovujte slova klíčové fráze na veřejnosti! Tato slova mohou být použita k odcizení veškerých vyašich účtů." + }, + "revert": { + "message": "Zvrátit" + }, + "rinkeby": { + "message": "Rinkeby Test Network" + }, + "ropsten": { + "message": "Ropsten Test Network" + }, + "currentRpc": { + "message": "Současné RPC" + }, + "connectingToMainnet": { + "message": "Připojuji se k Main Ethereum Network" + }, + "connectingToRopsten": { + "message": "Připojuji se k Ropsten Test Network" + }, + "connectingToKovan": { + "message": "Připojuji se k Kovan Test Network" + }, + "connectingToRinkeby": { + "message": "Připojuji se k Rinkeby Test Network" + }, + "connectingToUnknown": { + "message": "Připojuji se k neznámé síti" + }, + "sampleAccountName": { + "message": "Např. můj nový účet", + "description": "Help user understand concept of adding a human-readable name to their account" + }, + "save": { + "message": "Uložit" + }, + "reprice_title": { + "message": "Změnit cenu transakce" + }, + "reprice_subtitle": { + "message": "Navyšte cenu paliva ve snaze k přepsání a urychlení vyší transakce" + }, + "saveAsFile": { + "message": "Uložit do souboru", + "description": "Account export process" + }, + "saveSeedAsFile": { + "message": "Uložit slova klíčové fráze do souboru" + }, + "search": { + "message": "Hledat" + }, + "secretPhrase": { + "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru." + }, + "newPassword8Chars": { + "message": "Nové heslo (min 8 znaků)" + }, + "seedPhraseReq": { + "message": "klíčové fráze mají 12 slov" + }, + "select": { + "message": "Vybrat" + }, + "selectCurrency": { + "message": "Vybrat měnu" + }, + "selectService": { + "message": "Vybrat službu" + }, + "selectType": { + "message": "Vybrat typ" + }, + "send": { + "message": "Odeslat" + }, + "sendETH": { + "message": "Odeslat ETH" + }, + "sendTokens": { + "message": "Odeslat tokeny" + }, + "onlySendToEtherAddress": { + "message": "Posílejte jen ETH na Ethereum adresu." + }, + "searchTokens": { + "message": "Hledat tokeny" + }, + "sendTokensAnywhere": { + "message": "Posílejte tokeny komukoli s Ethereum účtem" + }, + "settings": { + "message": "Nastavení" + }, + "info": { + "message": "Informace" + }, + "shapeshiftBuy": { + "message": "Nakoupit na ShapeShift" + }, + "showPrivateKeys": { + "message": "Zobrazit privátní klíče" + }, + "showQRCode": { + "message": "Zobrazit QR kód" + }, + "sign": { + "message": "Podepsat" + }, + "signed": { + "message": "Podepsáno" + }, + "signMessage": { + "message": "Podepsat zprávu" + }, + "signNotice": { + "message": "Podepsání zprávy může mít \nnebezpečný vedlejší učinek. Podepisujte zprávy pouze ze \nstránek, kterým plně důvěřujete celým svým účtem.\n Tato nebezpečná metoda bude odebrána v budoucí verzi. " + }, + "sigRequest": { + "message": "Požadavek podpisu" + }, + "sigRequested": { + "message": "Požádáno o podpis" + }, + "spaceBetween": { + "message": "mezi slovy může být pouze mezera" + }, + "status": { + "message": "Stav" + }, + "stateLogs": { + "message": "Stavové protokoly" + }, + "stateLogsDescription": { + "message": "Stavové protokoly obsahují vaše veřejné adresy účtů a odeslané transakce." + }, + "stateLogError": { + "message": "Chyba během získávání stavových protokolů." + }, + "submit": { + "message": "Odeslat" + }, + "submitted": { + "message": "Odesláno" + }, + "supportCenter": { + "message": "Navštivte naše centrum podpory" + }, + "symbolBetweenZeroTen": { + "message": "Symbol musí být mezi 0 a 10 znaky." + }, + "takesTooLong": { + "message": "Trvá to dlouho?" + }, + "terms": { + "message": "Podmínky použití" + }, + "testFaucet": { + "message": "Testovací faucet" + }, + "to": { + "message": "Komu: " + }, + "toETHviaShapeShift": { + "message": "$1 na ETH přes ShapeShift", + "description": "system will fill in deposit type in start of message" + }, + "tokenAddress": { + "message": "Adresa tokenu" + }, + "tokenAlreadyAdded": { + "message": "Token byl už přidán." + }, + "tokenBalance": { + "message": "Váš zůstatek tokenu je:" + }, + "tokenSelection": { + "message": "Vyhledejte token nebo je vyberte z našeho seznamu oblíbených tokenů." + }, + "tokenSymbol": { + "message": "Symbol tokenu" + }, + "tokenWarning1": { + "message": "Mějte přehled o tokenech, které jste koupili s účtem MetaMasku. Pokud jste koupili tokeny s jiným účtem, tyto tokeny se zde nezobrazí." + }, + "total": { + "message": "Celkem" + }, + "transactions": { + "message": "transakce" + }, + "transactionError": { + "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu." + }, + "transactionMemo": { + "message": "Poznámka transakce (nepovinné)" + }, + "transactionNumber": { + "message": "Číslo transakce" + }, + "transfers": { + "message": "Převody" + }, + "troubleTokenBalances": { + "message": "Měli jsme problém s načtením vašich tokenových zůstatků. Můžete je vidět ", + "description": "Followed by a link (here) to view token balances" + }, + "twelveWords": { + "message": "Těchto 12 slov je jedinou možností, jak obnovit MetaMask účet. \nUložte je na bezpečné a neveřejné místo." + }, + "typePassword": { + "message": "Zadejte své heslo" + }, + "uiWelcome": { + "message": "Vítejte v novém rozhraní (Beta)" + }, + "uiWelcomeMessage": { + "message": "Používáte nyní nové rozhraní MetaMasku. Rozhlédněte se kolem, vyzkoušejte nové funkce, jako jsou zasílání tokenů, a dejte nám vědět, pokud narazíte na problém." + }, + "unapproved": { + "message": "Neschváleno" + }, + "unavailable": { + "message": "Nedostupné" + }, + "unknown": { + "message": "Neznámé" + }, + "unknownNetwork": { + "message": "Neznámá soukromá síť" + }, + "unknownNetworkId": { + "message": "Neznámé ID sítě" + }, + "uriErrorMsg": { + "message": "URI vyžadují korektní HTTP/HTTPS prefix." + }, + "usaOnly": { + "message": "jen v USA", + "description": "Using this exchange is limited to people inside the USA" + }, + "usedByClients": { + "message": "Používána různými klienty" + }, + "useOldUI": { + "message": "Použijte staré rozhraní" + }, + "validFileImport": { + "message": "Musíte vybrat validní soubor k importu." + }, + "vaultCreated": { + "message": "Trezor vytvořen" + }, + "viewAccount": { + "message": "Zobrazit účet" + }, + "visitWebSite": { + "message": "Navštivte naši stránku" + }, + "warning": { + "message": "Varování" + }, + "welcomeBeta": { + "message": "Vítejte v MetaMask Beta" + }, + "whatsThis": { + "message": "Co to je?" + }, + "yourSigRequested": { + "message": "Je vyžadován váš podpis" + }, + "youSign": { + "message": "Podepisujete" + } +} diff --git a/app/_locales/index.json b/app/_locales/index.json index 727504bda..facee3c35 100644 --- a/app/_locales/index.json +++ b/app/_locales/index.json @@ -1,4 +1,5 @@ [ + { "code": "cs", "name": "Czech" }, { "code": "de", "name": "German" }, { "code": "en", "name": "English" }, { "code": "es", "name": "Spanish" }, diff --git a/app/scripts/background.js b/app/scripts/background.js index 5878cd2e8..451b0d609 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -25,8 +25,7 @@ const getObjStructure = require('./lib/getObjStructure') const STORAGE_KEY = 'metamask-config' const METAMASK_DEBUG = process.env.METAMASK_DEBUG -window.log = log -log.setDefaultLevel(METAMASK_DEBUG ? 'debug' : 'warn') +log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn') const platform = new ExtensionPlatform() const notificationManager = new NotificationManager() diff --git a/app/scripts/controllers/blacklist.js b/app/scripts/controllers/blacklist.js index df41c90c0..d965f80b8 100644 --- a/app/scripts/controllers/blacklist.js +++ b/app/scripts/controllers/blacklist.js @@ -1,6 +1,7 @@ const ObservableStore = require('obs-store') const extend = require('xtend') const PhishingDetector = require('eth-phishing-detect/src/detector') +const log = require('loglevel') // compute phishing lists const PHISHING_DETECTION_CONFIG = require('eth-phishing-detect/src/config.json') diff --git a/app/scripts/controllers/currency.js b/app/scripts/controllers/currency.js index 36b8808aa..d9e0a3e34 100644 --- a/app/scripts/controllers/currency.js +++ b/app/scripts/controllers/currency.js @@ -1,5 +1,6 @@ const ObservableStore = require('obs-store') const extend = require('xtend') +const log = require('loglevel') // every ten minutes const POLLING_INTERVAL = 600000 diff --git a/app/scripts/controllers/infura.js b/app/scripts/controllers/infura.js index c6b4c9de2..8f6dd837e 100644 --- a/app/scripts/controllers/infura.js +++ b/app/scripts/controllers/infura.js @@ -1,5 +1,6 @@ const ObservableStore = require('obs-store') const extend = require('xtend') +const log = require('loglevel') // every ten minutes const POLLING_INTERVAL = 10 * 60 * 1000 diff --git a/app/scripts/controllers/network.js b/app/scripts/controllers/network.js index 617456cd7..45574e673 100644 --- a/app/scripts/controllers/network.js +++ b/app/scripts/controllers/network.js @@ -9,6 +9,7 @@ const extend = require('xtend') const EthQuery = require('eth-query') const createEventEmitterProxy = require('../lib/events-proxy.js') const networkConfig = require('../config.js') +const log = require('loglevel') const { OLD_UI_NETWORK_TYPE, DEFAULT_RPC } = networkConfig.enums const INFURA_PROVIDER_TYPES = ['ropsten', 'rinkeby', 'kovan', 'mainnet'] diff --git a/app/scripts/controllers/recent-blocks.js b/app/scripts/controllers/recent-blocks.js index 4ae3810eb..0c1ee4e38 100644 --- a/app/scripts/controllers/recent-blocks.js +++ b/app/scripts/controllers/recent-blocks.js @@ -2,6 +2,7 @@ const ObservableStore = require('obs-store') const extend = require('xtend') const BN = require('ethereumjs-util').BN const EthQuery = require('eth-query') +const log = require('loglevel') class RecentBlocksController { diff --git a/app/scripts/controllers/shapeshift.js b/app/scripts/controllers/shapeshift.js index 3bbfaa1c5..b38b3812d 100644 --- a/app/scripts/controllers/shapeshift.js +++ b/app/scripts/controllers/shapeshift.js @@ -1,5 +1,6 @@ const ObservableStore = require('obs-store') const extend = require('xtend') +const log = require('loglevel') // every three seconds when an incomplete tx is waiting const POLLING_INTERVAL = 3000 diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index 336b0d8f7..c8211ebd7 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -7,6 +7,7 @@ const TransactionStateManager = require('../lib/tx-state-manager') const TxGasUtil = require('../lib/tx-gas-utils') const PendingTransactionTracker = require('../lib/pending-tx-tracker') const NonceTracker = require('../lib/nonce-tracker') +const log = require('loglevel') /* Transaction Controller is an aggregate of sub-controllers and trackers diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index ec99bfc35..92c732813 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -3,16 +3,11 @@ cleanContextForImports() require('web3/dist/web3.min.js') const log = require('loglevel') const LocalMessageDuplexStream = require('post-message-stream') -// const PingStream = require('ping-pong-stream/ping') -// const endOfStream = require('end-of-stream') const setupDappAutoReload = require('./lib/auto-reload.js') const MetamaskInpageProvider = require('./lib/inpage-provider.js') restoreContextAfterImports() -const METAMASK_DEBUG = process.env.METAMASK_DEBUG -window.log = log -log.setDefaultLevel(METAMASK_DEBUG ? 'debug' : 'warn') - +log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn') // // setup plugin communication diff --git a/app/scripts/lib/ComposableObservableStore.js b/app/scripts/lib/ComposableObservableStore.js new file mode 100644 index 000000000..d5ee708a1 --- /dev/null +++ b/app/scripts/lib/ComposableObservableStore.js @@ -0,0 +1,49 @@ +const ObservableStore = require('obs-store') + +/** + * An ObservableStore that can composes a flat + * structure of child stores based on configuration + */ +class ComposableObservableStore extends ObservableStore { + /** + * Create a new store + * + * @param {Object} [initState] - The initial store state + * @param {Object} [config] - Map of internal state keys to child stores + */ + constructor (initState, config) { + super(initState) + this.updateStructure(config) + } + + /** + * Composes a new internal store subscription structure + * + * @param {Object} [config] - Map of internal state keys to child stores + */ + updateStructure (config) { + this.config = config + this.removeAllListeners() + for (const key in config) { + config[key].subscribe((state) => { + this.updateState({ [key]: state }) + }) + } + } + + /** + * Merges all child store state into a single object rather than + * returning an object keyed by child store class name + * + * @returns {Object} - Object containing merged child store state + */ + getFlatState () { + let flatState = {} + for (const key in this.config) { + flatState = { ...flatState, ...this.config[key].getState() } + } + return flatState + } +} + +module.exports = ComposableObservableStore diff --git a/app/scripts/lib/createLoggerMiddleware.js b/app/scripts/lib/createLoggerMiddleware.js index 2707cbd9e..fc6abf828 100644 --- a/app/scripts/lib/createLoggerMiddleware.js +++ b/app/scripts/lib/createLoggerMiddleware.js @@ -1,3 +1,5 @@ +const log = require('loglevel') + // log rpc activity module.exports = createLoggerMiddleware diff --git a/app/scripts/lib/local-store.js b/app/scripts/lib/local-store.js index 5b47985f6..2dda0ba1f 100644 --- a/app/scripts/lib/local-store.js +++ b/app/scripts/lib/local-store.js @@ -3,6 +3,7 @@ // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/storage/local const extension = require('extensionizer') +const log = require('loglevel') module.exports = class ExtensionStore { constructor() { diff --git a/app/scripts/lib/personal-message-manager.js b/app/scripts/lib/personal-message-manager.js index 6602f5aa8..43a7d0b42 100644 --- a/app/scripts/lib/personal-message-manager.js +++ b/app/scripts/lib/personal-message-manager.js @@ -3,6 +3,7 @@ const ObservableStore = require('obs-store') const ethUtil = require('ethereumjs-util') const createId = require('./random-id') const hexRe = /^[0-9A-Fa-f]+$/g +const log = require('loglevel') module.exports = class PersonalMessageManager extends EventEmitter { diff --git a/app/scripts/lib/seed-phrase-verifier.js b/app/scripts/lib/seed-phrase-verifier.js index 9cea22029..7ba712c0d 100644 --- a/app/scripts/lib/seed-phrase-verifier.js +++ b/app/scripts/lib/seed-phrase-verifier.js @@ -1,4 +1,5 @@ const KeyringController = require('eth-keyring-controller') +const log = require('loglevel') const seedPhraseVerifier = { diff --git a/app/scripts/lib/typed-message-manager.js b/app/scripts/lib/typed-message-manager.js index 8b760790e..60042155e 100644 --- a/app/scripts/lib/typed-message-manager.js +++ b/app/scripts/lib/typed-message-manager.js @@ -3,7 +3,7 @@ const ObservableStore = require('obs-store') const createId = require('./random-id') const assert = require('assert') const sigUtil = require('eth-sig-util') - +const log = require('loglevel') module.exports = class TypedMessageManager extends EventEmitter { constructor (opts) { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index b96acc9da..dbb8efc6e 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -5,10 +5,10 @@ */ const EventEmitter = require('events') -const extend = require('xtend') const pump = require('pump') const Dnode = require('dnode') const ObservableStore = require('obs-store') +const ComposableObservableStore = require('./lib/ComposableObservableStore') const asStream = require('obs-store/lib/asStream') const AccountTracker = require('./lib/account-tracker') const RpcEngine = require('json-rpc-engine') @@ -44,6 +44,7 @@ const BN = require('ethereumjs-util').BN const GWEI_BN = new BN('1000000000') const percentile = require('percentile') const seedPhraseVerifier = require('./lib/seed-phrase-verifier') +const log = require('loglevel') module.exports = class MetamaskController extends EventEmitter { @@ -65,7 +66,7 @@ module.exports = class MetamaskController extends EventEmitter { this.platform = opts.platform // observable state store - this.store = new ObservableStore(initState) + this.store = new ComposableObservableStore(initState) // lock to ensure only one vault created at once this.createVaultMutex = new Mutex() @@ -184,53 +185,36 @@ module.exports = class MetamaskController extends EventEmitter { this.typedMessageManager = new TypedMessageManager() this.publicConfigStore = this.initPublicConfigStore() - // manual disk state subscriptions - this.txController.store.subscribe((state) => { - this.store.updateState({ TransactionController: state }) - }) - this.keyringController.store.subscribe((state) => { - this.store.updateState({ KeyringController: state }) - }) - this.preferencesController.store.subscribe((state) => { - this.store.updateState({ PreferencesController: state }) - }) - this.addressBookController.store.subscribe((state) => { - this.store.updateState({ AddressBookController: state }) - }) - this.currencyController.store.subscribe((state) => { - this.store.updateState({ CurrencyController: state }) - }) - this.noticeController.store.subscribe((state) => { - this.store.updateState({ NoticeController: state }) - }) - this.shapeshiftController.store.subscribe((state) => { - this.store.updateState({ ShapeShiftController: state }) - }) - this.networkController.store.subscribe((state) => { - this.store.updateState({ NetworkController: state }) + this.store.updateStructure({ + TransactionController: this.txController.store, + KeyringController: this.keyringController.store, + PreferencesController: this.preferencesController.store, + AddressBookController: this.addressBookController.store, + CurrencyController: this.currencyController.store, + NoticeController: this.noticeController.store, + ShapeShiftController: this.shapeshiftController.store, + NetworkController: this.networkController.store, + InfuraController: this.infuraController.store, }) - this.infuraController.store.subscribe((state) => { - this.store.updateState({ InfuraController: state }) + this.memStore = new ComposableObservableStore(null, { + NetworkController: this.networkController.store, + AccountTracker: this.accountTracker.store, + TxController: this.txController.memStore, + BalancesController: this.balancesController.store, + MessageManager: this.messageManager.memStore, + PersonalMessageManager: this.personalMessageManager.memStore, + TypesMessageManager: this.typedMessageManager.memStore, + KeyringController: this.keyringController.memStore, + PreferencesController: this.preferencesController.store, + RecentBlocksController: this.recentBlocksController.store, + AddressBookController: this.addressBookController.store, + CurrencyController: this.currencyController.store, + NoticeController: this.noticeController.memStore, + ShapeshiftController: this.shapeshiftController.store, + InfuraController: this.infuraController.store, }) - - // manual mem state subscriptions - const sendUpdate = this.sendUpdate.bind(this) - this.networkController.store.subscribe(sendUpdate) - this.accountTracker.store.subscribe(sendUpdate) - this.txController.memStore.subscribe(sendUpdate) - this.balancesController.store.subscribe(sendUpdate) - this.messageManager.memStore.subscribe(sendUpdate) - this.personalMessageManager.memStore.subscribe(sendUpdate) - this.typedMessageManager.memStore.subscribe(sendUpdate) - this.keyringController.memStore.subscribe(sendUpdate) - this.preferencesController.store.subscribe(sendUpdate) - this.recentBlocksController.store.subscribe(sendUpdate) - this.addressBookController.store.subscribe(sendUpdate) - this.currencyController.store.subscribe(sendUpdate) - this.noticeController.memStore.subscribe(sendUpdate) - this.shapeshiftController.store.subscribe(sendUpdate) - this.infuraController.store.subscribe(sendUpdate) + this.memStore.subscribe(this.sendUpdate.bind(this)) } /** @@ -308,33 +292,16 @@ module.exports = class MetamaskController extends EventEmitter { const vault = this.keyringController.store.getState().vault const isInitialized = (!!wallet || !!vault) - return extend( - { - isInitialized, - }, - this.networkController.store.getState(), - this.accountTracker.store.getState(), - this.txController.memStore.getState(), - this.messageManager.memStore.getState(), - this.personalMessageManager.memStore.getState(), - this.typedMessageManager.memStore.getState(), - this.keyringController.memStore.getState(), - this.balancesController.store.getState(), - this.preferencesController.store.getState(), - this.addressBookController.store.getState(), - this.currencyController.store.getState(), - this.noticeController.memStore.getState(), - this.infuraController.store.getState(), - this.recentBlocksController.store.getState(), - // config manager - this.configManager.getConfig(), - this.shapeshiftController.store.getState(), - { + return { + ...{ isInitialized }, + ...this.memStore.getFlatState(), + ...this.configManager.getConfig(), + ...{ lostAccounts: this.configManager.getLostAccounts(), seedWords: this.configManager.getSeedWords(), forgottenPassword: this.configManager.getPasswordForgotten(), - } - ) + }, + } } /** diff --git a/app/scripts/ui.js b/app/scripts/ui.js index 13c7ac5ec..c326ca1c3 100644 --- a/app/scripts/ui.js +++ b/app/scripts/ui.js @@ -9,6 +9,7 @@ const ExtensionPlatform = require('./platforms/extension') const NotificationManager = require('./lib/notification-manager') const notificationManager = new NotificationManager() const setupRaven = require('./lib/setupRaven') +const log = require('loglevel') start().catch(log.error) diff --git a/old-ui/app/app.js b/old-ui/app/app.js index 37611987f..fc0d634aa 100644 --- a/old-ui/app/app.js +++ b/old-ui/app/app.js @@ -3,6 +3,7 @@ const Component = require('react').Component const connect = require('react-redux').connect const h = require('react-hyperscript') const actions = require('../../ui/app/actions') +const log = require('loglevel') // mascara const MascaraFirstTime = require('../../mascara/src/app/first-time').default const MascaraBuyEtherScreen = require('../../mascara/src/app/first-time/buy-ether-screen').default diff --git a/old-ui/app/components/ens-input.js b/old-ui/app/components/ens-input.js index c85a23514..d09c30644 100644 --- a/old-ui/app/components/ens-input.js +++ b/old-ui/app/components/ens-input.js @@ -8,6 +8,7 @@ const ENS = require('ethjs-ens') const networkMap = require('ethjs-ens/lib/network-map.json') const ensRE = /.+\..+$/ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' +const log = require('loglevel') module.exports = EnsInput diff --git a/old-ui/app/components/pending-tx.js b/old-ui/app/components/pending-tx.js index 7f63d9fdf..cd4189fc4 100644 --- a/old-ui/app/components/pending-tx.js +++ b/old-ui/app/components/pending-tx.js @@ -3,6 +3,7 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const actions = require('../../../ui/app/actions') const clone = require('clone') +const log = require('loglevel') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN diff --git a/old-ui/app/components/token-list.js b/old-ui/app/components/token-list.js index 149733b89..e20594b61 100644 --- a/old-ui/app/components/token-list.js +++ b/old-ui/app/components/token-list.js @@ -3,6 +3,7 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const TokenTracker = require('eth-token-tracker') const TokenCell = require('./token-cell.js') +const log = require('loglevel') module.exports = TokenList diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js index 1bb8eb97c..67eb31c37 100644 --- a/old-ui/app/conf-tx.js +++ b/old-ui/app/conf-tx.js @@ -7,6 +7,7 @@ const NetworkIndicator = require('./components/network') const LoadingIndicator = require('./components/loading') const txHelper = require('../lib/tx-helper') const isPopupOrNotification = require('../../app/scripts/lib/is-popup-or-notification') +const log = require('loglevel') const PendingTx = require('./components/pending-tx') const PendingMsg = require('./components/pending-msg') diff --git a/old-ui/lib/tx-helper.js b/old-ui/lib/tx-helper.js index de3f00d2d..0a6f55a63 100644 --- a/old-ui/lib/tx-helper.js +++ b/old-ui/lib/tx-helper.js @@ -1,4 +1,5 @@ const valuesFor = require('../app/util').valuesFor +const log = require('loglevel') module.exports = function (unapprovedTxs, unapprovedMsgs, personalMsgs, typedMessages, network) { log.debug('tx-helper called with params:') diff --git a/package-lock.json b/package-lock.json index e29355da5..fad386909 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5827,29 +5827,15 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#71f123b676f2b2d81bc20f343670d90045a3d3d8", + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf", "ethereumjs-util": "5.1.3" }, "dependencies": { "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#71f123b676f2b2d81bc20f343670d90045a3d3d8", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf", "requires": { "bn.js": "4.11.8", - "ethereumjs-util": "4.5.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "keccakjs": "0.2.1", - "rlp": "2.0.0", - "secp256k1": "3.4.0" - } - } + "ethereumjs-util": "5.1.3" } }, "ethereumjs-util": { @@ -5915,6 +5901,61 @@ } } }, + "ethjs": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.2.9.tgz", + "integrity": "sha1-yagNR7ydVg9Z53gEnSIlXlgfMSs=", + "requires": { + "bn.js": "4.11.6", + "ethjs-abi": "0.2.0", + "ethjs-contract": "0.1.9", + "ethjs-filter": "0.1.5", + "ethjs-provider-http": "0.1.6", + "ethjs-query": "0.3.0", + "ethjs-unit": "0.1.6", + "ethjs-util": "0.1.3", + "js-sha3": "0.5.5", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "ethjs-format": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.3.tgz", + "integrity": "sha1-m9hnyu6CstvtmEYAuzAiDPPLWDA=", + "requires": { + "bn.js": "4.11.6", + "ethjs-schema": "0.1.9", + "ethjs-util": "0.1.3", + "is-hex-prefixed": "1.0.0", + "number-to-bn": "1.7.0", + "strip-hex-prefix": "1.0.0" + } + }, + "ethjs-query": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.0.tgz", + "integrity": "sha1-CAmNYQ+BvV+VSnpXq0mJ9+mBX8Q=", + "requires": { + "ethjs-format": "0.2.3", + "ethjs-rpc": "0.1.5" + } + }, + "ethjs-schema": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.9.tgz", + "integrity": "sha1-hYwqXacGrgSBK0zosetLSSHjMJI=" + }, + "ethjs-util": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", + "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + } + } + }, "ethjs-format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.2.tgz", @@ -5952,6 +5993,11 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.5.tgz", "integrity": "sha1-WXQOOzl3vNu5sRvDBoIB6Kzquw0=" + }, + "js-sha3": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", + "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" } } }, @@ -6134,16 +6180,16 @@ "integrity": "sha1-x7kULEtZUJsziiBLYyiupA3Txk4=" }, "ethjs": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.2.9.tgz", - "integrity": "sha1-yagNR7ydVg9Z53gEnSIlXlgfMSs=", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.3.6.tgz", + "integrity": "sha512-9ojnSkV5XXSM5vo0pKgZpE+SNBPxqSUN0dZmMP5dBZVFOYctRd9tfaZ80Jnde3M4JrfUhhkbG5QFvewitaAY7Q==", "requires": { "bn.js": "4.11.6", - "ethjs-abi": "0.2.0", + "ethjs-abi": "0.2.1", "ethjs-contract": "0.1.9", "ethjs-filter": "0.1.5", "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.0", + "ethjs-query": "0.3.4", "ethjs-unit": "0.1.6", "ethjs-util": "0.1.3", "js-sha3": "0.5.5", @@ -6155,13 +6201,14 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, - "ethjs-query": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.0.tgz", - "integrity": "sha1-CAmNYQ+BvV+VSnpXq0mJ9+mBX8Q=", + "ethjs-abi": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", + "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", "requires": { - "ethjs-format": "0.2.3", - "ethjs-rpc": "0.1.5" + "bn.js": "4.11.6", + "js-sha3": "0.5.5", + "number-to-bn": "1.7.0" } }, "ethjs-util": { @@ -6288,35 +6335,6 @@ "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.5.tgz", "integrity": "sha1-ARKvYBfCRnfjK4/esg5hlgGbdZg=" }, - "ethjs-format": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.3.tgz", - "integrity": "sha1-m9hnyu6CstvtmEYAuzAiDPPLWDA=", - "requires": { - "bn.js": "4.11.6", - "ethjs-schema": "0.1.9", - "ethjs-util": "0.1.3", - "is-hex-prefixed": "1.0.0", - "number-to-bn": "1.7.0", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, "ethjs-provider-http": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-provider-http/-/ethjs-provider-http-0.1.6.tgz", @@ -6378,11 +6396,6 @@ "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.1.5.tgz", "integrity": "sha1-CZ4i8n3EwYtpeKSF/DaxsPeWkIA=" }, - "ethjs-schema": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.9.tgz", - "integrity": "sha1-hYwqXacGrgSBK0zosetLSSHjMJI=" - }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -9370,15 +9383,336 @@ } }, "gulp-sass": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-3.1.0.tgz", - "integrity": "sha1-U9xLaKH13f5EJKtMJHZVJpqLdLc=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.1.tgz", + "integrity": "sha512-OMQEgWNggpog8Tc5v1MuI6eo+5iiPkVeLL76iBhDoEEScLUPfZlpvzmgTnLkpcqdrNodZxpz5qcv6mS2rulk3g==", "requires": { - "gulp-util": "3.0.8", + "chalk": "2.3.2", "lodash.clonedeep": "4.5.0", - "node-sass": "4.7.2", + "node-sass": "4.8.3", + "plugin-error": "1.0.1", + "replace-ext": "1.0.0", + "strip-ansi": "4.0.0", "through2": "2.0.3", "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "2.0.4" + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "node-sass": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", + "integrity": "sha512-tfFWhUsCk/Y19zarDcPo5xpj+IW3qCfOjVdHtYeG6S1CKbQOh1zqylnQK6cV3z9k80yxAnFX9Y+a9+XysDhhfg==", + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "1.0.1", + "arr-diff": "4.0.0", + "arr-union": "3.1.0", + "extend-shallow": "3.0.2" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "requires": { + "has-flag": "3.0.0" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + } } }, "gulp-sourcemaps": { @@ -14435,9 +14769,9 @@ } }, "metamask-logo": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/metamask-logo/-/metamask-logo-2.1.3.tgz", - "integrity": "sha1-F1zleuUMc0Szsdwy0v0LCOOXj9A=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/metamask-logo/-/metamask-logo-2.1.4.tgz", + "integrity": "sha512-hg/FzMfijpzGgLdZWH+KJKS56cRYaMEwcOq8UcnL/MznpgK4OMlJEaIfO8lg7P2F4Z74Ki+ulrTrFW6jf9L2bw==", "requires": { "gl-mat4": "1.1.4", "gl-vec3": "1.0.3" @@ -15182,6 +15516,7 @@ "version": "4.7.2", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "dev": true, "requires": { "async-foreach": "0.1.3", "chalk": "1.1.3", @@ -15207,17 +15542,20 @@ "assert-plus": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true }, "aws-sign2": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, "requires": { "hoek": "2.16.3" } @@ -15225,12 +15563,14 @@ "caseless": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true }, "cross-spawn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, "requires": { "lru-cache": "4.1.1", "which": "1.3.0" @@ -15240,6 +15580,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, "requires": { "boom": "2.10.1" } @@ -15248,6 +15589,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.5", @@ -15257,12 +15599,14 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true }, "har-validator": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, "requires": { "chalk": "1.1.3", "commander": "2.11.0", @@ -15274,6 +15618,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -15284,12 +15629,14 @@ "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true }, "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, "requires": { "assert-plus": "0.2.0", "jsprim": "1.4.1", @@ -15299,12 +15646,14 @@ "qs": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true }, "request": { "version": "2.79.0", "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, "requires": { "aws-sign2": "0.6.0", "aws4": "1.6.0", @@ -15332,6 +15681,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, "requires": { "hoek": "2.16.3" } @@ -15339,12 +15689,14 @@ "tunnel-agent": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true } } }, diff --git a/package.json b/package.json index d3cae3e15..057d3cb18 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "mascara": "gulp dev:mascara & node ./mascara/example/server", "dist": "gulp dist", "test": "npm run test:unit && npm run test:integration && npm run lint", - "test:unit": "cross-env METAMASK_ENV=test mocha --exit --require babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"", + "test:unit": "cross-env METAMASK_ENV=test mocha --exit --require test/setup.js --recursive \"test/unit/**/*.js\"", "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", "test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara", "test:integration:build": "gulp build:scss", diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 000000000..8e7965a37 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,5 @@ +require('babel-register')({ + ignore: name => name.includes('node_modules') && !name.includes('obs-store'), +}) + +require('./helper') diff --git a/test/unit/ComposableObservableStore.js b/test/unit/ComposableObservableStore.js new file mode 100644 index 000000000..3fba200c1 --- /dev/null +++ b/test/unit/ComposableObservableStore.js @@ -0,0 +1,35 @@ +const assert = require('assert') +const ComposableObservableStore = require('../../app/scripts/lib/ComposableObservableStore') +const ObservableStore = require('obs-store') + +describe('ComposableObservableStore', () => { + it('should register initial state', () => { + const store = new ComposableObservableStore('state') + assert.strictEqual(store.getState(), 'state') + }) + + it('should register initial structure', () => { + const testStore = new ObservableStore() + const store = new ComposableObservableStore(null, { TestStore: testStore }) + testStore.putState('state') + assert.deepEqual(store.getState(), { TestStore: 'state' }) + }) + + it('should update structure', () => { + const testStore = new ObservableStore() + const store = new ComposableObservableStore() + store.updateStructure({ TestStore: testStore }) + testStore.putState('state') + assert.deepEqual(store.getState(), { TestStore: 'state' }) + }) + + it('should return flattened state', () => { + const fooStore = new ObservableStore({ foo: 'foo' }) + const barStore = new ObservableStore({ bar: 'bar' }) + const store = new ComposableObservableStore(null, { + FooStore: fooStore, + BarStore: barStore, + }) + assert.deepEqual(store.getFlatState(), { foo: 'foo', bar: 'bar' }) + }) +}) diff --git a/ui/app/actions.js b/ui/app/actions.js index 0748a5bea..780edcaba 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -3,6 +3,7 @@ const getBuyEthUrl = require('../../app/scripts/lib/buy-eth-url') const { getTokenAddressFromTokenObject } = require('./util') const ethUtil = require('ethereumjs-util') const { fetchLocale } = require('../i18n-helper') +const log = require('loglevel') var actions = { _setBackgroundConnection: _setBackgroundConnection, diff --git a/ui/app/app.js b/ui/app/app.js index 75c3febb0..827b4e9ce 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -6,6 +6,7 @@ const { compose } = require('recompose') const h = require('react-hyperscript') const actions = require('./actions') const classnames = require('classnames') +const log = require('loglevel') // init const InitializeScreen = require('../../mascara/src/app/first-time').default diff --git a/ui/app/components/ens-input.js b/ui/app/components/ens-input.js index feb0a7037..aff4b6ef6 100644 --- a/ui/app/components/ens-input.js +++ b/ui/app/components/ens-input.js @@ -11,6 +11,7 @@ const ensRE = /.+\..+$/ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' const connect = require('react-redux').connect const ToAutoComplete = require('./send/to-autocomplete') +const log = require('loglevel') EnsInput.contextTypes = { t: PropTypes.func, diff --git a/ui/app/components/pages/home.js b/ui/app/components/pages/home.js index 7857a2a99..90b8e1d37 100644 --- a/ui/app/components/pages/home.js +++ b/ui/app/components/pages/home.js @@ -5,6 +5,7 @@ const { Redirect, withRouter } = require('react-router-dom') const { compose } = require('recompose') const h = require('react-hyperscript') const actions = require('../../actions') +const log = require('loglevel') // init const NewKeyChainScreen = require('../../new-keychain') diff --git a/ui/app/components/pages/keychains/restore-vault.js b/ui/app/components/pages/keychains/restore-vault.js index d57894e00..33575bfbb 100644 --- a/ui/app/components/pages/keychains/restore-vault.js +++ b/ui/app/components/pages/keychains/restore-vault.js @@ -6,6 +6,7 @@ const connect = require('../../../metamask-connect') const h = require('react-hyperscript') const { createNewVaultAndRestore, unMarkPasswordForgotten } = require('../../../actions') const { DEFAULT_ROUTE } = require('../../../routes') +const log = require('loglevel') class RestoreVaultPage extends PersistentForm { constructor (props) { diff --git a/ui/app/components/token-balance.js b/ui/app/components/token-balance.js index 2f71c0687..1900ccec7 100644 --- a/ui/app/components/token-balance.js +++ b/ui/app/components/token-balance.js @@ -4,6 +4,7 @@ const inherits = require('util').inherits const TokenTracker = require('eth-token-tracker') const connect = require('react-redux').connect const selectors = require('../selectors') +const log = require('loglevel') function mapStateToProps (state) { return { diff --git a/ui/app/components/token-list.js b/ui/app/components/token-list.js index 150a3762d..4189cf801 100644 --- a/ui/app/components/token-list.js +++ b/ui/app/components/token-list.js @@ -6,6 +6,7 @@ const TokenTracker = require('eth-token-tracker') const TokenCell = require('./token-cell.js') const connect = require('react-redux').connect const selectors = require('../selectors') +const log = require('loglevel') function mapStateToProps (state) { return { diff --git a/ui/app/conf-tx.js b/ui/app/conf-tx.js index fee7cd36f..b71538e31 100644 --- a/ui/app/conf-tx.js +++ b/ui/app/conf-tx.js @@ -6,6 +6,7 @@ const { withRouter } = require('react-router-dom') const { compose } = require('recompose') const actions = require('./actions') const txHelper = require('../lib/tx-helper') +const log = require('loglevel') const PendingTx = require('./components/pending-tx') const SignatureRequest = require('./components/signature-request') diff --git a/ui/app/keychains/hd/restore-vault.js b/ui/app/keychains/hd/restore-vault.js index 38ad14adb..913d20505 100644 --- a/ui/app/keychains/hd/restore-vault.js +++ b/ui/app/keychains/hd/restore-vault.js @@ -4,6 +4,7 @@ const PersistentForm = require('../../../lib/persistent-form') const connect = require('react-redux').connect const h = require('react-hyperscript') const actions = require('../../actions') +const log = require('loglevel') RestoreVaultScreen.contextTypes = { t: PropTypes.func, diff --git a/ui/app/main-container.js b/ui/app/main-container.js index 6dd4ff151..c305687ea 100644 --- a/ui/app/main-container.js +++ b/ui/app/main-container.js @@ -4,6 +4,7 @@ const inherits = require('util').inherits const AccountAndTransactionDetails = require('./account-and-transaction-details') const Settings = require('./components/pages/settings') const UnlockScreen = require('./components/pages/unlock') +const log = require('loglevel') module.exports = MainContainer diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js index 74a0f9299..2b39eb8db 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/reducers/app.js @@ -1,6 +1,7 @@ const extend = require('xtend') const actions = require('../actions') const txHelper = require('../../lib/tx-helper') +const log = require('loglevel') module.exports = reduceApp diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index 6d0a5bb10..0493a1ff7 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -358,7 +358,7 @@ function reduceMetamask (state, action) { welcomeScreenSeen: true, }) - case action.SET_CURRENT_LOCALE: + case actions.SET_CURRENT_LOCALE: return extend(metamaskState, { currentLocale: action.value, }) diff --git a/ui/index.js b/ui/index.js index 746e28eab..7b6faac76 100644 --- a/ui/index.js +++ b/ui/index.js @@ -6,8 +6,7 @@ const configureStore = require('./app/store') const txHelper = require('./lib/tx-helper') const { fetchLocale } = require('./i18n-helper') const { OLD_UI_NETWORK_TYPE, BETA_UI_NETWORK_TYPE } = require('../app/scripts/config').enums - -global.log = require('loglevel') +const log = require('loglevel') module.exports = launchMetamaskUi diff --git a/ui/lib/tx-helper.js b/ui/lib/tx-helper.js index de3f00d2d..0a6f55a63 100644 --- a/ui/lib/tx-helper.js +++ b/ui/lib/tx-helper.js @@ -1,4 +1,5 @@ const valuesFor = require('../app/util').valuesFor +const log = require('loglevel') module.exports = function (unapprovedTxs, unapprovedMsgs, personalMsgs, typedMessages, network) { log.debug('tx-helper called with params:') |