commit
0100923129
@ -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 |
||||
} |
||||
} |
@ -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" |
||||
} |
||||
} |
@ -0,0 +1,77 @@ |
||||
const ObservableStore = require('obs-store') |
||||
|
||||
// By default, poll every 3 minutes
|
||||
const DEFAULT_INTERVAL = 180 * 1000 |
||||
|
||||
/** |
||||
* A controller that polls for token exchange |
||||
* rates based on a user's current token list |
||||
*/ |
||||
class TokenRatesController { |
||||
/** |
||||
* Creates a TokenRatesController |
||||
* |
||||
* @param {Object} [config] - Options to configure controller |
||||
*/ |
||||
constructor ({ interval = DEFAULT_INTERVAL, preferences } = {}) { |
||||
this.store = new ObservableStore() |
||||
this.preferences = preferences |
||||
this.interval = interval |
||||
} |
||||
|
||||
/** |
||||
* Updates exchange rates for all tokens |
||||
*/ |
||||
async updateExchangeRates () { |
||||
if (!this.isActive) { return } |
||||
const contractExchangeRates = {} |
||||
for (const i in this._tokens) { |
||||
const address = this._tokens[i].address |
||||
contractExchangeRates[address] = await this.fetchExchangeRate(address) |
||||
} |
||||
this.store.putState({ contractExchangeRates }) |
||||
} |
||||
|
||||
/** |
||||
* Fetches a token exchange rate by address |
||||
* |
||||
* @param {String} address - Token contract address |
||||
*/ |
||||
async fetchExchangeRate (address) { |
||||
try { |
||||
const response = await fetch(`https://exchanges.balanc3.net/prices?from=${address}&to=ETH&autoConversion=false&summaryOnly=true`) |
||||
const json = await response.json() |
||||
return json && json.length ? json[0].averagePrice : 0 |
||||
} catch (error) { } |
||||
} |
||||
|
||||
/** |
||||
* @type {Number} |
||||
*/ |
||||
set interval (interval) { |
||||
this._handle && clearInterval(this._handle) |
||||
if (!interval) { return } |
||||
this._handle = setInterval(() => { this.updateExchangeRates() }, interval) |
||||
} |
||||
|
||||
/** |
||||
* @type {Object} |
||||
*/ |
||||
set preferences (preferences) { |
||||
this._preferences && this._preferences.unsubscribe() |
||||
if (!preferences) { return } |
||||
this._preferences = preferences |
||||
this.tokens = preferences.getState().tokens |
||||
preferences.subscribe(({ tokens = [] }) => { this.tokens = tokens }) |
||||
} |
||||
|
||||
/** |
||||
* @type {Array} |
||||
*/ |
||||
set tokens (tokens) { |
||||
this._tokens = tokens |
||||
this.updateExchangeRates() |
||||
} |
||||
} |
||||
|
||||
module.exports = TokenRatesController |
@ -1,69 +1,97 @@ |
||||
const asmcrypto = require('asmcrypto.js') |
||||
const Unibabel = require('browserify-unibabel') |
||||
|
||||
/** |
||||
* A Microsoft Edge-specific encryption class that exposes |
||||
* the interface expected by eth-keykeyring-controller |
||||
*/ |
||||
class EdgeEncryptor { |
||||
/** |
||||
* Encrypts an arbitrary object to ciphertext |
||||
* |
||||
* @param {string} password Used to generate a key to encrypt the data |
||||
* @param {Object} dataObject Data to encrypt |
||||
* @returns {Promise<string>} Promise resolving to an object with ciphertext |
||||
*/ |
||||
encrypt (password, dataObject) { |
||||
var salt = this._generateSalt() |
||||
return this._keyFromPassword(password, salt) |
||||
.then(function (key) { |
||||
var data = JSON.stringify(dataObject) |
||||
var dataBuffer = Unibabel.utf8ToBuffer(data) |
||||
var vector = global.crypto.getRandomValues(new Uint8Array(16)) |
||||
var resultbuffer = asmcrypto.AES_GCM.encrypt(dataBuffer, key, vector) |
||||
|
||||
encrypt (password, dataObject) { |
||||
var buffer = new Uint8Array(resultbuffer) |
||||
var vectorStr = Unibabel.bufferToBase64(vector) |
||||
var vaultStr = Unibabel.bufferToBase64(buffer) |
||||
return JSON.stringify({ |
||||
data: vaultStr, |
||||
iv: vectorStr, |
||||
salt: salt, |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
var salt = this._generateSalt() |
||||
return this._keyFromPassword(password, salt) |
||||
.then(function (key) { |
||||
/** |
||||
* Decrypts an arbitrary object from ciphertext |
||||
* |
||||
* @param {string} password Used to generate a key to decrypt the data |
||||
* @param {string} text Ciphertext of an encrypted object |
||||
* @returns {Promise<Object>} Promise resolving to copy of decrypted object |
||||
*/ |
||||
decrypt (password, text) { |
||||
const payload = JSON.parse(text) |
||||
const salt = payload.salt |
||||
return this._keyFromPassword(password, salt) |
||||
.then(function (key) { |
||||
const encryptedData = Unibabel.base64ToBuffer(payload.data) |
||||
const vector = Unibabel.base64ToBuffer(payload.iv) |
||||
return new Promise((resolve, reject) => { |
||||
var result |
||||
try { |
||||
result = asmcrypto.AES_GCM.decrypt(encryptedData, key, vector) |
||||
} catch (err) { |
||||
return reject(new Error('Incorrect password')) |
||||
} |
||||
const decryptedData = new Uint8Array(result) |
||||
const decryptedStr = Unibabel.bufferToUtf8(decryptedData) |
||||
const decryptedObj = JSON.parse(decryptedStr) |
||||
resolve(decryptedObj) |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
var data = JSON.stringify(dataObject) |
||||
var dataBuffer = Unibabel.utf8ToBuffer(data) |
||||
var vector = global.crypto.getRandomValues(new Uint8Array(16)) |
||||
var resultbuffer = asmcrypto.AES_GCM.encrypt(dataBuffer, key, vector) |
||||
/** |
||||
* Retrieves a cryptographic key using a password |
||||
* |
||||
* @private |
||||
* @param {string} password Password used to unlock a cryptographic key |
||||
* @param {string} salt Random base64 data |
||||
* @returns {Promise<Object>} Promise resolving to a derived key |
||||
*/ |
||||
_keyFromPassword (password, salt) { |
||||
|
||||
var buffer = new Uint8Array(resultbuffer) |
||||
var vectorStr = Unibabel.bufferToBase64(vector) |
||||
var vaultStr = Unibabel.bufferToBase64(buffer) |
||||
return JSON.stringify({ |
||||
data: vaultStr, |
||||
iv: vectorStr, |
||||
salt: salt, |
||||
}) |
||||
}) |
||||
} |
||||
var passBuffer = Unibabel.utf8ToBuffer(password) |
||||
var saltBuffer = Unibabel.base64ToBuffer(salt) |
||||
return new Promise((resolve) => { |
||||
var key = asmcrypto.PBKDF2_HMAC_SHA256.bytes(passBuffer, saltBuffer, 10000) |
||||
resolve(key) |
||||
}) |
||||
} |
||||
|
||||
decrypt (password, text) { |
||||
|
||||
const payload = JSON.parse(text) |
||||
const salt = payload.salt |
||||
return this._keyFromPassword(password, salt) |
||||
.then(function (key) { |
||||
const encryptedData = Unibabel.base64ToBuffer(payload.data) |
||||
const vector = Unibabel.base64ToBuffer(payload.iv) |
||||
return new Promise((resolve, reject) => { |
||||
var result |
||||
try { |
||||
result = asmcrypto.AES_GCM.decrypt(encryptedData, key, vector) |
||||
} catch (err) { |
||||
return reject(new Error('Incorrect password')) |
||||
} |
||||
const decryptedData = new Uint8Array(result) |
||||
const decryptedStr = Unibabel.bufferToUtf8(decryptedData) |
||||
const decryptedObj = JSON.parse(decryptedStr) |
||||
resolve(decryptedObj) |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
_keyFromPassword (password, salt) { |
||||
|
||||
var passBuffer = Unibabel.utf8ToBuffer(password) |
||||
var saltBuffer = Unibabel.base64ToBuffer(salt) |
||||
return new Promise((resolve) => { |
||||
var key = asmcrypto.PBKDF2_HMAC_SHA256.bytes(passBuffer, saltBuffer, 10000) |
||||
resolve(key) |
||||
}) |
||||
} |
||||
|
||||
_generateSalt (byteCount = 32) { |
||||
var view = new Uint8Array(byteCount) |
||||
global.crypto.getRandomValues(view) |
||||
var b64encoded = btoa(String.fromCharCode.apply(null, view)) |
||||
return b64encoded |
||||
} |
||||
/** |
||||
* Generates random base64 encoded data |
||||
* |
||||
* @private |
||||
* @returns {string} Randomized base64 encoded data |
||||
*/ |
||||
_generateSalt (byteCount = 32) { |
||||
var view = new Uint8Array(byteCount) |
||||
global.crypto.getRandomValues(view) |
||||
var b64encoded = btoa(String.fromCharCode.apply(null, view)) |
||||
return b64encoded |
||||
} |
||||
} |
||||
|
||||
module.exports = EdgeEncryptor |
||||
|
@ -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 |
@ -1,9 +1,13 @@ |
||||
// append dapp origin domain to request
|
||||
module.exports = createOriginMiddleware |
||||
|
||||
function createOriginMiddleware ({ origin }) { |
||||
return function originMiddleware (req, res, next, end) { |
||||
req.origin = origin |
||||
/** |
||||
* Returns a middleware that appends the DApp origin to request |
||||
* @param {{ origin: string }} opts - The middleware options |
||||
* @returns {Function} |
||||
*/ |
||||
function createOriginMiddleware (opts) { |
||||
return function originMiddleware (/** @type {any} */ req, /** @type {any} */ _, /** @type {Function} */ next) { |
||||
req.origin = opts.origin |
||||
next() |
||||
} |
||||
} |
||||
|
@ -0,0 +1,9 @@ |
||||
const ENVIRONMENT_TYPE_POPUP = 'popup' |
||||
const ENVIRONMENT_TYPE_NOTIFICATION = 'notification' |
||||
const ENVIRONMENT_TYPE_FULLSCREEN = 'fullscreen' |
||||
|
||||
module.exports = { |
||||
ENVIRONMENT_TYPE_POPUP, |
||||
ENVIRONMENT_TYPE_NOTIFICATION, |
||||
ENVIRONMENT_TYPE_FULLSCREEN, |
||||
} |
@ -1,10 +0,0 @@ |
||||
module.exports = function environmentType () { |
||||
const url = window.location.href |
||||
if (url.match(/popup.html$/)) { |
||||
return 'popup' |
||||
} else if (url.match(/home.html$/)) { |
||||
return 'responsive' |
||||
} else { |
||||
return 'notification' |
||||
} |
||||
} |
@ -1,12 +0,0 @@ |
||||
module.exports = function isPopupOrNotification () { |
||||
const url = window.location.href |
||||
// if (url.match(/popup.html$/) || url.match(/home.html$/)) {
|
||||
// Below regexes needed for feature toggles (e.g. see line ~340 in ui/app/app.js)
|
||||
// Revert below regexes to above commented out regexes before merge to master
|
||||
if (url.match(/popup.html(?:\?.+)*$/) || |
||||
url.match(/home.html(?:\?.+)*$/) || url.match(/home.html(?:#.*)*$/)) { |
||||
return 'popup' |
||||
} else { |
||||
return 'notification' |
||||
} |
||||
} |
@ -0,0 +1,134 @@ |
||||
{ |
||||
"metamask": { |
||||
"isInitialized": true, |
||||
"isUnlocked": true, |
||||
"featureFlags": {"betaUI": true}, |
||||
"rpcTarget": "https://rawtestrpc.metamask.io/", |
||||
"identities": { |
||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { |
||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", |
||||
"name": "Send Account 1" |
||||
}, |
||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { |
||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", |
||||
"name": "Send Account 2" |
||||
}, |
||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { |
||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", |
||||
"name": "Send Account 3" |
||||
}, |
||||
"0xd85a4b6a394794842887b8284293d69163007bbb": { |
||||
"address": "0xd85a4b6a394794842887b8284293d69163007bbb", |
||||
"name": "Send Account 4" |
||||
} |
||||
}, |
||||
"unapprovedTxs": {}, |
||||
"currentCurrency": "USD", |
||||
"conversionRate": 19855, |
||||
"conversionDate": 1489013762, |
||||
"noActiveNotices": true, |
||||
"frequentRpcList": [], |
||||
"network": "3", |
||||
"accounts": { |
||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { |
||||
"code": "0x", |
||||
"balance": "0x47c9d71831c76efe", |
||||
"nonce": "0x1b", |
||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" |
||||
}, |
||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { |
||||
"code": "0x", |
||||
"balance": "0x37452b1315889f80", |
||||
"nonce": "0xa", |
||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" |
||||
}, |
||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { |
||||
"code": "0x", |
||||
"balance": "0x30c9d71831c76efe", |
||||
"nonce": "0x1c", |
||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" |
||||
}, |
||||
"0xd85a4b6a394794842887b8284293d69163007bbb": { |
||||
"code": "0x", |
||||
"balance": "0x0", |
||||
"nonce": "0x0", |
||||
"address": "0xd85a4b6a394794842887b8284293d69163007bbb" |
||||
} |
||||
}, |
||||
"addressBook": [ |
||||
{ |
||||
"address": "0x06195827297c7a80a443b6894d3bdb8824b43896", |
||||
"name": "Address Book Account 1" |
||||
} |
||||
], |
||||
"tokens": [], |
||||
"transactions": {}, |
||||
"selectedAddressTxList": [], |
||||
"unapprovedMsgs": {}, |
||||
"unapprovedMsgCount": 0, |
||||
"unapprovedPersonalMsgs": {}, |
||||
"unapprovedPersonalMsgCount": 0, |
||||
"keyringTypes": [ |
||||
"Simple Key Pair", |
||||
"HD Key Tree" |
||||
], |
||||
"keyrings": [ |
||||
{ |
||||
"type": "HD Key Tree", |
||||
"accounts": [ |
||||
"fdea65c8e26263f6d9a1b5de9555d2931a33b825", |
||||
"c5b8dbac4c1d3f152cdeb400e2313f309c410acb", |
||||
"2f8d4a878cfa04a6e60d46362f5644deab66572d" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "Simple Key Pair", |
||||
"accounts": [ |
||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" |
||||
] |
||||
} |
||||
], |
||||
"selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", |
||||
"currentCurrency": "PHP", |
||||
"provider": { |
||||
"type": "testnet" |
||||
}, |
||||
"shapeShiftTxList": [], |
||||
"lostAccounts": [], |
||||
"send": { |
||||
"gasLimit": null, |
||||
"gasPrice": null, |
||||
"gasTotal": "0xb451dc41b578", |
||||
"tokenBalance": null, |
||||
"from": "", |
||||
"to": "", |
||||
"amount": "0x0", |
||||
"memo": "", |
||||
"errors": {}, |
||||
"maxModeOn": false, |
||||
"editingTransactionId": null |
||||
}, |
||||
"currentLocale": "en" |
||||
}, |
||||
"appState": { |
||||
"menuOpen": false, |
||||
"currentView": { |
||||
"name": "accountDetail", |
||||
"detailView": null, |
||||
"context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" |
||||
}, |
||||
"accountDetail": { |
||||
"subview": "transactions" |
||||
}, |
||||
"modal": { |
||||
"modalState": {}, |
||||
"previousModalState": {} |
||||
}, |
||||
"transForward": true, |
||||
"isLoading": false, |
||||
"warning": null, |
||||
"scrollToBottom": false, |
||||
"forgottenPassword": null |
||||
}, |
||||
"identities": {} |
||||
} |
@ -0,0 +1,25 @@ |
||||
{ |
||||
"tags": { |
||||
"allowUnknownTags": false |
||||
}, |
||||
"source": { |
||||
"include": "app/scripts/", |
||||
"includePattern": ".js$", |
||||
"excludePattern": "(node_modules/|docs)" |
||||
}, |
||||
"plugins": [ |
||||
"plugins/markdown" |
||||
], |
||||
"opts": { |
||||
"template": "node_modules/radgrad-jsdoc-template/", |
||||
"encoding": "utf8", |
||||
"destination": "docs/jsdocs", |
||||
"recurse": true, |
||||
"verbose": true |
||||
}, |
||||
"templates": { |
||||
"cleverLinks": false, |
||||
"monospaceLinks": false |
||||
} |
||||
} |
||||
|
@ -0,0 +1,15 @@ |
||||
# Development Tools & Configurations |
||||
|
||||
This folder contains configuration files which are used by the the different |
||||
development-tools, like e.g. JsDoc. |
||||
|
||||
|
||||
## Appveyor |
||||
|
||||
|
||||
https://www.appveyor.com/docs/build-configuration/#alternative-yaml-file-location |
||||
|
||||
Withtin the configuration, point to a weblocation of a txt config file: |
||||
|
||||
https://ci.appveyor.com/project/lazaridiscom/mm-vault/settings |
||||
https://raw.githubusercontent.com/lazaridiscom/mm-vault/master/dev/tools/appveyor.txt |
@ -0,0 +1,21 @@ |
||||
# Test against the latest version of this Node.js version |
||||
environment: |
||||
nodejs_version: "8" |
||||
|
||||
# Install scripts. (runs after repo cloning) |
||||
install: |
||||
# Get the latest stable version of Node.js or io.js |
||||
- ps: Install-Product node $env:nodejs_version |
||||
# install modules |
||||
- npm install |
||||
|
||||
# Post-install test scripts. |
||||
test_script: |
||||
# Output useful info for debugging. |
||||
- node --version |
||||
- npm --version |
||||
# run tests |
||||
- npm test |
||||
|
||||
# Don't actually build. |
||||
build: off |
@ -0,0 +1,78 @@ |
||||
# The Team |
||||
|
||||
Here is an overview of the current MetaMask team, and their primary roles and responsibilities, in the order they joined the team. |
||||
|
||||
## Core Team Members |
||||
|
||||
The core team maintains aspects of the main product (the extension) and the core libraries (the MetaMask Controller, provider-engine, etc). |
||||
|
||||
### Aaron Davis |
||||
|
||||
@kumavis |
||||
Founder / Technical Lead |
||||
|
||||
Especially in charge of connection to the blockchain. Wrote [provider-engine](https://github.com/MetaMask/provider-engine), and is currently working with @hermanjunge on our JavaScript light-client. |
||||
|
||||
### Dan Finlay |
||||
|
||||
@danfinlay |
||||
Software Engineer / Product Lead |
||||
|
||||
Focused on the deliverable, user-valuable aspects of MetaMask, including usability and documentation. Coordinates efforts between different branches of the team, and integrations with other projects. |
||||
|
||||
### Frankie Pangilinan |
||||
|
||||
@frankiebee |
||||
Software Engineer / Transaction Manager Lead |
||||
|
||||
Frankie contributes code throughout MetaMask, but has become especially specialized in the way MetaMask manages transactions. She is also the original lead of the [Mascara](https://github.com/MetaMask/mascara) project. |
||||
|
||||
### Kevin Serrano |
||||
|
||||
@Zanibas |
||||
Software Engineer / Project Management Lead |
||||
|
||||
Kevin is a software engineer, but also spends a lot of his time keeping the team's administrative operations running smoothly. |
||||
|
||||
### Thomas Huang |
||||
|
||||
@tmashuang |
||||
QA Engineer |
||||
|
||||
Thomas is the head of MetaMask Quality Assurance. He both takes the final pass of branches of code before we ship to production, and is also in charge of continuously improving our automated quality assurance process. |
||||
|
||||
### Christian Jeria |
||||
|
||||
@cjeria |
||||
User Experience Designer |
||||
|
||||
Christian is the lead of MetaMask's user experience. He is continuously designing prototypes, testing them with users, and refining them with our developers for production. |
||||
|
||||
### Paul Bouchon |
||||
|
||||
@bitpshr |
||||
Software Engineer |
||||
|
||||
The newest member of the team! Paul is currently being onboarded, and finding his niche within the team. |
||||
|
||||
## Laboratory Team Members |
||||
|
||||
These team members are working on projects that will benefit MetaMask, but are not directly working on the product itself. |
||||
|
||||
### Herman Junge |
||||
|
||||
@hermanjunge |
||||
Software Engineer |
||||
|
||||
Herman is currently leading the Mustekala project, a JavaScript, IPFS-based Ethereum light client. |
||||
|
||||
## Kyokan Team Members |
||||
|
||||
[Kyokan](http://kyokan.io/) is a consulting firm that has been working closely with the MetaMask team on the latest version of our user interface. Their team members are not members of ConsenSys LLC, but they contribute a lot to the project. |
||||
|
||||
- Daniel Tsui (@sdsui) |
||||
- Chi Kei Chan (@chikeichan) |
||||
- Dan Miller (@danjm) |
||||
- David Yoo (@yookd) |
||||
- Whymarrh Whitby (@whymarrh) |
||||
|
@ -0,0 +1,28 @@ |
||||
const reactTriggerChange = require('../../lib/react-trigger-change') |
||||
const { |
||||
timeout, |
||||
queryAsync, |
||||
findAsync, |
||||
} = require('../../lib/util') |
||||
|
||||
QUnit.module('currency localization') |
||||
|
||||
QUnit.test('renders localized currency', (assert) => { |
||||
const done = assert.async() |
||||
runCurrencyLocalizationTest(assert).then(done).catch((err) => { |
||||
assert.notOk(err, `Error was thrown: ${err.stack}`) |
||||
done() |
||||
}) |
||||
}) |
||||
|
||||
async function runCurrencyLocalizationTest(assert, done) { |
||||
console.log('*** start runCurrencyLocalizationTest') |
||||
const selectState = await queryAsync($, 'select') |
||||
selectState.val('currency localization') |
||||
reactTriggerChange(selectState[0]) |
||||
await timeout(1000) |
||||
const txView = await queryAsync($, '.tx-view') |
||||
const heroBalance = await findAsync($(txView), '.hero-balance') |
||||
const fiatAmount = await findAsync($(heroBalance), '.fiat-amount') |
||||
assert.equal(fiatAmount[0].textContent, '₱102,707.97') |
||||
} |
@ -0,0 +1,5 @@ |
||||
require('babel-register')({ |
||||
ignore: name => name.includes('node_modules') && !name.includes('obs-store'), |
||||
}) |
||||
|
||||
require('./helper') |
@ -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' }) |
||||
}) |
||||
}) |
@ -0,0 +1,27 @@ |
||||
const assert = require('assert') |
||||
const currencyFormatter = require('currency-formatter') |
||||
const infuraConversion = require('../../ui/app/infura-conversion.json') |
||||
|
||||
describe('currencyFormatting', function () { |
||||
it('be able to format any infura currency', function (done) { |
||||
const number = 10000 |
||||
|
||||
infuraConversion.objects.forEach((conversion) => { |
||||
const code = conversion.quote.code.toUpperCase() |
||||
const result = currencyFormatter.format(number, { code }) |
||||
|
||||
switch (code) { |
||||
case 'USD': |
||||
assert.equal(result, '$10,000.00') |
||||
break |
||||
case 'JPY': |
||||
assert.equal(result, '¥10,000') |
||||
break |
||||
default: |
||||
assert.ok(result, `Currency ${code} formatted as ${result}`) |
||||
} |
||||
}) |
||||
|
||||
done() |
||||
}) |
||||
}) |
@ -0,0 +1,29 @@ |
||||
const assert = require('assert') |
||||
const sinon = require('sinon') |
||||
const TokenRatesController = require('../../app/scripts/controllers/token-rates') |
||||
const ObservableStore = require('obs-store') |
||||
|
||||
describe('TokenRatesController', () => { |
||||
it('should listen for preferences store updates', () => { |
||||
const preferences = new ObservableStore({ tokens: [] }) |
||||
const controller = new TokenRatesController({ preferences }) |
||||
preferences.putState({ tokens: ['foo'] }) |
||||
assert.deepEqual(controller._tokens, ['foo']) |
||||
}) |
||||
|
||||
it('should poll on correct interval', async () => { |
||||
const stub = sinon.stub(global, 'setInterval') |
||||
new TokenRatesController({ interval: 1337 }) // eslint-disable-line no-new
|
||||
assert.strictEqual(stub.getCall(0).args[1], 1337) |
||||
stub.restore() |
||||
}) |
||||
|
||||
it('should fetch each token rate based on address', async () => { |
||||
const controller = new TokenRatesController() |
||||
controller.isActive = true |
||||
controller.fetchExchangeRate = address => address |
||||
controller.tokens = [{ address: 'foo' }, { address: 'bar' }] |
||||
await controller.updateExchangeRates() |
||||
assert.deepEqual(controller.store.getState().contractExchangeRates, { foo: 'foo', bar: 'bar' }) |
||||
}) |
||||
}) |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue