From 8278ed62c95313caeb33d6507d6f889db9bd59b0 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 17 May 2018 16:34:30 +0900 Subject: [PATCH 001/166] Fix - 335 - new app.icns orange --- resources/bitcoin.com/mac/app.icns | Bin 80461 -> 272024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/bitcoin.com/mac/app.icns b/resources/bitcoin.com/mac/app.icns index 2d97c490830f92347af9a865c63cf39f1e98cd4a..40aa3ea77563668394d907b398d7d8b802581c92 100644 GIT binary patch literal 272024 zcmb@tWmp|g@Gdy#;Of^`^?PUQYU+|T7bC(Y z!yy7HWD`Bmq^uXc_ol`_{U!1d*sQ^Qa3;pR)TJkubNVj-mI$|UOk((Uzgz|N4M+ae>rc|{uWH`s z0UGi^b9~^NgLvV>4DxE$`qE|*&mP9?^|BgxFQQ!+(t*jL%PJ1+EK0#A4rf9j?i@bp zl!xfw&IT^EO|-;|rZ2N|IAC=xSp89!b>b51da6H}ac?gGQ@2`r3g{r~BCYtgFONIx z{ZC9R6+xC;9e`st8Kj!57)<9WH%tMOQ!jL?C^mDrUymdIVur&`go?kfe8pU#R* zD;6pAmXNf`?OCc<7H?Fut1s3p3FoMQ)!&e7HTf8H*+{S*e^}iiclKTv87wFHvO-8y z;h{0nruONSG7c~fpKaV@`1g$CoTn#gEm#4IsJuof3YXC(Z*r0NKq3R%BfU;FL`iPP4SrcMR!N9{w28_^nqze3VuZZxs~xwu)kw+#-O0W>Pin zNGFRSe`Ll+#!vOxJdp^-y8wVZS=^s_X zyWibU(%J6b)zwLQsjmoUD``&t@vzoLUzRAht%q8Qp|>CJ95n260a?f@*Y+7~WrdP? z_&q#q)AFE*)Sn}1QgQlqw<#W~0vu|UztG~v#Q64e25(sjNrV=9#YaahF&3tqNZV zd0HwWe3|`*uWwwpZPhY^@+s+kG&g`ISCG%b7i zr3N0$sAaD?NWJWc^iDl%U=@C4(C4`-z!2U+QsRAJmnRi_j8L(}j`isV9MNtnL{GC* z_YUb{MY?iP*sCbZ&9i@2En+hp4S&FV28|Vel&jS=Hl6*Wc=^1d%KU8zbDv|g%7?al z@iQuLys_WYHum$7F`ohC?s|Cl@`c5Oe%ovDM8`cSoo@g1X4yQPg-!OyT z{NV#Y#zl!rE(j-)h_&bdcmmuG;U&|J3e5VsLb@PiW_y8WYjeC0!TLQP42lXE1lj^+ zU23$@??~47FI*8Lx#nN2zMZ)bS|iO_M6g4;R@$s`rG~bKr%uX(8UXP z98w?rjZxhitN;8(VUco-=IyGTeWSV(e0xEXj}esYQAp2Q$=$@Bv6KRxSL`n*&+w`j z>#kIz25^nFIUI}{eC2(n44TutN0*!l)@tWKgmA3xwm-R)3lrXWYyJ61r@FH{;a64d zjoLYQ&LX?WZo)#})XAACCSQ9ROeK*l&tb5>)7%lnEBf{~l&O()tKn8s4B5+_-(TCu z?r@<&#TEHq18hOQ_m#RxL0Uf(EF#hP&;Ta1!1EC%Mv-PgV;bVJ4YZtfy`XV)ql5P2 zZ4r~~HkmB4-Or(^C~z)Brs<~NoW>6&_G{UfImAX+yl9SfOJuQL|KtX+TgFP$;9>Xh zZyFPsAA|*eX7E<5@`>~-8*V^iChQ^7wCWyw>8e0xGAzb+yddj<{iwK>ASmM z4V|L&+*|MAFew%BFL2zJO#<)-N@;5VjWt4f6Rm{2yhWJx3Sf2fG3;WJp>jR(Uj`;) zc35S{w3jdAxVj8VmDflj4l{7+w77)coiJ#gEgbsDjh2L(K2RL;@@`Wkdc8XojN`I6UHuCFX58S-v%0D+vDTlsC}wQkIk>NMpski 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
ca0{4Ljez2^!qo!AE6LRWrgxWjhp4 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 z%0D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

oE} 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

Ey;Kc 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 From db44589d8bc3edac5d270b9874a67e099a843e0b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 24 May 2018 15:33:09 +0900 Subject: [PATCH 002/166] Fix - 355 - Consistency with the app name + Gruntfile PList MacOS app --- Gruntfile.js | 4 ++++ app-template/bitcoincom/appConfig.json | 4 ++-- app-template/package-template.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 9653c99b0..90b32f818 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -237,6 +237,10 @@ module.exports = function(grunt) { macIcns: './resources/<%= pkg.name %>/mac/app.icns', exeIco: './www/img/app/logo.ico', macPlist: { + 'CFBundleIdentifier': 'com.bitcoin.mwallet.mac', + 'CFBundleDisplayName': '<%= pkg.title %>', + 'CFBundleShortVersionString': '<%= pkg.version %>', + 'LSApplicationCategoryType': 'public.app-category.finance', 'CFBundleURLTypes': [ { 'CFBundleURLName': 'URI Handler', diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index b87f3dbd2..c521a08ba 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -2,7 +2,7 @@ "packageName": "bitcoin.com", "packageDescription": "Bitcoin.com Wallet", "packageNameId": "com.bitcoin.mwallet", - "userVisibleName": "Bitcoin.com", + "userVisibleName": "Bitcoin.com Wallet", "purposeLine": "Bitcoin.com Wallet", "bundleName": "bitcoincom", "appUri": "bitcoincom", @@ -18,7 +18,7 @@ "appDescription": "Bitcoin.com Wallet", "winAppName": "BitcoinWallet", "WindowsStoreIdentityName": "18C7659D.Bitcoin.com-SecureBitcoinWallet", - "WindowsStoreDisplayName": "Bitcoin.com - Secure Bitcoin Wallet", + "WindowsStoreDisplayName": "Bitcoin.com Wallet", "wpPublisherId": "{31cdd08b-457c-413d-b440-f6665eec847d}", "wpProductId": "{5381aa50-9069-11e4-84cc-293caf9cbdc8}", "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", diff --git a/app-template/package-template.json b/app-template/package-template.json index 955e33e7e..2ee9e6d14 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -14,7 +14,7 @@ "main": "www/index.html", "title": "*USERVISIBLENAME*", "window": { - "title": "*USERVISIBLENAME* - *PURPOSELINE*", + "title": "*USERVISIBLENAME*", "icon": "www/img/app/icon.png", "toolbar": false, "show": true, From b24319128fe509ac5a5b7c5ee03d2bd979ff536e Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 29 May 2018 10:21:39 +0900 Subject: [PATCH 003/166] Improvement - 335 - Automation --- app-template/bitcoincom/appConfig.json | 2 +- app-template/package-template.json | 1 + resources/bitcoin.com/mac/build.cfg | 32 +++ resources/bitcoin.com/mac/build_mas.py | 253 ++++++++++++++++++ .../bitcoin.com/mac/entitlements-child.plist | 10 + .../bitcoin.com/mac/entitlements-parent.plist | 16 ++ 6 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 resources/bitcoin.com/mac/build.cfg create mode 100755 resources/bitcoin.com/mac/build_mas.py create mode 100644 resources/bitcoin.com/mac/entitlements-child.plist create mode 100644 resources/bitcoin.com/mac/entitlements-parent.plist diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 174adc6d9..8d450e25d 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -25,8 +25,8 @@ "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", "version": "4.11.0", - "fullVersion": "4.11-rc1", "androidVersion": "411000", + "fullVersion": "4.11-rc1", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, diff --git a/app-template/package-template.json b/app-template/package-template.json index 222bbcf7e..65c97f7e9 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -3,6 +3,7 @@ "description": "*DESCRIPTION*", "author": "BitPay", "version": "*VERSION*", + "androidVersion": "*ANDROIDVERSION*", "fullVersion": "*FULLVERSION*", "keywords": [ "bitcoin", diff --git a/resources/bitcoin.com/mac/build.cfg b/resources/bitcoin.com/mac/build.cfg new file mode 100644 index 000000000..c4c840b94 --- /dev/null +++ b/resources/bitcoin.com/mac/build.cfg @@ -0,0 +1,32 @@ +[Sign] +## [REQUIRED] Your Application Certificate Identity +ApplicationIdentity = 3rd Party Mac Developer Application: Saint Bitts LLC (299HJ3G3BP) +## [OPTIONAL] Parent entitlements file +ParentEntitlements = entitlements-parent.plist +## [OPTIONAL] Child entitlements file +ChildEntitlements = entitlements-child.plist +## [OPTIONAL] Sandbox. Default: Yes +Sandbox = Yes + +[Package] +## [REQUIRED for --pkg] Your Installer Certificate Identity +InstallerIdentity = 3rd Party Mac Developer Installer: Saint Bitts LLC (299HJ3G3BP) +## [OPTIONAL for --pkg] Installation path +InstallPath = /Applications + +[Info.plist] +## [OPTIONAL] Your app bundle identifier +CFBundleIdentifier = com.bitcoin.mwallet.mac +## [REQUIRED] Team ID obtained from Apple Developer -> Membership -> Team ID +NWTeamID = 299HJ3G3BP +## Properties of Info.plist will be overwritten in this section. + +[Resources] +## [OPTIONAL] Your custom icon file +Icon = /Users/jean-baptistedominguez/Documents/projects/wallet-ionic/resources/bitcoin.com/mac/app.icns +## [OPTIONAL] Locales +## If Locales is not set, all current locales are preserved. +## If comma separated locale list (e.g. en,fr,zh_CN) is given, you should have +## additional [Locale locale_name] section for each locale containing localized strings. +## Locales not in the list will be removed. +Locales = en \ No newline at end of file diff --git a/resources/bitcoin.com/mac/build_mas.py b/resources/bitcoin.com/mac/build_mas.py new file mode 100755 index 000000000..d067abacd --- /dev/null +++ b/resources/bitcoin.com/mac/build_mas.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python + +import argparse +import ConfigParser +import shutil +import os +import fnmatch +import plistlib +import tempfile +from datetime import datetime +import sys +import io + +bundleid = None +verbose = False + +def info(msg): + global verbose + if verbose: + print '[INFO] %s' % msg + +def error(msg): + print '[ERROR] %s' % msg + print '\nFailed.' + sys.exit(1) + +def system(cmd): + info(cmd) + os.system(cmd) + +def check_options(config, section, required_options, msg): + missed_options = [] + + for option in required_options: + if not config.has_option(section, option): + missed_options.append(option) + + if len(missed_options) != 0: + error(msg % (section, ', '.join(missed_options))) + +def glob(pathname, pattern, returnOnFound=False): + matches = [] + for root, dirnames, filenames in os.walk(pathname): + for dirname in fnmatch.filter(dirnames, pattern): + if returnOnFound: + return os.path.join(root, dirname) + matches.append(os.path.join(root, dirname)) + for filename in fnmatch.filter(filenames, pattern): + if returnOnFound: + return os.path.join(root, filename) + matches.append(os.path.join(root, filename)) + return matches + +def get_bundle_id(args): + global bundleid + if bundleid is None: + plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist')) + bundleid = plist['CFBundleIdentifier'] + return bundleid + +def get_from_info_plist(args, key, default=None): + plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist')) + if key in plist: + return plist[key] + else: + return default + +def patch_info_plist_file(file, replaces): + plist = plistlib.readPlist(file) + for (key, val) in replaces: + plist[key] = val + plistlib.writePlist(plist, file) + +def generate_infoplist_strings_file(file, items): + with io.open(file, 'w', encoding='utf-16') as fd: + for item in items: + fd.write(unicode('%s = "%s";\n' % item, 'utf-8')) + +def read_config(args): + print '\nParsing config file %s' % args.config_file + if not os.path.isfile(args.config_file): + error('%s does not exist' % args.config_file) + config = ConfigParser.SafeConfigParser() + config.optionxform = str # set to str to prevent transforming into lower cases + config.read(args.config_file) + check_options(config, 'Sign', ['ApplicationIdentity'], 'Missed options in [%s]: %s') + if args.pkg: + check_options(config, 'Package', ['InstallerIdentity'], 'Missed options for --pkg in [%s]: %s') + return config + +def copy_to_output(args): + print '\nCopying %s to %s' % (args.input, args.output) + shutil.rmtree(args.output, ignore_errors=True) + shutil.copytree(args.input, args.output, symlinks=True) # symblic links are required + +def patch_info_plist(config, args): + print '\nPatching Info.plist files' + + replaces = [] + for (key, val) in config.items('Info.plist'): + replaces.append((key, val)) + + file = os.path.join(args.output, 'Contents/Info.plist') + info(file) + patch_info_plist_file(file, replaces) + + info_plist_files = glob(os.path.join(args.output, 'Contents/Versions'), 'Info.plist') + for file in info_plist_files: + if 'nwjs Framework' in file: + tmp_replaces = [('CFBundleIdentifier', '%s.framework' % get_bundle_id(args))] + elif 'nwjs Helper' in file: + tmp_replaces = [('CFBundleIdentifier', '%s.helper' % get_bundle_id(args))] + else: + error('Cannot patch unknown Info.plist %s' % file) + info(file) + patch_info_plist_file(file, tmp_replaces) + +def patch_locales(config, args): + print '\nPatching locales' + locales = config.get('Resources', 'Locales').split(',') + removed_locales = [] + generated_locales = [] + for infoplist_strings_file in glob(os.path.join(args.output, 'Contents/Resources'), 'InfoPlist.strings'): + locale_dir = os.path.dirname(infoplist_strings_file) + (locale, _) = os.path.splitext(os.path.basename(locale_dir)) + if locale not in locales: + removed_locales.append(locale) + shutil.rmtree(locale_dir) + elif config.has_section('Locale %s' % locale): + generated_locales.append(locale) + generate_infoplist_strings_file(infoplist_strings_file, config.items('Locale %s' % locale)) + else: + error('Missing [Locale %s] section' % locale) + + if len(generated_locales) > 0: + info('Generated locales for %s' % ', '.join(generated_locales)) + if len(removed_locales) > 0: + info('Removed locales for %s' % ', '.join(removed_locales)) + + removed_paks = [] + for local_pak in glob(os.path.join(args.output, 'Contents/Versions'), 'locale.pak'): + locale_dir = os.path.dirname(local_pak) + (locale, _) = os.path.splitext(os.path.basename(locale_dir)) + if locale != 'en' and locale not in locales: + removed_paks.append(locale) + shutil.rmtree(locale_dir) + + if len(removed_paks) > 0: + info('Removed .pak files for %s' % ', '.join(removed_locales)) + +def patch_icon(config, args): + plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist')) + icon = os.path.join(os.path.dirname(args.config_file), config.get('Resources', 'Icon')) + dest_icon = os.path.join(args.output, 'Contents/Resources/%s' % plist['CFBundleIconFile']) + info('Copying icon from %s to %s' % (icon, dest_icon)) + shutil.copy2(icon, dest_icon) + +def codesign_app(config, args): + print '\nCodesigning' + + bundleid = get_bundle_id(args) + + identity = config.get('Sign', 'ApplicationIdentity') + sandbox = True + if config.has_option('Sign', 'Sandbox'): + sandbox = config.getboolean('Sign', 'Sandbox') + + ## sign child frameworks and helpers + (_, tmp_child_entitlements) = tempfile.mkstemp() + if config.has_option('Sign', 'ChildEntitlements'): + child = config.get('Sign', 'ChildEntitlements') + child_entitlements = plistlib.readPlist(child) + else: + child_entitlements = { + 'com.apple.security.app-sandbox' : sandbox, + 'com.apple.security.inherit' : True + } + + plistlib.writePlist(child_entitlements, tmp_child_entitlements) + info('Child entitlements: %s' % tmp_child_entitlements) + framework = glob(args.output, 'nwjs Framework.framework', returnOnFound=True) + system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, framework)) + helperApp = glob(args.output, 'nwjs Helper.app', returnOnFound=True) + system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, helperApp)) + + ## sign parent app + (_, tmp_parent_entitlements) = tempfile.mkstemp() + if config.has_option('Sign', 'ParentEntitlements'): + parent = config.get('Sign', 'ParentEntitlements') + parent_entitlements = plistlib.readPlist(parent) + else: + parent_entitlements = {} + teamid = get_from_info_plist(args, 'NWTeamID', default=None) + if teamid is None: + groupid = bundleid + else: + groupid = '%s.%s' % (teamid, bundleid) + parent_entitlements['com.apple.security.app-sandbox'] = sandbox + parent_entitlements['com.apple.security.application-groups'] = [groupid] + plistlib.writePlist(parent_entitlements, tmp_parent_entitlements) + + info('Parent entitlements: %s' % tmp_parent_entitlements) + system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_parent_entitlements, args.output)) + +def productbuild(config, args): + print '\nRunning productbuild' + installer_identity = config.get('Package', 'InstallerIdentity') + if config.has_option('Package', 'InstallPath'): + install_path = config.get('Package', 'InstallPath') + else: + install_path = '/Applications' + system('productbuild --component "%s" "%s" --sign "%s" "%s"' % (args.output, install_path, installer_identity, args.pkg)) + +def main(): + parser = argparse.ArgumentParser(description='Signing tool for NW.js app') + parser.add_argument('-C', '--config-file', default='build.cfg', help='config file. (default: build.cfg)') + parser.add_argument('-I', '--input', default='nwjs.app', help='path to input app. (default: nwjs.app)') + parser.add_argument('-O', '--output', default='nwjs_output.app', help='path to output app. (default: nwjs_output.app)') + parser.add_argument('-S', '--skip-patching', default=False, help='run codesign without patching the app. (default: False)', action='store_true') + parser.add_argument('-P', '--pkg', default=None, help='run productbuild to generate .pkg after codesign. (default: None)') + parser.add_argument('-V', '--verbose', default=False, help='display detailed information. (default: False)', action='store_true') + args = parser.parse_args() + + global verbose + verbose = args.verbose + + # read config file + config = read_config(args) + + # make a copy + copy_to_output(args) + + if not args.skip_patching: + # patch Info.plist + patch_info_plist(config, args) + + # process resources & locales + if config.has_section('Resources'): + if config.has_option('Resources', 'Locales'): + patch_locales(config, args) + if config.has_option('Resources', 'Icon'): + patch_icon(config, args) + + # codesign + codesign_app(config, args) + + if args.pkg: + productbuild(config, args) + + print '\nDone.' + +if __name__ == "__main__": + main() diff --git a/resources/bitcoin.com/mac/entitlements-child.plist b/resources/bitcoin.com/mac/entitlements-child.plist new file mode 100644 index 000000000..635e25aac --- /dev/null +++ b/resources/bitcoin.com/mac/entitlements-child.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.inherit + + + \ No newline at end of file diff --git a/resources/bitcoin.com/mac/entitlements-parent.plist b/resources/bitcoin.com/mac/entitlements-parent.plist new file mode 100644 index 000000000..12d6997e3 --- /dev/null +++ b/resources/bitcoin.com/mac/entitlements-parent.plist @@ -0,0 +1,16 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + $GROUPID + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.device.camera + + + From 13cc248c1dfa26740deb1e488981fac19ad43cf9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 29 May 2018 10:23:27 +0900 Subject: [PATCH 004/166] Improvement - 335 - update macos script --- app-template/build-macos.sh | 44 +++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/app-template/build-macos.sh b/app-template/build-macos.sh index 5f09bd0b2..ac19b8197 100755 --- a/app-template/build-macos.sh +++ b/app-template/build-macos.sh @@ -66,25 +66,6 @@ SIZE=250 if [ $? -ne 0 ]; then echo "Error: Cannot compute size of staging dir" exit - fi - -# Sign Code (MATIAS) -if [ $SHOULD_SIGN ] -then - echo "Signing ${APP_NAME} DMG" - - export IDENTITY="3rd Party Mac Developer Application: BitPay, Inc. (884JRH5R93)" - - # not need for 'out of app store' distribution (?) -# export PARENT_PLIST=parent.plist -# export CHILD_PLIST=child.plist - export APP_PATH=${STAGING_DIR}/${APP_NAME}.app - - codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Helper.app" && echo "Sign 1" - codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Framework.framework/Resources/app_mode_loader.app" && echo "Sign 2" - codesign --deep -s "${IDENTITY}" $APP_PATH && echo "Sign 3" - echo "Signing Done" - fi # create the temp DMG file @@ -175,6 +156,31 @@ hdiutil detach "${DEVICE}" echo "Creating compressed image" hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}" +# Sign Code (MATIAS) +if [ $SHOULD_SIGN ] +then + + rm entitlements-child.plist + ln -s ../resources/bitcoin.com/mac/entitlements-child.plist entitlements-child.plist + + rm entitlements-parent.plist + ln -s ../resources/bitcoin.com/mac/entitlements-parent.plist entitlements-parent.plist + + rm build.cfg + ln -s ../resources/bitcoin.com/mac/build.cfg build.cfg + + rm build_mas.py + ln -s ../resources/bitcoin.com/mac/build_mas.py build_mas.py + + echo "Signing ${APP_NAME}" + export APP_PATH=${STAGING_DIR}/${APP_NAME}.app + + python build_mas.py -C build.cfg -I "${APP_PATH}" -P "${APP_NAME}.pkg" + + echo "Signing Done" + +fi + # clean up rm -rf "${DMG_TMP}" rm -rf "${STAGING_DIR}" From dae994007e04594244617c60703bd5d7cdf8b79f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 29 May 2018 18:18:14 +0900 Subject: [PATCH 005/166] Improvement - 335 - Automation build macos --- Gruntfile.js | 16 ++++++++++++++-- app-template/package-template.json | 2 ++ www/index.html | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 33ed86676..db796f3b2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,11 +3,21 @@ module.exports = function(grunt) { require('load-grunt-tasks')(grunt); + require('grunt-curl')(grunt); // Project Configuration grunt.initConfig({ + curl: { + './cache/nwjs.zip': 'https://dl.nwjs.io/v0.19.5-mas-beta/nwjs-mas-v0.19.5-osx-x64.zip', + }, + unzip: { + './cache/': './cache/nwjs.zip' + }, pkg: grunt.file.readJSON('package.json'), exec: { + replaceNWJS: { + command: 'rm -R ./cache/0.19.5/osx64/nwjs.app; cp -R ./cache/nwjs-mas-v0.19.5-osx-x64/nwjs.app ./cache/0.19.5/osx64/' + }, appConfig: { command: 'node ./util/buildAppConfig.js' }, @@ -240,6 +250,7 @@ module.exports = function(grunt) { 'CFBundleIdentifier': 'com.bitcoin.mwallet.mac', 'CFBundleDisplayName': '<%= pkg.title %>', 'CFBundleShortVersionString': '<%= pkg.version %>', + 'CFBundleVersion': '<%= pkg.androidVersion %>', 'LSApplicationCategoryType': 'public.app-category.finance', 'CFBundleURLTypes': [ { @@ -276,7 +287,7 @@ module.exports = function(grunt) { grunt.registerTask('default', ['nggettext_compile', 'exec:appConfig', 'exec:externalServices', 'browserify', 'sass', 'concat', 'copy:ionic_fonts', 'copy:ionic_js']); grunt.registerTask('prod', ['default', 'uglify']); grunt.registerTask('translate', ['nggettext_extract']); - grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']); + grunt.registerTask('desktop', ['prod', 'nwjs', 'fix-nwjs-macos', 'nwjs', 'copy:linux', 'compress:linux']); grunt.registerTask('osx', ['prod', 'nwjs', 'exec:macos', 'exec:osxsign']); grunt.registerTask('osx-debug', ['default', 'nwjs']); grunt.registerTask('chrome', ['default','exec:chrome']); @@ -290,6 +301,7 @@ module.exports = function(grunt) { grunt.registerTask('android-debug', ['exec:androiddebug', 'exec:androidrun']); grunt.registerTask('android', ['exec:android']); grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']); - grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']); + grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']); + grunt.registerTask('fix-nwjs-macos', ['curl', 'unzip', 'exec:replaceNWJS']); }; diff --git a/app-template/package-template.json b/app-template/package-template.json index 65c97f7e9..8e7aae9be 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -70,6 +70,8 @@ "grunt-angular-gettext": "^2.2.3", "grunt-browserify": "^5.0.0", "grunt-cli": "^1.2.0", + "grunt-curl": "^2.4.1", + "grunt-zip": "^0.17.1", "grunt-contrib-compress": "^1.3.0", "grunt-contrib-concat": "^1.0.1", "grunt-contrib-copy": "^1.0.0", diff --git a/www/index.html b/www/index.html index 76827f685..47dc27d2a 100644 --- a/www/index.html +++ b/www/index.html @@ -11,7 +11,7 @@ - Bitcoin.com - Bitcoin.com Wallet + Bitcoin.com Wallet From cc2f5f6a145531a0df08eaf2bacc3eb02d191d16 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Wed, 30 May 2018 16:28:32 +1200 Subject: [PATCH 006/166] Rudimentarily working with getting and setting the profile in the Keychain on iOS. --- app-template/config-template.xml | 1 + src/js/services/storageService.js | 55 ++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 8031c8110..32440782c 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,6 +72,7 @@ + diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 3d1ecfeef..ea0a975c0 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -116,19 +116,60 @@ angular.module('copayApp.services') }; root.storeNewProfile = function(profile, cb) { - storage.create('profile', profile.toObj(), cb); + console.log('storeNewProfile() 6'); + + SecureStorage.set('profile', profile.toObj(), function success(){ cb(); }, function error(err){ cb(err); }); + + //storage.create('profile', profile.toObj(), cb); }; root.storeProfile = function(profile, cb) { - storage.set('profile', profile.toObj(), cb); + console.log('storeProfile() 6'); + SecureStorage.set('profile', profile.toObj(), function success(){ cb(); }, function error(err){ cb(err); }); + //storage.set('profile', profile.toObj(), cb); }; root.getProfile = function(cb) { - storage.get('profile', function(err, str) { - if (err || !str) - return cb(err); + console.log("getProfile() 6"); + + SecureStorage.get( + 'profile', + function success(str) { + $log.debug('get profile returned success.'); + decryptOnMobile(str, function(err, str) { + if (err) return cb(err); + var p, err; + try { + p = Profile.fromString(str); + } catch (e) { + $log.debug('Could not read profile:', e); + err = new Error('Could not read profile:' + p); + } + return cb(err, p); + }); + }, + function error(err) { + $log.debug('get profile returned error.'); + $log.debug('returning error.'); + // Callback requires no error and no profile for creation of new profiles + return cb(); + } + ); + + + + /* + storage.get('profile', function(err, str) { + $log.debug('get profile returned.'); + if (err || !str) { + $log.debug('get profile returned error: ' + err + ' with string: ' + str); + return cb(err); + } + + $log.debug('calling decrypt'); decryptOnMobile(str, function(err, str) { + $log.debug('decrypt returned.'); if (err) return cb(err); var p, err; try { @@ -140,8 +181,12 @@ angular.module('copayApp.services') return cb(err, p); }); }); + */ + + }; + // Is this ever used? root.deleteProfile = function(cb) { storage.remove('profile', cb); }; From 90d321033bebcb0632c570abe581a57f41c1fa69 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 31 May 2018 17:53:58 +1200 Subject: [PATCH 007/166] Working pretty roughly on iOS with cordova-plugin-secure-storage. --- app-template/config-template.xml | 1 + src/js/services/secureStorageService.js | 93 +++++++++++++++++++++++++ src/js/services/storageService.js | 14 ++-- 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 src/js/services/secureStorageService.js diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 8031c8110..e348cbe52 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,6 +72,7 @@ + diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js new file mode 100644 index 000000000..2c3a94703 --- /dev/null +++ b/src/js/services/secureStorageService.js @@ -0,0 +1,93 @@ +'use strict'; + +angular.module('copayApp.services').factory('secureStorageService', function($log, appConfigService, platformInfo) { + var root = {}; + + var ssIsReady = false; + var ssInitialisationFailed = false; + var pending = []; + + var ss = new cordova.plugins.SecureStorage( + function () { + console.log('ss Success'); + ssIsReady = true; + for (var i = 0; i < pending.length; i++) { + pending[i](); + } + pending = []; + }, + function (error) { + console.log('ss Error ' + error); + ssInitialisationFailed = true; + }, + appConfigService.packageNameId); + + + + root.get = function(key, cb) { + $log.debug('secureStorageService.get()'); + if (!ssIsReady) { + $log.debug("ss not ready."); + if (ssInitialisationFailed) { + $log.debug("returning error because initialisation failed."); + cb(new Error("Secure storage initialisation failed.")); + } else { + $log.debug("adding get to pending."); + pending.push(function(){ root.get(key, cb); }); + } + return + } + $log.debug("ss is ready."); + + ss.get( + function (value) { + console.log('ss Success, got ' + value); + cb(null, value); + }, + function (error) { + console.log('ss Error "' + error.message + '" ' + JSON.stringify(error)); + + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain') { + $log.debug("Sending back null error."); + // The callback expects no error, but also no value, if it cannot be found. + cb(null); + } else { + cb(new Error(error)); + } + }, + key); + + }; + + root.set = function(key, value, cb) { + $log.debug('secureStorageService.set()'); + if (!ssIsReady) { + $log.debug("ss not ready."); + if (ssInitialisationFailed) { + $log.debug("returning error because initialisation failed."); + cb(new Error("Secure storage initialisation failed.")); + } else { + $log.debug("adding set to pending."); + pending.push(function(){ root.set(key, value, cb); }); + } + return + } + $log.debug("ss is ready."); + + ss.set( + function (value) { + console.log('ss Success, got ' + value); + cb(); + }, + function (error) { + console.log('ss Error ' + error); + cb(new Error(error)); + }, + key, value); + + }; + + + return root; +}); + diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 3d1ecfeef..05bf51a7a 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, $timeout) { + .factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, secureStorageService, $timeout) { var root = {}; var storage; @@ -116,15 +116,21 @@ angular.module('copayApp.services') }; root.storeNewProfile = function(profile, cb) { - storage.create('profile', profile.toObj(), cb); + //storage.create('profile', profile.toObj(), cb); + secureStorageService.set('profile', profile.toObj(), cb); }; root.storeProfile = function(profile, cb) { - storage.set('profile', profile.toObj(), cb); + //storage.set('profile', profile.toObj(), cb); + secureStorageService.set('profile', profile.toObj(), cb); }; root.getProfile = function(cb) { - storage.get('profile', function(err, str) { + $log.debug("getProfile() 31 7"); + + //storage.get('profile', function(err, str) { + secureStorageService.get('profile', function(err, str) { + if (err || !str) return cb(err); From 4e6eb3295d682bbb86b4ec0d4e632b2e12a6bc0f Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 31 May 2018 18:08:04 +1200 Subject: [PATCH 008/166] Now works on Android too. --- src/js/services/secureStorageService.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js index 2c3a94703..7c374521b 100644 --- a/src/js/services/secureStorageService.js +++ b/src/js/services/secureStorageService.js @@ -47,7 +47,8 @@ angular.module('copayApp.services').factory('secureStorageService', function($lo function (error) { console.log('ss Error "' + error.message + '" ' + JSON.stringify(error)); - if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain') { + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || + error.message === 'Key [_SS_profile] not found.') { $log.debug("Sending back null error."); // The callback expects no error, but also no value, if it cannot be found. cb(null); From b20f67095329bba250105fa8ee961a79a572ae56 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 31 May 2018 15:36:17 +0200 Subject: [PATCH 009/166] iPhone X fixes --- src/sass/views/amount.scss | 6 ++++++ src/sass/views/confirm.scss | 9 ++++++++- src/sass/views/walletDetails.scss | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index 3000ea696..c712d85e5 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -474,4 +474,10 @@ } } } + background: #494949; + + ion-content { + margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */ + margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */ + } } \ No newline at end of file diff --git a/src/sass/views/confirm.scss b/src/sass/views/confirm.scss index 9ceee92c4..47f61fd7b 100644 --- a/src/sass/views/confirm.scss +++ b/src/sass/views/confirm.scss @@ -1,5 +1,5 @@ #view-confirm { - background-color: #ffffff; + background-color: #494949; @extend .deflash-blue; .item-note { float: none; @@ -30,4 +30,11 @@ .toggle { cursor: pointer; } + ion-content { + background-color: #ffffff; + } + slide-to-accept, slide-to-accept-success { + margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */ + margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */ + } } diff --git a/src/sass/views/walletDetails.scss b/src/sass/views/walletDetails.scss index 1a33de7b1..9e651f871 100644 --- a/src/sass/views/walletDetails.scss +++ b/src/sass/views/walletDetails.scss @@ -131,6 +131,7 @@ .bp-content { position: relative; height: 100%; + height: calc(100% - env(safe-area-inset-bottom) * 2); &.status-bar { margin-top: 20px; @@ -157,6 +158,8 @@ padding-top: 0; top: 0; + margin-bottom: 16px; + .scroll { background: rgb(248, 248, 249); min-height: 300px; From fdc9a8c37b8c620c0181c4f851a87cb93cc1f10b Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 09:31:14 +1200 Subject: [PATCH 010/166] Tidy up. --- src/js/services/secureStorageService.js | 136 ++++++++++++------------ 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js index 7c374521b..989c1642a 100644 --- a/src/js/services/secureStorageService.js +++ b/src/js/services/secureStorageService.js @@ -3,89 +3,87 @@ angular.module('copayApp.services').factory('secureStorageService', function($log, appConfigService, platformInfo) { var root = {}; - var ssIsReady = false; - var ssInitialisationFailed = false; - var pending = []; + function CordovaSs() { + var isReady = false; + var initialisationFailed = false; + var pending = []; + + var storage = null; - var ss = new cordova.plugins.SecureStorage( - function () { - console.log('ss Success'); - ssIsReady = true; - for (var i = 0; i < pending.length; i++) { - pending[i](); - } - pending = []; - }, - function (error) { - console.log('ss Error ' + error); - ssInitialisationFailed = true; - }, - appConfigService.packageNameId); - - - root.get = function(key, cb) { - $log.debug('secureStorageService.get()'); - if (!ssIsReady) { - $log.debug("ss not ready."); - if (ssInitialisationFailed) { - $log.debug("returning error because initialisation failed."); + this.get = function(key, cb) { + if (!isReady) { + if (initialisationFailed) { cb(new Error("Secure storage initialisation failed.")); } else { - $log.debug("adding get to pending."); pending.push(function(){ root.get(key, cb); }); } return + } + + storage.get( + function (value) { + cb(null, value); + }, + function (error) { + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS + error.message === 'Key [_SS_profile] not found.') { // Android + // The callback expects no error, but also no value, if it cannot be found. + cb(null); + } else { + cb(new Error(error)); + } + }, + key); } - $log.debug("ss is ready."); - ss.get( - function (value) { - console.log('ss Success, got ' + value); - cb(null, value); - }, - function (error) { - console.log('ss Error "' + error.message + '" ' + JSON.stringify(error)); - - if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || - error.message === 'Key [_SS_profile] not found.') { - $log.debug("Sending back null error."); - // The callback expects no error, but also no value, if it cannot be found. - cb(null); - } else { + this.set = function(key, value, cb) { + if (!isReady) { + if (initialisationFailed) { + cb(new Error("Secure storage initialisation failed.")); + } else { + pending.push(function(){ root.set(key, value, cb); }); + } + return + } + + storage.set( + function (value) { + cb(); + }, + function (error) { cb(new Error(error)); - } - }, - key); + }, + key, value); + } + if (platformInfo.isCordova) { + storage = new cordova.plugins.SecureStorage( + function () { + console.log('ss Success'); + isReady = true; + for (var i = 0; i < pending.length; i++) { + pending[i](); + } + spending = []; + }, + function (error) { + console.log('ss Error ' + error); + initialisationFailed = true; + }, + appConfigService.packageNameId); + } + + } + + var cordovaSs = new CordovaSs(); + + root.get = function(key, cb) { + cordovaSs.get(key, cb); }; root.set = function(key, value, cb) { - $log.debug('secureStorageService.set()'); - if (!ssIsReady) { - $log.debug("ss not ready."); - if (ssInitialisationFailed) { - $log.debug("returning error because initialisation failed."); - cb(new Error("Secure storage initialisation failed.")); - } else { - $log.debug("adding set to pending."); - pending.push(function(){ root.set(key, value, cb); }); - } - return - } - $log.debug("ss is ready."); - - ss.set( - function (value) { - console.log('ss Success, got ' + value); - cb(); - }, - function (error) { - console.log('ss Error ' + error); - cb(new Error(error)); - }, - key, value); - + cordovaSs.set(key, value, cb); }; From aaad6a1b4a7bfa5e940b23a0995a97a717f7f726 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 10:19:26 +1200 Subject: [PATCH 011/166] Refactored to have the mobile and desktop secure storage contained with a more generic secure storage service. --- app-template/config-template.xml | 3 +- src/js/services/mobileSecureStorageService.js | 93 +++++++++++++++ src/js/services/secureStorageService.js | 108 ++++-------------- src/js/services/storageService.js | 2 +- 4 files changed, 120 insertions(+), 86 deletions(-) create mode 100644 src/js/services/mobileSecureStorageService.js diff --git a/app-template/config-template.xml b/app-template/config-template.xml index e348cbe52..39b67d212 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,7 +72,8 @@ - + + diff --git a/src/js/services/mobileSecureStorageService.js b/src/js/services/mobileSecureStorageService.js new file mode 100644 index 000000000..93a2ec591 --- /dev/null +++ b/src/js/services/mobileSecureStorageService.js @@ -0,0 +1,93 @@ +'use strict'; + +angular.module('copayApp.services').factory('mobileSecureStorageService', function($log, appConfigService, platformInfo) { + var root = {}; + + var isReady = false; + var initialisationFailed = false; + var pending = []; + + var storage = null; + + this.get = function(key, cb) { + if (!isReady) { + if (initialisationFailed) { + cb(new Error("mobileSecureStorageService initialisation failed.")); + } else { + pending.push(function(){ root.get(key, cb); }); + } + return + } + + storage.get( + function (value) { + cb(null, value); + }, + function (error) { + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS + error.message === 'Key [_SS_profile] not found.') { // Android + // The callback expects no error, but also no value, if it cannot be found. + cb(null, null); + } else { + cb(new Error(error)); + } + }, + key); + } + + this.set = function(key, value, cb) { + if (!isReady) { + if (initialisationFailed) { + cb(new Error("mobileSecureStorageService initialisation failed.")); + } else { + pending.push(function(){ root.set(key, value, cb); }); + } + return + } + + storage.set( + function (value) { + cb(); + }, + function (error) { + cb(new Error(error)); + }, + key, value); + } + + if (platformInfo.isCordova) { + storage = new cordova.plugins.SecureStorage( + function () { + $log.debug('mobileSecureStorageService initialised.'); + isReady = true; + for (var i = 0; i < pending.length; i++) { + pending[i](); + } + pending = []; + }, + function (error) { + c$log.debug('mobileSecureStorageService initialisation failed. ' + error); + initialisationFailed = true; + }, + appConfigService.packageNameId); + } + + root.get = function(key, cb) { + if (platformInfo.isMobile) { + storage.get(key, cb); + } else { + cb(new Error('mobileSecureStorageService is only available on mobile.')); + } + }; + + root.set = function(key, value, cb) { + if (platformInfo.isMobile) { + storage.set(key, v, cb); + } else { + cb(new Error('mobileSecureStorageService is only available on mobile.')); + } + }; + + return root; +}); + diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js index 989c1642a..c066109c2 100644 --- a/src/js/services/secureStorageService.js +++ b/src/js/services/secureStorageService.js @@ -1,92 +1,32 @@ 'use strict'; -angular.module('copayApp.services').factory('secureStorageService', function($log, appConfigService, platformInfo) { +angular.module('copayApp.services').factory('secureStorageService', function(desktopSecureStorageService, localStorageService, $log, mobileSecureStorageService, platformInfo) { var root = {}; - function CordovaSs() { - var isReady = false; - var initialisationFailed = false; - var pending = []; - - var storage = null; - - - this.get = function(key, cb) { - if (!isReady) { - if (initialisationFailed) { - cb(new Error("Secure storage initialisation failed.")); - } else { - pending.push(function(){ root.get(key, cb); }); - } - return - } - - storage.get( - function (value) { - cb(null, value); - }, - function (error) { - if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS - error.message === 'Key [_SS_profile] not found.') { // Android - // The callback expects no error, but also no value, if it cannot be found. - cb(null); - } else { - cb(new Error(error)); - } - }, - key); - } - - this.set = function(key, value, cb) { - if (!isReady) { - if (initialisationFailed) { - cb(new Error("Secure storage initialisation failed.")); - } else { - pending.push(function(){ root.set(key, value, cb); }); - } - return - } - - storage.set( - function (value) { - cb(); - }, - function (error) { - cb(new Error(error)); - }, - key, value); - } - - if (platformInfo.isCordova) { - storage = new cordova.plugins.SecureStorage( - function () { - console.log('ss Success'); - isReady = true; - for (var i = 0; i < pending.length; i++) { - pending[i](); - } - spending = []; - }, - function (error) { - console.log('ss Error ' + error); - initialisationFailed = true; - }, - appConfigService.packageNameId); - } - + // To make wrong code look wrong + function alteredKeyIndicatingDesireForSecureStorage(key) { + return key + ":desiredSecure"; } - var cordovaSs = new CordovaSs(); - - root.get = function(key, cb) { - cordovaSs.get(key, cb); - }; - - root.set = function(key, value, cb) { - cordovaSs.set(key, value, cb); - }; - + root.get = function(k, cb) { + if (platformInfo.isMobile) { + mobileSecureStorageService.get(k, cb); + } else if (platformInfo.isNW) { + desktopSecureStorageService.get(k, cb); + } else { // Browser + localStorageService.get(alteredKeyIndicatingDesireForSecureStorage(k), cb); + } + } + root.set = function(k, v, cb) { + if (platformInfo.isMobile) { + mobileSecureStorageService.set(k, v, cb); + } else if (platformInfo.isNW) { + desktopSecureStorageService.set(k, v, cb); + } else { // Browser + localStorageService.set(alteredKeyIndicatingDesireForSecureStorage(k), v, cb); + } + } + return root; -}); - +}); \ No newline at end of file diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 05bf51a7a..2cc6da730 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -126,7 +126,7 @@ angular.module('copayApp.services') }; root.getProfile = function(cb) { - $log.debug("getProfile() 31 7"); + $log.debug("getProfile() 1 8"); //storage.get('profile', function(err, str) { secureStorageService.get('profile', function(err, str) { From 17685dd810d46895e04fa7489eb9fcca66f1e1a2 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 10:42:38 +1200 Subject: [PATCH 012/166] Fixed some issues after the refactor. --- src/js/services/mobileSecureStorageService.js | 104 +++++++++--------- src/js/services/secureStorageService.js | 3 + 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/src/js/services/mobileSecureStorageService.js b/src/js/services/mobileSecureStorageService.js index 93a2ec591..56c3e2df6 100644 --- a/src/js/services/mobileSecureStorageService.js +++ b/src/js/services/mobileSecureStorageService.js @@ -9,52 +9,6 @@ angular.module('copayApp.services').factory('mobileSecureStorageService', functi var storage = null; - this.get = function(key, cb) { - if (!isReady) { - if (initialisationFailed) { - cb(new Error("mobileSecureStorageService initialisation failed.")); - } else { - pending.push(function(){ root.get(key, cb); }); - } - return - } - - storage.get( - function (value) { - cb(null, value); - }, - function (error) { - if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS - error.message === 'Key [_SS_profile] not found.') { // Android - // The callback expects no error, but also no value, if it cannot be found. - cb(null, null); - } else { - cb(new Error(error)); - } - }, - key); - } - - this.set = function(key, value, cb) { - if (!isReady) { - if (initialisationFailed) { - cb(new Error("mobileSecureStorageService initialisation failed.")); - } else { - pending.push(function(){ root.set(key, value, cb); }); - } - return - } - - storage.set( - function (value) { - cb(); - }, - function (error) { - cb(new Error(error)); - }, - key, value); - } - if (platformInfo.isCordova) { storage = new cordova.plugins.SecureStorage( function () { @@ -73,19 +27,65 @@ angular.module('copayApp.services').factory('mobileSecureStorageService', functi } root.get = function(key, cb) { - if (platformInfo.isMobile) { - storage.get(key, cb); - } else { + + if (!platformInfo.isMobile) { cb(new Error('mobileSecureStorageService is only available on mobile.')); + return; } + + if (!isReady) { + if (initialisationFailed) { + cb(new Error('mobileSecureStorageService initialisation failed.')); + } else { + $log.debug('mss.get() queued.'); + pending.push(function(){ root.get(key, cb); }); + } + return; + } + + $log.debug('mss.get() running.'); + storage.get( + function (value) { + $log.debug('mss.get() succeeded.'); + cb(null, value); + }, + function (error) { + $log.debug('mss get failed. ' + error); + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS + error.message === 'Key [_SS_profile] not found.') { // Android + // The callback expects no error, but also no value, if it cannot be found. + cb(null, null); + } else { + cb(new Error(error)); + } + }, + key); }; root.set = function(key, value, cb) { - if (platformInfo.isMobile) { - storage.set(key, v, cb); - } else { + + if (!platformInfo.isMobile) { cb(new Error('mobileSecureStorageService is only available on mobile.')); + } + + if (!isReady) { + if (initialisationFailed) { + cb(new Error('mobileSecureStorageService initialisation failed.')); + } else { + pending.push(function(){ root.set(key, value, cb); }); + } + return; } + + storage.set( + function (value) { + cb(); + }, + function (error) { + cb(new Error(error)); + }, + key, value); + }; return root; diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js index c066109c2..e7179bf62 100644 --- a/src/js/services/secureStorageService.js +++ b/src/js/services/secureStorageService.js @@ -9,9 +9,12 @@ angular.module('copayApp.services').factory('secureStorageService', function(des } root.get = function(k, cb) { + $log.debug('ss.get()'); if (platformInfo.isMobile) { + $log.debug('ss.get() using mobile.'); mobileSecureStorageService.get(k, cb); } else if (platformInfo.isNW) { + $log.debug('ss.get() using desktop.'); desktopSecureStorageService.get(k, cb); } else { // Browser localStorageService.get(alteredKeyIndicatingDesireForSecureStorage(k), cb); From f483fd81d8902bcd01c05f740dc8ebfd309dbb77 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 11:53:04 +1200 Subject: [PATCH 013/166] Removed deleteProfile() as it is not used. --- src/js/services/storageService.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 2cc6da730..df135a946 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -116,19 +116,16 @@ angular.module('copayApp.services') }; root.storeNewProfile = function(profile, cb) { - //storage.create('profile', profile.toObj(), cb); secureStorageService.set('profile', profile.toObj(), cb); }; root.storeProfile = function(profile, cb) { - //storage.set('profile', profile.toObj(), cb); secureStorageService.set('profile', profile.toObj(), cb); }; root.getProfile = function(cb) { $log.debug("getProfile() 1 8"); - //storage.get('profile', function(err, str) { secureStorageService.get('profile', function(err, str) { if (err || !str) @@ -148,10 +145,6 @@ angular.module('copayApp.services') }); }; - root.deleteProfile = function(cb) { - storage.remove('profile', cb); - }; - root.setFeedbackInfo = function(feedbackValues, cb) { storage.set('feedback', feedbackValues, cb); }; From c5121afd7ccd99db0ba02f0ad7c7d755f88c799c Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 15:04:52 +1200 Subject: [PATCH 014/166] Placeholder desktopSecureStorageService. --- src/js/services/desktopSecureStorageService.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/js/services/desktopSecureStorageService.js diff --git a/src/js/services/desktopSecureStorageService.js b/src/js/services/desktopSecureStorageService.js new file mode 100644 index 000000000..6e148da2c --- /dev/null +++ b/src/js/services/desktopSecureStorageService.js @@ -0,0 +1,6 @@ +'use strict'; + +angular.module('copayApp.services').factory('desktopSecureStorageService', function($log) { + // Placeholder + return {}; +}); \ No newline at end of file From 8d94a244bcfd71934b85305f750a0735c97977ca Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 1 Jun 2018 15:25:08 +1200 Subject: [PATCH 015/166] Removed some debug messages. --- src/js/services/mobileSecureStorageService.js | 5 ----- src/js/services/secureStorageService.js | 3 --- src/js/services/storageService.js | 2 -- 3 files changed, 10 deletions(-) diff --git a/src/js/services/mobileSecureStorageService.js b/src/js/services/mobileSecureStorageService.js index 56c3e2df6..f9994fdf8 100644 --- a/src/js/services/mobileSecureStorageService.js +++ b/src/js/services/mobileSecureStorageService.js @@ -12,7 +12,6 @@ angular.module('copayApp.services').factory('mobileSecureStorageService', functi if (platformInfo.isCordova) { storage = new cordova.plugins.SecureStorage( function () { - $log.debug('mobileSecureStorageService initialised.'); isReady = true; for (var i = 0; i < pending.length; i++) { pending[i](); @@ -20,7 +19,6 @@ angular.module('copayApp.services').factory('mobileSecureStorageService', functi pending = []; }, function (error) { - c$log.debug('mobileSecureStorageService initialisation failed. ' + error); initialisationFailed = true; }, appConfigService.packageNameId); @@ -37,16 +35,13 @@ angular.module('copayApp.services').factory('mobileSecureStorageService', functi if (initialisationFailed) { cb(new Error('mobileSecureStorageService initialisation failed.')); } else { - $log.debug('mss.get() queued.'); pending.push(function(){ root.get(key, cb); }); } return; } - $log.debug('mss.get() running.'); storage.get( function (value) { - $log.debug('mss.get() succeeded.'); cb(null, value); }, function (error) { diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js index e7179bf62..c066109c2 100644 --- a/src/js/services/secureStorageService.js +++ b/src/js/services/secureStorageService.js @@ -9,12 +9,9 @@ angular.module('copayApp.services').factory('secureStorageService', function(des } root.get = function(k, cb) { - $log.debug('ss.get()'); if (platformInfo.isMobile) { - $log.debug('ss.get() using mobile.'); mobileSecureStorageService.get(k, cb); } else if (platformInfo.isNW) { - $log.debug('ss.get() using desktop.'); desktopSecureStorageService.get(k, cb); } else { // Browser localStorageService.get(alteredKeyIndicatingDesireForSecureStorage(k), cb); diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index df135a946..7c4ad0a60 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -124,8 +124,6 @@ angular.module('copayApp.services') }; root.getProfile = function(cb) { - $log.debug("getProfile() 1 8"); - secureStorageService.get('profile', function(err, str) { if (err || !str) From 4109d4743f184b6e865615f735a4f3fdaff5ff26 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 4 Jun 2018 09:47:02 +1200 Subject: [PATCH 016/166] Loading profiles from all sources, in preparation for merge. --- src/js/models/profile.js | 7 +++ src/js/services/storageService.js | 87 +++++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/src/js/models/profile.js b/src/js/models/profile.js index 74b0c33b9..d80087e7f 100644 --- a/src/js/models/profile.js +++ b/src/js/models/profile.js @@ -62,6 +62,13 @@ Profile.prototype.isDeviceChecked = function(ua) { return this.checkedUA == ua; }; +/** + * + * @param {Profile} other + */ +Profile.prototype.merge = function(other) { + throw 'Profile merge not implemented.'; +}; Profile.prototype.setChecked = function(ua, walletId) { if (this.checkedUA != ua) { diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 7c4ad0a60..75d34fe1a 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -123,9 +123,89 @@ angular.module('copayApp.services') secureStorageService.set('profile', profile.toObj(), cb); }; - root.getProfile = function(cb) { - secureStorageService.get('profile', function(err, str) { + /** + * @callback getProfileCallback + * @param {Error} error - falsy if profile not found. + * @param {Profile} profile - falsy if error or profile not found. + */ + /** + * + * @param {Profile} oldProfile + * @param {Profile} secureProfile - may be falsy if no secure profile found. + * @param {getProfileCallback} cb + */ + function _migrateProfiles(oldProfile, secureProfile, cb) { + if (secureProfile) { + + } else { + root.storeNewProfile(oldProfile, function(err) { + if (err) { + cb(err, null); + return; + } + + return; + }); + } + + }; + + /** + * + * @param {getProfileCallback} cb + */ + root.getProfile = function(cb) { + secureStorageService.get('profile', function(secureErr, secureStr) { + var secureProfile; + var oldProfile; + + if (secureErr) { + return cb(secureErr); + } + + if (secureStr) { + try { + secureProfile = Profile.fromString(secureStr); + } catch (e) { + var profileError = new Error('Could not read secure profile.'); + return cb(profileError, null); + } + } + + storage.get('profile', function(getErr, str) { + if (getErr) { + return cb(getErr); + } + + if (!str) { + if (secureProfile) { + return cb(null, secureProfile); + } else { + return cb(null, null); + } + } + + decryptOnMobile(getStr, function(err, str) { + if (err) return cb(err); + var p, err; + try { + oldProfile = Profile.fromString(str); + } catch (e) { + $log.debug('Could not read profile:', e); + err = new Error('Could not read profile.'); + return(err, null); + } + + // Now we have to do a migration + _migrateProfiles(oldProfile, secureProfile, cb); + + }); + }); + }); + }; + + /* if (err || !str) return cb(err); @@ -140,8 +220,7 @@ angular.module('copayApp.services') } return cb(err, p); }); - }); - }; + */ root.setFeedbackInfo = function(feedbackValues, cb) { storage.set('feedback', feedbackValues, cb); From 3aa9bef8036609e934eeaf69bf374c2ddd090e72 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 4 Jun 2018 14:37:54 +1200 Subject: [PATCH 017/166] The localStorageService now returns errors when they happen. --- src/js/services/localStorage.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/js/services/localStorage.js b/src/js/services/localStorage.js index c772b7eef..ba0db231b 100644 --- a/src/js/services/localStorage.js +++ b/src/js/services/localStorage.js @@ -20,8 +20,7 @@ angular.module('copayApp.services') if (isChromeApp || isNW) { chrome.storage.local.get(k, function(data) { - //TODO check for errors - return cb(null, data[k]); + return cb(chrome.runtime.lastError, data[k]); }); } else { return cb(null, ls.getItem(k)); @@ -56,16 +55,24 @@ angular.module('copayApp.services') obj[k] = v; - chrome.storage.local.set(obj, cb); + chrome.storage.local.set(obj, function(){ + cb(chrome.runtime.lastError); + }); } else { - ls.setItem(k, v); + try { + ls.setItem(k, v); + } catch (e) { + return cb(e); + } return cb(); } }; root.remove = function(k, cb) { if (isChromeApp || isNW) { - chrome.storage.local.remove(k, cb); + chrome.storage.local.remove(k, function(){ + cb(chrome.runtime.lastError); + }); } else { ls.removeItem(k); return cb(); From adf7115c9cc337dd48d0358e8634ad7731ea7ce3 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 4 Jun 2018 14:38:15 +1200 Subject: [PATCH 018/166] Merging profiles. --- src/js/models/profile.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/js/models/profile.js b/src/js/models/profile.js index d80087e7f..ac4b4828c 100644 --- a/src/js/models/profile.js +++ b/src/js/models/profile.js @@ -67,7 +67,22 @@ Profile.prototype.isDeviceChecked = function(ua) { * @param {Profile} other */ Profile.prototype.merge = function(other) { - throw 'Profile merge not implemented.'; + + var newCredentials = []; + + other.credentials.forEach(function(otherCredential) { + var credentialExists = false; + this.credentials.forEach(function(thisCredential) { + if (otherCredential.walletId === thisCredential.walletId) { + credentialExists = true; + } + }); + if (!credentialExists) { + newCredentials.push(otherCredential); + } + }); + + Array.prototype.push.apply(this.credentials, newCredentials); }; Profile.prototype.setChecked = function(ua, walletId) { From afe433d909e1da616803aacbaa34e15769981f12 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 4 Jun 2018 15:31:51 +1200 Subject: [PATCH 019/166] Starting to migrate profile storage. --- src/js/services/storageService.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 75d34fe1a..1d7d03738 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -131,20 +131,31 @@ angular.module('copayApp.services') /** * - * @param {Profile} oldProfile + * @param {Profile} oldProfile * @param {Profile} secureProfile - may be falsy if no secure profile found. * @param {getProfileCallback} cb */ function _migrateProfiles(oldProfile, secureProfile, cb) { if (secureProfile) { + secureProfile.merge(oldProfile); } else { - root.storeNewProfile(oldProfile, function(err) { + root.storeNewProfile(secureProfile, function(err) { if (err) { cb(err, null); return; } + storage.remove('profile', function(err){ + if (err) { + cb(err, null); + return; + } + + cb(null, securePofile); + + }); + return; }); } @@ -161,18 +172,22 @@ angular.module('copayApp.services') var oldProfile; if (secureErr) { - return cb(secureErr); + return cb(secureErr, null); } if (secureStr) { try { secureProfile = Profile.fromString(secureStr); + $log.error('profile: ' + JSON.stringify(secureProfile)); } catch (e) { - var profileError = new Error('Could not read secure profile.'); - return cb(profileError, null); + $log.error(e); + return cb(e, null); } } + // Ignore insecure stuff for now + return cb(null, secureProfile); + storage.get('profile', function(getErr, str) { if (getErr) { return cb(getErr); From cc45e916805d92e7c877f1c6e2a679558c7837b0 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 4 Jun 2018 20:23:01 +1200 Subject: [PATCH 020/166] Covered all the migration cases. --- src/js/services/storageService.js | 59 ++++++++++--------------------- 1 file changed, 19 insertions(+), 40 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 1d7d03738..be9637652 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -136,30 +136,29 @@ angular.module('copayApp.services') * @param {getProfileCallback} cb */ function _migrateProfiles(oldProfile, secureProfile, cb) { + var newProfile = oldProfile; + if (secureProfile) { secureProfile.merge(oldProfile); + newProfile = secureProfile; + } - } else { - root.storeNewProfile(secureProfile, function(err) { - if (err) { - cb(err, null); + root.storeNewProfile(newProfile, function(storeErr) { + if (storeErr) { + cb(storeErr, null); + return; + } + + storage.remove('profile', function(removeErr){ + if (removeErr) { + cb(removeErr, null); return; } - storage.remove('profile', function(err){ - if (err) { - cb(err, null); - return; - } - - cb(null, securePofile); - - }); - - return; + cb(null, newProfile); }); - } + }); }; /** @@ -178,25 +177,23 @@ angular.module('copayApp.services') if (secureStr) { try { secureProfile = Profile.fromString(secureStr); - $log.error('profile: ' + JSON.stringify(secureProfile)); + $log.debug('profile: ' + JSON.stringify(secureProfile)); } catch (e) { $log.error(e); return cb(e, null); } } - // Ignore insecure stuff for now - return cb(null, secureProfile); - - storage.get('profile', function(getErr, str) { + storage.get('profile', function(getErr, getStr) { if (getErr) { return cb(getErr); } - if (!str) { + if (!getStr) { if (secureProfile) { return cb(null, secureProfile); } else { + // No profiles found. No errors either. return cb(null, null); } } @@ -212,7 +209,6 @@ angular.module('copayApp.services') return(err, null); } - // Now we have to do a migration _migrateProfiles(oldProfile, secureProfile, cb); }); @@ -220,23 +216,6 @@ angular.module('copayApp.services') }); }; - /* - if (err || !str) - return cb(err); - - decryptOnMobile(str, function(err, str) { - if (err) return cb(err); - var p, err; - try { - p = Profile.fromString(str); - } catch (e) { - $log.debug('Could not read profile:', e); - err = new Error('Could not read profile:' + p); - } - return cb(err, p); - }); - */ - root.setFeedbackInfo = function(feedbackValues, cb) { storage.set('feedback', feedbackValues, cb); }; From 16b5054ea297acc00536c0cfe5ef5951df515b25 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 5 Jun 2018 11:34:14 +1200 Subject: [PATCH 021/166] Now including app version is profile. --- src/js/models/profile.js | 20 ++++++++++++++++---- src/js/services/profileService.js | 2 +- src/js/services/storageService.js | 7 +++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/js/models/profile.js b/src/js/models/profile.js index ac4b4828c..7690d1c2d 100644 --- a/src/js/models/profile.js +++ b/src/js/models/profile.js @@ -9,12 +9,12 @@ function Profile() { this.version = '1.0.0'; }; -Profile.create = function(opts) { - opts = opts || {}; +Profile.create = function(appVersion) { var x = new Profile(); + x.appVersion = appVersion; x.createdOn = Date.now(); - x.credentials = opts.credentials || []; + x.credentials = []; x.disclaimerAccepted = true; x.checked = {}; return x; @@ -23,6 +23,7 @@ Profile.create = function(opts) { Profile.fromObj = function(obj) { var x = new Profile(); + x.appVersion = obj.appVersion; x.createdOn = obj.createdOn; x.credentials = obj.credentials; x.disclaimerAccepted = obj.disclaimerAccepted; @@ -69,10 +70,12 @@ Profile.prototype.isDeviceChecked = function(ua) { Profile.prototype.merge = function(other) { var newCredentials = []; + var otherCredentialsLength = other.credentials.length; + var thisProfile = this; other.credentials.forEach(function(otherCredential) { var credentialExists = false; - this.credentials.forEach(function(thisCredential) { + thisProfile.credentials.forEach(function(thisCredential) { if (otherCredential.walletId === thisCredential.walletId) { credentialExists = true; } @@ -85,6 +88,15 @@ Profile.prototype.merge = function(other) { Array.prototype.push.apply(this.credentials, newCredentials); }; +/** + * It's a simple operation, but it means that all the profile logic stays + * in this file. + * @param {string} appVersion - ie "4.11.0" + */ +Profile.prototype.setAppVersion = function(appVersion) { + this.appVersion = appVersion; +} + Profile.prototype.setChecked = function(ua, walletId) { if (this.checkedUA != ua) { this.checkedUA = ua; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index dac88169f..25f2a6852 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -706,7 +706,7 @@ angular.module('copayApp.services') configService.get(function(err) { if (err) $log.debug(err); - var p = Profile.create(); + var p = Profile.create(appConfigService.version); storageService.storeNewProfile(p, function(err) { if (err) return cb(err); root.bindProfile(p, function(err) { diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index be9637652..2dc3d7511 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, secureStorageService, $timeout) { + .factory('storageService', function(appConfigService, logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, secureStorageService, $timeout) { var root = {}; var storage; @@ -136,11 +136,14 @@ angular.module('copayApp.services') * @param {getProfileCallback} cb */ function _migrateProfiles(oldProfile, secureProfile, cb) { - var newProfile = oldProfile; + var newProfile; if (secureProfile) { secureProfile.merge(oldProfile); newProfile = secureProfile; + } else { + newProfile = oldProfile; + newProfile.setAppVersion(appConfigService.version); } root.storeNewProfile(newProfile, function(storeErr) { From 35da3a5151bf91cf21107b75183bcfddd7895c65 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Wed, 6 Jun 2018 19:53:57 +1200 Subject: [PATCH 022/166] One test. --- Gruntfile.js | 11 ++++ app-template/package-template.json | 8 ++- src/js/services/rateService.spec.js | 53 +++++++++++++++++ test/karma.conf.js | 91 +++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 src/js/services/rateService.spec.js create mode 100644 test/karma.conf.js diff --git a/Gruntfile.js b/Gruntfile.js index b81f53f44..f9ed59621 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -152,11 +152,22 @@ module.exports = function(grunt) { src: [ 'src/js/app.js', 'src/js/routes.js', + 'src/js/directives/*.js', + '!src/js/directives/*.spec.js', + 'src/js/filters/*.js', + '!src/js/filters/*.spec.js', + 'src/js/models/*.js', + '!src/js/models/*.spec.js', + 'src/js/services/*.js', + '!src/js/services/*.spec.js', + 'src/js/controllers/**/*.js', + '!src/js/controllers/**/*.spec.js', + 'src/js/translations.js', 'src/js/appConfig.js', 'src/js/externalServices.js', diff --git a/app-template/package-template.json b/app-template/package-template.json index 660063183..75f93a3d0 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -113,8 +113,8 @@ "sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../bitcoin-com-release-key.jks -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk bitcoin-com && $ANDROID_HOME/build-tools/27.0.1/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk", "apply:copay": "npm i fs-extra && cd app-template && node apply.js copay && npm i && cordova prepare", "apply:bitpay": "npm i fs-extra && cd app-template && node apply.js bitpay && npm i && cordova prepare", - "apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare", - "test": "echo \"no package tests configured\"", + "apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare", + "test": "karma start test/karma.conf.js --single-run", "clean": "trash platforms && trash plugins && cordova prepare", "unstage-package": "git reset package.json", "clean-all": "git clean -dfx" @@ -123,6 +123,10 @@ "cordova": "^6.3.1", "grunt": "^1.0.1", "ionic": "^3.6.0", + "jasmine-core": "^3.1.0", + "karma": "^2.0.2", + "karma-chrome-launcher": "^2.2.0", + "karma-jasmine": "^1.1.2", "trash-cli": "^1.4.0", "lodash": "^4.17.4", "pre-commit": "^1.1.3" diff --git a/src/js/services/rateService.spec.js b/src/js/services/rateService.spec.js new file mode 100644 index 000000000..35397eb7f --- /dev/null +++ b/src/js/services/rateService.spec.js @@ -0,0 +1,53 @@ +describe('rateService', function() { + var $httpBackend, rateService, requestHandler; + + beforeEach(function() { + module('ngLodash'); + module('copayApp.services'); + + inject(function($injector){ + $httpBackend = $injector.get('$httpBackend'); + + requestHandler = $httpBackend.when('GET', 'https://www.bitcoin.com/special/rates.json') + .respond([ + { + "code": "BTC", + "name": "Bitcoin", + "rate": 1 + }, + { + "code": "BCH_BTC", + "name": "Bitcoin Cash", + "rate": 6.739397 + }, + { + "code": "USD", + "name": "US Dollar", + "rate": 7602.04 + } + ]); + + rateService = $injector.get('rateService'); + + $httpBackend.flush(); + }); + }); + + afterEach(function() { + $httpBackend.verifyNoOutstandingExpectation(); + $httpBackend.verifyNoOutstandingRequest(); + }); + + it('get rates', function() { + + $httpBackend.expectGET('https://www.bitcoin.com/special/rates.json'); + + rateService.updateRates(); + + $httpBackend.flush(); + + var usdRate = rateService.getRate('USD'); + + expect(usdRate).toEqual(7602.04); + }); +}); \ No newline at end of file diff --git a/test/karma.conf.js b/test/karma.conf.js new file mode 100644 index 000000000..002d40c91 --- /dev/null +++ b/test/karma.conf.js @@ -0,0 +1,91 @@ +// Karma configuration +// Generated on Tue Jun 05 2018 16:39:51 GMT+1200 (NZST) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '..', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + + // list of files / patterns to load in the browser + files: [ + 'node_modules/angular/angular.js', + + // From Gruntfile.js + 'bower_components/qrcode-generator/js/qrcode.js', + 'bower_components/qrcode-generator/js/qrcode_UTF8.js', + 'bower_components/moment/min/moment-with-locales.js', + 'bower_components/angular-moment/angular-moment.js', + 'bower_components/ng-lodash/build/ng-lodash.js', + 'bower_components/angular-qrcode/angular-qrcode.js', + 'bower_components/angular-gettext/dist/angular-gettext.js', + 'bower_components/ng-csv/build/ng-csv.js', + 'bower_components/ionic-toast/dist/ionic-toast.bundle.min.js', + 'bower_components/angular-clipboard/angular-clipboard.js', + 'bower_components/angular-md5/angular-md5.js', + 'bower_components/angular-mocks/angular-mocks.js', + 'bower_components/ngtouch/src/ngTouch.js', + 'angular-bitauth/angular-bitauth.js', + 'angular-bitcore-wallet-client/angular-bitcore-wallet-client.js', + + 'bower_components/ionic/release/js/ionic.bundle.min.js', + 'bitcoin-cash-js/bitcoin-cash-js.js', + + 'src/js/**/*.js' + ], + + + // list of files / patterns to exclude + exclude: [ + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} From 84f90351592ff95eeda331ba1eadca8176eeb4f1 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 7 Jun 2018 20:56:24 +1200 Subject: [PATCH 023/166] One test passing on storageService. --- src/js/services/storageService.spec.js | 78 ++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/js/services/storageService.spec.js diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js new file mode 100644 index 000000000..e8c32e5b3 --- /dev/null +++ b/src/js/services/storageService.spec.js @@ -0,0 +1,78 @@ +describe('storageService on mobile', function(){ + var fileStorageServiceMock, + log, + platformInfoStub, + savedSecureProfile, + secureStorageService, + secureStorageServiceMock, + storageService; + + secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528157581638,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3NQsKcimdhieY7LeoSkS2W1mfaH6LcTujt8S8EWjcVttzvft9LUkdLd35CRBBLQmZwm3HXACsYZfcGh3T3z2TQLiSX8gJxn","xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPrivKey":"ce3279e705e2bce3f2809245dadb7ee50886c1be81a67a63d02ccc565a9dc1a9","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c","copayerId":"ee7b433f9368afcf5eb1e93123ad3d1dc34ba75e1162376b2a44d0a790ff9620","publicKeyRing":[{"xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c"}],"walletId":"23c6433d-f981-41fa-94c6-8096afc4d397","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"bfdb31f5737b83790be533bd66bfffbbbd65eaa8d49a99f547683768756bec22","personalEncryptingKey":"M1aiow3pBWeSYMih3E/Acw==","sharedEncryptingKey":"6+P8AuOTZMFNgT+o3hD+BQ==","copayerName":"me","mnemonic":"echo caught churn turkey twin silent visit jewel warm hover bone kitchen","entropySource":"e1e07a2218c32122a3a3d03d578d2dfc465112d1a826830ebc88405bf4a3a606","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3NQsKcimdhieY7LeoSkS2W1mfaH6LcTujt8S8EWjcVttzvft9LUkdLd35CRBBLQmZwm3HXACsYZfcGh3T3z2TQLiSX8gJxn","xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPrivKey":"ce3279e705e2bce3f2809245dadb7ee50886c1be81a67a63d02ccc565a9dc1a9","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c","copayerId":"eb655f1ac4567e5a4a85ae007783ded41a51225bfb046377ce04fbafc8558a05","publicKeyRing":[{"xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c"}],"walletId":"c19b75e6-e0f4-4360-a0b5-87607559ee3c","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"c27b0d17bc62085ad6b08a8a4c967e65def306c642107ca3840380339d81eee9","personalEncryptingKey":"M1aiow3pBWeSYMih3E/Acw==","sharedEncryptingKey":"w5eq2OTn7v0fjnATHISeZg==","copayerName":"me","mnemonic":"echo caught churn turkey twin silent visit jewel warm hover bone kitchen","entropySource":"e1e07a2218c32122a3a3d03d578d2dfc465112d1a826830ebc88405bf4a3a606","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3Wb3YBRHofV2poT3NCRL9yxhm9nYWEPJoTx4DrvfAsCtGSBFfiDXD4GvxuLosghdReCr65SzyHhYFwTLis3hMT8XkWjxT3v","xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPrivKey":"ef9beed77a18fc2d56ddcede46aa306dd8277a196bbab971e99aac8eeb69a723","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394","copayerId":"d3e7adc7a6816b1eaebb7a8fae6683a9b5c249c6a6c9d0c0d6ea2e163a2ae0f6","publicKeyRing":[{"xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394"}],"walletId":"b97197ec-59a3-4aab-a716-2eb008899fd8","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"abbb8b79be569b2027b55bd1ed7d3c581314d432c2cc7933ff4c43311818955f","personalEncryptingKey":"+Arh5OgC4fS4SXVwnilPxA==","sharedEncryptingKey":"zRfn81E5mQlTWnekbRJ2GQ==","copayerName":"me","mnemonic":"twenty six jump dragon abuse dose pig muscle awful inject diagram alpha","entropySource":"026700d62c252a483a0434ffb9c2cf0ff333f77721affc97acb3c117056707cb","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3Wb3YBRHofV2poT3NCRL9yxhm9nYWEPJoTx4DrvfAsCtGSBFfiDXD4GvxuLosghdReCr65SzyHhYFwTLis3hMT8XkWjxT3v","xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPrivKey":"ef9beed77a18fc2d56ddcede46aa306dd8277a196bbab971e99aac8eeb69a723","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394","copayerId":"a77ccab4dd3251e005e9de214a9a29b7907dd79ab38e9046000223feb8d0578b","publicKeyRing":[{"xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394"}],"walletId":"7c0fd6ec-caa8-46d0-8664-8eb94d5234ef","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"779d0e969697bed9cee86719433afed30bb0f41a9a6acb93b380915c68013357","personalEncryptingKey":"+Arh5OgC4fS4SXVwnilPxA==","sharedEncryptingKey":"GHNFlK2m/uobw+94Gm1Etg==","copayerName":"me","mnemonic":"twenty six jump dragon abuse dose pig muscle awful inject diagram alpha","entropySource":"026700d62c252a483a0434ffb9c2cf0ff333f77721affc97acb3c117056707cb","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"23c6433d-f981-41fa-94c6-8096afc4d397":true,"c19b75e6-e0f4-4360-a0b5-87607559ee3c":true,"b97197ec-59a3-4aab-a716-2eb008899fd8":true,"7c0fd6ec-caa8-46d0-8664-8eb94d5234ef":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + + beforeEach(function(){ + module('ngLodash'); + module('bwcModule'); + module('copayApp.services'); + + fileStorageServiceMock = { + get: function(){} + }; + + log = { + debug: function(s){ console.log(s); }, + error: function(s){ console.log(s); }, + info: function(s){ console.log(s); } + }; + + platformInfoStub = { + isCordova: true, + isWP: false + }; + + secureStorageServiceMock = { + get: function(){} + }; + + + module(function($provide) { + $provide.value('fileStorageService', fileStorageServiceMock); + $provide.value('platformInfo', platformInfoStub); + $provide.value('secureStorageService', secureStorageServiceMock); + }); + + inject(function($injector){ + storageService = $injector.get('storageService'); + }); + + }); + + it('getProfile() from secure storage.', function() { + var error, profile; + + + spyOn(secureStorageServiceMock, 'get').and.callFake(function(k, cb){ + cb(null, secureProfile); + }); + + spyOn(fileStorageServiceMock, 'get').and.callFake(function(k, cb){ + cb(null, null); + }); + + /* + secureStorageServiceMock.spyOn('get').and.callFake(function(cb){ + cb(null, 'the profile') + }); + */ + + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(profile).toBeTruthy(); + expect(error).toBeFalsy(); + + }); + +}); \ No newline at end of file From accfea64b0a69efe42c2c2f3db222ebe95264fbe Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 7 Jun 2018 21:47:49 +1200 Subject: [PATCH 024/166] Test for getting from old storage. --- src/js/services/storageService.spec.js | 70 +++++++++++++++++++++----- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index e8c32e5b3..42e9de249 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,13 +1,18 @@ describe('storageService on mobile', function(){ var fileStorageServiceMock, log, + oldProfile, platformInfoStub, savedSecureProfile, secureStorageService, secureStorageServiceMock, storageService; - secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528157581638,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3NQsKcimdhieY7LeoSkS2W1mfaH6LcTujt8S8EWjcVttzvft9LUkdLd35CRBBLQmZwm3HXACsYZfcGh3T3z2TQLiSX8gJxn","xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPrivKey":"ce3279e705e2bce3f2809245dadb7ee50886c1be81a67a63d02ccc565a9dc1a9","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c","copayerId":"ee7b433f9368afcf5eb1e93123ad3d1dc34ba75e1162376b2a44d0a790ff9620","publicKeyRing":[{"xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c"}],"walletId":"23c6433d-f981-41fa-94c6-8096afc4d397","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"bfdb31f5737b83790be533bd66bfffbbbd65eaa8d49a99f547683768756bec22","personalEncryptingKey":"M1aiow3pBWeSYMih3E/Acw==","sharedEncryptingKey":"6+P8AuOTZMFNgT+o3hD+BQ==","copayerName":"me","mnemonic":"echo caught churn turkey twin silent visit jewel warm hover bone kitchen","entropySource":"e1e07a2218c32122a3a3d03d578d2dfc465112d1a826830ebc88405bf4a3a606","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3NQsKcimdhieY7LeoSkS2W1mfaH6LcTujt8S8EWjcVttzvft9LUkdLd35CRBBLQmZwm3HXACsYZfcGh3T3z2TQLiSX8gJxn","xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPrivKey":"ce3279e705e2bce3f2809245dadb7ee50886c1be81a67a63d02ccc565a9dc1a9","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c","copayerId":"eb655f1ac4567e5a4a85ae007783ded41a51225bfb046377ce04fbafc8558a05","publicKeyRing":[{"xPubKey":"xpub6CJNjqNcCCV9f77rhB9k1CSa2kQiuEPRdyB9L8YfcLJuUjKszP3TKK65X34bpURnPYeXsrbHBL6e9NHSrUZocP4dK7u691745FMwKj4pSGg","requestPubKey":"035826166a59e896083dbcabb10b46d78b33bd842d2284fa8b9ff6ff1c59d8091c"}],"walletId":"c19b75e6-e0f4-4360-a0b5-87607559ee3c","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"c27b0d17bc62085ad6b08a8a4c967e65def306c642107ca3840380339d81eee9","personalEncryptingKey":"M1aiow3pBWeSYMih3E/Acw==","sharedEncryptingKey":"w5eq2OTn7v0fjnATHISeZg==","copayerName":"me","mnemonic":"echo caught churn turkey twin silent visit jewel warm hover bone kitchen","entropySource":"e1e07a2218c32122a3a3d03d578d2dfc465112d1a826830ebc88405bf4a3a606","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3Wb3YBRHofV2poT3NCRL9yxhm9nYWEPJoTx4DrvfAsCtGSBFfiDXD4GvxuLosghdReCr65SzyHhYFwTLis3hMT8XkWjxT3v","xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPrivKey":"ef9beed77a18fc2d56ddcede46aa306dd8277a196bbab971e99aac8eeb69a723","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394","copayerId":"d3e7adc7a6816b1eaebb7a8fae6683a9b5c249c6a6c9d0c0d6ea2e163a2ae0f6","publicKeyRing":[{"xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394"}],"walletId":"b97197ec-59a3-4aab-a716-2eb008899fd8","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"abbb8b79be569b2027b55bd1ed7d3c581314d432c2cc7933ff4c43311818955f","personalEncryptingKey":"+Arh5OgC4fS4SXVwnilPxA==","sharedEncryptingKey":"zRfn81E5mQlTWnekbRJ2GQ==","copayerName":"me","mnemonic":"twenty six jump dragon abuse dose pig muscle awful inject diagram alpha","entropySource":"026700d62c252a483a0434ffb9c2cf0ff333f77721affc97acb3c117056707cb","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K3Wb3YBRHofV2poT3NCRL9yxhm9nYWEPJoTx4DrvfAsCtGSBFfiDXD4GvxuLosghdReCr65SzyHhYFwTLis3hMT8XkWjxT3v","xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPrivKey":"ef9beed77a18fc2d56ddcede46aa306dd8277a196bbab971e99aac8eeb69a723","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394","copayerId":"a77ccab4dd3251e005e9de214a9a29b7907dd79ab38e9046000223feb8d0578b","publicKeyRing":[{"xPubKey":"xpub6DWndawujFrKaQ1B5mFVeD51SuPPQkS4igUYRyoPHN7RnmJRZZwhRjeDYMhqZFLQQNu1sxsbMXXFB4b7kGYtUgFRMLRcBFF9jPbcgJ72iku","requestPubKey":"02781170de79d7bd3ea7cf8f293c7379575a0c340bbf9d81e88ec8b07a18c77394"}],"walletId":"7c0fd6ec-caa8-46d0-8664-8eb94d5234ef","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"779d0e969697bed9cee86719433afed30bb0f41a9a6acb93b380915c68013357","personalEncryptingKey":"+Arh5OgC4fS4SXVwnilPxA==","sharedEncryptingKey":"GHNFlK2m/uobw+94Gm1Etg==","copayerName":"me","mnemonic":"twenty six jump dragon abuse dose pig muscle awful inject diagram alpha","entropySource":"026700d62c252a483a0434ffb9c2cf0ff333f77721affc97acb3c117056707cb","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"23c6433d-f981-41fa-94c6-8096afc4d397":true,"c19b75e6-e0f4-4360-a0b5-87607559ee3c":true,"b97197ec-59a3-4aab-a716-2eb008899fd8":true,"7c0fd6ec-caa8-46d0-8664-8eb94d5234ef":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfileMergedFromOld = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + beforeEach(function(){ module('ngLodash'); @@ -15,7 +20,8 @@ describe('storageService on mobile', function(){ module('copayApp.services'); fileStorageServiceMock = { - get: function(){} + get: function(){}, + remove: function(){} }; log = { @@ -30,7 +36,8 @@ describe('storageService on mobile', function(){ }; secureStorageServiceMock = { - get: function(){} + get: function(){}, + set: function(){} }; @@ -46,10 +53,45 @@ describe('storageService on mobile', function(){ }); + it('getProfile() from file storage.', function() { + var error, profile; + + spyOn(secureStorageServiceMock, 'get').and.callFake(function(k, cb){ + cb(null, null); + }); + + spyOn(fileStorageServiceMock, 'get').and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + spyOn(secureStorageServiceMock, 'set').and.callFake(function(k, v, cb){ + cb(null); + }); + + spyOn(fileStorageServiceMock, 'remove').and.callFake(function(k, cb){ + cb(null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363022385); + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + + + }); + it('getProfile() from secure storage.', function() { var error, profile; - spyOn(secureStorageServiceMock, 'get').and.callFake(function(k, cb){ cb(null, secureProfile); }); @@ -57,21 +99,25 @@ describe('storageService on mobile', function(){ spyOn(fileStorageServiceMock, 'get').and.callFake(function(k, cb){ cb(null, null); }); - - /* - secureStorageServiceMock.spyOn('get').and.callFake(function(cb){ - cb(null, 'the profile') - }); - */ - + //spyOn(secureStorageServiceMock, 'set').and.callFake(function(k, cb){ + // cb(null); + //}); + storageService.getProfile(function(err, p){ error = err; profile = p; }); - expect(profile).toBeTruthy(); expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + }); From 0003604017b733aa4343491ca89eeedee7a82cdc Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 08:12:24 +1200 Subject: [PATCH 025/166] Better use of mocks. --- src/js/services/storageService.spec.js | 46 ++++++++++++++------------ 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 42e9de249..e28f80cea 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,3 +1,4 @@ +// TODO: Error cases for all of these, at each step. describe('storageService on mobile', function(){ var fileStorageServiceMock, log, @@ -13,6 +14,11 @@ describe('storageService on mobile', function(){ secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfileMergedFromOld = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + log = { + debug: function(s){ console.log(s); }, + error: function(s){ console.log(s); }, + info: function(s){ console.log(s); } + }; beforeEach(function(){ module('ngLodash'); @@ -20,14 +26,8 @@ describe('storageService on mobile', function(){ module('copayApp.services'); fileStorageServiceMock = { - get: function(){}, - remove: function(){} - }; - - log = { - debug: function(s){ console.log(s); }, - error: function(s){ console.log(s); }, - info: function(s){ console.log(s); } + get: jasmine.createSpy(), + remove: jasmine.createSpy() }; platformInfoStub = { @@ -36,8 +36,8 @@ describe('storageService on mobile', function(){ }; secureStorageServiceMock = { - get: function(){}, - set: function(){} + get: jasmine.createSpy(), + set: jasmine.createSpy() }; @@ -56,19 +56,19 @@ describe('storageService on mobile', function(){ it('getProfile() from file storage.', function() { var error, profile; - spyOn(secureStorageServiceMock, 'get').and.callFake(function(k, cb){ + secureStorageServiceMock.get.and.callFake(function(k, cb){ cb(null, null); }); - spyOn(fileStorageServiceMock, 'get').and.callFake(function(k, cb){ + fileStorageServiceMock.get.and.callFake(function(k, cb){ cb(null, oldProfile); }); - spyOn(secureStorageServiceMock, 'set').and.callFake(function(k, v, cb){ + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ cb(null); }); - spyOn(fileStorageServiceMock, 'remove').and.callFake(function(k, cb){ + fileStorageServiceMock.remove.and.callFake(function(k, cb){ cb(null); }); @@ -81,28 +81,27 @@ describe('storageService on mobile', function(){ expect(profile).toBeTruthy(); expect(profile.appVersion).toBe('4.11.0'); expect(profile.createdOn).toBe(1528363022385); + expect(profile.credentials[0].coin).toBe('bch'); expect(profile.credentials[0].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[0].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + expect(profile.credentials[1].coin).toBe('btc'); expect(profile.credentials[1].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); - + expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); }); it('getProfile() from secure storage.', function() { var error, profile; - spyOn(secureStorageServiceMock, 'get').and.callFake(function(k, cb){ + secureStorageServiceMock.get.and.callFake(function(k, cb){ cb(null, secureProfile); }); - spyOn(fileStorageServiceMock, 'get').and.callFake(function(k, cb){ + fileStorageServiceMock.get.and.callFake(function(k, cb){ cb(null, null); }); - - //spyOn(secureStorageServiceMock, 'set').and.callFake(function(k, cb){ - // cb(null); - //}); storageService.getProfile(function(err, p){ error = err; @@ -113,11 +112,14 @@ describe('storageService on mobile', function(){ expect(profile).toBeTruthy(); expect(profile.appVersion).toBe('4.11.0'); expect(profile.createdOn).toBe(1528363260283); + expect(profile.credentials[0].coin).toBe('bch'); expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + expect(profile.credentials[1].coin).toBe('btc'); expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); - + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); }); From 02460bd3c57036eafce031e655d40d59e72c6eb1 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 08:23:28 +1200 Subject: [PATCH 026/166] Uses the current app version when needed, when checking the appVersion of a profile. --- src/js/services/storageService.spec.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index e28f80cea..59f661d0d 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,6 +1,7 @@ // TODO: Error cases for all of these, at each step. describe('storageService on mobile', function(){ - var fileStorageServiceMock, + var appConfig, + fileStorageServiceMock, log, oldProfile, platformInfoStub, @@ -11,7 +12,7 @@ describe('storageService on mobile', function(){ oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; - secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfileMergedFromOld = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; log = { @@ -48,9 +49,12 @@ describe('storageService on mobile', function(){ }); inject(function($injector){ + appConfig = $injector.get('appConfigService'); storageService = $injector.get('storageService'); }); + secureProfileFromOldOnly = secureProfileFromOldOnly.replace('${appVersion}', appConfig.version); + }); it('getProfile() from file storage.', function() { @@ -79,7 +83,7 @@ describe('storageService on mobile', function(){ expect(error).toBeFalsy(); expect(profile).toBeTruthy(); - expect(profile.appVersion).toBe('4.11.0'); + expect(profile.appVersion).toBe(appConfig.version); expect(profile.createdOn).toBe(1528363022385); expect(profile.credentials[0].coin).toBe('bch'); @@ -89,7 +93,6 @@ describe('storageService on mobile', function(){ expect(profile.credentials[1].coin).toBe('btc'); expect(profile.credentials[1].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); - }); it('getProfile() from secure storage.', function() { @@ -120,7 +123,6 @@ describe('storageService on mobile', function(){ expect(profile.credentials[1].coin).toBe('btc'); expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); - }); }); \ No newline at end of file From e52242bb1b37d487b44bfc78a31ac76af15e1889 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 13:38:02 +1200 Subject: [PATCH 027/166] Testing profile merge. --- src/js/services/storageService.spec.js | 68 ++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 59f661d0d..f00da3bfe 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,6 +1,8 @@ // TODO: Error cases for all of these, at each step. describe('storageService on mobile', function(){ var appConfig, + expectedOldProfileSavedToSecure, + expectedOldProfileMergedWithSecure, fileStorageServiceMock, log, oldProfile, @@ -10,11 +12,12 @@ describe('storageService on mobile', function(){ secureStorageServiceMock, storageService; + expectedOldProfileMergedWithSecure = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + expectedOldProfileSavedToSecure = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; - secureProfileMergedFromOld = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; - + log = { debug: function(s){ console.log(s); }, error: function(s){ console.log(s); }, @@ -41,7 +44,6 @@ describe('storageService on mobile', function(){ set: jasmine.createSpy() }; - module(function($provide) { $provide.value('fileStorageService', fileStorageServiceMock); $provide.value('platformInfo', platformInfoStub); @@ -54,11 +56,12 @@ describe('storageService on mobile', function(){ }); secureProfileFromOldOnly = secureProfileFromOldOnly.replace('${appVersion}', appConfig.version); + expectedOldProfileSavedToSecure = expectedOldProfileSavedToSecure.replace('${appVersion}', appConfig.version); }); it('getProfile() from file storage.', function() { - var error, profile; + var error, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ cb(null, null); @@ -69,6 +72,7 @@ describe('storageService on mobile', function(){ }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; cb(null); }); @@ -83,6 +87,9 @@ describe('storageService on mobile', function(){ expect(error).toBeFalsy(); expect(profile).toBeTruthy(); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + expect(profile.appVersion).toBe(appConfig.version); expect(profile.createdOn).toBe(1528363022385); @@ -125,4 +132,57 @@ describe('storageService on mobile', function(){ expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); }); + it('getProfile() merge from local and secure storage.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, secureProfile); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; + cb(null); + }); + + fileStorageServiceMock.remove.and.callFake(function(k, cb){ + cb(null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + + // Existing secure + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); + + // Old + expect(profile.credentials[2].coin).toBe('bch'); + expect(profile.credentials[2].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[2].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + + expect(profile.credentials[3].coin).toBe('btc'); + expect(profile.credentials[3].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[3].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); + + }); + }); \ No newline at end of file From 3aa9e70e6446dc17b80e19bbef21e0458fc02368 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 14:07:46 +1200 Subject: [PATCH 028/166] All tests for profile migration. --- src/js/services/storageService.spec.js | 157 ++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 1 deletion(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index f00da3bfe..100aa981e 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,4 +1,3 @@ -// TODO: Error cases for all of these, at each step. describe('storageService on mobile', function(){ var appConfig, expectedOldProfileSavedToSecure, @@ -102,6 +101,102 @@ describe('storageService on mobile', function(){ expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); }); + it('getProfile() from file storage, remove fails.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, null); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; + cb(null); + }); + + fileStorageServiceMock.remove.and.callFake(function(k, cb){ + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + }); + + it('getProfile() from file storage, secure set fails, not removed.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, null); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; + cb(new Error('Set error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Set error.'); + expect(profile).toBeFalsy(); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + + expect(fileStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile(), secure get fails.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(new Error('Secure get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure get error.'); + expect(profile).toBeFalsy(); + }); + + it('getProfile(), secure get succeeds, file storage get fails.', function() { + var error, profile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, secureProfile); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(new Error('File storage get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('File storage get error.'); + expect(profile).toBeFalsy(); + }); + it('getProfile() from secure storage.', function() { var error, profile; @@ -185,4 +280,64 @@ describe('storageService on mobile', function(){ }); + it('getProfile() merge from local and secure storage, secure set fails, not removed from local.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, secureProfile); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; + cb(new Error('Secure set error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure set error.'); + expect(profile).toBeFalsy(); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(fileStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile() merge from local and secure storage, remove from local fails.', function() { + var error, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, secureProfile); + }); + + fileStorageServiceMock.get.and.callFake(function(k, cb){ + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + savedProfile = v; + cb(null); + }); + + fileStorageServiceMock.remove.and.callFake(function(k, cb){ + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + }); + }); \ No newline at end of file From a09069463a8abef55c299a0a08457a8d6b5ec20f Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 14:31:35 +1200 Subject: [PATCH 029/166] Checking key names in tests. --- src/js/services/storageService.spec.js | 89 +++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 9 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 100aa981e..767cb3283 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,3 +1,5 @@ + + describe('storageService on mobile', function(){ var appConfig, expectedOldProfileSavedToSecure, @@ -60,22 +62,26 @@ describe('storageService on mobile', function(){ }); it('getProfile() from file storage.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, keyFileRemove, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, null); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; savedProfile = v; cb(null); }); fileStorageServiceMock.remove.and.callFake(function(k, cb){ + keyFileRemove = k; cb(null); }); @@ -87,7 +93,13 @@ describe('storageService on mobile', function(){ expect(error).toBeFalsy(); expect(profile).toBeTruthy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyFileRemove).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + expect(fileStorageServiceMock.remove.calls.any()).toBe(true); expect(profile.appVersion).toBe(appConfig.version); expect(profile.createdOn).toBe(1528363022385); @@ -102,22 +114,26 @@ describe('storageService on mobile', function(){ }); it('getProfile() from file storage, remove fails.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, keyFileRemove, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, null); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; savedProfile = v; cb(null); }); fileStorageServiceMock.remove.and.callFake(function(k, cb){ + keyFileRemove = k; cb(new Error('Remove error.')); }); @@ -129,21 +145,29 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('Remove error.'); expect(profile).toBeFalsy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyFileRemove).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); }); it('getProfile() from file storage, secure set fails, not removed.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, null); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; savedProfile = v; cb(new Error('Set error.')); }); @@ -156,15 +180,20 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('Set error.'); expect(profile).toBeFalsy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); expect(fileStorageServiceMock.remove.calls.any()).toBe(false); }); it('getProfile(), secure get fails.', function() { - var error, profile, savedProfile; + var error, keySecureGet, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(new Error('Secure get error.'), null); }); @@ -175,16 +204,22 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('Secure get error.'); expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + + expect(fileStorageServiceMock.remove.calls.any()).toBe(false); }); it('getProfile(), secure get succeeds, file storage get fails.', function() { - var error, profile; + var error, keySecureGet, keyFileGet, profile, profile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, secureProfile); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(new Error('File storage get error.'), null); }); @@ -195,16 +230,23 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('File storage get error.'); expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + + expect(fileStorageServiceMock.remove.calls.any()).toBe(false); }); it('getProfile() from secure storage.', function() { - var error, profile; + var error, keySecureGet, keyFileGet, profile, profile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, secureProfile); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, null); }); @@ -215,6 +257,10 @@ describe('storageService on mobile', function(){ expect(error).toBeFalsy(); expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(profile.appVersion).toBe('4.11.0'); expect(profile.createdOn).toBe(1528363260283); @@ -228,22 +274,26 @@ describe('storageService on mobile', function(){ }); it('getProfile() merge from local and secure storage.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, keyFileRemove, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, secureProfile); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; savedProfile = v; cb(null); }); fileStorageServiceMock.remove.and.callFake(function(k, cb){ + keyFileRemove = k; cb(null); }); @@ -255,6 +305,11 @@ describe('storageService on mobile', function(){ expect(error).toBeFalsy(); expect(profile).toBeTruthy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyFileRemove).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); expect(profile.appVersion).toBe('4.11.0'); @@ -281,17 +336,20 @@ describe('storageService on mobile', function(){ }); it('getProfile() merge from local and secure storage, secure set fails, not removed from local.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, secureProfile); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; savedProfile = v; cb(new Error('Secure set error.')); }); @@ -304,28 +362,36 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('Secure set error.'); expect(profile).toBeFalsy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); expect(fileStorageServiceMock.remove.calls.any()).toBe(false); }); it('getProfile() merge from local and secure storage, remove from local fails.', function() { - var error, profile, savedProfile; + var error, keySecureGet, keyFileGet, keySecureSet, keyFileRemove, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; cb(null, secureProfile); }); fileStorageServiceMock.get.and.callFake(function(k, cb){ + keyFileGet = k; cb(null, oldProfile); }); secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k savedProfile = v; cb(null); }); fileStorageServiceMock.remove.and.callFake(function(k, cb){ + keyFileRemove = k; cb(new Error('Remove error.')); }); @@ -337,6 +403,11 @@ describe('storageService on mobile', function(){ expect(error.message).toBe('Remove error.'); expect(profile).toBeFalsy(); + expect(keySecureGet).toBe('profile'); + expect(keyFileGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyFileRemove).toBe('profile'); + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); }); From 522a7cd3cf3b64423b753149ef0accc7a9ae1cc5 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 14:49:01 +1200 Subject: [PATCH 030/166] Migration tests for desktop. --- src/js/services/storageService.spec.js | 411 +++++++++++++++++++++++++ 1 file changed, 411 insertions(+) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 767cb3283..316a909d8 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,4 +1,415 @@ +describe('storageService on desktop', function(){ + var appConfig, + expectedOldProfileSavedToSecure, + expectedOldProfileMergedWithSecure, + localStorageServiceMock, + log, + oldProfile, + platformInfoStub, + savedSecureProfile, + secureStorageService, + secureStorageServiceMock, + storageService; + expectedOldProfileMergedWithSecure = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + expectedOldProfileSavedToSecure = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + + log = { + debug: function(s){ console.log(s); }, + error: function(s){ console.log(s); }, + info: function(s){ console.log(s); } + }; + + beforeEach(function(){ + module('ngLodash'); + module('bwcModule'); + module('copayApp.services'); + + localStorageServiceMock = { + get: jasmine.createSpy(), + remove: jasmine.createSpy() + }; + + platformInfoStub = { + isCordova: false + }; + + secureStorageServiceMock = { + get: jasmine.createSpy(), + set: jasmine.createSpy() + }; + + module(function($provide) { + $provide.value('localStorageService', localStorageServiceMock); + //$provide.value('$log', log); // Handy for debugging test failures + $provide.value('platformInfo', platformInfoStub); + $provide.value('secureStorageService', secureStorageServiceMock); + }); + + inject(function($injector){ + appConfig = $injector.get('appConfigService'); + storageService = $injector.get('storageService'); + }); + + secureProfileFromOldOnly = secureProfileFromOldOnly.replace('${appVersion}', appConfig.version); + expectedOldProfileSavedToSecure = expectedOldProfileSavedToSecure.replace('${appVersion}', appConfig.version); + + }); + + it('getProfile() from local storage.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, null); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + expect(localStorageServiceMock.remove.calls.any()).toBe(true); + + expect(profile.appVersion).toBe(appConfig.version); + expect(profile.createdOn).toBe(1528363022385); + + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[0].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); + }); + + it('getProfile() from file storage, remove fails.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, null); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + }); + + it('getProfile() from file storage, secure set fails, not removed.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, null); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(new Error('Set error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Set error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile(), secure get fails.', function() { + var error, keySecureGet, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(new Error('Secure get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure get error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile(), secure get succeeds, file storage get fails.', function() { + var error, keySecureGet, keyLocalGet, profile, profile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(new Error('File storage get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('File storage get error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile() from secure storage.', function() { + var error, keySecureGet, keyLocalGet, profile, profile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); + }); + + it('getProfile() merge from local and secure storage.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + + // Existing secure + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); + + // Old + expect(profile.credentials[2].coin).toBe('bch'); + expect(profile.credentials[2].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[2].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + + expect(profile.credentials[3].coin).toBe('btc'); + expect(profile.credentials[3].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[3].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); + + }); + + it('getProfile() merge from local and secure storage, secure set fails, not removed from local.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(new Error('Secure set error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure set error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile() merge from local and secure storage, remove from local fails.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + }); + +}); describe('storageService on mobile', function(){ var appConfig, From da9559433fdb87bf445dcffbeb7457168f198b5a Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 15:06:56 +1200 Subject: [PATCH 031/166] First test for the secureStorageService. --- src/js/services/secureStorageService.spec.js | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/js/services/secureStorageService.spec.js diff --git a/src/js/services/secureStorageService.spec.js b/src/js/services/secureStorageService.spec.js new file mode 100644 index 000000000..e22563536 --- /dev/null +++ b/src/js/services/secureStorageService.spec.js @@ -0,0 +1,49 @@ +describe('secureStorageService on desktop', function(){ + var desktopSss, + sss; + + beforeEach(function(){ + module('ngLodash'); + module('copayApp.services'); + + desktopSss = { + get: jasmine.createSpy(), + set: jasmine.createSpy() + }; + + platformInfoStub = { + isNW: true + }; + + module(function($provide) { + $provide.value('desktopSecureStorageService', desktopSss); + //$provide.value('$log', log); // Handy for debugging test failures + $provide.value('platformInfo', platformInfoStub); + }); + + inject(function($injector){ + sss = $injector.get('secureStorageService'); + }); + + }); + + it('get succeeds', function() { + var error, key, result; + + desktopSss.get.and.callFake(function(k, cb){ + key = k; + cb(null, 'The result 1.'); + }); + + sss.get('a123', function(e, res) { + error = e; + result = res; + }); + + expect(error).toBeFalsy(); + expect(result).toBe('The result 1.'); + expect(key).toBe('a123'); + }); + +}); + \ No newline at end of file From f4642b1953c4c52c959ee9d45b0d090553f83d75 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 16:19:50 +1200 Subject: [PATCH 032/166] All tests for secure storage service on desktop. --- src/js/services/secureStorageService.spec.js | 55 +++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/src/js/services/secureStorageService.spec.js b/src/js/services/secureStorageService.spec.js index e22563536..0b2684895 100644 --- a/src/js/services/secureStorageService.spec.js +++ b/src/js/services/secureStorageService.spec.js @@ -17,7 +17,6 @@ describe('secureStorageService on desktop', function(){ module(function($provide) { $provide.value('desktopSecureStorageService', desktopSss); - //$provide.value('$log', log); // Handy for debugging test failures $provide.value('platformInfo', platformInfoStub); }); @@ -27,6 +26,24 @@ describe('secureStorageService on desktop', function(){ }); + it('get fails', function() { + var error, key, result; + + desktopSss.get.and.callFake(function(k, cb){ + key = k; + cb(new Error('Get error.'), null); + }); + + sss.get('a1234', function(e, res) { + error = e; + result = res; + }); + + expect(error.message).toBe('Get error.'); + expect(result).toBeFalsy(); + expect(key).toBe('a1234'); + }); + it('get succeeds', function() { var error, key, result; @@ -45,5 +62,41 @@ describe('secureStorageService on desktop', function(){ expect(key).toBe('a123'); }); + it('set fails', function() { + var error, key, value; + + desktopSss.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(new Error('Set error.')); + }); + + sss.set('a12345', 'The value 1.', function(e) { + error = e; + }); + + expect(error.message).toBe('Set error.'); + expect(key).toBe('a12345'); + expect(value).toBe('The value 1.'); + }); + + it('set succeeds', function() { + var error, key, value; + + desktopSss.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(null); + }); + + sss.set('ab123', 'The value 2.', function(e) { + error = e; + }); + + expect(error).toBeFalsy(); + expect(key).toBe('ab123'); + expect(value).toBe('The value 2.') + }); + }); \ No newline at end of file From 18581e9608881147f3d0e31edc1783202b883c08 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 8 Jun 2018 16:24:15 +1200 Subject: [PATCH 033/166] Test for secureStorageService on mobile and browser. --- src/js/services/secureStorageService.spec.js | 206 +++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/src/js/services/secureStorageService.spec.js b/src/js/services/secureStorageService.spec.js index 0b2684895..abfa5d947 100644 --- a/src/js/services/secureStorageService.spec.js +++ b/src/js/services/secureStorageService.spec.js @@ -1,3 +1,105 @@ +describe('secureStorageService in browser', function(){ + var localStorage, + sss; + + beforeEach(function(){ + module('ngLodash'); + module('copayApp.services'); + + localStorage = { + get: jasmine.createSpy(), + set: jasmine.createSpy() + }; + + platformInfoStub = { + }; + + module(function($provide) { + $provide.value('localStorageService', localStorage); + $provide.value('platformInfo', platformInfoStub); + }); + + inject(function($injector){ + sss = $injector.get('secureStorageService'); + }); + + }); + + it('get fails', function() { + var error, key, result; + + localStorage.get.and.callFake(function(k, cb){ + key = k; + cb(new Error('Get error.'), null); + }); + + sss.get('a1234', function(e, res) { + error = e; + result = res; + }); + + expect(error.message).toBe('Get error.'); + expect(result).toBeFalsy(); + expect(key).toBe('a1234:desiredSecure'); + }); + + it('get succeeds', function() { + var error, key, result; + + localStorage.get.and.callFake(function(k, cb){ + key = k; + cb(null, 'The result 1.'); + }); + + sss.get('a123', function(e, res) { + error = e; + result = res; + }); + + expect(error).toBeFalsy(); + expect(result).toBe('The result 1.'); + expect(key).toBe('a123:desiredSecure'); + }); + + it('set fails', function() { + var error, key, value; + + localStorage.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(new Error('Set error.')); + }); + + sss.set('a12345', 'The value 1.', function(e) { + error = e; + }); + + expect(error.message).toBe('Set error.'); + expect(key).toBe('a12345:desiredSecure'); + expect(value).toBe('The value 1.'); + }); + + it('set succeeds', function() { + var error, key, value; + + localStorage.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(null); + }); + + sss.set('ab123', 'The value 2.', function(e) { + error = e; + }); + + expect(error).toBeFalsy(); + expect(key).toBe('ab123:desiredSecure'); + expect(value).toBe('The value 2.') + }); + +}); + + describe('secureStorageService on desktop', function(){ var desktopSss, sss; @@ -99,4 +201,108 @@ describe('secureStorageService on desktop', function(){ }); }); + +describe('secureStorageService on mobile', function(){ + var mobileSss, + sss; + + beforeEach(function(){ + module('ngLodash'); + module('copayApp.services'); + + mobileSss = { + get: jasmine.createSpy(), + set: jasmine.createSpy() + }; + + platformInfoStub = { + isMobile: true + }; + + module(function($provide) { + $provide.value('mobileSecureStorageService', mobileSss); + $provide.value('platformInfo', platformInfoStub); + }); + + inject(function($injector){ + sss = $injector.get('secureStorageService'); + }); + + }); + + it('get fails', function() { + var error, key, result; + + mobileSss.get.and.callFake(function(k, cb){ + key = k; + cb(new Error('Get error.'), null); + }); + + sss.get('a1234', function(e, res) { + error = e; + result = res; + }); + + expect(error.message).toBe('Get error.'); + expect(result).toBeFalsy(); + expect(key).toBe('a1234'); + }); + + it('get succeeds', function() { + var error, key, result; + + mobileSss.get.and.callFake(function(k, cb){ + key = k; + cb(null, 'The result 1.'); + }); + + sss.get('a123', function(e, res) { + error = e; + result = res; + }); + + expect(error).toBeFalsy(); + expect(result).toBe('The result 1.'); + expect(key).toBe('a123'); + }); + + it('set fails', function() { + var error, key, value; + + mobileSss.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(new Error('Set error.')); + }); + + sss.set('a12345', 'The value 1.', function(e) { + error = e; + }); + + expect(error.message).toBe('Set error.'); + expect(key).toBe('a12345'); + expect(value).toBe('The value 1.'); + }); + + it('set succeeds', function() { + var error, key, value; + + mobileSss.set.and.callFake(function(k, v, cb){ + key = k; + value = v; + cb(null); + }); + + sss.set('ab123', 'The value 2.', function(e) { + error = e; + }); + + expect(error).toBeFalsy(); + expect(key).toBe('ab123'); + expect(value).toBe('The value 2.') + }); + +}); + + \ No newline at end of file From 12990d7f71a68f3fffa746c9054a7aae2d5573c6 Mon Sep 17 00:00:00 2001 From: Sam Cheng Hung Date: Fri, 8 Jun 2018 12:06:12 +0530 Subject: [PATCH 034/166] Update: Changes icon design and color scheme for default wallet colors --- src/js/services/configService.js | 4 +- src/sass/variables.scss | 4 +- www/css/main.css | 20 ++++++---- www/img/icon-wallet.svg | 63 +------------------------------- 4 files changed, 18 insertions(+), 73 deletions(-) diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 1e46da03a..e8ed93d88 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -115,8 +115,8 @@ angular.module('copayApp.services').factory('configService', function(storageSer bitcoinAlias: 'btc', bitcoinCashAlias: 'bch', - bitcoinWalletColor: '#fab915', // Observatory - bitcoinCashWalletColor: '#26B03C', // Dollar Green + bitcoinWalletColor: '#535353', // Dark Grey + bitcoinCashWalletColor: '#eeb640', // Observatory homeSectionIsHidden: { services: false diff --git a/src/sass/variables.scss b/src/sass/variables.scss index e5bd2712d..cb21c030a 100644 --- a/src/sass/variables.scss +++ b/src/sass/variables.scss @@ -33,8 +33,8 @@ $v-wallet-color-map: ( 3: (color: #d0b136, name: 'Metallic Gold'), 4: (color: #9edd72, name: 'Feijoa'), 5: (color: #29bb9c, name: 'Shamrock'), - 6: (color: #26B03C, name: 'Dollar Green'), - 7: (color: #fab915, name: 'Observatory'), + 6: (color: #eeb640, name: 'Light Orange'), + 7: (color: #535353, name: 'Dark Grey'), 8: (color: #77dada, name: 'Turquoise Blue'), 9: (color: #4a90e2, name: 'Cornflower Blue'), 10: (color: #484ed3, name: 'Free Speech Blue'), diff --git a/www/css/main.css b/www/css/main.css index 4e7faac0a..46db3b975 100644 --- a/www/css/main.css +++ b/www/css/main.css @@ -10726,6 +10726,12 @@ textarea.d-block { #tab-home .card .item-sub:before { width: 90%; } } +#tab-home .card-banner { + padding: 0; } + #tab-home .card-banner__img { + width: 100%; + display: block; } + #tab-home .wallet-coin-logo { vertical-align: middle; margin-right: 5px; } @@ -11305,13 +11311,13 @@ textarea.d-block { /* background-color and color defaults should be the same */ .wallet-background-color-default { - background-color: #fab915; } + background-color: #535353; } .wallet-color-default { - color: #fab915; } + color: #535353; } .cashwallet-color-default { - color: #26B03C; } + color: #eeb640; } /* generate classes for all colors */ .wallet-color-0 { @@ -11357,17 +11363,17 @@ textarea.d-block { margin-left: 2.4rem; } .wallet-color-6 { - background: #26B03C; } + background: #eeb640; } .wallet-color-6:before { - content: "Dollar Green"; + content: "Light Orange"; margin-left: 2.4rem; } .wallet-color-7 { - background: #fab915; } + background: #535353; } .wallet-color-7:before { - content: "Observatory"; + content: "Dark Grey"; margin-left: 2.4rem; } .wallet-color-8 { diff --git a/www/img/icon-wallet.svg b/www/img/icon-wallet.svg index fba9bca0b..74c7055f2 100644 --- a/www/img/icon-wallet.svg +++ b/www/img/icon-wallet.svg @@ -1,62 +1 @@ - -image/svg+xml - \ No newline at end of file +icon-wallet \ No newline at end of file From 078f5bd61d5ba429904023f744e2cf2541eaefdf Mon Sep 17 00:00:00 2001 From: Sam Cheng Hung Date: Fri, 8 Jun 2018 12:20:37 +0530 Subject: [PATCH 035/166] Update: Changes shadow specification for wallet icons --- src/sass/icons.scss | 2 +- www/css/main.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sass/icons.scss b/src/sass/icons.scss index 4693025f6..7d14f8886 100644 --- a/src/sass/icons.scss +++ b/src/sass/icons.scss @@ -40,7 +40,7 @@ border-radius: $v-icon-border-radius; width: 40px; height: 40px; - box-shadow: $v-hovering-box-shadow; + box-shadow: 0px 0px 9px 0px rgba(0, 0, 0, 0.3); background-repeat:no-repeat; background-clip: padding-box; background-size: 103%; diff --git a/www/css/main.css b/www/css/main.css index 46db3b975..b4e67edac 100644 --- a/www/css/main.css +++ b/www/css/main.css @@ -10005,7 +10005,7 @@ ion-view.deflash-blue:before, ion-view#view-amount:before, ion-view#view-confirm border-radius: 3px; width: 40px; height: 40px; - box-shadow: 0px 6px 12px 0px rgba(0, 0, 0, 0.3); + box-shadow: 0px 0px 9px 0px rgba(0, 0, 0, 0.3); background-repeat: no-repeat; background-clip: padding-box; background-size: 103%; } From 435c2cacd47354d19eb96c03eb54bb0b52fa6e40 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 11 Jun 2018 12:23:39 +1200 Subject: [PATCH 036/166] Desktop using local storage only. --- src/js/services/storageService.js | 58 ++-- src/js/services/storageService.spec.js | 381 ++++++++++++++++++++++++- 2 files changed, 422 insertions(+), 17 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 2dc3d7511..de4aa9b54 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -129,6 +129,37 @@ angular.module('copayApp.services') * @param {Profile} profile - falsy if error or profile not found. */ + + /** + * @param {Error} error + * @param {String} profileStr - containing the profile + * @param {getProfileCallback} cb + */ + function _onOldProfileRetrieved(error, profileStr, cb) { + if (error) { + return cb(error, null); + } + + if (!profileStr) { + // No profiles found. No errors either. + return cb(null, null); + } + + decryptOnMobile(profileStr, function(decryptErr, decryptedStr) { + if (decryptErr) return cb(decryptErr, null); + var profile; + try { + profile = Profile.fromString(decryptedStr); + } catch (e) { + $log.debug('Could not read profile:', e); + return(new Error('Could not read profile.'), null); + } + cb(null, profile) + }); + } + + + /** * * @param {Profile} oldProfile @@ -169,6 +200,13 @@ angular.module('copayApp.services') * @param {getProfileCallback} cb */ root.getProfile = function(cb) { + if (platformInfo.isNW) { + storage.get('profile', function(getErr, getStr) { + _onOldProfileRetrieved(getErr, getStr, cb); + }); + return + } + secureStorageService.get('profile', function(secureErr, secureStr) { var secureProfile; var oldProfile; @@ -188,11 +226,12 @@ angular.module('copayApp.services') } storage.get('profile', function(getErr, getStr) { - if (getErr) { - return cb(getErr); + _onOldProfileRetrieved(getErr, getStr, function(oldErr, oldProfile){ + if (oldErr) { + return cb(oldErr, null); } - if (!getStr) { + if (!oldProfile) { if (secureProfile) { return cb(null, secureProfile); } else { @@ -200,20 +239,7 @@ angular.module('copayApp.services') return cb(null, null); } } - - decryptOnMobile(getStr, function(err, str) { - if (err) return cb(err); - var p, err; - try { - oldProfile = Profile.fromString(str); - } catch (e) { - $log.debug('Could not read profile:', e); - err = new Error('Could not read profile.'); - return(err, null); - } - _migrateProfiles(oldProfile, secureProfile, cb); - }); }); }); diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 316a909d8..88ed99d5f 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -1,4 +1,4 @@ -describe('storageService on desktop', function(){ +xdescribe('storageService on desktop', function(){ var appConfig, expectedOldProfileSavedToSecure, expectedOldProfileMergedWithSecure, @@ -411,6 +411,385 @@ describe('storageService on desktop', function(){ }); +describe('storageService on desktop using old storage', function(){ + var appConfig, + localStorageServiceMock, + log, + oldProfile, + platformInfoStub, + secureStorageService, + secureStorageServiceMock, + storageService; + + oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + + log = { + debug: function(s){ console.log(s); }, + error: function(s){ console.log(s); }, + info: function(s){ console.log(s); } + }; + + beforeEach(function(){ + module('ngLodash'); + module('bwcModule'); + module('copayApp.services'); + + localStorageServiceMock = { + get: jasmine.createSpy(), + remove: jasmine.createSpy() + }; + + platformInfoStub = { + isCordova: false, + isNW: true + }; + + secureStorageServiceMock = { + get: jasmine.createSpy(), + set: jasmine.createSpy() + }; + + module(function($provide) { + $provide.value('localStorageService', localStorageServiceMock); + //$provide.value('$log', log); // Handy for debugging test failures + $provide.value('platformInfo', platformInfoStub); + $provide.value('secureStorageService', secureStorageServiceMock); + }); + + inject(function($injector){ + appConfig = $injector.get('appConfigService'); + storageService = $injector.get('storageService'); + }); + + secureProfileFromOldOnly = secureProfileFromOldOnly.replace('${appVersion}', appConfig.version); + expectedOldProfileSavedToSecure = expectedOldProfileSavedToSecure.replace('${appVersion}', appConfig.version); + + }); + + fit('getProfile() from local storage.', function() { + var error, keyLocalGet, profile; + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keyLocalGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + expect(secureStorageServiceMock.get.calls.any()).toBe(false); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + + expect(profile.appVersion).toBeUndefined(); + expect(profile.createdOn).toBe(1528363022385); + + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[0].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); + }); + + fit('getProfile() from local storage, get fails.', function() { + var error, keyLocalGet, profile; + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(new Error('Local get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBeFalsy('Local get error.'); + expect(profile).toBeFalsy(); + + expect(keyLocalGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + expect(secureStorageServiceMock.get.calls.any()).toBe(false); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + + expect(profile.appVersion).toBeUndefined(); + expect(profile.createdOn).toBe(1528363022385); + }); + + it('getProfile() from file storage, remove fails.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, null); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileSavedToSecure); + }); + + it('getProfile(), secure get fails.', function() { + var error, keySecureGet, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(new Error('Secure get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure get error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile(), secure get succeeds, file storage get fails.', function() { + var error, keySecureGet, keyLocalGet, profile, profile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(new Error('File storage get error.'), null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('File storage get error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile() from secure storage.', function() { + var error, keySecureGet, keyLocalGet, profile, profile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); + }); + + it('getProfile() merge from local and secure storage.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(null); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error).toBeFalsy(); + expect(profile).toBeTruthy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(profile.appVersion).toBe('4.11.0'); + expect(profile.createdOn).toBe(1528363260283); + + // Existing secure + expect(profile.credentials[0].coin).toBe('bch'); + expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); + + expect(profile.credentials[1].coin).toBe('btc'); + expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); + expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); + + // Old + expect(profile.credentials[2].coin).toBe('bch'); + expect(profile.credentials[2].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[2].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); + + expect(profile.credentials[3].coin).toBe('btc'); + expect(profile.credentials[3].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); + expect(profile.credentials[3].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); + + }); + + it('getProfile() merge from local and secure storage, secure set fails, not removed from local.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfile = v; + cb(new Error('Secure set error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Secure set error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + + expect(localStorageServiceMock.remove.calls.any()).toBe(false); + }); + + it('getProfile() merge from local and secure storage, remove from local fails.', function() { + var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; + + secureStorageServiceMock.get.and.callFake(function(k, cb){ + keySecureGet = k; + cb(null, secureProfile); + }); + + localStorageServiceMock.get.and.callFake(function(k, cb){ + keyLocalGet = k; + cb(null, oldProfile); + }); + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k + savedProfile = v; + cb(null); + }); + + localStorageServiceMock.remove.and.callFake(function(k, cb){ + keyLocalRemove = k; + cb(new Error('Remove error.')); + }); + + storageService.getProfile(function(err, p){ + error = err; + profile = p; + }); + + expect(error.message).toBe('Remove error.'); + expect(profile).toBeFalsy(); + + expect(keySecureGet).toBe('profile'); + expect(keyLocalGet).toBe('profile'); + expect(keySecureSet).toBe('profile'); + expect(keyLocalRemove).toBe('profile'); + + expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); + }); + +}); + describe('storageService on mobile', function(){ var appConfig, expectedOldProfileSavedToSecure, From c9c27e838c47ca4f0fb8411833f3570b18025d0c Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 11 Jun 2018 12:39:25 +1200 Subject: [PATCH 037/166] Corrected the name on some things. --- src/js/services/storageService.spec.js | 288 +------------------------ 1 file changed, 9 insertions(+), 279 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 88ed99d5f..c9b4fb3a1 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -111,7 +111,7 @@ xdescribe('storageService on desktop', function(){ expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); }); - it('getProfile() from file storage, remove fails.', function() { + it('getProfile() from local storage, remove fails.', function() { var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ @@ -151,7 +151,7 @@ xdescribe('storageService on desktop', function(){ expect(savedProfile).toBe(expectedOldProfileSavedToSecure); }); - it('getProfile() from file storage, secure set fails, not removed.', function() { + it('getProfile() from local storage, secure set fails, not removed.', function() { var error, keySecureGet, keyLocalGet, keySecureSet, profile, profile, savedProfile; secureStorageServiceMock.get.and.callFake(function(k, cb){ @@ -208,7 +208,7 @@ xdescribe('storageService on desktop', function(){ expect(localStorageServiceMock.remove.calls.any()).toBe(false); }); - it('getProfile(), secure get succeeds, file storage get fails.', function() { + it('getProfile(), secure get succeeds, local storage get fails.', function() { var error, keySecureGet, keyLocalGet, profile, profile; secureStorageServiceMock.get.and.callFake(function(k, cb){ @@ -218,7 +218,7 @@ xdescribe('storageService on desktop', function(){ localStorageServiceMock.get.and.callFake(function(k, cb){ keyLocalGet = k; - cb(new Error('File storage get error.'), null); + cb(new Error('Local storage get error.'), null); }); storageService.getProfile(function(err, p){ @@ -226,7 +226,7 @@ xdescribe('storageService on desktop', function(){ profile = p; }); - expect(error.message).toBe('File storage get error.'); + expect(error.message).toBe('Local storage get error.'); expect(profile).toBeFalsy(); expect(keySecureGet).toBe('profile'); @@ -411,7 +411,7 @@ xdescribe('storageService on desktop', function(){ }); -describe('storageService on desktop using old storage', function(){ +describe('storageService on desktop using local storage', function(){ var appConfig, localStorageServiceMock, log, @@ -440,7 +440,6 @@ describe('storageService on desktop using old storage', function(){ }; platformInfoStub = { - isCordova: false, isNW: true }; @@ -460,13 +459,9 @@ describe('storageService on desktop using old storage', function(){ appConfig = $injector.get('appConfigService'); storageService = $injector.get('storageService'); }); - - secureProfileFromOldOnly = secureProfileFromOldOnly.replace('${appVersion}', appConfig.version); - expectedOldProfileSavedToSecure = expectedOldProfileSavedToSecure.replace('${appVersion}', appConfig.version); - }); - fit('getProfile() from local storage.', function() { + it('getProfile().', function() { var error, keyLocalGet, profile; localStorageServiceMock.get.and.callFake(function(k, cb){ @@ -500,7 +495,7 @@ describe('storageService on desktop using old storage', function(){ expect(profile.credentials[1].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); }); - fit('getProfile() from local storage, get fails.', function() { + it('getProfile(), get fails.', function() { var error, keyLocalGet, profile; localStorageServiceMock.get.and.callFake(function(k, cb){ @@ -513,7 +508,7 @@ describe('storageService on desktop using old storage', function(){ profile = p; }); - expect(error.message).toBeFalsy('Local get error.'); + expect(error.message).toBe('Local get error.'); expect(profile).toBeFalsy(); expect(keyLocalGet).toBe('profile'); @@ -521,271 +516,6 @@ describe('storageService on desktop using old storage', function(){ expect(localStorageServiceMock.remove.calls.any()).toBe(false); expect(secureStorageServiceMock.get.calls.any()).toBe(false); expect(secureStorageServiceMock.set.calls.any()).toBe(false); - - expect(profile.appVersion).toBeUndefined(); - expect(profile.createdOn).toBe(1528363022385); - }); - - it('getProfile() from file storage, remove fails.', function() { - var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, null); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(null, oldProfile); - }); - - secureStorageServiceMock.set.and.callFake(function(k, v, cb){ - keySecureSet = k; - savedProfile = v; - cb(null); - }); - - localStorageServiceMock.remove.and.callFake(function(k, cb){ - keyLocalRemove = k; - cb(new Error('Remove error.')); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error.message).toBe('Remove error.'); - expect(profile).toBeFalsy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - expect(keySecureSet).toBe('profile'); - expect(keyLocalRemove).toBe('profile'); - - expect(savedProfile).toBe(expectedOldProfileSavedToSecure); - }); - - it('getProfile(), secure get fails.', function() { - var error, keySecureGet, profile, profile, savedProfile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(new Error('Secure get error.'), null); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error.message).toBe('Secure get error.'); - expect(profile).toBeFalsy(); - - expect(keySecureGet).toBe('profile'); - - expect(localStorageServiceMock.remove.calls.any()).toBe(false); - }); - - it('getProfile(), secure get succeeds, file storage get fails.', function() { - var error, keySecureGet, keyLocalGet, profile, profile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, secureProfile); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(new Error('File storage get error.'), null); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error.message).toBe('File storage get error.'); - expect(profile).toBeFalsy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - - expect(localStorageServiceMock.remove.calls.any()).toBe(false); - }); - - it('getProfile() from secure storage.', function() { - var error, keySecureGet, keyLocalGet, profile, profile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, secureProfile); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(null, null); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error).toBeFalsy(); - expect(profile).toBeTruthy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - - expect(profile.appVersion).toBe('4.11.0'); - expect(profile.createdOn).toBe(1528363260283); - - expect(profile.credentials[0].coin).toBe('bch'); - expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); - expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); - - expect(profile.credentials[1].coin).toBe('btc'); - expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); - expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); - }); - - it('getProfile() merge from local and secure storage.', function() { - var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, secureProfile); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(null, oldProfile); - }); - - secureStorageServiceMock.set.and.callFake(function(k, v, cb){ - keySecureSet = k; - savedProfile = v; - cb(null); - }); - - localStorageServiceMock.remove.and.callFake(function(k, cb){ - keyLocalRemove = k; - cb(null); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error).toBeFalsy(); - expect(profile).toBeTruthy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - expect(keySecureSet).toBe('profile'); - expect(keyLocalRemove).toBe('profile'); - - expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); - - expect(profile.appVersion).toBe('4.11.0'); - expect(profile.createdOn).toBe(1528363260283); - - // Existing secure - expect(profile.credentials[0].coin).toBe('bch'); - expect(profile.credentials[0].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); - expect(profile.credentials[0].walletId).toBe('9580929b-417d-4fce-bcbf-de8e16a51c25'); - - expect(profile.credentials[1].coin).toBe('btc'); - expect(profile.credentials[1].mnemonic).toBe('forget camera antique cement army ahead quantum leisure claim behind climb eight'); - expect(profile.credentials[1].walletId).toBe('ef78459e-52b1-418a-b89d-4df2ef1d27ea'); - - // Old - expect(profile.credentials[2].coin).toBe('bch'); - expect(profile.credentials[2].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); - expect(profile.credentials[2].walletId).toBe('a8ea9291-1369-4862-90a1-d80a5d4bcc20'); - - expect(profile.credentials[3].coin).toBe('btc'); - expect(profile.credentials[3].mnemonic).toBe('morning conduct milk catch victory smoke ship little dutch original legal gadget'); - expect(profile.credentials[3].walletId).toBe('f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b'); - - }); - - it('getProfile() merge from local and secure storage, secure set fails, not removed from local.', function() { - var error, keySecureGet, keyLocalGet, keySecureSet, profile, profile, savedProfile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, secureProfile); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(null, oldProfile); - }); - - secureStorageServiceMock.set.and.callFake(function(k, v, cb){ - keySecureSet = k; - savedProfile = v; - cb(new Error('Secure set error.')); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error.message).toBe('Secure set error.'); - expect(profile).toBeFalsy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - expect(keySecureSet).toBe('profile'); - - expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); - - expect(localStorageServiceMock.remove.calls.any()).toBe(false); - }); - - it('getProfile() merge from local and secure storage, remove from local fails.', function() { - var error, keySecureGet, keyLocalGet, keySecureSet, keyLocalRemove, profile, profile, savedProfile; - - secureStorageServiceMock.get.and.callFake(function(k, cb){ - keySecureGet = k; - cb(null, secureProfile); - }); - - localStorageServiceMock.get.and.callFake(function(k, cb){ - keyLocalGet = k; - cb(null, oldProfile); - }); - - secureStorageServiceMock.set.and.callFake(function(k, v, cb){ - keySecureSet = k - savedProfile = v; - cb(null); - }); - - localStorageServiceMock.remove.and.callFake(function(k, cb){ - keyLocalRemove = k; - cb(new Error('Remove error.')); - }); - - storageService.getProfile(function(err, p){ - error = err; - profile = p; - }); - - expect(error.message).toBe('Remove error.'); - expect(profile).toBeFalsy(); - - expect(keySecureGet).toBe('profile'); - expect(keyLocalGet).toBe('profile'); - expect(keySecureSet).toBe('profile'); - expect(keyLocalRemove).toBe('profile'); - - expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); }); }); From 149b956b7c63c3228c64f7cf1c301a78a6e6c436 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 11 Jun 2018 14:09:39 +1200 Subject: [PATCH 038/166] Storing profile on desktop without using secure storage. --- src/js/services/storageService.js | 9 ++- src/js/services/storageService.spec.js | 102 ++++++++++++++++++++++++- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index de4aa9b54..a2d85950b 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -116,11 +116,16 @@ angular.module('copayApp.services') }; root.storeNewProfile = function(profile, cb) { - secureStorageService.set('profile', profile.toObj(), cb); + root.storeProfile(profile, cb); }; root.storeProfile = function(profile, cb) { - secureStorageService.set('profile', profile.toObj(), cb); + var profileString = profile.toObj(); + if (platformInfo.isNW) { + storage.set('profile', profileString, cb); + } else { + secureStorageService.set('profile', profileString, cb); + } }; /** diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index c9b4fb3a1..8d1bb8be8 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -409,6 +409,9 @@ xdescribe('storageService on desktop', function(){ expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); }); + + + }); describe('storageService on desktop using local storage', function(){ @@ -416,13 +419,15 @@ describe('storageService on desktop using local storage', function(){ localStorageServiceMock, log, oldProfile, + oldProfileString, platformInfoStub, secureStorageService, secureStorageServiceMock, storageService; - oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; - + oldProfileString = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; + oldProfile = Profile.fromString(oldProfileString); + log = { debug: function(s){ console.log(s); }, error: function(s){ console.log(s); }, @@ -436,7 +441,8 @@ describe('storageService on desktop using local storage', function(){ localStorageServiceMock = { get: jasmine.createSpy(), - remove: jasmine.createSpy() + remove: jasmine.createSpy(), + set: jasmine.createSpy() }; platformInfoStub = { @@ -466,7 +472,7 @@ describe('storageService on desktop using local storage', function(){ localStorageServiceMock.get.and.callFake(function(k, cb){ keyLocalGet = k; - cb(null, oldProfile); + cb(null, oldProfileString); }); storageService.getProfile(function(err, p){ @@ -518,6 +524,94 @@ describe('storageService on desktop using local storage', function(){ expect(secureStorageServiceMock.set.calls.any()).toBe(false); }); + it('storeNewProfile() to local storage.', function() { + var error, keyLocalSet, savedProfileString; + + localStorageServiceMock.set.and.callFake(function(k, v, cb){ + keyLocalSet = k; + savedProfileString = v; + cb(null); + }); + + storageService.storeNewProfile(oldProfile, function(err){ + error = err; + }); + + expect(error).toBeFalsy(); + expect(savedProfileString).toBeTruthy(); + + expect(keyLocalSet).toBe('profile'); + + expect(savedProfileString).toBe(oldProfileString); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeNewProfile() to local storage, set fails.', function() { + var error, keyLocalSet, savedProfileString; + + localStorageServiceMock.set.and.callFake(function(k, v, cb){ + keyLocalSet = k; + savedProfileString = v; + cb(new Error('Local set failed.')); + }); + + storageService.storeNewProfile(oldProfile, function(err){ + error = err; + }); + + expect(error.message).toBe('Local set failed.'); + expect(savedProfileString).toBe(oldProfileString); + + expect(keyLocalSet).toBe('profile'); + + expect(savedProfileString).toBe(oldProfileString); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeProfile() to local storage.', function() { + var error, keyLocalSet, savedProfileString; + + localStorageServiceMock.set.and.callFake(function(k, v, cb){ + keyLocalSet = k; + savedProfileString = v; + cb(null); + }); + + storageService.storeProfile(oldProfile, function(err){ + error = err; + }); + + expect(error).toBeFalsy(); + expect(savedProfileString).toBeTruthy(); + + expect(keyLocalSet).toBe('profile'); + + expect(savedProfileString).toBe(oldProfileString); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeProfile() to local storage, set fails.', function() { + var error, keyLocalSet, savedProfileString; + + localStorageServiceMock.set.and.callFake(function(k, v, cb){ + keyLocalSet = k; + savedProfileString = v; + cb(new Error('Local set failed.')); + }); + + storageService.storeProfile(oldProfile, function(err){ + error = err; + }); + + expect(error.message).toBe('Local set failed.'); + expect(savedProfileString).toBe(oldProfileString); + + expect(keyLocalSet).toBe('profile'); + + expect(savedProfileString).toBe(oldProfileString); + expect(secureStorageServiceMock.set.calls.any()).toBe(false); + }); + }); describe('storageService on mobile', function(){ From 7209800b3c1561055696baeb9c16854c96d12996 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 11 Jun 2018 14:21:15 +1200 Subject: [PATCH 039/166] Tests for storing profile on mobile. --- src/js/services/storageService.spec.js | 95 +++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/src/js/services/storageService.spec.js b/src/js/services/storageService.spec.js index 8d1bb8be8..493678b97 100644 --- a/src/js/services/storageService.spec.js +++ b/src/js/services/storageService.spec.js @@ -623,6 +623,7 @@ describe('storageService on mobile', function(){ oldProfile, platformInfoStub, savedSecureProfile, + secureProfileObj, secureStorageService, secureStorageServiceMock, storageService; @@ -632,7 +633,8 @@ describe('storageService on mobile', function(){ oldProfile = '{"version":"1.0.0","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfile = '{"version":"1.0.0","appVersion":"4.11.0","createdOn":1528363260283,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"81f52508c14d50cdde2ad527920f209cbf51162b0dbaa7ceac298ed6d34d1ff8","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"9580929b-417d-4fce-bcbf-de8e16a51c25","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"54dd6773fec23b07eff5cda33fd0ad2591de31db356c67cd3e5dc67211d7c8ac","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"PptIrH74qd63DPMC1LQ/dQ==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K4Mge6QumKYh1aSYLB26z6QhkDz8tJLuXdumCJy9PYBrHMrTW3boiaodkVNTciR7PcPAcLXZeUWSehMJc3GXJp1uR68x3Nh5","xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPrivKey":"8fde6c8da5cf59cc0b19e87ea102aef2799047b9062f3e08668a92ef4582e040","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2","copayerId":"6f3c19e90d6eb9096a57199d53494fd6d62852ffaaa62fb5a5baef9f65753ce1","publicKeyRing":[{"xPubKey":"xpub6CGZNmTZ9KmHyxgbqZhfcJKwhrgN5EfHh2P7YppRXPGvUg6QkAuErmaQQa3cjyS9NMuFnvxm1eNUcbUEuiVikzUmZmVrtVcU7uvjWUNrRTG","requestPubKey":"0366db5dd83550ebefa8946d770e68ea8bb0e197076713bb681fb80d6fbc4278b2"}],"walletId":"ef78459e-52b1-418a-b89d-4df2ef1d27ea","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"2ac4835b2c883e095f4b187d712e53701781cb0d24e8813e736fd2d8a3219fec","personalEncryptingKey":"r5Tpd+/YD6uGXKZeeqZBPg==","sharedEncryptingKey":"WMcSMqfwZ+qfhP58S9l6OA==","copayerName":"me","mnemonic":"forget camera antique cement army ahead quantum leisure claim behind climb eight","entropySource":"fc2357f9d0176aa3a571bdfdea9e12cd16c27019e87b80ab0f08ddf15101d532","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"9580929b-417d-4fce-bcbf-de8e16a51c25":true,"ef78459e-52b1-418a-b89d-4df2ef1d27ea":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; secureProfileFromOldOnly = '{"version":"1.0.0","appVersion":"${appVersion}","createdOn":1528363022385,"credentials":[{"coin":"bch","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"cc5667792d8378ad61dc30a65bafea3d03d9179c5615d9f183738b002d978659","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"a8ea9291-1369-4862-90a1-d80a5d4bcc20","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"8437d2824b17f31d548fc2855577e9092ac5a7f9c985e5329acab34a8e786fb8","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"ZhMBX+t9/0n2kCasR5KH0w==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"},{"coin":"btc","network":"livenet","xPrivKey":"xprv9s21ZrQH143K2vd69iX1D5R2Acdjx6hzsSncBqnTri7UUad3SxSxFGukcjCUBKfWtZx3KGVjSd94ypEz4gB5RzATenxCEVPPZsgVJpoXkRq","xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPrivKey":"c1cac5328bf71c0f73f64ef868ddea66356ba797f87af4939390d58a7ff1aeda","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d","copayerId":"8430d4ca7a324ce0176e782c2d48f333666bd8f9b66fdd432a7f1ad1c80341ec","publicKeyRing":[{"xPubKey":"xpub6CZLbRhS7jEN2UT3ZhGeia6jPxr4guckZDa7ogncrrES2GyMj7Pq5U4oYLV2FhAMuuYA8qzxWV3TDXXDSkGTaqHstjRANCgCjrMDA1r7AN8","requestPubKey":"02b41c465aaf8f41192f2444a07c6e64d6147a080c5b82a6e73b3b232f11e1575d"}],"walletId":"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b","walletName":"Personal Wallet","m":1,"n":1,"walletPrivKey":"30df9228ff38258afe363a29cb02bff6d76f9f66ed36250de493717f4c941cc1","personalEncryptingKey":"qZmFZypS3TufwM5+WzvNJw==","sharedEncryptingKey":"2wQyQJGV3vyRPE/uil9ZRA==","copayerName":"me","mnemonic":"morning conduct milk catch victory smoke ship little dutch original legal gadget","entropySource":"3f88849ae9522574a2aaab870594b25a4e90b9dc632724ef3675fc3c49aa93b9","mnemonicHasPassphrase":false,"derivationStrategy":"BIP44","account":0,"compliantDerivation":true,"addressType":"P2PKH"}],"disclaimerAccepted":true,"checked":{"a8ea9291-1369-4862-90a1-d80a5d4bcc20":true,"f4ff4629-ff53-4bc7-8c98-e7c8e0149d3b":true},"checkedUA":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}'; - + secureProfileObj = Profile.fromString(secureProfile); + log = { debug: function(s){ console.log(s); }, error: function(s){ console.log(s); }, @@ -646,7 +648,8 @@ describe('storageService on mobile', function(){ fileStorageServiceMock = { get: jasmine.createSpy(), - remove: jasmine.createSpy() + remove: jasmine.createSpy(), + set: jasmine.createSpy() }; platformInfoStub = { @@ -1025,4 +1028,92 @@ describe('storageService on mobile', function(){ expect(savedProfile).toBe(expectedOldProfileMergedWithSecure); }); + it('storeNewProfile().', function() { + var error, keySecureSet, savedProfileString; + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfileString = v; + cb(null); + }); + + storageService.storeNewProfile(secureProfileObj, function(err){ + error = err; + }); + + expect(error).toBeFalsy(); + expect(savedProfileString).toBeTruthy(); + + expect(keySecureSet).toBe('profile'); + + expect(savedProfileString).toBe(secureProfile); + expect(fileStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeNewProfile(), secure set fails.', function() { + var error, keySecureSet, savedProfileString; + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfileString = v; + cb(new Error('Secure set failed.')); + }); + + storageService.storeNewProfile(secureProfileObj, function(err){ + error = err; + }); + + expect(error.message).toBe('Secure set failed.'); + expect(savedProfileString).toBeTruthy(); + + expect(keySecureSet).toBe('profile'); + + expect(savedProfileString).toBe(secureProfile); + expect(fileStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeProfile().', function() { + var error, keySecureSet, savedProfileString; + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfileString = v; + cb(null); + }); + + storageService.storeProfile(secureProfileObj, function(err){ + error = err; + }); + + expect(error).toBeFalsy(); + expect(savedProfileString).toBeTruthy(); + + expect(keySecureSet).toBe('profile'); + + expect(savedProfileString).toBe(secureProfile); + expect(fileStorageServiceMock.set.calls.any()).toBe(false); + }); + + it('storeProfile(), secure set fails.', function() { + var error, keySecureSet, savedProfileString; + + secureStorageServiceMock.set.and.callFake(function(k, v, cb){ + keySecureSet = k; + savedProfileString = v; + cb(new Error('Secure set failed.')); + }); + + storageService.storeProfile(secureProfileObj, function(err){ + error = err; + }); + + expect(error.message).toBe('Secure set failed.'); + expect(savedProfileString).toBeTruthy(); + + expect(keySecureSet).toBe('profile'); + + expect(savedProfileString).toBe(secureProfile); + expect(fileStorageServiceMock.set.calls.any()).toBe(false); + }); + }); \ No newline at end of file From 1d9bf3d7c5325e3317fad191c91e641dd2a10579 Mon Sep 17 00:00:00 2001 From: Sam Cheng Hung Date: Tue, 12 Jun 2018 10:49:55 +0530 Subject: [PATCH 040/166] Increment version --- app-template/bitcoincom/appConfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 41c2789c8..2904cb5eb 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,8 +24,8 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.11.0", - "fullVersion": "4.11-rc1", + "version": "4.12.0", + "fullVersion": "4.12-rc1", "androidVersion": "411000", "_extraCSS": "", "_enabledExtensions": { From 4fb375187b9a694840acae76962f458de232eca2 Mon Sep 17 00:00:00 2001 From: Sam Cheng Hung Date: Tue, 12 Jun 2018 13:11:04 +0530 Subject: [PATCH 041/166] Increment Android version --- app-template/bitcoincom/appConfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 2904cb5eb..7fba677c4 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -26,7 +26,7 @@ "description": "A Secure Bitcoin Wallet", "version": "4.12.0", "fullVersion": "4.12-rc1", - "androidVersion": "411000", + "androidVersion": "412000", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, From a6d2799510849606d2a88942979ef1e73a78c37f Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Wed, 13 Jun 2018 15:56:39 +1200 Subject: [PATCH 042/166] Display fiat on Payment Received screen, according to preferences. --- src/js/controllers/tab-receive.js | 6 ++++++ www/views/tab-receive.html | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index c9fa46de9..4d048e22e 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -125,6 +125,12 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi for (var i = 0; i < data.x.out.length; i++) { if (data.x.out[i].addr == watchAddress) { $scope.paymentReceivedAmount = txFormatService.formatAmount(data.x.out[i].value, 'full'); + $scope.paymentReceivedAlternativeAmount = null; // For when a subsequent payment is received. + txFormatService.formatAlternativeStr($scope.wallet.coin, data.x.out[i].value, function(alternativeStr){ + if (alternativeStr) { + $scope.paymentReceivedAlternativeAmount = alternativeStr; + } + }); } } $scope.paymentReceivedCoin = $scope.wallet.coin; diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 0eb598096..a6b94b74e 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -61,7 +61,8 @@


Payment Received! - {{ paymentReceivedAmount }} {{ paymentReceivedCoin }} + {{ paymentReceivedAmount }} {{ paymentReceivedCoin }} + {{ paymentReceivedAlternativeAmount }} Return To Address

From 0d4cd77d4d32c6c867c8cfb94597b305f73a32e2 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 13 Jun 2018 16:25:43 +0200 Subject: [PATCH 043/166] config.xml to add native audio --- app-template/config-template.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 39b67d212..ed4b192ba 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,6 +72,7 @@ + From c0e691ec27ab747ef997077ee4f90de20bd7eae5 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 13 Jun 2018 16:27:37 +0200 Subject: [PATCH 044/166] Received sound file + code to play when receiving --- src/js/controllers/tab-receive.js | 28 ++++++++++++++++++++++++++++ www/misc/coin_received.mp3 | Bin 0 -> 16744 bytes 2 files changed, 28 insertions(+) create mode 100644 www/misc/coin_received.mp3 diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index c9fa46de9..5a0f58c89 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -12,6 +12,23 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi var currentAddressSocket = {}; var paymentSubscriptionObj = { op:"addr_sub" } + var config = configService.getSync(); + + var soundLoaded = false; + var nativeAudioAvailable = (window.plugins && window.plugins.NativeAudio); + + if (nativeAudioAvailable) { + window.plugins.NativeAudio.preloadSimple('received', 'misc/coin_received.mp3', function (msg) { + $log.debug('Receive sound loaded.'); + soundLoaded = true; + }, function (error) { + $log.debug('Error loading receive sound.'); + $log.debug(error); + }); + } else { + $log.debug('isNW: Using HTML5-Audio instead of native audio'); + soundLoaded = true; + } $scope.displayBalanceAsFiat = true; @@ -129,6 +146,17 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } $scope.paymentReceivedCoin = $scope.wallet.coin; $scope.$apply(function () { + + if (config.soundsEnabled && soundLoaded) { + $log.debug('Play sound.'); + if (nativeAudioAvailable) { + window.plugins.NativeAudio.play('received'); + } else { + new Audio('misc/coin_received.mp3').play(); + } + } else { + $log.debug('Sound is disabled.'); + } $scope.showingPaymentReceived = true; }); } diff --git a/www/misc/coin_received.mp3 b/www/misc/coin_received.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d648204506e2bc1e4ae2555e9b7299eeee0459cf GIT binary patch literal 16744 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 literal 0 HcmV?d00001 From 74f3e195453ec6c78eaa184bcfc38be8d8994a20 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 13 Jun 2018 16:29:01 +0200 Subject: [PATCH 045/166] ogg-file for Desktop as NWjs doesn't accept mp3 --- src/js/controllers/tab-receive.js | 2 +- www/misc/coin_received.ogg | Bin 0 -> 6751 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 www/misc/coin_received.ogg diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 5a0f58c89..399f196d1 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -152,7 +152,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi if (nativeAudioAvailable) { window.plugins.NativeAudio.play('received'); } else { - new Audio('misc/coin_received.mp3').play(); + new Audio('misc/coin_received.ogg').play(); // NW.js has no mp3 support } } else { $log.debug('Sound is disabled.'); diff --git a/www/misc/coin_received.ogg b/www/misc/coin_received.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3f6b7baedd71cb8867ffb3f07321611a9d7b2cab GIT binary patch literal 6751 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 Yx=0B4z=a=bU{jAmgf%mX1Ol1-U+67Xg8%>k literal 0 HcmV?d00001 From 59bb7ee65fd9382f5c1d50fe53ddc0f563a94dad Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 13 Jun 2018 16:33:06 +0200 Subject: [PATCH 046/166] Enable sound by default --- src/js/services/configService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/configService.js b/src/js/services/configService.js index e8ed93d88..72cc4825f 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -107,7 +107,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer enabled: false, }, - soundsEnabled: false, + soundsEnabled: true, log: { filter: 'debug', From ec46b50262e9eb96db8bf3d1807c9dfd75ba8be1 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 13 Jun 2018 18:34:32 +0200 Subject: [PATCH 047/166] Remove payment received screen after changing tabs --- src/js/controllers/tab-receive.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index c9fa46de9..8100222f6 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -225,6 +225,10 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }); $scope.$on("$ionicView.leave", function(event, data) { + if ($scope.showingPaymentReceived) { + $scope.showingPaymentReceived = false; + } + lodash.each(listeners, function(x) { x(); }); From a186e4d04f353626e50acedfcb34d82299007c7c Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 14 Jun 2018 22:16:25 +1200 Subject: [PATCH 048/166] Display fiat on Network Fees popup. Display subcent amounts as '< 0.01'. --- src/js/controllers/confirm.js | 17 ++++-- src/js/services/txFormatService.js | 14 +++-- src/js/services/txFormatService.spec.js | 71 +++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 src/js/services/txFormatService.spec.js diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index fc92a2287..53589cf22 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -426,6 +426,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( function showSendMaxWarning(wallet, sendMaxInfo) { + var feeAlternative, + msg; function verifyExcludedUtxos() { var warningMsg = []; @@ -443,9 +445,18 @@ angular.module('copayApp.controllers').controller('confirmController', function( return warningMsg.join('\n'); }; - var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", { - fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee) - }); + feeAlternative = txFormatService.formatAlternativeStr(wallet.coin, sendMaxInfo.fee); + if (feeAlternative) { + msg = gettextCatalog.getString("{{feeAlternative}} will be deducted for bitcoin networking fees ({{fee}}).", { + fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee), + feeAlternative: feeAlternative + }); + } else { + gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", { + fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee) + }); + } + var warningMsg = verifyExcludedUtxos(); if (!lodash.isEmpty(warningMsg)) diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index 5817c1a27..c208857a8 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -72,11 +72,19 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, var config = configService.getSync().wallet.settings; var val = function() { - var v1 = parseFloat((rateService.toFiat(satoshis, config.alternativeIsoCode, coin)).toFixed(2)); - v1 = $filter('formatFiatAmount')(v1); + var fiatAmount = rateService.toFiat(satoshis, config.alternativeIsoCode, coin); + var roundedStr = fiatAmount.toFixed(2); + var roundedNum = parseFloat(roundedStr); + var subcent = roundedNum === 0 && fiatAmount > 0; + var lessThanPrefix = ''; + if (subcent) { + roundedNum = 0.01; + lessThanPrefix = '< ' + } + var v1 = $filter('formatFiatAmount')(roundedNum); if (!v1) return null; - return v1 + ' ' + config.alternativeIsoCode; + return lessThanPrefix + v1 + ' ' + config.alternativeIsoCode; }; // Async version diff --git a/src/js/services/txFormatService.spec.js b/src/js/services/txFormatService.spec.js new file mode 100644 index 000000000..5ca60210d --- /dev/null +++ b/src/js/services/txFormatService.spec.js @@ -0,0 +1,71 @@ +describe('txFormatService', function(){ + var configServiceMock, + rateServiceMock, + txFormatService; + + beforeEach(function(){ + module('ngLodash'); + module('bwcModule'); + module('copayApp.filters'); + module('copayApp.services'); + + configServiceMock = { + getSync: jasmine.createSpy() + }; + + rateServiceMock = { + isAvailable: jasmine.createSpy(), + toFiat: jasmine.createSpy() + }; + + module(function($provide) { + $provide.value('configService', configServiceMock); + //$provide.value('$log', log); // Handy for debugging test failures + $provide.value('rateService', rateServiceMock); + }); + + inject(function($injector){ + txFormatService = $injector.get('txFormatService'); + }); + + }); + + it('formatAlternativeStr 0.49 cents.', function() { + + configServiceMock.getSync.and.returnValue({ + wallet: { + settings: { + alternativeIsoCode: 'USD' + } + } + }); + + rateServiceMock.isAvailable.and.returnValue(true); + rateServiceMock.toFiat.and.returnValue(0.00499); + + var formatted = txFormatService.formatAlternativeStr('bch', 123); + + expect(formatted).toBe('< 0.01 USD'); + //expect(formatted).toBe('0.00 USD'); + + }); + + it('formatAlternativeStr 0.5 cents.', function() { + + configServiceMock.getSync.and.returnValue({ + wallet: { + settings: { + alternativeIsoCode: 'USD' + } + } + }); + + rateServiceMock.isAvailable.and.returnValue(true); + rateServiceMock.toFiat.and.returnValue(0.005); + + var formatted = txFormatService.formatAlternativeStr('bch', 123); + + expect(formatted).toBe('0.01 USD'); + }); + +}); \ No newline at end of file From 143b39970b55bfb15606a04c591099eaba6a95d6 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 14 Jun 2018 22:18:17 +1200 Subject: [PATCH 049/166] Removed some commented out code. --- src/js/services/txFormatService.spec.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/js/services/txFormatService.spec.js b/src/js/services/txFormatService.spec.js index 5ca60210d..c67e86f21 100644 --- a/src/js/services/txFormatService.spec.js +++ b/src/js/services/txFormatService.spec.js @@ -20,7 +20,6 @@ describe('txFormatService', function(){ module(function($provide) { $provide.value('configService', configServiceMock); - //$provide.value('$log', log); // Handy for debugging test failures $provide.value('rateService', rateServiceMock); }); @@ -46,8 +45,6 @@ describe('txFormatService', function(){ var formatted = txFormatService.formatAlternativeStr('bch', 123); expect(formatted).toBe('< 0.01 USD'); - //expect(formatted).toBe('0.00 USD'); - }); it('formatAlternativeStr 0.5 cents.', function() { From 1e73eae4d2db7fdfdc398deb818704d38fc83fad Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 10:04:15 +1200 Subject: [PATCH 050/166] Bugfix for undefined wallet status on send tab. --- src/js/controllers/tab-send.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 29f1749cb..2282ab878 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -76,8 +76,11 @@ angular.module('copayApp.controllers').controller('tabSendController', function( var walletList = []; lodash.each(walletsToTransfer, function(v) { var displayBalanceAsFiat = - v.status.alternativeBalanceAvailable && - config.wallet.settings.priceDisplay === 'fiat'; + // BD got v.status as undefined here once during development, just + // after creating a new wallet. + v.status && + v.status.alternativeBalanceAvailable && + config.wallet.settings.priceDisplay === 'fiat'; walletList.push({ color: v.color, From e416deec44a66937b1848852ad4a64859c0fb90e Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 10:06:38 +1200 Subject: [PATCH 051/166] Amount shown confirm screen is now primarily fiat. --- src/sass/views/includes/txp-details.scss | 12 ++++-------- www/views/confirm.html | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/sass/views/includes/txp-details.scss b/src/sass/views/includes/txp-details.scss index c32faaacd..9da0811e0 100644 --- a/src/sass/views/includes/txp-details.scss +++ b/src/sass/views/includes/txp-details.scss @@ -36,17 +36,13 @@ .amount-label{ line-height: 30px; .amount{ - font-size: 38px; + font-size: 16px; margin-bottom: .5rem; - - > .unit { - font-family: "Roboto-Light"; - } + color: #9B9B9B; + font-family: "Roboto-Light"; } .alternative { - font-size: 16px; - font-family: "Roboto-Light"; - color: #9B9B9B; + font-size: 38px; } } } diff --git a/www/views/confirm.html b/www/views/confirm.html index 443043d49..57f3a60e8 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -16,8 +16,8 @@ Sending maximum amount
-
{{tx.amountValueStr || '...'}} {{tx.amountUnitStr}}
{{tx.alternativeAmountStr || '...'}}
+
{{tx.amountValueStr || '...'}} {{tx.amountUnitStr}}
From fffbda2458ac9cd860893c31afb97b58a00024a7 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 10:14:21 +1200 Subject: [PATCH 052/166] Matched amount formatting on Confirm screen, to previous formatting. --- src/js/controllers/confirm.js | 2 ++ src/sass/views/includes/txp-details.scss | 4 ++++ www/views/confirm.html | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 53589cf22..cebf9cb3a 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -288,6 +288,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( tx.amountUnitStr = tx.amountStr.split(' ')[1]; txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) { tx.alternativeAmountStr = v; + tx.alternativeAmountValueStr = tx.alternativeAmountStr.split(' ')[0]; + tx.alternativeAmountUnitStr = tx.alternativeAmountStr.split(' ')[1]; }); } diff --git a/src/sass/views/includes/txp-details.scss b/src/sass/views/includes/txp-details.scss index 9da0811e0..ae6c0d218 100644 --- a/src/sass/views/includes/txp-details.scss +++ b/src/sass/views/includes/txp-details.scss @@ -43,6 +43,10 @@ } .alternative { font-size: 38px; + + > .unit { + font-family: "Roboto-Light"; + } } } } diff --git a/www/views/confirm.html b/www/views/confirm.html index 57f3a60e8..ad34e1f08 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -16,7 +16,7 @@ Sending maximum amount
-
{{tx.alternativeAmountStr || '...'}}
+
{{tx.alternativeAmountValueStr || '...'}} {{tx.alternativeAmountUnitStr}}
{{tx.amountValueStr || '...'}} {{tx.amountUnitStr}}
From a9a05da07d267fee0f243226e94d61c27acb775c Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 10:19:46 +1200 Subject: [PATCH 053/166] Fee on confirm screen now shown primarily in fiat. --- www/views/confirm.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/views/confirm.html b/www/views/confirm.html index ad34e1f08..e54837f34 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -77,9 +77,9 @@
{{'Fee:' | translate}} {{tx.feeLevelName | translate}} - {{tx.txp[wallet.id].feeStr || '...'}} + {{tx.txp[wallet.id].alternativeFeeStr || '...'}} - {{tx.txp[wallet.id].alternativeFeeStr || '...'}}  + {{tx.txp[wallet.id].feeStr || '...'}}  ·   {{tx.txp[wallet.id].feeRatePerStr}} of the sending amount From 901d202f857c07a366d0f1b3c33f711e516f2374 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 10:24:00 +1200 Subject: [PATCH 054/166] Bugfix for when alternative string is not available in Network Fees alert. --- src/js/controllers/confirm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index cebf9cb3a..cc48bf6b9 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -454,7 +454,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( feeAlternative: feeAlternative }); } else { - gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", { + msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", { fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee) }); } From 86be126e951f715d481491564cb55d6ce40e55b1 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 15 Jun 2018 15:43:37 +1200 Subject: [PATCH 055/166] Adjust spacing on amount in confirm screen, to match original. --- src/sass/views/includes/txp-details.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sass/views/includes/txp-details.scss b/src/sass/views/includes/txp-details.scss index ae6c0d218..240ee444b 100644 --- a/src/sass/views/includes/txp-details.scss +++ b/src/sass/views/includes/txp-details.scss @@ -37,12 +37,12 @@ line-height: 30px; .amount{ font-size: 16px; - margin-bottom: .5rem; color: #9B9B9B; font-family: "Roboto-Light"; } .alternative { font-size: 38px; + margin-bottom: .5rem; > .unit { font-family: "Roboto-Light"; From e97843c9dfed74035b6db7a3761876a3932ff099 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 15 Jun 2018 11:16:44 +0200 Subject: [PATCH 056/166] Possible fix for hiding menu in some cases (keyboard-related) --- src/js/routes.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/js/routes.js b/src/js/routes.js index 395a356bd..4e72246ba 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1383,6 +1383,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { + if (document.body.classList.contains('keyboard-open')) { + document.body.classList.remove('keyboard-open'); + $log.debug('Prevented keyboard open bug..'); + } + $log.debug('Route change from:', fromState.name || '-', ' to:', toState.name); $log.debug(' toParams:' + JSON.stringify(toParams || {})); $log.debug(' fromParams:' + JSON.stringify(fromParams || {})); From 585775e88b4868ba43d13b8c8694613dfec9c0cc Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Sun, 17 Jun 2018 17:56:50 +1200 Subject: [PATCH 057/166] Subtitles for coins on home screen. --- src/sass/views/tab-home.scss | 3 +++ src/sass/views/tabs.scss | 7 ++++++- www/views/tab-home.html | 14 +++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index 46fb15224..cac1e688d 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -37,6 +37,9 @@ padding-top: 1.5rem; padding-bottom: 1.5rem; } + &.compact-subtitle { + padding-bottom: 0; + } } .item-sub { &:first-child:before { diff --git a/src/sass/views/tabs.scss b/src/sass/views/tabs.scss index b9a1cd724..b3c1a8dfb 100644 --- a/src/sass/views/tabs.scss +++ b/src/sass/views/tabs.scss @@ -43,6 +43,11 @@ .icon { color: $v-mid-gray; } + .subtitle { + color: $v-mid-gray; + font-size: $font-size-small; + font-weight: 300; + } } } -} +} \ No newline at end of file diff --git a/www/views/tab-home.html b/www/views/tab-home.html index f26c5292d..35f67c82d 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -46,7 +46,7 @@
- + Recent Transactions @@ -56,9 +56,9 @@
-
- - Bitcoin Cash (BCH) +
+
Bitcoin Cash (BCH)
+
Instant transactions with low fees
@@ -71,9 +71,9 @@
-
- - Bitcoin Core (BTC) +
+
Bitcoin Core (BTC)
+
Slow transactions with high fees
From 8231f85c67f7a5aeb52c046c1571849b5760152d Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Sun, 17 Jun 2018 18:08:44 +1200 Subject: [PATCH 058/166] Subtitles for coins on wallet selector in Receive screen. --- src/sass/views/includes/walletSelector.scss | 8 ++++++++ www/views/includes/walletSelector.html | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/sass/views/includes/walletSelector.scss b/src/sass/views/includes/walletSelector.scss index 20753c309..d69676adc 100644 --- a/src/sass/views/includes/walletSelector.scss +++ b/src/sass/views/includes/walletSelector.scss @@ -12,6 +12,14 @@ wallet-selector { font-weight: bold; padding-bottom: 10px; border-bottom: 1px solid #EFEFEF; + &.compact-subtitle { + padding-bottom: 0; + } + .subtitle { + color: $v-mid-gray; + font-size: $font-size-small; + font-weight: 300; + } .wallet-coin-logo { vertical-align: middle; margin-right: 5px; diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index 755331a06..ad3acf9e5 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -7,9 +7,9 @@
{{title}}
-
- - Bitcoin Cash (BCH) +
+
Bitcoin Cash (BCH)
+
Instant transactions with low fees
-
- - Bitcoin Core (BTC) +
+
Bitcoin Core (BTC)
+
Slow transactions with high fees
Date: Mon, 18 Jun 2018 12:44:31 +0200 Subject: [PATCH 059/166] Use the whenAvailable which is called onBeforeEnter so that changed configuration is also reloaded onEnter --- src/js/controllers/tab-receive.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 399f196d1..32cd5281a 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -12,7 +12,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi var currentAddressSocket = {}; var paymentSubscriptionObj = { op:"addr_sub" } - var config = configService.getSync(); + + var config; var soundLoaded = false; var nativeAudioAvailable = (window.plugins && window.plugins.NativeAudio); @@ -243,8 +244,9 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }) ]; - configService.whenAvailable(function(config) { - $scope.displayBalanceAsFiat = config.wallet.settings.priceDisplay === 'fiat'; + configService.whenAvailable(function(_config) { + $scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat'; + config = _config; }); }); From 0687da0e272f8be453f0905552f1abac4c151808 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 18 Jun 2018 17:02:27 +0200 Subject: [PATCH 060/166] iPhone X fix for payment sent modal --- src/sass/views/includes/slideToAcceptSuccess.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sass/views/includes/slideToAcceptSuccess.scss b/src/sass/views/includes/slideToAcceptSuccess.scss index bf6c5e269..68312c7a4 100644 --- a/src/sass/views/includes/slideToAcceptSuccess.scss +++ b/src/sass/views/includes/slideToAcceptSuccess.scss @@ -86,6 +86,9 @@ slide-to-accept-success { transition: transform $duration ease, opacity $duration ease; transition-delay: 250ms; + margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */ + margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */ + &.reveal { -webkit-transform: translateY(0); transform: translateY(0); From c26c7ab8c3119e9204472bf3950a8053957c4421 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 19 Jun 2018 06:19:51 +1200 Subject: [PATCH 061/166] Decorator for displaying debug messages as info. --- Gruntfile.js | 1 + src/js/decorators/displayLogDebug.js | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/js/decorators/displayLogDebug.js diff --git a/Gruntfile.js b/Gruntfile.js index f9ed59621..6c06404fa 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -152,6 +152,7 @@ module.exports = function(grunt) { src: [ 'src/js/app.js', 'src/js/routes.js', + 'src/js/decorators/*.js', 'src/js/directives/*.js', '!src/js/directives/*.spec.js', diff --git a/src/js/decorators/displayLogDebug.js b/src/js/decorators/displayLogDebug.js new file mode 100644 index 000000000..d6ce33dc3 --- /dev/null +++ b/src/js/decorators/displayLogDebug.js @@ -0,0 +1,17 @@ + angular.module('copayApp') + .config(['$provide', '$logProvider', function($provide, $logProvider) { + console.log('Config for profileService'); + // expose a provider to reach debugEnabled in $log + $provide.value('$logProvider', $logProvider); +}]) +.decorator('$log', ['$logProvider', '$delegate', function($logProvider, $delegate) { + console.log('Config for profileService'); + // override $log.debug to display in Chrome + $delegate.debug = function () { + if ($logProvider.debugEnabled()) { + $delegate.info.apply($delegate, arguments); + } + }; + + return $delegate; +}]); \ No newline at end of file From 09dc418f5ee9f15a408586464ee5ae4a1a86a2c3 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 19 Jun 2018 06:23:21 +1200 Subject: [PATCH 062/166] Remove log statements. --- src/js/decorators/displayLogDebug.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/js/decorators/displayLogDebug.js b/src/js/decorators/displayLogDebug.js index d6ce33dc3..4eacf34b3 100644 --- a/src/js/decorators/displayLogDebug.js +++ b/src/js/decorators/displayLogDebug.js @@ -1,11 +1,9 @@ angular.module('copayApp') .config(['$provide', '$logProvider', function($provide, $logProvider) { - console.log('Config for profileService'); // expose a provider to reach debugEnabled in $log $provide.value('$logProvider', $logProvider); }]) .decorator('$log', ['$logProvider', '$delegate', function($logProvider, $delegate) { - console.log('Config for profileService'); // override $log.debug to display in Chrome $delegate.debug = function () { if ($logProvider.debugEnabled()) { From 032cd5b17490af1bae58aa170c37a16239b2aaea Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 19 Jun 2018 06:33:06 +1200 Subject: [PATCH 063/166] Removed erroneous closing tag. --- www/views/tab-home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 35f67c82d..6734836f7 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -46,7 +46,7 @@
- + Recent Transactions From 05d65c9dbd7287085a942ffe56a60afce9820caa Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 19 Jun 2018 13:16:58 +1200 Subject: [PATCH 064/166] Feature: Added start:chrome script. --- app-template/package-template.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app-template/package-template.json b/app-template/package-template.json index 6d1b43429..d679b0b24 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -85,6 +85,7 @@ "scripts": { "postinstall": "bower install", "start": "npm run build:www && ionic serve --nolivereload --nogulp -s --address 0.0.0.0", + "start:chrome": "npm run build:www && ionic serve --nolivereload --nogulp -s --address 0.0.0.0 --browser \"google chrome\"", "start:ios": "npm run build:www && npm run build:ios && npm run open:ios", "start:android": "npm run build:www && npm run build:android && npm run run:android", "start:windows": "npm run build:www && npm run build:windows", From fd312be7c74201c4b089fbedf4f8a9454fe5cb8d Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 19 Jun 2018 15:23:59 +0200 Subject: [PATCH 065/166] QR-code icons + class update + sass update --- src/sass/main.scss | 1 + src/sass/qr.scss | 20 ++++++++++++++++++++ www/img/icon-qr-bch.png | Bin 0 -> 38527 bytes www/img/icon-qr-btc.png | Bin 0 -> 51798 bytes www/views/tab-receive.html | 2 +- 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/sass/qr.scss create mode 100644 www/img/icon-qr-bch.png create mode 100644 www/img/icon-qr-btc.png diff --git a/src/sass/main.scss b/src/sass/main.scss index cb5e7118f..7b3e46291 100644 --- a/src/sass/main.scss +++ b/src/sass/main.scss @@ -5,6 +5,7 @@ @import "icons"; @import "buttons"; @import "forms"; +@import "qr"; @import "mixins/mixins"; @import "views/views"; @import "directives/directives"; diff --git a/src/sass/qr.scss b/src/sass/qr.scss new file mode 100644 index 000000000..97fb4e683 --- /dev/null +++ b/src/sass/qr.scss @@ -0,0 +1,20 @@ +qrcode { + &.qr-icon { + &::before { + content: ""; + background-size: 100% 100%; + display: block; + margin-left: calc(50% - 22px); + margin-top: 88px; + width: 44px; + height: 44px; + position: absolute; + } + &--bch::before { + background-image: url('../img/icon-qr-bch.png'); + } + &--btc::before { + background-image: url('../img/icon-qr-btc.png'); + } + } +} \ No newline at end of file diff --git a/www/img/icon-qr-bch.png b/www/img/icon-qr-bch.png new file mode 100644 index 0000000000000000000000000000000000000000..98d388074c8a99e7317bf4c2db5a4963be67fdbd GIT binary patch literal 38527 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%0ADk6WNBM#R;Y{)rW$SW#(8%sai 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 z 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≶}jaS^K-AzI*+1IESLb|R{RY?z=+`nU;6a@-{mY>^bThx2Rx3!U8e@i#CyQUKcDk1r~pydvDo->XqqP_`$Tg+l1Z3 z3$sMy;IFpfp4S_xiqA{gc>V|94p{i{?fRW{Y)Jtdfw!}V&zFhFXrA?g92Vvtqc)EW z+C!ecWn0zgr)K8NR#*D}TeYMDiB_LfJ+^I#(Kv3((nGYRa7TG*SLcaH%1gfYfsOR( zA<5}dV=X~#j)nhdDfg2Z)(>}(du+c)d%4pI?lLwX-U@##wGzP-?CG_35Wbb*B?!?%6bKdZ>J`3sCb8TOUdr)(LI195Q)1>h7vZ%+fXlbGW zbH$C9gCDs=df=e-;d^r^%cK7xBbMuo`aW}K)Iuuun0A{&8m0+*1p$JhgzM2I53Uy; z+95UqxadvmwXmc(x0WXgjltR+2XU!?VQ`9)gFIKAfu8rR)^J)x)=h1!C4&5{K6@7Z z!d3CWzucR_YGsVYXV6Cf?kTk4ScXEG9uoWy;ZCgF(44n9pfETs`GeGeP-V^53&Ezw z!g1im;vzy~_B4s>c?({vjLOAoJ2cbzp68?R#yaJ29(I<0xWwTGe60~ze*T9SHuS4O zk6^o@_r)8lVU^#>RN!Mav7LV3cqr# zD?ntm(ic%?vT#;zKJ*LqfMM{(bC0Ql#r*<_+20*Hb?!tbepyEojETz=L>ubXrew5m zs#`W;iZ6Gb1Gc84prSNz}he7JJu`uvm{DARs zcoyZh=GcJ8cNbGos%_Fgd$I8pFp{798l4)yZ}0;<65>FS%T=Az7Tp1~poskG)Rf&A zk)OSpTk^+=ku6<@G`!p4fL56J=5C?rySU*IUaZi6)7Xk*pJ=Fi2Jc51`0BjhZC^|L zwoiQ0Csu7NSe?}8y}fr8HuEt%D$=Ezd-hm%Tx>ogu^>tCR88T3?xaWie;rfXgvD(# zhORHh7L>7>lqlQiyxQ4OHLnHf<+b6K3frr@EM`c|-qd5j+zbx|&V`{o&Qa;?J!dTB%uzp9>~V4SR~#;7s;#DE`^O|Eh1_Mn zyP@G!_m=16iJXE6ue2=e#vLTHZCmmBy6(nY=d2qU@Mti02dv#_W}Uxuda9G5mB)T- zt~Xo(nfALrq7KJeq{q=k<4a#t8qc;H)5tTjUlyKJD zbtgxUrBQ2NBLYG2=J_AErCL$VrGw^LTn`#aHKg(bX=Es9f={mxw4LsI!`_gVgG5=# zX)rF)RKBypx9g9=Y>!}QxLXf5ZCg?`yYp&(%wkZCt!0ov`6qnIYX&^;#wYoc`i$Qc zy4sJ-tyeg4J0uivW1w(M@8Q;fZ;=A^=O-SdWOY$Jj(hH|SvF?BPbr4HN^8(|(-Nsd z<`#tUZU$!0Kq!gy79n>uCs$Z@2 zVZf6g^NK3~3*${Mw#2Li#5lNsJ#T`?9As9K2!$xL7tR14PCUmDzR_Z4OdAR_0Y7#~ zIXDUh57cgNN-7aZ*aT;|4pp`_TYS8Uaq>9ga6h0;e0)vtvyJ#x8Z8-huRWRr-d;h@ zK5ivMd(gZ2TRr|{){aLD)IwLPSw!6JTXfG++U*{ad#_&~&Hk8(j_pW-!9gb-yS<0z zkN8DTFUD~&320_Qvx+ z2aSNw+7g|7yi^`H4tqacO3u%x3LtI;Tb+vULA@-D~#KPg)Fz)dsxg)&AQ^J7j%rXsu}g`*RueZieE}hdm~;FJB|@R~|ka15aOLsyyc|eI$4=8XyQ{-(? zh7wBuqT_P)Ay5Nx|PYJN!rPq3xPTrT#F$jLgV7$vcX2cQx0pFT8)5jt3ZJAMyv;;pujc3O=`T5n$ z!~Uu@$rujgX3sUX-Zy=7)eCbLt5X%PhLwY7^k_Yz}j?WzipoNb64`pl5Vd@v3Q_lNo4?no5{1-%V@V9h}$Zwd2u$= z)Z}9pq&SQ)d&Br9`zib8kyX>GCh3MKAk%xXHcL1Z`K%4eCA+=dKre%nJpW^SIy5AU zp<0)#S0CS{D=*Y~hq>iT#qog+WbcN@j*r`bSdgMTDq4yRFvl2RFU0%m1CowIsQF8bk`1iy-fmKc8IOpsqAx zoseD9G>}5NnWqLn72oCdFzw! z>_~isoguGIk4Bv>r$G?pJ`kITwUZ46n{VJTqDl_BG(dNna+h=w6~daoZ-J5y>d7HQ zL%6eeSR?5sIrBJ`N``rFjY@JJDCNxGoxbpnvvyv4dG3x_D?YppwC$BTHOk7+NtpP9 z@UmWvNy@aw(jpCU`~Xs`)}BqJW50ld)$D0#&Ce}%U14noTNOM6B|)X|`iL`0GJH4^ z#Hs~BZrv;j@}1##7=i2Z)r4AUKK2{JT!zNc(&fsd@Tj=x`NI+WGd;Q|yaiJUoY)@f zuurD80`)j*4EqDdRvdV4Cxs-kQ5{bXf`9YUyjmz48Q{TT)AAwc&9)Yf3E z`wCYk(1`?Go7J==UKRT%k~K}*L9*Hi1G*AaFtoT zsnCv4#W8dqEv1RFk)V(2nl8+oW#WwrQzk_J{L$lY9&2mSPvz>5*!RKPqV<%=pShlO zE>_aZn6wj-aXI-UrA+ldEQWrb^`m8IiA4tf=(ltvhL^<;uvn2)y#Q8Df=JJOm`E#+ zKB4mO*Q2QOm+4X(9VsR@l9qq)V50-86pR^;-t&m)=gb#J<1N>Ga;w_XbrH;rX7B`O zzO8`96Evry)H<2tlbJhfxq>T8n{9OG0l3k!^{ZFolPzD&KIorO6;Wr|2;=JC5YnBN z6-=LKt>HHO;Vt_RAVNkL@r5&YyDM3SBd0Hy%(85JWJC-Fjv5V0VdG(ic@W?uJog6& zbW;C#D=8KuOMHW-b@h@r`zXmqgdYTPO*Q>-5C`{jL5(~*_Qe;$zn4jH16n= zepJI*HfK<`MX>VTX1yQv7R4-Xm7%Q6#XWni8#%fr&8bmI7~gc5lybeuovQLUo>Qo7 zNbL0>1#=a@XMDXojv6RE=`nU3-6zzx4i9b1i+A7TtkLdfJtGx~S$<|2IkRyi3&}Zy zCdDkU4KCxQ9+LaJ%FzI-PleQ3iuSfRhc@5@m+T=N)fz>WZ6~XdsZuWWRwuw}@VBrd zTPd+-GYVpHe6dxHF1PISN0o6F4X#65nhR+uE%(TJxj3eC0MneMt=oB>;qjqiM(_Bsm2H5BF?(6m)+MX z*=Ylb#fiWO#`M8^>M`zct@RJJ(CafI8I++v-=Eya02)93QzB;4U2$cKmvK-;o8=tr zB>%z{O{4BZ$fiGSnNToYCZN!JY3Qi`!C9%F6JLd8Na`U?2_S$pAXluEU^w`KYtK(Q zQl39U@CkNDn&LpKbY1$`%t2sU?@9 zW*W}=(9B6~HkN(K1@VaE=yF%OxTLfmu9(cK!w;4O`ehngTzlD7|Z6kbD zqKd$7CC&cii}6HbI?_0jXLxaJs#~P~`aYGhvN(M)42BXu_p3}}8j1wLZ5#${Y4Yby z34X$!dn=y!fTSMzZ}Tr#SWKy0qJPwO_ZZ{5ZtYn3K1x2B2`v=%p?{&8Qd3~c$8OdG z90;v82crB9Sp5Gy9GQLd@>g8AlXsK5m|Ihl{)zF|GXFH%heU_Im~*o6W+KYZvo9&# z4MKyPB(@N$4&_Y#UlWV$JmS}D?LJ>da}-X5ScYazU#04E*RI?@Fr`ce7)g%VZX8F` zF+!*CAGQbg9U}IcXn2U;Ff%b)((tfsi385GMbE`Ls5QEqF#89RKlK)q%Eq9Sef#}f zHti~QFAG!e<>{B2M=Oyfs$ma|P=&;@=3C+iqoGyd)y?}u{35w^xzXK=s4Ee((KX`SgJb0tUWk z7obv#ASKvO*T?%mbPcVf@(?99&Y?Ck6eQIOJ`Z@y~@QdJb? z&x!zeYHAAY*|V3HEnP(k2?=E3|LhYg%`YgV)~%XR$4(t7FE5Xtd+sT}!Qyj4Z@o26 zH00CIzNVPyXs@t@W=He4H{U#n5)%{Xg%?Kp1eezzzx(d{mL*G;(aDpiy=sU(_2j*5 z;ILtL(a4dHc?F;8k0wm`$b#;*cI`&LHbyo|{~H${M|a$DtLd(3s!?drS6@vDcw_Vp z1Lf|!?_PTP=|>I2YB=Moum0V#XyI@A`ht3$l$=CMm(Dc=uc1tB+Vrp_a90R*0@d!m zd$7lWB-#_8ZQF)Ng8(NeFm=jwdiUK)XrIgEwoz?bceljHg`PsT&|7HAcR$iQ?@V;r zFqhr$-k}d#_U$=fTV5F5<>chj)@`et!taz)lO|0L>jnY02?_D^`s@F2N-c**VN(6# zi|@jSCayu5KYuY{nz7H}K)&|vds<>+V(jyU?LAtwe*F@gcGyq~t&WMH1_9G(jXkw& zS{N?#5r8$9qG;Xv->hx1QflJFk1X+FFu|H@jLdDZp_a8#ixw{ps!S)r@z?JspL}I4 z%G#*o$4*)wM&bo}**ouOl7?s$7|q%tBe6vcGvH53N)XVCMqRvkG3=TW8y8J6vDS`c z2)_S)^0mkpi+^X#_?bM(c&K32szpuOQ%lnaGKZtVVBO= zS|4F0ux!PA>%IO$maTtge;vyz0VMISrv}-7Y=4giA+1}tMErX5PXg;ETr~*gq3pbZ z0=Gp&$pgL;l)|iB1ee>7=Cz3n>L|ZwQ9;&v}gZWij69?-W$2NaPczj z-Mh(})xxA-zI-K>DN}~pwQD1u<5`>m!5}U!mSV?`|G@IiH`A;I8o4-l@DRQF%HOS7 zSFc&j+8_-rwW^n;l#~S0cdIpP7jyU2-uLLykMi?u8@*@GMr&CoPoAP%Z@I^MkBhbI zext5k`r15mb|VQB3k;Y|g@uKzMLI7&t5UVRwLy4*2AN55@v+th<2(BX;h7#mxObhn zE!-Z_{aj~q{-#&2Yv{<)Z4NKHckk!$%+rJP^c+uFOuW}<#RG*Tnu%{+WX0$h6=SZv z?Cfk8rFr?7yLohMtodceiWRFwmq53`UxyC8tPreOz1Vtfd4jkCu{+-wN`mSiS5CGb>oBKfqqjX`R`;q#>#Vevp(WvUxs~M^vL%Fj*e0<@; zMFE(zuBiXURYexw+5v@s`Q=wphs=k@+cIworPsB^=!-n5Y z&ph+E*8R{tMpVQnGzg6l-47S{-*-2DA~ucSoe`O=-474Cbh*~zso%;E!|4~phh9x) zr4)c1I`pn^g4HlA_uf0iCa(>p@CKU#Q0YcavQ>`(ZW~JB!NZT-=VU(}Z^APTAK^F_ zI8X|pWB+H$cRz$@D|ArRs$GLs5#Kqq!Qp}YCj7Ovj@?ee?$G_@i>+H%x@@q_6RKZ~ zcEg6<>9Ts4jlvgq-Zhw_iZnDXO9=7{G-$+#d+3>GpKytEw~ZP-dSuj)A-7SX7fb%Y zv^7dJ$dl2C%huWh)uYFCmb~0t`^Q1Mhk9(-&^tZu%mW~|l+r`Ia^?Ieh$8NVfBhH! zxki0A{%Ig>-n2Z*sLhgLN=Xo*Qv34DDHIdqopF^c$H;F!Q|JEshYHEtNPd~ebfe^l z*w30g`3qLcC-U;yzx2!Jb=w2n7*D(-VX^=9x>2$q?Bs9Vx`VcEf$kjZ7w?J$TB=vC zO4nW2&+EoWn7o5Per@+VapGi4Zf+jE|G}qJxnen{pGHCZO7IjL374;=vsunV^10REtzpCO z^0{$dQwRC)p#~vF5 z%6#?p)F4vD3Y)_Pgl12c&2Af{@e3NG&HN5E1o;7=7|P2FciqqBvZ9#z!=o|49kBl` zZ>Ue2^s!5zoKgrp^W~S{g+(_*L+le;Gn|h@I9sYaZBS?4)vzxl-0lIOv+n26<(_zA zRMp{s4&u*D`rINu~B#5wSjO_ytRbvKJN6AR~t*urM3oU~F1 zqgrB-&7189;eKZ!^ehRbl|qf1bhK0`mnxq})GrjKYu7FoZ4nfLcBg!VHU^l-8Vo%Q z*P=lMtU|Jq3Qr?2Em^W$KrPzQzC$mIv_y=+wg`|x9&Bq03gMJyxFwjlnMt4wx?L=! z>91Lu_LTHyGtTl37;p<+xvW`-c*-lk@7?=)%FZg*r4PKJFa7Orf3~sJL*Bae+Eewa z<>Y5Bf1%-xjrG&vtOW~Z(U>vg=*J&syR6XhMKR~PL&D)hn#riWZIXR?hYlX5==0|_ zD@gm7?(P>aUPAIuZ+-dFOV5eVr1__P8T!0c^F&9~m~ z*?XL7*RDv(NlDgct}d`06MOX730Lo3K9{zw$gp?cdTTzMo;I8Gjp@^8kWFJyR+GlH z3>O&}!&bV< z(N(JWheERSYp?AoFAe?jL1k;c8*aFs)@|Hxy~o9^w+*6x{d(Cvb9Hm`&DT+EK5ucD zO?o3*`=R)aH$S7!9U2%eGJ&^SU{0Nwm?*xn6dVzXekkAMUnG1C|cRPSClP)0_kycJF_aHB69=Px`Zn3f7IG-B$xdX4jAKByFb zO`3KhXX`1F2_VbV)NSt!svb7j+P^f@SHhcHJ&f$E9{ySVt;Z!u}Z-0B! z^2?lG?ej#`J-Y64Hc1de5=N&;PebmyT{OWu@VDdB&qmG!g=fQy6(!b519k$Dn(n#x z4lC$Z3gJoTPS-MTnHPnurG?-^4hFJnD~0d?dz_J$uy3SKHWb2(o;?Rza(JSPgaos= z4I7r)w84f#XvA%|-4qd>4qXk#g7(R#b@FBL-jI9}e!s4E^BgDy(6OZs$423r2HkkQ z%dJVL6p{_mHjBf{-AIRy?dZb~$GL>tDTQQ%V83=B&riIjl#fFC+ke2dZW{yO3_%*| zop1~QMtys^rH~{C_A;@j>FEr(%B*uElP@85XiZA%$; zp9;jlok2`2TqH!ZawVPrGT00)m(Oq%P$3^2#-1zm7qOftg;@d4E#O}wKVS3If!>qJ zTH2Ri9u*Po4=W&HJPgkta2>XB<0e|Uas!nwU&eZvSu+gt56F6U&MU~Lnl-A?HP>_( zL{ zW28_KE@(Ibm*9Zy+`04V?3wdCF@=jTFYs^hpC}$u3u(k~UNST0ytT)(rN)TrTi zg87X|;&8#Qe7N9jFb@~_71w?#3+nUocaUKy#Ab?FQQk0-;PnKi6SHUkQp7oiKlQFfCG;y0Dn2fO?&5RUMn!l-m@XdL zV${6jx6Ttq!v$A)jy~d%NKglV{q+i<4}Gog$4s4)V6Iqg|8Yt1Xd!A8~1@_;i9GD9WtvF8VmsU z|NG=in_^ z6S{Kc3Ilb7X3ktgojTVi_yM<1I4E`V%>#vrgZ(@2?xWbx_yUjXzl6ki4)=12{`Jq7 zg_ta(g5gXDyuH2o<{0|>KR)8~AWb}$WfV>@%JSu_t@gNrar|jG8)$F=uP#AU4j)Q`>zi*B(js=ZfWfGjVw2H~0nI7>(|}`+myFEdqis3FN$DeULjDq1h9|+vOeOqzDHZduXKCNv#(!TwtM8F86fs*W70Jv+`tikbE z=TYseYTCaxeZO+mT6+8K3EBzyeftlXF2L*u2s!e?^RGMoY}@uDYzLbW*izGd@v5i0|6sPlM^@&|!XHd0EF1r^7E z;(#CLFHxWaF!t!t&1LKvXY&_!Gkf*Ao`nb@;Al_>;NKlPkFo1k=f@d)_a12D3&UOY zAdtTkd}qKAG#c}JxpHOwUA{wkAcU(whs^w7`t(_BKIQCV zOr64qcbIdYdv2snk*M2Jct)&$R<2x4Pd@QHC8s8fIRX*I)@?jYSsA-+gpOZ+nNNTJ z+nYA!cyoi19`iV?jD*Gk)B>X7;sUol4rBN=tDSp$aMuW&mIx$)WZhG~n@%%+{K;ty zRS*mCZ`-~`W_S5JXwY@6ak-AYQ@CDoxcpf60?UfBe2xf75D9K$-+%wVYy}j!v0qoe z$4ji-VV>N%%e536Z9WX7#|m6z$YBW$?mocrIMDdiQ;)jH>H2ZQh8XqU8P==LAxKTzYz(QyfxXAuQt<6l1{dI`F zL0F!I787AwJMdnE53|84Sf6Z&gcmS{?bfZ6B9tCWLAuW6$OZ!j^mRA^?LeegUU@F6 zZrwW6vPDxxs2~vs$LX?IyYcWNBb-_b+003Ln6N8|-N6kTHrq~I`b_HDFBr(><ohNl_x?0Ls-_p z6u_CSx2NyDB9bih?YAdd5)!Np1NH0pl3Q7g+M!@>0cJAP&?y zci(-7%X3B&M`nNhP9!}5AlUZp2wJ?eL=p^yfoJjuIY=ecX}&nL)8ozlI-o?-SBA9~ z7RETa4$GvVRjdcX$7?|p-sifeM^|dpsDaq?au>qU$Lg$~hYVLB8aDU7;n0pqR)_vp z&_a6wf*_@*XVUGr|B0$qt16-~y!2A=edL9VNE!-?|HZ+nRCYQDXM%7&`P<^vRFQW$ zK|F0LmS`*f#vfNG6%#!SWg0fF&laOSMX~S*8K~jQEZkv3BzJ&I0)q2EMEspQca8&u zU!gOn&(f(=XXxU^%fiiOCi@A+Zfp|Ukf)@iQ1$B7_^%4v7M7!`RVoXQlLb8N!n>ru zeE+zE-5>8Ff=EUi3gdR1_r+;$qmC?$mL1A`5kn*p09p=k6RdY|P6$zh($dp~Kh*+u z(TT&sg4<$a2u7a?35k@NnktBf;j57UV7rBD5YvomMiI#g1|YuUF^GXPKY#qOhc<57 zK^57U5jN7o1lP%Tt{!3DL4xa@8tk&Ob(@yds9{54dj`1&*NM2b_Zi<5yozjYzc+h*iL6mO6K8OD$S77ZPHy7P|o_63mw& z_I}28=I~Dt@CrS#hL7(Bv6!<4558H1R|v*>EMPd(_LyR6(c-0a;@Bxh4VqVS5?TX4 z4v#!?pICpnv-a_|)d3+ABsK^Fi2IH;h(ASVUmNVt??EUauv?GL)UZK=fN44WP9zL( z@IP>X4}JN)aDQUhk7a>ah$8dE6AuX~@WmI+g|G4iir?@Edk6R@nmqYaR&FMhSnhF! zP>rji2w_v9CGqE6ZHekP;u;D;O@KF|2LoT zcap{MBd+eEAA3TC_xQkXzJhFF`0?DvCMVTSA#45<oFunzj>o2jhe!Dy?J84Q3>J9qxh1~Zok?o`cu zYnVu2)&FrYD8$57wWN}f0`#2yK+CR_^sbLY($&M*{#TqD!-8(_~u zpMCa?Fca{cU(4Z8OR1QI3(zY6mATv;T zz)#T9;KUyca6HxHmPi=pV1ob~Hfa*&sX+DK7zRM7@4oxq!TX7`uiX*}A7o}^DM7&* z=KSys%b67`Ruk5q?uv6sBuI1Ec2FsB7yvgNJaCvjl(}~o=afie$G&HQJdb@Ll>&gxh0dKjA8twnu}baD{#-jO$!z*=5^B~hk?(ANSM4} zVX9K_F#v8lb@GhxMQdNX4Ur(Xmjo+Q`$k5}J-F%g=`#-CT8Z?Z|BM&g;mD{`=rAyA z)?Au2>0=urSc#OBlt{CG`c(-Gp`(w$J;L$eAe}y0i3EebvV25erO;vk=Gi#us83cR zojrSw2Rd5{>NBeA;9+3l!X-A_7=lO$r9F3^`8X261H1Ip1SwCRdX%jeL_+Y2JdPEF z3@W+C0Ag4mj$dpXZ{4^JQRli0qi+xvLMCyA2iP<6M;dfve{tN!XjwSwfBg7ynmKD3 zHEdYbWq7!OH}n;@0Y=O9ln)_NPaJm?ckRDBci}SKIH(W(^Phhc;jXbvLBgVc{rXMx z*T4RYvU%s)d8`ck(v069I&@elUEyg`5GgG!&G^@Daw71?pa1-dSIGRBrA{CKe#oDF zb~Gy;Z36#s8f z+*79t-J1x;=(11~FShU4EnM#4ljw2d-e+sn6DB?nOjg-LJMsbIl`9v~k)vk=Q;~sE zpL+TcK74S>C4uxsNVxC1>ki()TOi^P`YM2dR}UVg&OYYOo6g~^?=|z8P2P3u7IUQO2Yr^5%d)#2X;%`BxhOk3v{4{!TB*Ak zHtbH_U0^RE2+aCv8da?5Je;Y~+QC^5J~+bTZmW^s8GLUjn(11@4P`3DwKB#3tsHlv6GIl=N7nV z>)N#o@42y4;37dnehA&$;K4(^4%Q{h!H|i04=EOvh+wnwZGe9N{O5l<2m`1J!p7&H zPj(t~5$}OaL`Lq~wJ&a+ruW}}n>uuGBzCiAoj4Xm8K>Xqqd)K6dy2Yu@9I1scd$v5 zKB6CfnB@?6HYX>GR;*koJb~fkb?esC$fsX&T8=jlGua~xQY;)G*>whQ%JcdggokU| zw6TM}N*0LoJxF?_%6FcA3oV{QYGar?e}1O}M~FI^K+&;vsdI;hPOC~tNTR-d|HQG+ z$J1&)%>Bie-|>j#zcC56c}PNh@L#b`+v4%zuwf55%>$diK!?@dzWu0E0s){0A9&m) zfh52n%HxlZ62$Q*flxj?$RLT~PBXy|tlsX-nM;(DZ5xmgTlG&qbw96*o)o~?|MSm( zjPd(iWM9WqPu}H{NW1@V3{GtSJ?{NY99c)9rGQUhd}z@GarrbrznJ&-?AhS7bo+@{ zW{Qew$i29Zybajz|NZS%r)5u@_PyUDUOKJF&BH>T3g8{gKe`|{70Fj1hOkJVaX5bBd_eIBa*C`I8k4${Z?%tpgNF3&*}O~pU>NCi1k>Ywr}6op@`2vpFmGM{+z?} zU_O8+W~69rFa?892M!#dy?^X?_?!IE=N$XtI+`)Vxkmc_`-cS-FMs~?Kb)4|u3a0k zcjWYCkRFyP3Q*6kf-UTJ*>+nXNHEw`^Tgw?*xbvTM;>`VXeH#mzke@Xy6m(_2szWI zf9sU{?LWXKAT|U2nIP6n=81;ON`wUnbvk|Kcb6bI8wy=!Hu(Y?k6E*RcKTJ-s#REb zIEf$yx=MJ5trcujfLQ)Y(1ghOQb>30+qZHuTllLwt(=%BcJ0a1iv1tnuG@HkdyQ*u zmcaTKqT6d*m~}|6=G^wqm}^awS_k%W&k#F?OTL0YIF+^wTr!0>{TUW;M(n zm)ZwQp)K+OGumaJjvU@bNr_FUb?aL8uT0&SEnCKFkRtfALIvOUP)ybCB(t-|A{!7< zw|?45xlSX=70mcHD|?R!w_v0kXL$fYhmLJn+n{liAQB>kg=3mF z?MK!;Gzc1KzyH3M+IP6t=lYtr=)`+Y$v&0SxN&1^>!&cc z?$M(^I~ch{8#XQxrd(*3{SYUg?cKYN@i&ypr257^fC!9okprCQ>$2kEgAe}4;j+Ir zj2Kr<%;lIy+#XX2Ix2DGhNUKN_K&bJh$xlz35F%UCWyj$9Bb()TQA*u%K&QIwx#g6 z_4CgQ=K&uyc|#zS z4VZm}+ZBvZ9r5-x)vsHPL$PiXe==_cj^*UdjY2oVg|2X9HT$94N~9NF7#ZbE(I`Jxzk$a9&wA9mS9cK=O<$XpNO*`L z@5&X;_(7jZT?YpP5TLHUx`kErmbKat3DVV&A-AX@Phuy?zf#Jzuhxc0qenjz1*M`& z!N&lkx_j=q!>Lz(8zKR;oSa;aX%~2fYw*z!&NW7{3Mj{BZKQ|Rfk+62cJP}@ST|G`UHtnB8?tBGOA4*9`c0h zz@+*h2#qR9RRFsWJTR2G=yB`f)xLdBiG)lz4l`)bb<9mJzqKz*-J8UK?Edofgsab8 z66vLvo{g$pxf12(*qR2rDo8yyive{1D4vV%bvYNw5?vAr84ykD;YUXBmEtCeFn|4m zL_MzQB0L&Ng31B1#hPlTcf532*GLJ+;r5N@edI-awO1@$M9sTB8ZV<~Hqh%Q)5()z+-Ft87 zPZ}6)SUBbbff_eyK;_DnV?+F>JPvcR4TgyX>;4$trR>%F8a3=m?3wrlfgmY&?cB+u zG-qF|VItu}1Q4uS_bPTTQ%@1f9+PhFH3H?*Lk|!4Dz={~A^{Hgy1_~9{y2$irO>$AHg7LSgVHe&p~GTC#LysV5W&gl+Jl_YUz&NYE2UUi*beC=4708;NOCXRts~ zI(6qDP@6Va^NEV9y%rKAVf4R#BN7UI`|Syq#Kc6J{LyFZ2FbdLg z!6Fa~Bw&BG!>@%&z$U!+p=IZ;-L!erc7B8=l-z{YVUddYCp$ZvV9ew1*806b2_Oi? z-el>s&%f5}yyc4$@+-UEjW=E|eB@zS5~!vHtY8T+=BlGdkI`?xEf>}>0k2S29MIn= zN-2{}gKxh@C`!%f;k*GWC^$p7nRq_oFn|7U9NFY_1Pc~X>|?c%eNxy*17PMJT}tDVdpA(++BF3{qeeXuY;Yus#BWF|*FypU1NRvj8MJ@{YQR&8^!gtt zAoYaF;Go9?2K1r^4H^ipfx#m7(DX2d>N+fduy6eM@gG>wqv5<9-h_#0DO_dtDWU|LuZB01Nc3_-c1r~J(7|WsZyo#B9s8^2jNZ{{wiSo zq*>;YIIQ*BYcGU74#FNlXGD|FFsFfNa7!)RW=jtxJjWH{k58rNG1tIC6sFViyGZ+u zSimC<(Qm%_t_7#;V`4bM4tE+1yKWPAGMgl_d-#Swz(|6>d>+oxfg`zd+O$8+Z#+{b z%o`9&@Wze%Kv&3B|3ZV0wHSo*>jf& z4%(oI5u-Ja*bru=j}0i*k)(%M&4-!hdK2}C(Y!$Of`<*@9M7$?7Ik4ZfV>n5Q*$V3?Wu0XNFFfs&O4JVkVX(XL<;|y zQPBBLoIFYAcwunhz!5sh@@3hwDZ-O1+;3=I-m!332$zcn$1jXM(SL6@mstw{bHcw1 z;Da2Tn^(ZA!rD}?ULDrsSEQOXYgn00GIT~pCcW~C=9k4WGoF2#*BGS z=%~Oj=t%fOI52ql-TnK19`O?hK6#umN~9vvp6S4BNMIoNf@{&T30uN85R3+q5jerj zmdQa36@wLXMWoWdxCLHbAB1Pc{3|xp@DEM0nY^y+gKj}FEx!u08lKxkzn<^apOkX$xMR* zIF`fa=|!)1pe%%GADHTOlUOVj(`_*tNVb$-gDGk+7(c?%v_(U@03x zA3k)Pl2a0RrYY_UB^Cie?zIx55Dj5ufYhNw8*162xlqL59y3-+)gqRdexzp{Xr)$i z1jIi$a!EW}yvW(6#55MYG6E8q3yhUtSRgc#ef#yI+O=v~6&g_51lyV?P-u(jz6Ehj z+mngr9oqBs(@*nwG~}4IMSC<6-MBzeJVfQ{XRQ2!e5zBY7WMAki&g(3;E>oU4;Nb! zZ%`C*eNE3ihYufR`^rT^H7y$-aSf7ym$F~USkM5%nhz$8NlA%fwt|6Hq=|qL(eK`Q zXQEi|Kx=gB)G3-ZbFPMTVX`Ik1*NPTmaOJVrb4UWeq_*~0m3Rn?qx-S_!riUgaf!3 zv7jvY@yA&<`!`_?c**MLL2Hekp$d4N+qzW?>e#V86~gR^Wp*QO%z_52T}5HnA92l4Y}l}owrt&L4GDwrsFF-zKr$6(skZEO0kLkdSq?80fjB#E0yJyZkoQq3zFoL* zk!DQ)i4Yi0sjIE@Q5QN4NQS~JmC6RWx8Ht~U?`l83AM&AWQ-&k=;+a7;ut!tppilb zkd9#LGW;tB?BElae{uGw@6q^1Gu0A;tC_` zdBk8qKSSlSsCWN}y9Ml69t3-a3R?fwTnj~s^T^mZRWne;^w)?0RL)R1CNgZ;T}As* z!CONGoRMI<17lIxS$+N06pByKLN^7x;)o!>0@B|YkPKD3PEG22ZEwL)Fd2h$bbr^S zFE3z)OLr#NM4dWyI_2qCbR zv*W=P!e9}URZLXs`*%KN;D=(=D9@ot zJ)y!UMuLYOxQfon$)Rt)nI`sxd@9frwCcUWfFCfRiF!n-Wy{cQx8B5>J=W^^7zx4a zem{2Xdls1Uz{}2(r7KEg*a<(-OcfEP7?8{amt^nh$9^8iNZk0FaU;vS<#>y22izXRYgoCvnO;-@c@(xV4~Tx=g{TLSD1;^25ZQu zuPXK<1~l~;n5kdiUhGfeDsh<9j4Lt2j07fvmBJ4{&ZLaAOeN0wk&LRS@W23OCTQ`l zxuz>MYSd7;rGDw9QHFTLPzZX6bMQv`%P(^&lU>;=^>%m=UP0ks41i;BGJDywHH6a% zSTl_sJ3%g`+*an1k)T+BIJacUa*m>aHIWkM++tL{jA#sind0JN=$D@tZ~(4Le9$zW zR9G2~vQY^T`qMc^jx-FM%2%1jQ7gkW1h(UGG^dBgRB;L4JZGSxzb0p}P1GhtGh{nM}F zH$Gkq4P>9&fsqo6;-Su*F_)Q0C4~Wn0brn9*;HD;ZiCPjAX2+MR%{qai!oENDh%g)Bgta)9OKmvb@4)dv1-8~$?uOIJxvD= z9;e0)Yf<%Tl|&%2f_yE?pR=;VzRxAiQILD41r@3t5{>dlb(3#WcsYXpEc%ElsA3S`Pjvw1>b$l6gzztOR_S@q{ zP_}G#3gS(|0wFOmo|doJM9+-8k3F5o>$QPXX(xprE z@yDOgM<0Dll`EGKdpC$4A8rY2rG5MMQOlMs=*>6ZwY>W3^P+Xd13fqD!i5Wz%A*HT zQQO0!9WW%cCqkeBt6jSmJ@Uwdw0iYI9zD0v%9V@gp@)al$T*o+dP z05sg{)Q_5vKKdXXIlP5O&G8-?D%{%P2#>L$GL}2cx{ZfBp!r|F9UudiUurf;@wnLzN`P;^JfI#EDZjU#vU%K0<;C zgT5|MJ1#Dc&YnFh9>4Y0y8@A7jTFs{l%Ae0EM4^ecm0LebL#IF|Qj@s01Yv$LsNx9h2FYN81JqlY=z z*KmQnYu6rX-MSUSk|?T=o$%gA;#@>VMuu461sf=T)(3>ITD6+~^4EW|VxYid(HR-p zjF4k={qsDt6o8x@sGRjM`MgO+)Eu-sqs_}R316?WbkX8i`t)1+|~>%GwnXeeQ2Y$i2s(v+%HE^nxr*bF?gk=rBipFEvi&4C)D4pN}$f2`iOkcbmr$3YX{@w;>EiK^Oq9- z5?E!veB~8D@VMb>LnrAm3ax@B$aKqcRY`nOCa^c{8pY3H;F!3wMqq3^ay6=II(AzNs^JQ%7!d< z_(eNA^B@1PCLSD1-nSR(nyKmKZ6!+5F* zgYV|eTUm7L!ZTu7o^kR$ed6)Gn8iBOqYZ3^6U_t(_kjtM4@6a&ct+ALGqSQMHX3qs z(F2(yf_~9BYz)quH_H&zuX(KwW{TX9h@1!mM`ZcHl>z{H2%Og zK{OkA^I}ferivK}vr%GFBBitCcX$~GnIUgr^Fl2=bLLdwjSd|;%zH-zsY%nCe$ki} zLmu2g45n*Ag2J%Xqd4RJRu@oZq8U7eg?%Xr*uzK|>5xhF`9dW>crw%1& zZ){YaJ-3@a|9mnlDNZxq{KWvlRrgp}B>Cg_Q*7;SPFe8&`;!TKPNg~Jv4SNjNwZ4@ z9%3Qep##;bQG@pUv0tbiBNaht$I6wf>9tq>M!5xMI!6?bF2tL;%W3}nc{E@^UqdK> zH_kI>c2V;dUHRBRvZ)PNLlp!eQ=2wd@nZQs`tzS(HeB12Pd-XdJ@qWBt-Bijrle)e z=9tK3cn?vgXheHP2Q0_dw}t#$5>kPMt;Jb}H~xoB!$R&DJ?PJ`|I_ebB4_jM+g8xp zwZBCq>R^%a#vA|RIICG6XJmZ?EtV|0e1*46igxz(?@GgU89wAElv+hRBleMCu$q#R zLIr-<4=4#ptX{o2?b)->P*cE6P@g~X#4`~q?zCxJhkExOBnA*q;;kMjyLYdq_r||P z2M?dtKlbVx77n-GHi*`)`%T1p4Oh_-Qw>z#&6_t7>hJ8FT+v>uvH{#xsY)eEyOJg( z{@_aMUg6&FA3+_Qo0m%;eDD@EY0}74`8b;bri#RbwNflT z6U>UjDZ#9+R;`)>PcmXf5hG~^h26V#qF;Yq98NHsh6Ro->o=(HL`(tU>_yioO62_A zxZT)GY1*`j>65J(!O@|XELlr2v60D0Kr%Xhd;$)uHD*KJ#ZrOs2dYN(Dftj@>4Y;l!$8W7K)b0|0)(>?TPdxDm&-9PbwrxAu znD-X8#j6|Ab*St;7cQpJRaey(M~@`9R?5REB;vz-`sp{UjY#0hEA&YoHDA7bzSwy; zGD?O5>bKr{n~$Y0pzJJdn)e0{Qv2&&2 z*-8I>Ag;l1Fplljb08%qCy4cLAnI{fCKw5OZw(sMqwd|iilZGbzWA(Q6|qLb#|6Aj zf_Mkn4@q*LxKaPO#K2>ZjpXAGzA=%@!b9`|hNLMe@jQcEOV2&8Y4gmiodN+i1{cgs zd-w6l)DU*g99|POY0_8>Fp`PTUMnLZZYGot?b@~Go%>>Ayg(o&lFO7G>f3Lp@>!Z* zY`nQ$9NUQGHo1bGmjbkU<$4ahHGpbVZ^ArDhc_9%ok1I5H}Zy26)M z2Hr-A2q;fI^*o0Y+RN^|Sewi$dd;BP)z^W4j!7_|_a-}aYA=|`K47yABjF{Y^IdaI zH~RXkX(C2U;6Zd*PSK+$;h)aAus(qafJrgG3(0uLKv5Piu+9pOIhfMaRsC$J09R{Grcfqn{C$4sh&{ zRpdZ0$b+5)Mg2x724GPFaZFg2NU?(30;UmvEEYpFjua+>rmiOkXhs;!bY>`L$$^oO z>6vF9k1Ak!aLApv2HAF5{x10@{;m_Q)ZCG%!`n>MXPbERih`?fn}BxHj7qw?j; zQI8&-h3;Ir%pQ4k1gilv)$F9lpt>$G7yuJNLsz3_HDODKlfy5*_>9|`NH*S3 zCYgES#L3K07MeWyGvV;T)W@^ZiDS4;%Zz3%_8$-~SvZ{7krcka9ho9=aC zAwr_6wsd0vOa$xln{K+EDplgpro1M4{&{mVk;I@+egBoQQ-W>NT~4Lci-pPDTYp;KEpl?77Eh}JojrQC{QJZ0TUPy zBRuEN<(RmLOpoNtdPo#t_fJ6j_{51&L`2hf-~GT^J@zfFw0d@ESGU2yfMg)dLf7yy zh=vUtcr-rs7OsFW5`Y;u?tKg54_&!(g?{*9metKwz$)|>1M0gHi2*PX_BfN06KTkh z+r(N3K1uu~%Go0=;Qd;zop9oIE5EYdEJZ{_vJUb!8VhqjZAiEdOUsB?pH`G$!xWxdN2)-Ey^zTEpYu6Ha{h^U_ zTWQhDpfHjI!LPR7il4K&jt|!+>NUxX8Nt>J|e2U^9?JT1fk@WGIMy zKmR`VBh_$o>JVg#IkT)vH%Wz!)k9k_ZZm{t8ngxJ$-akjenX>Xv1X`Wn^a3t+(DtHEL8B8>v}rdM4u$`BXsw zJ`VdnDUWMlcN*atXU?1>loJvcVc!4=sQPt_0Xh3Xeci6@)f~*Bt(bk_tu;`asBQr= z`7)yVp>}K|POPOaUAjWkr_UC9Q?ktw)ffqMDgKp$dOnM54LLYm&z{|2RmvhqlyFiS zNvMg~z9$W25e)(ElIF~rN9p{Fs0GTlFFd=ToOPfy$mQrB9XhmP52md(V8K9~-~vv2 z5Ly35B+&LKmUewOv5Up%maW@q^Oo%t$LlLF6;g?4sC~mD;2ziqP#m9I8#u5Z z#~7*-aNDXsZo{`f$L($GY*^Tu;vxPCpvUs zUkELlQB;wlC@(M1>*L&kgWUI$OC%%NqXjb-PVpk;=H}9xH5)i^@IH!*k7Z(Wpsb=< z3-3z>LeNm35-V7HuQ6byrlyF9kBA5_1CPOnygo#vPt}I;$EC90j2%0{f;czO z1fmllxEHL`_w7GSWmA)xT-dRaVobn+Vl=OB@`Sk7qD5n|#z{=%y*|bzm?twc zi(Y=2{l=HFRO%Y+jK1T?f582~!cH)FO~t?3IjS_;yLTTucG*XlFI}e8GASaSPcef5 zb$a_ibhpSwr=D4WBQOjM{mq<*002M$Nkl_UE76YCyk9?Y}>ZeIB9Gfjcwa*Y_v&Z+l?CAw))NUuJ!#tYu1@FXK?R(@9PwH zA>i=A*7ki?SoQmm=r*mk^9_oRnbF{|<6Q#X!N~wEsFXY&=VYZ^9!1NUZ^cjsDWp`4 z7DD?&vEidTY*;fMw^3(?aZW?~;@Yw-Y%QkV=Q&`u*n~QjYOQPqQiOl`fprTM?%GIHU6P zg8C^DISJQ6J5at?p&Y1+q20XyF9S-pv10HlWHNp!LslVpNCo8(BMbIp^EI*svAwaO z49hGg0%CrcMDQ`rz!rRC0^^PjQfyot262{(mai|wzadvm#leB|GMs-Be(y+!JQa5j z%hL26^2N_PTBHlG6o6TVKfSaRYA&l)32_RWuYH(dMLMVn+`w+0osFlrSCY^3u@jCX zF)2&&2A<(ZME&Vn{y@7Rox&K(@&Bx9t@th znSf!}M6ep=-5PR1KF}xA&E|X<;?c_$S#`hiTw@9Kb8l8ya@LqhmTD<@)U|HLcZ?_~IUlWnXPWc%6sKIUEY{r5aLVqoZ;` zlK=iE8B(i z6CeEi4;fOFCK|Xf=>9a#8trt!xTO*sjcPSO?y5v`WHA*CgGxesSu{vOM#$TI7LzWA zP7jUv_xbd@b4PcQM+L_0wsI2ax3e!07H$3Gk%?l6Hm2|#X4#2QkE^|Z#7-Gkly--Y9iQj^((LS_Za~nq?HNwO~W{kf* z5*d9h6m5Mr|PxI-!SWeOI7>^B7@xCpKh4tzjZa}C#bTqsb11;s^6hhm{Qzc*XNRk|LfWG_+O*Yyao)U{! zR*3yc2PemY4zUt-jz`B%pHkORh5c~q9*3J7okbg-Mf*$X6mrEbqFCPSUtcyXL9q;I z|MLU(rQ-Q}k$eAe`T99SQk*Bqd7I=o3%*&Isz9SkwVCc4&~Bq=7Ztr(cU4Z8NzJH` z+UZOMKs$c}Os$v3hJ;-SYTjlU8ZiBQ&W{DFz?Jxo|fl z{H=IY#RR{^v)Uc7vFkP%p%LgE!lw{S3Q+zi+8JVJDoUCRb;m$5JX@?BWBZvd8OADPt0z$S&z6He-ZtM`r9D)tT}gFEY8s6AaUl3N}JzXbtPjiAGRzarRZeL ziV&40@myM_n(b08hSF`C_{g;x)0l#G2^sMjGUVG=z$XzJ3438h@qFkJwi;;%hW7O@8 zWkgnjn}8IEiG+dM{v$li0?LASn>0&%et@hmdwn>?svJPnCi+xgN#UshmrybPl_$m* z@Ch-M`I+JoUT*aXZ@Ue>cuGZ;yre z-Eal$Bz67N7{po#f1#S1n=JEl%cHrq%1JFGLh@g#>Xp;dQG)Q}Y?FEQ5DXy;Ha3{9 zY&nxy5crskH}s3!)3=bJZ3Lcv$sN>NA>A60$fC4r&4sJqPmL+4gz}n56p4kOXt;^7 zsbeFvj=wLYcDTQUT#hCc372E4Q3WFqI5_R-z%Ie^IMaQV0Z$RB*lOqx)TcgZ3O3#@ z{8W$m<`V`<9#&Hi)J9Mig(+STBG`h5M`fz!0T^`)=mVt0hDN52td%S~NsS z?kORS@jowrlY}x`9nese`hmpgmvc+E1=NnFFILY~T<79dCZ*O8gk-E1*=JiS7qWs{ zK$;ao$LoZpT-7!ZVc_;>kaB>Fl&dLYO;|#5#S%$9u5KI|A43+VAFuGr8-tUZS<9|C z*c%hFoh;$|B|IbxTCj=D!|6k(V3U^F7cO$>u&8|@RH-{U&AC}kP7D=e6G zQ;{66UYTmm+A>I36d*3qXI2`>J~tRe0?)~1Q3$AQUt!+d(>392U|hBY7xheWXJ3=J z$QcbfbAghN9Cyqn#JUEz-W57G3REK+)nGh8wd1UAv(p)_?N`CF4F##f4l>?yeynLf z4;7C4ZGhRA7MODG?}w>El^k&bn5X6cwp}$r)LDS&=@!FCSV3=Cc1-2I+~0EJCE=7A zsNc2Y#8tsf$#@}hd0o@f>$SyM8Kz0c!udpsiD{6Y!6AdZNI-DhG{5}!8#$T-|}Ph zktbmL3q}7>$Rmw+h4dN{2_h?^TgHQ-AkPzWPj7SBh(ADsmNPx_q=JAn#?EFx((*7L zDk6x%_MOJB$_H}d_>hS^Tn_8~aq$16N7(m}oJRPyf!*P~g{7pYT2`F&k(E10*8jW}s`aZ0rYWHSn-tAVPu1fOc$* z!*zH@Yz`zS^HMF>!-A&1dUMkl?Cfv$Q}a3^j)GvD*+_#I0dms_>;rWIfroFk$vj8f zVe|sWalHB8Ftb7_7QSQ*4zsaFo5ixO=Fb?AP0A*I93ew|OKflh8Uc$t>=?2y=$|{KxJO@l)$tG@ zKSu(&ZhASaE?$wdwW&+!UsbY{6(|nI0kl@-D3TDWs2@Hd()LPdZj#5J+g?o$xLo^Ev<@4gFdA~3loyPed^64M$qG7OC#=(xScBRqJS}JT_u8*Ub z7^1P_13+cbKOP!l!lj0Ud0JO^`h*3!lKt|qEGbqMd=R&479CYOG7sdERORHNS3A`G z!-5(H!7NG`gx)*=!ScK>n@fdrQsUpsj8~CDuk4=`Y9*X0F#~#ze)KGaiunj|T3KT* z-8Q?j%(zM7ZT3kCTG}y_n^uzpn=?`VR(v|YygG_D?YcM@7ZYvNq)ZdVes8J)bGIV>i9!Y#-X6ezegoz<{xN!2M1M&bGsAT*478DY!{hS#h< zIuuQ~f=58)W8@gdrdZUP-1ckzZ(_scJmhKB0tk>hq2TRY9lpF%r;>k0yOX4;#K;#G z*sZoUA#Dt4a%t*};BjFJ^8mg@NM_vb3gPHimkEhv#DISvo^p&Sr>vn)GrG(aR1HGzKIC& zS(GV%N7vgUJneby&*64;&);Tbh1>mMF`ez-Wh-0Be+tu#0@fZbYYAz|yR7z&HM@PO zjf>Q%{kbdPuUt2Q-wQhCRmK=3#tQngL9LX#+l$2OfQ6)#1xM_={ne*dh2~f85E-T* zf?XJpxuwa;mW!;1hK9U{n(lTRml%bEr4Y!8D%F(0CtmC+LxgPF8u%$Nxmif!x>P4ix*QDIiKrF$T0uLO*3`oV^!GtrLC`7ee?4afgc z=$XmmACV^JFmx#+3aa`jBY@150L>E#e$TyK6(lU>crzQ2aGvCu9VdN<5>l5n7BLnX z5NU5RKR#|O5i3p66G7+ZQox*IA~kmNd_?;FMeV;sdZWQ7MWj(ku+ldkU!mzS#tIv> z>hz0B%`RAyb-(C1S1`%3!t}y6l>Pnvl!$tSj&4Vuq?bj*&8_UT3Q+r2q#GZcX{GXP zI{E_{VQyVqL#zHi(k7+pnV1wqXOQlP>V8=*k=@7{62W9fHZdt#jpR)?8jTWOmv$D8 zSxlYGskNNW$2ucB8O5}3?C^=T5dFdw!ld6xA&_U4{&Ddwn4?; z7@Ys)X_}fHHF_GuahrqU7KXn_IUK&TW6x+GeQ+2RvZBW86nK2i_Lv}^tMVcBQS`wC zYsir|q#SB@<8{ZV*qc{Rh4hm{>gZz`8$4BVQvdw?Jg<}Uv%*jB^KPr_ZM~CWg8GbW zm;-KM;evE#L)m7F4}~km=hUPngV^-^X$?^dhd))&9|z3!P|!+_^e<Gf(a0~+0!Dv3?Ks{~aeqC&V?I)y zA)Z=s;p5&9`PIyoE9evT6mx4|(*ZqV)FJ}QGf5|qB_@a{%M&bETmmVQ=Y7%IW&Qr# zn40Gv?9lT;g)NE#_hQh0aLTPf4Fa$GJ$+Fn_&8Hy0$LiJ*K_>H0~{4%|Fsnmy zqz=>A6aBIK`L$-iwf=oB&s!EK{zw^FR?XpJw0>(NkG;Cao23*^l~qJHrhE9+!iFXl z5dxbKO8F$e3$>?(uDb+H{W&B24~dAsDI8q~O3tVUqm0#fDx`JttFn+7z2>_d@Hb{O zJZC|OY`JMFIb#Q?zI#S`SM$@~5WV+=4JNrR109JNx>MQZ@*DMk~;2;oe$=%N^s}SZ1BYG9%eOc>R<}{4ySfLLb; z_6=NwQ4kIT9*d4CS$@>*UE`|F0d4aIBi75Dx5x@GBaxbQx?06g3%w#oGloT$(t@HS zzAQ?!+}e}m{3$i{_J5aZbT<`pxQMad6mR_+0!WL%nJtwIFist;WAO$3-(h!A4Zcgk z*dC^Wj-psVc3EuZR%?sOIu@QS#}D^@6rIx2W0R8>L*qTin?6@ah=~(T;KwhBdbC2M zO#1|FI_IvW2~TSjDKV9>+~vx7@Q7xT2&m%W>(jI+U;{x_8j=N3|xM;GHbB8gmR{^hsDwx4%*q=a&dteEM3i19Z@` zL0Y^*4(p{F_^#(&8bcNG?liaFxX$5vZtLmXc8>c^=}NKo+276a@{tEwd=qO(jjIS$ zd=vbmECNI7#ADVw{X-@NBVP#`Xlm3e(K!K#7f$3*I6;2*LJt7%!vb(_YX3&dhnV?r zt@OH<7k;df@m z&tq3Q!=l)tD~LQ=F1~Q!Y%z=LS2_|`L0Q}$kwLw^Ni4I93*$Ww+k2gR$Ykv#NC*fB zD@xZ0AKgBXp4l@eL9my5bLa%Y!#jYvflu$jLd9h+Y3IFDjLTeS*mylhCt;a@mXV1m zoV@9(B^oxrTlDC^UhOxHa&k)Qrr}A@q{OQz8K_1A2n51+Q^W2VVbj$EmmVRx=PKEI$Qmq?-4ZIaGqx4Z^7r{VRc&N=38 zDf;yKr6n;b0vlYLJG>y9ZPpycp;;ZLHBM~gK)jG2>a&NWAsnny(=qCGL<_z7HqpWvcetG1Q`)H1Kd%cuuCKLLTUQaHnqFk*{pj9NuF#lx zJ=e$Jayq1e5!ZXe99aVY=k1CKU|u#p(~90M{(8<2BnV76Ko`>%EHmWsKcH@{t`ST9 z&mBqad)1Y&QhMf*EgS%jj5|B?17%F)=Y~hZN(wlmV3z(WCTcH15U-{y`8ui>Y`Rd5 z_Utd(=yDng*L^rpizprbg`)CAG0*^70O(kXf1)8{4<^cZd_%gR*aJ)u+-QdGAi1LU zzk5w{>J@yO!_|4Z6jTKAX0~2ji#V+IYi?WuT{(ZcDOxo1u|EU3bIMDU^1jcV)&ENg zNA{7yggxvdd1T=CJQ+c8WeUv`t=dnR(3*$FFz$g{+OS*t)>{%n%vg4YA4zLiL}>rF zZ9{#4R80d8gLeaS`!Nd-Jm6(w!31(H%gVgqTY#{|B+qW|ia>}4S1sqjdGNn@BL3;e zsHbQp__NDuy~phmbk<3$VaDSJ7U)~u=^eaIN+|uHsOTk$Nr|8uUWoBpJ!f7fMVf?a@;olz^K8_sMO0=(ZIktbP5Id1Nl|2yz9#+9O{^!s zTaHu%XB^N4JAAbE#l5-sX;^;f3pT6WG+U)%TWNzO1krozM^PSA6Wx7Q$FIN%-u#EY z{ypu>);G#Q)~_VL$B^g)os^S>Z*LKxDpV-oolyiRQuaB#Nt}Dq7u;?+Y%{g(ub6h! zE!x?})Qe1bv+wRWg8wumQ4AAE{r7^28&9X-TTpc&e}LwjnKR9(P%g+1m*hqI1&82! zJe#C;vW@W$?hz!V_oMim6cNrCt?XfBgQ3-A%|aEy3Tt-1DkYg@j_f-gz;gU&Vy@sn z$c{=F;byhfYZGS&^`-YOj-fC8Qt%Fg2cC5dw|D6RRHUoPN2Gsfa3~MX&LlZn^0<$1 zkW4RHBA59%$Lm2xSTTYj_CiqLoL$z6cTbfEK6gu=N+$t_>7z|cEY=(8>(sr zN%o}N(rbcM*;o{CD~NF-ZU=O~mje#s_Emlrcw9FZ9SZBs;xJ>opdc>06@?4_dyaQS z*{R6ZM1|lex2N0o*FVN!-P8^}el$Z(S7Bb8Jv6km30W22AF6(2rz9mw(b^3Wb{lvr zaE_c!-ii=o%ZTw?@_#>DmNr;cEfyM_yDk#H+MZf5r5qm-1COCdqtoC}pubO%&tM9B z7f3J;giKc5`-1dijct@nu<&-#>>zK~nhwMwVN}$R5Zs)+N4=y2rSv$3faUqJleUwRy8K!vdz8zS?T-<47VD7}+MPD>4hrd#MCQEUxgsAe z-8->0Ta~BNjzU@zh2@26Nxq5U{1o~3IH;6@Z@)bVtlK!10V^~>fG%5loA(A6CZL@Z z(H%|Ge*O)EVJ+0MkBOB9aC`vx+EWvyXj2hP;0ZprjSLWmD3W^D12UbgO)@uAUr9*< z1fop#2vm042)l|utj(g$#f&nxC`4Iug$uTr3Uvyd>x5E7#6DYmXS^H&F zc-~nqzByxp&?WgLxK`RO0zGI_VAaU&hkNgy_rA;m+)>(c(0e=`E~s5u2QRj5Y|RCK9y4kqFXUOySo zqV*giJWq!OP|oIRyzO64s~wR^zs0Wyd`!T}&4#V9+&gEQRcY3e`Mqs$e4RDA&J_OF zqdvN8WUYX@v%ANUGofYZ2ab{Akzb+PS_K1LC?k@?syeMBzwKoLGzg{*+I^SWU2!^m z;lt~bGG;d&d-BLFG*}{%LiAmKiV~b|9rp>yy{8*T{wSby+9M&5Q^HVvi5CT- zhb#0$!R2bS+L*s6d}I%bM4;GPpP}p_x}^-ka_~=!|EW+-2LQhI+NCLA07Flh$40zn zru)gM&UWK9t;OS_-Y$nHt3>%cLnHLSkr*~WW`{FL;oMX-CyGu>Gsj8{D{7&QfSn zu3uab5>0!;ug4)Rwoh_4TXn718F|bCGOQ`A$YzU9EI8^~)}491u0kJAJs4K~p+ATE zWOU*gFy2((9&3$NS!wP1SKuDFzP3}n5eycRzet{A7!Ppr@d2C=4^**#;|0U#pwV9^-vs-r%EiAH_y5d7?`ts>&OIf2z)9I0} zIN$wPr6Aw`)feP0ZJS zC9IS`lev!09>5T-&-EkKaY~VWKbz{gi{(hYMQnACtm`N=IBZw}T%x=VhR&_QQL{8| zFi?4E&1%lr?f{(Ts z>rbWJ&ke3zBD(D6TNEhb{azunQKt?UUPcLnbe2vD)sOG3VT)8RP#3Mn)=t_KJhO;U zMU$!U#bWI2PTQzJ$RJ;&F6)Y%lsT0tjV`0)uLF^k@H>lmAOpW^!_Ejqx9628S*}9E z8B<*XmQsy+g<($}3t!lRUsjDmDC(JvVm4Rm)nYv&(taa$v(!{uCok^HG{H9xRe^AD z$1nu*ldVp)xBg?TjXKx$w7n_*u?9HI^xXMieg}t0i$arQ*VSc0hyhaBGKjib1tBj%Svtb6gsz00O zof+Yym&hs>Mw6HuI0pvQYrhXACPep@g1v&r$50H8%=Qvo8VST6!Ubjb)e=j0_flk` zPqMonDlZnBbL)1R@utZtV!OYowF!3*eXl@q1P=-VD-nwFBRhk%;I+#8xltjsOm3zCPkQ4jIE3Ci>7Xc*$OO{u9vfqQZX%Lw+#v zQAL-OecO-s6|2~W{7OP)`~3CyB;xYkyJxcJ>eFn?RluQkjdN-y>Ij=RdK&!%HJ&#I zioRUYLb-AZcGEz5*2URiK5;Po2&N==O908S&o=mE%iEJ+jedJxLXg?~0y#+`|5axm ze*m-)p8gU!Tm!d)ynG1|B%B92NekBT1_k3eEy>;xF}4ZYyk?`5qbBlU*}E^*^+Jx~ zpqw1QLS-gOanXD7@3Glal;QDI_fOe4xMm%7&9|m3m{bcC4k-b2hu>%ztJN ztMSD!^)eT-H2MOv>4V-6OpA6WMO+KlcKZau$H2@ept(O8&S>W_8wrmg)U3*^Q-4znEy z7a4O5d~b9J(i`Zo%_yx1<0Ti{qj6NaepIEr8bXs3|CB#|g z8BJd^iEzH-KDxM{8m0W%1-k`6yvgkz+~BPoG9;TUuYE`F=vF*V;x5&6IWga#Ro=y|R$v8Ar8b}Jjl+rB!aCdF|15^qpjfy~9!O)a0#G_bmIbN>xE>bD2h{6ag zUVz`tiW(_da7xUoUYaUc6Jlu!h+dS$DvYJs_^G4w#n^-}!t66Fw&4AiF^XB$H`Z{> z8ClJfrs|hw@eKTdvPn-$-V{~T+_cCZ78E%mLM0E_Y2CvQ2)eHOWyG7qNU4B*Axbmj z)>`cqwVrc%lTAt@ub8XA`H%{Q_mFe|zwr%ixYwCbB~#3VytqPWy)zB``D!cuM6}$- z1$xn`R)GI^#(kU~`j-_VBhQFE_hMr7 z)nZelh|fnq#XXPKqo4Kv4xl*}Fao1vv!@FzvbM8}ZL_<%PW!O^st}sc=m_;w$*;aE z{1)LhEx3=kEb$OZydR@CM(>~CeD)~(cSkgrZgeDO9$dpT2lE24E zm~aE*^tWt%5X!RV{78LP6oFv^llUeD*vHEzV+r5b{_~Hon2OM0B%@=j28a=X*8>N> z4SNqsWZr`2%bMhCEv5)!T9dd4DtX6<`%Z;?SpyG7|09-ALHR8AS`-2;LzSTW@AK7K zp792n+NEYJj7r%-8V4G<*N8CtDq8?7_Hjv9s^+G^XZpE2Q4rMt7(?=*2>0enK_OXc z@2XbuB^FFSG~{s!?&%KOZ+3bNkm?wGpB}EC30Wp&(QcJSRg=Ds9`%wpV*IO;F~|uw zF~nDhKcn*@oj_8uJJK0ltsoOFOyDl|5WEZsS&JRSb&@q6+dY)%g@RGG=V3Wpq*?bQ&;*CSeoo)1}%N)V=Mwags6S zGMPU{01T&6vHH-+DGd{*9|dw%r=7!Wl+gqx*e}=54b~C-5fP)vg?7pPd@(7{f28Um z=_jV@)(a7&i^A34fB2i}vRDT>tqHEMsau(FX&@1-79xN(z&=tXT0=y+1W!>BAQleJ zg1U5~QLVYd^IKP7*D~L)zut${-<-^e+k}9UVsJsRQz$w63om*oQcBgXS`_%0$clQ` z=c~U-;D{_#0Cf)=TA{l)49><8*_wvIG7CZ?t*4(ak}PjK+aX(eG^g`cXp*Jwb8Ty(dx zUq143qazwzUyA#t(d%acY-*GW`y?HzH#0A9mIH||#(~Q|D{vDaf`Iwr7~o!a%9|ZD zp5@wW9ns5#n3e#uTclBBPJqJzHgyTqX5MMfjsxzh?-1B48ZMkQkk^2R>F=8Z(jPZx z{)rX6W5S}wWQ&M#M7g;Dt|ZU>@uN0&AByTh#<&+1=AKNS)Taoa>zt{YPA{K@MLjVg zD|lEU5Cc(wMXgqs^SI;em5m$=vo;}^&FDFj?!lYK1dJV3eU&_XYie6((7jN7wQh|> zoeBaqISJS#L-OP8?gpLL^;`w4EJE1`P#?L!TwlW0q+J32H@*3tA!jo)y-D zsT7EL&aby4uHKpD_G*lRxk%AIFfah73%JJS@J)V+-biwkJ{2+^aT%GnbKu{|n_x`r zXgaT4hyAF*0&s!Jl0uK;r7t!&^aYv~4wgy?EjiKaXy4_`v^f`L22rSqZ5mRNf9v)I z;sE|I>}tg(z~&hbwnJcqjAG{__!VMhw{8ms4yd|3=aAlePII~qBurw{5>^AD@FX|I zqhdOC#{BMUNYSRAb*K-C{SYGHQLohMxQS=xGK_Hq+=aw~9ayX?`8&8`L7{?nugAZf zNwiJ0hb6OxOu6{OCb8L*+aN)6xH9S$O#^6<$+s#X(7tsHHV>~oS|1jKanc1cN`H71 z*!y2cQ(|_H?r}JnQlH$Kx*VyK%oQ#x234e4qGO0`4V&6#3sF zJ4O`R%%~pjca0-lC8U%&4e3DIKBK3rQ!?3jybseO3t5x)*zX;+;oS5nQ0Teu3AdSb znl*eabCH?c?;Sn;!DS%4yyLh$DA>&1J??!MrzbhpOxkti31LFv3C&5c))UGOa#sg~ zDmIP4v6C2|M_LHwzy(Igv5>artVDxHB!;%<<03{3IbYE@&pAhS;}H+sbI)3`@PgAx zSe>+^+E$wb-hXDT6J!HD?F#YWvXAG58`kmS_FW7RNv_Auj*Q&#!5 zn`2VO)@CG4UpC-E7uJ;nz@k^A1~b-w-BdDR!w{fD&kFy0p`>N3 zzDBtrdp&sl8g1-bXHJ|WsY|Ti{2iK%eUc*`){V$WOX#mFnLPp4!z34#%{9}vs=oPX zVbXE$6pHWrWffjyGSxbx_4Xo!9jtJK;@LI2t^EzCh7q=7WU`MZm2kyB{GFAe1|Ya7 z*uKh+d3&GK*W$vLHY+C^Wx3caF1yjbFaCkHiqlkM z)`NqUm%MDaWsNY+MfHj8&g@|5h5OS#uDnuGs^n(fX+RePloMCp)n&SZJspOgUQsK5 z*-nYQJyuM%`uNI(M8DR_h7lB}3nr#xEAZrjkBsK_I4XeL&`l!j-=ZJz;l4RMfCgc{ z?9}3e2&15C7(wjk=Bi~wcYZmWm^qzG%jK$|k(NOrNIuo-5T!CJMSn_4iWDLjFO5W^ zv~CM^H%XHle1Jf2%#eMkiZ9{0*9dw|Y>+N?dmANB@GLWyWhKBc|4~(Cv)bz#Qcus5mKAawYty}bm0x>f{PENP} zT8_{4a{+0`;mBf(Jo9g6E&2ULFO0;VW)sH9ISy0mc#(L-T%nSj?stUrO6uYs!1;R64mShg`go`u)OGfKn+!P#sW%xYixAXJsGPj$# ziHv2$_j3*9JfXOvO$lt6 z+fFJ?!Y0+fT&ej|8|K(bZ*wZJ!Qs@aQ9`-atka}K1Q^2Q$^}WgyXd^%Ti~$DHQ3nZ z8&zWYXt#{0Zv*c+@gZc|j0Y+z?Gv3%5zU5UE7`nn&BkV)I0^HmrM_!((o((%F~Mx{tvmUef`vK8(s4&Qok)rbtc^kDb>#9IG`DuDgG!J87ow8eSp z^UyLwZx>=6^dKT`8l#ZQqYE%28K9w|*7@$6{EiVzcw`<51KEf~aILi!X^0aJKSJ$V|d3gxxxrow@GvOC}x6Z7WlT+g0 z@~c^~L$Nbca`}RC(U|{J$<@W*($u`!RNTt(DwPX&kE^I}|L6#`zH7BdNlncy-_+bh z$<4j2zi)xhm5*I>Qj`qBZnZ^;hWu9@XSKcJU0-TK1~|v8YIxp_%ghF%#Y;>Eb|W55 z2(dYfBOHV1y71E4y1R)-@XOjzMhH%gIsTfcU)tAR;NpAqvUMr)u}CNcvdc5w$tWlQ zIS(&i<^FX|e6wbSv2nQ(E^)R(Tv;VK;5lY3#7|&#FG}<1Rc=+BBq2a0@X^)Pot!*a zdHOP>NuWxjG9<{`F8{-LuW5o)VQ=?tWmF|gr)Z;~x8|BVr*ru`3eQ%b!H=%wxmgwc zqdQ$<+Yp$z2?;kVizKAaB`vwWo}ZhIuuwFn&L$ag6Kq%!YBkR{o8f`Q&KW3rG1Shg z1ZlYG<`uI0Pcwc>=D0C)Dh?Y%9H}#ZENLOcAR-1FTZ-~Pp1%&*h58~*|u6+&F*0$+kKiy5&U;+m`hHPp6`D*lQUJ` z{Ge~id`U%;PBHbuldw4~W3ebX7a7_kd@XXWYy1$~@riy3M}rsU13#ql$z$BR-1=S7 zQul9Vaod8&_O|ust73$9t}F~X7B&3Zn(h=7FIW~l{z8=`Y3{=}NCBESS9=u%Hop|hjg ztO2cX8OYgLT*>5z4(wABoHy^eQf0;66p-R&i*a&s^*`3HCXScMw>ISVQ2fbYB5hF$ zNup6pCc>zYNRG)+7r`e!`w=t?OW#9D^dxj=*Yleo(zOmFGV3klpGE!Mhs{i*bgs`e zeD~S!w<+Ge@c>ei>=a)Km|ch>m0;TlT0Fmht*!38W(*oG()**4o%(o5Igph!3z>m) zNU`YXQ^O3#N%s&Fv0sWLj@Rq4LZT_)GiD34q-19zp`h&aqCz`uhzFp+nYxNY`;)jS ziIQXHG;hA3^K(YH?M~7B#-5kAw`V+eBmfO9jt<3Wh#kpi*qlzjoZuc%t0V{6jN704 zQwB%<8Mhsq2t0b-qvBgOzN$<36`3opt8UyT@@+NV9-E>D4OA1H^kN}TaCFYV03&it zBPUByksld7k9j5`Fn$g2Xe0j=-g>bRgdq#s}V$2p;iCEt!EP!*1DBG#2cgI=SK`pi@>tw9gZASRGT&mMQ_aPgOiPR zr@yjTU~C$3;)c@e3R)^Tpo};1=T0Gs|%v9Se& z?#GS}aT&U}e5az-{c!$FP;1Suf4h!*5WGM%X@F7L-Ena@{R15pL9QLJ8>Gir@oju3 zx2&dy5M7zF&1q3hBjhEUDG}x4?t$q*d)&E{u+}2!+Z2s-Qgp5xuOcsY$a~s+YDTF` zlNpCBf=!QV38I;LA5FaR6&JdCsg&A%Z%Ga~nbFxY81wQ388~Q~!7SJ$oai^b*LS*P39@(rnt0N*nLEs8(9n7x{t_^pQ%yMtD;Nvl6H9rlwdK_az0gY^u!ngq_C^oNn%2E zQi$(Lru=l84B9TU>c;RWs{Tbm>NaWBL`{Y7!XI5cvIaH@r*!+N17A!^N>7(q%E6o4 zzheEe;hbA=fc*?z=&J%;>E&n?)ggztmWxXX9^Tv9KM4_DXI9#&a#r2eb>u% zUS8*23W@?c>*3z3eHe|VjHE;^WY82R-DO`(S2vzz z8n{oIFcW2(dqto|f-z}CZX`slW)35$^`?}B+-(w6S6M<|RTqGM`a>a`qfh&w@nhCy z25Gy&KB9~yVZ-~#vc($d7p9nJ5w_fM!^LtQ?Z-95nOFpJBnjVM&CptYaq(A|_ha}< zM;kUdWXb~nzG`Y|Qi!1aK`pz8r(31x+Y-^~#mW>U-nia1YW#Z@lO{EcqZ}D^I?gcV zAr&_K;U*Axk`s@v>8=n4W4M*Y$6-#yO}>u3!qI|4Wg z>Nc!ol!T*0i;2$mW>QW?HkdDq9Eq`+gb7D^#b-H4gaeP#Z;hnk`QV%A)@`Sx#OP?! zwy{O}YHDO}k6rLz&tO7HB17uAk})&lUbC~XS5R>>g_y|Du3K^WwIN@O(9?`XX*j0} zg!O(X7g!JuHzDhqh?#OIS@1sp{)kt$btUMZ*J_9WJ4YtShXU_24T=fm!LP2aP60CO zqd-P)2f4jg?<8V%K@2}wY+hP|5yHV_SKg(2OiuBg%hI7}k|7t|)urkV-FGn5l~zY} zsC>!0sGfLjCJb)x;jG|TPK=TZDs&E;(XS$WFZio&_XQ+4Yf`D*o|B~{;&5E}B|Su+ zc(0<8o#p#t~ ziwfxXTEa(?VovAsk^?d?H@4sgS|au!C~#RGD+ruyn~G{P_##o&*ShGZ(GDSP=%55- zq=?CG=cVA&dfk*q;4e?ltl(85x(^lBjl` z2U^$2`mfSxaEMUr_9=M9!@)uinduDqj)$4Jf1}1wxGIPDEH^s-w(t^|!F)=C6M{Sv z1l!tUSalVEh=TZr)Rqq51`UL2(HfVdr@$h`QitXi34CCaG|EJUqoA}1xyW?RVq;q{ zKbaq5b3etz6{GMu%BTpol=0HoL#qvTbx2#;&?N+BK>mYb8ilQZY0apew;we3?C^jTRXMZBtQNWDiPk z68{98M5%b}gkPO)sV-&YYpeRtOyTMA9w0E0(T@w0ELIfmqS#nE?jh>$vg(c zsL1Vqs~+ZgfM0C3-)HslO8vXjpixxl-uIi~7R^XPL871|VPKg)b?^+OH#Gxe3qql! z*w1K@b6|;36pN@8k3^&&a%J@xrB4p6qbm+drdP}VKMTN*PN3tXxGzL^XH^&D&W~2Z zxh1;MVpV+z_|lFM_mk$vBB1UV94#zfWi#YmhL4gi0Xp=iXrwpHitzj zy$?NsPJo2A5-Y!!nN?nDBS}R^r~Q1rU2nR8p3@?SaO+p?t_e1So}ODZ91X;WSg)WR zC2MP2E5b4zqhYr?E=^+8T>9SjuQb&x)72QS$%p!QRk3JKGqI~KO3EYixA<>r8s4&M zAozCp$TZ4BkzILPHDDZtq^L4-E&U~H0YlMcYLVWQw&>H0aYQC_v!oWUt0Je zEFTqwWob2KXl=%5RM3mtAKP7zklyH+ZK{G1Y+j`Y+XX?oK>Z!L-mAb0(G(5K z?{+v2?jTOYgOFDRy{f)Gqs!-MVn=-B|7f}f#=4qr9X588#%5#NHXAfH8=DOq<0OsI zps}4awr$(Cb9ei__Xq5=&+M7CW@fDiZUSxh3KnKXU~ z3fnd~s2qWM+vcGlqc*>N*`o0jwW;aO`q>{`)XYI_QKR~ ztG|5xH!4fm#;~vq7gg1GI!!i3EP5Sk9GpX=RYdVXZg(*dnkY9pWshi6ICG#!AeWd5 zeWJ!&eJ`H$7isFL)Qmk1U_w1bIzZ^Z$?v|E(SI`&0Pxycef~A}4u8ks4n;?DDSqOu;;Npn<1{MMh>g3Srr6~y4%5Q3 z;xcbeTI?5-JTjHWu^%iaEQD{QHcKWMJyieg&j#kaIsg901aA3vU}Ax}ae;*bsfZfq z(tYJa$)?4U;fW+DJz|)W>m&<^#J7YcAy9&6Q=+D)j|bGeW)BoC-wHoB6B>K+A~E{5V^z(EybGil>wqF~9iz zje`Z@4s?t!Zqc)=?oCfey9xvFiqtpt^>>vGjR@K-IdKr%2wG032%ltjEBt(*4H{%f zyZ9btMd_j|eSR)jVm{>q?`Go0ws` zU^=8ZL;_fG3+Jsly|=wqyR8dLJ9?-ywWrnG#E|~_yRyO1D)Yo>0Qn7ZvyTcP<`*U8 zw6wz`6q7H>W*eK>#iXSJq2=BnoGx%g1=8ZeMry|Pm(&?UG;7cplBKmO)JJgfjc`~^ zk*%;3Szbdex9+IP7{bUmTv*v)i#Sp((>{yBOTpx-#AZvyne+&bYI&p zRwG4d%2wJ+(eH*7d_Gpi1Q#csLIa-T^=w80jQT*w^W||bFMQ|CdC1t@L846Uh7@FO z$uPycL$pJ?yGiv@y1IcxXh_zSWUUfbZ+{=p2R=ZLZ!N|Ys(eRkxr}w^;qRb;!nMa^|(FM7;WuUgz1_Bn@C9EyREoyk1sUCyyoct-<*a zy+$r1TH`VM%T#aGalm5fOY#@NwJzb=K2BO5QqyTDDR-2focL!V&Z2zkKwOD`Pi1F=b>Hp$$ltW z?eG7Jum#iM-RAYLOV$;#yS<;Kp|PVw57a_PhSh9l_v=t6h=-JIR4nWkfE1A(LCs74`bHLG1A*4*Pt+q+ybq96wo^y6r_ZJVnx>8RY`NO0Z=SHpSvdDC>B^JYVUaj z=eutbFcHMZ`@!IUx%WHi#!XXVLa3y+_K%SaPK>rfcP3qzT=-E);DzJN`0a8 zg11hLsVpMhZRzM_RO<)~DuX0cUVG*$^%5ot^p7 z#!heW)};T&Yma7sKhMS`3qt~EH>m(NSkT-13dSVz^w`0%2K*iqCO1)bHaF#DGD2Jz z#{JQOp{|`)$SRgnWnOyKf14*#c;$bI?Oj!WUi{Qkd@{DQ@X+GraMgo2~t zrjQ2Y3rTfYW!`hh$sIf9+uIB$GQ5ecZ<@dey=id8N&zKsX%7?qbLD z(&#t7_jRaqZG$kE>J!{}ac&c^4+7&zfbIANJ~!PTofQl8H)4bXjSU+fFU_AQNN!Ui z8!VB^8crR2GQkmusw69}d)YVA^CVdC<5QslPYq_3G zW89Mew+st~JMP}2U34kwj-$JiH%sT6qZMkObIOl@MpB~*gImy%9~~W4<{u=mak6`@ zzM{&f#T5#x>x=zw=6+?tJ|zFD$yE&xA2X2I&)GyCBUWr+I?Q#GkQMnPV=@A=mp#rSoS093=H(I&QlnXiB}+*q zG3a)6<&#}3q@Ga0JvL4}%l&UN0JbM)r~&9ilxBm**pw8r#J7p7RD6-c(6(bw*;P~S{p_uag*iT z2bA&LL&6Y~KS6BpJ6E+JJj&T5tE(wDGcQ-n3$)52fTjxZ8Jzy$;Oa;4L6&CdlBt%Q zmGWT>ep!b`=}Y)R(A9}mUjdp5bIZ3LQ&~ORR1>q`L!s%;n|b84AR(fawM9cdJ0(v1 zqmM8VV;rTb3pMxngyQ$4Oa6#Z*Ww72Tz!%R*^D)BdoiYR^oY;tiF;VFgB098doAQW z`vW<>+omhY$}H8yijI!eXaoj9k+@$B1X5D8%m_)5B)$|CSxR_`{zTQCV)GA5O>6qb z{EEGOrqkj+*`rrdRumT=@x}2@t_Yt?&E{yPWzm?NmulJ~_`tt8mmjq3=qF3Ou+RHq zupbQ+*T|ru>1yJpz-4)Pmd_X-t48wW*G*zf)SR6UJ0K`TYFscs@G)!LOPe z$sn{Mdh7eNOK|Q^o7YeNebulOg$xswV^2Mj=lJO8HzB#Uwzl<(ASPx;zX>x?}9j(Eo=f=jeiUs?RI%;Z^e((3^iSv5ToX&ifXfbyB>-^aJ zRdn2qdF&^^aVGZpT%T%Q*Nye)n>CZI;D#4@M-}CBLP!YZ;&q=xtXz3%tF8Y?rY^P9 z{#YEKe9wHmono?Mh&U0apvd1A6cuTDojWn4z9W)F98eEbicDtTD8R8N0g?c5L&XX&i~ zXk5_eDbi-KTHf_+g`)j6D`}*|VmDkwRDs?eYZTu~{zhbPm4xzaN*1io)D)A&^+XeK zZIcOn;j8txbMb{sGBO=wbXt_(In(Ch%3&`G4*Dg}gixVrz0p5xU{K4z7Nbc8{eoU9 z-fxkwH~*;QEL9mN@!hYC?*cmWtsf)hl9+R^f8+G~*kV5afcMdpPTHo=)cA~Ziz2wb zC_4Ym6ApH2eABoWgqlR%;Jrg|HRjf)t6tHzM0>f=viP)P3rL}Q=~XuH^LOu=1C~Zz zeP3&=5uzqVH?3&UBuS)#@y7 zb*rm$3CbzP&o4Wt6g9 z1Yc~tMDsY-wqp}B;q{6TQ@kB~6PQ^(yXxkPA>fq|xXDHtXlQ@UtK}eyx8tu-PGr!f zlZ;79?ev1r6D-?Qu++kD{5{_6^y%}+N(TM#*+@&Pi5PNtKaq@hRHX{HQ$AE8ZM2$+ zU1^?4_RKdo*haYUpHV$G!}@QUzVBNxOqb~qaK<2XywWn|)m8DBU@ZTQdZR=NBvj3E zUbn2DEiHT=M}v};Qobd8Hxv6z8cf&K^A7Xz!@h{qkp3R|sfW$S<%=%97r_A`j*r_8Q^UTG$z)kmQC4uQzJ^YS!=V>IfjW239;ehDa^CtN(xh2CH zQP~|$3JUG%hd1d$+WqXk9Tk$T-X8E0-jv)lq5{l}ZeysFI33!dgPpO0!v?zjHqCoX ze_E37M<(c!B6eQO+B*e;uM85y!H&%b0R`E5hsaM}_Gs8Tvi0Q7RXGx%ji?m#&dY7y z9eVyGHQ&U!Q1m6&IH6bS;elKs38sGuNyqZlWfCMw) zn`GnhT9{Xy$=@jS6Lf*L*tE^bVtNEc_fiV2P*sBTtC)eFLb|x5*kEei;t1Zskr9vOU?bVBE%bBq z)m6j<b7+j%T|$-cC%Xkbst5W~rEbo})nW-8#T&l}dh^FBWG z3+}mi7m@FLB;wVe{2BppWGjYTtk+1+z0Ui8e~8YTHCNM4HLlOVe64EW5-Re)HwgVbe|e#@WisywmzxZox6+`1!G01naAN+rt*o&idP_ zq1+hN&_D}54l4&Er8G4vFRL9?lB4PF&q_XeE{5eVAfjyhzvkBVjc z#HLdukGyv4?k7$+&?+%sc9ZlkwIewnc(;)+gR5Of%Car(owd93h~nw3PetI2e~WUW2PoDa*JZs10FX6~2; zbh8ll(lEE{@gc@>2Hdv(U??C~j}0(*Q}+@nxm{m^(z&#Pg1xn)J{tnFbJdCB z3t?+~76iSL({zr$L_dXc8`OQTUzQYT1ny_xlVtmYkFm3umbZ1ZI#I(+W2Gv z;_*C7&{!_nqsHHL#TVyrH{$tCXaAuO?|En3@2$l9a=jg?i<>qAt32qv5r418ATbq} zkv2(DA}x95R99=f#6U);#=PQW`9A+}-Svzw_>`vc+>;2)x_uRU77*;1)j9X|ZQ$IA zpY&gPyXx={)XaL!1Hhwxog1b(BdPqz41xF!nld5+P({T~p7fft!aT(l)=UUHmK_@# zhar@D@io)7s=Vx5%aRg|Xb zN1!T5_cq2&z~|N@<A6UY-$1}eu%&`=u@k?Zxc;(d zUhTYyJ18aDs>6Ylv8YC7TFd5EF?M=}R-Y-F`~i-4o?e#)r$B*&{B}C)P2{Zg9xa8# zCE=yr?}2IHFhjy~tJNm+#OKuQ$-o;h^u0QNe}m2In^xg6ZW&48Uz5F(5y4_!pQ|VL zRAn{^@-V_3GBx2U_dg&`g7YI8^74dGXqoLqUU|~GURAg^g7!Bn#3~PjKbO^i;(Q!b z^xgCM#?fa`Ff{bJ@vWVj?22VWp%)}nnZ+{k9Gt(6G&1^AitFM<$(IUk(q}x1voyBC zdpAOlbcmjo$A4P9J!lO6E zs=A}m{*>`?tXX*NI#Zj8^DZRL_hF4AMh!#Y`9#sAvupNhP;nKSESMvO%P^1Ak56Oz zCz_O$R02=X>#uBlXky9|ndk-|L_cDj$&~E=iOnImIo2Fha8R_W^a2>Sqj@!Ezc)?~ z(Q>0l1O`>~Fp=*&pZe*3@$j3l0dAyh6Iac_4K$)yq7cOs*dAH|%y#|iTK61y>VxmG z_Ig~^_TJEa`#aqp(cY#C zFEI)yT2xqJhe5FK@QTV$1N7Tv1TMp3guf<#(~HbA9H!N@vpR1AgddysGZ~4Q^eE(B zl5otM&EA$+QQ_yVpPYz52;J5r8N6dV$9oOFsIP{!d+bz0H(gc9C`Yjz#R)%{V_rS7 z?0J*;Kh0M-3d9DWc!UhjF-vNhBP)^rwym?9EIl|=`iXZzc)Yeqgp_5K}E(_jCw`Ml$IDsH?EZ9UHwd^#AkmgJ7$(f* zY>ya#@pX8ScZcq5Y}Q=l+1GjRkP!vp_TpqMO&)>SEuWgwJrlibNM0Q(zO$+s+I4S9 zmU2!`onw_8aJzH+IoFcygk%t1S$H<~42Vl8{BUS8$s=b=#|$*YS##VL2|6V(G|ETh zU_3DayvZVYUx1deC?@BcyE>tuZz)`1|FbqayxET)FF-U6Kff|<_wmyksdc$WNzH>i zZ*C{n;rEJ|?ykH1L@XRZ2BL^qJGSiXZ;voFCmxDVf4t9{vOGf%PASx0Fa$8% z?4u-l&{B{ghR74J>g;MdQhCC`SMs&@_4&|86PTh^ZueR z^+ya0Z5Tjg5t;SqHuS=iEZtNE_wGE86ismSx&zgsADwgz#S^0#f}PD5gjO7_yh<+Q zJpWM}7ODiYIs;{L+u{Mm?}1FsQ9oqnCwWN)1KX3)X=qo0Eqh(={eVKNIZ<8 z%%QOpUlh=^ru1s@3p$eaT)z+na}ovbLfY><-0i<3NGFn!>tS}=lU5((Iv^(kf4o~U zKW-!4NYj^*mlxLzZRj3fjfnj&1DwsDGfSIXf2w_%l>sRJ=Uq1GxeoH1{$LR~1jmC@ zs81eHrPNJtWXXfY2VV_{9SD_kQ(7_i+1ngio38Z6o?z8sX#WzpS!Zy3nW^ zQbSO{pYnEA>=EYNCp*X&u8?&YMVnb*c2^E)Y9HboV)Rs^BEAqnQ-o(ir z+yy0Bt_r`pi-6)HYfBD@7Ch_m!1cwQB)S18MBh@5e6{s`)=r|f09ed~Ju6g+eEAE? zdMehgiKQADoLR=F)u$g*oCcnrJf5kROnRMLbHuU+XPyPmasEOoDl8u;ePy`g9Y$~- zHE9W>;cC$0n1<2}O%jr+lJKQ(cBco$OCN5W&wl#uyJSn9J+T8dj;7;s?cLu=zGUa_ z&)T~a*+!*Z4OW{9!htq6uJetf9kCZjy%{(19XUvWeK7rCNdI0veFlJ6dF2 zeqBmWT!~lz`b z1>bie+m;HS(cHwufEdacYaDDrR)Vb{*ZRX-M{KJE%TeAr@zHG#L`0}JTp|qKH6R2g zXJ7MMcD_T}xTHZT@Kyz%WS+ftAo$uvDfeT_vhM~Yk?8&qog+^3|lo90A+ps)$`@MnaCrRzBqB7$u_&W_bdGFs!IiPQEL$mwcPE$IM zlXBa0M#V6Uzy+ZyXTY-wT8O{zLAD?JQS+!G9|A&4@RBk#-VWiJfA_#i4WG zd(x3BJ0TqNd;7Z%WbH#>!cp4J1x)f@eh|I-muj(V!w^CSvTc=DgV6R7EScg{4jFNn z4MB7dmQP+br6C|;A0`T_+ zo4wlU8rJI-fSv;uNG=kGRp#w6>s?sDad>(6A25>{Q7g}`X{ek zj4tE+ZUgaYM2Q-Dypc@%gRgD#O1h{pD0?~~9cB6cBnHs9w#&?~s!FkpG@9`iOZ@pH z)R=%zF~J^NV09TapMQz5WDKsQ0`9{0ZSe$&K|gl3m&itjv{d9BkIN8gDGm>f`8XC# zCQIRY{n;g@HP9uwLlxYQObrMs*!M1RTY53+m3? z?lliz@CgL)Rpjr^1@Y8X&_7w6FFaOz-z44-x4#|xu=p&QELI(JU17KN;0#^ijmFD@yr4)Euxf) znIE0$N}bs}uEgkK>0+m*RL8_TC$jQ5PvF3dO*I&@qTNOPf_`t4nb{T;IKg_K56 zh<9cJA;*#mH#4D<#O&FYW~0g-w3DRm&=jJ$KBmf@$X48SM3Jwp zo*{gfGmJY3`VZAQEt)tdq-`g@Cw4#?5;xAzj{yexMLCgPI{?|QA%%1!=Rm2*+C$&B zFoc%A;=|(%oM^d*dg4GJ${HD&nS*sY4*U4F~8F6Z!FhWQ2WlkASN z>NxCzx|oYS?h~kVM9x5gQ4o1uN!%u05R{2=P#YaT)HgJiS+r~@28Prh34by{+^AKB z6yG^lNaQBqpb}L_#p{*{qRM&!*{rn?3O~S)2A&RZXf{>e)6#IC7lv*XNKv(T|JeKX zoO-tQ9*t{wi15e!BbyJA0vk z*!Wg)Iodb=s69Vu%M771ybav#=B|cY|F@7p-FS~x?7p=#avIn5klSe29_Fuxo0npbw*I9mG zDzZ(FKuJ#W?V&$u=iYDO!xzPzJoApv2$0lY!KtPOzGK4O7GYrQ>Qu_hb|PzrsH@M( z`syXN?6-2_jT7OknVRntw}ct@*?!W!T0HZ<@G_`wpYENcZ+Ic1^KfVUVDo2ZQj#bs zNzYdlYb?zqQ&w6iJ`fBBI_h?`+P;%(aCG#t_~3wWD5J&1d0sawYPt6CkipaFR|Hlx z*wi$uT&JTUUG{Fjtnt~O1K$a>%Ac7L(6X|_0lt1-q5?mTlc*U~Df;WoII7~7ycfz| z>D{&U%a&TbVp<-a=S@eC9?kegE;6&-ju;^#`Fo)+2o4qmFE5u3?JwYx*WU#(Y;)T0 zkIo;@nk9T`sHvIONU-RV?eadY#mxELz^;MQ{2==Ay-^REc~MAC?Y)XYb-3G8zMC#> z4s-)nP&bZ@U^6 z#d(qZ>~?mIPw9oSzr5=QGbP2?E;}x%xo(r|`}Vj#5R>^DOsA_tU6v_s&#zz9jtC8L zBKBZ6wKI7YpY;Nm*uV38?4{|)-M5~v=C7>mej0jl-Ukh>GRU=K#)4~CKp>}8be7KF zagTK098McVH7ftDg$%p3U1wcA?41uMPjW{$_+$S}D9o|;-%o~%?~~?;RHLq{hRoUQ zYQ0}OqgsAYj;B{!@^vCjDdss6TMhHk7kb}+)4C6g1f%tGBjQjZ+@E_rJOjqzmBG(= zu_ip`ThXvxld|T0UHNkFCm7Sn`AN8iMr0f;wF?s5l~N5w)iaaT34c$vjm}OOtQX*v z8XgfjSw2T)k5v6x1L;5ro~?i5M=*U`86OxY0#BbC9K_(=amxC$+!Jd21E2Qz=gNx^ zrmn6}yj&_5^0fn5m%*~+>294_s=E9K+1L#(bQuS?fO7cF&1u-bZ{x26h2C!suyQ(GS6z=M9ZAE3D5V9}>$s zwTsAKT}tNqlN=~Xe~py0b+=V%*+=c|u3`QK0G2ME8zlH{{#m-;z5AV{*U1v9y%YGp zpS2-!EH+YfNGGWDtH{nGK)wcDP zFonq%ZEnkZItVAm)pAf?$Xla)aH;lCI)%k0WyRsyrz20KFY3n^>K5&uVp9TWJWp+G zR_Rs;h6A3}5Bo1vBrT8yK*oE+Zr%82ri({g3zQEd`+tC#WbJi{^e5`HTx~ zEk%pzP;LPr)tf2M1+96snJt#&MRHQyKBq4+i%hAx~l@uvNV*l_`wvPNbg4#+6^HHtFQCo=# z!c?E3Vb!yOjjetlojdr7@%_rd7$PI7Ux`8izLfROz0n5pT9PO#iQ!8c&tI8NrSNgR zSTxP{1b9vn?mdhtdT5=3cJegPlT(hWyXh^H)xKEKSTPpis%j(RBWxRL`2Je`aIta zBQU;Tk-*)FaIPRS^J6k>SM?DK_AhJZqR>YK*oJ{o1h{(3ap6kI{rrh}75t-(L0*2; z%;6}Ny<`LR9+DD*?o%f6>k`MiW3@|$cJ#rwoc^cgW}cZ{-K%aQ0hqv`?!MsIvgurj z82dF$NLqQZ4$DQe^1^bxz0oX4{rFs66=j4-J$#ha)y-LYoJ+B0%Z1v*G-7gQqx~Q_ z4AieVQdY;f0o022BWn41~q?ZN1hOP^K?3m?EuM*9a*iiO4utYt?Pr9wq*Ae?BlB?ip{dG!j`L zmX3fUhpx2Ww4I|y*C3K!jHoB;a&mCsR`Yq@B)>e(w+A}(9Z!L=>#%H{=NU}ez#lm? z(7~07>yXbKcHATHxw(BY^NWL%Jqe5NOADSp5lx@*^1ppLCX3-)>zy5zvysvdJ=h%04`u^$WDYj-KEH6K$mCT+tY6VxPcmZjY2HFRA+J_j#=Ii<}So>5)1X+xjX zA}^qnf>*DgqT=;EId?Rg_^rE2qU6LewQQb{93>(5 zVhG(g%Jm-e=ZPL6@HholO;@eewn+eSREd7=NM%N&WIUG)%rTMI=1ng@h7%)m0{KD7 zuZ3orsaW(T(@Bn`BvqpD;-vMiK?LE?l281LnbddKpeuvkwh*jVH3?^Uq|RMhzfA_$Bj6pRWEy*?0ib*kl&aq>OFcv3pF zRU#oPa~o*7+&UUtcT{iwh$AUa_(M4Bd?!+DijJi3VFC|^7<>hLvg3t`vnW?DzwnSCW2ji)R69zFNrSgNsg4q5C5KV)Pg)9`Nr5*@u2)67? zNYm*=c_zyRloNPhra30h0zGfK>ShBYB0pfvfui~-~0GF>N^$g z|9k&0*dPiBwei`RxnUjm!xZ+CiIU9i)M^-_mOuK=6XqT6fN#t%DI6?; z5EUE#0rVsq5NxG58raqmocJSSrI&`wOic(fNdnA9jgUy zDGSErIbArcE!SesgkHaU%lJ(j)=hfwls^q%--N_6`LVeSeFRYZrlAM(2b_L0)1tSH z|3P0(NDN$b)2WPZ=D3{@OgjTS);vfZMf~=|R$viBBi$i!*_e=#dRfBFgM(RjtgzYC zzRYu%q&Y;7wmkbcSNsRP)q-7UOBYi^dCvu=8{ZSW0RjV8XfF z)A8#Gu9Um^#O`%xqt#-8%p!}xyFcd**YGr!Uiv>IxDr$sA^6>@Evc2*jyf(KU0{1h zZ7o~8UkF-3%|U0ra9rHAy=06OEqoulev5lHAlvZ)@A?BHi9@q&{C~sABiXoFopZF^ zDdcnCXd1$k7TUmxqy;a9ew{Y(#MEl2Fx6N=q~DX&8*}@805{+%>nRXEtHdlg1iJ zcRE_coA+roj_jJGk3PO?TcR7e6|-WCjQlyE)l|msAK?J_K|-hn$z|VEA5MM;)?XV} zn6jpTWjWAi>zeZ~r8+t+3lNcL;ijsH49+0QL+;Mh(5>q!6(%kDDzeoiKu_Lo`44+4 zga!)(wc^A2eBz3#%(53)-fYGE5~tvbrab)%2@7JK^B|sk{h=?Ud}Kt<*ie!z1mI(! z%{st{plHa#Luf1}Aw2~`uFJL4{zXjxg1tciZvaLqBhq8sN14j;4fjm6zd&;a9>eyl z>iuz_4;S|V=MF28ue+)SP!BOwMpyCh2qww9s)m;qzmbqoG6`qxGLWh^IIH;o3496w z>xC*{tS@d-gNg!_5PybN@=mUN7ZaOZF_3Tc8j>GK-k6lcspgxNl>#W=#CfNV<#``T ze5WIKOjt3i^$^jc{mwqut1)BW3++p_mJ+K)fZfAaHZT(zf&`8) zlcuNRk1Xu$bpYz*SjGD;-NeMi9gZe11=id6wfujpb3?oX6qgoi+h`aCl-!nJG5F$; zktkJKNm{w}jkfy=n$b5l(*}?58f;fXCUy%FVi7+BWW|3eP?$J2w7Q06w-0ar zse&v3{A=Y%gO}HEYcmy5B)Z}E; zkK^z@qnEKDG}c`Xn_o-ig$K1Z!G@47AZfTTJsQga);W!y8@_+3gY+Y~tjLKzFUiN+ z1~((5NzxQSzw(8{1dhVpvoF81?hh9TOD7RuS#I#8;N zS$(XQ^k9bR>VNTazz9*V@%wAE|K-BynteAri^mi>Yu5NP(kHab#cmM^?~A8f#jYua zxIZ64_x8+;p8(HH99?{CrOE&0cPJQeBDAoup^UUN1kz@#HZe&d>H{_uOG%sNKj+BN zSxx>so(ls5X08C(yd_Ue`tV|ttlFoa@Y>19J3!-`x%xXYk=xSA(Z9vxA1c&w>AJn% z+t5{Y_!8`7atNXTfwo3a{G)`FGP-k8ogfdhRPPx@8{Zd<6`g_HT~GU$ET!*@R5g?4 zOlS!^EKKwpSUr=0-?eeK1on4nkmS>Ndc_XS{A7)TdCy<*M zX3M@fC!4aGx5sImg45#PEmSOMenc4Sd)&HspQAS{F_f~bK{k5+1JL_tivcSU7Z-2$ zsHB2r&haKhR64Y%t`3tB(-x(~maUY<7$K?;Y48Hede#-tj<{M%EK~XV6}*mMKhB$m zPQN3GfAwE3GLS;8d?o#z?TUEBx&i47EHu=y{{1>$< zHz(;AdQ!b`oY}m;@!kQ3dXW?YmDo>TZ8iIa#qA8=_+l1L^_1%-g`S??kdt#}`dC7( zoq(ExT?Bvik6k-HpS>8!5SK8S^k^4?wPGD0SOHm9s3R+A3vp2{l}|5`v3)tS3uR*^@#oJp7wKChB;RAu!yMXu06*5xw}0sE$nO-S zxu9#!UR{`sL#NOb8#23DP2b4njNSyA9RvqDcxAXnighi#OV<67>PT)TyAS?#y5 zsu%&9_`LRC`s5D49wr(4$Sz9JFv7)|VctS*;B1>m!eB)Z-YA+a!m#yxAT�Tua2~ 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 literal 0 HcmV?d00001 diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 0eb598096..3dd8ce94a 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -41,7 +41,7 @@ - +
{{addr}} From 1a28ae6c2b6d7cd8ebb48368ebbd9a1bfecfe2d3 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 19 Jun 2018 18:25:05 +0200 Subject: [PATCH 066/166] Improvement 335 - Automation desktop building by grunt --- Gruntfile.js | 133 ++++++++++++------ app-template/apply.js | 5 +- app-template/package-template.json | 1 + .../create-dmg-dist.sh} | 49 ++----- app-template/scripts/create-others-dist.sh | 54 +++++++ app-template/scripts/create-pkg-dist.sh | 45 ++++++ app-template/scripts/sign-desktop-dist.sh | 36 +++++ resources/bitcoin.com/mac/app.icns | Bin 272024 -> 80461 bytes resources/bitcoin.com/mac/pkg/app.icns | Bin 0 -> 272024 bytes resources/bitcoin.com/mac/{ => pkg}/build.cfg | 0 .../bitcoin.com/mac/{ => pkg}/build_mas.py | 0 .../mac/{ => pkg}/entitlements-child.plist | 0 .../mac/{ => pkg}/entitlements-parent.plist | 0 13 files changed, 247 insertions(+), 76 deletions(-) rename app-template/{build-macos.sh => scripts/create-dmg-dist.sh} (84%) mode change 100755 => 100644 create mode 100644 app-template/scripts/create-others-dist.sh create mode 100644 app-template/scripts/create-pkg-dist.sh create mode 100644 app-template/scripts/sign-desktop-dist.sh create mode 100644 resources/bitcoin.com/mac/pkg/app.icns rename resources/bitcoin.com/mac/{ => pkg}/build.cfg (100%) rename resources/bitcoin.com/mac/{ => pkg}/build_mas.py (100%) rename resources/bitcoin.com/mac/{ => pkg}/entitlements-child.plist (100%) rename resources/bitcoin.com/mac/{ => pkg}/entitlements-parent.plist (100%) diff --git a/Gruntfile.js b/Gruntfile.js index db796f3b2..7a1c4ca00 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -7,16 +7,22 @@ module.exports = function(grunt) { // Project Configuration grunt.initConfig({ - curl: { - './cache/nwjs.zip': 'https://dl.nwjs.io/v0.19.5-mas-beta/nwjs-mas-v0.19.5-osx-x64.zip', - }, - unzip: { - './cache/': './cache/nwjs.zip' - }, pkg: grunt.file.readJSON('package.json'), exec: { - replaceNWJS: { - command: 'rm -R ./cache/0.19.5/osx64/nwjs.app; cp -R ./cache/nwjs-mas-v0.19.5-osx-x64/nwjs.app ./cache/0.19.5/osx64/' + get_nwjs_for_pkg: { + command: 'if [ ! -d ./cache/0.19.5-pkg/osx64/nwjs.app ]; then cd ./cache; curl https://dl.nwjs.io/v0.19.5-mas-beta/nwjs-mas-v0.19.5-osx-x64.zip --output nwjs.zip; unzip nwjs.zip; mkdir -p ./0.19.5-pkg/osx64; cp -R ./nwjs-mas-v0.19.5-osx-x64/nwjs.app ./0.19.5-pkg/osx64/; fi' + }, + create_others_dist: { + command: 'sh webkitbuilds/create-others-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"' + }, + create_dmg_dist: { + command: 'sh webkitbuilds/create-dmg-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"' + }, + create_pkg_dist: { + command: 'sh webkitbuilds/create-pkg-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"' + }, + sign_desktop_dist: { + command: 'sh webkitbuilds/sign-desktop-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>"' }, appConfig: { command: 'node ./util/buildAppConfig.js' @@ -30,9 +36,6 @@ module.exports = function(grunt) { cordovaclean: { command: 'make -C cordova clean' }, - macos: { - command: 'sh webkitbuilds/build-macos.sh sign' - }, coveralls: { command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js' }, @@ -71,7 +74,7 @@ module.exports = function(grunt) { stdin: true, }, desktopsign: { - cmd: 'gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/<%= pkg.title %>-linux.zip ; gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>.exe.sig --detach-sig webkitbuilds/<%= pkg.title %>.exe' + cmd: 'gpg -u E0AE67E7 --output webkitbuilds/others/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/others/<%= pkg.title %>-linux.zip ; gpg -u E0AE67E7 --output webkitbuilds/others/<%= pkg.title %>.exe.sig --detach-sig webkitbuilds/others/<%= pkg.title %>.exe' }, desktopverify: { cmd: 'gpg --verify webkitbuilds/<%= pkg.title %>-linux.zip.sig webkitbuilds/<%= pkg.title %>-linux.zip; gpg --verify webkitbuilds/<%= pkg.title %>.exe.sig webkitbuilds/<%= pkg.title %>.exe' @@ -232,43 +235,78 @@ module.exports = function(grunt) { expand: true, cwd: 'webkitbuilds/', src: ['.desktop', '../www/img/app/favicon.ico', '../resources/<%= pkg.name %>/linux/512x512.png'], - dest: 'webkitbuilds/<%= pkg.title %>/linux64/', + dest: 'webkitbuilds/others/<%= pkg.title %>/linux64/', flatten: true, filter: 'isFile' }], } }, nwjs: { - options: { - appName: '<%= pkg.title %>', - platforms: ['win64', 'osx64', 'linux64'], - buildDir: './webkitbuilds', - version: '0.19.5', - macIcns: './resources/<%= pkg.name %>/mac/app.icns', - exeIco: './www/img/app/logo.ico', - macPlist: { - 'CFBundleIdentifier': 'com.bitcoin.mwallet.mac', - 'CFBundleDisplayName': '<%= pkg.title %>', - 'CFBundleShortVersionString': '<%= pkg.version %>', - 'CFBundleVersion': '<%= pkg.androidVersion %>', - 'LSApplicationCategoryType': 'public.app-category.finance', - 'CFBundleURLTypes': [ - { - 'CFBundleURLName': 'URI Handler', - 'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>'] - } - ] - } + others: { + options: { + appName: '<%= pkg.nameCaseNoSpace %>', + platforms: ['win64', 'linux64'], + buildDir: './webkitbuilds/others', + version: '0.19.5', + exeIco: './www/img/app/logo.ico' + }, + src: ['./package.json', './www/**/*'] + }, + dmg: { + options: { + appName: '<%= pkg.nameCaseNoSpace %>', + platforms: ['osx64'], + buildDir: './webkitbuilds/dmg', + version: '0.19.5', + macIcns: './resources/<%= pkg.name %>/mac/app.icns', + exeIco: './www/img/app/logo.ico', + macPlist: { + 'CFBundleDisplayName': '<%= pkg.title %>', + 'CFBundleShortVersionString': '<%= pkg.version %>', + 'CFBundleVersion': '<%= pkg.androidVersion %>', + 'LSApplicationCategoryType': 'public.app-category.finance', + 'CFBundleURLTypes': [ + { + 'CFBundleURLName': 'URI Handler', + 'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>'] + } + ] + } + }, + src: ['./package.json', './www/**/*'] + }, + pkg: { + options: { + appName: '<%= pkg.nameCaseNoSpace %>', + platforms: ['osx64'], + buildDir: './webkitbuilds/pkg', + version: '0.19.5', + macIcns: './resources/<%= pkg.name %>/mac/pkg/app.icns', + exeIco: './www/img/app/logo.ico', + macPlist: { + 'CFBundleIdentifier': 'com.bitcoin.mwallet.mac', + 'CFBundleDisplayName': '<%= pkg.title %>', + 'CFBundleShortVersionString': '<%= pkg.version %>', + 'CFBundleVersion': '<%= pkg.androidVersion %>', + 'LSApplicationCategoryType': 'public.app-category.finance', + 'CFBundleURLTypes': [ + { + 'CFBundleURLName': 'URI Handler', + 'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>'] + } + ] + } + }, + src: ['./package.json', './www/**/*'] }, - src: ['./package.json', './www/**/*'] }, compress: { linux: { options: { - archive: './webkitbuilds/<%= pkg.title %>-linux.zip' + archive: './webkitbuilds/others/<%= pkg.title %>-linux.zip' }, expand: true, - cwd: './webkitbuilds/<%= pkg.title %>/linux64/', + cwd: './webkitbuilds/others/<%= pkg.title %>/linux64/', src: ['**/*'], dest: '<%= pkg.title %>-linux/' } @@ -287,9 +325,6 @@ module.exports = function(grunt) { grunt.registerTask('default', ['nggettext_compile', 'exec:appConfig', 'exec:externalServices', 'browserify', 'sass', 'concat', 'copy:ionic_fonts', 'copy:ionic_js']); grunt.registerTask('prod', ['default', 'uglify']); grunt.registerTask('translate', ['nggettext_extract']); - grunt.registerTask('desktop', ['prod', 'nwjs', 'fix-nwjs-macos', 'nwjs', 'copy:linux', 'compress:linux']); - grunt.registerTask('osx', ['prod', 'nwjs', 'exec:macos', 'exec:osxsign']); - grunt.registerTask('osx-debug', ['default', 'nwjs']); grunt.registerTask('chrome', ['default','exec:chrome']); grunt.registerTask('wp', ['prod', 'exec:wp']); grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']); @@ -301,7 +336,23 @@ module.exports = function(grunt) { grunt.registerTask('android-debug', ['exec:androiddebug', 'exec:androidrun']); grunt.registerTask('android', ['exec:android']); grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']); - grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']); - grunt.registerTask('fix-nwjs-macos', ['curl', 'unzip', 'exec:replaceNWJS']); + grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']); + // Build desktop + grunt.registerTask('desktop-build', ['desktop-others', 'desktop-osx-dmg', 'desktop-osx-pkg']); + + // Build desktop win64 & linux64 + grunt.registerTask('desktop-others', ['prod', 'nwjs:others', 'copy:linux', 'exec:create_others_dist']); + + // Build desktop osx pkg + grunt.registerTask('desktop-osx-pkg', ['prod', 'exec:get_nwjs_for_pkg', 'nwjs:pkg', 'exec:create_pkg_dist']); + + // Build desktop osx dmg + grunt.registerTask('desktop-osx-dmg', ['prod', 'nwjs:dmg', 'exec:create_dmg_dist']); + + // Sign desktop + grunt.registerTask('desktop-sign', ['exec:sign_desktop_dist']); + + // Release desktop + grunt.registerTask('desktop-release', ['desktop-build', 'desktop-sign']); }; diff --git a/app-template/apply.js b/app-template/apply.js index 1aaee94de..f763602fd 100755 --- a/app-template/apply.js +++ b/app-template/apply.js @@ -11,7 +11,10 @@ var templates = { 'ionic.config.json': '/', '.desktop': 'webkitbuilds/', 'setup-win.iss': 'webkitbuilds/', - 'build-macos.sh': 'webkitbuilds/', + 'scripts/create-dmg-dist.sh': 'webkitbuilds/', + 'scripts/create-others-dist.sh': 'webkitbuilds/', + 'scripts/create-pkg-dist.sh': 'webkitbuilds/', + 'scripts/sign-desktop-dist.sh': 'webkitbuilds/', 'manifest.json': 'chrome-app/', // 'bower.json': '/', }; diff --git a/app-template/package-template.json b/app-template/package-template.json index 8e7aae9be..d6f8aceb8 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -15,6 +15,7 @@ ], "main": "www/index.html", "title": "*USERVISIBLENAME*", + "nameCaseNoSpace": "*NAMECASENOSPACE*", "window": { "title": "*USERVISIBLENAME*", "icon": "www/img/app/icon.png", diff --git a/app-template/build-macos.sh b/app-template/scripts/create-dmg-dist.sh old mode 100755 new mode 100644 similarity index 84% rename from app-template/build-macos.sh rename to app-template/scripts/create-dmg-dist.sh index ac19b8197..5b004e66a --- a/app-template/build-macos.sh +++ b/app-template/scripts/create-dmg-dist.sh @@ -1,11 +1,5 @@ #!/bin/bash -SHOULD_SIGN=$1 -if [ "$SHOULD_SIGN" ] -then - echo "Will sign the APP" -fi - # by Andy Maloney # http://asmaloney.com/2013/07/howto/packaging-a-mac-os-x-application-using-a-dmg/ @@ -16,21 +10,25 @@ if [ -d "$dir" ]; then fi # set up your app name, architecture, and background image file name -APP_NAME="*USERVISIBLENAME*" +APP_PACKAGE=$1 +APP_VERSION=$2 +APP_NAME=$3 +APP_FULLNAME=$4 + rm dmg-background.tiff -ln -s ../resources/*PACKAGENAME*/mac/dmg-background.tiff dmg-background.tiff +ln -s ../resources/bitcoin.com/mac/dmg-background.tiff dmg-background.tiff rm volume-icon.icns -ln -s ../resources/*PACKAGENAME*/mac/volume-icon.icns volume-icon.icns +ln -s ../resources/bitcoin.com/mac/volume-icon.icns volume-icon.icns DMG_VOLUME_ICON="volume-icon.icns" DMG_BACKGROUND_IMG="dmg-background.tiff" -PATH_NAME="${APP_NAME}/osx64/" +PATH_NAME="dmg/${APP_NAME}/osx64/" # you should not need to change these APP_EXE="${PATH_NAME}${APP_NAME}.app/Contents/MacOS/nwjs" VOL_NAME="${APP_NAME}" -DMG_TMP="${VOL_NAME}-temp.dmg" -DMG_FINAL="${VOL_NAME}.dmg" +DMG_TMP="dmg/${VOL_NAME}-temp.dmg" +DMG_FINAL="dmg/${VOL_NAME}.dmg" STAGING_DIR="tmp" # Check the background image DPI and convert it if it isn't 72x72 @@ -156,31 +154,14 @@ hdiutil detach "${DEVICE}" echo "Creating compressed image" hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}" -# Sign Code (MATIAS) -if [ $SHOULD_SIGN ] -then - - rm entitlements-child.plist - ln -s ../resources/bitcoin.com/mac/entitlements-child.plist entitlements-child.plist - - rm entitlements-parent.plist - ln -s ../resources/bitcoin.com/mac/entitlements-parent.plist entitlements-parent.plist - - rm build.cfg - ln -s ../resources/bitcoin.com/mac/build.cfg build.cfg - - rm build_mas.py - ln -s ../resources/bitcoin.com/mac/build_mas.py build_mas.py - - echo "Signing ${APP_NAME}" - export APP_PATH=${STAGING_DIR}/${APP_NAME}.app - - python build_mas.py -C build.cfg -I "${APP_PATH}" -P "${APP_NAME}.pkg" - - echo "Signing Done" +export DIST_PATH="dist" +if [ ! -d $DIST_PATH ]; then + mkdir $DIST_PATH fi +cp -vR "${DMG_FINAL}" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" + # clean up rm -rf "${DMG_TMP}" rm -rf "${STAGING_DIR}" diff --git a/app-template/scripts/create-others-dist.sh b/app-template/scripts/create-others-dist.sh new file mode 100644 index 000000000..c9244b3ba --- /dev/null +++ b/app-template/scripts/create-others-dist.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# make sure we are in the correct dir when we double-click a .command file +dir=${0%/*} +if [ -d "$dir" ]; then + cd "$dir" +fi + +# set up your app name, architecture, and background image file name +APP_PACKAGE=$1 +APP_VERSION=$2 +APP_NAME=$3 +APP_FULLNAME=$4 + +export APP_LINUX_PATH="others/${APP_NAME}/linux64" +export APP_WIN_PATH="others/${APP_NAME}/win64" +export DIST_PATH="dist" + +if [ ! -d $DIST_PATH ]; then + mkdir $DIST_PATH +fi + +## +# LINUX + +echo "Building Linux..." + +# Building package +cp -R $APP_LINUX_PATH bitcoin-com-wallet +tar -cvzf "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" bitcoin-com-wallet + +# Clean +rm -R bitcoin-com-wallet + +echo "Linux Done." + + +## +# WINDOWS + +echo "Building Windows..." + +# Building package +cp -R $APP_WIN_PATH bitcoin-com-wallet +zip -r "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" bitcoin-com-wallet + +# Clean +rm -R bitcoin-com-wallet + +echo "Windows Done." + +echo "Done." + +exit diff --git a/app-template/scripts/create-pkg-dist.sh b/app-template/scripts/create-pkg-dist.sh new file mode 100644 index 000000000..c0b4d266d --- /dev/null +++ b/app-template/scripts/create-pkg-dist.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# make sure we are in the correct dir when we double-click a .command file +dir=${0%/*} +if [ -d "$dir" ]; then + cd "$dir" +fi + +# set up your app name, architecture, and background image file name +APP_PACKAGE=$1 +APP_VERSION=$2 +APP_NAME=$3 +APP_FULLNAME=$4 + +rm entitlements-child.plist +ln -s ../resources/bitcoin.com/mac/pkg/entitlements-child.plist entitlements-child.plist + +rm entitlements-parent.plist +ln -s ../resources/bitcoin.com/mac/pkg/entitlements-parent.plist entitlements-parent.plist + +rm build.cfg +ln -s ../resources/bitcoin.com/mac/pkg/build.cfg build.cfg + +rm build_mas.py +ln -s ../resources/bitcoin.com/mac/pkg/build_mas.py build_mas.py + +echo "Signing ${APP_NAME}" +export APP_PATH="pkg/${APP_NAME}/osx64/${APP_NAME}" +export TMP_PATH="tmp" +export DIST_PATH="dist" + +rm -rf $TMP_PATH +mkdir $TMP_PATH + +if [ ! -d $DIST_PATH ]; then + mkdir $DIST_PATH +fi + +python build_mas.py -C build.cfg -O "${TMP_PATH}/${APP_NAME}.app" -I "${APP_PATH}.app" -P "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" + +echo "Signing Done" + +echo "Done." + +exit diff --git a/app-template/scripts/sign-desktop-dist.sh b/app-template/scripts/sign-desktop-dist.sh new file mode 100644 index 000000000..71a3cf199 --- /dev/null +++ b/app-template/scripts/sign-desktop-dist.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# make sure we are in the correct dir when we double-click a .command file +dir=${0%/*} +if [ -d "$dir" ]; then + cd "$dir" +fi + +APP_PACKAGE=$1 +APP_VERSION=$2 +export DIST_PATH="dist" + +## +# LINUX + +# Sig tar.gz +gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" +gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" + +## +# WINDOWS + +# Sig zip +gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" +gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" + +## +# OSX + +# Sig dmg +gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" +gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" + +# Sig pkg +gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" +gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" \ No newline at end of file diff --git a/resources/bitcoin.com/mac/app.icns b/resources/bitcoin.com/mac/app.icns index 40aa3ea77563668394d907b398d7d8b802581c92..2d97c490830f92347af9a865c63cf39f1e98cd4a 100644 GIT binary patch literal 80461 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

Ey;Kc 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 literal 272024 zcmb@tWmp|g@Gdy#;Of^`^?PUQYU+|T7bC(Y z!yy7HWD`Bmq^uXc_ol`_{U!1d*sQ^Qa3;pR)TJkubNVj-mI$|UOk((Uzgz|N4M+ae>rc|{uWH`s z0UGi^b9~^NgLvV>4DxE$`qE|*&mP9?^|BgxFQQ!+(t*jL%PJ1+EK0#A4rf9j?i@bp zl!xfw&IT^EO|-;|rZ2N|IAC=xSp89!b>b51da6H}ac?gGQ@2`r3g{r~BCYtgFONIx z{ZC9R6+xC;9e`st8Kj!57)<9WH%tMOQ!jL?C^mDrUymdIVur&`go?kfe8pU#R* zD;6pAmXNf`?OCc<7H?Fut1s3p3FoMQ)!&e7HTf8H*+{S*e^}iiclKTv87wFHvO-8y z;h{0nruONSG7c~fpKaV@`1g$CoTn#gEm#4IsJuof3YXC(Z*r0NKq3R%BfU;FL`iPP4SrcMR!N9{w28_^nqze3VuZZxs~xwu)kw+#-O0W>Pin zNGFRSe`Ll+#!vOxJdp^-y8wVZS=^s_X zyWibU(%J6b)zwLQsjmoUD``&t@vzoLUzRAht%q8Qp|>CJ95n260a?f@*Y+7~WrdP? z_&q#q)AFE*)Sn}1QgQlqw<#W~0vu|UztG~v#Q64e25(sjNrV=9#YaahF&3tqNZV zd0HwWe3|`*uWwwpZPhY^@+s+kG&g`ISCG%b7i zr3N0$sAaD?NWJWc^iDl%U=@C4(C4`-z!2U+QsRAJmnRi_j8L(}j`isV9MNtnL{GC* z_YUb{MY?iP*sCbZ&9i@2En+hp4S&FV28|Vel&jS=Hl6*Wc=^1d%KU8zbDv|g%7?al z@iQuLys_WYHum$7F`ohC?s|Cl@`c5Oe%ovDM8`cSoo@g1X4yQPg-!OyT z{NV#Y#zl!rE(j-)h_&bdcmmuG;U&|J3e5VsLb@PiW_y8WYjeC0!TLQP42lXE1lj^+ zU23$@??~47FI*8Lx#nN2zMZ)bS|iO_M6g4;R@$s`rG~bKr%uX(8UXP z98w?rjZxhitN;8(VUco-=IyGTeWSV(e0xEXj}esYQAp2Q$=$@Bv6KRxSL`n*&+w`j z>#kIz25^nFIUI}{eC2(n44TutN0*!l)@tWKgmA3xwm-R)3lrXWYyJ61r@FH{;a64d zjoLYQ&LX?WZo)#})XAACCSQ9ROeK*l&tb5>)7%lnEBf{~l&O()tKn8s4B5+_-(TCu z?r@<&#TEHq18hOQ_m#RxL0Uf(EF#hP&;Ta1!1EC%Mv-PgV;bVJ4YZtfy`XV)ql5P2 zZ4r~~HkmB4-Or(^C~z)Brs<~NoW>6&_G{UfImAX+yl9SfOJuQL|KtX+TgFP$;9>Xh zZyFPsAA|*eX7E<5@`>~-8*V^iChQ^7wCWyw>8e0xGAzb+yddj<{iwK>ASmM z4V|L&+*|MAFew%BFL2zJO#<)-N@;5VjWt4f6Rm{2yhWJx3Sf2fG3;WJp>jR(Uj`;) zc35S{w3jdAxVj8VmDflj4l{7+w77)coiJ#gEgbsDjh2L(K2RL;@@`Wkdc8XojN`I6UHuCFX58S-v%0D+vDTlsC}wQkIk>NMpski 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
ca0{4Ljez2^!qo!AE6LRWrgxWjhp4 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 z%0D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

oE} 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 SK;8y=l@UTS$Uf^`^?PUQYU+|T7bC(Y z!yy7HWD`Bmq^uXc_ol`_{U!1d*sQ^Qa3;pR)TJkubNVj-mI$|UOk((Uzgz|N4M+ae>rc|{uWH`s z0UGi^b9~^NgLvV>4DxE$`qE|*&mP9?^|BgxFQQ!+(t*jL%PJ1+EK0#A4rf9j?i@bp zl!xfw&IT^EO|-;|rZ2N|IAC=xSp89!b>b51da6H}ac?gGQ@2`r3g{r~BCYtgFONIx z{ZC9R6+xC;9e`st8Kj!57)<9WH%tMOQ!jL?C^mDrUymdIVur&`go?kfe8pU#R* zD;6pAmXNf`?OCc<7H?Fut1s3p3FoMQ)!&e7HTf8H*+{S*e^}iiclKTv87wFHvO-8y z;h{0nruONSG7c~fpKaV@`1g$CoTn#gEm#4IsJuof3YXC(Z*r0NKq3R%BfU;FL`iPP4SrcMR!N9{w28_^nqze3VuZZxs~xwu)kw+#-O0W>Pin zNGFRSe`Ll+#!vOxJdp^-y8wVZS=^s_X zyWibU(%J6b)zwLQsjmoUD``&t@vzoLUzRAht%q8Qp|>CJ95n260a?f@*Y+7~WrdP? z_&q#q)AFE*)Sn}1QgQlqw<#W~0vu|UztG~v#Q64e25(sjNrV=9#YaahF&3tqNZV zd0HwWe3|`*uWwwpZPhY^@+s+kG&g`ISCG%b7i zr3N0$sAaD?NWJWc^iDl%U=@C4(C4`-z!2U+QsRAJmnRi_j8L(}j`isV9MNtnL{GC* z_YUb{MY?iP*sCbZ&9i@2En+hp4S&FV28|Vel&jS=Hl6*Wc=^1d%KU8zbDv|g%7?al z@iQuLys_WYHum$7F`ohC?s|Cl@`c5Oe%ovDM8`cSoo@g1X4yQPg-!OyT z{NV#Y#zl!rE(j-)h_&bdcmmuG;U&|J3e5VsLb@PiW_y8WYjeC0!TLQP42lXE1lj^+ zU23$@??~47FI*8Lx#nN2zMZ)bS|iO_M6g4;R@$s`rG~bKr%uX(8UXP z98w?rjZxhitN;8(VUco-=IyGTeWSV(e0xEXj}esYQAp2Q$=$@Bv6KRxSL`n*&+w`j z>#kIz25^nFIUI}{eC2(n44TutN0*!l)@tWKgmA3xwm-R)3lrXWYyJ61r@FH{;a64d zjoLYQ&LX?WZo)#})XAACCSQ9ROeK*l&tb5>)7%lnEBf{~l&O()tKn8s4B5+_-(TCu z?r@<&#TEHq18hOQ_m#RxL0Uf(EF#hP&;Ta1!1EC%Mv-PgV;bVJ4YZtfy`XV)ql5P2 zZ4r~~HkmB4-Or(^C~z)Brs<~NoW>6&_G{UfImAX+yl9SfOJuQL|KtX+TgFP$;9>Xh zZyFPsAA|*eX7E<5@`>~-8*V^iChQ^7wCWyw>8e0xGAzb+yddj<{iwK>ASmM z4V|L&+*|MAFew%BFL2zJO#<)-N@;5VjWt4f6Rm{2yhWJx3Sf2fG3;WJp>jR(Uj`;) zc35S{w3jdAxVj8VmDflj4l{7+w77)coiJ#gEgbsDjh2L(K2RL;@@`Wkdc8XojN`I6UHuCFX58S-v%0D+vDTlsC}wQkIk>NMpski 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
ca0{4Ljez2^!qo!AE6LRWrgxWjhp4 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 z%0D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

oE} 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 SK;8y=l@UTS$U Date: Tue, 19 Jun 2018 18:29:04 +0200 Subject: [PATCH 067/166] final:desktop --- app-template/package-template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-template/package-template.json b/app-template/package-template.json index d6f8aceb8..a0d4228df 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -110,7 +110,7 @@ "final:ios": "npm run final:www && npm run build:ios-release && npm run open:ios", "final:android": "npm run final:www && npm run build:android-release && npm run sign:android && npm run run:android-release", "final:windows": "npm run final:www && npm run build:windows-release", - "final:desktop": "npm run build:desktop && npm run build:osx", + "final:desktop": "grunt desktop-release", "run:android": "cordova run android --device", "run:android-release": "cordova run android --device --release", "log:android": "adb logcat | grep chromium", From aed4e964cbefdb6b023093847a5ef327851c7941 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 19 Jun 2018 18:46:56 +0200 Subject: [PATCH 068/166] Improvement 335 - Move files --- app-template/apply.js | 8 ++++---- app-template/{scripts => }/create-dmg-dist.sh | 0 app-template/{scripts => }/create-others-dist.sh | 0 app-template/{scripts => }/create-pkg-dist.sh | 0 app-template/{scripts => }/sign-desktop-dist.sh | 4 ++++ 5 files changed, 8 insertions(+), 4 deletions(-) rename app-template/{scripts => }/create-dmg-dist.sh (100%) rename app-template/{scripts => }/create-others-dist.sh (100%) rename app-template/{scripts => }/create-pkg-dist.sh (100%) rename app-template/{scripts => }/sign-desktop-dist.sh (94%) diff --git a/app-template/apply.js b/app-template/apply.js index f763602fd..143cf57a8 100755 --- a/app-template/apply.js +++ b/app-template/apply.js @@ -11,10 +11,10 @@ var templates = { 'ionic.config.json': '/', '.desktop': 'webkitbuilds/', 'setup-win.iss': 'webkitbuilds/', - 'scripts/create-dmg-dist.sh': 'webkitbuilds/', - 'scripts/create-others-dist.sh': 'webkitbuilds/', - 'scripts/create-pkg-dist.sh': 'webkitbuilds/', - 'scripts/sign-desktop-dist.sh': 'webkitbuilds/', + 'create-dmg-dist.sh': 'webkitbuilds/', + 'create-others-dist.sh': 'webkitbuilds/', + 'create-pkg-dist.sh': 'webkitbuilds/', + 'sign-desktop-dist.sh': 'webkitbuilds/', 'manifest.json': 'chrome-app/', // 'bower.json': '/', }; diff --git a/app-template/scripts/create-dmg-dist.sh b/app-template/create-dmg-dist.sh similarity index 100% rename from app-template/scripts/create-dmg-dist.sh rename to app-template/create-dmg-dist.sh diff --git a/app-template/scripts/create-others-dist.sh b/app-template/create-others-dist.sh similarity index 100% rename from app-template/scripts/create-others-dist.sh rename to app-template/create-others-dist.sh diff --git a/app-template/scripts/create-pkg-dist.sh b/app-template/create-pkg-dist.sh similarity index 100% rename from app-template/scripts/create-pkg-dist.sh rename to app-template/create-pkg-dist.sh diff --git a/app-template/scripts/sign-desktop-dist.sh b/app-template/sign-desktop-dist.sh similarity index 94% rename from app-template/scripts/sign-desktop-dist.sh rename to app-template/sign-desktop-dist.sh index 71a3cf199..54cfc933b 100644 --- a/app-template/scripts/sign-desktop-dist.sh +++ b/app-template/sign-desktop-dist.sh @@ -10,6 +10,10 @@ APP_PACKAGE=$1 APP_VERSION=$2 export DIST_PATH="dist" +## +# INIT GPG (YOU NEED THE PRIVATE KEY CONNECTED TO YOUR DESKTOP) +gpg --card-edit + ## # LINUX From 4712b672edcec2981d8dba15cc1558706bfc0b58 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Wed, 20 Jun 2018 20:20:48 +1200 Subject: [PATCH 069/166] More consistent spacing on home tab. --- src/sass/views/tab-home.scss | 3 --- www/views/tab-home.html | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index cac1e688d..46fb15224 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -37,9 +37,6 @@ padding-top: 1.5rem; padding-bottom: 1.5rem; } - &.compact-subtitle { - padding-bottom: 0; - } } .item-sub { &:first-child:before { diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 6734836f7..4f044f3d2 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -56,7 +56,7 @@

-
+
-
+
Bitcoin Core (BTC)
Slow transactions with high fees
From 4811a487591a38ec26df4463bc1232b0936b44a9 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Wed, 20 Jun 2018 20:22:54 +1200 Subject: [PATCH 070/166] More consistent spacing in wallet selector. --- src/sass/views/includes/walletSelector.scss | 3 --- www/views/includes/walletSelector.html | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/sass/views/includes/walletSelector.scss b/src/sass/views/includes/walletSelector.scss index d69676adc..e987aaf9b 100644 --- a/src/sass/views/includes/walletSelector.scss +++ b/src/sass/views/includes/walletSelector.scss @@ -12,9 +12,6 @@ wallet-selector { font-weight: bold; padding-bottom: 10px; border-bottom: 1px solid #EFEFEF; - &.compact-subtitle { - padding-bottom: 0; - } .subtitle { color: $v-mid-gray; font-size: $font-size-small; diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index ad3acf9e5..f0e4516fd 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -7,7 +7,7 @@
{{title}}
-
+
Bitcoin Cash (BCH)
Instant transactions with low fees
@@ -39,7 +39,7 @@
-
+
Bitcoin Core (BTC)
Slow transactions with high fees
From 94dade8463791971ef9aaf72886ca2bf66a8bc05 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 20 Jun 2018 14:09:43 +0200 Subject: [PATCH 071/166] changed qr icons to include white border --- www/img/icon-qr-bch.png | Bin 38527 -> 28133 bytes www/img/icon-qr-btc.png | Bin 51798 -> 45106 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/www/img/icon-qr-bch.png b/www/img/icon-qr-bch.png index 98d388074c8a99e7317bf4c2db5a4963be67fdbd..5667896636927ebf5b7ec22af73064ffcab75545 100644 GIT binary patch literal 28133 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%0ADk6WNBM#R;Y{)rW$SW#(8%sai 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 z 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≶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�Tua2~ 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 From bbf37007695e32fe8eda8658d6ab89ab530849a2 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 20 Jun 2018 14:24:37 +0200 Subject: [PATCH 072/166] Always set showingPaymentReceived to false when entering tab --- src/js/controllers/tab-receive.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 8100222f6..d143fe98f 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -221,14 +221,11 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }); $scope.$on("$ionicView.enter", function(event, data) { + $scope.showingPaymentReceived = false; $ionicNavBarDelegate.showBar(true); }); $scope.$on("$ionicView.leave", function(event, data) { - if ($scope.showingPaymentReceived) { - $scope.showingPaymentReceived = false; - } - lodash.each(listeners, function(x) { x(); }); From a3a9c349c79d9acace3913a5eaa6637e39a889af Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 21 Jun 2018 10:18:17 +0900 Subject: [PATCH 073/166] 335 - Improvement - Move script's files. --- app-template/apply.js | 8 ++++---- app-template/{scripts => }/create-dmg-dist.sh | 0 app-template/{scripts => }/create-others-dist.sh | 0 app-template/{scripts => }/create-pkg-dist.sh | 0 app-template/{scripts => }/sign-desktop-dist.sh | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename app-template/{scripts => }/create-dmg-dist.sh (100%) rename app-template/{scripts => }/create-others-dist.sh (100%) rename app-template/{scripts => }/create-pkg-dist.sh (100%) rename app-template/{scripts => }/sign-desktop-dist.sh (100%) diff --git a/app-template/apply.js b/app-template/apply.js index f763602fd..143cf57a8 100755 --- a/app-template/apply.js +++ b/app-template/apply.js @@ -11,10 +11,10 @@ var templates = { 'ionic.config.json': '/', '.desktop': 'webkitbuilds/', 'setup-win.iss': 'webkitbuilds/', - 'scripts/create-dmg-dist.sh': 'webkitbuilds/', - 'scripts/create-others-dist.sh': 'webkitbuilds/', - 'scripts/create-pkg-dist.sh': 'webkitbuilds/', - 'scripts/sign-desktop-dist.sh': 'webkitbuilds/', + 'create-dmg-dist.sh': 'webkitbuilds/', + 'create-others-dist.sh': 'webkitbuilds/', + 'create-pkg-dist.sh': 'webkitbuilds/', + 'sign-desktop-dist.sh': 'webkitbuilds/', 'manifest.json': 'chrome-app/', // 'bower.json': '/', }; diff --git a/app-template/scripts/create-dmg-dist.sh b/app-template/create-dmg-dist.sh similarity index 100% rename from app-template/scripts/create-dmg-dist.sh rename to app-template/create-dmg-dist.sh diff --git a/app-template/scripts/create-others-dist.sh b/app-template/create-others-dist.sh similarity index 100% rename from app-template/scripts/create-others-dist.sh rename to app-template/create-others-dist.sh diff --git a/app-template/scripts/create-pkg-dist.sh b/app-template/create-pkg-dist.sh similarity index 100% rename from app-template/scripts/create-pkg-dist.sh rename to app-template/create-pkg-dist.sh diff --git a/app-template/scripts/sign-desktop-dist.sh b/app-template/sign-desktop-dist.sh similarity index 100% rename from app-template/scripts/sign-desktop-dist.sh rename to app-template/sign-desktop-dist.sh From 0a419ac7c509df6b0070a435ed6c9c859991928b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 21 Jun 2018 15:56:45 +0900 Subject: [PATCH 074/166] 335 - Improvement - replace signature files --- app-template/sign-desktop-dist.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app-template/sign-desktop-dist.sh b/app-template/sign-desktop-dist.sh index 54cfc933b..67d75550e 100644 --- a/app-template/sign-desktop-dist.sh +++ b/app-template/sign-desktop-dist.sh @@ -18,23 +18,23 @@ gpg --card-edit # LINUX # Sig tar.gz -gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" +gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" ## # WINDOWS # Sig zip -gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" +gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" ## # OSX # Sig dmg -gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" +gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg" # Sig pkg -gpg --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" +gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg" \ No newline at end of file From 32ab2e283342d7eb379c967ebc2aaddde06a2971 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Thu, 21 Jun 2018 15:57:27 +0900 Subject: [PATCH 075/166] 335 - Improvement - card edit in comment --- app-template/sign-desktop-dist.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-template/sign-desktop-dist.sh b/app-template/sign-desktop-dist.sh index 67d75550e..e1e5c603c 100644 --- a/app-template/sign-desktop-dist.sh +++ b/app-template/sign-desktop-dist.sh @@ -12,7 +12,7 @@ export DIST_PATH="dist" ## # INIT GPG (YOU NEED THE PRIVATE KEY CONNECTED TO YOUR DESKTOP) -gpg --card-edit +# gpg --card-edit ## # LINUX From ce580fcff1b54f90843a0b1e7df9457e40a769fc Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 22 Jun 2018 11:39:16 +0900 Subject: [PATCH 076/166] 335 - improvement - Change a hard link for a relative link --- resources/bitcoin.com/mac/pkg/build.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/bitcoin.com/mac/pkg/build.cfg b/resources/bitcoin.com/mac/pkg/build.cfg index c4c840b94..3594a2688 100644 --- a/resources/bitcoin.com/mac/pkg/build.cfg +++ b/resources/bitcoin.com/mac/pkg/build.cfg @@ -23,7 +23,7 @@ NWTeamID = 299HJ3G3BP [Resources] ## [OPTIONAL] Your custom icon file -Icon = /Users/jean-baptistedominguez/Documents/projects/wallet-ionic/resources/bitcoin.com/mac/app.icns +Icon = ../resources/bitcoin.com/mac/pkg/app.icns ## [OPTIONAL] Locales ## If Locales is not set, all current locales are preserved. ## If comma separated locale list (e.g. en,fr,zh_CN) is given, you should have From 7b2467a793377c0af619f14c5f8eb21aeebcff84 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 22 Jun 2018 16:16:26 +1200 Subject: [PATCH 077/166] Added Catalan and Russian translations. --- i18n/po/ca/template-ca.po | 3634 +++++++++++++++++++++++++++++++ i18n/po/cs/template-cs.po | 16 +- i18n/po/de/template-de.po | 30 +- i18n/po/es-ES/template-es-ES.po | 2 +- i18n/po/fa/template-fa.po | 10 +- i18n/po/fr/template-fr.po | 2 +- i18n/po/it/template-it.po | 2 +- i18n/po/ja/template-ja.po | 2 +- i18n/po/ko/template-ko.po | 2 +- i18n/po/nl/template-nl.po | 2 +- i18n/po/pl/template-pl.po | 2 +- i18n/po/pt-BR/template-pt-BR.po | 2 +- i18n/po/ru/template-ru.po | 304 +-- i18n/po/sv-SE/template-sv-SE.po | 74 +- i18n/po/vi/template-vi.po | 10 +- i18n/po/zh-CN/template-zh-CN.po | 2 +- src/js/services/uxLanguage.js | 8 + 17 files changed, 3873 insertions(+), 231 deletions(-) create mode 100644 i18n/po/ca/template-ca.po diff --git a/i18n/po/ca/template-ca.po b/i18n/po/ca/template-ca.po new file mode 100644 index 000000000..f7f513bc2 --- /dev/null +++ b/i18n/po/ca/template-ca.po @@ -0,0 +1,3634 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: bitcoincom-wallet\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: bitcoincom-wallet\n" +"X-Crowdin-Language: ca\n" +"X-Crowdin-File: template.pot\n" +"Last-Translator: emilold\n" +"Language-Team: Catalan\n" +"Language: ca\n" +"PO-Revision-Date: 2018-06-22T04:02:43+0000\n" + +#: www/views/modals/paypro.html:34 +msgid "(Trusted)" +msgstr "(De confiança)" + +#: www/views/includes/txp.html:23 +#: www/views/includes/walletHistory.html:64 +msgid "(possible double spend)" +msgstr "(possible doble despesa)" + +#: www/views/modals/txp-details.html:159 +msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." +msgstr "* Una proposta de pagament es pot suprimir si 1) en sou el creador i si cap altre copagador l'ha firmat, o 2) si han passat 24 hores des de la creació de la proposta." + +#: www/views/tx-details.html:82 +msgid "- {{btx.feeRateStr}} of the transaction" +msgstr "- {{btx.feeRateStr}} de la transacció" + +#: www/views/modals/txp-details.html:102 +msgid "- {{tx.feeRateStr}} of the transaction" +msgstr "- {{tx.feeRateStr}} de la transacció" + +#: www/views/feedback/rateApp.html:7 +msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!" +msgstr "Una valoració de 5 estrelles ens ajuda a ampliar la utilització de {{appName}}. Com més usuaris tingui, més recursos es podran dedicar a l'aplicació!" + +#: www/views/mercadoLibre.html:18 +#: www/views/mercadoLibre.html:40 +msgid "Only redeemable on Mercado Livre (Brazil)" +msgstr "Només bescanviable a Mercado Livre (Brasil)" + +#: src/js/controllers/feedback/send.js:27 +#: www/views/feedback/complete.html:21 +msgid "A member of the team will review your feedback as soon as possible." +msgstr "Un membre de l'equip revisarà els vostres comentaris al més aviat possible." + +#: src/js/controllers/confirm.js:401 +msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." +msgstr "S'han exclòs un total de {{amountAboveMaxSizeStr}}. S'ha superat el màxim permès per a una transacció." + +#: src/js/controllers/confirm.js:395 +msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." +msgstr "S'han exclòs un total de {{amountBelowFeeStr}}. Aquests fons provenen d'UTXOs més petits que la comissió de xarxa prevista." + +#: src/js/controllers/preferencesAbout.js:6 +#: www/views/tab-settings.html:156 +msgid "About" +msgstr "Informació" + +#: src/js/controllers/modals/txpDetails.js:62 +#: src/js/controllers/tx-details.js:79 +msgid "Accepted" +msgstr "Acceptada" + +#: www/views/preferencesInformation.html:72 +msgid "Account" +msgstr "Compte" + +#: www/views/join.html:72 +#: www/views/tab-create-personal.html:45 +#: www/views/tab-create-shared.html:74 +#: www/views/tab-import-hardware.html:19 +msgid "Account Number" +msgstr "Número de compte" + +#: www/views/preferencesBitpayServices.html:23 +msgid "Accounts" +msgstr "Comptes" + +#: www/views/bitpayCard.html:56 +msgid "Activity" +msgstr "Activitat" + +#: src/js/services/bitpayAccountService.js:83 +msgid "Add Account" +msgstr "Afegeix un compte" + +#: src/js/services/bitpayAccountService.js:69 +msgid "Add BitPay Account?" +msgstr "Voleu afegir un compte de BitPay?" + +#: www/views/addressbook.add.html:4 +#: www/views/addressbook.html:22 +msgid "Add Contact" +msgstr "Afegeix un contacte" + +#: www/views/bitpayCard.html:28 +msgid "Add Funds" +msgstr "Afegeix fons" + +#: www/views/confirm.html:94 +msgid "Add Memo" +msgstr "Afegeix una nota" + +#: www/views/join.html:87 +#: www/views/tab-create-personal.html:59 +#: www/views/tab-create-shared.html:88 +msgid "Add a password" +msgstr "Afegiu una contrasenya" + +#: www/views/includes/accountSelector.html:27 +msgid "Add account" +msgstr "Afegeix un compte" + +#: www/views/join.html:90 +#: www/views/tab-create-personal.html:62 +#: www/views/tab-create-shared.html:91 +msgid "Add an optional password to secure the recovery phrase" +msgstr "Afegeix una contrasenya opcional per assegurar la frase de recuperació" + +#: www/views/includes/incomingDataMenu.html:41 +msgid "Add as a contact" +msgstr "Afegeix com a contacte" + +#: src/js/controllers/confirm.js:424 +msgid "Add description" +msgstr "Afegeix una descripció" + +#: www/views/topup.html:6 +msgid "Add funds" +msgstr "Afegeix fons" + +#: src/js/services/bitpayAccountService.js:78 +msgid "Add this BitPay account ({{email}})?" +msgstr "Voleu afegir aquest compte de BitPay ({{email}})?" + +#: www/views/add.html:3 +msgid "Add wallet" +msgstr "Afegeix una cartera" + +#: www/views/addressbook.view.html:26 +#: www/views/customAmount.html:28 +#: www/views/modals/paypro.html:24 +msgid "Address" +msgstr "Adreça" + +#: www/views/addressbook.html:6 +#: www/views/tab-settings.html:13 +msgid "Address Book" +msgstr "Llibreta d'adreces" + +#: www/views/preferencesInformation.html:41 +msgid "Address Type" +msgstr "Tipus d'adreça" + +#: www/views/addresses.html:64 +msgid "Addresses With Balance" +msgstr "Adreces amb saldo" + +#: www/views/tab-settings.html:149 +msgid "Advanced" +msgstr "Avançats" + +#: www/views/advancedSettings.html:3 +msgid "Advanced Settings" +msgstr "Paràmetres avançats" + +#: www/views/bitpayCard.html:62 +msgid "All" +msgstr "Tots" + +#: www/views/allAddresses.html:3 +msgid "All Addresses" +msgstr "Totes les adreces" + +#: www/views/modals/wallet-balance.html:18 +msgid "All of your bitcoin wallet balance may not be available for immediate spending." +msgstr "És possible que no tot el saldo de la vostra cartera de bitcoins estigui disponible per a despeses immediates." + +#: www/views/tab-receive.html:25 +msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." +msgstr "Tots els dispositius dels firmants s'han d'afegir a aquesta cartera multifirma abans que es puguin crear adreces bitcoin." + +#: www/views/tab-scan.html:21 +msgid "Allow Camera Access" +msgstr "Permet l'accés a la càmera" + +#: www/views/onboarding/notifications.html:7 +msgid "Allow notifications" +msgstr "Permet les notificacions" + +#: www/views/onboarding/disclaimer.html:14 +msgid "Almost done! Let's review." +msgstr "Gairebé ja estem! Repassem-ho." + +#: www/views/preferencesAltCurrency.html:4 +#: www/views/tab-settings.html:79 +msgid "Alternative Currency" +msgstr "Moneda alternativa" + +#: src/js/controllers/buyAmazon.js:98 +msgid "Amazon.com is not available at this moment. Please try back later." +msgstr "Amazon.com no està disponible en aquest moment. Torneu-ho a provar més tard." + +#: www/views/amount.html:44 +#: www/views/customAmount.html:34 +#: www/views/includes/output.html:7 +msgid "Amount" +msgstr "Import" + +#: src/js/services/bwcError.js:110 +msgid "Amount below minimum allowed" +msgstr "Import inferior al mínim permès" + +#: src/js/controllers/confirm.js:216 +msgid "Amount too big" +msgstr "Import massa gran" + +#: www/views/includes/walletHistory.html:31 +msgid "Amount too low to spend" +msgstr "Import massa petit per gastar-lo" + +#: src/js/controllers/tab-home.js:147 +msgid "An update to this app is available. For your security, please update to the latest version." +msgstr "Hi ha una actualització d'aquesta aplicació. Per seguretat, actualitzeu-la amb la darrera versió." + +#: www/views/backupWarning.html:14 +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "Qualsevol persona que tingui la vostra frase de seguretat pot gastar els vostres bitcoins o accedir-hi." + +#: www/views/addresses.html:94 +msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" +msgstr "Comissió aproximada de la de xarxa Bitcoin per transferir el saldo de la cartera (amb prioritat normal)" + +#: www/views/backupWarning.html:10 +msgid "Are you being watched?" +msgstr "Us vigilen?" + +#: src/js/controllers/preferencesExternal.js:15 +msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin." +msgstr "Us vigilen? Qualsevol persona que tingui la vostra frase de recuperació pot gastar els vostres bitcoins o accedir-hi." + +#: src/js/controllers/copayers.js:56 +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "Segur que voleu cancel·lar i suprimir aquesta cartera?" + +#: src/js/controllers/addressbookView.js:37 +msgid "Are you sure you want to delete this contact?" +msgstr "Segur que voleu suprimir aquest contacte?" + +#: src/js/controllers/preferencesDelete.js:25 +msgid "Are you sure you want to delete this wallet?" +msgstr "Segur que voleu suprimir aquesta cartera?" + +#: src/js/controllers/modals/txpDetails.js:154 +msgid "Are you sure you want to reject this transaction?" +msgstr "Segur que voleu rebutjar aquesta transacció?" + +#: src/js/controllers/modals/txpDetails.js:171 +msgid "Are you sure you want to remove this transaction?" +msgstr "Segur que voleu suprimir aquesta transacció?" + +#: src/js/controllers/onboarding/backupRequest.js:23 +msgid "Are you sure you want to skip it?" +msgstr "Segur que el voleu ometre?" + +#: www/views/modals/bitpay-card-confirmation.html:4 +msgid "Are you sure you would like to log out of your BitPay Card account?" +msgstr "Segur que voleu sortir del compte BitPay Card?" + +#: src/js/controllers/preferencesBitpayCard.js:7 +#: src/js/controllers/preferencesBitpayServices.js:20 +msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" +msgstr "Segur que voleu suprimir la BitPay Card ({{lastFourDigits}}) d'aquest dispositiu?" + +#: www/views/includes/walletInfo.html:10 +msgid "Auditable" +msgstr "Auditable" + +#: www/views/modals/wallet-balance.html:42 +msgid "Available" +msgstr "Disponible" + +#: www/views/includes/available-balance.html:3 +msgid "Available Balance" +msgstr "Saldo disponible" + +#: www/views/modals/chooseFeeLevel.html:24 +#: www/views/preferencesFee.html:15 +msgid "Average confirmation time" +msgstr "Temps de mitjà de confirmació" + +#: www/views/join.html:143 +#: www/views/tab-create-personal.html:113 +#: www/views/tab-create-shared.html:142 +#: www/views/tab-import-phrase.html:51 +msgid "BIP32 path for address derivation" +msgstr "Camí BIP32 per a la derivació de l'adreça" + +#: www/views/cashScan.html:25 +msgid "BTC wallets" +msgstr "Carteres BTC" + +#: www/views/preferences.html:34 +msgid "Backup" +msgstr "Còpia de seguretat" + +#: www/views/includes/backupNeededPopup.html:7 +msgid "Backup Needed" +msgstr "Cal còpia de seguretat" + +#: src/js/controllers/lockSetup.js:87 +msgid "Backup all livenet wallets before using this function" +msgstr "Feu còpia de seguretat de totes les carteres (livenet) abans de fer servir aquesta funció" + +#: src/js/controllers/cashScan.js:64 +#: www/views/includes/walletListSettings.html:12 +#: www/views/preferences.html:36 +msgid "Backup needed" +msgstr "Cal còpia de seguretat" + +#: www/views/includes/backupNeededPopup.html:9 +msgid "Backup now" +msgstr "Feu còpia de seguretat ara" + +#: www/views/onboarding/backupRequest.html:11 +#: www/views/tab-export-file.html:89 +msgid "Backup wallet" +msgstr "Fes còpia de seguretat de la cartera" + +#: src/js/controllers/lockSetup.js:84 +msgid "Backup your wallet before using this function" +msgstr "Feu còpia de seguretat de la cartera abans de fer servir aquesta funció" + +#: src/js/services/profileService.js:446 +msgid "Bad wallet invitation" +msgstr "Invitació de cartera incorrecta" + +#: www/views/preferencesInformation.html:102 +msgid "Balance By Address" +msgstr "Saldo per adreça" + +#: www/views/includes/confirmBackupPopup.html:7 +msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." +msgstr "Sobretot, deseu la vostra frase de recuperació en un lloc segur. Si se suprimeix aquesta aplicació, no podreu recuperar els diners sense la frase." + +#: www/views/preferencesBitpayServices.html:9 +msgid "BitPay Visa® Cards" +msgstr "Targetes BitPay Visa®" + +#: www/views/addressbook.add.html:38 +#: www/views/includes/incomingDataMenu.html:29 +msgid "Bitcoin Address" +msgstr "Adreça Bitcoin" + +#: www/views/cashScan.html:4 +msgid "Bitcoin Cash (BCH) Balances" +msgstr "Saldos Bitcoin Cash (BCH)" + +#: www/views/preferencesCash.html:3 +#: www/views/tab-settings.html:47 +msgid "Bitcoin Cash Support" +msgstr "Assistència Bitcoin Cash" + +#: www/views/tab-home.html:98 +#: www/views/tab-settings.html:115 +msgid "Bitcoin Cash Wallets" +msgstr "Carteres Bitcoin Cash" + +#: www/views/modals/chooseFeeLevel.html:4 +#: www/views/preferencesFee.html:4 +#: www/views/tab-settings.html:90 +msgid "Bitcoin Network Fee Policy" +msgstr "Política de comissions de la xarxa Bitcoin" + +#: www/views/tab-home.html:83 +#: www/views/tab-settings.html:107 +msgid "Bitcoin Core Wallets" +msgstr "Carteres Bitcoin Core" + +#: src/js/services/incomingData.js:151 +msgid "Bitcoin cash Payment" +msgstr "Pagament en Bitcoin Cash" + +#: www/views/onboarding/tour.html:31 +msgid "Bitcoin is a currency." +msgstr "Bitcoin és una moneda." + +#: www/views/onboarding/disclaimer.html:15 +msgid "Bitcoin is different – it cannot be safely held with a bank or web service." +msgstr "Bitcoin és diferent – no es pot guardar amb seguretat en un banc o servei web." + +#: www/views/onboarding/tour.html:18 +msgid "Bitcoin is secure,
digital money." +msgstr "Bitcoin es una moneda,
digital segura." + +#: www/views/preferencesFee.html:11 +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "Les transaccions de bitcoins inclouen una comissió que cobren els miners de la xarxa." + +#: www/views/buyAmazon.html:108 +msgid "Bought {{amountUnitStr}}" +msgstr "{{amountUnitStr}} comprats" + +#: www/views/modals/txp-details.html:36 +msgid "Broadcast Payment" +msgstr "Emet el pagament" + +#: src/js/controllers/modals/txpDetails.js:64 +#: src/js/controllers/tx-details.js:81 +msgid "Broadcasted" +msgstr "Emès" + +#: src/js/services/onGoingProcess.js:11 +msgid "Broadcasting transaction" +msgstr "S'està emetent la transacció" + +#: www/views/unsupported.html:6 +msgid "Browser unsupported" +msgstr "Navegador no compatible" + +#: www/views/buyAmazon.html:5 +#: www/views/buyMercadoLibre.html:6 +msgid "Buy" +msgstr "Compra" + +#: www/views/includes/buyAndSellCard.html:3 +msgid "Buy & Sell Bitcoin" +msgstr "Compra & ven bitcoins" + +#: www/views/tab-send.html:35 +msgid "Buy Bitcoin" +msgstr "Compra bitcoins" + +#: www/views/mercadoLibre.html:22 +#: www/views/mercadoLibre.html:50 +msgid "Buy a Gift Card" +msgstr "Compra una targeta regal" + +#: src/js/controllers/buyAmazon.js:334 +msgid "Buy from" +msgstr "Compra des de" + +#: src/js/services/onGoingProcess.js:40 +msgid "Buying Bitcoin..." +msgstr "S'estan comprant bitcoins..." + +#: src/js/services/onGoingProcess.js:12 +msgid "Calculating fee" +msgstr "S'està calculant la comissió" + +#: src/js/controllers/buyAmazon.js:313 +#: src/js/controllers/buyMercadoLibre.js:307 +#: src/js/controllers/confirm.js:550 +#: src/js/controllers/topup.js:287 +#: src/js/services/incomingData.js:154 +#: src/js/services/popupService.js:62 +#: src/js/services/popupService.js:73 +#: www/views/addressbook.add.html:10 +#: www/views/feedback/send.html:5 +#: www/views/includes/incomingDataMenu.html:22 +#: www/views/includes/incomingDataMenu.html:54 +#: www/views/includes/incomingDataMenu.html:73 +#: www/views/includes/incomingDataMenu.html:97 +#: www/views/includes/note.html:6 +#: www/views/modals/bitpay-card-confirmation.html:8 +#: www/views/modals/confirmation.html:13 +msgid "Cancel" +msgstr "Cancel·la" + +#: www/views/copayers.html:36 +msgid "Cancel invitation" +msgstr "Cancel·la la invitació" + +#: src/js/controllers/onboarding/tour.js:52 +msgid "Cannot Create Wallet" +msgstr "No es pot crear la cartera" + +#: src/js/services/profileService.js:442 +msgid "Cannot join the same wallet more that once" +msgstr "No us podeu unir a la mateixa cartera més d'un cop" + +#: www/views/includes/bitpayCardsCard.html:2 +msgid "Cards" +msgstr "Targetes" + +#: www/views/modals/paypro.html:30 +msgid "Certified by" +msgstr "Certificat per" + +#: www/views/preferencesExternal.html:19 +msgid "Check installation and retry." +msgstr "Comproveu la instal·lació i torneu-ho a provar." + +#: www/views/tab-import-file.html:4 +msgid "Choose a backup file from your computer" +msgstr "Trieu un fitxer de còpia de seguretat de l'ordinador" + +#: www/views/modals/wallets.html:9 +msgid "Choose your destination wallet" +msgstr "Trieu la cartera de destinació" + +#: www/views/modals/wallets.html:10 +msgid "Choose your source wallet" +msgstr "Trieu la cartera d'origen" + +#: www/views/backup.html:61 +msgid "Clear" +msgstr "Esborra" + +#: www/views/preferencesHistory.html:24 +msgid "Clear cache" +msgstr "Esborra la memòria cau" + +#: src/js/controllers/confirm.js:373 +#: src/js/controllers/modals/txpDetails.js:49 +msgid "Click to accept" +msgstr "Feu clic per acceptar" + +#: src/js/controllers/confirm.js:367 +msgid "Click to pay" +msgstr "Feu clic per pagar" + +#: src/js/controllers/confirm.js:379 +#: src/js/controllers/modals/txpDetails.js:42 +msgid "Click to send" +msgstr "Feu clic per enviar" + +#: www/views/customAmount.html:4 +#: www/views/modals/mercadolibre-card-details.html:3 +#: www/views/modals/paypro.html:4 +#: www/views/modals/pin.html:3 +#: www/views/modals/search.html:3 +#: www/views/modals/wallet-balance.html:3 +#: www/views/modals/wallets.html:5 +msgid "Close" +msgstr "Tanca" + +#: www/views/includes/cash.html:2 +#: www/views/preferencesInformation.html:17 +msgid "Coin" +msgstr "Moneda" + +#: www/views/preferences.html:22 +msgid "Color" +msgstr "Color" + +#: www/views/preferencesAbout.html:21 +msgid "Commit hash" +msgstr "Hash de confirmació" + +#: www/views/preferences.html:49 +msgid "Complete the backup process to use this option" +msgstr "Completeu el procés de còpia de seguretat per utilitzar aquesta opció" + +#: www/views/bitpayCard.html:93 +msgid "Completed" +msgstr "Completat" + +#: src/js/controllers/buyAmazon.js:311 +#: src/js/controllers/buyMercadoLibre.js:305 +#: src/js/controllers/confirm.js:549 +#: src/js/controllers/copayers.js:55 +#: src/js/controllers/topup.js:285 +#: www/views/backup.html:60 +#: www/views/backup.html:79 +#: www/views/confirm.html:4 +#: www/views/onboarding/collectEmail.html:32 +msgid "Confirm" +msgstr "Confirma" + +#: www/views/modals/terms.html:26 +#: www/views/onboarding/disclaimer.html:44 +msgid "Confirm & Finish" +msgstr "Confirmeu & finalitzeu" + +#: www/views/buyAmazon.html:90 +msgid "Confirm purchase" +msgstr "Confirmeu la compra" + +#: www/views/modals/pin.html:10 +msgid "Confirm your PIN" +msgstr "Confirmeu el PIN" + +#: src/js/services/walletService.js:1033 +msgid "Confirm your new spending password" +msgstr "Confirmeu la nova contrasenya de despeses" + +#: www/views/tx-details.html:98 +msgid "Confirmations" +msgstr "Confirmacions" + +#: www/views/bitpayCard.html:68 +#: www/views/modals/wallet-balance.html:61 +msgid "Confirming" +msgstr "S'està confirmant" + +#: www/views/bitpayCardIntro.html:37 +msgid "Connect my BitPay Card" +msgstr "Connecta la meva BitPay Card" + +#: src/js/services/onGoingProcess.js:13 +msgid "Connecting to Coinbase..." +msgstr "S'està connectant a Coinbase..." + +#: src/js/services/onGoingProcess.js:14 +msgid "Connecting to Glidera..." +msgstr "S'està connectant a Glidera..." + +#: src/js/services/bwcError.js:53 +msgid "Connection reset by peer" +msgstr "Connexió reiniciada per un parell" + +#: www/views/tab-send.html:45 +msgid "Contacts" +msgstr "Contactes" + +#: www/views/onboarding/notifications.html:9 +msgid "Continue" +msgstr "Continua" + +#: www/views/preferencesLanguage.html:26 +msgid "Contribute Translations" +msgstr "Contribuïu a les traduccions" + +#: src/js/controllers/confirm.js:130 +msgid "Copay only supports Bitcoin Cash using new version numbers addresses" +msgstr "Copay només admet Bitcoin Cash si s'utilitza la nova versió d'adreces" + +#: src/js/services/bwcError.js:62 +msgid "Copayer already in this wallet" +msgstr "Copayer ja és en aquesta cartera" + +#: src/js/services/bwcError.js:77 +msgid "Copayer already voted on this spend proposal" +msgstr "Copayer ja ha votat aquesta proposta de despesa" + +#: src/js/services/bwcError.js:107 +msgid "Copayer data mismatch" +msgstr "Discrepància en les dades de Copayer" + +#: www/views/includes/walletActivity.html:2 +msgid "Copayer joined" +msgstr "Copayer s'ha unit" + +#: www/views/preferencesInformation.html:94 +msgid "Copayer {{$index}}" +msgstr "Copayer {{$index}}" + +#: src/js/controllers/copayers.js:79 +#: src/js/controllers/export.js:193 +#: www/views/includes/copyToClipboard.html:4 +msgid "Copied to clipboard" +msgstr "Copiat al porta-retalls" + +#: www/views/tab-export-file.html:94 +msgid "Copy this text as it is to a safe place (notepad or email)" +msgstr "Copieu aquest text tal qual en un lloc segur (bloc de notes o correu electrònic)" + +#: www/views/includes/incomingDataMenu.html:51 +#: www/views/includes/incomingDataMenu.html:70 +#: www/views/includes/incomingDataMenu.html:94 +#: www/views/includes/logOptions.html:9 +#: www/views/tab-export-file.html:78 +msgid "Copy to clipboard" +msgstr "Copia al porta-retalls" + +#: src/js/controllers/buyMercadoLibre.js:102 +msgid "Could not access Gift Card Service" +msgstr "No s'ha pogut accedir al servei de targetes regal" + +#: www/views/tab-import-phrase.html:2 +msgid "Could not access the wallet at the server. Please check:" +msgstr "No s'ha pogut accedir a la cartera al servidor. Comproveu:" + +#: src/js/controllers/buyAmazon.js:102 +msgid "Could not access to Amazon.com" +msgstr "No s'ha pogut accedir a Amazon.com" + +#: src/js/services/profileService.js:511 +msgid "Could not access wallet" +msgstr "No s'ha pogut accedir a la cartera" + +#: src/js/controllers/confirm.js:210 +msgid "Could not add message to imported wallet without shared encrypting key" +msgstr "No s'ha pogut afegir cap missatge a la cartera importada sense la clau d'encriptatge compartida" + +#: src/js/controllers/modals/txpDetails.js:199 +msgid "Could not broadcast payment" +msgstr "No s'ha pogut emetre el pagament" + +#: src/js/services/bwcError.js:41 +msgid "Could not build transaction" +msgstr "No s'ha pogut generar una transacció" + +#: src/js/services/walletService.js:854 +msgid "Could not create address" +msgstr "No s'ha pogut crear una adreça" + +#: src/js/controllers/topup.js:92 +msgid "Could not create the invoice" +msgstr "No s'ha pogut crear la factura" + +#: src/js/controllers/buyAmazon.js:164 +#: src/js/controllers/buyMercadoLibre.js:164 +#: src/js/controllers/topup.js:142 +msgid "Could not create transaction" +msgstr "No s'ha pogut crear una transacció" + +#: src/js/services/profileService.js:350 +msgid "Could not create using the specified extended private key" +msgstr "No s'ha pogut crear utilitzant la clau privada ampliada especificada" + +#: src/js/services/profileService.js:362 +msgid "Could not create using the specified extended public key" +msgstr "No s'ha pogut crear utilitzant la clau pública ampliada especificada" + +#: src/js/services/profileService.js:338 +msgid "Could not create: Invalid wallet recovery phrase" +msgstr "No s'ha pogut crear: la frase de recuperació de la cartera no és vàlida" + +#: src/js/controllers/import.js:114 +msgid "Could not decrypt file, check your password" +msgstr "No s'ha pogut desencriptar el fitxer; comproveu la contrasenya" + +#: src/js/controllers/modals/txpDetails.js:181 +msgid "Could not delete payment proposal" +msgstr "No s'ha pogut suprimir la proposta de pagament" + +#: src/js/controllers/cashScan.js:117 +msgid "Could not duplicate" +msgstr "No s'ha pogut duplicar" + +#: src/js/services/feeService.js:73 +msgid "Could not get dynamic fee" +msgstr "No s'ha pogut obtenir una comissió dinàmica" + +#: src/js/services/feeService.js:43 +msgid "Could not get dynamic fee for level: {{feeLevel}}" +msgstr "No s'ha pogut obtenir la comissió dinàmica per al nivell: {{feeLevel}}" + +#: src/js/controllers/modals/feeLevels.js:112 +msgid "Could not get fee levels" +msgstr "No s'han pogut obtenir els nivells de comissió" + +#: src/js/controllers/buyAmazon.js:122 +#: src/js/controllers/buyMercadoLibre.js:122 +#: src/js/controllers/topup.js:100 +msgid "Could not get the invoice" +msgstr "No s'ha pogut obtenir la factura" + +#: src/js/controllers/bitpayCard.js:66 +msgid "Could not get transactions" +msgstr "No s'han pogut obtenir les transaccions" + +#: src/js/services/profileService.js:615 +#: src/js/services/profileService.js:650 +#: src/js/services/profileService.js:674 +msgid "Could not import" +msgstr "No s'ha pogut importar" + +#: src/js/services/profileService.js:584 +msgid "Could not import. Check input file and spending password" +msgstr "No s'ha pogut importar. Comproveu el fitxer d'entrada i la contrasenya de despeses" + +#: src/js/services/profileService.js:457 +msgid "Could not join wallet" +msgstr "No s'ha pogut unir a la cartera" + +#: src/js/controllers/modals/txpDetails.js:161 +msgid "Could not reject payment" +msgstr "No s'ha pogut rebutjar el pagament" + +#: src/js/controllers/preferencesBitpayServices.js:33 +msgid "Could not remove account" +msgstr "No s'ha pogut suprimir el compte" + +#: src/js/controllers/preferencesBitpayCard.js:20 +#: src/js/controllers/preferencesBitpayServices.js:50 +msgid "Could not remove card" +msgstr "No s'ha pogut suprimir la targeta" + +#: src/js/services/walletService.js:776 +msgid "Could not save preferences on the server" +msgstr "No s'han pogut desar les preferències al servidor" + +#: src/js/controllers/modals/txpDetails.js:147 +msgid "Could not send payment" +msgstr "No s'ha pogut enviar el pagament" + +#: src/js/controllers/buyAmazon.js:325 +#: src/js/controllers/buyMercadoLibre.js:318 +#: src/js/controllers/topup.js:299 +msgid "Could not send transaction" +msgstr "No s'ha pogut enviar la transacció" + +#: www/views/walletDetails.html:210 +msgid "Could not update transaction history" +msgstr "No s'ha pogut actualitzar l'historial de transaccions" + +#: src/js/controllers/addresses.js:29 +#: src/js/controllers/addresses.js:37 +#: src/js/controllers/copayers.js:30 +#: src/js/controllers/walletDetails.js:78 +msgid "Could not update wallet" +msgstr "No s'ha pogut actualitzar la cartera" + +#: www/views/tab-create-personal.html:3 +msgid "Create Personal Wallet" +msgstr "Crea una cartera personal" + +#: www/views/tab-create-shared.html:3 +msgid "Create Shared Wallet" +msgstr "Crea una cartera compartida" + +#: www/views/onboarding/tour.html:51 +#: www/views/tab-home.html:75 +#: www/views/tab-send.html:36 +msgid "Create bitcoin wallet" +msgstr "Crea una cartera bitcoin" + +#: www/views/tab-create-personal.html:131 +msgid "Create new wallet" +msgstr "Crea una cartera nova" + +#: www/views/add.html:22 +msgid "Create shared wallet" +msgstr "Crea una cartera compartida" + +#: www/views/tab-create-shared.html:160 +msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" +msgstr "Crea una cartera {{formData.requiredCopayers}}-de-{{formData.totalCopayers}}" + +#: www/views/modals/txp-details.html:81 +#: www/views/tx-details.html:60 +msgid "Created by" +msgstr "Creada per" + +#: src/js/services/onGoingProcess.js:18 +msgid "Creating Wallet..." +msgstr "S'està creant la cartera..." + +#: src/js/services/onGoingProcess.js:17 +msgid "Creating transaction" +msgstr "S'està creant la transacció" + +#: www/views/modals/chooseFeeLevel.html:34 +#: www/views/preferencesFee.html:20 +msgid "Current fee rate for this policy" +msgstr "Comissió actual d'aquesta política" + +#: src/js/services/feeService.js:15 +msgid "Custom" +msgstr "Personalitzada" + +#: www/views/customAmount.html:9 +msgid "Custom Amount" +msgstr "Quantitat personalitzada" + +#: src/js/controllers/preferencesFee.js:85 +msgid "Custom Fee" +msgstr "Comissió personalitzada" + +#: www/views/modals/mercadolibre-card-details.html:56 +#: www/views/modals/txp-details.html:87 +#: www/views/tx-details.html:66 +msgid "Date" +msgstr "Data" + +#: www/views/preferencesDeleteWallet.html:21 +msgid "Delete" +msgstr "Suprimeix" + +#: www/views/modals/txp-details.html:164 +msgid "Delete Payment Proposal" +msgstr "Suprimeix la proposta de pagament" + +#: www/views/preferencesAdvanced.html:33 +#: www/views/preferencesDeleteWallet.html:3 +msgid "Delete Wallet" +msgstr "Suprimeix la cartera" + +#: www/views/copayers.html:59 +msgid "Delete it and create a new one" +msgstr "Suprimeix-la i crea'n una de nova" + +#: src/js/services/onGoingProcess.js:19 +msgid "Deleting Wallet..." +msgstr "S'està suprimint la cartera..." + +#: src/js/services/onGoingProcess.js:28 +msgid "Deleting payment proposal" +msgstr "S'està suprimint la proposta de pagament" + +#: www/views/join.html:141 +#: www/views/tab-create-personal.html:111 +#: www/views/tab-create-shared.html:140 +#: www/views/tab-import-phrase.html:49 +msgid "Derivation Path" +msgstr "Camí de derivació" + +#: www/views/preferencesInformation.html:47 +msgid "Derivation Strategy" +msgstr "Estratègia de derivació" + +#: www/views/buyAmazon.html:39 +#: www/views/buyMercadoLibre.html:38 +#: www/views/modals/mercadolibre-card-details.html:6 +#: www/views/topup.html:45 +msgid "Details" +msgstr "Detalls" + +#: src/js/controllers/lockSetup.js:9 +#: src/js/controllers/tab-settings.js:65 +#: www/views/tab-settings.html:50 +msgid "Disabled" +msgstr "Deshabilitat" + +#: www/views/includes/backupNeededPopup.html:10 +#: www/views/onboarding/backupRequest.html:12 +msgid "Do it later" +msgstr "Ho faré més tard" + +#: www/views/tab-export-file.html:29 +msgid "Do not include private key" +msgstr "No incloguis la clau privada" + +#: www/views/preferencesLanguage.html:21 +msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." +msgstr "No la vostra llengua a Crowdin? Poseu-vos en contacte amb el propietari a Crowdin! Ens agradaria molt incloure-hi la vostra llengua." + +#: www/views/tab-export-file.html:59 +#: www/views/tab-home.html:22 +msgid "Download" +msgstr "Descarrega" + +#: www/views/cashScan.html:37 +msgid "Duplicate for BCH" +msgstr "Duplica per BCH" + +#: src/js/services/onGoingProcess.js:49 +msgid "Duplicating wallet..." +msgstr "S'està duplicant la cartera..." + +#: www/views/addresses.html:19 +msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." +msgstr "Cada cartera bitcoin pot generar milers de milions d'adreces a partir de les vostres 12 paraules de seguretat. Cada cop que rebeu un pagament es genera i es mostra una nova adreça automàticament." + +#: src/js/services/feeService.js:13 +msgid "Economy" +msgstr "Econòmic" + +#: www/views/onboarding/collectEmail.html:27 +msgid "Edit" +msgstr "Edita" + +#: www/views/addressbook.add.html:29 +#: www/views/addressbook.view.html:22 +msgid "Email" +msgstr "Correu electrònic" + +#: www/views/preferencesNotifications.html:42 +msgid "Email Address" +msgstr "Adreça electrònica" + +#: src/js/services/bwcError.js:122 +msgid "Empty addresses limit reached. New addresses cannot be generated." +msgstr "S'ha assolit el límit d'adreces buides. No poden generar adreces noves." + +#: www/views/preferencesCash.html:17 +msgid "Enable Bitcoin Cash wallet creation and operation within the App." +msgstr "Habiliteu la creació de la cartera de Bitcoin Cash i la gestió dins de l'aplicació." + +#: www/views/tab-scan.html:19 +msgid "Enable camera access in your device settings to get started." +msgstr "Habiliteu l'accés a la càmera des dels paràmetres del vostre dispositiu per començar." + +#: www/views/preferencesNotifications.html:29 +msgid "Enable email notifications" +msgstr "Habiliteu les notificacions de correu electrònic" + +#: www/views/preferencesNotifications.html:12 +msgid "Enable push notifications" +msgstr "Habiliteu les notificacions push" + +#: www/views/preferencesNotifications.html:33 +msgid "Enable sound" +msgstr "Habiliteu el so" + +#: www/views/tab-scan.html:18 +msgid "Enable the camera to get started." +msgstr "Habiliteu la càmera per començar." + +#: www/views/tab-settings.html:49 +msgid "Enabled" +msgstr "S'ha habilitat" + +#: src/js/services/walletService.js:1047 +#: src/js/services/walletService.js:1062 +msgid "Enter Spending Password" +msgstr "Introduïu la contrasenya de despeses" + +#: src/js/services/bitpayAccountService.js:110 +msgid "Enter Two Factor for your BitPay account" +msgstr "Introduïu l'autenticació de doble factor per al vostre compte BitPay" + +#: www/views/amount.html:4 +msgid "Enter amount" +msgstr "Introduïu la quantitat" + +#: www/views/modals/chooseFeeLevel.html:41 +msgid "Enter custom fee" +msgstr "Introduïu la comissió personalitzada" + +#: src/js/services/walletService.js:1029 +msgid "Enter new spending password" +msgstr "Introduïu la nova contrasenya de despeses" + +#: www/views/join.html:79 +#: www/views/tab-create-personal.html:51 +#: www/views/tab-create-shared.html:80 +msgid "Enter the recovery phrase (BIP39)" +msgstr "Introduïu la frase de recuperació (BIP39)" + +#: www/views/onboarding/collectEmail.html:13 +msgid "Enter your email" +msgstr "Introduïu l'adreça electrònica" + +#: www/views/backup.html:69 +msgid "Enter your password" +msgstr "Introduïu la contrasenya" + +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/activity.js:45 +#: src/js/controllers/addressbookAdd.js:30 +#: src/js/controllers/addressbookView.js:42 +#: src/js/controllers/addresses.js:125 +#: src/js/controllers/addresses.js:126 +#: src/js/controllers/bitpayCard.js:66 +#: src/js/controllers/bitpayCardIntro.js:40 +#: src/js/controllers/bitpayCardIntro.js:81 +#: src/js/controllers/buyAmazon.js:24 +#: src/js/controllers/buyAmazon.js:35 +#: src/js/controllers/buyMercadoLibre.js:24 +#: src/js/controllers/buyMercadoLibre.js:35 +#: src/js/controllers/confirm.js:307 +#: src/js/controllers/copayers.js:67 +#: src/js/controllers/create.js:161 +#: src/js/controllers/create.js:174 +#: src/js/controllers/create.js:180 +#: src/js/controllers/create.js:186 +#: src/js/controllers/create.js:208 +#: src/js/controllers/create.js:215 +#: src/js/controllers/create.js:233 +#: src/js/controllers/export.js:109 +#: src/js/controllers/export.js:115 +#: src/js/controllers/export.js:126 +#: src/js/controllers/export.js:154 +#: src/js/controllers/export.js:160 +#: src/js/controllers/export.js:171 +#: src/js/controllers/export.js:47 +#: src/js/controllers/export.js:53 +#: src/js/controllers/feedback/send.js:23 +#: src/js/controllers/import.js:119 +#: src/js/controllers/import.js:131 +#: src/js/controllers/import.js:149 +#: src/js/controllers/import.js:200 +#: src/js/controllers/import.js:229 +#: src/js/controllers/import.js:238 +#: src/js/controllers/import.js:254 +#: src/js/controllers/import.js:266 +#: src/js/controllers/import.js:278 +#: src/js/controllers/import.js:288 +#: src/js/controllers/import.js:312 +#: src/js/controllers/import.js:325 +#: src/js/controllers/import.js:335 +#: src/js/controllers/import.js:345 +#: src/js/controllers/import.js:369 +#: src/js/controllers/import.js:382 +#: src/js/controllers/import.js:85 +#: src/js/controllers/import.js:98 +#: src/js/controllers/join.js:125 +#: src/js/controllers/join.js:139 +#: src/js/controllers/join.js:145 +#: src/js/controllers/join.js:151 +#: src/js/controllers/join.js:174 +#: src/js/controllers/join.js:182 +#: src/js/controllers/join.js:200 +#: src/js/controllers/modals/feeLevels.js:9 +#: src/js/controllers/modals/txpDetails.js:140 +#: src/js/controllers/paperWallet.js:47 +#: src/js/controllers/preferencesBitpayCard.js:20 +#: src/js/controllers/preferencesBitpayServices.js:33 +#: src/js/controllers/preferencesBitpayServices.js:50 +#: src/js/controllers/preferencesDelete.js:36 +#: src/js/controllers/preferencesExternal.js:20 +#: src/js/controllers/tab-home.js:174 +#: src/js/controllers/tab-send.js:143 +#: src/js/controllers/tabsController.js:36 +#: src/js/controllers/tabsController.js:7 +#: src/js/controllers/topup.js:21 +#: src/js/controllers/topup.js:32 +#: src/js/controllers/tx-details.js:119 +#: src/js/services/incomingData.js:101 +#: src/js/services/incomingData.js:125 +#: src/js/services/incomingData.js:168 +#: www/views/mercadoLibreCards.html:19 +#: www/views/modals/mercadolibre-card-details.html:45 +msgid "Error" +msgstr "Error" + +#: src/js/controllers/confirm.js:502 +msgid "Error at confirm" +msgstr "Error en confirmar" + +#: src/js/controllers/buyAmazon.js:179 +msgid "Error creating gift card" +msgstr "Error en crear la targeta regal" + +#: src/js/controllers/buyAmazon.js:94 +#: src/js/controllers/buyMercadoLibre.js:94 +msgid "Error creating the invoice" +msgstr "Error en crear la factura" + +#: src/js/services/profileService.js:412 +msgid "Error creating wallet" +msgstr "Error en crear la cartera" + +#: src/js/controllers/confirm.js:296 +msgid "Error getting SendMax information" +msgstr "Error en obtenir la informació SendMax" + +#: src/js/controllers/buyAmazon.js:136 +#: src/js/controllers/buyMercadoLibre.js:136 +#: src/js/controllers/topup.js:114 +msgid "Error in Payment Protocol" +msgstr "Error al protocol de pagament" + +#: src/js/controllers/bitpayCardIntro.js:14 +msgid "Error pairing BitPay Account" +msgstr "Error de sincronització amb el compte de BitPay" + +#: src/js/controllers/paperWallet.js:41 +msgid "Error scanning funds:" +msgstr "Error en escanejar els fons:" + +#: src/js/controllers/paperWallet.js:90 +msgid "Error sweeping wallet:" +msgstr "Error en escombrar la cartera:" + +#: src/js/controllers/bitpayCardIntro.js:20 +msgid "Error updating Debit Cards" +msgstr "Error en actualitzar les targetes de dèbit" + +#: src/js/services/bwcError.js:143 +msgid "Exceeded daily limit of $500 per user" +msgstr "Superat el límit diari de 500 $ per usuari" + +#: src/js/controllers/confirm.js:461 +#: www/views/confirm.html:27 +#: www/views/mercadoLibreCards.html:25 +#: www/views/modals/mercadolibre-card-details.html:34 +#: www/views/modals/txp-details.html:119 +msgid "Expired" +msgstr "Caducada" + +#: www/views/modals/paypro.html:54 +#: www/views/modals/txp-details.html:125 +msgid "Expires" +msgstr "Caduca el" + +#: www/views/preferencesAdvanced.html:21 +msgid "Export Wallet" +msgstr "Exporta la cartera" + +#: www/views/preferencesHistory.html:11 +#: www/views/preferencesHistory.html:14 +msgid "Export to file" +msgstr "Exporta a un fitxer" + +#: www/views/export.html:3 +msgid "Export wallet" +msgstr "Exporta la cartera" + +#: src/js/services/walletService.js:1174 +#: www/views/tab-export-qrCode.html:9 +msgid "Exporting via QR not supported for this wallet" +msgstr "Aquesta cartera no admet l'exportació mitjançant QR" + +#: www/views/preferencesInformation.html:89 +msgid "Extended Public Keys" +msgstr "Claus públiques ampliades" + +#: src/js/services/onGoingProcess.js:20 +msgid "Extracting Wallet information..." +msgstr "S'està extraient informació de la cartera..." + +#: src/js/controllers/export.js:115 +#: src/js/controllers/export.js:126 +#: src/js/controllers/export.js:160 +#: src/js/controllers/export.js:171 +#: www/views/tab-export-file.html:4 +msgid "Failed to export" +msgstr "L'exportació ha fallat" + +#: www/views/tab-create-personal.html:14 +#: www/views/tab-create-shared.html:14 +msgid "Family vacation funds" +msgstr "Fons per a les vacances familiars" + +#: www/views/tx-details.html:79 +msgid "Fee" +msgstr "Comissió" + +#: www/views/modals/chooseFeeLevel.html:75 +msgid "Fee level" +msgstr "Nivell de comissió" + +#: src/js/controllers/modals/feeLevels.js:100 +msgid "Fee level is not defined" +msgstr "El nivell de comissió no està definit" + +#: www/views/confirm.html:79 +#: www/views/modals/txp-details.html:99 +msgid "Fee:" +msgstr "Comissió:" + +#: src/js/controllers/feedback/send.js:23 +msgid "Feedback could not be submitted. Please try again later." +msgstr "No s'ha pogut enviar el comentari. Torneu-ho a provar més tard." + +#: src/js/services/onGoingProcess.js:42 +msgid "Fetching BitPay Account..." +msgstr "S'està obtenint el compte BitPay..." + +#: src/js/services/onGoingProcess.js:21 +msgid "Fetching payment information" +msgstr "S'està obtenint la informació del pagament" + +#: www/views/export.html:14 +#: www/views/import.html:16 +msgid "File/Text" +msgstr "Fitxer/Text" + +#: www/views/preferencesLogs.html:17 +msgid "Filter setting" +msgstr "Paràmetres del filtre" + +#: src/js/services/fingerprintService.js:43 +#: src/js/services/fingerprintService.js:48 +msgid "Finger Scan Failed" +msgstr "L'escaneig del dit ha fallat" + +#: src/js/controllers/feedback/send.js:34 +#: www/views/feedback/complete.html:7 +msgid "Finish" +msgstr "Finalitza" + +#: www/views/tab-create-personal.html:123 +#: www/views/tab-create-shared.html:152 +msgid "For audit purposes" +msgstr "Amb finalitats d'auditoria" + +#: src/js/controllers/topup.js:308 +#: www/views/buyAmazon.html:29 +#: www/views/buyMercadoLibre.html:28 +#: www/views/confirm.html:65 +#: www/views/modals/txp-details.html:74 +#: www/views/topup.html:34 +#: www/views/tx-details.html:52 +msgid "From" +msgstr "Des de" + +#: src/js/controllers/bitpayCardIntro.js:71 +msgid "From BitPay account" +msgstr "Des del compte de BitPay" + +#: www/views/tab-import-phrase.html:57 +msgid "From Hardware Wallet" +msgstr "Des d'una cartera física" + +#: www/views/tab-export-qrCode.html:5 +msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" +msgstr "Des del dispositiu de destinació, aneu a Afegeix cartera > Importa cartera i escanegeu aquest codi QR" + +#: src/js/services/bwcError.js:74 +msgid "Funds are locked by pending spend proposals" +msgstr "Els fons estan bloquejats per propostes de despeses pendents" + +#: www/views/paperWallet.html:16 +msgid "Funds found:" +msgstr "Fons trobats:" + +#: www/views/topup.html:49 +msgid "Funds to be added" +msgstr "Fons per afegir" + +#: www/views/paperWallet.html:51 +msgid "Funds transferred" +msgstr "Fons transferits" + +#: www/views/topup.html:103 +msgid "Funds were added to debit card" +msgstr "Els fons s'han afegit a la targeta de dèbit" + +#: www/views/paperWallet.html:22 +msgid "Funds will be transferred to" +msgstr "Els fons es transferiran a" + +#: www/views/tab-receive.html:51 +msgid "Generate new address" +msgstr "Genera una adreça nova" + +#: src/js/services/onGoingProcess.js:22 +msgid "Generating .csv file..." +msgstr "S'està generant un fitxer. csv..." + +#: src/js/services/onGoingProcess.js:37 +msgid "Generating new address..." +msgstr "S'està generant una adreça nova..." + +#: www/views/bitpayCardIntro.html:23 +msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." +msgstr "Retireu moneda local a qualsevol lloc on aneu, des de qualsevol caixer automàtic compatible amb Visa®. Pot ser que el banc del caixer apliqui comissions." + +#: www/views/onboarding/collectEmail.html:15 +msgid "Get news and updates from BitPay" +msgstr "Rebeu notícies i actualitzacions de BitPay" + +#: www/views/onboarding/welcome.html:8 +msgctxt "button" +msgid "Get started" +msgstr "Comença" + +#: www/views/bitpayCard.html:49 +msgid "Get started" +msgstr "Comença" + +#: www/views/addressbook.html:20 +msgid "Get started by adding your first one." +msgstr "Comenceu afegint el primer contacte." + +#: src/js/services/onGoingProcess.js:23 +msgid "Getting fee levels..." +msgstr "S'estan obtenint els nivells de comissió..." + +#: www/views/buyAmazon.html:43 +#: www/views/buyMercadoLibre.html:42 +msgid "Gift Card" +msgstr "Targeta regal" + +#: www/views/modals/mercadolibre-card-details.html:30 +#: www/views/modals/mercadolibre-card-details.html:35 +msgid "Gift Card is not available to use anymore" +msgstr "La targeta regal ja no està disponible" + +#: src/js/controllers/buyAmazon.js:204 +msgid "Gift card expired" +msgstr "La targeta regal ha caducat" + +#: www/views/buyAmazon.html:111 +msgid "Gift card generated and ready to use." +msgstr "Targeta regal generada i a punt per ser utilitzada." + +#: src/js/controllers/bitpayCard.js:114 +#: src/js/controllers/bitpayCard.js:124 +#: src/js/controllers/cashScan.js:20 +#: src/js/controllers/onboarding/terms.js:23 +#: src/js/controllers/preferences.js:67 +#: src/js/controllers/preferencesAbout.js:16 +#: src/js/controllers/preferencesCash.js:34 +#: src/js/controllers/preferencesLanguage.js:14 +#: src/js/controllers/tab-home.js:149 +#: src/js/controllers/tab-settings.js:53 +#: src/js/controllers/tx-details.js:193 +#: src/js/controllers/tx-details.js:56 +msgid "Go Back" +msgstr "Enrere" + +#: src/js/controllers/confirm.js:131 +#: src/js/controllers/onboarding/backupRequest.js:20 +#: src/js/controllers/onboarding/backupRequest.js:26 +#: src/js/services/bitpayAccountService.js:84 +msgid "Go back" +msgstr "Enrere" + +#: www/views/backupWarning.html:15 +#: www/views/includes/confirmBackupPopup.html:8 +#: www/views/onboarding/tour.html:23 +msgid "Got it" +msgstr "Entesos" + +#: www/views/preferencesInformation.html:53 +#: www/views/preferencesInformation.html:59 +msgid "Hardware Wallet" +msgstr "Cartera física" + +#: www/views/preferencesExternal.html:18 +msgid "Hardware not connected." +msgstr "Equip no connectat." + +#: www/views/import.html:20 +msgid "Hardware wallet" +msgstr "Cartera física" + +#: src/js/controllers/create.js:180 +#: src/js/controllers/join.js:145 +msgid "Hardware wallets are not yet supported with Bitcoin Cash" +msgstr "Bitcoin Cash encara no admet les carteres físiques" + +#: www/views/tab-settings.html:20 +msgid "Help & Support" +msgstr "Ajuda i assistència" + +#: src/js/controllers/bitpayCard.js:112 +#: src/js/controllers/tab-settings.js:51 +msgid "Help and support information is available at the website." +msgstr "La informació d'ajuda i assistència està disponible al lloc web." + +#: www/views/addresses.html:25 +msgid "Hide" +msgstr "Oculta" + +#: www/views/preferences.html:27 +msgid "Hide Balance" +msgstr "Oculta el saldo" + +#: www/views/advancedSettings.html:30 +msgid "Hide Next Steps Card" +msgstr "Oculta la targeta \"Pròxims passos\"" + +#: www/views/join.html:49 +#: www/views/tab-create-personal.html:28 +#: www/views/tab-create-shared.html:57 +#: www/views/tab-export-file.html:25 +#: www/views/tab-import-file.html:30 +#: www/views/tab-import-hardware.html:31 +#: www/views/tab-import-phrase.html:36 +msgid "Hide advanced options" +msgstr "Oculta les opcions avançades" + +#: www/views/tabs.html:3 +msgid "Home" +msgstr "Inici" + +#: src/js/controllers/feedback/send.js:61 +#: src/js/controllers/feedback/send.js:65 +#: src/js/controllers/feedback/send.js:69 +msgid "How could we improve your experience?" +msgstr "Com podríem millorar la vostra experiència?" + +#: www/views/feedback/rateCard.html:3 +msgid "How do you like {{appName}}?" +msgstr "Us agrada {{appName}}?" + +#: src/js/controllers/feedback/rateCard.js:29 +msgid "I don't like it" +msgstr "No m'agrada" + +#: www/views/onboarding/disclaimer.html:43 +msgid "I have read, understood, and agree to the
Terms of Use." +msgstr "He llegit, entès i acceptat les Condicions d'ús." + +#: www/views/modals/terms.html:22 +msgid "I have read, understood, and agree with the Terms of use." +msgstr "He llegit, entès i acceptat les condicions d'ús." + +#: www/views/join.html:137 +#: www/views/tab-create-personal.html:107 +#: www/views/tab-create-shared.html:136 +msgid "I have written it down" +msgstr "M'ho he apuntat" + +#: src/js/controllers/feedback/rateCard.js:35 +msgid "I like the app" +msgstr "M'agrada l'aplicació" + +#: src/js/controllers/feedback/rateCard.js:26 +msgid "I think this app is terrible." +msgstr "Crec que aquesta aplicació és terrible." + +#: src/js/controllers/onboarding/backupRequest.js:19 +#: www/views/includes/screenshotWarningModal.html:9 +msgid "I understand" +msgstr "Ho entenc" + +#: www/views/onboarding/disclaimer.html:21 +msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." +msgstr "Entenc que si aquesta aplicació es desplaça a un altre dispositiu o se suprimeix, els meus bitcoins només es podran recuperar amb la frase de seguretat." + +#: www/views/onboarding/disclaimer.html:18 +msgid "I understand that my funds are held securely on this device, not by a company." +msgstr "Entenc que els meus fons estan protegits per aquest dispositiu i no per una empresa." + +#: www/views/backup.html:36 +msgid "I've written it down" +msgstr "M'ho he apuntat" + +#: www/views/preferences.html:45 +msgid "If enabled, all sensitive information (private key and recovery phrase) and actions (spending and exporting) associated with this wallet will be protected." +msgstr "Si s'habilita aquesta opció, tota la informació sensible (clau privada i frase de recuperació) i les accions (gastar i exportar) associades a aquesta cartera estaran protegides." + +#: www/views/advancedSettings.html:23 +msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." +msgstr "Si s'habilita aquesta opció, la targeta de transaccions recents (una llista de les transaccions efectuades en totes les carteres) apareixerà a la pestanya d'Inici." + +#: www/views/advancedSettings.html:14 +msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." +msgstr "Si s'habilita aquesta opció, les carteres també intentaran gastar fons no confirmats. Aquesta opció pot provocar retards en la transacció." + +#: src/js/controllers/onboarding/backupRequest.js:18 +msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." +msgstr "Si aquest dispositiu se substitueix o si se suprimeix aquesta aplicació, ni BitPay ni vós podreu recuperar els fons sense una còpia de seguretat." + +#: www/views/feedback/complete.html:23 +msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." +msgstr "Si ens voleu comentar alguna altra cosa, toqueu l'opció \"Envia comentaris\" a la pestanya de Paràmetres." + +#: www/views/includes/screenshotWarningModal.html:8 +msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." +msgstr "Si feu una captura de pantalla, altres aplicacions podran veure la còpia de seguretat. Podeu fer una còpia de seguretat amb un paper i un llapis físics." + +#: www/views/tab-import-hardware.html:42 +#: www/views/tab-import-phrase.html:80 +msgid "Import" +msgstr "Importa" + +#: www/views/import.html:3 +msgid "Import Wallet" +msgstr "Importa la cartera" + +#: www/views/tab-import-file.html:41 +msgid "Import backup" +msgstr "Importa la còpia de seguretat" + +#: www/views/add.html:38 +msgid "Import wallet" +msgstr "Importa la cartera" + +#: src/js/services/onGoingProcess.js:24 +msgid "Importing Wallet..." +msgstr "S'està important la cartera..." + +#: www/views/backup.html:72 +msgid "In order to verify your wallet backup, please type your password." +msgstr "Per verificar la còpia de seguretat de la cartera, escriviu la contrasenya." + +#: www/views/mercadoLibreCards.html:24 +#: www/views/modals/mercadolibre-card-details.html:29 +msgid "Inactive" +msgstr "Inactiva" + +#: www/views/includes/walletItem.html:9 +#: www/views/includes/walletList.html:6 +#: www/views/includes/walletListSettings.html:9 +#: www/views/includes/walletSelector.html:16 +msgid "Incomplete" +msgstr "Incompleta" + +#: www/views/tab-receive.html:22 +msgid "Incomplete wallet" +msgstr "Cartera incompleta" + +#: www/views/modals/pin.html:12 +msgid "Incorrect PIN, try again." +msgstr "PIN incorrecte; torneu-ho a provar." + +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/import.js:85 +msgid "Incorrect code format" +msgstr "Format de codi incorrecte" + +#: src/js/services/bwcError.js:113 +msgid "Incorrect network address" +msgstr "Adreça de xarxa incorrecta" + +#: src/js/controllers/confirm.js:114 +#: src/js/controllers/confirm.js:306 +#: src/js/services/bwcError.js:44 +msgid "Insufficient confirmed funds" +msgstr "Fons confirmats insuficients" + +#: src/js/controllers/topup.js:165 +#: src/js/controllers/topup.js:177 +#: src/js/services/bwcError.js:71 +msgid "Insufficient funds for fee" +msgstr "Fons insuficients per la comissió" + +#: www/views/tab-settings.html:123 +msgid "Integrations" +msgstr "Integracions" + +#: www/views/includes/walletHistory.html:49 +msgid "Invalid" +msgstr "No vàlid" + +#: src/js/controllers/buyAmazon.js:137 +#: src/js/controllers/buyMercadoLibre.js:137 +#: src/js/controllers/topup.js:115 +msgid "Invalid URL" +msgstr "L'URL no és vàlid" + +#: src/js/controllers/create.js:186 +#: src/js/controllers/import.js:345 +#: src/js/controllers/join.js:151 +msgid "Invalid account number" +msgstr "Número de compte no vàlid" + +#: src/js/services/bwcError.js:119 +msgid "Invalid address" +msgstr "Adreça no vàlida" + +#: src/js/controllers/tabsController.js:7 +msgid "Invalid data" +msgstr "Dades no vàlides" + +#: src/js/controllers/create.js:161 +#: src/js/controllers/import.js:266 +#: src/js/controllers/join.js:125 +msgid "Invalid derivation path" +msgstr "Camí de derivació no vàlid" + +#: src/js/controllers/copayers.js:90 +msgid "Invitation to share a {{appName}} Wallet" +msgstr "Invitació per compartir una cartera {{appName}}" + +#: www/views/mercadoLibreCards.html:20 +#: www/views/modals/mercadolibre-card-details.html:48 +msgid "Invoice expired" +msgstr "La factura ha vençut" + +#: src/js/controllers/feedback/send.js:79 +msgid "Is there anything we could do better?" +msgstr "Podríem fer millor alguna cosa?" + +#: www/views/backup.html:54 +msgid "Is this correct?" +msgstr "És correcte?" + +#: www/views/onboarding/collectEmail.html:22 +msgid "Is this email address correct?" +msgstr "És correcta, aquesta adreça electrònica?" + +#: www/views/addresses.html:25 +msgid "It's a good idea to avoid reusing addresses - this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." +msgstr "És aconsellable no reutilitzar les adreces. Això protegeix la vostra privadesa i els vostres bitcoins contra atacs hipotètics d'ordinadors quàntics." + +#: src/js/controllers/backup.js:76 +msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." +msgstr "És important que copieu la vostra frase de seguretat correctament. Si li passés alguna cosa a la cartera, necessitaríeu aquesta frase de seguretat per recuperar els vostres diners. Reviseu la frase de seguretat i torneu-ho a provar." + +#: www/views/join.html:151 +msgid "Join" +msgstr "Uneix-t'hi" + +#: src/js/controllers/copayers.js:85 +msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" +msgstr "Uneix-te a la meva cartera {{appName}}. Aquí tens el codi d'invitació: {{secret}} Et pots descarregar {{appName}} per al teu telèfon o ordinador de taula a {{appUrl}}" + +#: www/views/add.html:30 +#: www/views/join.html:5 +msgid "Join shared wallet" +msgstr "Uneix-te a la cartera compartida" + +#: src/js/services/onGoingProcess.js:25 +msgid "Joining Wallet..." +msgstr "S'està unint a la cartera..." + +#: www/views/onboarding/tour.html:22 +msgid "Just scan the code to pay." +msgstr "Escanegeu el codi per pagar." + +#: src/js/services/bwcError.js:116 +msgid "Key already associated with an existing wallet" +msgstr "Clau ja associada a una cartera existent" + +#: www/views/preferencesLanguage.html:4 +#: www/views/tab-settings.html:68 +msgid "Language" +msgstr "Llengua" + +#: www/views/bitpayCard.html:61 +msgid "Last Month" +msgstr "Mes passat" + +#: src/js/controllers/confirm.js:132 +#: www/views/preferences.html:48 +#: www/views/preferencesCash.html:18 +#: www/views/tx-details.html:94 +msgid "Learn more" +msgstr "Més informació" + +#: www/views/backup.html:43 +msgid "Let's verify your backup phrase." +msgstr "Verifiquem la vostra frase de seguretat." + +#: www/views/addresses.html:45 +#: www/views/allAddresses.html:14 +msgid "Loading addresses..." +msgstr "S'estan carregant les adreces..." + +#: src/js/services/onGoingProcess.js:35 +msgid "Loading transaction info..." +msgstr "S'està carregant la informació de la transacció..." + +#: www/views/tab-settings.html:100 +msgid "Lock App" +msgstr "Bloqueja l'aplicació" + +#: src/js/controllers/lockSetup.js:23 +msgid "Lock by Fingerprint" +msgstr "Bloqueja amb empremta digital" + +#: src/js/controllers/lockSetup.js:14 +msgid "Lock by PIN" +msgstr "Bloqueja amb PIN" + +#: www/views/modals/wallet-balance.html:80 +msgid "Locked" +msgstr "Bloquejat" + +#: src/js/services/bwcError.js:86 +msgid "Locktime in effect. Please wait to create a new spend proposal" +msgstr "Bloqueig temporal. Espereu per crear una nova proposta de despesa" + +#: src/js/services/bwcError.js:89 +msgid "Locktime in effect. Please wait to remove this spend proposal" +msgstr "Bloqueig temporal. Espereu per suprimir aquesta proposta de despesa" + +#: www/views/includes/logOptions.html:3 +msgid "Log options" +msgstr "Opcions de registre" + +#: www/views/modals/bitpay-card-confirmation.html:14 +msgid "Log out" +msgstr "Finalitza la sessió" + +#: www/views/addresses.html:87 +msgid "Low amount inputs" +msgstr "Entrades d'import baix" + +#: www/views/includes/walletHistory.html:27 +msgid "Low fees" +msgstr "Comissions baixes" + +#: www/views/onboarding/tour.html:38 +msgid "Makes sense" +msgstr "És lògic" + +#: src/js/controllers/modals/search.js:61 +msgid "Matches:" +msgstr "Coincidències:" + +#: www/views/includes/copayers.html:4 +#: www/views/preferencesInformation.html:85 +msgid "Me" +msgstr "Jo" + +#: src/js/controllers/feedback/rateCard.js:32 +msgid "Meh - it's alright" +msgstr "Entesos" + +#: src/js/controllers/tx-details.js:165 +#: www/views/modals/paypro.html:48 +#: www/views/modals/txp-details.html:93 +#: www/views/tx-details.html:72 +msgid "Memo" +msgstr "Nota" + +#: www/views/mercadoLibre.html:6 +msgid "Mercado Livre Brazil Gift Cards" +msgstr "Targetes regal de Mercado Livre Brasil" + +#: src/js/controllers/buyMercadoLibre.js:98 +msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later." +msgstr "El servei de targetes de regal de Mercadolibre no està disponible en aquest moment. Torneu-ho a provar més tard." + +#: www/views/modals/txp-details.html:131 +msgid "Merchant Message" +msgstr "Missatge del comerciant" + +#: www/views/buyAmazon.html:55 +#: www/views/buyMercadoLibre.html:54 +#: www/views/topup.html:63 +msgid "Miner Fee" +msgstr "Comissió del miner" + +#: src/js/services/bwcError.js:134 +msgid "Missing parameter" +msgstr "Falta un paràmetre" + +#: src/js/services/bwcError.js:32 +msgid "Missing private keys to sign" +msgstr "Falten claus privades per firmar" + +#: www/views/preferences.html:61 +#: www/views/preferencesAdvanced.html:3 +msgid "More Options" +msgstr "Més opcions" + +#: www/views/includes/walletHistory.html:47 +#: www/views/tx-details.html:19 +msgid "Moved" +msgstr "Desplaçats" + +#: src/js/controllers/tx-details.js:131 +msgid "Moved Funds" +msgstr "Fons desplaçats" + +#: www/views/modals/txp-details.html:57 +msgid "Multiple recipients" +msgstr "Múltiples destinataris" + +#: www/views/tab-import-phrase.html:8 +msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." +msgstr "Nota: Per importar una cartera des d'un programari d'un tercer, aneu a Afegeix cartera > Crea cartera i especifiqueu la frase de recuperació." + +#: www/views/addressbook.add.html:21 +#: www/views/addressbook.view.html:18 +#: www/views/preferences.html:15 +#: www/views/preferencesAlias.html:17 +msgid "Name" +msgstr "Nom" + +#: www/views/buyAmazon.html:49 +#: www/views/buyMercadoLibre.html:48 +#: www/views/topup.html:56 +msgid "Network Cost" +msgstr "Cost de la xarxa" + +#: src/js/services/bwcError.js:47 +msgid "Network error" +msgstr "Error de xarxa" + +#: www/views/includes/walletActivity.html:43 +msgid "New Proposal" +msgstr "Nova proposta" + +#: src/js/controllers/addresses.js:126 +msgid "New address could not be generated. Please try again." +msgstr "No s'ha pogut generar l'adreça nova. Torneu-ho a provar." + +#: www/views/add.html:14 +msgid "New personal wallet" +msgstr "Nova cartera personal" + +#: www/views/includes/nextSteps.html:3 +msgid "Next steps" +msgstr "Pròxims passos" + +#: www/views/tab-receive.html:16 +msgid "No Wallet" +msgstr "No hi ha cap cartera" + +#: src/js/controllers/buyAmazon.js:115 +#: src/js/controllers/buyMercadoLibre.js:115 +msgid "No access key defined" +msgstr "No s'ha definit cap clau d'accés" + +#: www/views/onboarding/backupRequest.html:5 +msgid "No backup, no bitcoin." +msgstr "No hi ha cap còpia de seguretat, cap bitcoin." + +#: www/views/addressbook.html:19 +msgid "No contacts yet" +msgstr "Encara no hi ha cap contacte" + +#: www/views/preferencesLogs.html:16 +msgid "No entries for this log level" +msgstr "No hi ha entrades per a aquest nivell de registre" + +#: www/views/preferencesExternal.html:12 +msgid "No hardware information available." +msgstr "No hi ha cap informació de maquinari disponible." + +#: www/views/tab-import-hardware.html:3 +msgid "No hardware wallets supported on this device" +msgstr "Aquest dispositiu no admet cap cartera física" + +#: www/views/proposals.html:24 +msgid "No pending proposals" +msgstr "No hi ha cap proposta pendent" + +#: www/views/activity.html:25 +msgid "No recent transactions" +msgstr "No hi ha transaccions recents" + +#: src/js/controllers/buyAmazon.js:44 +#: src/js/controllers/topup.js:47 +msgid "No signing proposal: No private key" +msgstr "No hi ha cap proposta de firma: cap clau privada" + +#: www/views/walletDetails.html:204 +msgid "No transactions yet" +msgstr "Encara no hi ha cap transacció" + +#: src/js/controllers/preferencesDelete.js:15 +msgid "No wallet found" +msgstr "No s'ha trobat cap cartera" + +#: src/js/controllers/preferencesDelete.js:8 +msgid "No wallet selected" +msgstr "No s'ha seleccionat cap cartera" + +#: src/js/controllers/buyAmazon.js:300 +#: src/js/controllers/buyMercadoLibre.js:292 +#: src/js/controllers/confirm.js:85 +#: src/js/controllers/topup.js:265 +msgid "No wallets available" +msgstr "No hi ha cap cartera disponible" + +#: www/views/paperWallet.html:45 +msgid "No wallets available to receive funds" +msgstr "No hi ha cap cartera disponible per rebre fons" + +#: www/views/cashScan.html:15 +msgid "No wallets eligible for Bitcoin Cash support" +msgstr "No hi ha cap cartera compatible amb Bitcoin Cash" + +#: src/js/controllers/cashScan.js:58 +msgid "Non BIP44 wallet" +msgstr "Cartera no BIP44" + +#: www/views/cashScan.html:46 +msgid "Non eligible BTC wallets" +msgstr "Carteres BTC no compatibles" + +#: src/js/services/feeService.js:12 +msgid "Normal" +msgstr "Normal" + +#: src/js/services/bwcError.js:80 +msgid "Not authorized" +msgstr "No autoritzat" + +#: src/js/controllers/confirm.js:307 +msgid "Not enough funds for fee" +msgstr "No hi ha prou fons per a la comissió" + +#: www/views/onboarding/tour.html:50 +msgid "Not even BitPay can access it." +msgstr "Ni tan sols BitPay pot accedir-hi." + +#: src/js/controllers/paperWallet.js:47 +msgid "Not funds found" +msgstr "No s'han trobat fons" + +#: www/views/feedback/rateApp.html:3 +#: www/views/onboarding/notifications.html:8 +msgid "Not now" +msgstr "Ara no" + +#: www/views/includes/output.html:15 +msgid "Note" +msgstr "Nota" + +#: www/views/backup.html:19 +msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase." +msgstr "Nota: Si aquesta cartera BCH s'ha duplicat des d'una cartera BTC, comparteixen la mateixa frase de recuperació." + +#: www/views/modals/wallets.html:25 +msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" +msgstr "Avís: Només es poden utilitzar les carteres 1-1 (de firma única) per vendre bitcoins" + +#: www/views/preferencesNotifications.html:3 +#: www/views/tab-settings.html:61 +msgid "Notifications" +msgstr "Notificacions" + +#: www/views/onboarding/collectEmail.html:9 +msgid "Notifications by email" +msgstr "Notificacions per correu electrònic" + +#: www/views/tx-details.html:117 +msgid "Notify me if confirmed" +msgstr "Notifica-m'ho si es confirma" + +#: www/views/preferencesNotifications.html:24 +msgid "Notify me when transactions are confirmed" +msgstr "Notifica-m'ho quan les transaccions es confirmin" + +#: www/views/includes/backupNeededPopup.html:8 +msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." +msgstr "Ara és el moment de fer una còpia de seguretat de la cartera. Si perdeu aquest dispositiu, serà impossible accedir als vostres fons sense una còpia de seguretat." + +#: www/views/backupWarning.html:11 +msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" +msgstr "Ara és el moment ideal per mirar al voltant. Finestres pròximes? Càmeres ocultes? Tafaners?" + +#: src/js/controllers/buyAmazon.js:312 +#: src/js/controllers/topup.js:286 +#: src/js/services/incomingData.js:153 +#: src/js/services/popupService.js:16 +#: src/js/services/popupService.js:52 +#: src/js/services/popupService.js:61 +#: src/js/services/popupService.js:72 +#: www/views/modals/chooseFeeLevel.html:6 +msgid "OK" +msgstr "OK" + +#: www/views/modals/tx-status.html:12 +#: www/views/modals/tx-status.html:24 +#: www/views/modals/tx-status.html:36 +#: www/views/modals/tx-status.html:46 +msgid "OKAY" +msgstr "D'ACORD" + +#: www/views/modals/terms.html:15 +msgid "Official English Disclaimer" +msgstr "Renúncia oficial en anglès" + +#: src/js/controllers/feedback/send.js:64 +msgid "Oh no!" +msgstr "Ostres, no!" + +#: src/js/controllers/buyMercadoLibre.js:306 +msgid "Ok" +msgstr "D'acord" + +#: www/views/tab-home.html:39 +msgid "On this screen you can see all your wallets, accounts, and assets." +msgstr "En aquesta pantalla hi podeu veure totes les vostres carteres, comptes i actius." + +#: src/js/controllers/bitpayCard.js:113 +#: src/js/controllers/cashScan.js:19 +#: src/js/controllers/preferences.js:66 +#: src/js/controllers/preferencesCash.js:33 +#: src/js/controllers/tab-settings.js:52 +#: src/js/controllers/tx-details.js:55 +msgid "Open" +msgstr "Obre" + +#: src/js/controllers/preferencesLanguage.js:13 +msgid "Open Crowdin" +msgstr "Obre Crowdin" + +#: src/js/controllers/preferencesAbout.js:15 +msgid "Open GitHub" +msgstr "Obre GitHub" + +#: src/js/controllers/preferencesAbout.js:13 +msgid "Open GitHub Project" +msgstr "Obre el projecte GitHub" + +#: src/js/controllers/bitpayCard.js:123 +#: src/js/controllers/tx-details.js:192 +msgid "Open Explorer" +msgstr "Obre l'explorador" + +#: www/views/tab-scan.html:22 +msgid "Open Settings" +msgstr "Obre els paràmetres" + +#: src/js/controllers/preferencesLanguage.js:11 +msgid "Open Translation Community" +msgstr "Obre la comunitat de traducció" + +#: src/js/controllers/onboarding/terms.js:22 +msgid "Open Website" +msgstr "Obre el lloc web" + +#: src/js/controllers/preferencesCash.js:32 +msgid "Open bitcoincash.org?" +msgstr "Voleu obrir bitcoincash.org?" + +#: src/js/controllers/cashScan.js:18 +msgid "Open the recovery tool." +msgstr "Obre l'eina de recuperació." + +#: www/views/tab-receive.html:27 +msgid "Open wallet" +msgstr "Obre la cartera" + +#: www/views/includes/incomingDataMenu.html:19 +msgid "Open website" +msgstr "Obre el lloc web" + +#: www/views/bitpayCardIntro.html:34 +msgid "Order the BitPay Card" +msgstr "Sol·licita la BitPay Card" + +#: www/views/join.html:105 +#: www/views/join.html:96 +#: www/views/tab-create-personal.html:69 +#: www/views/tab-create-personal.html:77 +#: www/views/tab-create-shared.html:106 +#: www/views/tab-create-shared.html:98 +#: www/views/tab-import-file.html:18 +#: www/views/tab-import-phrase.html:41 +msgid "Password" +msgstr "Contrasenya" + +#: src/js/controllers/import.js:98 +msgid "Password required. Make sure to enter your password in advanced options" +msgstr "Cal contrasenya. Recordeu-vos d'introduir la contrasenya a les opcions avançades" + +#: www/views/join.html:33 +msgid "Paste invitation here" +msgstr "Enganxeu la invitació aquí" + +#: www/views/tab-import-file.html:13 +msgid "Paste the backup plain text code" +msgstr "Enganxeu el codi del text net de seguretat" + +#: www/views/bitpayCardIntro.html:28 +msgid "Pay 0% fees to turn bitcoin into dollars." +msgstr "Pagueu un 0% de comissió per convertir bitcoins a dòlars." + +#: www/views/modals/paypro.html:18 +msgid "Pay To" +msgstr "Paga a" + +#: src/js/controllers/modals/txpDetails.js:51 +#: www/views/modals/tx-status.html:33 +msgid "Payment Accepted" +msgstr "Pagament acceptat" + +#: www/views/confirm.html:25 +msgid "Payment Expires:" +msgstr "El pagament venç:" + +#: www/views/modals/txp-details.html:6 +msgid "Payment Proposal" +msgstr "Proposta de pagament" + +#: www/views/modals/tx-status.html:21 +msgid "Payment Proposal Created" +msgstr "Proposta de pagament creada" + +#: www/views/tab-home.html:46 +msgid "Payment Proposals" +msgstr "Propostes de pagament" + +#: src/js/services/payproService.js:32 +msgid "Payment Protocol Invalid" +msgstr "Protocol de pagament no vàlid" + +#: src/js/services/payproService.js:18 +msgid "Payment Protocol not supported on Chrome App" +msgstr "L'aplicació Chrome no admet el protocol de pagament" + +#: www/views/includes/walletActivity.html:20 +msgid "Payment Received" +msgstr "Pagament rebut" + +#: www/views/modals/tx-status.html:43 +#: www/views/modals/txp-details.html:43 +msgid "Payment Rejected" +msgstr "Pagament rebutjat" + +#: src/js/controllers/modals/txpDetails.js:44 +#: www/views/confirm.html:124 +#: www/views/includes/walletActivity.html:11 +#: www/views/modals/txp-details.html:42 +msgid "Payment Sent" +msgstr "Pagament enviat" + +#: www/views/modals/txp-details.html:32 +msgid "Payment accepted, but not yet broadcasted" +msgstr "Pagament acceptat, però encara no emès" + +#: www/views/modals/txp-details.html:40 +msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." +msgstr "Pagament acceptat. S'emetrà amb Glidera. Si hi ha algun problema, es pot cancel·lar 6 hores després d'haver-lo creat." + +#: src/js/services/incomingData.js:152 +msgid "Payment address was translated to new Bitcoin Cash address format:" +msgstr "L'adreça de pagament s'ha traduït al nou format d'adreça Bitcoin Cash:" + +#: www/views/modals/txp-details.html:107 +msgid "Payment details" +msgstr "Dades de pagament" + +#: www/views/modals/paypro.html:6 +msgid "Payment request" +msgstr "Sol·licitud de pagament" + +#: www/views/mercadoLibreCards.html:22 +#: www/views/modals/mercadolibre-card-details.html:39 +msgid "Pending" +msgstr "Pendent" + +#: www/views/proposals.html:4 +msgid "Pending Proposals" +msgstr "Propostes pendents" + +#: www/views/preferencesDeleteWallet.html:13 +msgid "Permanently delete this wallet." +msgstr "Suprimeix definitivament aquesta cartera." + +#: src/js/services/profileService.js:403 +msgid "Personal Wallet" +msgstr "Cartera personal" + +#: www/views/backup.html:25 +msgid "Please carefully write down this phrase." +msgstr "Apunteu-vos bé aquesta frase." + +#: www/views/tab-scan.html:20 +msgid "Please connect a camera to get started." +msgstr "Connecteu una càmera per començar." + +#: src/js/controllers/import.js:278 +msgid "Please enter the recovery phrase" +msgstr "Introduïu la frase de recuperació" + +#: src/js/controllers/create.js:174 +#: src/js/controllers/join.js:139 +msgid "Please enter the wallet recovery phrase" +msgstr "Introduïu la frase de recuperació de la cartera" + +#: www/views/modals/pin.html:9 +msgid "Please enter your PIN" +msgstr "Introduïu el PIN" + +#: www/views/backup.html:53 +msgid "Please tap each word in the correct order." +msgstr "Toqueu cada paraula en l'ordre correcte." + +#: src/js/services/bwcError.js:101 +msgid "Please upgrade Copay to perform this action" +msgstr "Actualitzeu Copay per realitzar aquesta acció" + +#: www/views/walletDetails.html:142 +#: www/views/walletDetails.html:62 +msgid "Please wait" +msgstr "Espereu" + +#: src/js/controllers/import.js:238 +msgid "Please, select your backup file" +msgstr "Seleccioneu el vostre fitxer de còpia de seguretat" + +#: www/views/bitpayCard.html:81 +msgid "Pre-Auth Holds" +msgstr "Retencions preautoritzades" + +#: www/views/tab-settings.html:40 +msgid "Preferences" +msgstr "Preferències" + +#: src/js/services/onGoingProcess.js:38 +msgid "Preparing addresses..." +msgstr "S'estan preparant les adreces..." + +#: src/js/controllers/export.js:198 +msgid "Preparing backup..." +msgstr "S'està preparant la còpia de seguretat..." + +#: src/js/routes.js:1264 +msgid "Press again to exit" +msgstr "Torneu a prémer per sortir" + +#: src/js/services/feeService.js:11 +msgid "Priority" +msgstr "Prioritat" + +#: www/views/includes/incomingDataMenu.html:80 +msgid "Private Key" +msgstr "Clau privada" + +#: src/js/controllers/paperWallet.js:136 +msgid "Private key encrypted. Enter password" +msgstr "Clau privada encriptada. Introduïu la contrasenya" + +#: src/js/services/bwcError.js:35 +msgid "Private key is encrypted, cannot sign" +msgstr "La clau privada està encriptada, no es pot firmar" + +#: www/views/includes/walletActivity.html:51 +msgid "Proposal Accepted" +msgstr "Proposta acceptada" + +#: src/js/controllers/modals/txpDetails.js:61 +#: src/js/controllers/tx-details.js:78 +#: www/views/confirm.html:125 +msgid "Proposal Created" +msgstr "Proposta creada" + +#: www/views/includes/walletActivity.html:27 +msgid "Proposal Deleted" +msgstr "Proposta suprimida" + +#: www/views/includes/walletActivity.html:35 +msgid "Proposal Rejected" +msgstr "Proposta rebutjada" + +#: www/views/walletDetails.html:189 +msgid "Proposals" +msgstr "Propostes" + +#: src/js/controllers/buyAmazon.js:282 +msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" +msgstr "L'import de la compra està limitat a {{limitPerDay}} {{currency}} per día" + +#: src/js/controllers/buyMercadoLibre.js:281 +msgid "Purchase amount must be a value between 50 and 2000" +msgstr "L'import de la compra ha de ser un valor entre 50 i 2000" + +#: www/views/onboarding/notifications.html:3 +msgid "Push Notifications" +msgstr "Notificacions push" + +#: www/views/preferencesNotifications.html:17 +msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." +msgstr "Les notificacions push per a {{appName}} estan inhabilitades. Habiliteu-les als paràmetres de l'aplicació." + +#: www/views/export.html:17 +msgid "QR Code" +msgstr "Codi QR" + +#: www/views/onboarding/disclaimer.html:13 +msgid "Quick review!" +msgstr "Revisió ràpida!" + +#: src/js/controllers/create.js:84 +#: src/js/controllers/join.js:68 +msgid "Random" +msgstr "Aleatori" + +#: www/views/feedback/rateApp.html:14 +msgid "Rate on the app store" +msgstr "Valora'ns a la botiga d'aplicacions" + +#: www/views/addresses.html:52 +msgid "Read less" +msgstr "Menys informació" + +#: www/views/addresses.html:51 +msgid "Read more" +msgstr "Més informació" + +#: src/js/controllers/preferences.js:65 +#: src/js/controllers/tx-details.js:54 +msgid "Read more in our Wiki" +msgstr "Més informació al nostre wiki" + +#: src/js/controllers/cashScan.js:61 +msgid "Read only wallet" +msgstr "Cartera només de lectura" + +#: www/views/tab-receive.html:3 +#: www/views/tabs.html:7 +msgid "Receive" +msgstr "Rep" + +#: www/views/customAmount.html:44 +msgid "Receive in" +msgstr "Rep a" + +#: www/views/includes/walletHistory.html:24 +#: www/views/tx-details.html:18 +msgid "Received" +msgstr "Rebuts" + +#: src/js/controllers/tx-details.js:130 +msgid "Received Funds" +msgstr "Fons rebuts" + +#: www/views/includes/walletHistory.html:57 +#: www/views/tx-details.html:24 +msgid "Receiving" +msgstr "S'estan rebent" + +#: www/views/bitpayCard.html:60 +#: www/views/includes/walletHistory.html:3 +msgid "Recent" +msgstr "Recents" + +#: www/views/advancedSettings.html:21 +msgid "Recent Transaction Card" +msgstr "Targeta de transaccions recents" + +#: www/views/activity.html:4 +#: www/views/tab-home.html:58 +msgid "Recent Transactions" +msgstr "Transaccions recents" + +#: www/views/amount.html:18 +#: www/views/tab-send.html:9 +msgid "Recipient" +msgstr "Destinatari" + +#: www/views/modals/txp-details.html:62 +msgid "Recipients" +msgstr "Destinataris" + +#: www/views/import.html:12 +msgid "Recovery phrase" +msgstr "Frase de recuperació" + +#: src/js/services/onGoingProcess.js:26 +msgid "Recreating Wallet..." +msgstr "S'està reproduint la cartera..." + +#: www/views/modals/mercadolibre-card-details.html:22 +msgid "Redeem now" +msgstr "Bescanvia ara" + +#: src/js/controllers/modals/txpDetails.js:63 +#: src/js/controllers/tx-details.js:80 +msgid "Rejected" +msgstr "Rebutjada" + +#: src/js/services/onGoingProcess.js:27 +msgid "Rejecting payment proposal" +msgstr "S'està rebutjant la proposta de pagament" + +#: www/views/preferencesAbout.html:9 +msgid "Release information" +msgstr "Informació de la versió" + +#: www/views/addressbook.view.html:36 +#: www/views/modals/mercadolibre-card-details.html:69 +msgid "Remove" +msgstr "Suprimeix" + +#: src/js/controllers/preferencesBitpayServices.js:7 +msgid "Remove BitPay Account?" +msgstr "Voleu suprimir el compte de BitPay?" + +#: src/js/controllers/preferencesBitpayServices.js:19 +msgid "Remove BitPay Card?" +msgstr "Voleu suprimir la targeta BitPay?" + +#: src/js/controllers/preferencesBitpayServices.js:8 +msgid "Removing your BitPay account will remove all associated BitPay account data from this device. Are you sure you would like to remove your BitPay Account ({{email}}) from this device?" +msgstr "Si suprimiu el compte de BitPay, se suprimiran totes les dades associades al compte de BitPay d'aquest dispositiu. Segur que voleu suprimir el compte de BitPay ({{email}}) d'aquest dispositiu?" + +#: www/views/join.html:116 +#: www/views/join.html:124 +#: www/views/tab-create-personal.html:86 +#: www/views/tab-create-personal.html:94 +#: www/views/tab-create-shared.html:115 +#: www/views/tab-create-shared.html:123 +#: www/views/tab-export-file.html:17 +msgid "Repeat password" +msgstr "Repetiu contrasenya" + +#: www/views/tab-export-file.html:16 +msgid "Repeat the password" +msgstr "Repetiu la contrasenya" + +#: www/views/preferences.html:56 +msgid "Request Fingerprint" +msgstr "Sol·licita l'empremta digital" + +#: www/views/tab-receive.html:45 +msgid "Request Specific amount" +msgstr "Sol·licita un import específic" + +#: www/views/preferences.html:42 +msgid "Request Spending Password" +msgstr "Sol·licita contrasenya de despeses" + +#: www/views/tab-create-shared.html:44 +msgid "Required number of signatures" +msgstr "Nombre de firmes requerit" + +#: www/views/onboarding/welcome.html:9 +msgid "Restore from backup" +msgstr "Restaura des de la còpia de seguretat" + +#: src/js/services/onGoingProcess.js:29 +msgid "Retrieving inputs information" +msgstr "S'està recuperant la informació d'entrades" + +#: src/js/controllers/onboarding/tour.js:56 +msgid "Retry" +msgstr "Torna-ho a provar" + +#: www/views/tab-scan.html:23 +msgid "Retry Camera" +msgstr "Torna a provar la càmera" + +#: www/views/addressbook.add.html:56 +#: www/views/includes/note.html:9 +#: www/views/preferencesAlias.html:21 +#: www/views/preferencesBwsUrl.html:25 +#: www/views/preferencesNotifications.html:46 +msgid "Save" +msgstr "Desa" + +#: www/views/tab-scan.html:3 +#: www/views/tabs.html:11 +msgid "Scan" +msgstr "Escaneja" + +#: www/views/tab-scan.html:15 +msgid "Scan QR Codes" +msgstr "Escaneja els codis QR" + +#: www/views/addresses.html:31 +msgid "Scan addresses for funds" +msgstr "Escanegeu les adreces per trobar fons" + +#: www/views/modals/fingerprintCheck.html:11 +msgid "Scan again" +msgstr "Torneu a escanejar" + +#: src/js/services/fingerprintService.js:56 +msgid "Scan your fingerprint please" +msgstr "Escanegeu la vostra empremta digital" + +#: www/views/preferencesCash.html:23 +msgid "Scan your wallets for Bitcoin Cash" +msgstr "Escanegeu les vostres carteres per trobar Bitcoin Cash" + +#: src/js/services/onGoingProcess.js:30 +msgid "Scanning Wallet funds..." +msgstr "S'estan escanejant els fons de la cartera..." + +#: www/views/includes/walletList.html:11 +msgid "Scanning funds..." +msgstr "S'estan escanejant els fons..." + +#: www/views/includes/screenshotWarningModal.html:7 +msgid "Screenshots are not secure" +msgstr "Les captures de pantalla no són segures" + +#: www/views/modals/search.html:6 +msgid "Search Transactions" +msgstr "Cerca transaccions" + +#: www/views/tab-send.html:13 +msgid "Search or enter bitcoin address" +msgstr "Cerca o introdueix l'adreça bitcoin" + +#: www/views/modals/search.html:16 +msgid "Search transactions" +msgstr "Cerca transaccions" + +#: www/views/preferencesAltCurrency.html:14 +msgid "Search your currency" +msgstr "Cerqueu la vostra moneda" + +#: www/views/preferences.html:30 +msgid "Security" +msgstr "Seguretat" + +#: www/views/modals/mercadolibre-card-details.html:64 +msgid "See invoice" +msgstr "Mostra la factura" + +#: www/views/tab-import-file.html:7 +msgid "Select a backup file" +msgstr "Seleccioneu un fitxer de còpia de seguretat" + +#: src/js/controllers/tab-receive.js:139 +msgid "Select a wallet" +msgstr "Seleccioneu una cartera" + +#: www/views/modals/paypro.html:38 +msgid "Self-signed Certificate" +msgstr "Certificat autofirmat" + +#: src/js/services/onGoingProcess.js:41 +msgid "Selling Bitcoin..." +msgstr "S'estan venent bitcoins..." + +#: www/views/feedback/send.html:13 +#: www/views/feedback/send.html:43 +#: www/views/tab-send.html:3 +#: www/views/tabs.html:15 +msgid "Send" +msgstr "Envia" + +#: www/views/feedback/send.html:3 +#: www/views/tab-settings.html:29 +msgid "Send Feedback" +msgstr "Envia comentaris" + +#: www/views/addressbook.view.html:31 +msgid "Send Money" +msgstr "Envia diners" + +#: www/views/allAddresses.html:19 +msgid "Send addresses by email" +msgstr "Envia adreces per correu electrònic" + +#: www/views/includes/logOptions.html:17 +#: www/views/tab-export-file.html:82 +msgid "Send by email" +msgstr "Envia per correu electrònic" + +#: src/js/controllers/confirm.js:177 +msgid "Send from" +msgstr "Envia des de" + +#: www/views/includes/itemSelector.html:8 +msgid "Send max amount" +msgstr "Envia import màxim" + +#: www/views/includes/incomingDataMenu.html:46 +msgid "Send payment to this address" +msgstr "Envia el pagament a aquesta adreça" + +#: www/views/feedback/rateApp.html:17 +msgid "Send us feedback instead" +msgstr "Envieu-nos un comentari" + +#: www/views/confirm.html:15 +#: www/views/includes/txp.html:12 +#: www/views/modals/txp-details.html:19 +#: www/views/tx-details.html:23 +msgid "Sending" +msgstr "S'està enviant" + +#: src/js/services/onGoingProcess.js:39 +msgid "Sending 2FA code..." +msgstr "S'està enviant el codi 2FA..." + +#: src/js/services/onGoingProcess.js:36 +msgid "Sending feedback..." +msgstr "S'està enviant el comentari..." + +#: www/views/confirm.html:16 +msgid "Sending maximum amount" +msgstr "S'està enviant la quantitat màxima" + +#: src/js/services/onGoingProcess.js:31 +msgid "Sending transaction" +msgstr "S'està enviant la transacció" + +#: src/js/controllers/confirm.js:545 +msgid "Sending {{amountStr}} from your {{name}} wallet" +msgstr "S'estan enviant {{amountStr}} des de la vostra cartera {{name}}" + +#: www/views/includes/walletHistory.html:42 +#: www/views/modals/tx-status.html:9 +#: www/views/topup.html:100 +#: www/views/tx-details.html:17 +msgid "Sent" +msgstr "Enviats" + +#: src/js/controllers/tx-details.js:129 +msgid "Sent Funds" +msgstr "Fons enviats" + +#: src/js/services/bwcError.js:38 +msgid "Server response could not be verified" +msgstr "La resposta del servidor no s'ha pogut verificar" + +#: src/js/controllers/buyAmazon.js:97 +#: src/js/controllers/buyMercadoLibre.js:97 +msgid "Service not available" +msgstr "Servei no disponible" + +#: www/views/includes/homeIntegrations.html:3 +msgid "Services" +msgstr "Serveis" + +#: www/views/preferencesLogs.html:3 +msgid "Session Log" +msgstr "Registre de la sessió" + +#: www/views/preferencesAbout.html:35 +msgid "Session log" +msgstr "Registre de la sessió" + +#: www/views/tab-export-file.html:10 +msgid "Set up a password" +msgstr "Especifiqueu una contrasenya" + +#: src/js/controllers/preferencesFee.js:85 +msgid "Set your own fee in satoshis/byte" +msgstr "Especifiqueu una comissió en satoshis/byte" + +#: www/views/tab-settings.html:3 +#: www/views/tabs.html:19 +msgid "Settings" +msgstr "Paràmetres" + +#: www/views/feedback/complete.html:17 +#: www/views/feedback/complete.html:26 +msgid "Share the love by inviting your friends." +msgstr "Compartiu la passió convidant els amics." + +#: www/views/copayers.html:20 +msgid "Share this invitation with your copayers" +msgstr "Compartiu aquesta invitació amb els copagadors" + +#: src/js/controllers/feedback/complete.js:5 +#: www/views/tab-settings.html:36 +msgid "Share {{appName}}" +msgstr "Comparteix {{appName}}" + +#: www/views/tab-import-hardware.html:24 +msgid "Shared Wallet" +msgstr "Cartera compartida" + +#: www/views/preferencesExternal.html:34 +msgid "Show Recovery Phrase" +msgstr "Mostra la frase de recuperació" + +#: www/views/tab-receive.html:34 +msgid "Show address" +msgstr "Mostra l'adreça" + +#: www/views/join.html:48 +#: www/views/tab-create-personal.html:27 +#: www/views/tab-create-shared.html:56 +#: www/views/tab-export-file.html:24 +#: www/views/tab-import-file.html:29 +#: www/views/tab-import-hardware.html:30 +#: www/views/tab-import-phrase.html:35 +msgid "Show advanced options" +msgstr "Mostra les opcions avançades" + +#: www/views/tab-send.html:37 +msgid "Show bitcoin address" +msgstr "Mostra l'adreça bitcoin" + +#: www/views/tab-send.html:59 +msgid "Show more" +msgstr "Mostra més" + +#: src/js/services/bwcError.js:104 +msgid "Signatures rejected by server" +msgstr "Firmes rebutjades pel servidor" + +#: src/js/services/onGoingProcess.js:32 +msgid "Signing transaction" +msgstr "S'està firmant la transacció" + +#: www/views/onboarding/backupRequest.html:6 +msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." +msgstr "Com que ningú més controla els vostres diners, heu de guardar la frase de seguretat per si aquesta aplicació s'esborra." + +#: www/views/tab-create-personal.html:122 +#: www/views/tab-create-shared.html:151 +msgid "Single Address Wallet" +msgstr "Cartera d'adreça única" + +#: www/views/onboarding/collectEmail.html:40 +#: www/views/onboarding/tour.html:11 +msgid "Skip" +msgstr "Omet" + +#: src/js/controllers/confirm.js:371 +#: src/js/controllers/modals/txpDetails.js:47 +msgid "Slide to accept" +msgstr "Feu lliscar per acceptar" + +#: www/views/buyAmazon.html:96 +msgid "Slide to buy" +msgstr "Feu lliscar per comprar" + +#: src/js/controllers/confirm.js:365 +msgid "Slide to pay" +msgstr "Feu lliscar per pagar" + +#: src/js/controllers/confirm.js:377 +#: src/js/controllers/modals/txpDetails.js:40 +msgid "Slide to send" +msgstr "Feu lliscar per enviar" + +#: www/views/cashScan.html:56 +msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" +msgstr "Algunes de les vostres carteres no són compatibles amb Bitcoin Cash. Podeu provar d'accedir als fons BCH amb" + +#: src/js/controllers/create.js:88 +#: src/js/controllers/join.js:71 +msgid "Specify Recovery Phrase..." +msgstr "Especifiqueu la frase de recuperació..." + +#: src/js/services/bwcError.js:92 +msgid "Spend proposal is not accepted" +msgstr "La proposta de despesa no s'ha acceptat" + +#: src/js/services/bwcError.js:95 +msgid "Spend proposal not found" +msgstr "La proposta de despesa no s'ha trobat" + +#: src/js/services/bwcError.js:137 +msgid "Spending Password needed" +msgstr "Contrasenya de despeses obligatòria" + +#: www/views/walletDetails.html:173 +msgid "Spending this balance will need significant Bitcoin network fees" +msgstr "Gastar aquest saldo requerirà importants comissions de la xarxa Bitcoin" + +#: www/views/tab-send.html:28 +msgid "Start sending bitcoin" +msgstr "Comença a enviar bitcoins" + +#: www/views/lockSetup.html:3 +msgid "Startup Lock" +msgstr "Bloqueig inicial" + +#: www/views/mercadoLibreCards.html:21 +#: www/views/modals/mercadolibre-card-details.html:42 +msgid "Still pending" +msgstr "Encara pendent" + +#: www/views/topup.html:101 +msgid "Success" +msgstr "Correcte" + +#: src/js/services/feeService.js:14 +msgid "Super Economy" +msgstr "Súper econòmic" + +#: www/views/preferencesCash.html:11 +msgid "Support Bitcoin Cash" +msgstr "Compatible amb Bitcoin Cash" + +#: www/views/paperWallet.html:7 +msgid "Sweep" +msgstr "Escombratge" + +#: www/views/includes/incomingDataMenu.html:89 +#: www/views/paperWallet.html:3 +msgid "Sweep paper wallet" +msgstr "Escombra la cartera de paper" + +#: src/js/services/onGoingProcess.js:33 +msgid "Sweeping Wallet..." +msgstr "S'està escombrant la cartera..." + +#: www/views/preferencesDeleteWallet.html:16 +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "AQUESTA ACCIÓ NO ES POT REVERTIR" + +#: www/views/onboarding/welcome.html:5 +msgid "Take control of your money,
get started with bitcoin." +msgstr "Controleu els vostres diners,
inicieu-vos al món dels bitcoins." + +#: www/views/walletDetails.html:132 +#: www/views/walletDetails.html:52 +msgid "Tap and hold to show" +msgstr "Manteniu premut per mostrar" + +#: www/views/includes/walletInfo.html:3 +msgid "Tap to recreate" +msgstr "Toqueu per reproduir" + +#: www/views/includes/walletInfo.html:4 +msgid "Tap to retry" +msgstr "Toqueu per reintentar" + +#: www/views/termsOfUse.html:3 +msgid "Terms Of Use" +msgstr "Condicions d'ús" + +#: www/views/modals/terms.html:3 +#: www/views/onboarding/disclaimer.html:29 +#: www/views/onboarding/disclaimer.html:43 +#: www/views/preferencesAbout.html:30 +msgid "Terms of Use" +msgstr "Condicions d'ús" + +#: www/views/tab-create-personal.html:118 +#: www/views/tab-import-phrase.html:68 +msgid "Testnet" +msgstr "Testnet" + +#: www/views/includes/incomingDataMenu.html:61 +msgid "Text" +msgstr "Text" + +#: src/js/controllers/feedback/send.js:27 +#: src/js/controllers/feedback/send.js:76 +#: www/views/feedback/complete.html:20 +#: www/views/feedback/rateApp.html:4 +msgid "Thank you!" +msgstr "Gràcies!" + +#: src/js/controllers/feedback/send.js:72 +msgid "Thanks!" +msgstr "Gràcies!" + +#: src/js/controllers/feedback/send.js:73 +msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" +msgstr "Ens en alegrem. Ens encantaria que ens donéssiu 5 estrelles. Com podem millorar la vostra experiència?" + +#: src/js/services/ledger.js:152 +msgid "The Ledger Chrome application is not installed" +msgstr "L'aplicació Ledger de Chrome no està instal·lada" + +#: www/views/modals/wallet-balance.html:55 +msgid "The amount of bitcoin immediately spendable from this wallet." +msgstr "Quantitat de bitcoins que es poden gastar immediatament des d'aquesta cartera." + +#: www/views/modals/wallet-balance.html:93 +msgid "The amount of bitcoin stored in this wallet that is allocated as inputs to your pending transaction proposals. The amount is determined using unspent transaction outputs associated with this wallet and may be more than the actual amounts associated with your pending transaction proposals." +msgstr "La quantitat de bitcoins emmagatzemada en aquesta cartera que s'assigna com a entrades a les vostres propostes de transacció pendents. L'import es determina en base a les sortides de transacció no gastades associades a aquesta cartera i pot superar les quantitats reals associades a les vostres propostes de transacció pendents." + +#: www/views/modals/wallet-balance.html:74 +msgid "The amount of bitcoin stored in this wallet with less than 1 blockchain confirmation." +msgstr "La quantitat de bitcoins emmagatzemada en aquesta cartera amb menys d'una confirmació blockchain." + +#: www/views/tab-import-phrase.html:5 +msgid "The derivation path" +msgstr "El camí de derivació" + +#: www/views/onboarding/tour.html:37 +msgid "The exchange rate changes with the market." +msgstr "El tipus de canvi canvia amb el mercat." + +#: www/views/preferencesFee.html:12 +msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." +msgstr "Com més alta és la comissió, més incentius té un miner per incloure la vostra transacció en un bloc. Les comissions es determinen a cada moment en funció de la càrrega de la xarxa i de la política seleccionada." + +#: www/views/addresses.html:51 +msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." +msgstr "S'ha assolit el nombre màxim d'adreces consecutives sense utilitzar (20). Quan una de les vostres adreces sense utilitzar rebi un pagament, es generarà una adreça nova que es mostrarà a la pestanya Rep." + +#: src/js/controllers/onboarding/terms.js:21 +msgid "The official English Terms of Service are available on the BitPay website." +msgstr "Les condicions de servei oficials estan disponibles en anglès al lloc web de BitPay." + +#: www/views/tab-import-phrase.html:4 +msgid "The password of the recovery phrase (if set)" +msgstr "La contrasenya de la frase de recuperació (si s'ha establert)" + +#: src/js/services/walletService.js:1139 +msgid "The payment was created but could not be completed. Please try again from home screen" +msgstr "El pagament s'ha creat però no s'ha pogut completar. Torneu-ho a provar des de la pantalla d'inici" + +#: www/views/modals/txp-details.html:26 +msgid "The payment was removed by creator" +msgstr "El creador ha eliminat el pagament" + +#: www/views/join.html:91 +#: www/views/tab-create-personal.html:63 +#: www/views/tab-create-shared.html:92 +#: www/views/tab-import-phrase.html:43 +msgid "The recovery phrase could require a password to be imported" +msgstr "La frase de recuperació pot requerir una contrasenya a l'hora d'importar-la" + +#: src/js/services/bwcError.js:56 +msgid "The request could not be understood by the server" +msgstr "El servidor no ha entès la petició" + +#: www/views/addresses.html:52 +msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." +msgstr "El procés de restauració s'atura quan s'han generat 20 adreces seguides sense fons. Per generar més adreces de manera segura, efectueu un pagament a una de les adreces sense utilitzar que ja s'hagi generat." + +#: src/js/services/bwcError.js:98 +msgid "The spend proposal is not pending" +msgstr "La proposta de despesa no està pendent" + +#: www/views/modals/wallet-balance.html:36 +msgid "The total amount of bitcoin stored in this wallet." +msgstr "La quantitat total de bitcoins emmagatzemats en aquesta cartera." + +#: www/views/preferencesHistory.html:27 +msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" +msgstr "L'historial de les transaccions i cada transacció nova entrant es guarden a la memòria cau de l'aplicació. Aquesta funció ho esborra tot i torna a sincronitzar des del servidor" + +#: www/views/tab-import-phrase.html:6 +msgid "The wallet service URL" +msgstr "L'URL del servei de la cartera" + +#: src/js/controllers/tab-home.js:38 +msgid "There is a new version of {{appName}} available" +msgstr "Hi ha una nova versió de {{appName}} disponible" + +#: src/js/controllers/import.js:229 +#: src/js/controllers/import.js:254 +#: src/js/controllers/import.js:335 +msgid "There is an error in the form" +msgstr "Hi ha un error al formulari" + +#: src/js/controllers/feedback/send.js:61 +#: src/js/controllers/feedback/send.js:65 +msgid "There's obviously something we're doing wrong." +msgstr "És evident que hi ha alguna cosa que estem fent malament." + +#: src/js/controllers/feedback/rateCard.js:38 +msgid "This app is fantastic!" +msgstr "Aquesta aplicació és fantàstica!" + +#: www/views/onboarding/tour.html:47 +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "Aquesta aplicació emmagatzema els vostres bitcoins amb una seguretat de tecnologia punta." + +#: src/js/controllers/confirm.js:523 +msgid "This bitcoin payment request has expired." +msgstr "Aquesta sol·licitud de pagament bitcoin ha caducat." + +#: www/views/join.html:133 +#: www/views/tab-create-personal.html:103 +#: www/views/tab-create-shared.html:132 +msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." +msgstr "Aquesta contrasenya no es pot recuperar. Si la contrasenya es perd, no es poden recuperar els fons de cap manera." + +#: www/views/backup.html:31 +msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." +msgstr "Aquesta frase de recuperació s'ha creat amb una contrasenya. Per recuperar aquesta cartera es necessita tant la frase de recuperació com la contrasenya." + +#: www/views/tx-details.html:91 +msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." +msgstr "Aquest import de transacció és massa petit comparat amb les comissions actuals de la xarxa Bitcoin. Gastar aquests fons suposarà una comissió de la xarxa Bitcoin comparable als fons en si." + +#: www/views/tx-details.html:87 +msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" +msgstr "Aquesta transacció pot trigar molta estona a confirmar-se o es pot anul·lar a causa de la baixa comissió establerta pel remitent" + +#: www/views/walletDetails.html:109 +#: www/views/walletDetails.html:29 +msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." +msgstr "Aquesta cartera no està registrada al Bitcore Wallet Service (BWS). Podeu tornar a crear-la a partir de la informació local." + +#: www/views/modals/txp-details.html:136 +#: www/views/tx-details.html:121 +msgid "Timeline" +msgstr "Cronologia" + +#: www/views/confirm.html:31 +#: www/views/includes/output.html:2 +#: www/views/modals/txp-details.html:109 +#: www/views/modals/txp-details.html:53 +#: www/views/tx-details.html:41 +#: www/views/tx-details.html:53 +msgid "To" +msgstr "Per a" + +#: www/views/tab-send.html:32 +msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." +msgstr "Per començar, compreu bitcoins o compartiu la vostra adreça. Podeu rebre bitcoins de qualsevol cartera o servei." + +#: www/views/tab-send.html:33 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Per començar, heu de crear una cartera bitcoin i obtenir uns quants bitcoins." + +#: src/js/services/bitpayAccountService.js:73 +msgid "To {{reason}} you must first add your BitPay account - {{email}}" +msgstr "Per {{reason}} ja heu d'haver afegit el vostre compte BitPay - {{email}}" + +#: src/js/services/onGoingProcess.js:48 +msgid "Top up in progress..." +msgstr "Recàrrega en curs..." + +#: src/js/controllers/topup.js:206 +msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" +msgstr "Recàrrega de {{amountStr}} a la targeta de dèbit ({{cardLastNumber}})" + +#: www/views/buyAmazon.html:61 +#: www/views/buyMercadoLibre.html:60 +#: www/views/modals/wallet-balance.html:23 +#: www/views/topup.html:70 +msgid "Total" +msgstr "Total" + +#: www/views/walletDetails.html:196 +msgid "Total Locked Balance" +msgstr "Total del saldo bloquejat" + +#: www/views/tab-create-shared.html:35 +msgid "Total number of copayers" +msgstr "Nombre total de copagadors" + +#: www/views/addresses.html:81 +msgid "Total wallet inputs" +msgstr "Total d'entrades de la cartera" + +#: src/js/services/fingerprintService.js:63 +#: src/js/services/fingerprintService.js:68 +msgid "Touch ID Failed" +msgstr "Touch ID ha fallat" + +#: src/js/controllers/tx-details.js:12 +msgid "Transaction" +msgstr "Transacció" + +#: www/views/confirm.html:126 +msgid "Transaction Created" +msgstr "Transacció creada" + +#: www/views/preferencesAdvanced.html:29 +#: www/views/preferencesHistory.html:3 +msgid "Transaction History" +msgstr "Historial de transaccions" + +#: src/js/services/bwcError.js:83 +msgid "Transaction already broadcasted" +msgstr "La transacció ja s'ha emès" + +#: src/js/controllers/buyAmazon.js:308 +#: src/js/controllers/buyMercadoLibre.js:301 +#: src/js/controllers/topup.js:281 +msgid "Transaction has not been created" +msgstr "La transacció no s'ha creat" + +#: www/views/topup.html:104 +msgid "Transaction initiated" +msgstr "Transacció iniciada" + +#: src/js/controllers/tx-details.js:119 +msgid "Transaction not available at this time" +msgstr "La transacció no està disponible en aquest moment" + +#: src/js/controllers/activity.js:45 +#: src/js/controllers/tab-home.js:174 +msgid "Transaction not found" +msgstr "No s'ha trobat la transacció" + +#: www/views/modals/chooseFeeLevel.html:55 +msgid "Transactions without fee are not supported." +msgstr "No s'admeten transaccions sense comissió." + +#: src/js/controllers/paperWallet.js:109 +msgid "Transfer to" +msgstr "Transfereix a" + +#: www/views/tab-send.html:67 +msgid "Transfer to Wallet" +msgstr "Transfereix a la cartera" + +#: www/views/modals/pin.html:13 +msgid "Try again in {{expires}}" +msgstr "Torneu-ho a provar d'aquí {{expires}}" + +#: www/views/bitpayCardIntro.html:18 +msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." +msgstr "Converteix bitcoins a dòlars, paga a qualsevol lloc on acceptin Visa®." + +#: www/views/tab-import-phrase.html:17 +msgid "Type the Recovery Phrase (usually 12 words)" +msgstr "Escriviu la frase de recuperació (normalment 12 paraules)" + +#: src/js/controllers/backup.js:75 +msgid "Uh oh..." +msgstr "Vaja..." + +#: www/views/tx-details.html:100 +msgid "Unconfirmed" +msgstr "Sense confirmar" + +#: www/views/walletDetails.html:190 +msgid "Unsent transactions" +msgstr "Transaccions no enviades" + +#: www/views/addresses.html:39 +msgid "Unused Addresses" +msgstr "Adreces sense utilitzar" + +#: www/views/addresses.html:50 +msgid "Unused Addresses Limit" +msgstr "Límit d'adreces sense utilitzar" + +#: src/js/controllers/tab-home.js:146 +msgid "Update Available" +msgstr "Actualització disponible" + +#: www/views/proposals.html:14 +msgid "Updating pending proposals. Please stand by" +msgstr "S'estan actualitzant les propostes pendents. Espereu" + +#: www/views/walletDetails.html:217 +msgid "Updating transaction history. Please stand by." +msgstr "S'està actualitzant l'historial de transaccions. Espereu." + +#: www/views/activity.html:14 +msgid "Updating... Please stand by" +msgstr "S'està actualitzant... Espereu" + +#: src/js/services/feeService.js:10 +msgid "Urgent" +msgstr "Urgent" + +#: www/views/advancedSettings.html:12 +msgid "Use Unconfirmed Funds" +msgstr "Utilitza els fons sense confirmar" + +#: src/js/services/onGoingProcess.js:34 +msgid "Validating recovery phrase..." +msgstr "S'està validant la frase de recuperació..." + +#: www/views/modals/fingerprintCheck.html:4 +msgid "Verify your identity" +msgstr "Verifiqueu la vostra identitat" + +#: www/views/preferencesAbout.html:14 +#: www/views/preferencesExternal.html:25 +msgid "Version" +msgstr "Versió" + +#: www/views/tab-export-file.html:69 +msgid "View" +msgstr "Mostra" + +#: www/views/addresses.html:34 +msgid "View All Addresses" +msgstr "Mostra totes les adreces" + +#: src/js/controllers/onboarding/terms.js:20 +msgid "View Terms of Service" +msgstr "Mostra les condicions de servei" + +#: src/js/controllers/bitpayCard.js:122 +#: src/js/controllers/tx-details.js:191 +msgid "View Transaction on Explorer.Bitcoin.com" +msgstr "Mostra la transacció a Explorer.Bitcoin.com" + +#: src/js/controllers/tab-home.js:148 +msgid "View Update" +msgstr "Mostra l'actualització" + +#: www/views/tx-details.html:147 +msgid "View on blockchain" +msgstr "Mostra a la blockchain" + +#: www/views/mercadoLibre.html:26 +msgid "Visit mercadolivre.com.br →" +msgstr "Visiteu mercadolivre.com.br →" + +#: www/views/walletDetails.html:182 +msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." +msgstr "AVÍS: La derivació de clau no funciona en aquest dispositiu/cartera. No es poden realitzar accions en aquesta cartera." + +#: www/views/tab-export-file.html:45 +msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "AVÍS: No incloure la clau privada permet comprovar el saldo de la cartera, l'historial de transaccions i crear propostes de despeses des del fitxer exportat. Ara bé, no permet aprovar (firmar) propostes; per tant els fons no seran accessibles des del fitxer exportat." + +#: www/views/tab-export-file.html:36 +msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "AVÍS: La clau privada d'aquesta cartera no està disponible. L'exportació permet comprovar el saldo de la cartera, l'historial de transaccions i crear propostes de despeses des del fitxer exportat. Ara bé, no permet aprovar (firmar) propostes; per tant els fons no seran accessibles des del fitxer exportat." + +#: www/views/modals/paypro.html:42 +msgid "WARNING: UNTRUSTED CERTIFICATE" +msgstr "AVÍS: EL CERTIFICAT NO ÉS DE CONFIANÇA" + +#: src/js/services/onGoingProcess.js:15 +msgid "Waiting for Ledger..." +msgstr "Esperant el Ledger..." + +#: src/js/services/onGoingProcess.js:16 +msgid "Waiting for Trezor..." +msgstr "Esperant el Trezor..." + +#: www/views/copayers.html:48 +msgid "Waiting for copayers" +msgstr "Esperant els copagadors" + +#: www/views/copayers.html:53 +msgid "Waiting..." +msgstr "Esperant..." + +#: www/views/addresses.html:3 +#: www/views/preferencesAdvanced.html:17 +msgid "Wallet Addresses" +msgstr "Adreces de la cartera" + +#: www/views/preferencesColor.html:4 +msgid "Wallet Color" +msgstr "Color de la cartera" + +#: www/views/preferencesInformation.html:29 +msgid "Wallet Configuration (m-n)" +msgstr "Configuració de la cartera (m-n)" + +#: www/views/onboarding/collectEmail.html:5 +msgid "Wallet Created" +msgstr "Cartera creada" + +#: www/views/preferencesInformation.html:23 +msgid "Wallet Id" +msgstr "Id de la cartera" + +#: www/views/preferencesAdvanced.html:13 +#: www/views/preferencesInformation.html:3 +msgid "Wallet Information" +msgstr "Informació de la cartera" + +#: www/views/addresses.html:76 +msgid "Wallet Inputs" +msgstr "Entrades de la cartera" + +#: www/views/join.html:26 +msgid "Wallet Invitation" +msgstr "Invitació de la cartera" + +#: www/views/join.html:60 +#: www/views/tab-create-personal.html:38 +#: www/views/tab-create-shared.html:67 +msgid "Wallet Key" +msgstr "Clau de la cartera" + +#: www/views/preferencesAlias.html:4 +msgid "Wallet Name" +msgstr "Nom de la cartera" + +#: www/views/preferencesInformation.html:11 +msgid "Wallet Name (at creation)" +msgstr "Nom de la cartera (en crear-la)" + +#: www/views/preferencesInformation.html:35 +msgid "Wallet Network" +msgstr "Xarxa de la cartera" + +#: www/views/join.html:77 +#: www/views/tab-create-personal.html:50 +#: www/views/tab-create-shared.html:79 +msgid "Wallet Recovery Phrase" +msgstr "Frase de recuperació de la cartera" + +#: src/js/services/bwcError.js:26 +msgid "Wallet Recovery Phrase is invalid" +msgstr "La frase de recuperació de la cartera no és vàlida" + +#: www/views/preferencesAdvanced.html:25 +#: www/views/tab-import-phrase.html:73 +msgid "Wallet Service URL" +msgstr "URL del servei de la cartera" + +#: www/views/preferences.html:4 +msgid "Wallet Settings" +msgstr "Paràmetres de la cartera" + +#: www/views/tab-import-hardware.html:11 +#: www/views/tab-import-phrase.html:61 +msgid "Wallet Type" +msgstr "Tipus de cartera" + +#: src/js/services/bwcError.js:59 +msgid "Wallet already exists" +msgstr "La cartera ja existeix" + +#: src/js/services/profileService.js:516 +msgid "Wallet already in {{appName}}" +msgstr "La cartera ja existeix a {{appName}}" + +#: www/views/includes/walletActivity.html:6 +msgid "Wallet created" +msgstr "Cartera creada" + +#: www/views/copayers.html:58 +msgid "Wallet incomplete and broken" +msgstr "Cartera incompleta i trencada" + +#: src/js/services/bwcError.js:65 +msgid "Wallet is full" +msgstr "La cartera està plena" + +#: src/js/services/bwcError.js:125 +msgid "Wallet is locked" +msgstr "La cartera està bloquejada" + +#: src/js/services/bwcError.js:128 +msgid "Wallet is not complete" +msgstr "La cartera no està completa" + +#: www/views/tab-create-personal.html:12 +#: www/views/tab-create-shared.html:12 +msgid "Wallet name" +msgstr "Nom de la cartera" + +#: src/js/services/bwcError.js:131 +msgid "Wallet needs backup" +msgstr "La cartera requereix una còpia de seguretat" + +#: www/views/tab-receive.html:59 +#: www/views/walletDetails.html:169 +msgid "Wallet not backed up" +msgstr "Cartera sense còpia de seguretat" + +#: src/js/services/bwcError.js:68 +msgid "Wallet not found" +msgstr "No s'ha trobat la cartera" + +#: src/js/controllers/cashScan.js:81 +#: src/js/controllers/tab-home.js:230 +msgid "Wallet not registered" +msgstr "No s'ha registrat la cartera" + +#: src/js/services/bwcError.js:29 +msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "La cartera no s'ha registrat a Wallet Service. Torneu-la a crear des de \"Crea cartera\" amb \"Opcions avançades\" per definir la vostra frase de recuperació" + +#: www/views/backup.html:12 +msgid "Wallet recovery phrase not available" +msgstr "La frase de recuperació de la cartera no està disponible" + +#: src/js/services/bwcError.js:50 +msgid "Wallet service not found" +msgstr "No s'ha trobat Wallet Service" + +#: www/views/tab-home.html:69 +msgid "Wallets" +msgstr "Carteres" + +#: src/js/controllers/addressbookView.js:36 +#: src/js/controllers/modals/txpDetails.js:153 +#: src/js/controllers/modals/txpDetails.js:170 +#: src/js/controllers/preferencesDelete.js:24 +#: src/js/controllers/preferencesExternal.js:14 +#: www/views/preferencesDeleteWallet.html:11 +msgid "Warning!" +msgstr "Avís!" + +#: www/views/modals/txp-details.html:47 +msgid "Warning: this transaction has unconfirmed inputs" +msgstr "Avís: Aquesta transacció té entrades no confirmades" + +#: src/js/controllers/onboarding/backupRequest.js:17 +msgid "Watch out!" +msgstr "Compte!" + +#: src/js/controllers/feedback/send.js:69 +msgid "We'd love to do better." +msgstr "Ens agradaria fer-ho millor." + +#: www/views/backup.html:35 +msgid "We'll confirm on the next screen." +msgstr "Ho confirmarem a la pantalla següent." + +#: src/js/controllers/feedback/send.js:77 +msgid "We're always looking for ways to improve {{appName}}." +msgstr "Sempre intentem millorar {{appName}}." + +#: src/js/controllers/feedback/send.js:83 +msgid "We're always looking for ways to improve {{appName}}. How could we improve your experience?" +msgstr "Sempre intentem millorar {{appName}}. Com podríem millorar la vostra experiència?" + +#: www/views/includes/incomingDataMenu.html:6 +msgid "Website" +msgstr "Lloc web" + +#: www/views/preferencesLanguage.html:16 +msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." +msgstr "Sempre busquem gent que contribueixi a les traduccions. Podeu fer correccions o ajudar a fer que aquesta aplicació estigui disponible en la vostra llengua unint-vos a la nostra comunitat de Crowdin." + +#: www/views/preferencesAlias.html:11 +msgid "What do you call this wallet?" +msgstr "Quin nom voleu posar a aquesta cartera?" + +#: www/views/preferencesAlias.html:12 +msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." +msgstr "Quan es va crear aquesta cartera, va rebre el nom: “{{walletName}}”. Podeu canviar el nom que es mostra en aquest dispositiu a sota." + +#: www/views/onboarding/collectEmail.html:10 +msgid "Where would you like to receive email notifications about payments?" +msgstr "A on voleu rebre les notificacions per e-mail sobre els pagaments?" + +#: www/views/addresses.html:19 +msgid "Why?" +msgstr "Per què?" + +#: www/views/feedback/rateApp.html:10 +msgid "Would you be willing to rate {{appName}} in the app store?" +msgstr "Voldríeu valorar {{appName}} a la botiga d'aplicacions?" + +#: www/views/onboarding/notifications.html:4 +msgid "Would you like to receive push notifications about payments?" +msgstr "Voleu rebre notificacions push sobre els pagaments?" + +#: src/js/controllers/import.js:288 +msgid "Wrong number of recovery words:" +msgstr "Nombre de paraules de recuperació incorrecte:" + +#: src/js/services/bwcError.js:140 +msgid "Wrong spending password" +msgstr "Contrasenya de pagaments incorrecta" + +#: www/views/modals/confirmation.html:7 +msgid "Yes" +msgstr "Sí" + +#: src/js/controllers/onboarding/backupRequest.js:25 +msgid "Yes, skip" +msgstr "Sí, omet" + +#: src/js/controllers/onboarding/backupRequest.js:24 +msgid "You can create a backup later from your wallet settings." +msgstr "Podeu crear una còpia de seguretat més tard des dels paràmetres de la cartera." + +#: src/js/controllers/preferencesLanguage.js:12 +msgid "You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!" +msgstr "Podeu fer contribucions registrant-vos al nostre web de la comunitat de traductors de Crowdin. Us hi esperem!" + +#: www/views/tab-scan.html:16 +msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." +msgstr "Podeu escanejar adreces bitcoin, sol·licituds de pagament, carteres de paper i més coses." + +#: src/js/controllers/preferencesAbout.js:14 +msgid "You can see the latest developments and contribute to this open source app by visiting our project on GitHub." +msgstr "Podeu veure les últimes novetats i contribuir a aquesta aplicació de codi obert visitant el nostre projecte a GitHub." + +#: www/views/onboarding/tour.html:19 +msgid "You can spend bitcoin at millions of websites and stores worldwide." +msgstr "Podeu pagar amb bitcoins en milions de llocs web i botigues d'arreu del món." + +#: www/views/backup.html:15 +msgid "You can still export it from Advanced > Export." +msgstr "Encara es pot exportar des d'Avançades > Exporta." + +#: www/views/onboarding/tour.html:32 +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "Els podeu canviar per altres monedes com ara dòlars americans, euros o lliures esterlines." + +#: www/views/onboarding/tour.html:46 +msgid "You control your bitcoin." +msgstr "Controleu els vostres bitcoins." + +#: www/views/modals/chooseFeeLevel.html:64 +msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." +msgstr "No hauríeu d'establir una comissió superior a {{maxFeeRecommended}} satoshis/byte." + +#: www/views/modals/bitpay-card-confirmation.html:5 +msgid "You will need to log back for fill in your BitPay Card." +msgstr "Haureu de tornar a iniciar la sessió per completar la BitPay Card." + +#: www/views/preferencesNotifications.html:34 +msgid "You'll receive email notifications about payments sent and received from your wallets." +msgstr "Rebreu notificacions per e-mail sobre pagaments enviats i rebuts de les vostres carteres." + +#: www/views/bitpayCard.html:50 +msgid "Your BitPay Card is ready. Add funds to your card to start using it at stores and ATMs worldwide." +msgstr "La BitPay Card ja està a punt. Afegiu fons a la targeta per començar a utilitzar-la en botigues i caixers automàtics de tot el món." + +#: www/views/mercadoLibre.html:57 +#: www/views/mercadoLibreCards.html:6 +msgid "Your Gift Cards" +msgstr "Les vostres targetes regal" + +#: www/views/includes/confirmBackupPopup.html:6 +msgid "Your bitcoin wallet is backed up!" +msgstr "La vostra cartera bitcoin ja té una còpia de seguretat!" + +#: www/views/tab-home.html:36 +msgid "Your bitcoin wallet is ready!" +msgstr "La vostra cartera bitcoin ja està a punt!" + +#: www/views/modals/chooseFeeLevel.html:61 +msgid "Your fee is lower than recommended." +msgstr "La vostra comissió és inferior a la recomanada." + +#: www/views/feedback/send.html:42 +msgid "Your ideas, feedback, or comments" +msgstr "Les vostres idees, opinions o comentaris" + +#: www/views/tab-create-shared.html:22 +msgid "Your name" +msgstr "El vostre nom" + +#: www/views/join.html:16 +msgid "Your nickname" +msgstr "El vostre sobrenom" + +#: www/views/tab-export-file.html:11 +#: www/views/tab-import-file.html:20 +msgid "Your password" +msgstr "La vostra contrasenya" + +#: www/views/buyAmazon.html:102 +msgid "Your purchase could not be completed" +msgstr "La compra no s'ha pogut completar" + +#: www/views/buyAmazon.html:105 +msgid "Your purchase was added to the list of pending" +msgstr "La compra s'ha afegit a la llista de pendents" + +#: www/views/onboarding/backupRequest.html:10 +msgid "Your wallet is never saved to cloud storage or standard device backups." +msgstr "La vostra cartera no es desa mai en un emmagatzematge al núvol ni en dispositius de còpies de seguretat estàndard." + +#: src/js/services/walletService.js:1030 +msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down." +msgstr "La clau de la cartera s'encriptarà. La contrasenya de despeses no es pot recuperar. Sobretot, apunteu-vos-la." + +#: www/views/includes/walletList.html:13 +#: www/views/includes/walletSelector.html:21 +#: www/views/paperWallet.html:33 +#: www/views/tab-receive.html:72 +#: www/views/walletDetails.html:131 +#: www/views/walletDetails.html:51 +msgid "[Balance Hidden]" +msgstr "[Saldo ocult]" + +#: www/views/walletDetails.html:141 +#: www/views/walletDetails.html:61 +msgid "[Scanning Funds]" +msgstr "[S'estan escanejant els fons]" + +#: src/js/controllers/bitpayCardIntro.js:11 +msgid "add your BitPay Visa card(s)" +msgstr "afegiu les vostres targetes BitPay Visa" + +#: www/views/includes/available-balance.html:8 +msgid "locked by pending payments" +msgstr "bloquejat per pagaments pendents" + +#: src/js/services/profileService.js:404 +msgid "me" +msgstr "jo" + +#: www/views/addressbook.add.html:32 +msgid "name@example.com" +msgstr "nom@exemple.com" + +#: www/views/preferencesHistory.html:15 +msgid "preparing..." +msgstr "s'està preparant..." + +#: www/views/cashScan.html:57 +msgid "recovery tool." +msgstr "l'eina de recuperació." + +#: src/js/controllers/buyAmazon.js:239 +msgid "{{amountStr}} for Amazon.com Gift Card" +msgstr "{{amountStr}} per a la targeta regal Amazon.com" + +#: src/js/controllers/buyMercadoLibre.js:237 +msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" +msgstr "{{amountStr}} per a la targeta regal Mercado Livre Brazil" + +#: www/views/preferencesBwsUrl.html:21 +msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." +msgstr "{{appName}} depèn de Bitcore Wallet Service (BWS) per a la informació blockchain, la gestió de xarxes i la sincronització de Copayer. La configuració per defecte apunta a https://bws.bitpay.com (instància BWS pública de BitPay)." + +#: src/js/controllers/confirm.js:408 +msgid "{{fee}} will be deducted for bitcoin networking fees." +msgstr "{{fee}} es descomptarà per la comissió de la xarxa bitcoin." + +#: www/views/confirm.html:85 +msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" +msgstr "{{tx.txp[wallet.id].feeRatePerStr}} de l'import de l'enviament" + +#: www/views/walletDetails.html:218 +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "{{updatingTxHistoryProgress}} transaccions descarregades" + +#: www/views/cashScan.html:33 +#: www/views/copayers.html:46 +#: www/views/includes/walletInfo.html:18 +msgid "{{wallet.m}}-of-{{wallet.n}}" +msgstr "{{wallet.m}}-de-{{wallet.n}}" + diff --git a/i18n/po/cs/template-cs.po b/i18n/po/cs/template-cs.po index 95f842f86..8aad5ecb2 100644 --- a/i18n/po/cs/template-cs.po +++ b/i18n/po/cs/template-cs.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Czech\n" "Language: cs\n" -"PO-Revision-Date: 2018-05-08 00:44-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:46+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -989,7 +989,7 @@ msgstr "Povolit push notifikace" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "Povolit zvuky" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1342,7 +1342,7 @@ msgstr "Začněte" #: www/views/addressbook.html:20 msgid "Get started by adding your first one." -msgstr "Začněte přidáním své první." +msgstr "Začněte přidáním prvního." #: src/js/services/onGoingProcess.js:23 msgid "Getting fee levels..." @@ -1582,7 +1582,7 @@ msgstr "Nesprávná síťová adresa" #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "Nedostatečné potvrzené prostředky" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -1709,7 +1709,7 @@ msgstr "Načítání informací o transakci..." #: www/views/tab-settings.html:100 msgid "Lock App" -msgstr "Uzamknout aplikaci" +msgstr "Uzamknutí aplikace" #: src/js/controllers/lockSetup.js:23 msgid "Lock by Fingerprint" @@ -2049,7 +2049,7 @@ msgstr "Otevřít GitHub projekt" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "Otevřít Explorer" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -2256,7 +2256,7 @@ msgstr "Stiskněte znovu pro ukončení" #: src/js/services/feeService.js:11 msgid "Priority" -msgstr "Priorita" +msgstr "Prioritní" #: www/views/includes/incomingDataMenu.html:80 msgid "Private Key" @@ -3196,7 +3196,7 @@ msgstr "Zobrazit Podmínky použití" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "Zobrazit transakci na Explorer.Bitcoin.com" #: src/js/controllers/tab-home.js:148 msgid "View Update" diff --git a/i18n/po/de/template-de.po b/i18n/po/de/template-de.po index 6da7f8157..9767a07a7 100644 --- a/i18n/po/de/template-de.po +++ b/i18n/po/de/template-de.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: German\n" "Language: de\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:49+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -32,7 +32,7 @@ msgstr "- {{btx.feeRateStr}}ของธุรกรรม" #: www/views/modals/txp-details.html:102 msgid "- {{tx.feeRateStr}} of the transaction" -msgstr "" +msgstr "- {{tx.feeRateStr}} der Transaktion" #: www/views/feedback/rateApp.html:7 msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!" @@ -41,7 +41,7 @@ msgstr "Eine 5-Sterne Bewertung hilft uns, {{appName}} unter die Leute zu bringe #: www/views/mercadoLibre.html:18 #: www/views/mercadoLibre.html:40 msgid "Only redeemable on Mercado Livre (Brazil)" -msgstr "" +msgstr "Nur einlösbar auf Mercado Livre (Brasilien)" #: src/js/controllers/feedback/send.js:27 #: www/views/feedback/complete.html:21 @@ -124,7 +124,7 @@ msgstr "Ein optionales Passwort zur Sicherung der Wiederherstellungsphrase hinzu #: www/views/includes/incomingDataMenu.html:41 msgid "Add as a contact" -msgstr "" +msgstr "Als Kontakt hinzufügen" #: src/js/controllers/confirm.js:424 msgid "Add description" @@ -132,11 +132,11 @@ msgstr "Beschreibung hinzufügen" #: www/views/topup.html:6 msgid "Add funds" -msgstr "" +msgstr "Guthaben aufladen" #: src/js/services/bitpayAccountService.js:78 msgid "Add this BitPay account ({{email}})?" -msgstr "" +msgstr "Dieses BitPay Konto hinzufügen ({{email}})?" #: www/views/add.html:3 msgid "Add wallet" @@ -204,7 +204,7 @@ msgstr "Alternative Währung" #: src/js/controllers/buyAmazon.js:98 msgid "Amazon.com is not available at this moment. Please try back later." -msgstr "" +msgstr "Amazon.com ist zurzeit nicht verfügbar. Bitte versuchen Sie es später nochmal." #: www/views/amount.html:44 #: www/views/customAmount.html:34 @@ -222,7 +222,7 @@ msgstr "Betrag zu hoch" #: www/views/includes/walletHistory.html:31 msgid "Amount too low to spend" -msgstr "" +msgstr "Betrag ist zu niedrig zum ausgeben" #: src/js/controllers/tab-home.js:147 msgid "An update to this app is available. For your security, please update to the latest version." @@ -359,12 +359,12 @@ msgstr "Bitcoin-Adresse" #: www/views/cashScan.html:4 msgid "Bitcoin Cash (BCH) Balances" -msgstr "" +msgstr "Bitcoin Cash (BCH) Guthaben" #: www/views/preferencesCash.html:3 #: www/views/tab-settings.html:47 msgid "Bitcoin Cash Support" -msgstr "" +msgstr "Bitcoin Cash Support" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 @@ -380,11 +380,11 @@ msgstr "Bitcoin-Netzwerk Gebührenübersicht" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "" +msgstr "Bitcoin Core Brieftaschen" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" -msgstr "" +msgstr "Bitcoin Cash Zahlung" #: www/views/onboarding/tour.html:31 msgid "Bitcoin is a currency." @@ -404,7 +404,7 @@ msgstr "Bitcoin Transaktionen enthalten eine Gebühr für die \"Miners\" im Netz #: www/views/buyAmazon.html:108 msgid "Bought {{amountUnitStr}}" -msgstr "" +msgstr "{{amountUnitStr}} erworben" #: www/views/modals/txp-details.html:36 msgid "Broadcast Payment" @@ -474,7 +474,7 @@ msgstr "Abbruch" #: www/views/copayers.html:36 msgid "Cancel invitation" -msgstr "" +msgstr "Einladung zurückziehen" #: src/js/controllers/onboarding/tour.js:52 msgid "Cannot Create Wallet" @@ -519,7 +519,7 @@ msgstr "Cache leeren" #: src/js/controllers/confirm.js:373 #: src/js/controllers/modals/txpDetails.js:49 msgid "Click to accept" -msgstr "" +msgstr "Klicken Sie zum Akzeptieren" #: src/js/controllers/confirm.js:367 msgid "Click to pay" diff --git a/i18n/po/es-ES/template-es-ES.po b/i18n/po/es-ES/template-es-ES.po index 9f060b91f..046826130 100644 --- a/i18n/po/es-ES/template-es-ES.po +++ b/i18n/po/es-ES/template-es-ES.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Spanish\n" "Language: es\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:57+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/fa/template-fa.po b/i18n/po/fa/template-fa.po index c9e75d484..dfd490fda 100644 --- a/i18n/po/fa/template-fa.po +++ b/i18n/po/fa/template-fa.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Persian\n" "Language: fa\n" -"PO-Revision-Date: 2018-05-08 00:44-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:53+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -989,7 +989,7 @@ msgstr "فعال کردن اعلان های با فرمت push" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "فعال کردن صدا" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1582,7 +1582,7 @@ msgstr "آدرس شبکه نادرست" #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "موجودی تائید شذه ناکافی" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -2049,7 +2049,7 @@ msgstr "باز کردن پروژه GitHub" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "باز کردن مرورگر" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -3196,7 +3196,7 @@ msgstr "مشاهده شرایط و ضوابط خدمات" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "مشاهده تراکنش در Explorer.Bitcoin.com" #: src/js/controllers/tab-home.js:148 msgid "View Update" diff --git a/i18n/po/fr/template-fr.po b/i18n/po/fr/template-fr.po index eefa48b8d..559799342 100644 --- a/i18n/po/fr/template-fr.po +++ b/i18n/po/fr/template-fr.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: French\n" "Language: fr\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:48+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/it/template-it.po b/i18n/po/it/template-it.po index 48209552b..0055adf06 100644 --- a/i18n/po/it/template-it.po +++ b/i18n/po/it/template-it.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Italian\n" "Language: it\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:50+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/ja/template-ja.po b/i18n/po/ja/template-ja.po index 7accc6adc..8cdbd23ec 100644 --- a/i18n/po/ja/template-ja.po +++ b/i18n/po/ja/template-ja.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Japanese\n" "Language: ja\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:51+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/ko/template-ko.po b/i18n/po/ko/template-ko.po index 1a667b7c8..67cfe2496 100644 --- a/i18n/po/ko/template-ko.po +++ b/i18n/po/ko/template-ko.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Korean\n" "Language: ko\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:52+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/nl/template-nl.po b/i18n/po/nl/template-nl.po index cead01c29..c47511226 100644 --- a/i18n/po/nl/template-nl.po +++ b/i18n/po/nl/template-nl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Dutch\n" "Language: nl\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:48+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/pl/template-pl.po b/i18n/po/pl/template-pl.po index b7ea15353..4a9f5c0ea 100644 --- a/i18n/po/pl/template-pl.po +++ b/i18n/po/pl/template-pl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Polish\n" "Language: pl\n" -"PO-Revision-Date: 2018-05-08 00:44-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:54+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/pt-BR/template-pt-BR.po b/i18n/po/pt-BR/template-pt-BR.po index 802760d9d..ef43aa4ef 100644 --- a/i18n/po/pt-BR/template-pt-BR.po +++ b/i18n/po/pt-BR/template-pt-BR.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:55+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/i18n/po/ru/template-ru.po b/i18n/po/ru/template-ru.po index 48aacaf6e..163473060 100644 --- a/i18n/po/ru/template-ru.po +++ b/i18n/po/ru/template-ru.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Russian\n" "Language: ru\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:56+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -32,7 +32,7 @@ msgstr "{{feeRateStr}} транзакции" #: www/views/modals/txp-details.html:102 msgid "- {{tx.feeRateStr}} of the transaction" -msgstr "" +msgstr "— {{tx.feeRateStr}} транзакции" #: www/views/feedback/rateApp.html:7 msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!" @@ -41,7 +41,7 @@ msgstr "=896t7!" #: www/views/mercadoLibre.html:18 #: www/views/mercadoLibre.html:40 msgid "Only redeemable on Mercado Livre (Brazil)" -msgstr "" +msgstr "Погасить можно только на Mercado Livre (Бразилия)" #: src/js/controllers/feedback/send.js:27 #: www/views/feedback/complete.html:21 @@ -136,7 +136,7 @@ msgstr "Пополнить счёт" #: src/js/services/bitpayAccountService.js:78 msgid "Add this BitPay account ({{email}})?" -msgstr "" +msgstr "Добавить этот аккаунт BitPay ({{email}})?" #: www/views/add.html:3 msgid "Add wallet" @@ -163,7 +163,7 @@ msgstr "Адреса с балансом" #: www/views/tab-settings.html:149 msgid "Advanced" -msgstr "Дополнительные возможности" +msgstr "Расширенные" #: www/views/advancedSettings.html:3 msgid "Advanced Settings" @@ -204,7 +204,7 @@ msgstr "Альтернативная валюта" #: src/js/controllers/buyAmazon.js:98 msgid "Amazon.com is not available at this moment. Please try back later." -msgstr "" +msgstr "Сайт Amazon.com сейчас недоступен. Попробуйте позже." #: www/views/amount.html:44 #: www/views/customAmount.html:34 @@ -222,7 +222,7 @@ msgstr "Слишком большая сумма" #: www/views/includes/walletHistory.html:31 msgid "Amount too low to spend" -msgstr "" +msgstr "Сумма слишком мала, чтобы ее потратить" #: src/js/controllers/tab-home.js:147 msgid "An update to this app is available. For your security, please update to the latest version." @@ -234,7 +234,7 @@ msgstr "Любой, у кого есть доступ к вашему ключе #: www/views/addresses.html:94 msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" -msgstr "" +msgstr "Приблизительная комиссия сети Биткойн для перевода баланса кошелька (с нормальным приоритетом)" #: www/views/backupWarning.html:10 msgid "Are you being watched?" @@ -270,7 +270,7 @@ msgstr "Вы точно хотите пропустить резервное к #: www/views/modals/bitpay-card-confirmation.html:4 msgid "Are you sure you would like to log out of your BitPay Card account?" -msgstr "" +msgstr "Действительно выйти из аккаунта BitPay Card?" #: src/js/controllers/preferencesBitpayCard.js:7 #: src/js/controllers/preferencesBitpayServices.js:20 @@ -359,17 +359,17 @@ msgstr "Биткойн-адрес" #: www/views/cashScan.html:4 msgid "Bitcoin Cash (BCH) Balances" -msgstr "" +msgstr "Балансы Bitcoin Cash (BCH)" #: www/views/preferencesCash.html:3 #: www/views/tab-settings.html:47 msgid "Bitcoin Cash Support" -msgstr "" +msgstr "Поддержка Bitcoin Cash" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 msgid "Bitcoin Cash Wallets" -msgstr "" +msgstr "Кошельки Bitcoin Cash" #: www/views/modals/chooseFeeLevel.html:4 #: www/views/preferencesFee.html:4 @@ -380,11 +380,11 @@ msgstr "Политика комиссии сети Биткойн" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "" +msgstr "Кошельки Bitcoin Core" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" -msgstr "" +msgstr "Платеж Bitcoin Cash" #: www/views/onboarding/tour.html:31 msgid "Bitcoin is a currency." @@ -392,7 +392,7 @@ msgstr "Биткойн - это валюта." #: www/views/onboarding/disclaimer.html:15 msgid "Bitcoin is different – it cannot be safely held with a bank or web service." -msgstr "" +msgstr "С биткойнами всё иначе: их нельзя безопасно хранить в банке или на веб-сервисе." #: www/views/onboarding/tour.html:18 msgid "Bitcoin is secure,
digital money." @@ -400,11 +400,11 @@ msgstr "Биткойн это безопасные,
цифровые день #: www/views/preferencesFee.html:11 msgid "Bitcoin transactions include a fee collected by miners on the network." -msgstr "" +msgstr "Транзакции с биткойнами включают в себя комиссию майнеров сети." #: www/views/buyAmazon.html:108 msgid "Bought {{amountUnitStr}}" -msgstr "" +msgstr "Куплено {{amountUnitStr}}" #: www/views/modals/txp-details.html:36 msgid "Broadcast Payment" @@ -629,7 +629,7 @@ msgstr "Помочь в переводе" #: src/js/controllers/confirm.js:130 msgid "Copay only supports Bitcoin Cash using new version numbers addresses" -msgstr "" +msgstr "«Copay» поддерживает только Bitcoin Cash с новой адресацией номеров версий" #: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" @@ -671,7 +671,7 @@ msgstr "Скопировать в буфер обмена" #: src/js/controllers/buyMercadoLibre.js:102 msgid "Could not access Gift Card Service" -msgstr "" +msgstr "Не удалось получить доступ к сервису подарочных карт" #: www/views/tab-import-phrase.html:2 msgid "Could not access the wallet at the server. Please check:" @@ -733,7 +733,7 @@ msgstr "Не удалось удалить предложенный платёж #: src/js/controllers/cashScan.js:117 msgid "Could not duplicate" -msgstr "" +msgstr "Не удалось дублировать" #: src/js/services/feeService.js:73 msgid "Could not get dynamic fee" @@ -745,13 +745,13 @@ msgstr "Не удалось получить динамическую комис #: src/js/controllers/modals/feeLevels.js:112 msgid "Could not get fee levels" -msgstr "" +msgstr "Не удалось получить комиссии" #: src/js/controllers/buyAmazon.js:122 #: src/js/controllers/buyMercadoLibre.js:122 #: src/js/controllers/topup.js:100 msgid "Could not get the invoice" -msgstr "" +msgstr "Не удалось получить инвойс" #: src/js/controllers/bitpayCard.js:66 msgid "Could not get transactions" @@ -855,7 +855,7 @@ msgstr "Текущая комиссия для этой политики" #: src/js/services/feeService.js:15 msgid "Custom" -msgstr "" +msgstr "Комиссия" #: www/views/customAmount.html:9 msgid "Custom Amount" @@ -863,7 +863,7 @@ msgstr "Сумма" #: src/js/controllers/preferencesFee.js:85 msgid "Custom Fee" -msgstr "Пользовательская комиссия" +msgstr "Комиссия" #: www/views/modals/mercadolibre-card-details.html:56 #: www/views/modals/txp-details.html:87 @@ -940,11 +940,11 @@ msgstr "Скачать" #: www/views/cashScan.html:37 msgid "Duplicate for BCH" -msgstr "" +msgstr "Дубликат для BCH" #: src/js/services/onGoingProcess.js:49 msgid "Duplicating wallet..." -msgstr "" +msgstr "Дублирование кошелька..." #: www/views/addresses.html:19 msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." @@ -961,7 +961,7 @@ msgstr "Редактировать" #: www/views/addressbook.add.html:29 #: www/views/addressbook.view.html:22 msgid "Email" -msgstr "" +msgstr "Адрес эл. почты" #: www/views/preferencesNotifications.html:42 msgid "Email Address" @@ -973,7 +973,7 @@ msgstr "Достигнут предел пустых адресов. Новые #: www/views/preferencesCash.html:17 msgid "Enable Bitcoin Cash wallet creation and operation within the App." -msgstr "" +msgstr "Включить использование в программе и создание кошельков Bitcoin Cash." #: www/views/tab-scan.html:19 msgid "Enable camera access in your device settings to get started." @@ -989,7 +989,7 @@ msgstr "Включить push-уведомления" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "Включить звук" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -997,7 +997,7 @@ msgstr "Чтобы начать, включите камеру." #: www/views/tab-settings.html:49 msgid "Enabled" -msgstr "" +msgstr "Включено" #: src/js/services/walletService.js:1047 #: src/js/services/walletService.js:1062 @@ -1014,7 +1014,7 @@ msgstr "Введите сумму" #: www/views/modals/chooseFeeLevel.html:41 msgid "Enter custom fee" -msgstr "Ввести пользовательское значение комиссии" +msgstr "Ввести размер комиссии" #: src/js/services/walletService.js:1029 msgid "Enter new spending password" @@ -1124,7 +1124,7 @@ msgstr "Ошибка создания Подарочной карты" #: src/js/controllers/buyAmazon.js:94 #: src/js/controllers/buyMercadoLibre.js:94 msgid "Error creating the invoice" -msgstr "Ошибка создания инвойса" +msgstr "Ошибка при создании инвойса" #: src/js/services/profileService.js:412 msgid "Error creating wallet" @@ -1132,17 +1132,17 @@ msgstr "Ошибка создания кошелька" #: src/js/controllers/confirm.js:296 msgid "Error getting SendMax information" -msgstr "" +msgstr "Ошибка при получении информации SendMax" #: src/js/controllers/buyAmazon.js:136 #: src/js/controllers/buyMercadoLibre.js:136 #: src/js/controllers/topup.js:114 msgid "Error in Payment Protocol" -msgstr "" +msgstr "Ошибка в платежном протоколе" #: src/js/controllers/bitpayCardIntro.js:14 msgid "Error pairing BitPay Account" -msgstr "" +msgstr "Ошибка при связывании с аккаунтом BitPay" #: src/js/controllers/paperWallet.js:41 msgid "Error scanning funds:" @@ -1154,7 +1154,7 @@ msgstr "Ошибка считывания кошелька:" #: src/js/controllers/bitpayCardIntro.js:20 msgid "Error updating Debit Cards" -msgstr "Ошибка обновления Дебетовых Карт" +msgstr "Ошибка обновления дебетовых карт" #: src/js/services/bwcError.js:143 msgid "Exceeded daily limit of $500 per user" @@ -1166,12 +1166,12 @@ msgstr "Превышен дневной лимит в 500$ на пользова #: www/views/modals/mercadolibre-card-details.html:34 #: www/views/modals/txp-details.html:119 msgid "Expired" -msgstr "Истекла" +msgstr "Просрочено" #: www/views/modals/paypro.html:54 #: www/views/modals/txp-details.html:125 msgid "Expires" -msgstr "истёк" +msgstr "Срок действия" #: www/views/preferencesAdvanced.html:21 msgid "Export Wallet" @@ -1197,7 +1197,7 @@ msgstr "Расширенные открытые ключи" #: src/js/services/onGoingProcess.js:20 msgid "Extracting Wallet information..." -msgstr "Выполняется извлечение информации из кошелька..." +msgstr "Извлечение информации о кошельке..." #: src/js/controllers/export.js:115 #: src/js/controllers/export.js:126 @@ -1218,11 +1218,11 @@ msgstr "Комиссия" #: www/views/modals/chooseFeeLevel.html:75 msgid "Fee level" -msgstr "" +msgstr "Уровень комиссии" #: src/js/controllers/modals/feeLevels.js:100 msgid "Fee level is not defined" -msgstr "" +msgstr "Уровень комиссии не задан" #: www/views/confirm.html:79 #: www/views/modals/txp-details.html:99 @@ -1239,7 +1239,7 @@ msgstr "Подключение учетной записи BitPay..." #: src/js/services/onGoingProcess.js:21 msgid "Fetching payment information" -msgstr "" +msgstr "Получение платежной информации" #: www/views/export.html:14 #: www/views/import.html:16 @@ -1281,7 +1281,7 @@ msgstr "С аккаунта BitPay" #: www/views/tab-import-phrase.html:57 msgid "From Hardware Wallet" -msgstr "" +msgstr "Из аппаратного кошелька" #: www/views/tab-export-qrCode.html:5 msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" @@ -1297,7 +1297,7 @@ msgstr "Обнаружены средства:" #: www/views/topup.html:49 msgid "Funds to be added" -msgstr "" +msgstr "Добавляемые средства" #: www/views/paperWallet.html:51 msgid "Funds transferred" @@ -1305,7 +1305,7 @@ msgstr "Средства переведены" #: www/views/topup.html:103 msgid "Funds were added to debit card" -msgstr "" +msgstr "Средства добавлены на дебетовую карту" #: www/views/paperWallet.html:22 msgid "Funds will be transferred to" @@ -1351,20 +1351,20 @@ msgstr "Получение информации о комиссиях..." #: www/views/buyAmazon.html:43 #: www/views/buyMercadoLibre.html:42 msgid "Gift Card" -msgstr "" +msgstr "Подарочная карта" #: www/views/modals/mercadolibre-card-details.html:30 #: www/views/modals/mercadolibre-card-details.html:35 msgid "Gift Card is not available to use anymore" -msgstr "" +msgstr "Подарочную карту больше использовать нельзя" #: src/js/controllers/buyAmazon.js:204 msgid "Gift card expired" -msgstr "" +msgstr "Срок действия подарочной карты истек" #: www/views/buyAmazon.html:111 msgid "Gift card generated and ready to use." -msgstr "" +msgstr "Подарочная карта сформирована и готова к использованию." #: src/js/controllers/bitpayCard.js:114 #: src/js/controllers/bitpayCard.js:124 @@ -1410,7 +1410,7 @@ msgstr "Аппаратный кошелёк" #: src/js/controllers/create.js:180 #: src/js/controllers/join.js:145 msgid "Hardware wallets are not yet supported with Bitcoin Cash" -msgstr "" +msgstr "Bitcoin Cash еще не поддерживает аппаратные кошельки" #: www/views/tab-settings.html:20 msgid "Help & Support" @@ -1441,7 +1441,7 @@ msgstr "Пропустить следующие шаги" #: www/views/tab-import-hardware.html:31 #: www/views/tab-import-phrase.html:36 msgid "Hide advanced options" -msgstr "Скрыть дополнительные параметры" +msgstr "Скрыть расширенные параметры" #: www/views/tabs.html:3 msgid "Home" @@ -1552,7 +1552,7 @@ msgstr "Для проверки резервной копии требуется #: www/views/mercadoLibreCards.html:24 #: www/views/modals/mercadolibre-card-details.html:29 msgid "Inactive" -msgstr "" +msgstr "Неактивна" #: www/views/includes/walletItem.html:9 #: www/views/includes/walletList.html:6 @@ -1576,13 +1576,13 @@ msgstr "Некорректный формат QR-кода" #: src/js/services/bwcError.js:113 msgid "Incorrect network address" -msgstr "" +msgstr "Неверный сетевой адрес" #: src/js/controllers/confirm.js:114 #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "Недостаточно подтвержденных средств" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -1592,7 +1592,7 @@ msgstr "Недостаточно средств на комиссию" #: www/views/tab-settings.html:123 msgid "Integrations" -msgstr "" +msgstr "Интеграции" #: www/views/includes/walletHistory.html:49 msgid "Invalid" @@ -1631,7 +1631,7 @@ msgstr "Приглашение присоединиться к кошельку #: www/views/mercadoLibreCards.html:20 #: www/views/modals/mercadolibre-card-details.html:48 msgid "Invoice expired" -msgstr "" +msgstr "Срок действия инвойса истек" #: src/js/controllers/feedback/send.js:79 msgid "Is there anything we could do better?" @@ -1692,7 +1692,7 @@ msgstr "Прошедший месяц" #: www/views/preferencesCash.html:18 #: www/views/tx-details.html:94 msgid "Learn more" -msgstr "" +msgstr "Подробнее" #: www/views/backup.html:43 msgid "Let's verify your backup phrase." @@ -1733,7 +1733,7 @@ msgstr "Действует блокировка. Пожалуйста, подо #: www/views/includes/logOptions.html:3 msgid "Log options" -msgstr "" +msgstr "Параметры журнала" #: www/views/modals/bitpay-card-confirmation.html:14 msgid "Log out" @@ -1741,7 +1741,7 @@ msgstr "Bыйти" #: www/views/addresses.html:87 msgid "Low amount inputs" -msgstr "" +msgstr "Входы с малыми суммами" #: www/views/includes/walletHistory.html:27 msgid "Low fees" @@ -1773,11 +1773,11 @@ msgstr "Памятка" #: www/views/mercadoLibre.html:6 msgid "Mercado Livre Brazil Gift Cards" -msgstr "" +msgstr "Подарочные карты Mercado Livre (Бразилия)" #: src/js/controllers/buyMercadoLibre.js:98 msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later." -msgstr "" +msgstr "Сервис подарочных карт Mercadolibre сейчас недоступен. Попробуйте позже." #: www/views/modals/txp-details.html:131 msgid "Merchant Message" @@ -1787,7 +1787,7 @@ msgstr "Сообщение от продавца" #: www/views/buyMercadoLibre.html:54 #: www/views/topup.html:63 msgid "Miner Fee" -msgstr "" +msgstr "Комиссия майнера" #: src/js/services/bwcError.js:134 msgid "Missing parameter" @@ -1830,7 +1830,7 @@ msgstr "Название" #: www/views/buyMercadoLibre.html:48 #: www/views/topup.html:56 msgid "Network Cost" -msgstr "" +msgstr "Затраты сети" #: src/js/services/bwcError.js:47 msgid "Network error" @@ -1859,7 +1859,7 @@ msgstr "Нет кошельков" #: src/js/controllers/buyAmazon.js:115 #: src/js/controllers/buyMercadoLibre.js:115 msgid "No access key defined" -msgstr "" +msgstr "Ключ доступа не задан" #: www/views/onboarding/backupRequest.html:5 msgid "No backup, no bitcoin." @@ -1871,7 +1871,7 @@ msgstr "Нет контактов" #: www/views/preferencesLogs.html:16 msgid "No entries for this log level" -msgstr "" +msgstr "Для этого уровня ведения журнала записей нет" #: www/views/preferencesExternal.html:12 msgid "No hardware information available." @@ -1892,7 +1892,7 @@ msgstr "Нет недавних транзакций" #: src/js/controllers/buyAmazon.js:44 #: src/js/controllers/topup.js:47 msgid "No signing proposal: No private key" -msgstr "" +msgstr "Нет предложения по подписыванию: нет приватного ключа" #: www/views/walletDetails.html:204 msgid "No transactions yet" @@ -1911,7 +1911,7 @@ msgstr "Не выбран кошелёк" #: src/js/controllers/confirm.js:85 #: src/js/controllers/topup.js:265 msgid "No wallets available" -msgstr "" +msgstr "Нет кошельков" #: www/views/paperWallet.html:45 msgid "No wallets available to receive funds" @@ -1919,15 +1919,15 @@ msgstr "Некуда перевести средства" #: www/views/cashScan.html:15 msgid "No wallets eligible for Bitcoin Cash support" -msgstr "" +msgstr "Нет кошельков с возможностью поддержки Bitcoin Cash" #: src/js/controllers/cashScan.js:58 msgid "Non BIP44 wallet" -msgstr "" +msgstr "Не является кошельком BIP44" #: www/views/cashScan.html:46 msgid "Non eligible BTC wallets" -msgstr "" +msgstr "Неподходящие кошельки BTC" #: src/js/services/feeService.js:12 msgid "Normal" @@ -1960,7 +1960,7 @@ msgstr "Примечание" #: www/views/backup.html:19 msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase." -msgstr "" +msgstr "Примечание: если этот кошелёк BCH — дубликат кошелька BTC, то у них одинаковое ключевое словосочетание." #: www/views/modals/wallets.html:25 msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" @@ -1973,15 +1973,15 @@ msgstr "Уведомления" #: www/views/onboarding/collectEmail.html:9 msgid "Notifications by email" -msgstr "" +msgstr "Уведомления по эл. почте" #: www/views/tx-details.html:117 msgid "Notify me if confirmed" -msgstr "" +msgstr "Уведомлять при подтверждении" #: www/views/preferencesNotifications.html:24 msgid "Notify me when transactions are confirmed" -msgstr "" +msgstr "Уведомлять меня при подтверждении транзакций" #: www/views/includes/backupNeededPopup.html:8 msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." @@ -2019,7 +2019,7 @@ msgstr "О, нет!" #: src/js/controllers/buyMercadoLibre.js:306 msgid "Ok" -msgstr "" +msgstr "OK" #: www/views/tab-home.html:39 msgid "On this screen you can see all your wallets, accounts, and assets." @@ -2049,7 +2049,7 @@ msgstr "Откройте проект GitHub" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "Открыть обзор" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -2065,11 +2065,11 @@ msgstr "Перейти на сайт" #: src/js/controllers/preferencesCash.js:32 msgid "Open bitcoincash.org?" -msgstr "" +msgstr "Открыть bitcoincash.org?" #: src/js/controllers/cashScan.js:18 msgid "Open the recovery tool." -msgstr "" +msgstr "Открыть инструмент восстановления." #: www/views/tab-receive.html:27 msgid "Open wallet" @@ -2096,7 +2096,7 @@ msgstr "Пароль" #: src/js/controllers/import.js:98 msgid "Password required. Make sure to enter your password in advanced options" -msgstr "Необходим пароль. Убедитесь, что вы ввели ваш пароль в дополнительных настройках" +msgstr "Необходим пароль. Убедитесь, что вы ввели ваш пароль в расширенных настройках" #: www/views/join.html:33 msgid "Paste invitation here" @@ -2121,7 +2121,7 @@ msgstr "Платёж принят" #: www/views/confirm.html:25 msgid "Payment Expires:" -msgstr "Платёж истекает:" +msgstr "Срок платежа:" #: www/views/modals/txp-details.html:6 msgid "Payment Proposal" @@ -2169,7 +2169,7 @@ msgstr "Платёж принят и будет отправлен Glidera. В #: src/js/services/incomingData.js:152 msgid "Payment address was translated to new Bitcoin Cash address format:" -msgstr "" +msgstr "Платежный адрес был переведен в новый формат адреса Bitcoin Cash:" #: www/views/modals/txp-details.html:107 msgid "Payment details" @@ -2182,7 +2182,7 @@ msgstr "Запрос платежа" #: www/views/mercadoLibreCards.html:22 #: www/views/modals/mercadolibre-card-details.html:39 msgid "Pending" -msgstr "" +msgstr "Ожидание" #: www/views/proposals.html:4 msgid "Pending Proposals" @@ -2236,7 +2236,7 @@ msgstr "Пожалуйста, выберите ваш файл резервно #: www/views/bitpayCard.html:81 msgid "Pre-Auth Holds" -msgstr "" +msgstr "Предв. авторизация" #: www/views/tab-settings.html:40 msgid "Preferences" @@ -2294,11 +2294,11 @@ msgstr "Предложенные платежи" #: src/js/controllers/buyAmazon.js:282 msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" -msgstr "" +msgstr "Ограничение на сумму покупки — {{limitPerDay}} {{currency}} в день" #: src/js/controllers/buyMercadoLibre.js:281 msgid "Purchase amount must be a value between 50 and 2000" -msgstr "" +msgstr "Сумма покупки должна быть от 50 до 2000" #: www/views/onboarding/notifications.html:3 msgid "Push Notifications" @@ -2336,11 +2336,11 @@ msgstr "Показать больше" #: src/js/controllers/preferences.js:65 #: src/js/controllers/tx-details.js:54 msgid "Read more in our Wiki" -msgstr "" +msgstr "Подробнее — в нашей вики" #: src/js/controllers/cashScan.js:61 msgid "Read only wallet" -msgstr "" +msgstr "Кошелёк только для чтения" #: www/views/tab-receive.html:3 #: www/views/tabs.html:7 @@ -2349,7 +2349,7 @@ msgstr "Получить" #: www/views/customAmount.html:44 msgid "Receive in" -msgstr "" +msgstr "Куда получить:" #: www/views/includes/walletHistory.html:24 #: www/views/tx-details.html:18 @@ -2398,7 +2398,7 @@ msgstr "Воссоздаю кошелёк..." #: www/views/modals/mercadolibre-card-details.html:22 msgid "Redeem now" -msgstr "" +msgstr "Погасить" #: src/js/controllers/modals/txpDetails.js:63 #: src/js/controllers/tx-details.js:80 @@ -2499,7 +2499,7 @@ msgstr "Просканировать адреса для обнаружения #: www/views/modals/fingerprintCheck.html:11 msgid "Scan again" -msgstr "" +msgstr "Сканировать еще раз" #: src/js/services/fingerprintService.js:56 msgid "Scan your fingerprint please" @@ -2507,7 +2507,7 @@ msgstr "Пожалуйста, отсканируйте ваш отпечаток #: www/views/preferencesCash.html:23 msgid "Scan your wallets for Bitcoin Cash" -msgstr "" +msgstr "Искать в ваших кошельках Bitcoin Cash" #: src/js/services/onGoingProcess.js:30 msgid "Scanning Wallet funds..." @@ -2515,7 +2515,7 @@ msgstr "Сканирование адресов кошелька..." #: www/views/includes/walletList.html:11 msgid "Scanning funds..." -msgstr "" +msgstr "Сканирование средств..." #: www/views/includes/screenshotWarningModal.html:7 msgid "Screenshots are not secure" @@ -2543,7 +2543,7 @@ msgstr "Безопасность" #: www/views/modals/mercadolibre-card-details.html:64 msgid "See invoice" -msgstr "" +msgstr "Просмотр инвойса" #: www/views/tab-import-file.html:7 msgid "Select a backup file" @@ -2596,7 +2596,7 @@ msgstr "Отправить макс. сумму" #: www/views/includes/incomingDataMenu.html:46 msgid "Send payment to this address" -msgstr "" +msgstr "Отправить платеж на этот адрес" #: www/views/feedback/rateApp.html:17 msgid "Send us feedback instead" @@ -2647,7 +2647,7 @@ msgstr "Ответ сервера не может быть проверен" #: src/js/controllers/buyAmazon.js:97 #: src/js/controllers/buyMercadoLibre.js:97 msgid "Service not available" -msgstr "" +msgstr "Сервис недоступен" #: www/views/includes/homeIntegrations.html:3 msgid "Services" @@ -2667,7 +2667,7 @@ msgstr "Задайте пароль" #: src/js/controllers/preferencesFee.js:85 msgid "Set your own fee in satoshis/byte" -msgstr "" +msgstr "Задайте собственную комиссию в сатоши/байт" #: www/views/tab-settings.html:3 #: www/views/tabs.html:19 @@ -2708,7 +2708,7 @@ msgstr "Показать адрес" #: www/views/tab-import-hardware.html:30 #: www/views/tab-import-phrase.html:35 msgid "Show advanced options" -msgstr "Показать дополнительные параметры" +msgstr "Показать расширенные параметры" #: www/views/tab-send.html:37 msgid "Show bitcoin address" @@ -2743,24 +2743,24 @@ msgstr "Пропустить" #: src/js/controllers/confirm.js:371 #: src/js/controllers/modals/txpDetails.js:47 msgid "Slide to accept" -msgstr "" +msgstr "Провести пальцем — принять" #: www/views/buyAmazon.html:96 msgid "Slide to buy" -msgstr "" +msgstr "Провести пальцем — купить" #: src/js/controllers/confirm.js:365 msgid "Slide to pay" -msgstr "" +msgstr "Провести пальцем — оплатить" #: src/js/controllers/confirm.js:377 #: src/js/controllers/modals/txpDetails.js:40 msgid "Slide to send" -msgstr "" +msgstr "Провести пальцем — отправить" #: www/views/cashScan.html:56 msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" -msgstr "" +msgstr "Некоторые из ваших кошельков не могут поддерживать Bitcoin Cash. Можно попытаться получить доступ к BCH из этих кошельков через" #: src/js/controllers/create.js:88 #: src/js/controllers/join.js:71 @@ -2781,7 +2781,7 @@ msgstr "Необходим платёжный пароль" #: www/views/walletDetails.html:173 msgid "Spending this balance will need significant Bitcoin network fees" -msgstr "" +msgstr "Чтобы потратить эту сумму, потребуются значительные комиссии сети Биткойн" #: www/views/tab-send.html:28 msgid "Start sending bitcoin" @@ -2794,7 +2794,7 @@ msgstr "Блокировка при запуске" #: www/views/mercadoLibreCards.html:21 #: www/views/modals/mercadolibre-card-details.html:42 msgid "Still pending" -msgstr "" +msgstr "Еще в ожидании" #: www/views/topup.html:101 msgid "Success" @@ -2806,7 +2806,7 @@ msgstr "Очень экономичная" #: www/views/preferencesCash.html:11 msgid "Support Bitcoin Cash" -msgstr "" +msgstr "Поддержка Bitcoin Cash" #: www/views/paperWallet.html:7 msgid "Sweep" @@ -2836,7 +2836,7 @@ msgstr "Коснитесь и удерживайте, чтобы показат #: www/views/includes/walletInfo.html:3 msgid "Tap to recreate" -msgstr "" +msgstr "Чтобы пересоздать, нажмите сюда" #: www/views/includes/walletInfo.html:4 msgid "Tap to retry" @@ -2856,7 +2856,7 @@ msgstr "Условия использования" #: www/views/tab-create-personal.html:118 #: www/views/tab-import-phrase.html:68 msgid "Testnet" -msgstr "" +msgstr "Testnet" #: www/views/includes/incomingDataMenu.html:61 msgid "Text" @@ -2875,7 +2875,7 @@ msgstr "Спасибо!" #: src/js/controllers/feedback/send.js:73 msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" -msgstr "" +msgstr "Нам интересно выслушать вас. И мы хотели бы получить от вас пять звезд — что нам нужно усовершенствовать?" #: src/js/services/ledger.js:152 msgid "The Ledger Chrome application is not installed" @@ -2899,7 +2899,7 @@ msgstr "Путь деривации" #: www/views/onboarding/tour.html:37 msgid "The exchange rate changes with the market." -msgstr "" +msgstr "Обменные курс меняются." #: www/views/preferencesFee.html:12 msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." @@ -2907,7 +2907,7 @@ msgstr "Чем выше комиссия, тем вероятнее майнер #: www/views/addresses.html:51 msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." -msgstr "" +msgstr "Достигнуто максимальное число последовательных неиспользуемых адресов (20). Когда один из неиспользуемых адресов получит платеж, будет создан новый адрес, который отобразится на вкладке «Получить»." #: src/js/controllers/onboarding/terms.js:21 msgid "The official English Terms of Service are available on the BitPay website." @@ -2938,7 +2938,7 @@ msgstr "Запрос не распознан сервером" #: www/views/addresses.html:52 msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." -msgstr "" +msgstr "Процесс восстановления остановится, когда 20 сформированных подряд адресов не будут содержать средств. Чтобы без риска сформировать больше адресов, сделайте платеж на один из неиспользуемых уже сформированных адресов." #: src/js/services/bwcError.js:98 msgid "The spend proposal is not pending" @@ -2950,7 +2950,7 @@ msgstr "Сумма биткойнов в этом кошельке." #: www/views/preferencesHistory.html:27 msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" -msgstr "" +msgstr "История транзакций и каждая новая входящая транзакция кэшируются в приложении. Эта функция очищает его и снова проводит синхронизацию с сервером" #: www/views/tab-import-phrase.html:6 msgid "The wallet service URL" @@ -2969,7 +2969,7 @@ msgstr "Ошибка в форме" #: src/js/controllers/feedback/send.js:61 #: src/js/controllers/feedback/send.js:65 msgid "There's obviously something we're doing wrong." -msgstr "" +msgstr "Очевидно, мы что-то делаем неправильно." #: src/js/controllers/feedback/rateCard.js:38 msgid "This app is fantastic!" @@ -2977,17 +2977,17 @@ msgstr "Замечательное приложение!" #: www/views/onboarding/tour.html:47 msgid "This app stores your bitcoin with cutting-edge security." -msgstr "" +msgstr "Это приложение хранит биткойны с высочайшим уровнем безопасности." #: src/js/controllers/confirm.js:523 msgid "This bitcoin payment request has expired." -msgstr "Этот запрос платежа истёк." +msgstr "Срок этого запроса платежа истёк." #: www/views/join.html:133 #: www/views/tab-create-personal.html:103 #: www/views/tab-create-shared.html:132 msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." -msgstr "" +msgstr "Этот пароль восстановить нельзя. Если потерять пароль, вы не сможете восстановить свои средства." #: www/views/backup.html:31 msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." @@ -2995,11 +2995,11 @@ msgstr "Это ключевое словосочетание было созда #: www/views/tx-details.html:91 msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." -msgstr "" +msgstr "Сумма транзакции слишком мала в сравнении с текущими комиссиями Биткойн. Чтобы потратить эти средства, понадобится комиссия сети Биткойн, сопоставимая с суммой транзакции." #: www/views/tx-details.html:87 msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" -msgstr "" +msgstr "Из-за низкой комиссии, установленной отправителем, на подтверждение транзакции может уйти много времени, или она может быть отброшена" #: www/views/walletDetails.html:109 #: www/views/walletDetails.html:29 @@ -3030,15 +3030,15 @@ msgstr "Чтобы начать работу, вам нужно создать #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" -msgstr "" +msgstr "{{reason}}: сначала нужно добавить учетную запись BitPay — {{email}}" #: src/js/services/onGoingProcess.js:48 msgid "Top up in progress..." -msgstr "" +msgstr "Выполняется пополнение..." #: src/js/controllers/topup.js:206 msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" -msgstr "" +msgstr "Пополнить дебетовую карту ({{cardLastNumber}}) на {{amountStr}}" #: www/views/buyAmazon.html:61 #: www/views/buyMercadoLibre.html:60 @@ -3057,7 +3057,7 @@ msgstr "Количество совладельцев" #: www/views/addresses.html:81 msgid "Total wallet inputs" -msgstr "" +msgstr "Всего входов на кошельке" #: src/js/services/fingerprintService.js:63 #: src/js/services/fingerprintService.js:68 @@ -3070,7 +3070,7 @@ msgstr "Транзакция" #: www/views/confirm.html:126 msgid "Transaction Created" -msgstr "" +msgstr "Транзакция создана" #: www/views/preferencesAdvanced.html:29 #: www/views/preferencesHistory.html:3 @@ -3085,11 +3085,11 @@ msgstr "Транзакция уже отправлена" #: src/js/controllers/buyMercadoLibre.js:301 #: src/js/controllers/topup.js:281 msgid "Transaction has not been created" -msgstr "" +msgstr "Транзакция не создана" #: www/views/topup.html:104 msgid "Transaction initiated" -msgstr "" +msgstr "Транзакция начата" #: src/js/controllers/tx-details.js:119 msgid "Transaction not available at this time" @@ -3102,7 +3102,7 @@ msgstr "Транзакция не обнаружена" #: www/views/modals/chooseFeeLevel.html:55 msgid "Transactions without fee are not supported." -msgstr "" +msgstr "Транзакции без комиссии не поддерживаются." #: src/js/controllers/paperWallet.js:109 msgid "Transfer to" @@ -3196,7 +3196,7 @@ msgstr "Посмотреть Условия обслуживания" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "Просмотр транзакции на странице Explorer.Bitcoin.com" #: src/js/controllers/tab-home.js:148 msgid "View Update" @@ -3208,7 +3208,7 @@ msgstr "Посмотреть в блокчейне" #: www/views/mercadoLibre.html:26 msgid "Visit mercadolivre.com.br →" -msgstr "" +msgstr "Посетить mercadolivre.com.br →" #: www/views/walletDetails.html:182 msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." @@ -3270,7 +3270,7 @@ msgstr "Информация о кошельке" #: www/views/addresses.html:76 msgid "Wallet Inputs" -msgstr "" +msgstr "Входы на кошельке" #: www/views/join.html:26 msgid "Wallet Invitation" @@ -3324,7 +3324,7 @@ msgstr "Кошелёк уже существует" #: src/js/services/profileService.js:516 msgid "Wallet already in {{appName}}" -msgstr "" +msgstr "Кошелёк уже в приложении {{appName}}" #: www/views/includes/walletActivity.html:6 msgid "Wallet created" @@ -3371,11 +3371,11 @@ msgstr "Кошелёк не зарегистрирован" #: src/js/services/bwcError.js:29 msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" -msgstr "Кошелёк не зарегистрирован на сервере Bitcore. Пересоздайте кошелёк воспользовавшись дополнительными параметрами, чтобы указать ключевое словосочетание" +msgstr "Кошелёк не зарегистрирован на сервере Bitcore. Пересоздайте кошелёк воспользовавшись расширенными параметрами, чтобы указать ключевое словосочетание" #: www/views/backup.html:12 msgid "Wallet recovery phrase not available" -msgstr "" +msgstr "Ключевое словосочетание кошелька недоступно" #: src/js/services/bwcError.js:50 msgid "Wallet service not found" @@ -3416,7 +3416,7 @@ msgstr "Мы всегда ищем пути улучшения {{appName}}." #: src/js/controllers/feedback/send.js:83 msgid "We're always looking for ways to improve {{appName}}. How could we improve your experience?" -msgstr "" +msgstr "Мы всегда ищем возможность улучшить {{appName}}. Как мы можем усовершенствовать приложение?" #: www/views/includes/incomingDataMenu.html:6 msgid "Website" @@ -3424,7 +3424,7 @@ msgstr "Сайт" #: www/views/preferencesLanguage.html:16 msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." -msgstr "" +msgstr "Мы всегда ищем переводчиков! Вы можете исправить перевод или помочь перевести это приложение на родной язык, присоединившись к нашему сообществу на платформе Crowdin." #: www/views/preferencesAlias.html:11 msgid "What do you call this wallet?" @@ -3444,7 +3444,7 @@ msgstr "Почему?" #: www/views/feedback/rateApp.html:10 msgid "Would you be willing to rate {{appName}} in the app store?" -msgstr "" +msgstr "Хотите оценить приложение {{appName}} в магазине приложений?" #: www/views/onboarding/notifications.html:4 msgid "Would you like to receive push notifications about payments?" @@ -3472,7 +3472,7 @@ msgstr "Вы можете создать резервную копию позж #: src/js/controllers/preferencesLanguage.js:12 msgid "You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!" -msgstr "" +msgstr "Чтобы внести свой вклад, зарегистрируйтесь на веб-сайте переводов сообщества Crowdin. Мы будем рады сотрудничать с вами!" #: www/views/tab-scan.html:16 msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." @@ -3480,19 +3480,19 @@ msgstr "Вы можете сканировать биткойн-адреса, з #: src/js/controllers/preferencesAbout.js:14 msgid "You can see the latest developments and contribute to this open source app by visiting our project on GitHub." -msgstr "" +msgstr "Увидеть последние разработки и внести вклад в наше приложение с открытым исходным кодом можно в нашем проекте на платформе GitHub." #: www/views/onboarding/tour.html:19 msgid "You can spend bitcoin at millions of websites and stores worldwide." -msgstr "" +msgstr "Можно тратить биткойны на миллионах веб-сайтов и в магазинах по всему миру." #: www/views/backup.html:15 msgid "You can still export it from Advanced > Export." -msgstr "Вы можете экспортировать её в Дополнительные параметры > Экспорт." +msgstr "Вы можете экспортировать её в меню «Расширенные > Экспорт»." #: www/views/onboarding/tour.html:32 msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." -msgstr "" +msgstr "Можно обменивать их на другую валюту, например, доллары США, евро или фунты." #: www/views/onboarding/tour.html:46 msgid "You control your bitcoin." @@ -3500,11 +3500,11 @@ msgstr "Вы контролируете Ваши bitcoin-ы." #: www/views/modals/chooseFeeLevel.html:64 msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." -msgstr "" +msgstr "Не следует устанавливать комиссию выше, чем {{maxFeeRecommended}} сатоши/ байт." #: www/views/modals/bitpay-card-confirmation.html:5 msgid "You will need to log back for fill in your BitPay Card." -msgstr "" +msgstr "Для заполнения карты BitPay Card вам нужно будет снова войти." #: www/views/preferencesNotifications.html:34 msgid "You'll receive email notifications about payments sent and received from your wallets." @@ -3512,7 +3512,7 @@ msgstr "Вы будете получать email-уведомления о вх #: www/views/bitpayCard.html:50 msgid "Your BitPay Card is ready. Add funds to your card to start using it at stores and ATMs worldwide." -msgstr "" +msgstr "Ваша карта BitPay Card готова. Пополните карту и пользуйтесь ей в магазинах и банкоматах по всему миру." #: www/views/mercadoLibre.html:57 #: www/views/mercadoLibreCards.html:6 @@ -3529,7 +3529,7 @@ msgstr "Ваш кошелёк готов!" #: www/views/modals/chooseFeeLevel.html:61 msgid "Your fee is lower than recommended." -msgstr "" +msgstr "Ваша комиссия ниже рекомендованной." #: www/views/feedback/send.html:42 msgid "Your ideas, feedback, or comments" @@ -3550,11 +3550,11 @@ msgstr "Ваш пароль" #: www/views/buyAmazon.html:102 msgid "Your purchase could not be completed" -msgstr "" +msgstr "Покупку выполнить не удалось" #: www/views/buyAmazon.html:105 msgid "Your purchase was added to the list of pending" -msgstr "" +msgstr "Покупка была добавлена в список ожидания" #: www/views/onboarding/backupRequest.html:10 msgid "Your wallet is never saved to cloud storage or standard device backups." @@ -3576,7 +3576,7 @@ msgstr "[Баланс скрыт]" #: www/views/walletDetails.html:141 #: www/views/walletDetails.html:61 msgid "[Scanning Funds]" -msgstr "" +msgstr "[Сканирование средств]" #: src/js/controllers/bitpayCardIntro.js:11 msgid "add your BitPay Visa card(s)" @@ -3592,7 +3592,7 @@ msgstr "мне" #: www/views/addressbook.add.html:32 msgid "name@example.com" -msgstr "" +msgstr "name@example.com" #: www/views/preferencesHistory.html:15 msgid "preparing..." @@ -3600,15 +3600,15 @@ msgstr "Подготавливается..." #: www/views/cashScan.html:57 msgid "recovery tool." -msgstr "" +msgstr "инструмент восстановления." #: src/js/controllers/buyAmazon.js:239 msgid "{{amountStr}} for Amazon.com Gift Card" -msgstr "" +msgstr "{{amountStr}} за подарочную карту Amazon.com" #: src/js/controllers/buyMercadoLibre.js:237 msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" -msgstr "" +msgstr "{{amountStr}} за подарочную карту Mercado Livre (Бразилия)" #: www/views/preferencesBwsUrl.html:21 msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." @@ -3620,7 +3620,7 @@ msgstr "{{fee}} будет использовано для оплаты коми #: www/views/confirm.html:85 msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" -msgstr "" +msgstr "{{tx.txp[wallet.id].feeRatePerStr}} от отправляемой суммы" #: www/views/walletDetails.html:218 msgid "{{updatingTxHistoryProgress}} transactions downloaded" diff --git a/i18n/po/sv-SE/template-sv-SE.po b/i18n/po/sv-SE/template-sv-SE.po index 2fe3ffa81..ccdd0492b 100644 --- a/i18n/po/sv-SE/template-sv-SE.po +++ b/i18n/po/sv-SE/template-sv-SE.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Swedish\n" "Language: sv\n" -"PO-Revision-Date: 2018-05-08 00:44-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:58+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -187,11 +187,11 @@ msgstr "" #: www/views/tab-scan.html:21 msgid "Allow Camera Access" -msgstr "" +msgstr "Tillåt kameraåtkomst" #: www/views/onboarding/notifications.html:7 msgid "Allow notifications" -msgstr "" +msgstr "Tillåt notificationer" #: www/views/onboarding/disclaimer.html:14 msgid "Almost done! Let's review." @@ -200,149 +200,149 @@ msgstr "" #: www/views/preferencesAltCurrency.html:4 #: www/views/tab-settings.html:79 msgid "Alternative Currency" -msgstr "" +msgstr "Alternativ Valuta" #: src/js/controllers/buyAmazon.js:98 msgid "Amazon.com is not available at this moment. Please try back later." -msgstr "" +msgstr "Amazon.com är inte tillgängligt för tillfället. Försök igen senare." #: www/views/amount.html:44 #: www/views/customAmount.html:34 #: www/views/includes/output.html:7 msgid "Amount" -msgstr "" +msgstr "Belopp" #: src/js/services/bwcError.js:110 msgid "Amount below minimum allowed" -msgstr "" +msgstr "Belopp under minsta tillåtna" #: src/js/controllers/confirm.js:216 msgid "Amount too big" -msgstr "" +msgstr "Beloppet för stort" #: www/views/includes/walletHistory.html:31 msgid "Amount too low to spend" -msgstr "" +msgstr "Beloppet för lågt för att spendera" #: src/js/controllers/tab-home.js:147 msgid "An update to this app is available. For your security, please update to the latest version." -msgstr "" +msgstr "En uppdatering för appen är tillgänglig. För din säkerhet, var vänlig uppdatera till den senaste versionen." #: www/views/backupWarning.html:14 msgid "Anyone with your backup phrase can access or spend your bitcoin." -msgstr "" +msgstr "Vem som helst med din återhämtnings fras kan kommat åt eller spendera dina bitcoin." #: www/views/addresses.html:94 msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" -msgstr "" +msgstr "Ungefärlig Bitcoin nätverks avgift för att överföra plånbokens saldo (med normal prioritet)" #: www/views/backupWarning.html:10 msgid "Are you being watched?" -msgstr "" +msgstr "Håller någon ögonen på dig?" #: src/js/controllers/preferencesExternal.js:15 msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin." -msgstr "" +msgstr "Håller någon ögonen på dig? Vem som helst med din återhämtnings fras kan kommat åt eller spendera dina bitcoin." #: src/js/controllers/copayers.js:56 msgid "Are you sure you want to cancel and delete this wallet?" -msgstr "" +msgstr "Är du säker på att du vill avbryta och ta bort denna plånboken?" #: src/js/controllers/addressbookView.js:37 msgid "Are you sure you want to delete this contact?" -msgstr "" +msgstr "Är du säker på att du vill ta bort denna kontakten?" #: src/js/controllers/preferencesDelete.js:25 msgid "Are you sure you want to delete this wallet?" -msgstr "" +msgstr "Är du säker på att du vill ta bort denna plånboken?" #: src/js/controllers/modals/txpDetails.js:154 msgid "Are you sure you want to reject this transaction?" -msgstr "" +msgstr "Är du säker på att du vill avvisa denna transaktion?" #: src/js/controllers/modals/txpDetails.js:171 msgid "Are you sure you want to remove this transaction?" -msgstr "" +msgstr "Är du säker på att du vill ta bort denna transaktion?" #: src/js/controllers/onboarding/backupRequest.js:23 msgid "Are you sure you want to skip it?" -msgstr "" +msgstr "Är du säker på att du vill hoppa över detta?" #: www/views/modals/bitpay-card-confirmation.html:4 msgid "Are you sure you would like to log out of your BitPay Card account?" -msgstr "" +msgstr "Är du säker på att du vill logga ut från ditt BitPay Card konto?" #: src/js/controllers/preferencesBitpayCard.js:7 #: src/js/controllers/preferencesBitpayServices.js:20 msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" -msgstr "" +msgstr "Är du säker på att du vill ta bort ditt BitPay Card ({{lastFourDigits}}) från denna enheten?" #: www/views/includes/walletInfo.html:10 msgid "Auditable" -msgstr "" +msgstr "Granskningsbar" #: www/views/modals/wallet-balance.html:42 msgid "Available" -msgstr "" +msgstr "Tillgänglig" #: www/views/includes/available-balance.html:3 msgid "Available Balance" -msgstr "" +msgstr "Tillgängligt Saldo" #: www/views/modals/chooseFeeLevel.html:24 #: www/views/preferencesFee.html:15 msgid "Average confirmation time" -msgstr "" +msgstr "Genomsnittlig bekräftelsetid" #: www/views/join.html:143 #: www/views/tab-create-personal.html:113 #: www/views/tab-create-shared.html:142 #: www/views/tab-import-phrase.html:51 msgid "BIP32 path for address derivation" -msgstr "" +msgstr "BIP32 sökväg för adress derivering" #: www/views/cashScan.html:25 msgid "BTC wallets" -msgstr "" +msgstr "BTC plånböcker" #: www/views/preferences.html:34 msgid "Backup" -msgstr "" +msgstr "Säkerhetskopiera" #: www/views/includes/backupNeededPopup.html:7 msgid "Backup Needed" -msgstr "" +msgstr "Säkerhetskopiering Behövs" #: src/js/controllers/lockSetup.js:87 msgid "Backup all livenet wallets before using this function" -msgstr "" +msgstr "Säkerhetskopiera alla livenet plånböcker innan du använder denna funktion" #: src/js/controllers/cashScan.js:64 #: www/views/includes/walletListSettings.html:12 #: www/views/preferences.html:36 msgid "Backup needed" -msgstr "" +msgstr "Säkerhetskopiering behövs" #: www/views/includes/backupNeededPopup.html:9 msgid "Backup now" -msgstr "" +msgstr "Säkerhetskopiera nu" #: www/views/onboarding/backupRequest.html:11 #: www/views/tab-export-file.html:89 msgid "Backup wallet" -msgstr "" +msgstr "Säkerhetskopiera plånbok" #: src/js/controllers/lockSetup.js:84 msgid "Backup your wallet before using this function" -msgstr "" +msgstr "Säkerhetskopiera din plånbok innan du använder denna funktion" #: src/js/services/profileService.js:446 msgid "Bad wallet invitation" -msgstr "" +msgstr "Fel på plånboks inbjudan" #: www/views/preferencesInformation.html:102 msgid "Balance By Address" -msgstr "" +msgstr "Saldo av Address" #: www/views/includes/confirmBackupPopup.html:7 msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." diff --git a/i18n/po/vi/template-vi.po b/i18n/po/vi/template-vi.po index 4a3d29805..c005c649d 100644 --- a/i18n/po/vi/template-vi.po +++ b/i18n/po/vi/template-vi.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Vietnamese\n" "Language: vi\n" -"PO-Revision-Date: 2018-05-15 20:18-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:59+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -24,7 +24,7 @@ msgstr "(có thể chi tiêu gấp đôi)" #: www/views/modals/txp-details.html:159 msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." -msgstr "" +msgstr "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." #: www/views/tx-details.html:82 msgid "- {{btx.feeRateStr}} of the transaction" @@ -41,16 +41,16 @@ msgstr "Xếp hạng 5 sao giúp chúng tôi để {{appName}} đến tay nhiề #: www/views/mercadoLibre.html:18 #: www/views/mercadoLibre.html:40 msgid "Only redeemable on Mercado Livre (Brazil)" -msgstr "" +msgstr "Only redeemable on Mercado Livre (Brazil)" #: src/js/controllers/feedback/send.js:27 #: www/views/feedback/complete.html:21 msgid "A member of the team will review your feedback as soon as possible." -msgstr "" +msgstr "A member of the team will review your feedback as soon as possible." #: src/js/controllers/confirm.js:401 msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." -msgstr "" +msgstr "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." #: src/js/controllers/confirm.js:395 msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." diff --git a/i18n/po/zh-CN/template-zh-CN.po b/i18n/po/zh-CN/template-zh-CN.po index 040a9a57b..016f4db91 100644 --- a/i18n/po/zh-CN/template-zh-CN.po +++ b/i18n/po/zh-CN/template-zh-CN.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Chinese Simplified\n" "Language: zh\n" -"PO-Revision-Date: 2018-05-08 00:44-0400\n" +"PO-Revision-Date: 2018-06-22T04:02:44+0000\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" diff --git a/src/js/services/uxLanguage.js b/src/js/services/uxLanguage.js index 63c3afbb6..1fa446f01 100644 --- a/src/js/services/uxLanguage.js +++ b/src/js/services/uxLanguage.js @@ -10,6 +10,10 @@ angular.module('copayApp.services') isoCode: 'en', rateCode: 'USD' }, { + name: 'català', + isoCode: 'ca', + rateCode: 'EUR' + },{ name: 'Čeština', isoCode: 'cs', rateCode: 'EUR' @@ -55,6 +59,10 @@ angular.module('copayApp.services') name: 'Português', isoCode: 'pt', rateCode: 'EUR' + }, { + name: 'русский язык', + isoCode: 'ru', + rateCode: 'RUB' }, { name: '한국어', isoCode: 'ko', From 5f2a60968b170096618010ea4b0385e6cd4a7618 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 22 Jun 2018 10:04:25 +0200 Subject: [PATCH 078/166] Renamed overlay images as they're not icons --- src/sass/qr.scss | 4 ++-- www/img/{icon-qr-bch.png => qr-overlay-bch.png} | Bin www/img/{icon-qr-btc.png => qr-overlay-btc.png} | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename www/img/{icon-qr-bch.png => qr-overlay-bch.png} (100%) rename www/img/{icon-qr-btc.png => qr-overlay-btc.png} (100%) diff --git a/src/sass/qr.scss b/src/sass/qr.scss index 97fb4e683..3f8c9f104 100644 --- a/src/sass/qr.scss +++ b/src/sass/qr.scss @@ -11,10 +11,10 @@ qrcode { position: absolute; } &--bch::before { - background-image: url('../img/icon-qr-bch.png'); + background-image: url('../img/qr-overlay-bch.png'); } &--btc::before { - background-image: url('../img/icon-qr-btc.png'); + background-image: url('../img/qr-overlay-btc.png'); } } } \ No newline at end of file diff --git a/www/img/icon-qr-bch.png b/www/img/qr-overlay-bch.png similarity index 100% rename from www/img/icon-qr-bch.png rename to www/img/qr-overlay-bch.png diff --git a/www/img/icon-qr-btc.png b/www/img/qr-overlay-btc.png similarity index 100% rename from www/img/icon-qr-btc.png rename to www/img/qr-overlay-btc.png From 8bb4563279fd6a182085f115a042b84869a02a42 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 25 Jun 2018 10:15:59 +0900 Subject: [PATCH 079/166] 335 - Improvement - useless import grunt curl --- Gruntfile.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 2ea3bf006..282c8e0fb 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,7 +3,6 @@ module.exports = function(grunt) { require('load-grunt-tasks')(grunt); - require('grunt-curl')(grunt); // Project Configuration grunt.initConfig({ From e31ec2af3ffd1884fd123a820a6b6ac80f09cac8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 25 Jun 2018 12:56:18 +0900 Subject: [PATCH 080/166] 335 - Improvement - Update script commands --- app-template/package-template.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app-template/package-template.json b/app-template/package-template.json index 53236022e..b6e1cd163 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -102,15 +102,19 @@ "build:ios-release": "cordova prepare ios && cordova build ios --release", "build:android-release": "cordova prepare android && cordova build android --release", "build:windows-release": "cordova prepare windows && cordova build windows --release --arch=\"ARM\"", - "build:desktop": "grunt desktop", - "build:osx": "grunt osx", + "build:desktop-release": "grunt desktop-release", + "build:desktop": "grunt desktop-build", + "build:osx-pkg": "grunt desktop-osx-pkg", + "build:osx-dmg": "grunt desktop-osx-dmg", + "build:others": "grunt desktop-others", + "sign:desktop": "grunt desktop-sign", "open:ios": "open platforms/ios/*.xcodeproj", "open:android": "open -a open -a /Applications/Android\\ Studio.app platforms/android", "final:www": "npm run build:www-release", "final:ios": "npm run final:www && npm run build:ios-release && npm run open:ios", "final:android": "npm run final:www && npm run build:android-release && npm run sign:android && npm run run:android-release", "final:windows": "npm run final:www && npm run build:windows-release", - "final:desktop": "grunt desktop-release", + "final:desktop": "npm run final:www && npm run build:desktop-release", "run:android": "cordova run android --device", "run:android-release": "cordova run android --device --release", "log:android": "adb logcat | grep chromium", From 06ab1d1062b07569dc128f6fa6e2559fcff497de Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 25 Jun 2018 11:07:13 +0200 Subject: [PATCH 081/166] - remove native audio plugin references - soundService for playing sounds - file naming changed on sound files - Bug where sounds were playing when mute switch on iPhone was on - added cordova media plugin (with support for a fix the found mute-switch bug) - play all sounds to use the new soundService --- app-template/config-template.xml | 4 +- src/js/controllers/confirm.js | 7 +--- src/js/controllers/tab-receive.js | 30 +------------- src/js/services/soundService.js | 39 ++++++++++++++++++ ...coin_received.mp3 => payment_received.mp3} | Bin ...coin_received.ogg => payment_received.ogg} | Bin www/misc/{bch_sent.mp3 => payment_sent.mp3} | Bin www/misc/payment_sent.ogg | Bin 0 -> 14156 bytes 8 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 src/js/services/soundService.js rename www/misc/{coin_received.mp3 => payment_received.mp3} (100%) rename www/misc/{coin_received.ogg => payment_received.ogg} (100%) rename www/misc/{bch_sent.mp3 => payment_sent.mp3} (100%) create mode 100644 www/misc/payment_sent.ogg diff --git a/app-template/config-template.xml b/app-template/config-template.xml index ed4b192ba..239f78d6c 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,7 +72,9 @@ - + + + diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index fc92a2287..51c193d4a 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService) { +angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService) { var countDown = null; var FEE_TOO_HIGH_LIMIT_PER = 15; @@ -624,10 +624,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( (processName == 'sendingTx' && !$scope.wallet.canSign() && !$scope.wallet.isPrivKeyExternal()) ) && !isOn) { $scope.sendStatus = 'success'; - if (config.soundsEnabled && $scope.wallet.coin == 'bch') { - var audio = new Audio('misc/bch_sent.mp3'); - audio.play(); - } + soundService.play('misc/payment_sent.mp3'); firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin }); $timeout(function() { $scope.$digest(); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 32cd5281a..44db9b0bc 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService) { +angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService, soundService) { var listeners = []; $scope.bchAddressType = { type: 'cashaddr' }; @@ -15,22 +15,6 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi var config; - var soundLoaded = false; - var nativeAudioAvailable = (window.plugins && window.plugins.NativeAudio); - - if (nativeAudioAvailable) { - window.plugins.NativeAudio.preloadSimple('received', 'misc/coin_received.mp3', function (msg) { - $log.debug('Receive sound loaded.'); - soundLoaded = true; - }, function (error) { - $log.debug('Error loading receive sound.'); - $log.debug(error); - }); - } else { - $log.debug('isNW: Using HTML5-Audio instead of native audio'); - soundLoaded = true; - } - $scope.displayBalanceAsFiat = true; $scope.requestSpecificAmount = function() { @@ -147,17 +131,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } $scope.paymentReceivedCoin = $scope.wallet.coin; $scope.$apply(function () { - - if (config.soundsEnabled && soundLoaded) { - $log.debug('Play sound.'); - if (nativeAudioAvailable) { - window.plugins.NativeAudio.play('received'); - } else { - new Audio('misc/coin_received.ogg').play(); // NW.js has no mp3 support - } - } else { - $log.debug('Sound is disabled.'); - } + soundService.play('misc/payment_received.mp3'); $scope.showingPaymentReceived = true; }); } diff --git a/src/js/services/soundService.js b/src/js/services/soundService.js new file mode 100644 index 000000000..20318883f --- /dev/null +++ b/src/js/services/soundService.js @@ -0,0 +1,39 @@ +'use strict'; + +angular.module('copayApp.services').service('soundService', function($log, $timeout, platformInfo, configService) { + + var root = {}; + + /** + * Play a sound (when enabled in the configuration) using the Cordova Media-plugin (on Mobile) or html5-audio (on Desktop) relative to the www-root + * Make sure there is a .ogg file as well for NW.js (desktop) implementation + * @param soundFile + */ + root.play = function(soundFile) { + configService.whenAvailable(function(config) { + if (config.soundsEnabled) { + if (platformInfo.isCordova) { + var p = window.location.pathname; + var device_path = p.substring(0, p.lastIndexOf('/')); + var audio = new Media(device_path + '/' + soundFile, + function () { + $log.debug("playAudio(bch_sent):Audio Success"); + }, + function (err) { + $log.debug("playAudio():Audio Error: " + err); + } + ); + audio.play({playAudioWhenScreenIsLocked: false}); // XX SP: "Locked" is also the mute switch in iOS + } else { + if (platformInfo.isNW) { + soundFile = soundFile.substring(0, soundFile.lastIndexOf('.')) + ".ogg"; + $log.debug("Playing .ogg file ("+soundFile+"), as NW.js has no mp3 support"); + } + new Audio(soundFile).play(); + } + } + }); + }; + + return root; +}); \ No newline at end of file diff --git a/www/misc/coin_received.mp3 b/www/misc/payment_received.mp3 similarity index 100% rename from www/misc/coin_received.mp3 rename to www/misc/payment_received.mp3 diff --git a/www/misc/coin_received.ogg b/www/misc/payment_received.ogg similarity index 100% rename from www/misc/coin_received.ogg rename to www/misc/payment_received.ogg diff --git a/www/misc/bch_sent.mp3 b/www/misc/payment_sent.mp3 similarity index 100% rename from www/misc/bch_sent.mp3 rename to www/misc/payment_sent.mp3 diff --git a/www/misc/payment_sent.ogg b/www/misc/payment_sent.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8527a893cca30b57276062eb9e6ca6fb25898420 GIT binary patch literal 14156 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 Date: Mon, 25 Jun 2018 17:13:56 +0200 Subject: [PATCH 082/166] Send mail instead of the Send Feedback screen. --- src/js/controllers/tab-settings.js | 12 ++++++++++++ www/views/tab-settings.html | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 6cfc80def..7106aa743 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -45,6 +45,18 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct }); }; + $scope.sendFeedback = function() { + var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet.com'; + if (platformInfo.isNW) { + nw.Shell.openExternal(mailToLink); + } else if (platformInfo.isCordova) { + var mailWindow = window.open(mailToLink, '_system'); + mailWindow.close(); // XX SP: bugfix for some browsers in cordova to change the view entirely + } else { + window.location.href = mailToLink; + } + }; + $scope.openExternalLink = function() { var appName = appConfigService.name; var url = appName == 'copay' ? 'https://github.com/bitcoin-com/wallet/issues' : 'https://www.bitcoin.com/wallet-support'; diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index 1105937d4..fefaf2fc2 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -22,7 +22,7 @@
- + From e8f2f2d188cc5668a648a73d31ac41e29c4aa729 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 25 Jun 2018 17:15:06 +0200 Subject: [PATCH 083/166] removed the route of the feedback form --- src/js/routes.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/js/routes.js b/src/js/routes.js index 4e72246ba..82987d1ac 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -795,22 +795,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr fromOnboarding: null }, }) - - /* - * - * Feedback - * - */ - - .state('tabs.feedback', { - url: '/feedback', - views: { - 'tab-settings@tabs': { - templateUrl: 'views/feedback/send.html', - controller: 'sendController' - } - } - }) .state('tabs.shareApp', { url: '/shareApp/:score/:skipped/:fromSettings', views: { From 8bc76d2e218e5f40961d584e4eb49ca1f491ddf9 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 25 Jun 2018 19:51:25 +0200 Subject: [PATCH 084/166] Fix for camera permission bug after reactivating camera permission --- src/js/controllers/tab-scan.js | 6 +++++- src/js/services/scannerService.js | 1 + www/views/tab-scan.html | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.js index a96591a25..bfb8d5bef 100644 --- a/src/js/controllers/tab-scan.js +++ b/src/js/controllers/tab-scan.js @@ -122,8 +122,12 @@ angular.module('copayApp.controllers').controller('tabScanController', function( scannerService.openSettings(); }; + $scope.reactivationCount = 0; $scope.attemptToReactivate = function(){ - scannerService.reinitialize(); + scannerService.reinitialize(function(){ + $scope.reactivationCount++; + activate(); + }); }; $scope.toggleLight = function(){ diff --git a/src/js/services/scannerService.js b/src/js/services/scannerService.js index ddf62895d..e09662396 100644 --- a/src/js/services/scannerService.js +++ b/src/js/services/scannerService.js @@ -103,6 +103,7 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti _completeInitialization(status, callback); }); } else { + isAvailable = true; // XX SP: Availability can change after permissions are granted after being denied. _completeInitialization(status, callback); } }); diff --git a/www/views/tab-scan.html b/www/views/tab-scan.html index 1445adeb8..54c5efab3 100644 --- a/www/views/tab-scan.html +++ b/www/views/tab-scan.html @@ -16,7 +16,7 @@
You can scan bitcoin addresses, payment requests, paper wallets, and more.
Enable the camera to get started.
-
Enable camera access in your device settings to get started.
+
Enable camera access in your device settings to get started.
Please connect a camera to get started.
From ecbab6a5b5cfbe4b6955decde8948b066c1137c2 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 26 Jun 2018 13:01:24 +0200 Subject: [PATCH 085/166] Fix double permission screen on Android --- src/js/controllers/tab-scan.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/controllers/tab-scan.js b/src/js/controllers/tab-scan.js index bfb8d5bef..4a654d91d 100644 --- a/src/js/controllers/tab-scan.js +++ b/src/js/controllers/tab-scan.js @@ -126,7 +126,6 @@ angular.module('copayApp.controllers').controller('tabScanController', function( $scope.attemptToReactivate = function(){ scannerService.reinitialize(function(){ $scope.reactivationCount++; - activate(); }); }; From 9396c7c97faef4e2b64c88b4d4f19effc191f951 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 27 Jun 2018 16:43:09 +0200 Subject: [PATCH 086/166] Removed all references to the rating card & feedback --- src/js/controllers/feedback/rateApp.js | 53 --------- src/js/controllers/feedback/rateCard.js | 60 ----------- src/js/controllers/feedback/send.js | 102 ------------------ .../{feedback/complete.js => shareApp.js} | 33 +----- src/js/controllers/tab-home.js | 40 +------ src/js/routes.js | 38 +------ src/js/services/feedbackService.js | 59 ---------- src/js/services/storageService.js | 8 -- src/sass/views/feedback/rateApp.scss | 38 ------- src/sass/views/feedback/rateCard.scss | 18 ---- src/sass/views/feedback/send.scss | 54 ---------- .../{feedback/complete.scss => shareApp.scss} | 15 +-- src/sass/views/views.scss | 5 +- www/views/feedback/rateApp.html | 21 ---- www/views/feedback/rateCard.html | 43 -------- www/views/feedback/send.html | 48 --------- .../{feedback/complete.html => shareApp.html} | 30 ++---- www/views/tab-home.html | 2 - www/views/tab-settings.html | 2 +- 19 files changed, 17 insertions(+), 652 deletions(-) delete mode 100644 src/js/controllers/feedback/rateApp.js delete mode 100644 src/js/controllers/feedback/rateCard.js delete mode 100644 src/js/controllers/feedback/send.js rename src/js/controllers/{feedback/complete.js => shareApp.js} (77%) delete mode 100644 src/js/services/feedbackService.js delete mode 100644 src/sass/views/feedback/rateApp.scss delete mode 100644 src/sass/views/feedback/rateCard.scss delete mode 100644 src/sass/views/feedback/send.scss rename src/sass/views/{feedback/complete.scss => shareApp.scss} (86%) delete mode 100644 www/views/feedback/rateApp.html delete mode 100644 www/views/feedback/rateCard.html delete mode 100644 www/views/feedback/send.html rename www/views/{feedback/complete.html => shareApp.html} (55%) diff --git a/src/js/controllers/feedback/rateApp.js b/src/js/controllers/feedback/rateApp.js deleted file mode 100644 index 6ae485a3a..000000000 --- a/src/js/controllers/feedback/rateApp.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, $window, lodash, externalLinkService, configService, platformInfo, feedbackService, ongoingProcess, popupService, appConfigService) { - $scope.score = parseInt($stateParams.score); - $scope.appName = appConfigService.nameCase; - var isAndroid = platformInfo.isAndroid; - var isIOS = platformInfo.isIOS; - - var config = configService.getSync(); - - $scope.skip = function() { - var dataSrc = { - "Email": lodash.values(config.emailFor)[0] || ' ', - "Feedback": ' ', - "Score": $stateParams.score, - "AppVersion": $window.version, - "Platform": ionic.Platform.platform(), - "DeviceVersion": ionic.Platform.version() - }; - feedbackService.send(dataSrc, function(err) { - if (err) { - // try to send, but not essential, since the user didn't add a message - $log.warn('Could not send feedback.'); - } - }); - $state.go('tabs.rate.complete', { - score: $stateParams.score, - skipped: true - }); - }; - - $scope.sendFeedback = function() { - $state.go('tabs.rate.send', { - score: $scope.score - }); - }; - - $scope.goAppStore = function() { - var defaults = configService.getDefaults(); - var url; - if (isAndroid) - url = defaults.rateApp.bitcoincom.android; - if (isIOS) - url = defaults.rateApp.bitcoincom.ios; - - externalLinkService.open(url); - $state.go('tabs.rate.complete', { - score: $stateParams.score, - skipped: true, - rated: true - }); - }; -}); diff --git a/src/js/controllers/feedback/rateCard.js b/src/js/controllers/feedback/rateCard.js deleted file mode 100644 index abc109796..000000000 --- a/src/js/controllers/feedback/rateCard.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('rateCardController', function($scope, $state, $timeout, $log, gettextCatalog, platformInfo, storageService, appConfigService) { - - $scope.isCordova = platformInfo.isCordova; - $scope.score = 0; - $scope.appName = appConfigService.nameCase; - - $scope.goFeedbackFlow = function() { - $scope.hideCard(); - if ($scope.isCordova && $scope.score == 5) { - $state.go('tabs.rate.rateApp', { - score: $scope.score - }); - } else { - $state.go('tabs.rate.send', { - score: $scope.score - }); - } - }; - - $scope.setScore = function(score) { - $scope.score = score; - switch ($scope.score) { - case 1: - $scope.button_title = gettextCatalog.getString("I think this app is terrible."); - break; - case 2: - $scope.button_title = gettextCatalog.getString("I don't like it"); - break; - case 3: - $scope.button_title = gettextCatalog.getString("Meh - it's alright"); - break; - case 4: - $scope.button_title = gettextCatalog.getString("I like the app"); - break; - case 5: - $scope.button_title = gettextCatalog.getString("This app is fantastic!"); - break; - } - $timeout(function() { - $scope.$apply(); - }); - }; - - $scope.hideCard = function() { - $log.debug('Feedback card dismissed.') - storageService.getFeedbackInfo(function(error, info) { - var feedbackInfo = JSON.parse(info); - feedbackInfo.sent = true; - storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() { - $scope.showRateCard.value = false; - $timeout(function() { - $scope.$apply(); - }, 100); - }); - }); - } - -}); diff --git a/src/js/controllers/feedback/send.js b/src/js/controllers/feedback/send.js deleted file mode 100644 index 23fb0ea59..000000000 --- a/src/js/controllers/feedback/send.js +++ /dev/null @@ -1,102 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, $window, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess, platformInfo, appConfigService) { - - $scope.sendFeedback = function(feedback, goHome) { - - var config = configService.getSync(); - - var dataSrc = { - "Email": lodash.values(config.emailFor)[0] || ' ', - "Feedback": goHome ? ' ' : feedback, - "Score": $stateParams.score || ' ', - "AppVersion": $window.version, - "Platform": ionic.Platform.platform(), - "DeviceVersion": ionic.Platform.version() - }; - - if (!goHome) ongoingProcess.set('sendingFeedback', true); - feedbackService.send(dataSrc, function(err) { - if (goHome) return; - ongoingProcess.set('sendingFeedback', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Feedback could not be submitted. Please try again later.')); - return; - } - if (!$stateParams.score) { - popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() { - $scope.feedback.value = ''; - $ionicHistory.nextViewOptions({ - disableAnimate: false, - historyRoot: true - }); - $ionicHistory.goBack(); - }, gettextCatalog.getString('Finish')); - return; - } - $state.go('tabs.rate.complete', { - score: $stateParams.score - }); - }); - if (goHome) $state.go('tabs.home'); - }; - - $scope.$on("$ionicView.beforeLeave", function(event, data) { - $ionicConfig.views.swipeBackEnabled(true); - }); - - $scope.$on("$ionicView.enter", function(event, data) { - if ($scope.score) - $ionicConfig.views.swipeBackEnabled(false); - }); - - $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isCordova = platformInfo.isCordova; - $scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null; - $scope.feedback = {}; - - switch ($scope.score) { - case 1: - $scope.reaction = "Ouch!"; - $scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); - break; - case 2: - $scope.reaction = gettextCatalog.getString("Oh no!"); - $scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); - break; - case 3: - $scope.reaction = "Hmm..."; - $scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); - break; - case 4: - $scope.reaction = gettextCatalog.getString("Thanks!"); - $scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?"); - break; - case 5: - $scope.reaction = gettextCatalog.getString("Thank you!"); - $scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}.", { - appName: appConfigService.nameCase - }) + ' ' + gettextCatalog.getString("Is there anything we could do better?"); - break; - default: - $scope.justFeedback = true; - $scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}. How could we improve your experience?", { - appName: appConfigService.nameCase - }); - break; - } - }); - - $scope.$on("$ionicView.afterEnter", function() { - $scope.showForm = true; - }); - - $scope.goBack = function() { - $ionicHistory.nextViewOptions({ - disableAnimate: false, - historyRoot: true - }); - $ionicHistory.goBack(); - }; - -}); diff --git a/src/js/controllers/feedback/complete.js b/src/js/controllers/shareApp.js similarity index 77% rename from src/js/controllers/feedback/complete.js rename to src/js/controllers/shareApp.js index 905880901..ba3fdedff 100644 --- a/src/js/controllers/feedback/complete.js +++ b/src/js/controllers/shareApp.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) { +angular.module('copayApp.controllers').controller('shareAppController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) { $scope.isCordova = platformInfo.isCordova; $scope.title = gettextCatalog.getString("Share {{appName}}", { appName: appConfigService.nameCase @@ -57,28 +57,8 @@ angular.module('copayApp.controllers').controller('completeController', function $ionicConfig.views.swipeBackEnabled(true); }); - $scope.$on("$ionicView.enter", function() { - if (!$scope.fromSettings) - $ionicConfig.views.swipeBackEnabled(false); - }); - $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null; - $scope.skipped = (data.stateParams && data.stateParams.skipped) ? true : false; - $scope.rated = (data.stateParams && data.stateParams.rated) ? true : false; - $scope.fromSettings = (data.stateParams && data.stateParams.fromSettings) ? true : false; - - if (!$scope.fromSettings) { - $ionicNavBarDelegate.showBackButton(false); - } else { - $ionicNavBarDelegate.showBackButton(true); - } - - storageService.getFeedbackInfo(function(error, info) { - var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null; - feedbackInfo.sent = true; - storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {}); - }); + $ionicNavBarDelegate.showBackButton(true); if (!$scope.isCordova) return; $scope.animate = true; @@ -133,13 +113,4 @@ angular.module('copayApp.controllers').controller('completeController', function } }, 100); }); - - $scope.close = function() { - $ionicHistory.nextViewOptions({ - disableAnimate: false, - historyRoot: true - }); - if ($scope.score == 5) $ionicHistory.goBack(-3); - else $ionicHistory.goBack(-2); - }; }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 1332287b6..56ce3279f 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { var wallet; var listeners = []; var notifications = []; @@ -14,7 +14,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.isAndroid = platformInfo.isAndroid; $scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; $scope.isNW = platformInfo.isNW; - $scope.showRateCard = {}; $scope.showServices = false; $scope.$on("$ionicView.afterEnter", function() { @@ -42,43 +41,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', } }); } - - storageService.getFeedbackInfo(function(error, info) { - - if ($scope.isWindowsPhoneApp) { - $scope.showRateCard.value = false; - return; - } - if (!info) { - initFeedBackInfo(); - } else { - var feedbackInfo = JSON.parse(info); - //Check if current version is greater than saved version - var currentVersion = $scope.version; - var savedVersion = feedbackInfo.version; - var isVersionUpdated = feedbackService.isVersionUpdated(currentVersion, savedVersion); - if (!isVersionUpdated) { - initFeedBackInfo(); - return; - } - var now = moment().unix(); - var timeExceeded = (now - feedbackInfo.time) >= 24 * 7 * 60 * 60; - $scope.showRateCard.value = timeExceeded && !feedbackInfo.sent; - $timeout(function() { - $scope.$apply(); - }); - } - }); - - function initFeedBackInfo() { - var feedbackInfo = {}; - feedbackInfo.time = moment().unix(); - feedbackInfo.version = $scope.version; - feedbackInfo.sent = false; - storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() { - $scope.showRateCard.value = false; - }); - }; }); $scope.$on("$ionicView.enter", function(event, data) { diff --git a/src/js/routes.js b/src/js/routes.js index 82987d1ac..63f92ef8f 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -796,46 +796,14 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, }) .state('tabs.shareApp', { - url: '/shareApp/:score/:skipped/:fromSettings', + url: '/shareApp', views: { 'tab-settings@tabs': { - controller: 'completeController', - templateUrl: 'views/feedback/complete.html' + controller: 'shareAppController', + templateUrl: 'views/shareApp.html' } } }) - .state('tabs.rate', { - url: '/rate', - abstract: true - }) - .state('tabs.rate.send', { - url: '/send/:score', - views: { - 'tab-home@tabs': { - templateUrl: 'views/feedback/send.html', - controller: 'sendController' - } - } - }) - .state('tabs.rate.complete', { - url: '/complete/:score/:skipped', - views: { - 'tab-home@tabs': { - controller: 'completeController', - templateUrl: 'views/feedback/complete.html' - } - } - }) - .state('tabs.rate.rateApp', { - url: '/rateApp/:score', - views: { - 'tab-home@tabs': { - controller: 'rateAppController', - templateUrl: 'views/feedback/rateApp.html' - } - } - }) - /* * * Buy or Sell Bitcoin diff --git a/src/js/services/feedbackService.js b/src/js/services/feedbackService.js deleted file mode 100644 index ae4711d27..000000000 --- a/src/js/services/feedbackService.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; -angular.module('copayApp.services').factory('feedbackService', function($http, $log, $httpParamSerializer, configService) { - var root = {}; -// var URL = "https://script.google.com/macros/s/1pWGRxVSUX9CxPqNAKZTppWHtDvyVtZv9HteY_TRQbWc/exec"; - var URL = "https://wallet-data.bitcoin.com/feedback.php"; - - root.send = function(dataSrc, cb) { - $http(_post(dataSrc)).then(function() { - $log.info("SUCCESS: Feedback sent"); - return cb(); - }, function(err) { - $log.info("ERROR: Feedback sent anyway."); - return cb(err); - }); - }; - - var _post = function(dataSrc) { - return { - method: 'POST', - url: URL, - headers: { - 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - data: $httpParamSerializer(dataSrc) - }; - }; - - root.isVersionUpdated = function(currentVersion, savedVersion) { - - if (!verifyTagFormat(currentVersion)) - return 'Cannot verify the format of version tag: ' + currentVersion; - if (!verifyTagFormat(savedVersion)) - return 'Cannot verify the format of the saved version tag: ' + savedVersion; - - var current = formatTagNumber(currentVersion); - var saved = formatTagNumber(savedVersion); - if (saved.major > current.major || (saved.major == current.major && saved.minor > current.minor)) - return false; - - return true; - - function verifyTagFormat(tag) { - var regex = /^v?\d+\.\d+\.\d+$/i; - return regex.exec(tag); - }; - - function formatTagNumber(tag) { - var formattedNumber = tag.replace(/^v/i, '').split('.'); - return { - major: +formattedNumber[0], - minor: +formattedNumber[1], - patch: +formattedNumber[2] - }; - }; - - }; - - return root; -}); diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index a2d85950b..154391e55 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -250,14 +250,6 @@ angular.module('copayApp.services') }); }; - root.setFeedbackInfo = function(feedbackValues, cb) { - storage.set('feedback', feedbackValues, cb); - }; - - root.getFeedbackInfo = function(cb) { - storage.get('feedback', cb); - }; - root.storeFocusedWalletId = function(id, cb) { storage.set('focusedWalletId', id || '', cb); }; diff --git a/src/sass/views/feedback/rateApp.scss b/src/sass/views/feedback/rateApp.scss deleted file mode 100644 index 8a4cd2b8e..000000000 --- a/src/sass/views/feedback/rateApp.scss +++ /dev/null @@ -1,38 +0,0 @@ -#rate-app { - background-color: #ffffff; - text-align: center; - .skip-rating { - color: $v-dark-gray; - position: absolute; - top: 5px; - right: 10px; - padding: 15px; - } - .icon-svg > img { - width: 80px; - height: 80px; - margin-top: 15px; - } - .feedback-title { - font-size: 20px; - font-weight: bold; - color: $v-dark-gray; - margin: 80px 50px 10px; - text-align: center; - } - .share-the-love-illustration { - width: 5rem; - margin: 1rem; - } - .subtitle { - padding: 10px 30px 20px 40px; - color: $v-mid-gray; - } - .rate-buttons { - bottom: 0; - width: 100%; - position: absolute; - background-color: $v-subtle-gray; - padding: 30px 0 15px; - } -} diff --git a/src/sass/views/feedback/rateCard.scss b/src/sass/views/feedback/rateCard.scss deleted file mode 100644 index 9d57643d6..000000000 --- a/src/sass/views/feedback/rateCard.scss +++ /dev/null @@ -1,18 +0,0 @@ -#rate-card { - .item-heading { - font-weight: 700; - } - .row { - border: none; - } - .item-icon-right { - margin: 0; - } - .feedback-flow-button { - margin-bottom: 20px; - } - .icon-svg > img { - height: 1.8rem; - margin-bottom: 5px; - } -} diff --git a/src/sass/views/feedback/send.scss b/src/sass/views/feedback/send.scss deleted file mode 100644 index 807c4f8c5..000000000 --- a/src/sass/views/feedback/send.scss +++ /dev/null @@ -1,54 +0,0 @@ -#send-feedback { - @extend .deflash-blue; - background-color: #ffffff; - .row { - border: none; - } - .skip { - color: rgba(255, 255, 255, 0.3); - } - .feedback-heading { - padding-top: 20px - } - .feedback-title { - padding-left: 10px; - font-size: 20px; - font-weight: bold; - color: $v-dark-gray; - } - .rating { - text-align: right; - padding-right: 15px; - } - .comment { - padding: 0 20px 20px; - font-size: 1rem; - line-height: 1.5em; - font-weight: 300; - color: $v-dark-gray; - } - .user-feedback { - border-top: 1px solid $v-subtle-gray; - border-bottom: 1px solid $v-subtle-gray; - padding: 20px; - width: 100%; - margin-bottom: 20px; - -webkit-appearance: none; - } - .send-feedback-star { - height: 1rem; - margin-left: 5px; - } - .form-fade-in { - opacity: 0; - animation-name: fadeIn; - animation-duration: .5s; - animation-fill-mode: forwards; - animation-timing-function: ease-in; - } -} - -@keyframes fadeIn { - from { opacity: 0; } - to { opacity: 1; } -} diff --git a/src/sass/views/feedback/complete.scss b/src/sass/views/shareApp.scss similarity index 86% rename from src/sass/views/feedback/complete.scss rename to src/sass/views/shareApp.scss index bb2e75ea6..9a0ed0698 100644 --- a/src/sass/views/feedback/complete.scss +++ b/src/sass/views/shareApp.scss @@ -1,6 +1,6 @@ -#complete { +#share-app { background-color: #fff; - .complete-layout { + .share-app-layout { display: flex; flex-direction: column; height: 100%; @@ -22,17 +22,6 @@ width: 5rem; margin: 1rem; } - .send-feedback-illustration { - height: 16rem; - margin: 1rem; - } - .feedback-title { - font-size: 20px; - font-weight: bold; - color: $v-dark-gray; - margin: 20px 10px; - text-align: center; - } .subtitle { padding: 10px 30px 20px; text-align: center; diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 37754970f..d4ed735ed 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -22,10 +22,7 @@ @import "wallet-backup-phrase"; @import "zero-state"; @import "onboarding/onboarding"; -@import "feedback/rateCard"; -@import "feedback/send"; -@import "feedback/complete"; -@import "feedback/rateApp"; +@import "shareApp"; @import "includes/actionSheet"; @import "export"; @import "import"; diff --git a/www/views/feedback/rateApp.html b/www/views/feedback/rateApp.html deleted file mode 100644 index 9913b9d4e..000000000 --- a/www/views/feedback/rateApp.html +++ /dev/null @@ -1,21 +0,0 @@ - - -
Not now - - -
- 5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app! -
-
- Would you be willing to rate {{appName}} in the app store? -
-
- - -
- - diff --git a/www/views/feedback/rateCard.html b/www/views/feedback/rateCard.html deleted file mode 100644 index d31199466..000000000 --- a/www/views/feedback/rateCard.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
- How do you like {{appName}}? - -
-
-
- - - - -
-
- - - - -
-
- - - - -
-
- - - - -
-
- - - - -
-
- -
diff --git a/www/views/feedback/send.html b/www/views/feedback/send.html deleted file mode 100644 index bb979bdee..000000000 --- a/www/views/feedback/send.html +++ /dev/null @@ -1,48 +0,0 @@ - - - {{'Send Feedback' | translate}} - - - - - - - - - - -
- {{comment}} -
-
- - -
-
-
diff --git a/www/views/feedback/complete.html b/www/views/shareApp.html similarity index 55% rename from www/views/feedback/complete.html rename to www/views/shareApp.html index 03a98a476..f148e81a0 100644 --- a/www/views/feedback/complete.html +++ b/www/views/shareApp.html @@ -1,32 +1,16 @@ - + {{title}} - - - -
-
-
- -
Share the love by inviting your friends.
-
-
- -
A member of the team will review your feedback as soon as possible.
-
-
If you have additional feedback, please let us know by tapping the "Send feedback" option in the Settings tab.
- -
-
Share the love by inviting your friends.
-
+ -
- From 8006af279b8ba65aee9908ec567c43c298c0955c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 28 Jun 2018 10:52:06 +0200 Subject: [PATCH 088/166] clipboard service --- src/js/directives/copyToClipboard.js | 21 ++------------------- src/js/services/clipboardService.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 src/js/services/clipboardService.js diff --git a/src/js/directives/copyToClipboard.js b/src/js/directives/copyToClipboard.js index 5de40f23e..35802b598 100644 --- a/src/js/directives/copyToClipboard.js +++ b/src/js/directives/copyToClipboard.js @@ -1,38 +1,21 @@ 'use strict'; angular.module('copayApp.directives') - .directive('copyToClipboard', function(platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { + .directive('copyToClipboard', function(clipboardService) { return { restrict: 'A', scope: { copyToClipboard: '=copyToClipboard' }, link: function(scope, elem, attrs, ctrl) { - var isCordova = platformInfo.isCordova; - var isChromeApp = platformInfo.isChromeApp; - var isNW = platformInfo.isNW; elem.bind('mouseover', function() { elem.css('cursor', 'pointer'); }); - var msg = gettextCatalog.getString('Copied to clipboard'); elem.bind('click', function() { var data = scope.copyToClipboard; - if (!data) return; - if (isCordova) { - cordova.plugins.clipboard.copy(data); - } else if (isNW) { - nodeWebkitService.writeToClipboard(data); - } else if (clipboard.supported) { - clipboard.copyText(data); - } else { - // No supported - return; - } - scope.$apply(function() { - ionicToast.show(msg, 'bottom', false, 1000); - }); + clipboardService.copyToClipboard(data, scope); }); } } diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js new file mode 100644 index 000000000..ab8110b0a --- /dev/null +++ b/src/js/services/clipboardService.js @@ -0,0 +1,28 @@ +'use strict'; + +angular.module('copayApp.services').factory('clipboardService', function ($http, $log, platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { + var root = {}; + + root.copyToClipboard = function (data, scope) { + var msg = gettextCatalog.getString('Copied to clipboard'); + + if (!data) return; + + if (platformInfo.isCordova) { + cordova.plugins.clipboard.copy(data); + } else if (platformInfo.isNW) { + nodeWebkitService.writeToClipboard(data); + } else if (clipboard.supported) { + clipboard.copyText(data); + } else { + // No supported + return; + } + + scope.$apply(function () { + ionicToast.show(msg, 'bottom', false, 1000); + }); + }; + + return root; +}); \ No newline at end of file From 243f35c25d1699554e209ca1db9f34003b662c25 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 28 Jun 2018 14:16:33 +0200 Subject: [PATCH 089/166] copy to clipboard --- src/js/controllers/tab-receive.js | 3 ++- src/js/directives/copyToClipboard.js | 9 +++++++-- src/js/services/clipboardService.js | 5 ----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index e4f7388d6..a77870cb4 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService) { +angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService, clipboardService) { var listeners = []; $scope.bchAddressType = { type: 'cashaddr' }; @@ -73,6 +73,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv"); paymentSubscriptionObj.addr = $scope.addr } + clipboardService.copyToClipboard(paymentSubscriptionObj.addr); // create subscription var msg = JSON.stringify(paymentSubscriptionObj); diff --git a/src/js/directives/copyToClipboard.js b/src/js/directives/copyToClipboard.js index 35802b598..c81e0bd60 100644 --- a/src/js/directives/copyToClipboard.js +++ b/src/js/directives/copyToClipboard.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.directives') - .directive('copyToClipboard', function(clipboardService) { + .directive('copyToClipboard', function(clipboardService, ionicToast, gettextCatalog) { return { restrict: 'A', scope: { @@ -14,8 +14,13 @@ angular.module('copayApp.directives') elem.bind('click', function() { var data = scope.copyToClipboard; + clipboardService.copyToClipboard(data); + + var msg = gettextCatalog.getString('Copied to clipboard'); + scope.$apply(function () { + ionicToast.show(msg, 'bottom', false, 1000); + }); - clipboardService.copyToClipboard(data, scope); }); } } diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index ab8110b0a..67de530af 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -4,8 +4,6 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, var root = {}; root.copyToClipboard = function (data, scope) { - var msg = gettextCatalog.getString('Copied to clipboard'); - if (!data) return; if (platformInfo.isCordova) { @@ -19,9 +17,6 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, return; } - scope.$apply(function () { - ionicToast.show(msg, 'bottom', false, 1000); - }); }; return root; From f89499047a564c9f3d55cb8fb6a2e20a91089749 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 29 Jun 2018 15:11:34 +0200 Subject: [PATCH 090/166] Update sound to play on the screens they suppose to play only --- src/js/controllers/confirm.js | 4 +++- src/js/controllers/tab-receive.js | 5 ++++- src/js/services/soundService.js | 11 ++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 51c193d4a..f77e6db75 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -624,7 +624,9 @@ angular.module('copayApp.controllers').controller('confirmController', function( (processName == 'sendingTx' && !$scope.wallet.canSign() && !$scope.wallet.isPrivKeyExternal()) ) && !isOn) { $scope.sendStatus = 'success'; - soundService.play('misc/payment_sent.mp3'); + + if ($state.current.name === "tabs.send.confirm") // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device. + soundService.play('misc/payment_sent.mp3'); firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin }); $timeout(function() { $scope.$digest(); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 44db9b0bc..dcae37131 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -130,8 +130,11 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } } $scope.paymentReceivedCoin = $scope.wallet.coin; - $scope.$apply(function () { + + if ($state.current.name === "tabs.receive") soundService.play('misc/payment_received.mp3'); + + $scope.$apply(function () { $scope.showingPaymentReceived = true; }); } diff --git a/src/js/services/soundService.js b/src/js/services/soundService.js index 20318883f..759789e21 100644 --- a/src/js/services/soundService.js +++ b/src/js/services/soundService.js @@ -13,9 +13,14 @@ angular.module('copayApp.services').service('soundService', function($log, $time configService.whenAvailable(function(config) { if (config.soundsEnabled) { if (platformInfo.isCordova) { - var p = window.location.pathname; - var device_path = p.substring(0, p.lastIndexOf('/')); - var audio = new Media(device_path + '/' + soundFile, + + if (platformInfo.isAndroid) { + var p = window.location.pathname; + var device_path = p.substring(0, p.lastIndexOf('/')); + soundFile = device_path + '/' + soundFile; + } + + var audio = new Media(soundFile, function () { $log.debug("playAudio(bch_sent):Audio Success"); }, From 40d0e5b896968b25eb471c2af1b9bf307f2b382c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 29 Jun 2018 15:24:11 +0200 Subject: [PATCH 091/166] added protocol and use the new cashaddr instead of legacy --- src/js/controllers/tab-receive.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index a77870cb4..143fa9207 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -73,7 +73,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv"); paymentSubscriptionObj.addr = $scope.addr } - clipboardService.copyToClipboard(paymentSubscriptionObj.addr); + + clipboardService.copyToClipboard($scope.protocolHandler + ":" + $scope.addr); // create subscription var msg = JSON.stringify(paymentSubscriptionObj); From c63bc06c76d67f1a7511a6476ee1a209e8dee26c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Sun, 1 Jul 2018 23:35:06 +0200 Subject: [PATCH 092/166] try catch on copy-to-clipboard --- src/js/controllers/tab-receive.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 143fa9207..7236b80c5 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -74,8 +74,12 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi paymentSubscriptionObj.addr = $scope.addr } - clipboardService.copyToClipboard($scope.protocolHandler + ":" + $scope.addr); - + try { + clipboardService.copyToClipboard($scope.protocolHandler + ":" + $scope.addr); + } catch (error) { + $log.debug("Error copying to clipboard:"); + $log.debug(error); + } // create subscription var msg = JSON.stringify(paymentSubscriptionObj); currentAddressSocket.onopen = function (event) { From ccf2dd45868ce2ee2c5df6b8487c80c96c68c0ba Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 2 Jul 2018 11:20:34 +1200 Subject: [PATCH 093/166] Changes as requested by PR. --- src/js/controllers/confirm.js | 9 +++++---- src/js/controllers/tab-receive.js | 2 +- src/js/services/txFormatService.js | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index cc48bf6b9..55b94446c 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -287,9 +287,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( tx.amountValueStr = tx.amountStr.split(' ')[0]; tx.amountUnitStr = tx.amountStr.split(' ')[1]; txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) { + var parts = v.split(' '); tx.alternativeAmountStr = v; - tx.alternativeAmountValueStr = tx.alternativeAmountStr.split(' ')[0]; - tx.alternativeAmountUnitStr = tx.alternativeAmountStr.split(' ')[1]; + tx.alternativeAmountValueStr = parts[0]; + tx.alternativeAmountUnitStr = (parts.length > 0) ? parts[1] : ''; }); } @@ -428,8 +429,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( function showSendMaxWarning(wallet, sendMaxInfo) { - var feeAlternative, - msg; + var feeAlternative = '', + msg = ''; function verifyExcludedUtxos() { var warningMsg = []; diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 4d048e22e..d5b7f1cd1 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -125,7 +125,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi for (var i = 0; i < data.x.out.length; i++) { if (data.x.out[i].addr == watchAddress) { $scope.paymentReceivedAmount = txFormatService.formatAmount(data.x.out[i].value, 'full'); - $scope.paymentReceivedAlternativeAmount = null; // For when a subsequent payment is received. + $scope.paymentReceivedAlternativeAmount = ''; // For when a subsequent payment is received. txFormatService.formatAlternativeStr($scope.wallet.coin, data.x.out[i].value, function(alternativeStr){ if (alternativeStr) { $scope.paymentReceivedAlternativeAmount = alternativeStr; diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index c208857a8..ebcb3886a 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -79,7 +79,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, var lessThanPrefix = ''; if (subcent) { roundedNum = 0.01; - lessThanPrefix = '< ' + lessThanPrefix = '< '; } var v1 = $filter('formatFiatAmount')(roundedNum); if (!v1) return null; From 9224d40a6554c70b0c500ca4e80031fb89e867e6 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 2 Jul 2018 14:06:36 +0900 Subject: [PATCH 094/166] Remove secure storage feature, postpone --- app-template/config-template.xml | 2 -- src/js/services/storageService.js | 55 +++++-------------------------- 2 files changed, 8 insertions(+), 49 deletions(-) diff --git a/app-template/config-template.xml b/app-template/config-template.xml index ed4b192ba..52a3f8860 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -73,8 +73,6 @@ - - diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index a2d85950b..bde3215a2 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('storageService', function(appConfigService, logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, secureStorageService, $timeout) { + .factory('storageService', function(appConfigService, logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, $timeout) { var root = {}; var storage; @@ -121,11 +121,7 @@ angular.module('copayApp.services') root.storeProfile = function(profile, cb) { var profileString = profile.toObj(); - if (platformInfo.isNW) { - storage.set('profile', profileString, cb); - } else { - secureStorageService.set('profile', profileString, cb); - } + storage.set('profile', profileString, cb); }; /** @@ -205,48 +201,13 @@ angular.module('copayApp.services') * @param {getProfileCallback} cb */ root.getProfile = function(cb) { - if (platformInfo.isNW) { - storage.get('profile', function(getErr, getStr) { - _onOldProfileRetrieved(getErr, getStr, cb); - }); - return - } - - secureStorageService.get('profile', function(secureErr, secureStr) { - var secureProfile; - var oldProfile; - - if (secureErr) { - return cb(secureErr, null); + storage.get('profile', function(getErr, getStr) { + if (getErr) { + cb(getErr, null); + } else { + profile = Profile.fromString(getStr); + cb(null, profile); } - - if (secureStr) { - try { - secureProfile = Profile.fromString(secureStr); - $log.debug('profile: ' + JSON.stringify(secureProfile)); - } catch (e) { - $log.error(e); - return cb(e, null); - } - } - - storage.get('profile', function(getErr, getStr) { - _onOldProfileRetrieved(getErr, getStr, function(oldErr, oldProfile){ - if (oldErr) { - return cb(oldErr, null); - } - - if (!oldProfile) { - if (secureProfile) { - return cb(null, secureProfile); - } else { - // No profiles found. No errors either. - return cb(null, null); - } - } - _migrateProfiles(oldProfile, secureProfile, cb); - }); - }); }); }; From eaaafbba6fb8cb6c441ad94c2a9fd60e5ed813e2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 2 Jul 2018 14:34:33 +0900 Subject: [PATCH 095/166] Mistake case where there is not profile --- src/js/services/storageService.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index bde3215a2..85d2e58cf 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -203,10 +203,14 @@ angular.module('copayApp.services') root.getProfile = function(cb) { storage.get('profile', function(getErr, getStr) { if (getErr) { - cb(getErr, null); + return cb(getErr, null); } else { - profile = Profile.fromString(getStr); - cb(null, profile); + if (!getStr) { + return cb(null, null); + } else { + profile = Profile.fromString(getStr); + return cb(null, profile); + } } }); }; From 867063fc8f77e7669c837fdebab818c1e8ce2f15 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 2 Jul 2018 17:57:51 +1200 Subject: [PATCH 096/166] Handle first launch. --- src/js/services/storageService.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index bde3215a2..44081a81f 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -204,10 +204,16 @@ angular.module('copayApp.services') storage.get('profile', function(getErr, getStr) { if (getErr) { cb(getErr, null); - } else { - profile = Profile.fromString(getStr); - cb(null, profile); + return; } + + if (!getStr) { + cb(null, null); + return; + } + + profile = Profile.fromString(getStr); + cb(null, profile); }); }; From 2422efdb462e1c9b252e2c9e3076810f16751539 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 2 Jul 2018 18:02:32 +1200 Subject: [PATCH 097/166] Bugfix for last commit. --- src/js/services/storageService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 44081a81f..10f0cdd76 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -212,7 +212,7 @@ angular.module('copayApp.services') return; } - profile = Profile.fromString(getStr); + var profile = Profile.fromString(getStr); cb(null, profile); }); }; From 6b20a01e2565ed593f6c73b8ee92db94157e16ba Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 2 Jul 2018 10:34:32 +0200 Subject: [PATCH 098/166] remove protocolHandler, only apply on bitcoincash: + support legacy&bitpay address types --- src/js/controllers/tab-receive.js | 2 +- src/js/services/clipboardService.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 7236b80c5..dedc00494 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -75,7 +75,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } try { - clipboardService.copyToClipboard($scope.protocolHandler + ":" + $scope.addr); + clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr); } catch (error) { $log.debug("Error copying to clipboard:"); $log.debug(error); diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index 67de530af..e2e0e5fb3 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -3,9 +3,10 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, $log, platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { var root = {}; - root.copyToClipboard = function (data, scope) { + root.copyToClipboard = function (data) { if (!data) return; + $log.debug("Copy '"+data+"' to clipboard"); if (platformInfo.isCordova) { cordova.plugins.clipboard.copy(data); } else if (platformInfo.isNW) { From c5cabcd5bbea2ecb42f41b1b8dc46d541fd70369 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 3 Jul 2018 11:23:43 +0900 Subject: [PATCH 099/166] Fix Android 4.4 (ArrayBuffer) by a shim --- Gruntfile.js | 1 + src/shim/shim.js | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 src/shim/shim.js diff --git a/Gruntfile.js b/Gruntfile.js index 282c8e0fb..56852417e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -136,6 +136,7 @@ module.exports = function(grunt) { }, angular: { src: [ + 'src/shim/shim.js', 'bower_components/qrcode-generator/js/qrcode.js', 'bower_components/qrcode-generator/js/qrcode_UTF8.js', 'bower_components/moment/min/moment-with-locales.js', diff --git a/src/shim/shim.js b/src/shim/shim.js new file mode 100644 index 000000000..495848f05 --- /dev/null +++ b/src/shim/shim.js @@ -0,0 +1,11 @@ +//--------------------------------------------------------------------- +// +// Add components what are missing in old JavaScript Engine +// +//--------------------------------------------------------------------- + +if (!ArrayBuffer['isView']) { + ArrayBuffer.isView = function(a) { + return a !== null && typeof(a) === "object" && a['buffer'] instanceof ArrayBuffer; + }; +} \ No newline at end of file From da0ffde1790738ef25369601a408c990fe8c0f0d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 3 Jul 2018 12:15:42 +0900 Subject: [PATCH 100/166] Brackets missing --- src/js/controllers/confirm.js | 4 +++- src/js/controllers/tab-receive.js | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index f77e6db75..c8dea6047 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -625,8 +625,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( ) && !isOn) { $scope.sendStatus = 'success'; - if ($state.current.name === "tabs.send.confirm") // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device. + if ($state.current.name === "tabs.send.confirm") { // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device. soundService.play('misc/payment_sent.mp3'); + } + firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin }); $timeout(function() { $scope.$digest(); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index dcae37131..5c9cef70f 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -131,8 +131,9 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } $scope.paymentReceivedCoin = $scope.wallet.coin; - if ($state.current.name === "tabs.receive") + if ($state.current.name === "tabs.receive") { soundService.play('misc/payment_received.mp3'); + } $scope.$apply(function () { $scope.showingPaymentReceived = true; From 7c7ad63f7eaccf451969fd77a5f863940f8077c6 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 3 Jul 2018 12:34:57 +0900 Subject: [PATCH 101/166] Update the release version : 4.12-rc2 --- app-template/bitcoincom/appConfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 2e9f82d29..9dc184e7c 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,9 +24,9 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.12.0", - "fullVersion": "4.12-rc1", - "androidVersion": "412000", + "version": "4.12.1", + "fullVersion": "4.12-rc2", + "androidVersion": "412100", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, From b10b6c54e926c9a29ccfe0e6c0556a9f41dd0167 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 3 Jul 2018 11:37:20 +0200 Subject: [PATCH 102/166] bannerService --- src/js/services/bannerService.js | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/js/services/bannerService.js diff --git a/src/js/services/bannerService.js b/src/js/services/bannerService.js new file mode 100644 index 000000000..5c03ec484 --- /dev/null +++ b/src/js/services/bannerService.js @@ -0,0 +1,48 @@ +'use strict'; +angular.module('copayApp.services').factory('bannerService', function ($http, $log) { + var root = {}; + + var marketingApiService = 'http://127.0.0.1:3232/bws/api/v1/marketing'; + var bannersFetched = false; + var banners = [{ + id: 'default-banner', + image: 'img/banner-store.png', + url: 'https://store.bitcoin.com/', + local: true + }]; + + root.fetchBannerSettings = function (cb) { + if (bannersFetched) + return cb(banners); + + var req = { + method: 'GET', + url: marketingApiService+'/settings', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }; + $http(req).then(function (data) { + $log.info('Get banner settings: SUCCESS'); + banners = banners.concat(data.data); + bannersFetched = true; + return cb(banners); + }, function (data) { + $log.error('Get banner settings: ERROR ' + data.statusText); + return cb(banners); + }); + }; + + root.getBannerImage = function (banner) { + if (banner.local) { + return banner.image; + } + + var fileName = banner.image.substring(0, banner.image.lastIndexOf('.')); + var extension = banner.image.substring(banner.image.lastIndexOf('.')); + return marketingApiService+'/banners/'+fileName+"/"+extension; + }; + + return root; +}); \ No newline at end of file From 1d5010de41b7150c2b570be0b7bcbfc12e4a3995 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 3 Jul 2018 11:38:22 +0200 Subject: [PATCH 103/166] home view changes for bannerService --- src/js/controllers/tab-home.js | 16 +++++++++++++--- www/views/tab-home.html | 6 ++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 1332287b6..28375be5f 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { var wallet; var listeners = []; var notifications = []; @@ -16,9 +16,19 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.isNW = platformInfo.isNW; $scope.showRateCard = {}; $scope.showServices = false; + $scope.bannerIsLoading = true; + $scope.bannerImageUrl = ''; + $scope.bannerUrl = ''; + $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); + bannerService.fetchBannerSettings(function(banners) { + var banner = banners[Math.floor(Math.random()*banners.length)]; + $scope.bannerImageUrl = bannerService.getBannerImage(banner); + $scope.bannerUrl = banner.url; + $scope.bannerIsLoading = false; + }); }); $scope.$on("$ionicView.beforeEnter", function(event, data) { @@ -155,8 +165,8 @@ angular.module('copayApp.controllers').controller('tabHomeController', externalLinkService.open(url, optIn, title, message, okText, cancelText); }; - $scope.openStore = function() { - externalLinkService.open('https://store.bitcoin.com/', false); + $scope.openBannerUrl = function() { + externalLinkService.open($scope.bannerUrl, false); }; $scope.openNotificationModal = function(n) { diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 4f044f3d2..463709c1e 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -92,9 +92,11 @@
From 4fb847b603abfe50251d4f343538dcb4442e80f3 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 3 Jul 2018 11:58:29 +0200 Subject: [PATCH 104/166] fix on qr-icon --- src/sass/qr.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sass/qr.scss b/src/sass/qr.scss index 3f8c9f104..056ab531f 100644 --- a/src/sass/qr.scss +++ b/src/sass/qr.scss @@ -1,14 +1,15 @@ qrcode { + position: relative; &.qr-icon { &::before { content: ""; background-size: 100% 100%; display: block; - margin-left: calc(50% - 22px); + left: 88px; margin-top: 88px; width: 44px; height: 44px; - position: absolute; + position:absolute; } &--bch::before { background-image: url('../img/qr-overlay-bch.png'); From 6fcc08617e74186679d2ea1a2a58e6eb11fd278c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 3 Jul 2018 12:06:44 +0200 Subject: [PATCH 105/166] renaming qr overlay classes --- src/sass/qr.scss | 2 +- www/views/tab-receive.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sass/qr.scss b/src/sass/qr.scss index 056ab531f..62fd12eb7 100644 --- a/src/sass/qr.scss +++ b/src/sass/qr.scss @@ -1,6 +1,6 @@ qrcode { position: relative; - &.qr-icon { + &.qr-overlay { &::before { content: ""; background-size: 100% 100%; diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 3dd8ce94a..12076812f 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -41,7 +41,7 @@ - +
{{addr}} From 4d3a63de51e945115b2b5cdd81b07764a193fec4 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 4 Jul 2018 13:01:02 +0900 Subject: [PATCH 106/166] Update tab-home (remove a comment) --- www/views/tab-home.html | 1 - 1 file changed, 1 deletion(-) diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 4f044f3d2..1ac17a0f6 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -73,7 +73,6 @@
Bitcoin Core (BTC)
-
Slow transactions with high fees
From bbe78ea4ca03abcea744b4cf16523813b4572a24 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 4 Jul 2018 17:17:39 +0900 Subject: [PATCH 107/166] Updates --- src/js/controllers/tab-home.js | 12 ++--- src/js/services/bannerService.js | 76 ++++++++++++++++++++++---------- 2 files changed, 60 insertions(+), 28 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 28375be5f..3f1526cbd 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -23,11 +23,13 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); - bannerService.fetchBannerSettings(function(banners) { - var banner = banners[Math.floor(Math.random()*banners.length)]; - $scope.bannerImageUrl = bannerService.getBannerImage(banner); - $scope.bannerUrl = banner.url; - $scope.bannerIsLoading = false; + + bannerService.getBanner(function (banner) { + $scope.$apply(function () { + $scope.bannerImageUrl = banner.imageURL; + $scope.bannerUrl = banner.url; + $scope.bannerIsLoading = false; + }); }); }); diff --git a/src/js/services/bannerService.js b/src/js/services/bannerService.js index 5c03ec484..00a72a6c6 100644 --- a/src/js/services/bannerService.js +++ b/src/js/services/bannerService.js @@ -1,20 +1,23 @@ 'use strict'; angular.module('copayApp.services').factory('bannerService', function ($http, $log) { + // Export var root = {}; - var marketingApiService = 'http://127.0.0.1:3232/bws/api/v1/marketing'; - var bannersFetched = false; - var banners = [{ + // Constant + var API_URL = 'https://bwscash.bitcoin.com/bws/api/v1/marketing'; + + // Variable + var hasFetched = false; + var banners = []; + var defaultBanner = { id: 'default-banner', - image: 'img/banner-store.png', + imageURL: 'img/banner-store.png', url: 'https://store.bitcoin.com/', - local: true - }]; - - root.fetchBannerSettings = function (cb) { - if (bannersFetched) - return cb(banners); + isLocal: true + }; + // Private methods + var fetchSettings = function (cb) { var req = { method: 'GET', url: marketingApiService+'/settings', @@ -23,25 +26,52 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l 'Accept': 'application/json' } }; - $http(req).then(function (data) { + $http(req).then(function (response) { $log.info('Get banner settings: SUCCESS'); - banners = banners.concat(data.data); - bannersFetched = true; - return cb(banners); - }, function (data) { + banners = response.data + return cb(true); + }, function (error) { $log.error('Get banner settings: ERROR ' + data.statusText); - return cb(banners); + return cb(false); }); }; - root.getBannerImage = function (banner) { - if (banner.local) { - return banner.image; - } + root.getBanner = function (cb) { + + // If not fetch get the banner + if (!hasFetched) { + hasFetched = true; - var fileName = banner.image.substring(0, banner.image.lastIndexOf('.')); - var extension = banner.image.substring(banner.image.lastIndexOf('.')); - return marketingApiService+'/banners/'+fileName+"/"+extension; + // If never fetch, lets fetch + fetchSettings(function (isSuccess) { + root.getBannerImage(cb); + }); + + // If fetch, and got banners, lets have a look + } else if (banners.length > 0) { + var selectedBanners = []; + for(var i in banners) { + var banner = banners[i]; + + // Generate the URL for the banner + var fileName = banner.image.substring(0, banner.image.lastIndexOf('.')); + var extension = banner.image.substring(banner.image.lastIndexOf('.')); + banner.imageURL = API_URL +'/banners/'+fileName+"/"+extension; + + // Add the banner + selectedBanners.push(banners[i]); + } + + // If no banner activated, I return the default one + if (selectedBanners.length == 0) { + return cb(defaultBanner); + } else { + return cb(selectedBanners[Math.floor(Math.random()*banners.length)]); + } + + } else { + return cb(defaultBanner); + } }; return root; From de32460fd7136db712f91051c98b8745b4e5030e Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 4 Jul 2018 11:05:31 +0200 Subject: [PATCH 108/166] bannerService fixes + some space for the loader --- src/js/controllers/tab-home.js | 8 +++----- src/js/services/bannerService.js | 12 ++++++------ src/sass/views/tab-home.scss | 3 +++ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 3f1526cbd..3a56e6d5c 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -25,11 +25,9 @@ angular.module('copayApp.controllers').controller('tabHomeController', startupService.ready(); bannerService.getBanner(function (banner) { - $scope.$apply(function () { - $scope.bannerImageUrl = banner.imageURL; - $scope.bannerUrl = banner.url; - $scope.bannerIsLoading = false; - }); + $scope.bannerImageUrl = banner.imageURL; + $scope.bannerUrl = banner.url; + $scope.bannerIsLoading = false; }); }); diff --git a/src/js/services/bannerService.js b/src/js/services/bannerService.js index 00a72a6c6..cb32793a0 100644 --- a/src/js/services/bannerService.js +++ b/src/js/services/bannerService.js @@ -20,7 +20,7 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l var fetchSettings = function (cb) { var req = { method: 'GET', - url: marketingApiService+'/settings', + url: API_URL+'/settings', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' @@ -28,10 +28,10 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l }; $http(req).then(function (response) { $log.info('Get banner settings: SUCCESS'); - banners = response.data + banners = response.data; return cb(true); }, function (error) { - $log.error('Get banner settings: ERROR ' + data.statusText); + $log.error('Get banner settings: ERROR ' + response.statusText); return cb(false); }); }; @@ -44,7 +44,7 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l // If never fetch, lets fetch fetchSettings(function (isSuccess) { - root.getBannerImage(cb); + root.getBanner(cb); }); // If fetch, and got banners, lets have a look @@ -55,14 +55,14 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l // Generate the URL for the banner var fileName = banner.image.substring(0, banner.image.lastIndexOf('.')); - var extension = banner.image.substring(banner.image.lastIndexOf('.')); + var extension = banner.image.substring(banner.image.lastIndexOf('.')+1); banner.imageURL = API_URL +'/banners/'+fileName+"/"+extension; // Add the banner selectedBanners.push(banners[i]); } - // If no banner activated, I return the default one + // If no banner activated, return the default one if (selectedBanners.length == 0) { return cb(defaultBanner); } else { diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index 46fb15224..66a2f1d58 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -59,6 +59,9 @@ } } &-banner { + svg { + margin: 40px auto 40px; + } padding: 0; &__img { width: 100%; From be39986e2400b176795ddc4deef78fe7742e05f9 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 4 Jul 2018 11:07:33 +0200 Subject: [PATCH 109/166] catch error fix --- src/js/services/bannerService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/bannerService.js b/src/js/services/bannerService.js index cb32793a0..d48d8861e 100644 --- a/src/js/services/bannerService.js +++ b/src/js/services/bannerService.js @@ -31,7 +31,7 @@ angular.module('copayApp.services').factory('bannerService', function ($http, $l banners = response.data; return cb(true); }, function (error) { - $log.error('Get banner settings: ERROR ' + response.statusText); + $log.error('Get banner settings: ERROR ' + error.statusText); return cb(false); }); }; From 39232ce7393b5134b09ae5377f73ab9a9df1bca1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 4 Jul 2018 18:28:41 +0900 Subject: [PATCH 110/166] Update the translation --- i18n/docs/appstore_en.txt | 46 +- i18n/docs/updateinfo_en.txt | 2 +- i18n/po/ca/template-ca.po | 6 +- i18n/po/cs/template-cs.po | 6 +- i18n/po/de/template-de.po | 6 +- i18n/po/es-ES/template-es-ES.po | 6 +- i18n/po/fa/template-fa.po | 6 +- i18n/po/fr/template-fr.po | 6 +- i18n/po/it/template-it.po | 6 +- i18n/po/ja/template-ja.po | 10 +- i18n/po/ko/template-ko.po | 6 +- i18n/po/nl/template-nl.po | 6 +- i18n/po/pl/template-pl.po | 6 +- i18n/po/pt-BR/template-pt-BR.po | 6 +- i18n/po/ru/template-ru.po | 6 +- i18n/po/sv-SE/template-sv-SE.po | 8 +- i18n/po/template.pot | 7252 ++++++++++++++++--------------- i18n/po/vi/template-vi.po | 32 +- i18n/po/zh-CN/template-zh-CN.po | 6 +- 19 files changed, 3748 insertions(+), 3680 deletions(-) diff --git a/i18n/docs/appstore_en.txt b/i18n/docs/appstore_en.txt index bdcad6673..6b7cd0a60 100644 --- a/i18n/docs/appstore_en.txt +++ b/i18n/docs/appstore_en.txt @@ -1,23 +1,23 @@ -Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay. -Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others: - -To save for vacations or joint purchases with friends -To track family spending and allowances -To manage business, club, or organization funds and expenses - -We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility: - -Multiple wallet creation and management in-app -Intuitive multisignature security for personal or shared wallets -Easy spending proposal flow for shared wallets and group payments -Hierarchical deterministic (HD) address generation and wallet backups -Device-based security: all private keys are stored locally, not in the cloud -Support for Bitcoin testnet wallets -Synchronous access across all major mobile and desktop platforms -Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments -Support for 150+ currency pricing options and unit denomination in BTC or bits -Email notifications for payments and transfers -Customizable wallet naming and background colors -9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU) - -Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay). +Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay. +Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others: + +To save for vacations or joint purchases with friends +To track family spending and allowances +To manage business, club, or organization funds and expenses + +We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility: + +Multiple wallet creation and management in-app +Intuitive multisignature security for personal or shared wallets +Easy spending proposal flow for shared wallets and group payments +Hierarchical deterministic (HD) address generation and wallet backups +Device-based security: all private keys are stored locally, not in the cloud +Support for Bitcoin testnet wallets +Synchronous access across all major mobile and desktop platforms +Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments +Support for 150+ currency pricing options and unit denomination in BTC or bits +Email notifications for payments and transfers +Customizable wallet naming and background colors +9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU) + +Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay). diff --git a/i18n/docs/updateinfo_en.txt b/i18n/docs/updateinfo_en.txt index 8b1378917..d3f5a12fa 100644 --- a/i18n/docs/updateinfo_en.txt +++ b/i18n/docs/updateinfo_en.txt @@ -1 +1 @@ - + diff --git a/i18n/po/ca/template-ca.po b/i18n/po/ca/template-ca.po index f7f513bc2..515fcd814 100644 --- a/i18n/po/ca/template-ca.po +++ b/i18n/po/ca/template-ca.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Catalan\n" "Language: ca\n" -"PO-Revision-Date: 2018-06-22T04:02:43+0000\n" +"PO-Revision-Date: 2018-07-04 09:26\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Compte" msgid "Account Number" msgstr "Número de compte" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Transaccions instantànies amb comissions baixes" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Comptes" diff --git a/i18n/po/cs/template-cs.po b/i18n/po/cs/template-cs.po index 8aad5ecb2..14fe7faf2 100644 --- a/i18n/po/cs/template-cs.po +++ b/i18n/po/cs/template-cs.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Czech\n" "Language: cs\n" -"PO-Revision-Date: 2018-06-22T04:02:46+0000\n" +"PO-Revision-Date: 2018-07-04 09:26\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Účet" msgid "Account Number" msgstr "Číslo účtu" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Okamžité transakce s nízkou platbou" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Účty" diff --git a/i18n/po/de/template-de.po b/i18n/po/de/template-de.po index 9767a07a7..7b3a50d69 100644 --- a/i18n/po/de/template-de.po +++ b/i18n/po/de/template-de.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: German\n" "Language: de\n" -"PO-Revision-Date: 2018-06-22T04:02:49+0000\n" +"PO-Revision-Date: 2018-07-04 03:57\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Benutzerkonto" msgid "Account Number" msgstr "Kontonummer" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Konten" diff --git a/i18n/po/es-ES/template-es-ES.po b/i18n/po/es-ES/template-es-ES.po index 046826130..e062b4d1e 100644 --- a/i18n/po/es-ES/template-es-ES.po +++ b/i18n/po/es-ES/template-es-ES.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Spanish\n" "Language: es\n" -"PO-Revision-Date: 2018-06-22T04:02:57+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Cuenta" msgid "Account Number" msgstr "Número de cuenta" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Transacciones instantáneas con comisiones bajas" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Cuentas" diff --git a/i18n/po/fa/template-fa.po b/i18n/po/fa/template-fa.po index dfd490fda..aa4b76892 100644 --- a/i18n/po/fa/template-fa.po +++ b/i18n/po/fa/template-fa.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Persian\n" "Language: fa\n" -"PO-Revision-Date: 2018-06-22T04:02:53+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "حساب" msgid "Account Number" msgstr "شماره حساب" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "معاملات فوری با پرداخت کم" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "حساب ها" diff --git a/i18n/po/fr/template-fr.po b/i18n/po/fr/template-fr.po index 559799342..f49b0fe55 100644 --- a/i18n/po/fr/template-fr.po +++ b/i18n/po/fr/template-fr.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: French\n" "Language: fr\n" -"PO-Revision-Date: 2018-06-22T04:02:48+0000\n" +"PO-Revision-Date: 2018-07-04 09:26\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Compte" msgid "Account Number" msgstr "Numéro de compte" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Transactions instantanées à bas frais" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Comptes" diff --git a/i18n/po/it/template-it.po b/i18n/po/it/template-it.po index 0055adf06..1fcaea030 100644 --- a/i18n/po/it/template-it.po +++ b/i18n/po/it/template-it.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Italian\n" "Language: it\n" -"PO-Revision-Date: 2018-06-22T04:02:50+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Conto" msgid "Account Number" msgstr "Numero del Conto" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Transazioni istantanee con commissioni basse" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Account" diff --git a/i18n/po/ja/template-ja.po b/i18n/po/ja/template-ja.po index 8cdbd23ec..e7df99c1b 100644 --- a/i18n/po/ja/template-ja.po +++ b/i18n/po/ja/template-ja.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Japanese\n" "Language: ja\n" -"PO-Revision-Date: 2018-06-22T04:02:51+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "ポケット" msgid "Account Number" msgstr "ポケット番号" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "僅かな手数料で即時決済" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "アカウント一覧" @@ -631,7 +635,7 @@ msgstr "翻訳に協力" #: src/js/controllers/confirm.js:130 msgid "Copay only supports Bitcoin Cash using new version numbers addresses" -msgstr "Copay のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。" +msgstr "のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。" #: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" @@ -2225,7 +2229,7 @@ msgstr "正しい順序で各単語をタップしてください。" #: src/js/services/bwcError.js:101 msgid "Please upgrade Copay to perform this action" -msgstr "この操作を実行するにはCopayを最新バージョンに更新してください" +msgstr "この操作を実行するにはを最新バージョンに更新してください" #: www/views/walletDetails.html:142 #: www/views/walletDetails.html:62 diff --git a/i18n/po/ko/template-ko.po b/i18n/po/ko/template-ko.po index 67cfe2496..cee1be7d1 100644 --- a/i18n/po/ko/template-ko.po +++ b/i18n/po/ko/template-ko.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Korean\n" "Language: ko\n" -"PO-Revision-Date: 2018-06-22T04:02:52+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "계정" msgid "Account Number" msgstr "계정 번호" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "낮은 수수료로 빠른 송금을" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "계정들" diff --git a/i18n/po/nl/template-nl.po b/i18n/po/nl/template-nl.po index c47511226..754c41e21 100644 --- a/i18n/po/nl/template-nl.po +++ b/i18n/po/nl/template-nl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Dutch\n" "Language: nl\n" -"PO-Revision-Date: 2018-06-22T04:02:48+0000\n" +"PO-Revision-Date: 2018-07-04 09:26\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Account" msgid "Account Number" msgstr "Account Nummer" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Directe transacties tegen lage kosten" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Accounts" diff --git a/i18n/po/pl/template-pl.po b/i18n/po/pl/template-pl.po index 4a9f5c0ea..ce075e00b 100644 --- a/i18n/po/pl/template-pl.po +++ b/i18n/po/pl/template-pl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Polish\n" "Language: pl\n" -"PO-Revision-Date: 2018-06-22T04:02:54+0000\n" +"PO-Revision-Date: 2018-07-04 03:58\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Konto" msgid "Account Number" msgstr "Numer konta" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Konta" diff --git a/i18n/po/pt-BR/template-pt-BR.po b/i18n/po/pt-BR/template-pt-BR.po index ef43aa4ef..c83259bf9 100644 --- a/i18n/po/pt-BR/template-pt-BR.po +++ b/i18n/po/pt-BR/template-pt-BR.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" -"PO-Revision-Date: 2018-06-22T04:02:55+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Conta" msgid "Account Number" msgstr "Número de conta" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Transações instantâneas com taxas baixas" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Contas" diff --git a/i18n/po/ru/template-ru.po b/i18n/po/ru/template-ru.po index 163473060..074fa9937 100644 --- a/i18n/po/ru/template-ru.po +++ b/i18n/po/ru/template-ru.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Russian\n" "Language: ru\n" -"PO-Revision-Date: 2018-06-22T04:02:56+0000\n" +"PO-Revision-Date: 2018-07-04 09:27\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Учётная запись" msgid "Account Number" msgstr "Номер учётной записи" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "Мгновенные транзакции с низкой оплатой" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Аккаунты" diff --git a/i18n/po/sv-SE/template-sv-SE.po b/i18n/po/sv-SE/template-sv-SE.po index ccdd0492b..bc496d6d5 100644 --- a/i18n/po/sv-SE/template-sv-SE.po +++ b/i18n/po/sv-SE/template-sv-SE.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Swedish\n" "Language: sv\n" -"PO-Revision-Date: 2018-06-22T04:02:58+0000\n" +"PO-Revision-Date: 2018-07-04 03:58\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "Konto" msgid "Account Number" msgstr "Kontonummer" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "Konton" @@ -369,7 +373,7 @@ msgstr "" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 msgid "Bitcoin Cash Wallets" -msgstr "" +msgstr "Bitcoin Cash plånböcker" #: www/views/modals/chooseFeeLevel.html:4 #: www/views/preferencesFee.html:4 diff --git a/i18n/po/template.pot b/i18n/po/template.pot index d97008340..66a2e7ca8 100644 --- a/i18n/po/template.pot +++ b/i18n/po/template.pot @@ -1,3624 +1,3628 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: \n" - -#: www/views/modals/paypro.html:34 -msgid "(Trusted)" -msgstr "" - -#: www/views/includes/txp.html:23 -#: www/views/includes/walletHistory.html:64 -msgid "(possible double spend)" -msgstr "" - -#: www/views/modals/txp-details.html:159 -msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." -msgstr "" - -#: www/views/tx-details.html:82 -msgid "- {{btx.feeRateStr}} of the transaction" -msgstr "" - -#: www/views/modals/txp-details.html:102 -msgid "- {{tx.feeRateStr}} of the transaction" -msgstr "" - -#: www/views/feedback/rateApp.html:7 -msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!" -msgstr "" - -#: www/views/mercadoLibre.html:18 -#: www/views/mercadoLibre.html:40 -msgid "Only redeemable on Mercado Livre (Brazil)" -msgstr "" - -#: src/js/controllers/feedback/send.js:27 -#: www/views/feedback/complete.html:21 -msgid "A member of the team will review your feedback as soon as possible." -msgstr "" - -#: src/js/controllers/confirm.js:401 -msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." -msgstr "" - -#: src/js/controllers/confirm.js:395 -msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "" - -#: src/js/controllers/preferencesAbout.js:6 -#: www/views/tab-settings.html:156 -msgid "About" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:62 -#: src/js/controllers/tx-details.js:79 -msgid "Accepted" -msgstr "" - -#: www/views/preferencesInformation.html:72 -msgid "Account" -msgstr "" - -#: www/views/join.html:72 -#: www/views/tab-create-personal.html:45 -#: www/views/tab-create-shared.html:74 -#: www/views/tab-import-hardware.html:19 -msgid "Account Number" -msgstr "" - -#: www/views/preferencesBitpayServices.html:23 -msgid "Accounts" -msgstr "" - -#: www/views/bitpayCard.html:56 -msgid "Activity" -msgstr "" - -#: src/js/services/bitpayAccountService.js:83 -msgid "Add Account" -msgstr "" - -#: src/js/services/bitpayAccountService.js:69 -msgid "Add BitPay Account?" -msgstr "" - -#: www/views/addressbook.add.html:4 -#: www/views/addressbook.html:22 -msgid "Add Contact" -msgstr "" - -#: www/views/bitpayCard.html:28 -msgid "Add Funds" -msgstr "" - -#: www/views/confirm.html:94 -msgid "Add Memo" -msgstr "" - -#: www/views/join.html:87 -#: www/views/tab-create-personal.html:59 -#: www/views/tab-create-shared.html:88 -msgid "Add a password" -msgstr "" - -#: www/views/includes/accountSelector.html:27 -msgid "Add account" -msgstr "" - -#: www/views/join.html:90 -#: www/views/tab-create-personal.html:62 -#: www/views/tab-create-shared.html:91 -msgid "Add an optional password to secure the recovery phrase" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:41 -msgid "Add as a contact" -msgstr "" - -#: src/js/controllers/confirm.js:424 -msgid "Add description" -msgstr "" - -#: www/views/topup.html:6 -msgid "Add funds" -msgstr "" - -#: src/js/services/bitpayAccountService.js:78 -msgid "Add this BitPay account ({{email}})?" -msgstr "" - -#: www/views/add.html:3 -msgid "Add wallet" -msgstr "" - -#: www/views/addressbook.view.html:26 -#: www/views/customAmount.html:28 -#: www/views/modals/paypro.html:24 -msgid "Address" -msgstr "" - -#: www/views/addressbook.html:6 -#: www/views/tab-settings.html:13 -msgid "Address Book" -msgstr "" - -#: www/views/preferencesInformation.html:41 -msgid "Address Type" -msgstr "" - -#: www/views/addresses.html:64 -msgid "Addresses With Balance" -msgstr "" - -#: www/views/tab-settings.html:149 -msgid "Advanced" -msgstr "" - -#: www/views/advancedSettings.html:3 -msgid "Advanced Settings" -msgstr "" - -#: www/views/bitpayCard.html:62 -msgid "All" -msgstr "" - -#: www/views/allAddresses.html:3 -msgid "All Addresses" -msgstr "" - -#: www/views/modals/wallet-balance.html:18 -msgid "All of your bitcoin wallet balance may not be available for immediate spending." -msgstr "" - -#: www/views/tab-receive.html:25 -msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." -msgstr "" - -#: www/views/tab-scan.html:21 -msgid "Allow Camera Access" -msgstr "" - -#: www/views/onboarding/notifications.html:7 -msgid "Allow notifications" -msgstr "" - -#: www/views/onboarding/disclaimer.html:14 -msgid "Almost done! Let's review." -msgstr "" - -#: www/views/preferencesAltCurrency.html:4 -#: www/views/tab-settings.html:79 -msgid "Alternative Currency" -msgstr "" - -#: src/js/controllers/buyAmazon.js:98 -msgid "Amazon.com is not available at this moment. Please try back later." -msgstr "" - -#: www/views/amount.html:44 -#: www/views/customAmount.html:34 -#: www/views/includes/output.html:7 -msgid "Amount" -msgstr "" - -#: src/js/services/bwcError.js:110 -msgid "Amount below minimum allowed" -msgstr "" - -#: src/js/controllers/confirm.js:216 -msgid "Amount too big" -msgstr "" - -#: www/views/includes/walletHistory.html:31 -msgid "Amount too low to spend" -msgstr "" - -#: src/js/controllers/tab-home.js:147 -msgid "An update to this app is available. For your security, please update to the latest version." -msgstr "" - -#: www/views/backupWarning.html:14 -msgid "Anyone with your backup phrase can access or spend your bitcoin." -msgstr "" - -#: www/views/addresses.html:94 -msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" -msgstr "" - -#: www/views/backupWarning.html:10 -msgid "Are you being watched?" -msgstr "" - -#: src/js/controllers/preferencesExternal.js:15 -msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin." -msgstr "" - -#: src/js/controllers/copayers.js:56 -msgid "Are you sure you want to cancel and delete this wallet?" -msgstr "" - -#: src/js/controllers/addressbookView.js:37 -msgid "Are you sure you want to delete this contact?" -msgstr "" - -#: src/js/controllers/preferencesDelete.js:25 -msgid "Are you sure you want to delete this wallet?" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:154 -msgid "Are you sure you want to reject this transaction?" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:171 -msgid "Are you sure you want to remove this transaction?" -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:23 -msgid "Are you sure you want to skip it?" -msgstr "" - -#: www/views/modals/bitpay-card-confirmation.html:4 -msgid "Are you sure you would like to log out of your BitPay Card account?" -msgstr "" - -#: src/js/controllers/preferencesBitpayCard.js:7 -#: src/js/controllers/preferencesBitpayServices.js:20 -msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" -msgstr "" - -#: www/views/includes/walletInfo.html:10 -msgid "Auditable" -msgstr "" - -#: www/views/modals/wallet-balance.html:42 -msgid "Available" -msgstr "" - -#: www/views/includes/available-balance.html:3 -msgid "Available Balance" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:24 -#: www/views/preferencesFee.html:15 -msgid "Average confirmation time" -msgstr "" - -#: www/views/join.html:143 -#: www/views/tab-create-personal.html:113 -#: www/views/tab-create-shared.html:142 -#: www/views/tab-import-phrase.html:51 -msgid "BIP32 path for address derivation" -msgstr "" - -#: www/views/cashScan.html:25 -msgid "BTC wallets" -msgstr "" - -#: www/views/preferences.html:34 -msgid "Backup" -msgstr "" - -#: www/views/includes/backupNeededPopup.html:7 -msgid "Backup Needed" -msgstr "" - -#: src/js/controllers/lockSetup.js:87 -msgid "Backup all livenet wallets before using this function" -msgstr "" - -#: src/js/controllers/cashScan.js:64 -#: www/views/includes/walletListSettings.html:12 -#: www/views/preferences.html:36 -msgid "Backup needed" -msgstr "" - -#: www/views/includes/backupNeededPopup.html:9 -msgid "Backup now" -msgstr "" - -#: www/views/onboarding/backupRequest.html:11 -#: www/views/tab-export-file.html:89 -msgid "Backup wallet" -msgstr "" - -#: src/js/controllers/lockSetup.js:84 -msgid "Backup your wallet before using this function" -msgstr "" - -#: src/js/services/profileService.js:446 -msgid "Bad wallet invitation" -msgstr "" - -#: www/views/preferencesInformation.html:102 -msgid "Balance By Address" -msgstr "" - -#: www/views/includes/confirmBackupPopup.html:7 -msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." -msgstr "" - -#: www/views/preferencesBitpayServices.html:9 -msgid "BitPay Visa® Cards" -msgstr "" - -#: www/views/addressbook.add.html:38 -#: www/views/includes/incomingDataMenu.html:29 -msgid "Bitcoin Address" -msgstr "" - -#: www/views/cashScan.html:4 -msgid "Bitcoin Cash (BCH) Balances" -msgstr "" - -#: www/views/preferencesCash.html:3 -#: www/views/tab-settings.html:47 -msgid "Bitcoin Cash Support" -msgstr "" - -#: www/views/tab-home.html:98 -#: www/views/tab-settings.html:115 -msgid "Bitcoin Cash Wallets" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:4 -#: www/views/preferencesFee.html:4 -#: www/views/tab-settings.html:90 -msgid "Bitcoin Network Fee Policy" -msgstr "" - -#: www/views/tab-home.html:83 -#: www/views/tab-settings.html:107 -msgid "Bitcoin Core Wallets" -msgstr "" - -#: src/js/services/incomingData.js:151 -msgid "Bitcoin cash Payment" -msgstr "" - -#: www/views/onboarding/tour.html:31 -msgid "Bitcoin is a currency." -msgstr "" - -#: www/views/onboarding/disclaimer.html:15 -msgid "Bitcoin is different – it cannot be safely held with a bank or web service." -msgstr "" - -#: www/views/onboarding/tour.html:18 -msgid "Bitcoin is secure,
digital money." -msgstr "" - -#: www/views/preferencesFee.html:11 -msgid "Bitcoin transactions include a fee collected by miners on the network." -msgstr "" - -#: www/views/buyAmazon.html:108 -msgid "Bought {{amountUnitStr}}" -msgstr "" - -#: www/views/modals/txp-details.html:36 -msgid "Broadcast Payment" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:64 -#: src/js/controllers/tx-details.js:81 -msgid "Broadcasted" -msgstr "" - -#: src/js/services/onGoingProcess.js:11 -msgid "Broadcasting transaction" -msgstr "" - -#: www/views/unsupported.html:6 -msgid "Browser unsupported" -msgstr "" - -#: www/views/buyAmazon.html:5 -#: www/views/buyMercadoLibre.html:6 -msgid "Buy" -msgstr "" - -#: www/views/includes/buyAndSellCard.html:3 -msgid "Buy & Sell Bitcoin" -msgstr "" - -#: www/views/tab-send.html:35 -msgid "Buy Bitcoin" -msgstr "" - -#: www/views/mercadoLibre.html:22 -#: www/views/mercadoLibre.html:50 -msgid "Buy a Gift Card" -msgstr "" - -#: src/js/controllers/buyAmazon.js:334 -msgid "Buy from" -msgstr "" - -#: src/js/services/onGoingProcess.js:40 -msgid "Buying Bitcoin..." -msgstr "" - -#: src/js/services/onGoingProcess.js:12 -msgid "Calculating fee" -msgstr "" - -#: src/js/controllers/buyAmazon.js:313 -#: src/js/controllers/buyMercadoLibre.js:307 -#: src/js/controllers/confirm.js:550 -#: src/js/controllers/topup.js:287 -#: src/js/services/incomingData.js:154 -#: src/js/services/popupService.js:62 -#: src/js/services/popupService.js:73 -#: www/views/addressbook.add.html:10 -#: www/views/feedback/send.html:5 -#: www/views/includes/incomingDataMenu.html:22 -#: www/views/includes/incomingDataMenu.html:54 -#: www/views/includes/incomingDataMenu.html:73 -#: www/views/includes/incomingDataMenu.html:97 -#: www/views/includes/note.html:6 -#: www/views/modals/bitpay-card-confirmation.html:8 -#: www/views/modals/confirmation.html:13 -msgid "Cancel" -msgstr "" - -#: www/views/copayers.html:36 -msgid "Cancel invitation" -msgstr "" - -#: src/js/controllers/onboarding/tour.js:52 -msgid "Cannot Create Wallet" -msgstr "" - -#: src/js/services/profileService.js:442 -msgid "Cannot join the same wallet more that once" -msgstr "" - -#: www/views/includes/bitpayCardsCard.html:2 -msgid "Cards" -msgstr "" - -#: www/views/modals/paypro.html:30 -msgid "Certified by" -msgstr "" - -#: www/views/preferencesExternal.html:19 -msgid "Check installation and retry." -msgstr "" - -#: www/views/tab-import-file.html:4 -msgid "Choose a backup file from your computer" -msgstr "" - -#: www/views/modals/wallets.html:9 -msgid "Choose your destination wallet" -msgstr "" - -#: www/views/modals/wallets.html:10 -msgid "Choose your source wallet" -msgstr "" - -#: www/views/backup.html:61 -msgid "Clear" -msgstr "" - -#: www/views/preferencesHistory.html:24 -msgid "Clear cache" -msgstr "" - -#: src/js/controllers/confirm.js:373 -#: src/js/controllers/modals/txpDetails.js:49 -msgid "Click to accept" -msgstr "" - -#: src/js/controllers/confirm.js:367 -msgid "Click to pay" -msgstr "" - -#: src/js/controllers/confirm.js:379 -#: src/js/controllers/modals/txpDetails.js:42 -msgid "Click to send" -msgstr "" - -#: www/views/customAmount.html:4 -#: www/views/modals/mercadolibre-card-details.html:3 -#: www/views/modals/paypro.html:4 -#: www/views/modals/pin.html:3 -#: www/views/modals/search.html:3 -#: www/views/modals/wallet-balance.html:3 -#: www/views/modals/wallets.html:5 -msgid "Close" -msgstr "" - -#: www/views/includes/cash.html:2 -#: www/views/preferencesInformation.html:17 -msgid "Coin" -msgstr "" - -#: www/views/preferences.html:22 -msgid "Color" -msgstr "" - -#: www/views/preferencesAbout.html:21 -msgid "Commit hash" -msgstr "" - -#: www/views/preferences.html:49 -msgid "Complete the backup process to use this option" -msgstr "" - -#: www/views/bitpayCard.html:93 -msgid "Completed" -msgstr "" - -#: src/js/controllers/buyAmazon.js:311 -#: src/js/controllers/buyMercadoLibre.js:305 -#: src/js/controllers/confirm.js:549 -#: src/js/controllers/copayers.js:55 -#: src/js/controllers/topup.js:285 -#: www/views/backup.html:60 -#: www/views/backup.html:79 -#: www/views/confirm.html:4 -#: www/views/onboarding/collectEmail.html:32 -msgid "Confirm" -msgstr "" - -#: www/views/modals/terms.html:26 -#: www/views/onboarding/disclaimer.html:44 -msgid "Confirm & Finish" -msgstr "" - -#: www/views/buyAmazon.html:90 -msgid "Confirm purchase" -msgstr "" - -#: www/views/modals/pin.html:10 -msgid "Confirm your PIN" -msgstr "" - -#: src/js/services/walletService.js:1033 -msgid "Confirm your new spending password" -msgstr "" - -#: www/views/tx-details.html:98 -msgid "Confirmations" -msgstr "" - -#: www/views/bitpayCard.html:68 -#: www/views/modals/wallet-balance.html:61 -msgid "Confirming" -msgstr "" - -#: www/views/bitpayCardIntro.html:37 -msgid "Connect my BitPay Card" -msgstr "" - -#: src/js/services/onGoingProcess.js:13 -msgid "Connecting to Coinbase..." -msgstr "" - -#: src/js/services/onGoingProcess.js:14 -msgid "Connecting to Glidera..." -msgstr "" - -#: src/js/services/bwcError.js:53 -msgid "Connection reset by peer" -msgstr "" - -#: www/views/tab-send.html:45 -msgid "Contacts" -msgstr "" - -#: www/views/onboarding/notifications.html:9 -msgid "Continue" -msgstr "" - -#: www/views/preferencesLanguage.html:26 -msgid "Contribute Translations" -msgstr "" - -#: src/js/controllers/confirm.js:130 -msgid "Copay only supports Bitcoin Cash using new version numbers addresses" -msgstr "" - -#: src/js/services/bwcError.js:62 -msgid "Copayer already in this wallet" -msgstr "" - -#: src/js/services/bwcError.js:77 -msgid "Copayer already voted on this spend proposal" -msgstr "" - -#: src/js/services/bwcError.js:107 -msgid "Copayer data mismatch" -msgstr "" - -#: www/views/includes/walletActivity.html:2 -msgid "Copayer joined" -msgstr "" - -#: www/views/preferencesInformation.html:94 -msgid "Copayer {{$index}}" -msgstr "" - -#: src/js/controllers/copayers.js:79 -#: src/js/controllers/export.js:193 -#: www/views/includes/copyToClipboard.html:4 -msgid "Copied to clipboard" -msgstr "" - -#: www/views/tab-export-file.html:94 -msgid "Copy this text as it is to a safe place (notepad or email)" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:51 -#: www/views/includes/incomingDataMenu.html:70 -#: www/views/includes/incomingDataMenu.html:94 -#: www/views/includes/logOptions.html:9 -#: www/views/tab-export-file.html:78 -msgid "Copy to clipboard" -msgstr "" - -#: src/js/controllers/buyMercadoLibre.js:102 -msgid "Could not access Gift Card Service" -msgstr "" - -#: www/views/tab-import-phrase.html:2 -msgid "Could not access the wallet at the server. Please check:" -msgstr "" - -#: src/js/controllers/buyAmazon.js:102 -msgid "Could not access to Amazon.com" -msgstr "" - -#: src/js/services/profileService.js:511 -msgid "Could not access wallet" -msgstr "" - -#: src/js/controllers/confirm.js:210 -msgid "Could not add message to imported wallet without shared encrypting key" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:199 -msgid "Could not broadcast payment" -msgstr "" - -#: src/js/services/bwcError.js:41 -msgid "Could not build transaction" -msgstr "" - -#: src/js/services/walletService.js:854 -msgid "Could not create address" -msgstr "" - -#: src/js/controllers/topup.js:92 -msgid "Could not create the invoice" -msgstr "" - -#: src/js/controllers/buyAmazon.js:164 -#: src/js/controllers/buyMercadoLibre.js:164 -#: src/js/controllers/topup.js:142 -msgid "Could not create transaction" -msgstr "" - -#: src/js/services/profileService.js:350 -msgid "Could not create using the specified extended private key" -msgstr "" - -#: src/js/services/profileService.js:362 -msgid "Could not create using the specified extended public key" -msgstr "" - -#: src/js/services/profileService.js:338 -msgid "Could not create: Invalid wallet recovery phrase" -msgstr "" - -#: src/js/controllers/import.js:114 -msgid "Could not decrypt file, check your password" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:181 -msgid "Could not delete payment proposal" -msgstr "" - -#: src/js/controllers/cashScan.js:117 -msgid "Could not duplicate" -msgstr "" - -#: src/js/services/feeService.js:73 -msgid "Could not get dynamic fee" -msgstr "" - -#: src/js/services/feeService.js:43 -msgid "Could not get dynamic fee for level: {{feeLevel}}" -msgstr "" - -#: src/js/controllers/modals/feeLevels.js:112 -msgid "Could not get fee levels" -msgstr "" - -#: src/js/controllers/buyAmazon.js:122 -#: src/js/controllers/buyMercadoLibre.js:122 -#: src/js/controllers/topup.js:100 -msgid "Could not get the invoice" -msgstr "" - -#: src/js/controllers/bitpayCard.js:66 -msgid "Could not get transactions" -msgstr "" - -#: src/js/services/profileService.js:615 -#: src/js/services/profileService.js:650 -#: src/js/services/profileService.js:674 -msgid "Could not import" -msgstr "" - -#: src/js/services/profileService.js:584 -msgid "Could not import. Check input file and spending password" -msgstr "" - -#: src/js/services/profileService.js:457 -msgid "Could not join wallet" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:161 -msgid "Could not reject payment" -msgstr "" - -#: src/js/controllers/preferencesBitpayServices.js:33 -msgid "Could not remove account" -msgstr "" - -#: src/js/controllers/preferencesBitpayCard.js:20 -#: src/js/controllers/preferencesBitpayServices.js:50 -msgid "Could not remove card" -msgstr "" - -#: src/js/services/walletService.js:776 -msgid "Could not save preferences on the server" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:147 -msgid "Could not send payment" -msgstr "" - -#: src/js/controllers/buyAmazon.js:325 -#: src/js/controllers/buyMercadoLibre.js:318 -#: src/js/controllers/topup.js:299 -msgid "Could not send transaction" -msgstr "" - -#: www/views/walletDetails.html:210 -msgid "Could not update transaction history" -msgstr "" - -#: src/js/controllers/addresses.js:29 -#: src/js/controllers/addresses.js:37 -#: src/js/controllers/copayers.js:30 -#: src/js/controllers/walletDetails.js:78 -msgid "Could not update wallet" -msgstr "" - -#: www/views/tab-create-personal.html:3 -msgid "Create Personal Wallet" -msgstr "" - -#: www/views/tab-create-shared.html:3 -msgid "Create Shared Wallet" -msgstr "" - -#: www/views/onboarding/tour.html:51 -#: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 -msgid "Create bitcoin wallet" -msgstr "" - -#: www/views/tab-create-personal.html:131 -msgid "Create new wallet" -msgstr "" - -#: www/views/add.html:22 -msgid "Create shared wallet" -msgstr "" - -#: www/views/tab-create-shared.html:160 -msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" -msgstr "" - -#: www/views/modals/txp-details.html:81 -#: www/views/tx-details.html:60 -msgid "Created by" -msgstr "" - -#: src/js/services/onGoingProcess.js:18 -msgid "Creating Wallet..." -msgstr "" - -#: src/js/services/onGoingProcess.js:17 -msgid "Creating transaction" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:34 -#: www/views/preferencesFee.html:20 -msgid "Current fee rate for this policy" -msgstr "" - -#: src/js/services/feeService.js:15 -msgid "Custom" -msgstr "" - -#: www/views/customAmount.html:9 -msgid "Custom Amount" -msgstr "" - -#: src/js/controllers/preferencesFee.js:85 -msgid "Custom Fee" -msgstr "" - -#: www/views/modals/mercadolibre-card-details.html:56 -#: www/views/modals/txp-details.html:87 -#: www/views/tx-details.html:66 -msgid "Date" -msgstr "" - -#: www/views/preferencesDeleteWallet.html:21 -msgid "Delete" -msgstr "" - -#: www/views/modals/txp-details.html:164 -msgid "Delete Payment Proposal" -msgstr "" - -#: www/views/preferencesAdvanced.html:33 -#: www/views/preferencesDeleteWallet.html:3 -msgid "Delete Wallet" -msgstr "" - -#: www/views/copayers.html:59 -msgid "Delete it and create a new one" -msgstr "" - -#: src/js/services/onGoingProcess.js:19 -msgid "Deleting Wallet..." -msgstr "" - -#: src/js/services/onGoingProcess.js:28 -msgid "Deleting payment proposal" -msgstr "" - -#: www/views/join.html:141 -#: www/views/tab-create-personal.html:111 -#: www/views/tab-create-shared.html:140 -#: www/views/tab-import-phrase.html:49 -msgid "Derivation Path" -msgstr "" - -#: www/views/preferencesInformation.html:47 -msgid "Derivation Strategy" -msgstr "" - -#: www/views/buyAmazon.html:39 -#: www/views/buyMercadoLibre.html:38 -#: www/views/modals/mercadolibre-card-details.html:6 -#: www/views/topup.html:45 -msgid "Details" -msgstr "" - -#: src/js/controllers/lockSetup.js:9 -#: src/js/controllers/tab-settings.js:65 -#: www/views/tab-settings.html:50 -msgid "Disabled" -msgstr "" - -#: www/views/includes/backupNeededPopup.html:10 -#: www/views/onboarding/backupRequest.html:12 -msgid "Do it later" -msgstr "" - -#: www/views/tab-export-file.html:29 -msgid "Do not include private key" -msgstr "" - -#: www/views/preferencesLanguage.html:21 -msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." -msgstr "" - -#: www/views/tab-export-file.html:59 -#: www/views/tab-home.html:22 -msgid "Download" -msgstr "" - -#: www/views/cashScan.html:37 -msgid "Duplicate for BCH" -msgstr "" - -#: src/js/services/onGoingProcess.js:49 -msgid "Duplicating wallet..." -msgstr "" - -#: www/views/addresses.html:19 -msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." -msgstr "" - -#: src/js/services/feeService.js:13 -msgid "Economy" -msgstr "" - -#: www/views/onboarding/collectEmail.html:27 -msgid "Edit" -msgstr "" - -#: www/views/addressbook.add.html:29 -#: www/views/addressbook.view.html:22 -msgid "Email" -msgstr "" - -#: www/views/preferencesNotifications.html:42 -msgid "Email Address" -msgstr "" - -#: src/js/services/bwcError.js:122 -msgid "Empty addresses limit reached. New addresses cannot be generated." -msgstr "" - -#: www/views/preferencesCash.html:17 -msgid "Enable Bitcoin Cash wallet creation and operation within the App." -msgstr "" - -#: www/views/tab-scan.html:19 -msgid "Enable camera access in your device settings to get started." -msgstr "" - -#: www/views/preferencesNotifications.html:29 -msgid "Enable email notifications" -msgstr "" - -#: www/views/preferencesNotifications.html:12 -msgid "Enable push notifications" -msgstr "" - -#: www/views/preferencesNotifications.html:33 -msgid "Enable sound" -msgstr "" - -#: www/views/tab-scan.html:18 -msgid "Enable the camera to get started." -msgstr "" - -#: www/views/tab-settings.html:49 -msgid "Enabled" -msgstr "" - -#: src/js/services/walletService.js:1047 -#: src/js/services/walletService.js:1062 -msgid "Enter Spending Password" -msgstr "" - -#: src/js/services/bitpayAccountService.js:110 -msgid "Enter Two Factor for your BitPay account" -msgstr "" - -#: www/views/amount.html:4 -msgid "Enter amount" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:41 -msgid "Enter custom fee" -msgstr "" - -#: src/js/services/walletService.js:1029 -msgid "Enter new spending password" -msgstr "" - -#: www/views/join.html:79 -#: www/views/tab-create-personal.html:51 -#: www/views/tab-create-shared.html:80 -msgid "Enter the recovery phrase (BIP39)" -msgstr "" - -#: www/views/onboarding/collectEmail.html:13 -msgid "Enter your email" -msgstr "" - -#: www/views/backup.html:69 -msgid "Enter your password" -msgstr "" - -#. Trying to import a malformed wallet export QR code -#: src/js/controllers/activity.js:45 -#: src/js/controllers/addressbookAdd.js:30 -#: src/js/controllers/addressbookView.js:42 -#: src/js/controllers/addresses.js:125 -#: src/js/controllers/addresses.js:126 -#: src/js/controllers/bitpayCard.js:66 -#: src/js/controllers/bitpayCardIntro.js:40 -#: src/js/controllers/bitpayCardIntro.js:81 -#: src/js/controllers/buyAmazon.js:24 -#: src/js/controllers/buyAmazon.js:35 -#: src/js/controllers/buyMercadoLibre.js:24 -#: src/js/controllers/buyMercadoLibre.js:35 -#: src/js/controllers/confirm.js:307 -#: src/js/controllers/copayers.js:67 -#: src/js/controllers/create.js:161 -#: src/js/controllers/create.js:174 -#: src/js/controllers/create.js:180 -#: src/js/controllers/create.js:186 -#: src/js/controllers/create.js:208 -#: src/js/controllers/create.js:215 -#: src/js/controllers/create.js:233 -#: src/js/controllers/export.js:109 -#: src/js/controllers/export.js:115 -#: src/js/controllers/export.js:126 -#: src/js/controllers/export.js:154 -#: src/js/controllers/export.js:160 -#: src/js/controllers/export.js:171 -#: src/js/controllers/export.js:47 -#: src/js/controllers/export.js:53 -#: src/js/controllers/feedback/send.js:23 -#: src/js/controllers/import.js:119 -#: src/js/controllers/import.js:131 -#: src/js/controllers/import.js:149 -#: src/js/controllers/import.js:200 -#: src/js/controllers/import.js:229 -#: src/js/controllers/import.js:238 -#: src/js/controllers/import.js:254 -#: src/js/controllers/import.js:266 -#: src/js/controllers/import.js:278 -#: src/js/controllers/import.js:288 -#: src/js/controllers/import.js:312 -#: src/js/controllers/import.js:325 -#: src/js/controllers/import.js:335 -#: src/js/controllers/import.js:345 -#: src/js/controllers/import.js:369 -#: src/js/controllers/import.js:382 -#: src/js/controllers/import.js:85 -#: src/js/controllers/import.js:98 -#: src/js/controllers/join.js:125 -#: src/js/controllers/join.js:139 -#: src/js/controllers/join.js:145 -#: src/js/controllers/join.js:151 -#: src/js/controllers/join.js:174 -#: src/js/controllers/join.js:182 -#: src/js/controllers/join.js:200 -#: src/js/controllers/modals/feeLevels.js:9 -#: src/js/controllers/modals/txpDetails.js:140 -#: src/js/controllers/paperWallet.js:47 -#: src/js/controllers/preferencesBitpayCard.js:20 -#: src/js/controllers/preferencesBitpayServices.js:33 -#: src/js/controllers/preferencesBitpayServices.js:50 -#: src/js/controllers/preferencesDelete.js:36 -#: src/js/controllers/preferencesExternal.js:20 -#: src/js/controllers/tab-home.js:174 -#: src/js/controllers/tab-send.js:143 -#: src/js/controllers/tabsController.js:36 -#: src/js/controllers/tabsController.js:7 -#: src/js/controllers/topup.js:21 -#: src/js/controllers/topup.js:32 -#: src/js/controllers/tx-details.js:119 -#: src/js/services/incomingData.js:101 -#: src/js/services/incomingData.js:125 -#: src/js/services/incomingData.js:168 -#: www/views/mercadoLibreCards.html:19 -#: www/views/modals/mercadolibre-card-details.html:45 -msgid "Error" -msgstr "" - -#: src/js/controllers/confirm.js:502 -msgid "Error at confirm" -msgstr "" - -#: src/js/controllers/buyAmazon.js:179 -msgid "Error creating gift card" -msgstr "" - -#: src/js/controllers/buyAmazon.js:94 -#: src/js/controllers/buyMercadoLibre.js:94 -msgid "Error creating the invoice" -msgstr "" - -#: src/js/services/profileService.js:412 -msgid "Error creating wallet" -msgstr "" - -#: src/js/controllers/confirm.js:296 -msgid "Error getting SendMax information" -msgstr "" - -#: src/js/controllers/buyAmazon.js:136 -#: src/js/controllers/buyMercadoLibre.js:136 -#: src/js/controllers/topup.js:114 -msgid "Error in Payment Protocol" -msgstr "" - -#: src/js/controllers/bitpayCardIntro.js:14 -msgid "Error pairing BitPay Account" -msgstr "" - -#: src/js/controllers/paperWallet.js:41 -msgid "Error scanning funds:" -msgstr "" - -#: src/js/controllers/paperWallet.js:90 -msgid "Error sweeping wallet:" -msgstr "" - -#: src/js/controllers/bitpayCardIntro.js:20 -msgid "Error updating Debit Cards" -msgstr "" - -#: src/js/services/bwcError.js:143 -msgid "Exceeded daily limit of $500 per user" -msgstr "" - -#: src/js/controllers/confirm.js:461 -#: www/views/confirm.html:27 -#: www/views/mercadoLibreCards.html:25 -#: www/views/modals/mercadolibre-card-details.html:34 -#: www/views/modals/txp-details.html:119 -msgid "Expired" -msgstr "" - -#: www/views/modals/paypro.html:54 -#: www/views/modals/txp-details.html:125 -msgid "Expires" -msgstr "" - -#: www/views/preferencesAdvanced.html:21 -msgid "Export Wallet" -msgstr "" - -#: www/views/preferencesHistory.html:11 -#: www/views/preferencesHistory.html:14 -msgid "Export to file" -msgstr "" - -#: www/views/export.html:3 -msgid "Export wallet" -msgstr "" - -#: src/js/services/walletService.js:1174 -#: www/views/tab-export-qrCode.html:9 -msgid "Exporting via QR not supported for this wallet" -msgstr "" - -#: www/views/preferencesInformation.html:89 -msgid "Extended Public Keys" -msgstr "" - -#: src/js/services/onGoingProcess.js:20 -msgid "Extracting Wallet information..." -msgstr "" - -#: src/js/controllers/export.js:115 -#: src/js/controllers/export.js:126 -#: src/js/controllers/export.js:160 -#: src/js/controllers/export.js:171 -#: www/views/tab-export-file.html:4 -msgid "Failed to export" -msgstr "" - -#: www/views/tab-create-personal.html:14 -#: www/views/tab-create-shared.html:14 -msgid "Family vacation funds" -msgstr "" - -#: www/views/tx-details.html:79 -msgid "Fee" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:75 -msgid "Fee level" -msgstr "" - -#: src/js/controllers/modals/feeLevels.js:100 -msgid "Fee level is not defined" -msgstr "" - -#: www/views/confirm.html:79 -#: www/views/modals/txp-details.html:99 -msgid "Fee:" -msgstr "" - -#: src/js/controllers/feedback/send.js:23 -msgid "Feedback could not be submitted. Please try again later." -msgstr "" - -#: src/js/services/onGoingProcess.js:42 -msgid "Fetching BitPay Account..." -msgstr "" - -#: src/js/services/onGoingProcess.js:21 -msgid "Fetching payment information" -msgstr "" - -#: www/views/export.html:14 -#: www/views/import.html:16 -msgid "File/Text" -msgstr "" - -#: www/views/preferencesLogs.html:17 -msgid "Filter setting" -msgstr "" - -#: src/js/services/fingerprintService.js:43 -#: src/js/services/fingerprintService.js:48 -msgid "Finger Scan Failed" -msgstr "" - -#: src/js/controllers/feedback/send.js:34 -#: www/views/feedback/complete.html:7 -msgid "Finish" -msgstr "" - -#: www/views/tab-create-personal.html:123 -#: www/views/tab-create-shared.html:152 -msgid "For audit purposes" -msgstr "" - -#: src/js/controllers/topup.js:308 -#: www/views/buyAmazon.html:29 -#: www/views/buyMercadoLibre.html:28 -#: www/views/confirm.html:65 -#: www/views/modals/txp-details.html:74 -#: www/views/topup.html:34 -#: www/views/tx-details.html:52 -msgid "From" -msgstr "" - -#: src/js/controllers/bitpayCardIntro.js:71 -msgid "From BitPay account" -msgstr "" - -#: www/views/tab-import-phrase.html:57 -msgid "From Hardware Wallet" -msgstr "" - -#: www/views/tab-export-qrCode.html:5 -msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" -msgstr "" - -#: src/js/services/bwcError.js:74 -msgid "Funds are locked by pending spend proposals" -msgstr "" - -#: www/views/paperWallet.html:16 -msgid "Funds found:" -msgstr "" - -#: www/views/topup.html:49 -msgid "Funds to be added" -msgstr "" - -#: www/views/paperWallet.html:51 -msgid "Funds transferred" -msgstr "" - -#: www/views/topup.html:103 -msgid "Funds were added to debit card" -msgstr "" - -#: www/views/paperWallet.html:22 -msgid "Funds will be transferred to" -msgstr "" - -#: www/views/tab-receive.html:51 -msgid "Generate new address" -msgstr "" - -#: src/js/services/onGoingProcess.js:22 -msgid "Generating .csv file..." -msgstr "" - -#: src/js/services/onGoingProcess.js:37 -msgid "Generating new address..." -msgstr "" - -#: www/views/bitpayCardIntro.html:23 -msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." -msgstr "" - -#: www/views/onboarding/collectEmail.html:15 -msgid "Get news and updates from BitPay" -msgstr "" - -#: www/views/onboarding/welcome.html:8 -msgctxt "button" -msgid "Get started" -msgstr "" - -#: www/views/bitpayCard.html:49 -msgid "Get started" -msgstr "" - -#: www/views/addressbook.html:20 -msgid "Get started by adding your first one." -msgstr "" - -#: src/js/services/onGoingProcess.js:23 -msgid "Getting fee levels..." -msgstr "" - -#: www/views/buyAmazon.html:43 -#: www/views/buyMercadoLibre.html:42 -msgid "Gift Card" -msgstr "" - -#: www/views/modals/mercadolibre-card-details.html:30 -#: www/views/modals/mercadolibre-card-details.html:35 -msgid "Gift Card is not available to use anymore" -msgstr "" - -#: src/js/controllers/buyAmazon.js:204 -msgid "Gift card expired" -msgstr "" - -#: www/views/buyAmazon.html:111 -msgid "Gift card generated and ready to use." -msgstr "" - -#: src/js/controllers/bitpayCard.js:114 -#: src/js/controllers/bitpayCard.js:124 -#: src/js/controllers/cashScan.js:20 -#: src/js/controllers/onboarding/terms.js:23 -#: src/js/controllers/preferences.js:67 -#: src/js/controllers/preferencesAbout.js:16 -#: src/js/controllers/preferencesCash.js:34 -#: src/js/controllers/preferencesLanguage.js:14 -#: src/js/controllers/tab-home.js:149 -#: src/js/controllers/tab-settings.js:53 -#: src/js/controllers/tx-details.js:193 -#: src/js/controllers/tx-details.js:56 -msgid "Go Back" -msgstr "" - -#: src/js/controllers/confirm.js:131 -#: src/js/controllers/onboarding/backupRequest.js:20 -#: src/js/controllers/onboarding/backupRequest.js:26 -#: src/js/services/bitpayAccountService.js:84 -msgid "Go back" -msgstr "" - -#: www/views/backupWarning.html:15 -#: www/views/includes/confirmBackupPopup.html:8 -#: www/views/onboarding/tour.html:23 -msgid "Got it" -msgstr "" - -#: www/views/preferencesInformation.html:53 -#: www/views/preferencesInformation.html:59 -msgid "Hardware Wallet" -msgstr "" - -#: www/views/preferencesExternal.html:18 -msgid "Hardware not connected." -msgstr "" - -#: www/views/import.html:20 -msgid "Hardware wallet" -msgstr "" - -#: src/js/controllers/create.js:180 -#: src/js/controllers/join.js:145 -msgid "Hardware wallets are not yet supported with Bitcoin Cash" -msgstr "" - -#: www/views/tab-settings.html:20 -msgid "Help & Support" -msgstr "" - -#: src/js/controllers/bitpayCard.js:112 -#: src/js/controllers/tab-settings.js:51 -msgid "Help and support information is available at the website." -msgstr "" - -#: www/views/addresses.html:25 -msgid "Hide" -msgstr "" - -#: www/views/preferences.html:27 -msgid "Hide Balance" -msgstr "" - -#: www/views/advancedSettings.html:30 -msgid "Hide Next Steps Card" -msgstr "" - -#: www/views/join.html:49 -#: www/views/tab-create-personal.html:28 -#: www/views/tab-create-shared.html:57 -#: www/views/tab-export-file.html:25 -#: www/views/tab-import-file.html:30 -#: www/views/tab-import-hardware.html:31 -#: www/views/tab-import-phrase.html:36 -msgid "Hide advanced options" -msgstr "" - -#: www/views/tabs.html:3 -msgid "Home" -msgstr "" - -#: src/js/controllers/feedback/send.js:61 -#: src/js/controllers/feedback/send.js:65 -#: src/js/controllers/feedback/send.js:69 -msgid "How could we improve your experience?" -msgstr "" - -#: www/views/feedback/rateCard.html:3 -msgid "How do you like {{appName}}?" -msgstr "" - -#: src/js/controllers/feedback/rateCard.js:29 -msgid "I don't like it" -msgstr "" - -#: www/views/onboarding/disclaimer.html:43 -msgid "I have read, understood, and agree to the Terms of Use." -msgstr "" - -#: www/views/modals/terms.html:22 -msgid "I have read, understood, and agree with the Terms of use." -msgstr "" - -#: www/views/join.html:137 -#: www/views/tab-create-personal.html:107 -#: www/views/tab-create-shared.html:136 -msgid "I have written it down" -msgstr "" - -#: src/js/controllers/feedback/rateCard.js:35 -msgid "I like the app" -msgstr "" - -#: src/js/controllers/feedback/rateCard.js:26 -msgid "I think this app is terrible." -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:19 -#: www/views/includes/screenshotWarningModal.html:9 -msgid "I understand" -msgstr "" - -#: www/views/onboarding/disclaimer.html:21 -msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." -msgstr "" - -#: www/views/onboarding/disclaimer.html:18 -msgid "I understand that my funds are held securely on this device, not by a company." -msgstr "" - -#: www/views/backup.html:36 -msgid "I've written it down" -msgstr "" - -#: www/views/preferences.html:45 -msgid "If enabled, all sensitive information (private key and recovery phrase) and actions (spending and exporting) associated with this wallet will be protected." -msgstr "" - -#: www/views/advancedSettings.html:23 -msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." -msgstr "" - -#: www/views/advancedSettings.html:14 -msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:18 -msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." -msgstr "" - -#: www/views/feedback/complete.html:23 -msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." -msgstr "" - -#: www/views/includes/screenshotWarningModal.html:8 -msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." -msgstr "" - -#: www/views/tab-import-hardware.html:42 -#: www/views/tab-import-phrase.html:80 -msgid "Import" -msgstr "" - -#: www/views/import.html:3 -msgid "Import Wallet" -msgstr "" - -#: www/views/tab-import-file.html:41 -msgid "Import backup" -msgstr "" - -#: www/views/add.html:38 -msgid "Import wallet" -msgstr "" - -#: src/js/services/onGoingProcess.js:24 -msgid "Importing Wallet..." -msgstr "" - -#: www/views/backup.html:72 -msgid "In order to verify your wallet backup, please type your password." -msgstr "" - -#: www/views/mercadoLibreCards.html:24 -#: www/views/modals/mercadolibre-card-details.html:29 -msgid "Inactive" -msgstr "" - -#: www/views/includes/walletItem.html:9 -#: www/views/includes/walletList.html:6 -#: www/views/includes/walletListSettings.html:9 -#: www/views/includes/walletSelector.html:16 -msgid "Incomplete" -msgstr "" - -#: www/views/tab-receive.html:22 -msgid "Incomplete wallet" -msgstr "" - -#: www/views/modals/pin.html:12 -msgid "Incorrect PIN, try again." -msgstr "" - -#. Trying to import a malformed wallet export QR code -#: src/js/controllers/import.js:85 -msgid "Incorrect code format" -msgstr "" - -#: src/js/services/bwcError.js:113 -msgid "Incorrect network address" -msgstr "" - -#: src/js/controllers/confirm.js:114 -#: src/js/controllers/confirm.js:306 -#: src/js/services/bwcError.js:44 -msgid "Insufficient confirmed funds" -msgstr "" - -#: src/js/controllers/topup.js:165 -#: src/js/controllers/topup.js:177 -#: src/js/services/bwcError.js:71 -msgid "Insufficient funds for fee" -msgstr "" - -#: www/views/tab-settings.html:123 -msgid "Integrations" -msgstr "" - -#: www/views/includes/walletHistory.html:49 -msgid "Invalid" -msgstr "" - -#: src/js/controllers/buyAmazon.js:137 -#: src/js/controllers/buyMercadoLibre.js:137 -#: src/js/controllers/topup.js:115 -msgid "Invalid URL" -msgstr "" - -#: src/js/controllers/create.js:186 -#: src/js/controllers/import.js:345 -#: src/js/controllers/join.js:151 -msgid "Invalid account number" -msgstr "" - -#: src/js/services/bwcError.js:119 -msgid "Invalid address" -msgstr "" - -#: src/js/controllers/tabsController.js:7 -msgid "Invalid data" -msgstr "" - -#: src/js/controllers/create.js:161 -#: src/js/controllers/import.js:266 -#: src/js/controllers/join.js:125 -msgid "Invalid derivation path" -msgstr "" - -#: src/js/controllers/copayers.js:90 -msgid "Invitation to share a {{appName}} Wallet" -msgstr "" - -#: www/views/mercadoLibreCards.html:20 -#: www/views/modals/mercadolibre-card-details.html:48 -msgid "Invoice expired" -msgstr "" - -#: src/js/controllers/feedback/send.js:79 -msgid "Is there anything we could do better?" -msgstr "" - -#: www/views/backup.html:54 -msgid "Is this correct?" -msgstr "" - -#: www/views/onboarding/collectEmail.html:22 -msgid "Is this email address correct?" -msgstr "" - -#: www/views/addresses.html:25 -msgid "It's a good idea to avoid reusing addresses - this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." -msgstr "" - -#: src/js/controllers/backup.js:76 -msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." -msgstr "" - -#: www/views/join.html:151 -msgid "Join" -msgstr "" - -#: src/js/controllers/copayers.js:85 -msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" -msgstr "" - -#: www/views/add.html:30 -#: www/views/join.html:5 -msgid "Join shared wallet" -msgstr "" - -#: src/js/services/onGoingProcess.js:25 -msgid "Joining Wallet..." -msgstr "" - -#: www/views/onboarding/tour.html:22 -msgid "Just scan the code to pay." -msgstr "" - -#: src/js/services/bwcError.js:116 -msgid "Key already associated with an existing wallet" -msgstr "" - -#: www/views/preferencesLanguage.html:4 -#: www/views/tab-settings.html:68 -msgid "Language" -msgstr "" - -#: www/views/bitpayCard.html:61 -msgid "Last Month" -msgstr "" - -#: src/js/controllers/confirm.js:132 -#: www/views/preferences.html:48 -#: www/views/preferencesCash.html:18 -#: www/views/tx-details.html:94 -msgid "Learn more" -msgstr "" - -#: www/views/backup.html:43 -msgid "Let's verify your backup phrase." -msgstr "" - -#: www/views/addresses.html:45 -#: www/views/allAddresses.html:14 -msgid "Loading addresses..." -msgstr "" - -#: src/js/services/onGoingProcess.js:35 -msgid "Loading transaction info..." -msgstr "" - -#: www/views/tab-settings.html:100 -msgid "Lock App" -msgstr "" - -#: src/js/controllers/lockSetup.js:23 -msgid "Lock by Fingerprint" -msgstr "" - -#: src/js/controllers/lockSetup.js:14 -msgid "Lock by PIN" -msgstr "" - -#: www/views/modals/wallet-balance.html:80 -msgid "Locked" -msgstr "" - -#: src/js/services/bwcError.js:86 -msgid "Locktime in effect. Please wait to create a new spend proposal" -msgstr "" - -#: src/js/services/bwcError.js:89 -msgid "Locktime in effect. Please wait to remove this spend proposal" -msgstr "" - -#: www/views/includes/logOptions.html:3 -msgid "Log options" -msgstr "" - -#: www/views/modals/bitpay-card-confirmation.html:14 -msgid "Log out" -msgstr "" - -#: www/views/addresses.html:87 -msgid "Low amount inputs" -msgstr "" - -#: www/views/includes/walletHistory.html:27 -msgid "Low fees" -msgstr "" - -#: www/views/onboarding/tour.html:38 -msgid "Makes sense" -msgstr "" - -#: src/js/controllers/modals/search.js:61 -msgid "Matches:" -msgstr "" - -#: www/views/includes/copayers.html:4 -#: www/views/preferencesInformation.html:85 -msgid "Me" -msgstr "" - -#: src/js/controllers/feedback/rateCard.js:32 -msgid "Meh - it's alright" -msgstr "" - -#: src/js/controllers/tx-details.js:165 -#: www/views/modals/paypro.html:48 -#: www/views/modals/txp-details.html:93 -#: www/views/tx-details.html:72 -msgid "Memo" -msgstr "" - -#: www/views/mercadoLibre.html:6 -msgid "Mercado Livre Brazil Gift Cards" -msgstr "" - -#: src/js/controllers/buyMercadoLibre.js:98 -msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later." -msgstr "" - -#: www/views/modals/txp-details.html:131 -msgid "Merchant Message" -msgstr "" - -#: www/views/buyAmazon.html:55 -#: www/views/buyMercadoLibre.html:54 -#: www/views/topup.html:63 -msgid "Miner Fee" -msgstr "" - -#: src/js/services/bwcError.js:134 -msgid "Missing parameter" -msgstr "" - -#: src/js/services/bwcError.js:32 -msgid "Missing private keys to sign" -msgstr "" - -#: www/views/preferences.html:61 -#: www/views/preferencesAdvanced.html:3 -msgid "More Options" -msgstr "" - -#: www/views/includes/walletHistory.html:47 -#: www/views/tx-details.html:19 -msgid "Moved" -msgstr "" - -#: src/js/controllers/tx-details.js:131 -msgid "Moved Funds" -msgstr "" - -#: www/views/modals/txp-details.html:57 -msgid "Multiple recipients" -msgstr "" - -#: www/views/tab-import-phrase.html:8 -msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." -msgstr "" - -#: www/views/addressbook.add.html:21 -#: www/views/addressbook.view.html:18 -#: www/views/preferences.html:15 -#: www/views/preferencesAlias.html:17 -msgid "Name" -msgstr "" - -#: www/views/buyAmazon.html:49 -#: www/views/buyMercadoLibre.html:48 -#: www/views/topup.html:56 -msgid "Network Cost" -msgstr "" - -#: src/js/services/bwcError.js:47 -msgid "Network error" -msgstr "" - -#: www/views/includes/walletActivity.html:43 -msgid "New Proposal" -msgstr "" - -#: src/js/controllers/addresses.js:126 -msgid "New address could not be generated. Please try again." -msgstr "" - -#: www/views/add.html:14 -msgid "New personal wallet" -msgstr "" - -#: www/views/includes/nextSteps.html:3 -msgid "Next steps" -msgstr "" - -#: www/views/tab-receive.html:16 -msgid "No Wallet" -msgstr "" - -#: src/js/controllers/buyAmazon.js:115 -#: src/js/controllers/buyMercadoLibre.js:115 -msgid "No access key defined" -msgstr "" - -#: www/views/onboarding/backupRequest.html:5 -msgid "No backup, no bitcoin." -msgstr "" - -#: www/views/addressbook.html:19 -msgid "No contacts yet" -msgstr "" - -#: www/views/preferencesLogs.html:16 -msgid "No entries for this log level" -msgstr "" - -#: www/views/preferencesExternal.html:12 -msgid "No hardware information available." -msgstr "" - -#: www/views/tab-import-hardware.html:3 -msgid "No hardware wallets supported on this device" -msgstr "" - -#: www/views/proposals.html:24 -msgid "No pending proposals" -msgstr "" - -#: www/views/activity.html:25 -msgid "No recent transactions" -msgstr "" - -#: src/js/controllers/buyAmazon.js:44 -#: src/js/controllers/topup.js:47 -msgid "No signing proposal: No private key" -msgstr "" - -#: www/views/walletDetails.html:204 -msgid "No transactions yet" -msgstr "" - -#: src/js/controllers/preferencesDelete.js:15 -msgid "No wallet found" -msgstr "" - -#: src/js/controllers/preferencesDelete.js:8 -msgid "No wallet selected" -msgstr "" - -#: src/js/controllers/buyAmazon.js:300 -#: src/js/controllers/buyMercadoLibre.js:292 -#: src/js/controllers/confirm.js:85 -#: src/js/controllers/topup.js:265 -msgid "No wallets available" -msgstr "" - -#: www/views/paperWallet.html:45 -msgid "No wallets available to receive funds" -msgstr "" - -#: www/views/cashScan.html:15 -msgid "No wallets eligible for Bitcoin Cash support" -msgstr "" - -#: src/js/controllers/cashScan.js:58 -msgid "Non BIP44 wallet" -msgstr "" - -#: www/views/cashScan.html:46 -msgid "Non eligible BTC wallets" -msgstr "" - -#: src/js/services/feeService.js:12 -msgid "Normal" -msgstr "" - -#: src/js/services/bwcError.js:80 -msgid "Not authorized" -msgstr "" - -#: src/js/controllers/confirm.js:307 -msgid "Not enough funds for fee" -msgstr "" - -#: www/views/onboarding/tour.html:50 -msgid "Not even BitPay can access it." -msgstr "" - -#: src/js/controllers/paperWallet.js:47 -msgid "Not funds found" -msgstr "" - -#: www/views/feedback/rateApp.html:3 -#: www/views/onboarding/notifications.html:8 -msgid "Not now" -msgstr "" - -#: www/views/includes/output.html:15 -msgid "Note" -msgstr "" - -#: www/views/backup.html:19 -msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase." -msgstr "" - -#: www/views/modals/wallets.html:25 -msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" -msgstr "" - -#: www/views/preferencesNotifications.html:3 -#: www/views/tab-settings.html:61 -msgid "Notifications" -msgstr "" - -#: www/views/onboarding/collectEmail.html:9 -msgid "Notifications by email" -msgstr "" - -#: www/views/tx-details.html:117 -msgid "Notify me if confirmed" -msgstr "" - -#: www/views/preferencesNotifications.html:24 -msgid "Notify me when transactions are confirmed" -msgstr "" - -#: www/views/includes/backupNeededPopup.html:8 -msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." -msgstr "" - -#: www/views/backupWarning.html:11 -msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" -msgstr "" - -#: src/js/controllers/buyAmazon.js:312 -#: src/js/controllers/topup.js:286 -#: src/js/services/incomingData.js:153 -#: src/js/services/popupService.js:16 -#: src/js/services/popupService.js:52 -#: src/js/services/popupService.js:61 -#: src/js/services/popupService.js:72 -#: www/views/modals/chooseFeeLevel.html:6 -msgid "OK" -msgstr "" - -#: www/views/modals/tx-status.html:12 -#: www/views/modals/tx-status.html:24 -#: www/views/modals/tx-status.html:36 -#: www/views/modals/tx-status.html:46 -msgid "OKAY" -msgstr "" - -#: www/views/modals/terms.html:15 -msgid "Official English Disclaimer" -msgstr "" - -#: src/js/controllers/feedback/send.js:64 -msgid "Oh no!" -msgstr "" - -#: src/js/controllers/buyMercadoLibre.js:306 -msgid "Ok" -msgstr "" - -#: www/views/tab-home.html:39 -msgid "On this screen you can see all your wallets, accounts, and assets." -msgstr "" - -#: src/js/controllers/bitpayCard.js:113 -#: src/js/controllers/cashScan.js:19 -#: src/js/controllers/preferences.js:66 -#: src/js/controllers/preferencesCash.js:33 -#: src/js/controllers/tab-settings.js:52 -#: src/js/controllers/tx-details.js:55 -msgid "Open" -msgstr "" - -#: src/js/controllers/preferencesLanguage.js:13 -msgid "Open Crowdin" -msgstr "" - -#: src/js/controllers/preferencesAbout.js:15 -msgid "Open GitHub" -msgstr "" - -#: src/js/controllers/preferencesAbout.js:13 -msgid "Open GitHub Project" -msgstr "" - -#: src/js/controllers/bitpayCard.js:123 -#: src/js/controllers/tx-details.js:192 -msgid "Open Explorer" -msgstr "" - -#: www/views/tab-scan.html:22 -msgid "Open Settings" -msgstr "" - -#: src/js/controllers/preferencesLanguage.js:11 -msgid "Open Translation Community" -msgstr "" - -#: src/js/controllers/onboarding/terms.js:22 -msgid "Open Website" -msgstr "" - -#: src/js/controllers/preferencesCash.js:32 -msgid "Open bitcoincash.org?" -msgstr "" - -#: src/js/controllers/cashScan.js:18 -msgid "Open the recovery tool." -msgstr "" - -#: www/views/tab-receive.html:27 -msgid "Open wallet" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:19 -msgid "Open website" -msgstr "" - -#: www/views/bitpayCardIntro.html:34 -msgid "Order the BitPay Card" -msgstr "" - -#: www/views/join.html:105 -#: www/views/join.html:96 -#: www/views/tab-create-personal.html:69 -#: www/views/tab-create-personal.html:77 -#: www/views/tab-create-shared.html:106 -#: www/views/tab-create-shared.html:98 -#: www/views/tab-import-file.html:18 -#: www/views/tab-import-phrase.html:41 -msgid "Password" -msgstr "" - -#: src/js/controllers/import.js:98 -msgid "Password required. Make sure to enter your password in advanced options" -msgstr "" - -#: www/views/join.html:33 -msgid "Paste invitation here" -msgstr "" - -#: www/views/tab-import-file.html:13 -msgid "Paste the backup plain text code" -msgstr "" - -#: www/views/bitpayCardIntro.html:28 -msgid "Pay 0% fees to turn bitcoin into dollars." -msgstr "" - -#: www/views/modals/paypro.html:18 -msgid "Pay To" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:51 -#: www/views/modals/tx-status.html:33 -msgid "Payment Accepted" -msgstr "" - -#: www/views/confirm.html:25 -msgid "Payment Expires:" -msgstr "" - -#: www/views/modals/txp-details.html:6 -msgid "Payment Proposal" -msgstr "" - -#: www/views/modals/tx-status.html:21 -msgid "Payment Proposal Created" -msgstr "" - -#: www/views/tab-home.html:46 -msgid "Payment Proposals" -msgstr "" - -#: src/js/services/payproService.js:32 -msgid "Payment Protocol Invalid" -msgstr "" - -#: src/js/services/payproService.js:18 -msgid "Payment Protocol not supported on Chrome App" -msgstr "" - -#: www/views/includes/walletActivity.html:20 -msgid "Payment Received" -msgstr "" - -#: www/views/modals/tx-status.html:43 -#: www/views/modals/txp-details.html:43 -msgid "Payment Rejected" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:44 -#: www/views/confirm.html:124 -#: www/views/includes/walletActivity.html:11 -#: www/views/modals/txp-details.html:42 -msgid "Payment Sent" -msgstr "" - -#: www/views/modals/txp-details.html:32 -msgid "Payment accepted, but not yet broadcasted" -msgstr "" - -#: www/views/modals/txp-details.html:40 -msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." -msgstr "" - -#: src/js/services/incomingData.js:152 -msgid "Payment address was translated to new Bitcoin Cash address format:" -msgstr "" - -#: www/views/modals/txp-details.html:107 -msgid "Payment details" -msgstr "" - -#: www/views/modals/paypro.html:6 -msgid "Payment request" -msgstr "" - -#: www/views/mercadoLibreCards.html:22 -#: www/views/modals/mercadolibre-card-details.html:39 -msgid "Pending" -msgstr "" - -#: www/views/proposals.html:4 -msgid "Pending Proposals" -msgstr "" - -#: www/views/preferencesDeleteWallet.html:13 -msgid "Permanently delete this wallet." -msgstr "" - -#: src/js/services/profileService.js:403 -msgid "Personal Wallet" -msgstr "" - -#: www/views/backup.html:25 -msgid "Please carefully write down this phrase." -msgstr "" - -#: www/views/tab-scan.html:20 -msgid "Please connect a camera to get started." -msgstr "" - -#: src/js/controllers/import.js:278 -msgid "Please enter the recovery phrase" -msgstr "" - -#: src/js/controllers/create.js:174 -#: src/js/controllers/join.js:139 -msgid "Please enter the wallet recovery phrase" -msgstr "" - -#: www/views/modals/pin.html:9 -msgid "Please enter your PIN" -msgstr "" - -#: www/views/backup.html:53 -msgid "Please tap each word in the correct order." -msgstr "" - -#: src/js/services/bwcError.js:101 -msgid "Please upgrade Copay to perform this action" -msgstr "" - -#: www/views/walletDetails.html:142 -#: www/views/walletDetails.html:62 -msgid "Please wait" -msgstr "" - -#: src/js/controllers/import.js:238 -msgid "Please, select your backup file" -msgstr "" - -#: www/views/bitpayCard.html:81 -msgid "Pre-Auth Holds" -msgstr "" - -#: www/views/tab-settings.html:40 -msgid "Preferences" -msgstr "" - -#: src/js/services/onGoingProcess.js:38 -msgid "Preparing addresses..." -msgstr "" - -#: src/js/controllers/export.js:198 -msgid "Preparing backup..." -msgstr "" - -#: src/js/routes.js:1264 -msgid "Press again to exit" -msgstr "" - -#: src/js/services/feeService.js:11 -msgid "Priority" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:80 -msgid "Private Key" -msgstr "" - -#: src/js/controllers/paperWallet.js:136 -msgid "Private key encrypted. Enter password" -msgstr "" - -#: src/js/services/bwcError.js:35 -msgid "Private key is encrypted, cannot sign" -msgstr "" - -#: www/views/includes/walletActivity.html:51 -msgid "Proposal Accepted" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:61 -#: src/js/controllers/tx-details.js:78 -#: www/views/confirm.html:125 -msgid "Proposal Created" -msgstr "" - -#: www/views/includes/walletActivity.html:27 -msgid "Proposal Deleted" -msgstr "" - -#: www/views/includes/walletActivity.html:35 -msgid "Proposal Rejected" -msgstr "" - -#: www/views/walletDetails.html:189 -msgid "Proposals" -msgstr "" - -#: src/js/controllers/buyAmazon.js:282 -msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" -msgstr "" - -#: src/js/controllers/buyMercadoLibre.js:281 -msgid "Purchase amount must be a value between 50 and 2000" -msgstr "" - -#: www/views/onboarding/notifications.html:3 -msgid "Push Notifications" -msgstr "" - -#: www/views/preferencesNotifications.html:17 -msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." -msgstr "" - -#: www/views/export.html:17 -msgid "QR Code" -msgstr "" - -#: www/views/onboarding/disclaimer.html:13 -msgid "Quick review!" -msgstr "" - -#: src/js/controllers/create.js:84 -#: src/js/controllers/join.js:68 -msgid "Random" -msgstr "" - -#: www/views/feedback/rateApp.html:14 -msgid "Rate on the app store" -msgstr "" - -#: www/views/addresses.html:52 -msgid "Read less" -msgstr "" - -#: www/views/addresses.html:51 -msgid "Read more" -msgstr "" - -#: src/js/controllers/preferences.js:65 -#: src/js/controllers/tx-details.js:54 -msgid "Read more in our Wiki" -msgstr "" - -#: src/js/controllers/cashScan.js:61 -msgid "Read only wallet" -msgstr "" - -#: www/views/tab-receive.html:3 -#: www/views/tabs.html:7 -msgid "Receive" -msgstr "" - -#: www/views/customAmount.html:44 -msgid "Receive in" -msgstr "" - -#: www/views/includes/walletHistory.html:24 -#: www/views/tx-details.html:18 -msgid "Received" -msgstr "" - -#: src/js/controllers/tx-details.js:130 -msgid "Received Funds" -msgstr "" - -#: www/views/includes/walletHistory.html:57 -#: www/views/tx-details.html:24 -msgid "Receiving" -msgstr "" - -#: www/views/bitpayCard.html:60 -#: www/views/includes/walletHistory.html:3 -msgid "Recent" -msgstr "" - -#: www/views/advancedSettings.html:21 -msgid "Recent Transaction Card" -msgstr "" - -#: www/views/activity.html:4 -#: www/views/tab-home.html:58 -msgid "Recent Transactions" -msgstr "" - -#: www/views/amount.html:18 -#: www/views/tab-send.html:9 -msgid "Recipient" -msgstr "" - -#: www/views/modals/txp-details.html:62 -msgid "Recipients" -msgstr "" - -#: www/views/import.html:12 -msgid "Recovery phrase" -msgstr "" - -#: src/js/services/onGoingProcess.js:26 -msgid "Recreating Wallet..." -msgstr "" - -#: www/views/modals/mercadolibre-card-details.html:22 -msgid "Redeem now" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js:63 -#: src/js/controllers/tx-details.js:80 -msgid "Rejected" -msgstr "" - -#: src/js/services/onGoingProcess.js:27 -msgid "Rejecting payment proposal" -msgstr "" - -#: www/views/preferencesAbout.html:9 -msgid "Release information" -msgstr "" - -#: www/views/addressbook.view.html:36 -#: www/views/modals/mercadolibre-card-details.html:69 -msgid "Remove" -msgstr "" - -#: src/js/controllers/preferencesBitpayServices.js:7 -msgid "Remove BitPay Account?" -msgstr "" - -#: src/js/controllers/preferencesBitpayServices.js:19 -msgid "Remove BitPay Card?" -msgstr "" - -#: src/js/controllers/preferencesBitpayServices.js:8 -msgid "Removing your BitPay account will remove all associated BitPay account data from this device. Are you sure you would like to remove your BitPay Account ({{email}}) from this device?" -msgstr "" - -#: www/views/join.html:116 -#: www/views/join.html:124 -#: www/views/tab-create-personal.html:86 -#: www/views/tab-create-personal.html:94 -#: www/views/tab-create-shared.html:115 -#: www/views/tab-create-shared.html:123 -#: www/views/tab-export-file.html:17 -msgid "Repeat password" -msgstr "" - -#: www/views/tab-export-file.html:16 -msgid "Repeat the password" -msgstr "" - -#: www/views/preferences.html:56 -msgid "Request Fingerprint" -msgstr "" - -#: www/views/tab-receive.html:45 -msgid "Request Specific amount" -msgstr "" - -#: www/views/preferences.html:42 -msgid "Request Spending Password" -msgstr "" - -#: www/views/tab-create-shared.html:44 -msgid "Required number of signatures" -msgstr "" - -#: www/views/onboarding/welcome.html:9 -msgid "Restore from backup" -msgstr "" - -#: src/js/services/onGoingProcess.js:29 -msgid "Retrieving inputs information" -msgstr "" - -#: src/js/controllers/onboarding/tour.js:56 -msgid "Retry" -msgstr "" - -#: www/views/tab-scan.html:23 -msgid "Retry Camera" -msgstr "" - -#: www/views/addressbook.add.html:56 -#: www/views/includes/note.html:9 -#: www/views/preferencesAlias.html:21 -#: www/views/preferencesBwsUrl.html:25 -#: www/views/preferencesNotifications.html:46 -msgid "Save" -msgstr "" - -#: www/views/tab-scan.html:3 -#: www/views/tabs.html:11 -msgid "Scan" -msgstr "" - -#: www/views/tab-scan.html:15 -msgid "Scan QR Codes" -msgstr "" - -#: www/views/addresses.html:31 -msgid "Scan addresses for funds" -msgstr "" - -#: www/views/modals/fingerprintCheck.html:11 -msgid "Scan again" -msgstr "" - -#: src/js/services/fingerprintService.js:56 -msgid "Scan your fingerprint please" -msgstr "" - -#: www/views/preferencesCash.html:23 -msgid "Scan your wallets for Bitcoin Cash" -msgstr "" - -#: src/js/services/onGoingProcess.js:30 -msgid "Scanning Wallet funds..." -msgstr "" - -#: www/views/includes/walletList.html:11 -msgid "Scanning funds..." -msgstr "" - -#: www/views/includes/screenshotWarningModal.html:7 -msgid "Screenshots are not secure" -msgstr "" - -#: www/views/modals/search.html:6 -msgid "Search Transactions" -msgstr "" - -#: www/views/tab-send.html:13 -msgid "Search or enter bitcoin address" -msgstr "" - -#: www/views/modals/search.html:16 -msgid "Search transactions" -msgstr "" - -#: www/views/preferencesAltCurrency.html:14 -msgid "Search your currency" -msgstr "" - -#: www/views/preferences.html:30 -msgid "Security" -msgstr "" - -#: www/views/modals/mercadolibre-card-details.html:64 -msgid "See invoice" -msgstr "" - -#: www/views/tab-import-file.html:7 -msgid "Select a backup file" -msgstr "" - -#: src/js/controllers/tab-receive.js:139 -msgid "Select a wallet" -msgstr "" - -#: www/views/modals/paypro.html:38 -msgid "Self-signed Certificate" -msgstr "" - -#: src/js/services/onGoingProcess.js:41 -msgid "Selling Bitcoin..." -msgstr "" - -#: www/views/feedback/send.html:13 -#: www/views/feedback/send.html:43 -#: www/views/tab-send.html:3 -#: www/views/tabs.html:15 -msgid "Send" -msgstr "" - -#: www/views/feedback/send.html:3 -#: www/views/tab-settings.html:29 -msgid "Send Feedback" -msgstr "" - -#: www/views/addressbook.view.html:31 -msgid "Send Money" -msgstr "" - -#: www/views/allAddresses.html:19 -msgid "Send addresses by email" -msgstr "" - -#: www/views/includes/logOptions.html:17 -#: www/views/tab-export-file.html:82 -msgid "Send by email" -msgstr "" - -#: src/js/controllers/confirm.js:177 -msgid "Send from" -msgstr "" - -#: www/views/includes/itemSelector.html:8 -msgid "Send max amount" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:46 -msgid "Send payment to this address" -msgstr "" - -#: www/views/feedback/rateApp.html:17 -msgid "Send us feedback instead" -msgstr "" - -#: www/views/confirm.html:15 -#: www/views/includes/txp.html:12 -#: www/views/modals/txp-details.html:19 -#: www/views/tx-details.html:23 -msgid "Sending" -msgstr "" - -#: src/js/services/onGoingProcess.js:39 -msgid "Sending 2FA code..." -msgstr "" - -#: src/js/services/onGoingProcess.js:36 -msgid "Sending feedback..." -msgstr "" - -#: www/views/confirm.html:16 -msgid "Sending maximum amount" -msgstr "" - -#: src/js/services/onGoingProcess.js:31 -msgid "Sending transaction" -msgstr "" - -#: src/js/controllers/confirm.js:545 -msgid "Sending {{amountStr}} from your {{name}} wallet" -msgstr "" - -#: www/views/includes/walletHistory.html:42 -#: www/views/modals/tx-status.html:9 -#: www/views/topup.html:100 -#: www/views/tx-details.html:17 -msgid "Sent" -msgstr "" - -#: src/js/controllers/tx-details.js:129 -msgid "Sent Funds" -msgstr "" - -#: src/js/services/bwcError.js:38 -msgid "Server response could not be verified" -msgstr "" - -#: src/js/controllers/buyAmazon.js:97 -#: src/js/controllers/buyMercadoLibre.js:97 -msgid "Service not available" -msgstr "" - -#: www/views/includes/homeIntegrations.html:3 -msgid "Services" -msgstr "" - -#: www/views/preferencesLogs.html:3 -msgid "Session Log" -msgstr "" - -#: www/views/preferencesAbout.html:35 -msgid "Session log" -msgstr "" - -#: www/views/tab-export-file.html:10 -msgid "Set up a password" -msgstr "" - -#: src/js/controllers/preferencesFee.js:85 -msgid "Set your own fee in satoshis/byte" -msgstr "" - -#: www/views/tab-settings.html:3 -#: www/views/tabs.html:19 -msgid "Settings" -msgstr "" - -#: www/views/feedback/complete.html:17 -#: www/views/feedback/complete.html:26 -msgid "Share the love by inviting your friends." -msgstr "" - -#: www/views/copayers.html:20 -msgid "Share this invitation with your copayers" -msgstr "" - -#: src/js/controllers/feedback/complete.js:5 -#: www/views/tab-settings.html:36 -msgid "Share {{appName}}" -msgstr "" - -#: www/views/tab-import-hardware.html:24 -msgid "Shared Wallet" -msgstr "" - -#: www/views/preferencesExternal.html:34 -msgid "Show Recovery Phrase" -msgstr "" - -#: www/views/tab-receive.html:34 -msgid "Show address" -msgstr "" - -#: www/views/join.html:48 -#: www/views/tab-create-personal.html:27 -#: www/views/tab-create-shared.html:56 -#: www/views/tab-export-file.html:24 -#: www/views/tab-import-file.html:29 -#: www/views/tab-import-hardware.html:30 -#: www/views/tab-import-phrase.html:35 -msgid "Show advanced options" -msgstr "" - -#: www/views/tab-send.html:37 -msgid "Show bitcoin address" -msgstr "" - -#: www/views/tab-send.html:59 -msgid "Show more" -msgstr "" - -#: src/js/services/bwcError.js:104 -msgid "Signatures rejected by server" -msgstr "" - -#: src/js/services/onGoingProcess.js:32 -msgid "Signing transaction" -msgstr "" - -#: www/views/onboarding/backupRequest.html:6 -msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." -msgstr "" - -#: www/views/tab-create-personal.html:122 -#: www/views/tab-create-shared.html:151 -msgid "Single Address Wallet" -msgstr "" - -#: www/views/onboarding/collectEmail.html:40 -#: www/views/onboarding/tour.html:11 -msgid "Skip" -msgstr "" - -#: src/js/controllers/confirm.js:371 -#: src/js/controllers/modals/txpDetails.js:47 -msgid "Slide to accept" -msgstr "" - -#: www/views/buyAmazon.html:96 -msgid "Slide to buy" -msgstr "" - -#: src/js/controllers/confirm.js:365 -msgid "Slide to pay" -msgstr "" - -#: src/js/controllers/confirm.js:377 -#: src/js/controllers/modals/txpDetails.js:40 -msgid "Slide to send" -msgstr "" - -#: www/views/cashScan.html:56 -msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" -msgstr "" - -#: src/js/controllers/create.js:88 -#: src/js/controllers/join.js:71 -msgid "Specify Recovery Phrase..." -msgstr "" - -#: src/js/services/bwcError.js:92 -msgid "Spend proposal is not accepted" -msgstr "" - -#: src/js/services/bwcError.js:95 -msgid "Spend proposal not found" -msgstr "" - -#: src/js/services/bwcError.js:137 -msgid "Spending Password needed" -msgstr "" - -#: www/views/walletDetails.html:173 -msgid "Spending this balance will need significant Bitcoin network fees" -msgstr "" - -#: www/views/tab-send.html:28 -msgid "Start sending bitcoin" -msgstr "" - -#: www/views/lockSetup.html:3 -msgid "Startup Lock" -msgstr "" - -#: www/views/mercadoLibreCards.html:21 -#: www/views/modals/mercadolibre-card-details.html:42 -msgid "Still pending" -msgstr "" - -#: www/views/topup.html:101 -msgid "Success" -msgstr "" - -#: src/js/services/feeService.js:14 -msgid "Super Economy" -msgstr "" - -#: www/views/preferencesCash.html:11 -msgid "Support Bitcoin Cash" -msgstr "" - -#: www/views/paperWallet.html:7 -msgid "Sweep" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:89 -#: www/views/paperWallet.html:3 -msgid "Sweep paper wallet" -msgstr "" - -#: src/js/services/onGoingProcess.js:33 -msgid "Sweeping Wallet..." -msgstr "" - -#: www/views/preferencesDeleteWallet.html:16 -msgid "THIS ACTION CANNOT BE REVERSED" -msgstr "" - -#: www/views/onboarding/welcome.html:5 -msgid "Take control of your money,
get started with bitcoin." -msgstr "" - -#: www/views/walletDetails.html:132 -#: www/views/walletDetails.html:52 -msgid "Tap and hold to show" -msgstr "" - -#: www/views/includes/walletInfo.html:3 -msgid "Tap to recreate" -msgstr "" - -#: www/views/includes/walletInfo.html:4 -msgid "Tap to retry" -msgstr "" - -#: www/views/termsOfUse.html:3 -msgid "Terms Of Use" -msgstr "" - -#: www/views/modals/terms.html:3 -#: www/views/onboarding/disclaimer.html:29 -#: www/views/onboarding/disclaimer.html:43 -#: www/views/preferencesAbout.html:30 -msgid "Terms of Use" -msgstr "" - -#: www/views/tab-create-personal.html:118 -#: www/views/tab-import-phrase.html:68 -msgid "Testnet" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:61 -msgid "Text" -msgstr "" - -#: src/js/controllers/feedback/send.js:27 -#: src/js/controllers/feedback/send.js:76 -#: www/views/feedback/complete.html:20 -#: www/views/feedback/rateApp.html:4 -msgid "Thank you!" -msgstr "" - -#: src/js/controllers/feedback/send.js:72 -msgid "Thanks!" -msgstr "" - -#: src/js/controllers/feedback/send.js:73 -msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" -msgstr "" - -#: src/js/services/ledger.js:152 -msgid "The Ledger Chrome application is not installed" -msgstr "" - -#: www/views/modals/wallet-balance.html:55 -msgid "The amount of bitcoin immediately spendable from this wallet." -msgstr "" - -#: www/views/modals/wallet-balance.html:93 -msgid "The amount of bitcoin stored in this wallet that is allocated as inputs to your pending transaction proposals. The amount is determined using unspent transaction outputs associated with this wallet and may be more than the actual amounts associated with your pending transaction proposals." -msgstr "" - -#: www/views/modals/wallet-balance.html:74 -msgid "The amount of bitcoin stored in this wallet with less than 1 blockchain confirmation." -msgstr "" - -#: www/views/tab-import-phrase.html:5 -msgid "The derivation path" -msgstr "" - -#: www/views/onboarding/tour.html:37 -msgid "The exchange rate changes with the market." -msgstr "" - -#: www/views/preferencesFee.html:12 -msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." -msgstr "" - -#: www/views/addresses.html:51 -msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." -msgstr "" - -#: src/js/controllers/onboarding/terms.js:21 -msgid "The official English Terms of Service are available on the BitPay website." -msgstr "" - -#: www/views/tab-import-phrase.html:4 -msgid "The password of the recovery phrase (if set)" -msgstr "" - -#: src/js/services/walletService.js:1139 -msgid "The payment was created but could not be completed. Please try again from home screen" -msgstr "" - -#: www/views/modals/txp-details.html:26 -msgid "The payment was removed by creator" -msgstr "" - -#: www/views/join.html:91 -#: www/views/tab-create-personal.html:63 -#: www/views/tab-create-shared.html:92 -#: www/views/tab-import-phrase.html:43 -msgid "The recovery phrase could require a password to be imported" -msgstr "" - -#: src/js/services/bwcError.js:56 -msgid "The request could not be understood by the server" -msgstr "" - -#: www/views/addresses.html:52 -msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." -msgstr "" - -#: src/js/services/bwcError.js:98 -msgid "The spend proposal is not pending" -msgstr "" - -#: www/views/modals/wallet-balance.html:36 -msgid "The total amount of bitcoin stored in this wallet." -msgstr "" - -#: www/views/preferencesHistory.html:27 -msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" -msgstr "" - -#: www/views/tab-import-phrase.html:6 -msgid "The wallet service URL" -msgstr "" - -#: src/js/controllers/tab-home.js:38 -msgid "There is a new version of {{appName}} available" -msgstr "" - -#: src/js/controllers/import.js:229 -#: src/js/controllers/import.js:254 -#: src/js/controllers/import.js:335 -msgid "There is an error in the form" -msgstr "" - -#: src/js/controllers/feedback/send.js:61 -#: src/js/controllers/feedback/send.js:65 -msgid "There's obviously something we're doing wrong." -msgstr "" - -#: src/js/controllers/feedback/rateCard.js:38 -msgid "This app is fantastic!" -msgstr "" - -#: www/views/onboarding/tour.html:47 -msgid "This app stores your bitcoin with cutting-edge security." -msgstr "" - -#: src/js/controllers/confirm.js:523 -msgid "This bitcoin payment request has expired." -msgstr "" - -#: www/views/join.html:133 -#: www/views/tab-create-personal.html:103 -#: www/views/tab-create-shared.html:132 -msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." -msgstr "" - -#: www/views/backup.html:31 -msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." -msgstr "" - -#: www/views/tx-details.html:91 -msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." -msgstr "" - -#: www/views/tx-details.html:87 -msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" -msgstr "" - -#: www/views/walletDetails.html:109 -#: www/views/walletDetails.html:29 -msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." -msgstr "" - -#: www/views/modals/txp-details.html:136 -#: www/views/tx-details.html:121 -msgid "Timeline" -msgstr "" - -#: www/views/confirm.html:31 -#: www/views/includes/output.html:2 -#: www/views/modals/txp-details.html:109 -#: www/views/modals/txp-details.html:53 -#: www/views/tx-details.html:41 -#: www/views/tx-details.html:53 -msgid "To" -msgstr "" - -#: www/views/tab-send.html:32 -msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." -msgstr "" - -#: www/views/tab-send.html:33 -msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "" - -#: src/js/services/bitpayAccountService.js:73 -msgid "To {{reason}} you must first add your BitPay account - {{email}}" -msgstr "" - -#: src/js/services/onGoingProcess.js:48 -msgid "Top up in progress..." -msgstr "" - -#: src/js/controllers/topup.js:206 -msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" -msgstr "" - -#: www/views/buyAmazon.html:61 -#: www/views/buyMercadoLibre.html:60 -#: www/views/modals/wallet-balance.html:23 -#: www/views/topup.html:70 -msgid "Total" -msgstr "" - -#: www/views/walletDetails.html:196 -msgid "Total Locked Balance" -msgstr "" - -#: www/views/tab-create-shared.html:35 -msgid "Total number of copayers" -msgstr "" - -#: www/views/addresses.html:81 -msgid "Total wallet inputs" -msgstr "" - -#: src/js/services/fingerprintService.js:63 -#: src/js/services/fingerprintService.js:68 -msgid "Touch ID Failed" -msgstr "" - -#: src/js/controllers/tx-details.js:12 -msgid "Transaction" -msgstr "" - -#: www/views/confirm.html:126 -msgid "Transaction Created" -msgstr "" - -#: www/views/preferencesAdvanced.html:29 -#: www/views/preferencesHistory.html:3 -msgid "Transaction History" -msgstr "" - -#: src/js/services/bwcError.js:83 -msgid "Transaction already broadcasted" -msgstr "" - -#: src/js/controllers/buyAmazon.js:308 -#: src/js/controllers/buyMercadoLibre.js:301 -#: src/js/controllers/topup.js:281 -msgid "Transaction has not been created" -msgstr "" - -#: www/views/topup.html:104 -msgid "Transaction initiated" -msgstr "" - -#: src/js/controllers/tx-details.js:119 -msgid "Transaction not available at this time" -msgstr "" - -#: src/js/controllers/activity.js:45 -#: src/js/controllers/tab-home.js:174 -msgid "Transaction not found" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:55 -msgid "Transactions without fee are not supported." -msgstr "" - -#: src/js/controllers/paperWallet.js:109 -msgid "Transfer to" -msgstr "" - -#: www/views/tab-send.html:67 -msgid "Transfer to Wallet" -msgstr "" - -#: www/views/modals/pin.html:13 -msgid "Try again in {{expires}}" -msgstr "" - -#: www/views/bitpayCardIntro.html:18 -msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." -msgstr "" - -#: www/views/tab-import-phrase.html:17 -msgid "Type the Recovery Phrase (usually 12 words)" -msgstr "" - -#: src/js/controllers/backup.js:75 -msgid "Uh oh..." -msgstr "" - -#: www/views/tx-details.html:100 -msgid "Unconfirmed" -msgstr "" - -#: www/views/walletDetails.html:190 -msgid "Unsent transactions" -msgstr "" - -#: www/views/addresses.html:39 -msgid "Unused Addresses" -msgstr "" - -#: www/views/addresses.html:50 -msgid "Unused Addresses Limit" -msgstr "" - -#: src/js/controllers/tab-home.js:146 -msgid "Update Available" -msgstr "" - -#: www/views/proposals.html:14 -msgid "Updating pending proposals. Please stand by" -msgstr "" - -#: www/views/walletDetails.html:217 -msgid "Updating transaction history. Please stand by." -msgstr "" - -#: www/views/activity.html:14 -msgid "Updating... Please stand by" -msgstr "" - -#: src/js/services/feeService.js:10 -msgid "Urgent" -msgstr "" - -#: www/views/advancedSettings.html:12 -msgid "Use Unconfirmed Funds" -msgstr "" - -#: src/js/services/onGoingProcess.js:34 -msgid "Validating recovery phrase..." -msgstr "" - -#: www/views/modals/fingerprintCheck.html:4 -msgid "Verify your identity" -msgstr "" - -#: www/views/preferencesAbout.html:14 -#: www/views/preferencesExternal.html:25 -msgid "Version" -msgstr "" - -#: www/views/tab-export-file.html:69 -msgid "View" -msgstr "" - -#: www/views/addresses.html:34 -msgid "View All Addresses" -msgstr "" - -#: src/js/controllers/onboarding/terms.js:20 -msgid "View Terms of Service" -msgstr "" - -#: src/js/controllers/bitpayCard.js:122 -#: src/js/controllers/tx-details.js:191 -msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" - -#: src/js/controllers/tab-home.js:148 -msgid "View Update" -msgstr "" - -#: www/views/tx-details.html:147 -msgid "View on blockchain" -msgstr "" - -#: www/views/mercadoLibre.html:26 -msgid "Visit mercadolivre.com.br →" -msgstr "" - -#: www/views/walletDetails.html:182 -msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." -msgstr "" - -#: www/views/tab-export-file.html:45 -msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." -msgstr "" - -#: www/views/tab-export-file.html:36 -msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." -msgstr "" - -#: www/views/modals/paypro.html:42 -msgid "WARNING: UNTRUSTED CERTIFICATE" -msgstr "" - -#: src/js/services/onGoingProcess.js:15 -msgid "Waiting for Ledger..." -msgstr "" - -#: src/js/services/onGoingProcess.js:16 -msgid "Waiting for Trezor..." -msgstr "" - -#: www/views/copayers.html:48 -msgid "Waiting for copayers" -msgstr "" - -#: www/views/copayers.html:53 -msgid "Waiting..." -msgstr "" - -#: www/views/addresses.html:3 -#: www/views/preferencesAdvanced.html:17 -msgid "Wallet Addresses" -msgstr "" - -#: www/views/preferencesColor.html:4 -msgid "Wallet Color" -msgstr "" - -#: www/views/preferencesInformation.html:29 -msgid "Wallet Configuration (m-n)" -msgstr "" - -#: www/views/onboarding/collectEmail.html:5 -msgid "Wallet Created" -msgstr "" - -#: www/views/preferencesInformation.html:23 -msgid "Wallet Id" -msgstr "" - -#: www/views/preferencesAdvanced.html:13 -#: www/views/preferencesInformation.html:3 -msgid "Wallet Information" -msgstr "" - -#: www/views/addresses.html:76 -msgid "Wallet Inputs" -msgstr "" - -#: www/views/join.html:26 -msgid "Wallet Invitation" -msgstr "" - -#: www/views/join.html:60 -#: www/views/tab-create-personal.html:38 -#: www/views/tab-create-shared.html:67 -msgid "Wallet Key" -msgstr "" - -#: www/views/preferencesAlias.html:4 -msgid "Wallet Name" -msgstr "" - -#: www/views/preferencesInformation.html:11 -msgid "Wallet Name (at creation)" -msgstr "" - -#: www/views/preferencesInformation.html:35 -msgid "Wallet Network" -msgstr "" - -#: www/views/join.html:77 -#: www/views/tab-create-personal.html:50 -#: www/views/tab-create-shared.html:79 -msgid "Wallet Recovery Phrase" -msgstr "" - -#: src/js/services/bwcError.js:26 -msgid "Wallet Recovery Phrase is invalid" -msgstr "" - -#: www/views/preferencesAdvanced.html:25 -#: www/views/tab-import-phrase.html:73 -msgid "Wallet Service URL" -msgstr "" - -#: www/views/preferences.html:4 -msgid "Wallet Settings" -msgstr "" - -#: www/views/tab-import-hardware.html:11 -#: www/views/tab-import-phrase.html:61 -msgid "Wallet Type" -msgstr "" - -#: src/js/services/bwcError.js:59 -msgid "Wallet already exists" -msgstr "" - -#: src/js/services/profileService.js:516 -msgid "Wallet already in {{appName}}" -msgstr "" - -#: www/views/includes/walletActivity.html:6 -msgid "Wallet created" -msgstr "" - -#: www/views/copayers.html:58 -msgid "Wallet incomplete and broken" -msgstr "" - -#: src/js/services/bwcError.js:65 -msgid "Wallet is full" -msgstr "" - -#: src/js/services/bwcError.js:125 -msgid "Wallet is locked" -msgstr "" - -#: src/js/services/bwcError.js:128 -msgid "Wallet is not complete" -msgstr "" - -#: www/views/tab-create-personal.html:12 -#: www/views/tab-create-shared.html:12 -msgid "Wallet name" -msgstr "" - -#: src/js/services/bwcError.js:131 -msgid "Wallet needs backup" -msgstr "" - -#: www/views/tab-receive.html:59 -#: www/views/walletDetails.html:169 -msgid "Wallet not backed up" -msgstr "" - -#: src/js/services/bwcError.js:68 -msgid "Wallet not found" -msgstr "" - -#: src/js/controllers/cashScan.js:81 -#: src/js/controllers/tab-home.js:230 -msgid "Wallet not registered" -msgstr "" - -#: src/js/services/bwcError.js:29 -msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" -msgstr "" - -#: www/views/backup.html:12 -msgid "Wallet recovery phrase not available" -msgstr "" - -#: src/js/services/bwcError.js:50 -msgid "Wallet service not found" -msgstr "" - -#: www/views/tab-home.html:69 -msgid "Wallets" -msgstr "" - -#: src/js/controllers/addressbookView.js:36 -#: src/js/controllers/modals/txpDetails.js:153 -#: src/js/controllers/modals/txpDetails.js:170 -#: src/js/controllers/preferencesDelete.js:24 -#: src/js/controllers/preferencesExternal.js:14 -#: www/views/preferencesDeleteWallet.html:11 -msgid "Warning!" -msgstr "" - -#: www/views/modals/txp-details.html:47 -msgid "Warning: this transaction has unconfirmed inputs" -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:17 -msgid "Watch out!" -msgstr "" - -#: src/js/controllers/feedback/send.js:69 -msgid "We'd love to do better." -msgstr "" - -#: www/views/backup.html:35 -msgid "We'll confirm on the next screen." -msgstr "" - -#: src/js/controllers/feedback/send.js:77 -msgid "We're always looking for ways to improve {{appName}}." -msgstr "" - -#: src/js/controllers/feedback/send.js:83 -msgid "We're always looking for ways to improve {{appName}}. How could we improve your experience?" -msgstr "" - -#: www/views/includes/incomingDataMenu.html:6 -msgid "Website" -msgstr "" - -#: www/views/preferencesLanguage.html:16 -msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." -msgstr "" - -#: www/views/preferencesAlias.html:11 -msgid "What do you call this wallet?" -msgstr "" - -#: www/views/preferencesAlias.html:12 -msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." -msgstr "" - -#: www/views/onboarding/collectEmail.html:10 -msgid "Where would you like to receive email notifications about payments?" -msgstr "" - -#: www/views/addresses.html:19 -msgid "Why?" -msgstr "" - -#: www/views/feedback/rateApp.html:10 -msgid "Would you be willing to rate {{appName}} in the app store?" -msgstr "" - -#: www/views/onboarding/notifications.html:4 -msgid "Would you like to receive push notifications about payments?" -msgstr "" - -#: src/js/controllers/import.js:288 -msgid "Wrong number of recovery words:" -msgstr "" - -#: src/js/services/bwcError.js:140 -msgid "Wrong spending password" -msgstr "" - -#: www/views/modals/confirmation.html:7 -msgid "Yes" -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:25 -msgid "Yes, skip" -msgstr "" - -#: src/js/controllers/onboarding/backupRequest.js:24 -msgid "You can create a backup later from your wallet settings." -msgstr "" - -#: src/js/controllers/preferencesLanguage.js:12 -msgid "You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!" -msgstr "" - -#: www/views/tab-scan.html:16 -msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." -msgstr "" - -#: src/js/controllers/preferencesAbout.js:14 -msgid "You can see the latest developments and contribute to this open source app by visiting our project on GitHub." -msgstr "" - -#: www/views/onboarding/tour.html:19 -msgid "You can spend bitcoin at millions of websites and stores worldwide." -msgstr "" - -#: www/views/backup.html:15 -msgid "You can still export it from Advanced > Export." -msgstr "" - -#: www/views/onboarding/tour.html:32 -msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." -msgstr "" - -#: www/views/onboarding/tour.html:46 -msgid "You control your bitcoin." -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:64 -msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." -msgstr "" - -#: www/views/modals/bitpay-card-confirmation.html:5 -msgid "You will need to log back for fill in your BitPay Card." -msgstr "" - -#: www/views/preferencesNotifications.html:34 -msgid "You'll receive email notifications about payments sent and received from your wallets." -msgstr "" - -#: www/views/bitpayCard.html:50 -msgid "Your BitPay Card is ready. Add funds to your card to start using it at stores and ATMs worldwide." -msgstr "" - -#: www/views/mercadoLibre.html:57 -#: www/views/mercadoLibreCards.html:6 -msgid "Your Gift Cards" -msgstr "" - -#: www/views/includes/confirmBackupPopup.html:6 -msgid "Your bitcoin wallet is backed up!" -msgstr "" - -#: www/views/tab-home.html:36 -msgid "Your bitcoin wallet is ready!" -msgstr "" - -#: www/views/modals/chooseFeeLevel.html:61 -msgid "Your fee is lower than recommended." -msgstr "" - -#: www/views/feedback/send.html:42 -msgid "Your ideas, feedback, or comments" -msgstr "" - -#: www/views/tab-create-shared.html:22 -msgid "Your name" -msgstr "" - -#: www/views/join.html:16 -msgid "Your nickname" -msgstr "" - -#: www/views/tab-export-file.html:11 -#: www/views/tab-import-file.html:20 -msgid "Your password" -msgstr "" - -#: www/views/buyAmazon.html:102 -msgid "Your purchase could not be completed" -msgstr "" - -#: www/views/buyAmazon.html:105 -msgid "Your purchase was added to the list of pending" -msgstr "" - -#: www/views/onboarding/backupRequest.html:10 -msgid "Your wallet is never saved to cloud storage or standard device backups." -msgstr "" - -#: src/js/services/walletService.js:1030 -msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down." -msgstr "" - -#: www/views/includes/walletList.html:13 -#: www/views/includes/walletSelector.html:21 -#: www/views/paperWallet.html:33 -#: www/views/tab-receive.html:72 -#: www/views/walletDetails.html:131 -#: www/views/walletDetails.html:51 -msgid "[Balance Hidden]" -msgstr "" - -#: www/views/walletDetails.html:141 -#: www/views/walletDetails.html:61 -msgid "[Scanning Funds]" -msgstr "" - -#: src/js/controllers/bitpayCardIntro.js:11 -msgid "add your BitPay Visa card(s)" -msgstr "" - -#: www/views/includes/available-balance.html:8 -msgid "locked by pending payments" -msgstr "" - -#: src/js/services/profileService.js:404 -msgid "me" -msgstr "" - -#: www/views/addressbook.add.html:32 -msgid "name@example.com" -msgstr "" - -#: www/views/preferencesHistory.html:15 -msgid "preparing..." -msgstr "" - -#: www/views/cashScan.html:57 -msgid "recovery tool." -msgstr "" - -#: src/js/controllers/buyAmazon.js:239 -msgid "{{amountStr}} for Amazon.com Gift Card" -msgstr "" - -#: src/js/controllers/buyMercadoLibre.js:237 -msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" -msgstr "" - -#: www/views/preferencesBwsUrl.html:21 -msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." -msgstr "" - -#: src/js/controllers/confirm.js:408 -msgid "{{fee}} will be deducted for bitcoin networking fees." -msgstr "" - -#: www/views/confirm.html:85 -msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" -msgstr "" - -#: www/views/walletDetails.html:218 -msgid "{{updatingTxHistoryProgress}} transactions downloaded" -msgstr "" - -#: www/views/cashScan.html:33 -#: www/views/copayers.html:46 -#: www/views/includes/walletInfo.html:18 -msgid "{{wallet.m}}-of-{{wallet.n}}" -msgstr "" +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" + +#: www/views/modals/paypro.html:34 +msgid "(Trusted)" +msgstr "" + +#: www/views/includes/txp.html:23 +#: www/views/includes/walletHistory.html:64 +msgid "(possible double spend)" +msgstr "" + +#: www/views/modals/txp-details.html:159 +msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." +msgstr "" + +#: www/views/tx-details.html:82 +msgid "- {{btx.feeRateStr}} of the transaction" +msgstr "" + +#: www/views/modals/txp-details.html:102 +msgid "- {{tx.feeRateStr}} of the transaction" +msgstr "" + +#: www/views/feedback/rateApp.html:7 +msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!" +msgstr "" + +#: www/views/mercadoLibre.html:18 +#: www/views/mercadoLibre.html:40 +msgid "Only redeemable on Mercado Livre (Brazil)" +msgstr "" + +#: src/js/controllers/feedback/send.js:27 +#: www/views/feedback/complete.html:21 +msgid "A member of the team will review your feedback as soon as possible." +msgstr "" + +#: src/js/controllers/confirm.js:401 +msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." +msgstr "" + +#: src/js/controllers/confirm.js:395 +msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." +msgstr "" + +#: src/js/controllers/preferencesAbout.js:6 +#: www/views/tab-settings.html:156 +msgid "About" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:62 +#: src/js/controllers/tx-details.js:79 +msgid "Accepted" +msgstr "" + +#: www/views/preferencesInformation.html:72 +msgid "Account" +msgstr "" + +#: www/views/join.html:72 +#: www/views/tab-create-personal.html:45 +#: www/views/tab-create-shared.html:74 +#: www/views/tab-import-hardware.html:19 +msgid "Account Number" +msgstr "" + +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "" + +#: www/views/preferencesBitpayServices.html:23 +msgid "Accounts" +msgstr "" + +#: www/views/bitpayCard.html:56 +msgid "Activity" +msgstr "" + +#: src/js/services/bitpayAccountService.js:83 +msgid "Add Account" +msgstr "" + +#: src/js/services/bitpayAccountService.js:69 +msgid "Add BitPay Account?" +msgstr "" + +#: www/views/addressbook.add.html:4 +#: www/views/addressbook.html:22 +msgid "Add Contact" +msgstr "" + +#: www/views/bitpayCard.html:28 +msgid "Add Funds" +msgstr "" + +#: www/views/confirm.html:94 +msgid "Add Memo" +msgstr "" + +#: www/views/join.html:87 +#: www/views/tab-create-personal.html:59 +#: www/views/tab-create-shared.html:88 +msgid "Add a password" +msgstr "" + +#: www/views/includes/accountSelector.html:27 +msgid "Add account" +msgstr "" + +#: www/views/join.html:90 +#: www/views/tab-create-personal.html:62 +#: www/views/tab-create-shared.html:91 +msgid "Add an optional password to secure the recovery phrase" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:41 +msgid "Add as a contact" +msgstr "" + +#: src/js/controllers/confirm.js:424 +msgid "Add description" +msgstr "" + +#: www/views/topup.html:6 +msgid "Add funds" +msgstr "" + +#: src/js/services/bitpayAccountService.js:78 +msgid "Add this BitPay account ({{email}})?" +msgstr "" + +#: www/views/add.html:3 +msgid "Add wallet" +msgstr "" + +#: www/views/addressbook.view.html:26 +#: www/views/customAmount.html:28 +#: www/views/modals/paypro.html:24 +msgid "Address" +msgstr "" + +#: www/views/addressbook.html:6 +#: www/views/tab-settings.html:13 +msgid "Address Book" +msgstr "" + +#: www/views/preferencesInformation.html:41 +msgid "Address Type" +msgstr "" + +#: www/views/addresses.html:64 +msgid "Addresses With Balance" +msgstr "" + +#: www/views/tab-settings.html:149 +msgid "Advanced" +msgstr "" + +#: www/views/advancedSettings.html:3 +msgid "Advanced Settings" +msgstr "" + +#: www/views/bitpayCard.html:62 +msgid "All" +msgstr "" + +#: www/views/allAddresses.html:3 +msgid "All Addresses" +msgstr "" + +#: www/views/modals/wallet-balance.html:18 +msgid "All of your bitcoin wallet balance may not be available for immediate spending." +msgstr "" + +#: www/views/tab-receive.html:25 +msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." +msgstr "" + +#: www/views/tab-scan.html:21 +msgid "Allow Camera Access" +msgstr "" + +#: www/views/onboarding/notifications.html:7 +msgid "Allow notifications" +msgstr "" + +#: www/views/onboarding/disclaimer.html:14 +msgid "Almost done! Let's review." +msgstr "" + +#: www/views/preferencesAltCurrency.html:4 +#: www/views/tab-settings.html:79 +msgid "Alternative Currency" +msgstr "" + +#: src/js/controllers/buyAmazon.js:98 +msgid "Amazon.com is not available at this moment. Please try back later." +msgstr "" + +#: www/views/amount.html:44 +#: www/views/customAmount.html:34 +#: www/views/includes/output.html:7 +msgid "Amount" +msgstr "" + +#: src/js/services/bwcError.js:110 +msgid "Amount below minimum allowed" +msgstr "" + +#: src/js/controllers/confirm.js:216 +msgid "Amount too big" +msgstr "" + +#: www/views/includes/walletHistory.html:31 +msgid "Amount too low to spend" +msgstr "" + +#: src/js/controllers/tab-home.js:147 +msgid "An update to this app is available. For your security, please update to the latest version." +msgstr "" + +#: www/views/backupWarning.html:14 +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "" + +#: www/views/addresses.html:94 +msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" +msgstr "" + +#: www/views/backupWarning.html:10 +msgid "Are you being watched?" +msgstr "" + +#: src/js/controllers/preferencesExternal.js:15 +msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin." +msgstr "" + +#: src/js/controllers/copayers.js:56 +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "" + +#: src/js/controllers/addressbookView.js:37 +msgid "Are you sure you want to delete this contact?" +msgstr "" + +#: src/js/controllers/preferencesDelete.js:25 +msgid "Are you sure you want to delete this wallet?" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:154 +msgid "Are you sure you want to reject this transaction?" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:171 +msgid "Are you sure you want to remove this transaction?" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:23 +msgid "Are you sure you want to skip it?" +msgstr "" + +#: www/views/modals/bitpay-card-confirmation.html:4 +msgid "Are you sure you would like to log out of your BitPay Card account?" +msgstr "" + +#: src/js/controllers/preferencesBitpayCard.js:7 +#: src/js/controllers/preferencesBitpayServices.js:20 +msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" +msgstr "" + +#: www/views/includes/walletInfo.html:10 +msgid "Auditable" +msgstr "" + +#: www/views/modals/wallet-balance.html:42 +msgid "Available" +msgstr "" + +#: www/views/includes/available-balance.html:3 +msgid "Available Balance" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:24 +#: www/views/preferencesFee.html:15 +msgid "Average confirmation time" +msgstr "" + +#: www/views/join.html:143 +#: www/views/tab-create-personal.html:113 +#: www/views/tab-create-shared.html:142 +#: www/views/tab-import-phrase.html:51 +msgid "BIP32 path for address derivation" +msgstr "" + +#: www/views/cashScan.html:25 +msgid "BTC wallets" +msgstr "" + +#: www/views/preferences.html:34 +msgid "Backup" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:7 +msgid "Backup Needed" +msgstr "" + +#: src/js/controllers/lockSetup.js:87 +msgid "Backup all livenet wallets before using this function" +msgstr "" + +#: src/js/controllers/cashScan.js:64 +#: www/views/includes/walletListSettings.html:12 +#: www/views/preferences.html:36 +msgid "Backup needed" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:9 +msgid "Backup now" +msgstr "" + +#: www/views/onboarding/backupRequest.html:11 +#: www/views/tab-export-file.html:89 +msgid "Backup wallet" +msgstr "" + +#: src/js/controllers/lockSetup.js:84 +msgid "Backup your wallet before using this function" +msgstr "" + +#: src/js/services/profileService.js:446 +msgid "Bad wallet invitation" +msgstr "" + +#: www/views/preferencesInformation.html:102 +msgid "Balance By Address" +msgstr "" + +#: www/views/includes/confirmBackupPopup.html:7 +msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." +msgstr "" + +#: www/views/preferencesBitpayServices.html:9 +msgid "BitPay Visa® Cards" +msgstr "" + +#: www/views/addressbook.add.html:38 +#: www/views/includes/incomingDataMenu.html:29 +msgid "Bitcoin Address" +msgstr "" + +#: www/views/cashScan.html:4 +msgid "Bitcoin Cash (BCH) Balances" +msgstr "" + +#: www/views/preferencesCash.html:3 +#: www/views/tab-settings.html:47 +msgid "Bitcoin Cash Support" +msgstr "" + +#: www/views/tab-home.html:98 +#: www/views/tab-settings.html:115 +msgid "Bitcoin Cash Wallets" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:4 +#: www/views/preferencesFee.html:4 +#: www/views/tab-settings.html:90 +msgid "Bitcoin Network Fee Policy" +msgstr "" + +#: www/views/tab-home.html:83 +#: www/views/tab-settings.html:107 +msgid "Bitcoin Core Wallets" +msgstr "" + +#: src/js/services/incomingData.js:151 +msgid "Bitcoin cash Payment" +msgstr "" + +#: www/views/onboarding/tour.html:31 +msgid "Bitcoin is a currency." +msgstr "" + +#: www/views/onboarding/disclaimer.html:15 +msgid "Bitcoin is different – it cannot be safely held with a bank or web service." +msgstr "" + +#: www/views/onboarding/tour.html:18 +msgid "Bitcoin is secure,
digital money." +msgstr "" + +#: www/views/preferencesFee.html:11 +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "" + +#: www/views/buyAmazon.html:108 +msgid "Bought {{amountUnitStr}}" +msgstr "" + +#: www/views/modals/txp-details.html:36 +msgid "Broadcast Payment" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:64 +#: src/js/controllers/tx-details.js:81 +msgid "Broadcasted" +msgstr "" + +#: src/js/services/onGoingProcess.js:11 +msgid "Broadcasting transaction" +msgstr "" + +#: www/views/unsupported.html:6 +msgid "Browser unsupported" +msgstr "" + +#: www/views/buyAmazon.html:5 +#: www/views/buyMercadoLibre.html:6 +msgid "Buy" +msgstr "" + +#: www/views/includes/buyAndSellCard.html:3 +msgid "Buy & Sell Bitcoin" +msgstr "" + +#: www/views/tab-send.html:35 +msgid "Buy Bitcoin" +msgstr "" + +#: www/views/mercadoLibre.html:22 +#: www/views/mercadoLibre.html:50 +msgid "Buy a Gift Card" +msgstr "" + +#: src/js/controllers/buyAmazon.js:334 +msgid "Buy from" +msgstr "" + +#: src/js/services/onGoingProcess.js:40 +msgid "Buying Bitcoin..." +msgstr "" + +#: src/js/services/onGoingProcess.js:12 +msgid "Calculating fee" +msgstr "" + +#: src/js/controllers/buyAmazon.js:313 +#: src/js/controllers/buyMercadoLibre.js:307 +#: src/js/controllers/confirm.js:550 +#: src/js/controllers/topup.js:287 +#: src/js/services/incomingData.js:154 +#: src/js/services/popupService.js:62 +#: src/js/services/popupService.js:73 +#: www/views/addressbook.add.html:10 +#: www/views/feedback/send.html:5 +#: www/views/includes/incomingDataMenu.html:22 +#: www/views/includes/incomingDataMenu.html:54 +#: www/views/includes/incomingDataMenu.html:73 +#: www/views/includes/incomingDataMenu.html:97 +#: www/views/includes/note.html:6 +#: www/views/modals/bitpay-card-confirmation.html:8 +#: www/views/modals/confirmation.html:13 +msgid "Cancel" +msgstr "" + +#: www/views/copayers.html:36 +msgid "Cancel invitation" +msgstr "" + +#: src/js/controllers/onboarding/tour.js:52 +msgid "Cannot Create Wallet" +msgstr "" + +#: src/js/services/profileService.js:442 +msgid "Cannot join the same wallet more that once" +msgstr "" + +#: www/views/includes/bitpayCardsCard.html:2 +msgid "Cards" +msgstr "" + +#: www/views/modals/paypro.html:30 +msgid "Certified by" +msgstr "" + +#: www/views/preferencesExternal.html:19 +msgid "Check installation and retry." +msgstr "" + +#: www/views/tab-import-file.html:4 +msgid "Choose a backup file from your computer" +msgstr "" + +#: www/views/modals/wallets.html:9 +msgid "Choose your destination wallet" +msgstr "" + +#: www/views/modals/wallets.html:10 +msgid "Choose your source wallet" +msgstr "" + +#: www/views/backup.html:61 +msgid "Clear" +msgstr "" + +#: www/views/preferencesHistory.html:24 +msgid "Clear cache" +msgstr "" + +#: src/js/controllers/confirm.js:373 +#: src/js/controllers/modals/txpDetails.js:49 +msgid "Click to accept" +msgstr "" + +#: src/js/controllers/confirm.js:367 +msgid "Click to pay" +msgstr "" + +#: src/js/controllers/confirm.js:379 +#: src/js/controllers/modals/txpDetails.js:42 +msgid "Click to send" +msgstr "" + +#: www/views/customAmount.html:4 +#: www/views/modals/mercadolibre-card-details.html:3 +#: www/views/modals/paypro.html:4 +#: www/views/modals/pin.html:3 +#: www/views/modals/search.html:3 +#: www/views/modals/wallet-balance.html:3 +#: www/views/modals/wallets.html:5 +msgid "Close" +msgstr "" + +#: www/views/includes/cash.html:2 +#: www/views/preferencesInformation.html:17 +msgid "Coin" +msgstr "" + +#: www/views/preferences.html:22 +msgid "Color" +msgstr "" + +#: www/views/preferencesAbout.html:21 +msgid "Commit hash" +msgstr "" + +#: www/views/preferences.html:49 +msgid "Complete the backup process to use this option" +msgstr "" + +#: www/views/bitpayCard.html:93 +msgid "Completed" +msgstr "" + +#: src/js/controllers/buyAmazon.js:311 +#: src/js/controllers/buyMercadoLibre.js:305 +#: src/js/controllers/confirm.js:549 +#: src/js/controllers/copayers.js:55 +#: src/js/controllers/topup.js:285 +#: www/views/backup.html:60 +#: www/views/backup.html:79 +#: www/views/confirm.html:4 +#: www/views/onboarding/collectEmail.html:32 +msgid "Confirm" +msgstr "" + +#: www/views/modals/terms.html:26 +#: www/views/onboarding/disclaimer.html:44 +msgid "Confirm & Finish" +msgstr "" + +#: www/views/buyAmazon.html:90 +msgid "Confirm purchase" +msgstr "" + +#: www/views/modals/pin.html:10 +msgid "Confirm your PIN" +msgstr "" + +#: src/js/services/walletService.js:1033 +msgid "Confirm your new spending password" +msgstr "" + +#: www/views/tx-details.html:98 +msgid "Confirmations" +msgstr "" + +#: www/views/bitpayCard.html:68 +#: www/views/modals/wallet-balance.html:61 +msgid "Confirming" +msgstr "" + +#: www/views/bitpayCardIntro.html:37 +msgid "Connect my BitPay Card" +msgstr "" + +#: src/js/services/onGoingProcess.js:13 +msgid "Connecting to Coinbase..." +msgstr "" + +#: src/js/services/onGoingProcess.js:14 +msgid "Connecting to Glidera..." +msgstr "" + +#: src/js/services/bwcError.js:53 +msgid "Connection reset by peer" +msgstr "" + +#: www/views/tab-send.html:45 +msgid "Contacts" +msgstr "" + +#: www/views/onboarding/notifications.html:9 +msgid "Continue" +msgstr "" + +#: www/views/preferencesLanguage.html:26 +msgid "Contribute Translations" +msgstr "" + +#: src/js/controllers/confirm.js:130 +msgid "Copay only supports Bitcoin Cash using new version numbers addresses" +msgstr "" + +#: src/js/services/bwcError.js:62 +msgid "Copayer already in this wallet" +msgstr "" + +#: src/js/services/bwcError.js:77 +msgid "Copayer already voted on this spend proposal" +msgstr "" + +#: src/js/services/bwcError.js:107 +msgid "Copayer data mismatch" +msgstr "" + +#: www/views/includes/walletActivity.html:2 +msgid "Copayer joined" +msgstr "" + +#: www/views/preferencesInformation.html:94 +msgid "Copayer {{$index}}" +msgstr "" + +#: src/js/controllers/copayers.js:79 +#: src/js/controllers/export.js:193 +#: www/views/includes/copyToClipboard.html:4 +msgid "Copied to clipboard" +msgstr "" + +#: www/views/tab-export-file.html:94 +msgid "Copy this text as it is to a safe place (notepad or email)" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:51 +#: www/views/includes/incomingDataMenu.html:70 +#: www/views/includes/incomingDataMenu.html:94 +#: www/views/includes/logOptions.html:9 +#: www/views/tab-export-file.html:78 +msgid "Copy to clipboard" +msgstr "" + +#: src/js/controllers/buyMercadoLibre.js:102 +msgid "Could not access Gift Card Service" +msgstr "" + +#: www/views/tab-import-phrase.html:2 +msgid "Could not access the wallet at the server. Please check:" +msgstr "" + +#: src/js/controllers/buyAmazon.js:102 +msgid "Could not access to Amazon.com" +msgstr "" + +#: src/js/services/profileService.js:511 +msgid "Could not access wallet" +msgstr "" + +#: src/js/controllers/confirm.js:210 +msgid "Could not add message to imported wallet without shared encrypting key" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:199 +msgid "Could not broadcast payment" +msgstr "" + +#: src/js/services/bwcError.js:41 +msgid "Could not build transaction" +msgstr "" + +#: src/js/services/walletService.js:854 +msgid "Could not create address" +msgstr "" + +#: src/js/controllers/topup.js:92 +msgid "Could not create the invoice" +msgstr "" + +#: src/js/controllers/buyAmazon.js:164 +#: src/js/controllers/buyMercadoLibre.js:164 +#: src/js/controllers/topup.js:142 +msgid "Could not create transaction" +msgstr "" + +#: src/js/services/profileService.js:350 +msgid "Could not create using the specified extended private key" +msgstr "" + +#: src/js/services/profileService.js:362 +msgid "Could not create using the specified extended public key" +msgstr "" + +#: src/js/services/profileService.js:338 +msgid "Could not create: Invalid wallet recovery phrase" +msgstr "" + +#: src/js/controllers/import.js:114 +msgid "Could not decrypt file, check your password" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:181 +msgid "Could not delete payment proposal" +msgstr "" + +#: src/js/controllers/cashScan.js:117 +msgid "Could not duplicate" +msgstr "" + +#: src/js/services/feeService.js:73 +msgid "Could not get dynamic fee" +msgstr "" + +#: src/js/services/feeService.js:43 +msgid "Could not get dynamic fee for level: {{feeLevel}}" +msgstr "" + +#: src/js/controllers/modals/feeLevels.js:112 +msgid "Could not get fee levels" +msgstr "" + +#: src/js/controllers/buyAmazon.js:122 +#: src/js/controllers/buyMercadoLibre.js:122 +#: src/js/controllers/topup.js:100 +msgid "Could not get the invoice" +msgstr "" + +#: src/js/controllers/bitpayCard.js:66 +msgid "Could not get transactions" +msgstr "" + +#: src/js/services/profileService.js:615 +#: src/js/services/profileService.js:650 +#: src/js/services/profileService.js:674 +msgid "Could not import" +msgstr "" + +#: src/js/services/profileService.js:584 +msgid "Could not import. Check input file and spending password" +msgstr "" + +#: src/js/services/profileService.js:457 +msgid "Could not join wallet" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:161 +msgid "Could not reject payment" +msgstr "" + +#: src/js/controllers/preferencesBitpayServices.js:33 +msgid "Could not remove account" +msgstr "" + +#: src/js/controllers/preferencesBitpayCard.js:20 +#: src/js/controllers/preferencesBitpayServices.js:50 +msgid "Could not remove card" +msgstr "" + +#: src/js/services/walletService.js:776 +msgid "Could not save preferences on the server" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:147 +msgid "Could not send payment" +msgstr "" + +#: src/js/controllers/buyAmazon.js:325 +#: src/js/controllers/buyMercadoLibre.js:318 +#: src/js/controllers/topup.js:299 +msgid "Could not send transaction" +msgstr "" + +#: www/views/walletDetails.html:210 +msgid "Could not update transaction history" +msgstr "" + +#: src/js/controllers/addresses.js:29 +#: src/js/controllers/addresses.js:37 +#: src/js/controllers/copayers.js:30 +#: src/js/controllers/walletDetails.js:78 +msgid "Could not update wallet" +msgstr "" + +#: www/views/tab-create-personal.html:3 +msgid "Create Personal Wallet" +msgstr "" + +#: www/views/tab-create-shared.html:3 +msgid "Create Shared Wallet" +msgstr "" + +#: www/views/onboarding/tour.html:51 +#: www/views/tab-home.html:75 +#: www/views/tab-send.html:36 +msgid "Create bitcoin wallet" +msgstr "" + +#: www/views/tab-create-personal.html:131 +msgid "Create new wallet" +msgstr "" + +#: www/views/add.html:22 +msgid "Create shared wallet" +msgstr "" + +#: www/views/tab-create-shared.html:160 +msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" +msgstr "" + +#: www/views/modals/txp-details.html:81 +#: www/views/tx-details.html:60 +msgid "Created by" +msgstr "" + +#: src/js/services/onGoingProcess.js:18 +msgid "Creating Wallet..." +msgstr "" + +#: src/js/services/onGoingProcess.js:17 +msgid "Creating transaction" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:34 +#: www/views/preferencesFee.html:20 +msgid "Current fee rate for this policy" +msgstr "" + +#: src/js/services/feeService.js:15 +msgid "Custom" +msgstr "" + +#: www/views/customAmount.html:9 +msgid "Custom Amount" +msgstr "" + +#: src/js/controllers/preferencesFee.js:85 +msgid "Custom Fee" +msgstr "" + +#: www/views/modals/mercadolibre-card-details.html:56 +#: www/views/modals/txp-details.html:87 +#: www/views/tx-details.html:66 +msgid "Date" +msgstr "" + +#: www/views/preferencesDeleteWallet.html:21 +msgid "Delete" +msgstr "" + +#: www/views/modals/txp-details.html:164 +msgid "Delete Payment Proposal" +msgstr "" + +#: www/views/preferencesAdvanced.html:33 +#: www/views/preferencesDeleteWallet.html:3 +msgid "Delete Wallet" +msgstr "" + +#: www/views/copayers.html:59 +msgid "Delete it and create a new one" +msgstr "" + +#: src/js/services/onGoingProcess.js:19 +msgid "Deleting Wallet..." +msgstr "" + +#: src/js/services/onGoingProcess.js:28 +msgid "Deleting payment proposal" +msgstr "" + +#: www/views/join.html:141 +#: www/views/tab-create-personal.html:111 +#: www/views/tab-create-shared.html:140 +#: www/views/tab-import-phrase.html:49 +msgid "Derivation Path" +msgstr "" + +#: www/views/preferencesInformation.html:47 +msgid "Derivation Strategy" +msgstr "" + +#: www/views/buyAmazon.html:39 +#: www/views/buyMercadoLibre.html:38 +#: www/views/modals/mercadolibre-card-details.html:6 +#: www/views/topup.html:45 +msgid "Details" +msgstr "" + +#: src/js/controllers/lockSetup.js:9 +#: src/js/controllers/tab-settings.js:65 +#: www/views/tab-settings.html:50 +msgid "Disabled" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:10 +#: www/views/onboarding/backupRequest.html:12 +msgid "Do it later" +msgstr "" + +#: www/views/tab-export-file.html:29 +msgid "Do not include private key" +msgstr "" + +#: www/views/preferencesLanguage.html:21 +msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." +msgstr "" + +#: www/views/tab-export-file.html:59 +#: www/views/tab-home.html:22 +msgid "Download" +msgstr "" + +#: www/views/cashScan.html:37 +msgid "Duplicate for BCH" +msgstr "" + +#: src/js/services/onGoingProcess.js:49 +msgid "Duplicating wallet..." +msgstr "" + +#: www/views/addresses.html:19 +msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." +msgstr "" + +#: src/js/services/feeService.js:13 +msgid "Economy" +msgstr "" + +#: www/views/onboarding/collectEmail.html:27 +msgid "Edit" +msgstr "" + +#: www/views/addressbook.add.html:29 +#: www/views/addressbook.view.html:22 +msgid "Email" +msgstr "" + +#: www/views/preferencesNotifications.html:42 +msgid "Email Address" +msgstr "" + +#: src/js/services/bwcError.js:122 +msgid "Empty addresses limit reached. New addresses cannot be generated." +msgstr "" + +#: www/views/preferencesCash.html:17 +msgid "Enable Bitcoin Cash wallet creation and operation within the App." +msgstr "" + +#: www/views/tab-scan.html:19 +msgid "Enable camera access in your device settings to get started." +msgstr "" + +#: www/views/preferencesNotifications.html:29 +msgid "Enable email notifications" +msgstr "" + +#: www/views/preferencesNotifications.html:12 +msgid "Enable push notifications" +msgstr "" + +#: www/views/preferencesNotifications.html:33 +msgid "Enable sound" +msgstr "" + +#: www/views/tab-scan.html:18 +msgid "Enable the camera to get started." +msgstr "" + +#: www/views/tab-settings.html:49 +msgid "Enabled" +msgstr "" + +#: src/js/services/walletService.js:1047 +#: src/js/services/walletService.js:1062 +msgid "Enter Spending Password" +msgstr "" + +#: src/js/services/bitpayAccountService.js:110 +msgid "Enter Two Factor for your BitPay account" +msgstr "" + +#: www/views/amount.html:4 +msgid "Enter amount" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:41 +msgid "Enter custom fee" +msgstr "" + +#: src/js/services/walletService.js:1029 +msgid "Enter new spending password" +msgstr "" + +#: www/views/join.html:79 +#: www/views/tab-create-personal.html:51 +#: www/views/tab-create-shared.html:80 +msgid "Enter the recovery phrase (BIP39)" +msgstr "" + +#: www/views/onboarding/collectEmail.html:13 +msgid "Enter your email" +msgstr "" + +#: www/views/backup.html:69 +msgid "Enter your password" +msgstr "" + +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/activity.js:45 +#: src/js/controllers/addressbookAdd.js:30 +#: src/js/controllers/addressbookView.js:42 +#: src/js/controllers/addresses.js:125 +#: src/js/controllers/addresses.js:126 +#: src/js/controllers/bitpayCard.js:66 +#: src/js/controllers/bitpayCardIntro.js:40 +#: src/js/controllers/bitpayCardIntro.js:81 +#: src/js/controllers/buyAmazon.js:24 +#: src/js/controllers/buyAmazon.js:35 +#: src/js/controllers/buyMercadoLibre.js:24 +#: src/js/controllers/buyMercadoLibre.js:35 +#: src/js/controllers/confirm.js:307 +#: src/js/controllers/copayers.js:67 +#: src/js/controllers/create.js:161 +#: src/js/controllers/create.js:174 +#: src/js/controllers/create.js:180 +#: src/js/controllers/create.js:186 +#: src/js/controllers/create.js:208 +#: src/js/controllers/create.js:215 +#: src/js/controllers/create.js:233 +#: src/js/controllers/export.js:109 +#: src/js/controllers/export.js:115 +#: src/js/controllers/export.js:126 +#: src/js/controllers/export.js:154 +#: src/js/controllers/export.js:160 +#: src/js/controllers/export.js:171 +#: src/js/controllers/export.js:47 +#: src/js/controllers/export.js:53 +#: src/js/controllers/feedback/send.js:23 +#: src/js/controllers/import.js:119 +#: src/js/controllers/import.js:131 +#: src/js/controllers/import.js:149 +#: src/js/controllers/import.js:200 +#: src/js/controllers/import.js:229 +#: src/js/controllers/import.js:238 +#: src/js/controllers/import.js:254 +#: src/js/controllers/import.js:266 +#: src/js/controllers/import.js:278 +#: src/js/controllers/import.js:288 +#: src/js/controllers/import.js:312 +#: src/js/controllers/import.js:325 +#: src/js/controllers/import.js:335 +#: src/js/controllers/import.js:345 +#: src/js/controllers/import.js:369 +#: src/js/controllers/import.js:382 +#: src/js/controllers/import.js:85 +#: src/js/controllers/import.js:98 +#: src/js/controllers/join.js:125 +#: src/js/controllers/join.js:139 +#: src/js/controllers/join.js:145 +#: src/js/controllers/join.js:151 +#: src/js/controllers/join.js:174 +#: src/js/controllers/join.js:182 +#: src/js/controllers/join.js:200 +#: src/js/controllers/modals/feeLevels.js:9 +#: src/js/controllers/modals/txpDetails.js:140 +#: src/js/controllers/paperWallet.js:47 +#: src/js/controllers/preferencesBitpayCard.js:20 +#: src/js/controllers/preferencesBitpayServices.js:33 +#: src/js/controllers/preferencesBitpayServices.js:50 +#: src/js/controllers/preferencesDelete.js:36 +#: src/js/controllers/preferencesExternal.js:20 +#: src/js/controllers/tab-home.js:174 +#: src/js/controllers/tab-send.js:143 +#: src/js/controllers/tabsController.js:36 +#: src/js/controllers/tabsController.js:7 +#: src/js/controllers/topup.js:21 +#: src/js/controllers/topup.js:32 +#: src/js/controllers/tx-details.js:119 +#: src/js/services/incomingData.js:101 +#: src/js/services/incomingData.js:125 +#: src/js/services/incomingData.js:168 +#: www/views/mercadoLibreCards.html:19 +#: www/views/modals/mercadolibre-card-details.html:45 +msgid "Error" +msgstr "" + +#: src/js/controllers/confirm.js:502 +msgid "Error at confirm" +msgstr "" + +#: src/js/controllers/buyAmazon.js:179 +msgid "Error creating gift card" +msgstr "" + +#: src/js/controllers/buyAmazon.js:94 +#: src/js/controllers/buyMercadoLibre.js:94 +msgid "Error creating the invoice" +msgstr "" + +#: src/js/services/profileService.js:412 +msgid "Error creating wallet" +msgstr "" + +#: src/js/controllers/confirm.js:296 +msgid "Error getting SendMax information" +msgstr "" + +#: src/js/controllers/buyAmazon.js:136 +#: src/js/controllers/buyMercadoLibre.js:136 +#: src/js/controllers/topup.js:114 +msgid "Error in Payment Protocol" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:14 +msgid "Error pairing BitPay Account" +msgstr "" + +#: src/js/controllers/paperWallet.js:41 +msgid "Error scanning funds:" +msgstr "" + +#: src/js/controllers/paperWallet.js:90 +msgid "Error sweeping wallet:" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:20 +msgid "Error updating Debit Cards" +msgstr "" + +#: src/js/services/bwcError.js:143 +msgid "Exceeded daily limit of $500 per user" +msgstr "" + +#: src/js/controllers/confirm.js:461 +#: www/views/confirm.html:27 +#: www/views/mercadoLibreCards.html:25 +#: www/views/modals/mercadolibre-card-details.html:34 +#: www/views/modals/txp-details.html:119 +msgid "Expired" +msgstr "" + +#: www/views/modals/paypro.html:54 +#: www/views/modals/txp-details.html:125 +msgid "Expires" +msgstr "" + +#: www/views/preferencesAdvanced.html:21 +msgid "Export Wallet" +msgstr "" + +#: www/views/preferencesHistory.html:11 +#: www/views/preferencesHistory.html:14 +msgid "Export to file" +msgstr "" + +#: www/views/export.html:3 +msgid "Export wallet" +msgstr "" + +#: src/js/services/walletService.js:1174 +#: www/views/tab-export-qrCode.html:9 +msgid "Exporting via QR not supported for this wallet" +msgstr "" + +#: www/views/preferencesInformation.html:89 +msgid "Extended Public Keys" +msgstr "" + +#: src/js/services/onGoingProcess.js:20 +msgid "Extracting Wallet information..." +msgstr "" + +#: src/js/controllers/export.js:115 +#: src/js/controllers/export.js:126 +#: src/js/controllers/export.js:160 +#: src/js/controllers/export.js:171 +#: www/views/tab-export-file.html:4 +msgid "Failed to export" +msgstr "" + +#: www/views/tab-create-personal.html:14 +#: www/views/tab-create-shared.html:14 +msgid "Family vacation funds" +msgstr "" + +#: www/views/tx-details.html:79 +msgid "Fee" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:75 +msgid "Fee level" +msgstr "" + +#: src/js/controllers/modals/feeLevels.js:100 +msgid "Fee level is not defined" +msgstr "" + +#: www/views/confirm.html:79 +#: www/views/modals/txp-details.html:99 +msgid "Fee:" +msgstr "" + +#: src/js/controllers/feedback/send.js:23 +msgid "Feedback could not be submitted. Please try again later." +msgstr "" + +#: src/js/services/onGoingProcess.js:42 +msgid "Fetching BitPay Account..." +msgstr "" + +#: src/js/services/onGoingProcess.js:21 +msgid "Fetching payment information" +msgstr "" + +#: www/views/export.html:14 +#: www/views/import.html:16 +msgid "File/Text" +msgstr "" + +#: www/views/preferencesLogs.html:17 +msgid "Filter setting" +msgstr "" + +#: src/js/services/fingerprintService.js:43 +#: src/js/services/fingerprintService.js:48 +msgid "Finger Scan Failed" +msgstr "" + +#: src/js/controllers/feedback/send.js:34 +#: www/views/feedback/complete.html:7 +msgid "Finish" +msgstr "" + +#: www/views/tab-create-personal.html:123 +#: www/views/tab-create-shared.html:152 +msgid "For audit purposes" +msgstr "" + +#: src/js/controllers/topup.js:308 +#: www/views/buyAmazon.html:29 +#: www/views/buyMercadoLibre.html:28 +#: www/views/confirm.html:65 +#: www/views/modals/txp-details.html:74 +#: www/views/topup.html:34 +#: www/views/tx-details.html:52 +msgid "From" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:71 +msgid "From BitPay account" +msgstr "" + +#: www/views/tab-import-phrase.html:57 +msgid "From Hardware Wallet" +msgstr "" + +#: www/views/tab-export-qrCode.html:5 +msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" +msgstr "" + +#: src/js/services/bwcError.js:74 +msgid "Funds are locked by pending spend proposals" +msgstr "" + +#: www/views/paperWallet.html:16 +msgid "Funds found:" +msgstr "" + +#: www/views/topup.html:49 +msgid "Funds to be added" +msgstr "" + +#: www/views/paperWallet.html:51 +msgid "Funds transferred" +msgstr "" + +#: www/views/topup.html:103 +msgid "Funds were added to debit card" +msgstr "" + +#: www/views/paperWallet.html:22 +msgid "Funds will be transferred to" +msgstr "" + +#: www/views/tab-receive.html:51 +msgid "Generate new address" +msgstr "" + +#: src/js/services/onGoingProcess.js:22 +msgid "Generating .csv file..." +msgstr "" + +#: src/js/services/onGoingProcess.js:37 +msgid "Generating new address..." +msgstr "" + +#: www/views/bitpayCardIntro.html:23 +msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." +msgstr "" + +#: www/views/onboarding/collectEmail.html:15 +msgid "Get news and updates from BitPay" +msgstr "" + +#: www/views/onboarding/welcome.html:8 +msgctxt "button" +msgid "Get started" +msgstr "" + +#: www/views/bitpayCard.html:49 +msgid "Get started" +msgstr "" + +#: www/views/addressbook.html:20 +msgid "Get started by adding your first one." +msgstr "" + +#: src/js/services/onGoingProcess.js:23 +msgid "Getting fee levels..." +msgstr "" + +#: www/views/buyAmazon.html:43 +#: www/views/buyMercadoLibre.html:42 +msgid "Gift Card" +msgstr "" + +#: www/views/modals/mercadolibre-card-details.html:30 +#: www/views/modals/mercadolibre-card-details.html:35 +msgid "Gift Card is not available to use anymore" +msgstr "" + +#: src/js/controllers/buyAmazon.js:204 +msgid "Gift card expired" +msgstr "" + +#: www/views/buyAmazon.html:111 +msgid "Gift card generated and ready to use." +msgstr "" + +#: src/js/controllers/bitpayCard.js:114 +#: src/js/controllers/bitpayCard.js:124 +#: src/js/controllers/cashScan.js:20 +#: src/js/controllers/onboarding/terms.js:23 +#: src/js/controllers/preferences.js:67 +#: src/js/controllers/preferencesAbout.js:16 +#: src/js/controllers/preferencesCash.js:34 +#: src/js/controllers/preferencesLanguage.js:14 +#: src/js/controllers/tab-home.js:149 +#: src/js/controllers/tab-settings.js:53 +#: src/js/controllers/tx-details.js:193 +#: src/js/controllers/tx-details.js:56 +msgid "Go Back" +msgstr "" + +#: src/js/controllers/confirm.js:131 +#: src/js/controllers/onboarding/backupRequest.js:20 +#: src/js/controllers/onboarding/backupRequest.js:26 +#: src/js/services/bitpayAccountService.js:84 +msgid "Go back" +msgstr "" + +#: www/views/backupWarning.html:15 +#: www/views/includes/confirmBackupPopup.html:8 +#: www/views/onboarding/tour.html:23 +msgid "Got it" +msgstr "" + +#: www/views/preferencesInformation.html:53 +#: www/views/preferencesInformation.html:59 +msgid "Hardware Wallet" +msgstr "" + +#: www/views/preferencesExternal.html:18 +msgid "Hardware not connected." +msgstr "" + +#: www/views/import.html:20 +msgid "Hardware wallet" +msgstr "" + +#: src/js/controllers/create.js:180 +#: src/js/controllers/join.js:145 +msgid "Hardware wallets are not yet supported with Bitcoin Cash" +msgstr "" + +#: www/views/tab-settings.html:20 +msgid "Help & Support" +msgstr "" + +#: src/js/controllers/bitpayCard.js:112 +#: src/js/controllers/tab-settings.js:51 +msgid "Help and support information is available at the website." +msgstr "" + +#: www/views/addresses.html:25 +msgid "Hide" +msgstr "" + +#: www/views/preferences.html:27 +msgid "Hide Balance" +msgstr "" + +#: www/views/advancedSettings.html:30 +msgid "Hide Next Steps Card" +msgstr "" + +#: www/views/join.html:49 +#: www/views/tab-create-personal.html:28 +#: www/views/tab-create-shared.html:57 +#: www/views/tab-export-file.html:25 +#: www/views/tab-import-file.html:30 +#: www/views/tab-import-hardware.html:31 +#: www/views/tab-import-phrase.html:36 +msgid "Hide advanced options" +msgstr "" + +#: www/views/tabs.html:3 +msgid "Home" +msgstr "" + +#: src/js/controllers/feedback/send.js:61 +#: src/js/controllers/feedback/send.js:65 +#: src/js/controllers/feedback/send.js:69 +msgid "How could we improve your experience?" +msgstr "" + +#: www/views/feedback/rateCard.html:3 +msgid "How do you like {{appName}}?" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:29 +msgid "I don't like it" +msgstr "" + +#: www/views/onboarding/disclaimer.html:43 +msgid "I have read, understood, and agree to the Terms of Use." +msgstr "" + +#: www/views/modals/terms.html:22 +msgid "I have read, understood, and agree with the Terms of use." +msgstr "" + +#: www/views/join.html:137 +#: www/views/tab-create-personal.html:107 +#: www/views/tab-create-shared.html:136 +msgid "I have written it down" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:35 +msgid "I like the app" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:26 +msgid "I think this app is terrible." +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:19 +#: www/views/includes/screenshotWarningModal.html:9 +msgid "I understand" +msgstr "" + +#: www/views/onboarding/disclaimer.html:21 +msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." +msgstr "" + +#: www/views/onboarding/disclaimer.html:18 +msgid "I understand that my funds are held securely on this device, not by a company." +msgstr "" + +#: www/views/backup.html:36 +msgid "I've written it down" +msgstr "" + +#: www/views/preferences.html:45 +msgid "If enabled, all sensitive information (private key and recovery phrase) and actions (spending and exporting) associated with this wallet will be protected." +msgstr "" + +#: www/views/advancedSettings.html:23 +msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." +msgstr "" + +#: www/views/advancedSettings.html:14 +msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:18 +msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." +msgstr "" + +#: www/views/feedback/complete.html:23 +msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." +msgstr "" + +#: www/views/includes/screenshotWarningModal.html:8 +msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." +msgstr "" + +#: www/views/tab-import-hardware.html:42 +#: www/views/tab-import-phrase.html:80 +msgid "Import" +msgstr "" + +#: www/views/import.html:3 +msgid "Import Wallet" +msgstr "" + +#: www/views/tab-import-file.html:41 +msgid "Import backup" +msgstr "" + +#: www/views/add.html:38 +msgid "Import wallet" +msgstr "" + +#: src/js/services/onGoingProcess.js:24 +msgid "Importing Wallet..." +msgstr "" + +#: www/views/backup.html:72 +msgid "In order to verify your wallet backup, please type your password." +msgstr "" + +#: www/views/mercadoLibreCards.html:24 +#: www/views/modals/mercadolibre-card-details.html:29 +msgid "Inactive" +msgstr "" + +#: www/views/includes/walletItem.html:9 +#: www/views/includes/walletList.html:6 +#: www/views/includes/walletListSettings.html:9 +#: www/views/includes/walletSelector.html:16 +msgid "Incomplete" +msgstr "" + +#: www/views/tab-receive.html:22 +msgid "Incomplete wallet" +msgstr "" + +#: www/views/modals/pin.html:12 +msgid "Incorrect PIN, try again." +msgstr "" + +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/import.js:85 +msgid "Incorrect code format" +msgstr "" + +#: src/js/services/bwcError.js:113 +msgid "Incorrect network address" +msgstr "" + +#: src/js/controllers/confirm.js:114 +#: src/js/controllers/confirm.js:306 +#: src/js/services/bwcError.js:44 +msgid "Insufficient confirmed funds" +msgstr "" + +#: src/js/controllers/topup.js:165 +#: src/js/controllers/topup.js:177 +#: src/js/services/bwcError.js:71 +msgid "Insufficient funds for fee" +msgstr "" + +#: www/views/tab-settings.html:123 +msgid "Integrations" +msgstr "" + +#: www/views/includes/walletHistory.html:49 +msgid "Invalid" +msgstr "" + +#: src/js/controllers/buyAmazon.js:137 +#: src/js/controllers/buyMercadoLibre.js:137 +#: src/js/controllers/topup.js:115 +msgid "Invalid URL" +msgstr "" + +#: src/js/controllers/create.js:186 +#: src/js/controllers/import.js:345 +#: src/js/controllers/join.js:151 +msgid "Invalid account number" +msgstr "" + +#: src/js/services/bwcError.js:119 +msgid "Invalid address" +msgstr "" + +#: src/js/controllers/tabsController.js:7 +msgid "Invalid data" +msgstr "" + +#: src/js/controllers/create.js:161 +#: src/js/controllers/import.js:266 +#: src/js/controllers/join.js:125 +msgid "Invalid derivation path" +msgstr "" + +#: src/js/controllers/copayers.js:90 +msgid "Invitation to share a {{appName}} Wallet" +msgstr "" + +#: www/views/mercadoLibreCards.html:20 +#: www/views/modals/mercadolibre-card-details.html:48 +msgid "Invoice expired" +msgstr "" + +#: src/js/controllers/feedback/send.js:79 +msgid "Is there anything we could do better?" +msgstr "" + +#: www/views/backup.html:54 +msgid "Is this correct?" +msgstr "" + +#: www/views/onboarding/collectEmail.html:22 +msgid "Is this email address correct?" +msgstr "" + +#: www/views/addresses.html:25 +msgid "It's a good idea to avoid reusing addresses - this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." +msgstr "" + +#: src/js/controllers/backup.js:76 +msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." +msgstr "" + +#: www/views/join.html:151 +msgid "Join" +msgstr "" + +#: src/js/controllers/copayers.js:85 +msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" +msgstr "" + +#: www/views/add.html:30 +#: www/views/join.html:5 +msgid "Join shared wallet" +msgstr "" + +#: src/js/services/onGoingProcess.js:25 +msgid "Joining Wallet..." +msgstr "" + +#: www/views/onboarding/tour.html:22 +msgid "Just scan the code to pay." +msgstr "" + +#: src/js/services/bwcError.js:116 +msgid "Key already associated with an existing wallet" +msgstr "" + +#: www/views/preferencesLanguage.html:4 +#: www/views/tab-settings.html:68 +msgid "Language" +msgstr "" + +#: www/views/bitpayCard.html:61 +msgid "Last Month" +msgstr "" + +#: src/js/controllers/confirm.js:132 +#: www/views/preferences.html:48 +#: www/views/preferencesCash.html:18 +#: www/views/tx-details.html:94 +msgid "Learn more" +msgstr "" + +#: www/views/backup.html:43 +msgid "Let's verify your backup phrase." +msgstr "" + +#: www/views/addresses.html:45 +#: www/views/allAddresses.html:14 +msgid "Loading addresses..." +msgstr "" + +#: src/js/services/onGoingProcess.js:35 +msgid "Loading transaction info..." +msgstr "" + +#: www/views/tab-settings.html:100 +msgid "Lock App" +msgstr "" + +#: src/js/controllers/lockSetup.js:23 +msgid "Lock by Fingerprint" +msgstr "" + +#: src/js/controllers/lockSetup.js:14 +msgid "Lock by PIN" +msgstr "" + +#: www/views/modals/wallet-balance.html:80 +msgid "Locked" +msgstr "" + +#: src/js/services/bwcError.js:86 +msgid "Locktime in effect. Please wait to create a new spend proposal" +msgstr "" + +#: src/js/services/bwcError.js:89 +msgid "Locktime in effect. Please wait to remove this spend proposal" +msgstr "" + +#: www/views/includes/logOptions.html:3 +msgid "Log options" +msgstr "" + +#: www/views/modals/bitpay-card-confirmation.html:14 +msgid "Log out" +msgstr "" + +#: www/views/addresses.html:87 +msgid "Low amount inputs" +msgstr "" + +#: www/views/includes/walletHistory.html:27 +msgid "Low fees" +msgstr "" + +#: www/views/onboarding/tour.html:38 +msgid "Makes sense" +msgstr "" + +#: src/js/controllers/modals/search.js:61 +msgid "Matches:" +msgstr "" + +#: www/views/includes/copayers.html:4 +#: www/views/preferencesInformation.html:85 +msgid "Me" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:32 +msgid "Meh - it's alright" +msgstr "" + +#: src/js/controllers/tx-details.js:165 +#: www/views/modals/paypro.html:48 +#: www/views/modals/txp-details.html:93 +#: www/views/tx-details.html:72 +msgid "Memo" +msgstr "" + +#: www/views/mercadoLibre.html:6 +msgid "Mercado Livre Brazil Gift Cards" +msgstr "" + +#: src/js/controllers/buyMercadoLibre.js:98 +msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later." +msgstr "" + +#: www/views/modals/txp-details.html:131 +msgid "Merchant Message" +msgstr "" + +#: www/views/buyAmazon.html:55 +#: www/views/buyMercadoLibre.html:54 +#: www/views/topup.html:63 +msgid "Miner Fee" +msgstr "" + +#: src/js/services/bwcError.js:134 +msgid "Missing parameter" +msgstr "" + +#: src/js/services/bwcError.js:32 +msgid "Missing private keys to sign" +msgstr "" + +#: www/views/preferences.html:61 +#: www/views/preferencesAdvanced.html:3 +msgid "More Options" +msgstr "" + +#: www/views/includes/walletHistory.html:47 +#: www/views/tx-details.html:19 +msgid "Moved" +msgstr "" + +#: src/js/controllers/tx-details.js:131 +msgid "Moved Funds" +msgstr "" + +#: www/views/modals/txp-details.html:57 +msgid "Multiple recipients" +msgstr "" + +#: www/views/tab-import-phrase.html:8 +msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." +msgstr "" + +#: www/views/addressbook.add.html:21 +#: www/views/addressbook.view.html:18 +#: www/views/preferences.html:15 +#: www/views/preferencesAlias.html:17 +msgid "Name" +msgstr "" + +#: www/views/buyAmazon.html:49 +#: www/views/buyMercadoLibre.html:48 +#: www/views/topup.html:56 +msgid "Network Cost" +msgstr "" + +#: src/js/services/bwcError.js:47 +msgid "Network error" +msgstr "" + +#: www/views/includes/walletActivity.html:43 +msgid "New Proposal" +msgstr "" + +#: src/js/controllers/addresses.js:126 +msgid "New address could not be generated. Please try again." +msgstr "" + +#: www/views/add.html:14 +msgid "New personal wallet" +msgstr "" + +#: www/views/includes/nextSteps.html:3 +msgid "Next steps" +msgstr "" + +#: www/views/tab-receive.html:16 +msgid "No Wallet" +msgstr "" + +#: src/js/controllers/buyAmazon.js:115 +#: src/js/controllers/buyMercadoLibre.js:115 +msgid "No access key defined" +msgstr "" + +#: www/views/onboarding/backupRequest.html:5 +msgid "No backup, no bitcoin." +msgstr "" + +#: www/views/addressbook.html:19 +msgid "No contacts yet" +msgstr "" + +#: www/views/preferencesLogs.html:16 +msgid "No entries for this log level" +msgstr "" + +#: www/views/preferencesExternal.html:12 +msgid "No hardware information available." +msgstr "" + +#: www/views/tab-import-hardware.html:3 +msgid "No hardware wallets supported on this device" +msgstr "" + +#: www/views/proposals.html:24 +msgid "No pending proposals" +msgstr "" + +#: www/views/activity.html:25 +msgid "No recent transactions" +msgstr "" + +#: src/js/controllers/buyAmazon.js:44 +#: src/js/controllers/topup.js:47 +msgid "No signing proposal: No private key" +msgstr "" + +#: www/views/walletDetails.html:204 +msgid "No transactions yet" +msgstr "" + +#: src/js/controllers/preferencesDelete.js:15 +msgid "No wallet found" +msgstr "" + +#: src/js/controllers/preferencesDelete.js:8 +msgid "No wallet selected" +msgstr "" + +#: src/js/controllers/buyAmazon.js:300 +#: src/js/controllers/buyMercadoLibre.js:292 +#: src/js/controllers/confirm.js:85 +#: src/js/controllers/topup.js:265 +msgid "No wallets available" +msgstr "" + +#: www/views/paperWallet.html:45 +msgid "No wallets available to receive funds" +msgstr "" + +#: www/views/cashScan.html:15 +msgid "No wallets eligible for Bitcoin Cash support" +msgstr "" + +#: src/js/controllers/cashScan.js:58 +msgid "Non BIP44 wallet" +msgstr "" + +#: www/views/cashScan.html:46 +msgid "Non eligible BTC wallets" +msgstr "" + +#: src/js/services/feeService.js:12 +msgid "Normal" +msgstr "" + +#: src/js/services/bwcError.js:80 +msgid "Not authorized" +msgstr "" + +#: src/js/controllers/confirm.js:307 +msgid "Not enough funds for fee" +msgstr "" + +#: www/views/onboarding/tour.html:50 +msgid "Not even BitPay can access it." +msgstr "" + +#: src/js/controllers/paperWallet.js:47 +msgid "Not funds found" +msgstr "" + +#: www/views/feedback/rateApp.html:3 +#: www/views/onboarding/notifications.html:8 +msgid "Not now" +msgstr "" + +#: www/views/includes/output.html:15 +msgid "Note" +msgstr "" + +#: www/views/backup.html:19 +msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase." +msgstr "" + +#: www/views/modals/wallets.html:25 +msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" +msgstr "" + +#: www/views/preferencesNotifications.html:3 +#: www/views/tab-settings.html:61 +msgid "Notifications" +msgstr "" + +#: www/views/onboarding/collectEmail.html:9 +msgid "Notifications by email" +msgstr "" + +#: www/views/tx-details.html:117 +msgid "Notify me if confirmed" +msgstr "" + +#: www/views/preferencesNotifications.html:24 +msgid "Notify me when transactions are confirmed" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:8 +msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." +msgstr "" + +#: www/views/backupWarning.html:11 +msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" +msgstr "" + +#: src/js/controllers/buyAmazon.js:312 +#: src/js/controllers/topup.js:286 +#: src/js/services/incomingData.js:153 +#: src/js/services/popupService.js:16 +#: src/js/services/popupService.js:52 +#: src/js/services/popupService.js:61 +#: src/js/services/popupService.js:72 +#: www/views/modals/chooseFeeLevel.html:6 +msgid "OK" +msgstr "" + +#: www/views/modals/tx-status.html:12 +#: www/views/modals/tx-status.html:24 +#: www/views/modals/tx-status.html:36 +#: www/views/modals/tx-status.html:46 +msgid "OKAY" +msgstr "" + +#: www/views/modals/terms.html:15 +msgid "Official English Disclaimer" +msgstr "" + +#: src/js/controllers/feedback/send.js:64 +msgid "Oh no!" +msgstr "" + +#: src/js/controllers/buyMercadoLibre.js:306 +msgid "Ok" +msgstr "" + +#: www/views/tab-home.html:39 +msgid "On this screen you can see all your wallets, accounts, and assets." +msgstr "" + +#: src/js/controllers/bitpayCard.js:113 +#: src/js/controllers/cashScan.js:19 +#: src/js/controllers/preferences.js:66 +#: src/js/controllers/preferencesCash.js:33 +#: src/js/controllers/tab-settings.js:52 +#: src/js/controllers/tx-details.js:55 +msgid "Open" +msgstr "" + +#: src/js/controllers/preferencesLanguage.js:13 +msgid "Open Crowdin" +msgstr "" + +#: src/js/controllers/preferencesAbout.js:15 +msgid "Open GitHub" +msgstr "" + +#: src/js/controllers/preferencesAbout.js:13 +msgid "Open GitHub Project" +msgstr "" + +#: src/js/controllers/bitpayCard.js:123 +#: src/js/controllers/tx-details.js:192 +msgid "Open Explorer" +msgstr "" + +#: www/views/tab-scan.html:22 +msgid "Open Settings" +msgstr "" + +#: src/js/controllers/preferencesLanguage.js:11 +msgid "Open Translation Community" +msgstr "" + +#: src/js/controllers/onboarding/terms.js:22 +msgid "Open Website" +msgstr "" + +#: src/js/controllers/preferencesCash.js:32 +msgid "Open bitcoincash.org?" +msgstr "" + +#: src/js/controllers/cashScan.js:18 +msgid "Open the recovery tool." +msgstr "" + +#: www/views/tab-receive.html:27 +msgid "Open wallet" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:19 +msgid "Open website" +msgstr "" + +#: www/views/bitpayCardIntro.html:34 +msgid "Order the BitPay Card" +msgstr "" + +#: www/views/join.html:105 +#: www/views/join.html:96 +#: www/views/tab-create-personal.html:69 +#: www/views/tab-create-personal.html:77 +#: www/views/tab-create-shared.html:106 +#: www/views/tab-create-shared.html:98 +#: www/views/tab-import-file.html:18 +#: www/views/tab-import-phrase.html:41 +msgid "Password" +msgstr "" + +#: src/js/controllers/import.js:98 +msgid "Password required. Make sure to enter your password in advanced options" +msgstr "" + +#: www/views/join.html:33 +msgid "Paste invitation here" +msgstr "" + +#: www/views/tab-import-file.html:13 +msgid "Paste the backup plain text code" +msgstr "" + +#: www/views/bitpayCardIntro.html:28 +msgid "Pay 0% fees to turn bitcoin into dollars." +msgstr "" + +#: www/views/modals/paypro.html:18 +msgid "Pay To" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:51 +#: www/views/modals/tx-status.html:33 +msgid "Payment Accepted" +msgstr "" + +#: www/views/confirm.html:25 +msgid "Payment Expires:" +msgstr "" + +#: www/views/modals/txp-details.html:6 +msgid "Payment Proposal" +msgstr "" + +#: www/views/modals/tx-status.html:21 +msgid "Payment Proposal Created" +msgstr "" + +#: www/views/tab-home.html:46 +msgid "Payment Proposals" +msgstr "" + +#: src/js/services/payproService.js:32 +msgid "Payment Protocol Invalid" +msgstr "" + +#: src/js/services/payproService.js:18 +msgid "Payment Protocol not supported on Chrome App" +msgstr "" + +#: www/views/includes/walletActivity.html:20 +msgid "Payment Received" +msgstr "" + +#: www/views/modals/tx-status.html:43 +#: www/views/modals/txp-details.html:43 +msgid "Payment Rejected" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:44 +#: www/views/confirm.html:124 +#: www/views/includes/walletActivity.html:11 +#: www/views/modals/txp-details.html:42 +msgid "Payment Sent" +msgstr "" + +#: www/views/modals/txp-details.html:32 +msgid "Payment accepted, but not yet broadcasted" +msgstr "" + +#: www/views/modals/txp-details.html:40 +msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." +msgstr "" + +#: src/js/services/incomingData.js:152 +msgid "Payment address was translated to new Bitcoin Cash address format:" +msgstr "" + +#: www/views/modals/txp-details.html:107 +msgid "Payment details" +msgstr "" + +#: www/views/modals/paypro.html:6 +msgid "Payment request" +msgstr "" + +#: www/views/mercadoLibreCards.html:22 +#: www/views/modals/mercadolibre-card-details.html:39 +msgid "Pending" +msgstr "" + +#: www/views/proposals.html:4 +msgid "Pending Proposals" +msgstr "" + +#: www/views/preferencesDeleteWallet.html:13 +msgid "Permanently delete this wallet." +msgstr "" + +#: src/js/services/profileService.js:403 +msgid "Personal Wallet" +msgstr "" + +#: www/views/backup.html:25 +msgid "Please carefully write down this phrase." +msgstr "" + +#: www/views/tab-scan.html:20 +msgid "Please connect a camera to get started." +msgstr "" + +#: src/js/controllers/import.js:278 +msgid "Please enter the recovery phrase" +msgstr "" + +#: src/js/controllers/create.js:174 +#: src/js/controllers/join.js:139 +msgid "Please enter the wallet recovery phrase" +msgstr "" + +#: www/views/modals/pin.html:9 +msgid "Please enter your PIN" +msgstr "" + +#: www/views/backup.html:53 +msgid "Please tap each word in the correct order." +msgstr "" + +#: src/js/services/bwcError.js:101 +msgid "Please upgrade Copay to perform this action" +msgstr "" + +#: www/views/walletDetails.html:142 +#: www/views/walletDetails.html:62 +msgid "Please wait" +msgstr "" + +#: src/js/controllers/import.js:238 +msgid "Please, select your backup file" +msgstr "" + +#: www/views/bitpayCard.html:81 +msgid "Pre-Auth Holds" +msgstr "" + +#: www/views/tab-settings.html:40 +msgid "Preferences" +msgstr "" + +#: src/js/services/onGoingProcess.js:38 +msgid "Preparing addresses..." +msgstr "" + +#: src/js/controllers/export.js:198 +msgid "Preparing backup..." +msgstr "" + +#: src/js/routes.js:1264 +msgid "Press again to exit" +msgstr "" + +#: src/js/services/feeService.js:11 +msgid "Priority" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:80 +msgid "Private Key" +msgstr "" + +#: src/js/controllers/paperWallet.js:136 +msgid "Private key encrypted. Enter password" +msgstr "" + +#: src/js/services/bwcError.js:35 +msgid "Private key is encrypted, cannot sign" +msgstr "" + +#: www/views/includes/walletActivity.html:51 +msgid "Proposal Accepted" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:61 +#: src/js/controllers/tx-details.js:78 +#: www/views/confirm.html:125 +msgid "Proposal Created" +msgstr "" + +#: www/views/includes/walletActivity.html:27 +msgid "Proposal Deleted" +msgstr "" + +#: www/views/includes/walletActivity.html:35 +msgid "Proposal Rejected" +msgstr "" + +#: www/views/walletDetails.html:189 +msgid "Proposals" +msgstr "" + +#: src/js/controllers/buyAmazon.js:282 +msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" +msgstr "" + +#: src/js/controllers/buyMercadoLibre.js:281 +msgid "Purchase amount must be a value between 50 and 2000" +msgstr "" + +#: www/views/onboarding/notifications.html:3 +msgid "Push Notifications" +msgstr "" + +#: www/views/preferencesNotifications.html:17 +msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." +msgstr "" + +#: www/views/export.html:17 +msgid "QR Code" +msgstr "" + +#: www/views/onboarding/disclaimer.html:13 +msgid "Quick review!" +msgstr "" + +#: src/js/controllers/create.js:84 +#: src/js/controllers/join.js:68 +msgid "Random" +msgstr "" + +#: www/views/feedback/rateApp.html:14 +msgid "Rate on the app store" +msgstr "" + +#: www/views/addresses.html:52 +msgid "Read less" +msgstr "" + +#: www/views/addresses.html:51 +msgid "Read more" +msgstr "" + +#: src/js/controllers/preferences.js:65 +#: src/js/controllers/tx-details.js:54 +msgid "Read more in our Wiki" +msgstr "" + +#: src/js/controllers/cashScan.js:61 +msgid "Read only wallet" +msgstr "" + +#: www/views/tab-receive.html:3 +#: www/views/tabs.html:7 +msgid "Receive" +msgstr "" + +#: www/views/customAmount.html:44 +msgid "Receive in" +msgstr "" + +#: www/views/includes/walletHistory.html:24 +#: www/views/tx-details.html:18 +msgid "Received" +msgstr "" + +#: src/js/controllers/tx-details.js:130 +msgid "Received Funds" +msgstr "" + +#: www/views/includes/walletHistory.html:57 +#: www/views/tx-details.html:24 +msgid "Receiving" +msgstr "" + +#: www/views/bitpayCard.html:60 +#: www/views/includes/walletHistory.html:3 +msgid "Recent" +msgstr "" + +#: www/views/advancedSettings.html:21 +msgid "Recent Transaction Card" +msgstr "" + +#: www/views/activity.html:4 +#: www/views/tab-home.html:58 +msgid "Recent Transactions" +msgstr "" + +#: www/views/amount.html:18 +#: www/views/tab-send.html:9 +msgid "Recipient" +msgstr "" + +#: www/views/modals/txp-details.html:62 +msgid "Recipients" +msgstr "" + +#: www/views/import.html:12 +msgid "Recovery phrase" +msgstr "" + +#: src/js/services/onGoingProcess.js:26 +msgid "Recreating Wallet..." +msgstr "" + +#: www/views/modals/mercadolibre-card-details.html:22 +msgid "Redeem now" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:63 +#: src/js/controllers/tx-details.js:80 +msgid "Rejected" +msgstr "" + +#: src/js/services/onGoingProcess.js:27 +msgid "Rejecting payment proposal" +msgstr "" + +#: www/views/preferencesAbout.html:9 +msgid "Release information" +msgstr "" + +#: www/views/addressbook.view.html:36 +#: www/views/modals/mercadolibre-card-details.html:69 +msgid "Remove" +msgstr "" + +#: src/js/controllers/preferencesBitpayServices.js:7 +msgid "Remove BitPay Account?" +msgstr "" + +#: src/js/controllers/preferencesBitpayServices.js:19 +msgid "Remove BitPay Card?" +msgstr "" + +#: src/js/controllers/preferencesBitpayServices.js:8 +msgid "Removing your BitPay account will remove all associated BitPay account data from this device. Are you sure you would like to remove your BitPay Account ({{email}}) from this device?" +msgstr "" + +#: www/views/join.html:116 +#: www/views/join.html:124 +#: www/views/tab-create-personal.html:86 +#: www/views/tab-create-personal.html:94 +#: www/views/tab-create-shared.html:115 +#: www/views/tab-create-shared.html:123 +#: www/views/tab-export-file.html:17 +msgid "Repeat password" +msgstr "" + +#: www/views/tab-export-file.html:16 +msgid "Repeat the password" +msgstr "" + +#: www/views/preferences.html:56 +msgid "Request Fingerprint" +msgstr "" + +#: www/views/tab-receive.html:45 +msgid "Request Specific amount" +msgstr "" + +#: www/views/preferences.html:42 +msgid "Request Spending Password" +msgstr "" + +#: www/views/tab-create-shared.html:44 +msgid "Required number of signatures" +msgstr "" + +#: www/views/onboarding/welcome.html:9 +msgid "Restore from backup" +msgstr "" + +#: src/js/services/onGoingProcess.js:29 +msgid "Retrieving inputs information" +msgstr "" + +#: src/js/controllers/onboarding/tour.js:56 +msgid "Retry" +msgstr "" + +#: www/views/tab-scan.html:23 +msgid "Retry Camera" +msgstr "" + +#: www/views/addressbook.add.html:56 +#: www/views/includes/note.html:9 +#: www/views/preferencesAlias.html:21 +#: www/views/preferencesBwsUrl.html:25 +#: www/views/preferencesNotifications.html:46 +msgid "Save" +msgstr "" + +#: www/views/tab-scan.html:3 +#: www/views/tabs.html:11 +msgid "Scan" +msgstr "" + +#: www/views/tab-scan.html:15 +msgid "Scan QR Codes" +msgstr "" + +#: www/views/addresses.html:31 +msgid "Scan addresses for funds" +msgstr "" + +#: www/views/modals/fingerprintCheck.html:11 +msgid "Scan again" +msgstr "" + +#: src/js/services/fingerprintService.js:56 +msgid "Scan your fingerprint please" +msgstr "" + +#: www/views/preferencesCash.html:23 +msgid "Scan your wallets for Bitcoin Cash" +msgstr "" + +#: src/js/services/onGoingProcess.js:30 +msgid "Scanning Wallet funds..." +msgstr "" + +#: www/views/includes/walletList.html:11 +msgid "Scanning funds..." +msgstr "" + +#: www/views/includes/screenshotWarningModal.html:7 +msgid "Screenshots are not secure" +msgstr "" + +#: www/views/modals/search.html:6 +msgid "Search Transactions" +msgstr "" + +#: www/views/tab-send.html:13 +msgid "Search or enter bitcoin address" +msgstr "" + +#: www/views/modals/search.html:16 +msgid "Search transactions" +msgstr "" + +#: www/views/preferencesAltCurrency.html:14 +msgid "Search your currency" +msgstr "" + +#: www/views/preferences.html:30 +msgid "Security" +msgstr "" + +#: www/views/modals/mercadolibre-card-details.html:64 +msgid "See invoice" +msgstr "" + +#: www/views/tab-import-file.html:7 +msgid "Select a backup file" +msgstr "" + +#: src/js/controllers/tab-receive.js:139 +msgid "Select a wallet" +msgstr "" + +#: www/views/modals/paypro.html:38 +msgid "Self-signed Certificate" +msgstr "" + +#: src/js/services/onGoingProcess.js:41 +msgid "Selling Bitcoin..." +msgstr "" + +#: www/views/feedback/send.html:13 +#: www/views/feedback/send.html:43 +#: www/views/tab-send.html:3 +#: www/views/tabs.html:15 +msgid "Send" +msgstr "" + +#: www/views/feedback/send.html:3 +#: www/views/tab-settings.html:29 +msgid "Send Feedback" +msgstr "" + +#: www/views/addressbook.view.html:31 +msgid "Send Money" +msgstr "" + +#: www/views/allAddresses.html:19 +msgid "Send addresses by email" +msgstr "" + +#: www/views/includes/logOptions.html:17 +#: www/views/tab-export-file.html:82 +msgid "Send by email" +msgstr "" + +#: src/js/controllers/confirm.js:177 +msgid "Send from" +msgstr "" + +#: www/views/includes/itemSelector.html:8 +msgid "Send max amount" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:46 +msgid "Send payment to this address" +msgstr "" + +#: www/views/feedback/rateApp.html:17 +msgid "Send us feedback instead" +msgstr "" + +#: www/views/confirm.html:15 +#: www/views/includes/txp.html:12 +#: www/views/modals/txp-details.html:19 +#: www/views/tx-details.html:23 +msgid "Sending" +msgstr "" + +#: src/js/services/onGoingProcess.js:39 +msgid "Sending 2FA code..." +msgstr "" + +#: src/js/services/onGoingProcess.js:36 +msgid "Sending feedback..." +msgstr "" + +#: www/views/confirm.html:16 +msgid "Sending maximum amount" +msgstr "" + +#: src/js/services/onGoingProcess.js:31 +msgid "Sending transaction" +msgstr "" + +#: src/js/controllers/confirm.js:545 +msgid "Sending {{amountStr}} from your {{name}} wallet" +msgstr "" + +#: www/views/includes/walletHistory.html:42 +#: www/views/modals/tx-status.html:9 +#: www/views/topup.html:100 +#: www/views/tx-details.html:17 +msgid "Sent" +msgstr "" + +#: src/js/controllers/tx-details.js:129 +msgid "Sent Funds" +msgstr "" + +#: src/js/services/bwcError.js:38 +msgid "Server response could not be verified" +msgstr "" + +#: src/js/controllers/buyAmazon.js:97 +#: src/js/controllers/buyMercadoLibre.js:97 +msgid "Service not available" +msgstr "" + +#: www/views/includes/homeIntegrations.html:3 +msgid "Services" +msgstr "" + +#: www/views/preferencesLogs.html:3 +msgid "Session Log" +msgstr "" + +#: www/views/preferencesAbout.html:35 +msgid "Session log" +msgstr "" + +#: www/views/tab-export-file.html:10 +msgid "Set up a password" +msgstr "" + +#: src/js/controllers/preferencesFee.js:85 +msgid "Set your own fee in satoshis/byte" +msgstr "" + +#: www/views/tab-settings.html:3 +#: www/views/tabs.html:19 +msgid "Settings" +msgstr "" + +#: www/views/feedback/complete.html:17 +#: www/views/feedback/complete.html:26 +msgid "Share the love by inviting your friends." +msgstr "" + +#: www/views/copayers.html:20 +msgid "Share this invitation with your copayers" +msgstr "" + +#: src/js/controllers/feedback/complete.js:5 +#: www/views/tab-settings.html:36 +msgid "Share {{appName}}" +msgstr "" + +#: www/views/tab-import-hardware.html:24 +msgid "Shared Wallet" +msgstr "" + +#: www/views/preferencesExternal.html:34 +msgid "Show Recovery Phrase" +msgstr "" + +#: www/views/tab-receive.html:34 +msgid "Show address" +msgstr "" + +#: www/views/join.html:48 +#: www/views/tab-create-personal.html:27 +#: www/views/tab-create-shared.html:56 +#: www/views/tab-export-file.html:24 +#: www/views/tab-import-file.html:29 +#: www/views/tab-import-hardware.html:30 +#: www/views/tab-import-phrase.html:35 +msgid "Show advanced options" +msgstr "" + +#: www/views/tab-send.html:37 +msgid "Show bitcoin address" +msgstr "" + +#: www/views/tab-send.html:59 +msgid "Show more" +msgstr "" + +#: src/js/services/bwcError.js:104 +msgid "Signatures rejected by server" +msgstr "" + +#: src/js/services/onGoingProcess.js:32 +msgid "Signing transaction" +msgstr "" + +#: www/views/onboarding/backupRequest.html:6 +msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." +msgstr "" + +#: www/views/tab-create-personal.html:122 +#: www/views/tab-create-shared.html:151 +msgid "Single Address Wallet" +msgstr "" + +#: www/views/onboarding/collectEmail.html:40 +#: www/views/onboarding/tour.html:11 +msgid "Skip" +msgstr "" + +#: src/js/controllers/confirm.js:371 +#: src/js/controllers/modals/txpDetails.js:47 +msgid "Slide to accept" +msgstr "" + +#: www/views/buyAmazon.html:96 +msgid "Slide to buy" +msgstr "" + +#: src/js/controllers/confirm.js:365 +msgid "Slide to pay" +msgstr "" + +#: src/js/controllers/confirm.js:377 +#: src/js/controllers/modals/txpDetails.js:40 +msgid "Slide to send" +msgstr "" + +#: www/views/cashScan.html:56 +msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" +msgstr "" + +#: src/js/controllers/create.js:88 +#: src/js/controllers/join.js:71 +msgid "Specify Recovery Phrase..." +msgstr "" + +#: src/js/services/bwcError.js:92 +msgid "Spend proposal is not accepted" +msgstr "" + +#: src/js/services/bwcError.js:95 +msgid "Spend proposal not found" +msgstr "" + +#: src/js/services/bwcError.js:137 +msgid "Spending Password needed" +msgstr "" + +#: www/views/walletDetails.html:173 +msgid "Spending this balance will need significant Bitcoin network fees" +msgstr "" + +#: www/views/tab-send.html:28 +msgid "Start sending bitcoin" +msgstr "" + +#: www/views/lockSetup.html:3 +msgid "Startup Lock" +msgstr "" + +#: www/views/mercadoLibreCards.html:21 +#: www/views/modals/mercadolibre-card-details.html:42 +msgid "Still pending" +msgstr "" + +#: www/views/topup.html:101 +msgid "Success" +msgstr "" + +#: src/js/services/feeService.js:14 +msgid "Super Economy" +msgstr "" + +#: www/views/preferencesCash.html:11 +msgid "Support Bitcoin Cash" +msgstr "" + +#: www/views/paperWallet.html:7 +msgid "Sweep" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:89 +#: www/views/paperWallet.html:3 +msgid "Sweep paper wallet" +msgstr "" + +#: src/js/services/onGoingProcess.js:33 +msgid "Sweeping Wallet..." +msgstr "" + +#: www/views/preferencesDeleteWallet.html:16 +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "" + +#: www/views/onboarding/welcome.html:5 +msgid "Take control of your money,
get started with bitcoin." +msgstr "" + +#: www/views/walletDetails.html:132 +#: www/views/walletDetails.html:52 +msgid "Tap and hold to show" +msgstr "" + +#: www/views/includes/walletInfo.html:3 +msgid "Tap to recreate" +msgstr "" + +#: www/views/includes/walletInfo.html:4 +msgid "Tap to retry" +msgstr "" + +#: www/views/termsOfUse.html:3 +msgid "Terms Of Use" +msgstr "" + +#: www/views/modals/terms.html:3 +#: www/views/onboarding/disclaimer.html:29 +#: www/views/onboarding/disclaimer.html:43 +#: www/views/preferencesAbout.html:30 +msgid "Terms of Use" +msgstr "" + +#: www/views/tab-create-personal.html:118 +#: www/views/tab-import-phrase.html:68 +msgid "Testnet" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:61 +msgid "Text" +msgstr "" + +#: src/js/controllers/feedback/send.js:27 +#: src/js/controllers/feedback/send.js:76 +#: www/views/feedback/complete.html:20 +#: www/views/feedback/rateApp.html:4 +msgid "Thank you!" +msgstr "" + +#: src/js/controllers/feedback/send.js:72 +msgid "Thanks!" +msgstr "" + +#: src/js/controllers/feedback/send.js:73 +msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" +msgstr "" + +#: src/js/services/ledger.js:152 +msgid "The Ledger Chrome application is not installed" +msgstr "" + +#: www/views/modals/wallet-balance.html:55 +msgid "The amount of bitcoin immediately spendable from this wallet." +msgstr "" + +#: www/views/modals/wallet-balance.html:93 +msgid "The amount of bitcoin stored in this wallet that is allocated as inputs to your pending transaction proposals. The amount is determined using unspent transaction outputs associated with this wallet and may be more than the actual amounts associated with your pending transaction proposals." +msgstr "" + +#: www/views/modals/wallet-balance.html:74 +msgid "The amount of bitcoin stored in this wallet with less than 1 blockchain confirmation." +msgstr "" + +#: www/views/tab-import-phrase.html:5 +msgid "The derivation path" +msgstr "" + +#: www/views/onboarding/tour.html:37 +msgid "The exchange rate changes with the market." +msgstr "" + +#: www/views/preferencesFee.html:12 +msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." +msgstr "" + +#: www/views/addresses.html:51 +msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." +msgstr "" + +#: src/js/controllers/onboarding/terms.js:21 +msgid "The official English Terms of Service are available on the BitPay website." +msgstr "" + +#: www/views/tab-import-phrase.html:4 +msgid "The password of the recovery phrase (if set)" +msgstr "" + +#: src/js/services/walletService.js:1139 +msgid "The payment was created but could not be completed. Please try again from home screen" +msgstr "" + +#: www/views/modals/txp-details.html:26 +msgid "The payment was removed by creator" +msgstr "" + +#: www/views/join.html:91 +#: www/views/tab-create-personal.html:63 +#: www/views/tab-create-shared.html:92 +#: www/views/tab-import-phrase.html:43 +msgid "The recovery phrase could require a password to be imported" +msgstr "" + +#: src/js/services/bwcError.js:56 +msgid "The request could not be understood by the server" +msgstr "" + +#: www/views/addresses.html:52 +msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." +msgstr "" + +#: src/js/services/bwcError.js:98 +msgid "The spend proposal is not pending" +msgstr "" + +#: www/views/modals/wallet-balance.html:36 +msgid "The total amount of bitcoin stored in this wallet." +msgstr "" + +#: www/views/preferencesHistory.html:27 +msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" +msgstr "" + +#: www/views/tab-import-phrase.html:6 +msgid "The wallet service URL" +msgstr "" + +#: src/js/controllers/tab-home.js:38 +msgid "There is a new version of {{appName}} available" +msgstr "" + +#: src/js/controllers/import.js:229 +#: src/js/controllers/import.js:254 +#: src/js/controllers/import.js:335 +msgid "There is an error in the form" +msgstr "" + +#: src/js/controllers/feedback/send.js:61 +#: src/js/controllers/feedback/send.js:65 +msgid "There's obviously something we're doing wrong." +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:38 +msgid "This app is fantastic!" +msgstr "" + +#: www/views/onboarding/tour.html:47 +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "" + +#: src/js/controllers/confirm.js:523 +msgid "This bitcoin payment request has expired." +msgstr "" + +#: www/views/join.html:133 +#: www/views/tab-create-personal.html:103 +#: www/views/tab-create-shared.html:132 +msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." +msgstr "" + +#: www/views/backup.html:31 +msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." +msgstr "" + +#: www/views/tx-details.html:91 +msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." +msgstr "" + +#: www/views/tx-details.html:87 +msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" +msgstr "" + +#: www/views/walletDetails.html:109 +#: www/views/walletDetails.html:29 +msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." +msgstr "" + +#: www/views/modals/txp-details.html:136 +#: www/views/tx-details.html:121 +msgid "Timeline" +msgstr "" + +#: www/views/confirm.html:31 +#: www/views/includes/output.html:2 +#: www/views/modals/txp-details.html:109 +#: www/views/modals/txp-details.html:53 +#: www/views/tx-details.html:41 +#: www/views/tx-details.html:53 +msgid "To" +msgstr "" + +#: www/views/tab-send.html:32 +msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." +msgstr "" + +#: www/views/tab-send.html:33 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "" + +#: src/js/services/bitpayAccountService.js:73 +msgid "To {{reason}} you must first add your BitPay account - {{email}}" +msgstr "" + +#: src/js/services/onGoingProcess.js:48 +msgid "Top up in progress..." +msgstr "" + +#: src/js/controllers/topup.js:206 +msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" +msgstr "" + +#: www/views/buyAmazon.html:61 +#: www/views/buyMercadoLibre.html:60 +#: www/views/modals/wallet-balance.html:23 +#: www/views/topup.html:70 +msgid "Total" +msgstr "" + +#: www/views/walletDetails.html:196 +msgid "Total Locked Balance" +msgstr "" + +#: www/views/tab-create-shared.html:35 +msgid "Total number of copayers" +msgstr "" + +#: www/views/addresses.html:81 +msgid "Total wallet inputs" +msgstr "" + +#: src/js/services/fingerprintService.js:63 +#: src/js/services/fingerprintService.js:68 +msgid "Touch ID Failed" +msgstr "" + +#: src/js/controllers/tx-details.js:12 +msgid "Transaction" +msgstr "" + +#: www/views/confirm.html:126 +msgid "Transaction Created" +msgstr "" + +#: www/views/preferencesAdvanced.html:29 +#: www/views/preferencesHistory.html:3 +msgid "Transaction History" +msgstr "" + +#: src/js/services/bwcError.js:83 +msgid "Transaction already broadcasted" +msgstr "" + +#: src/js/controllers/buyAmazon.js:308 +#: src/js/controllers/buyMercadoLibre.js:301 +#: src/js/controllers/topup.js:281 +msgid "Transaction has not been created" +msgstr "" + +#: www/views/topup.html:104 +msgid "Transaction initiated" +msgstr "" + +#: src/js/controllers/tx-details.js:119 +msgid "Transaction not available at this time" +msgstr "" + +#: src/js/controllers/activity.js:45 +#: src/js/controllers/tab-home.js:174 +msgid "Transaction not found" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:55 +msgid "Transactions without fee are not supported." +msgstr "" + +#: src/js/controllers/paperWallet.js:109 +msgid "Transfer to" +msgstr "" + +#: www/views/tab-send.html:67 +msgid "Transfer to Wallet" +msgstr "" + +#: www/views/modals/pin.html:13 +msgid "Try again in {{expires}}" +msgstr "" + +#: www/views/bitpayCardIntro.html:18 +msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." +msgstr "" + +#: www/views/tab-import-phrase.html:17 +msgid "Type the Recovery Phrase (usually 12 words)" +msgstr "" + +#: src/js/controllers/backup.js:75 +msgid "Uh oh..." +msgstr "" + +#: www/views/tx-details.html:100 +msgid "Unconfirmed" +msgstr "" + +#: www/views/walletDetails.html:190 +msgid "Unsent transactions" +msgstr "" + +#: www/views/addresses.html:39 +msgid "Unused Addresses" +msgstr "" + +#: www/views/addresses.html:50 +msgid "Unused Addresses Limit" +msgstr "" + +#: src/js/controllers/tab-home.js:146 +msgid "Update Available" +msgstr "" + +#: www/views/proposals.html:14 +msgid "Updating pending proposals. Please stand by" +msgstr "" + +#: www/views/walletDetails.html:217 +msgid "Updating transaction history. Please stand by." +msgstr "" + +#: www/views/activity.html:14 +msgid "Updating... Please stand by" +msgstr "" + +#: src/js/services/feeService.js:10 +msgid "Urgent" +msgstr "" + +#: www/views/advancedSettings.html:12 +msgid "Use Unconfirmed Funds" +msgstr "" + +#: src/js/services/onGoingProcess.js:34 +msgid "Validating recovery phrase..." +msgstr "" + +#: www/views/modals/fingerprintCheck.html:4 +msgid "Verify your identity" +msgstr "" + +#: www/views/preferencesAbout.html:14 +#: www/views/preferencesExternal.html:25 +msgid "Version" +msgstr "" + +#: www/views/tab-export-file.html:69 +msgid "View" +msgstr "" + +#: www/views/addresses.html:34 +msgid "View All Addresses" +msgstr "" + +#: src/js/controllers/onboarding/terms.js:20 +msgid "View Terms of Service" +msgstr "" + +#: src/js/controllers/bitpayCard.js:122 +#: src/js/controllers/tx-details.js:191 +msgid "View Transaction on Explorer.Bitcoin.com" +msgstr "" + +#: src/js/controllers/tab-home.js:148 +msgid "View Update" +msgstr "" + +#: www/views/tx-details.html:147 +msgid "View on blockchain" +msgstr "" + +#: www/views/mercadoLibre.html:26 +msgid "Visit mercadolivre.com.br →" +msgstr "" + +#: www/views/walletDetails.html:182 +msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." +msgstr "" + +#: www/views/tab-export-file.html:45 +msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "" + +#: www/views/tab-export-file.html:36 +msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "" + +#: www/views/modals/paypro.html:42 +msgid "WARNING: UNTRUSTED CERTIFICATE" +msgstr "" + +#: src/js/services/onGoingProcess.js:15 +msgid "Waiting for Ledger..." +msgstr "" + +#: src/js/services/onGoingProcess.js:16 +msgid "Waiting for Trezor..." +msgstr "" + +#: www/views/copayers.html:48 +msgid "Waiting for copayers" +msgstr "" + +#: www/views/copayers.html:53 +msgid "Waiting..." +msgstr "" + +#: www/views/addresses.html:3 +#: www/views/preferencesAdvanced.html:17 +msgid "Wallet Addresses" +msgstr "" + +#: www/views/preferencesColor.html:4 +msgid "Wallet Color" +msgstr "" + +#: www/views/preferencesInformation.html:29 +msgid "Wallet Configuration (m-n)" +msgstr "" + +#: www/views/onboarding/collectEmail.html:5 +msgid "Wallet Created" +msgstr "" + +#: www/views/preferencesInformation.html:23 +msgid "Wallet Id" +msgstr "" + +#: www/views/preferencesAdvanced.html:13 +#: www/views/preferencesInformation.html:3 +msgid "Wallet Information" +msgstr "" + +#: www/views/addresses.html:76 +msgid "Wallet Inputs" +msgstr "" + +#: www/views/join.html:26 +msgid "Wallet Invitation" +msgstr "" + +#: www/views/join.html:60 +#: www/views/tab-create-personal.html:38 +#: www/views/tab-create-shared.html:67 +msgid "Wallet Key" +msgstr "" + +#: www/views/preferencesAlias.html:4 +msgid "Wallet Name" +msgstr "" + +#: www/views/preferencesInformation.html:11 +msgid "Wallet Name (at creation)" +msgstr "" + +#: www/views/preferencesInformation.html:35 +msgid "Wallet Network" +msgstr "" + +#: www/views/join.html:77 +#: www/views/tab-create-personal.html:50 +#: www/views/tab-create-shared.html:79 +msgid "Wallet Recovery Phrase" +msgstr "" + +#: src/js/services/bwcError.js:26 +msgid "Wallet Recovery Phrase is invalid" +msgstr "" + +#: www/views/preferencesAdvanced.html:25 +#: www/views/tab-import-phrase.html:73 +msgid "Wallet Service URL" +msgstr "" + +#: www/views/preferences.html:4 +msgid "Wallet Settings" +msgstr "" + +#: www/views/tab-import-hardware.html:11 +#: www/views/tab-import-phrase.html:61 +msgid "Wallet Type" +msgstr "" + +#: src/js/services/bwcError.js:59 +msgid "Wallet already exists" +msgstr "" + +#: src/js/services/profileService.js:516 +msgid "Wallet already in {{appName}}" +msgstr "" + +#: www/views/includes/walletActivity.html:6 +msgid "Wallet created" +msgstr "" + +#: www/views/copayers.html:58 +msgid "Wallet incomplete and broken" +msgstr "" + +#: src/js/services/bwcError.js:65 +msgid "Wallet is full" +msgstr "" + +#: src/js/services/bwcError.js:125 +msgid "Wallet is locked" +msgstr "" + +#: src/js/services/bwcError.js:128 +msgid "Wallet is not complete" +msgstr "" + +#: www/views/tab-create-personal.html:12 +#: www/views/tab-create-shared.html:12 +msgid "Wallet name" +msgstr "" + +#: src/js/services/bwcError.js:131 +msgid "Wallet needs backup" +msgstr "" + +#: www/views/tab-receive.html:59 +#: www/views/walletDetails.html:169 +msgid "Wallet not backed up" +msgstr "" + +#: src/js/services/bwcError.js:68 +msgid "Wallet not found" +msgstr "" + +#: src/js/controllers/cashScan.js:81 +#: src/js/controllers/tab-home.js:230 +msgid "Wallet not registered" +msgstr "" + +#: src/js/services/bwcError.js:29 +msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "" + +#: www/views/backup.html:12 +msgid "Wallet recovery phrase not available" +msgstr "" + +#: src/js/services/bwcError.js:50 +msgid "Wallet service not found" +msgstr "" + +#: www/views/tab-home.html:69 +msgid "Wallets" +msgstr "" + +#: src/js/controllers/addressbookView.js:36 +#: src/js/controllers/modals/txpDetails.js:153 +#: src/js/controllers/modals/txpDetails.js:170 +#: src/js/controllers/preferencesDelete.js:24 +#: src/js/controllers/preferencesExternal.js:14 +#: www/views/preferencesDeleteWallet.html:11 +msgid "Warning!" +msgstr "" + +#: www/views/modals/txp-details.html:47 +msgid "Warning: this transaction has unconfirmed inputs" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:17 +msgid "Watch out!" +msgstr "" + +#: src/js/controllers/feedback/send.js:69 +msgid "We'd love to do better." +msgstr "" + +#: www/views/backup.html:35 +msgid "We'll confirm on the next screen." +msgstr "" + +#: src/js/controllers/feedback/send.js:77 +msgid "We're always looking for ways to improve {{appName}}." +msgstr "" + +#: src/js/controllers/feedback/send.js:83 +msgid "We're always looking for ways to improve {{appName}}. How could we improve your experience?" +msgstr "" + +#: www/views/includes/incomingDataMenu.html:6 +msgid "Website" +msgstr "" + +#: www/views/preferencesLanguage.html:16 +msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." +msgstr "" + +#: www/views/preferencesAlias.html:11 +msgid "What do you call this wallet?" +msgstr "" + +#: www/views/preferencesAlias.html:12 +msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." +msgstr "" + +#: www/views/onboarding/collectEmail.html:10 +msgid "Where would you like to receive email notifications about payments?" +msgstr "" + +#: www/views/addresses.html:19 +msgid "Why?" +msgstr "" + +#: www/views/feedback/rateApp.html:10 +msgid "Would you be willing to rate {{appName}} in the app store?" +msgstr "" + +#: www/views/onboarding/notifications.html:4 +msgid "Would you like to receive push notifications about payments?" +msgstr "" + +#: src/js/controllers/import.js:288 +msgid "Wrong number of recovery words:" +msgstr "" + +#: src/js/services/bwcError.js:140 +msgid "Wrong spending password" +msgstr "" + +#: www/views/modals/confirmation.html:7 +msgid "Yes" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:25 +msgid "Yes, skip" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:24 +msgid "You can create a backup later from your wallet settings." +msgstr "" + +#: src/js/controllers/preferencesLanguage.js:12 +msgid "You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!" +msgstr "" + +#: www/views/tab-scan.html:16 +msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." +msgstr "" + +#: src/js/controllers/preferencesAbout.js:14 +msgid "You can see the latest developments and contribute to this open source app by visiting our project on GitHub." +msgstr "" + +#: www/views/onboarding/tour.html:19 +msgid "You can spend bitcoin at millions of websites and stores worldwide." +msgstr "" + +#: www/views/backup.html:15 +msgid "You can still export it from Advanced > Export." +msgstr "" + +#: www/views/onboarding/tour.html:32 +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "" + +#: www/views/onboarding/tour.html:46 +msgid "You control your bitcoin." +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:64 +msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." +msgstr "" + +#: www/views/modals/bitpay-card-confirmation.html:5 +msgid "You will need to log back for fill in your BitPay Card." +msgstr "" + +#: www/views/preferencesNotifications.html:34 +msgid "You'll receive email notifications about payments sent and received from your wallets." +msgstr "" + +#: www/views/bitpayCard.html:50 +msgid "Your BitPay Card is ready. Add funds to your card to start using it at stores and ATMs worldwide." +msgstr "" + +#: www/views/mercadoLibre.html:57 +#: www/views/mercadoLibreCards.html:6 +msgid "Your Gift Cards" +msgstr "" + +#: www/views/includes/confirmBackupPopup.html:6 +msgid "Your bitcoin wallet is backed up!" +msgstr "" + +#: www/views/tab-home.html:36 +msgid "Your bitcoin wallet is ready!" +msgstr "" + +#: www/views/modals/chooseFeeLevel.html:61 +msgid "Your fee is lower than recommended." +msgstr "" + +#: www/views/feedback/send.html:42 +msgid "Your ideas, feedback, or comments" +msgstr "" + +#: www/views/tab-create-shared.html:22 +msgid "Your name" +msgstr "" + +#: www/views/join.html:16 +msgid "Your nickname" +msgstr "" + +#: www/views/tab-export-file.html:11 +#: www/views/tab-import-file.html:20 +msgid "Your password" +msgstr "" + +#: www/views/buyAmazon.html:102 +msgid "Your purchase could not be completed" +msgstr "" + +#: www/views/buyAmazon.html:105 +msgid "Your purchase was added to the list of pending" +msgstr "" + +#: www/views/onboarding/backupRequest.html:10 +msgid "Your wallet is never saved to cloud storage or standard device backups." +msgstr "" + +#: src/js/services/walletService.js:1030 +msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down." +msgstr "" + +#: www/views/includes/walletList.html:13 +#: www/views/includes/walletSelector.html:21 +#: www/views/paperWallet.html:33 +#: www/views/tab-receive.html:72 +#: www/views/walletDetails.html:131 +#: www/views/walletDetails.html:51 +msgid "[Balance Hidden]" +msgstr "" + +#: www/views/walletDetails.html:141 +#: www/views/walletDetails.html:61 +msgid "[Scanning Funds]" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:11 +msgid "add your BitPay Visa card(s)" +msgstr "" + +#: www/views/includes/available-balance.html:8 +msgid "locked by pending payments" +msgstr "" + +#: src/js/services/profileService.js:404 +msgid "me" +msgstr "" + +#: www/views/addressbook.add.html:32 +msgid "name@example.com" +msgstr "" + +#: www/views/preferencesHistory.html:15 +msgid "preparing..." +msgstr "" + +#: www/views/cashScan.html:57 +msgid "recovery tool." +msgstr "" + +#: src/js/controllers/buyAmazon.js:239 +msgid "{{amountStr}} for Amazon.com Gift Card" +msgstr "" + +#: src/js/controllers/buyMercadoLibre.js:237 +msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" +msgstr "" + +#: www/views/preferencesBwsUrl.html:21 +msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." +msgstr "" + +#: src/js/controllers/confirm.js:408 +msgid "{{fee}} will be deducted for bitcoin networking fees." +msgstr "" + +#: www/views/confirm.html:85 +msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" +msgstr "" + +#: www/views/walletDetails.html:218 +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "" + +#: www/views/cashScan.html:33 +#: www/views/copayers.html:46 +#: www/views/includes/walletInfo.html:18 +msgid "{{wallet.m}}-of-{{wallet.n}}" +msgstr "" diff --git a/i18n/po/vi/template-vi.po b/i18n/po/vi/template-vi.po index c005c649d..d965b6ee8 100644 --- a/i18n/po/vi/template-vi.po +++ b/i18n/po/vi/template-vi.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Vietnamese\n" "Language: vi\n" -"PO-Revision-Date: 2018-06-22T04:02:59+0000\n" +"PO-Revision-Date: 2018-07-04 03:58\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -54,67 +54,71 @@ msgstr "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size all #: src/js/controllers/confirm.js:395 msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "" +msgstr "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." #: src/js/controllers/preferencesAbout.js:6 #: www/views/tab-settings.html:156 msgid "About" -msgstr "" +msgstr "About" #: src/js/controllers/modals/txpDetails.js:62 #: src/js/controllers/tx-details.js:79 msgid "Accepted" -msgstr "" +msgstr "Accepted" #: www/views/preferencesInformation.html:72 msgid "Account" -msgstr "" +msgstr "Account" #: www/views/join.html:72 #: www/views/tab-create-personal.html:45 #: www/views/tab-create-shared.html:74 #: www/views/tab-import-hardware.html:19 msgid "Account Number" +msgstr "Account Number" + +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" msgstr "" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" -msgstr "" +msgstr "Accounts" #: www/views/bitpayCard.html:56 msgid "Activity" -msgstr "" +msgstr "Activity" #: src/js/services/bitpayAccountService.js:83 msgid "Add Account" -msgstr "" +msgstr "Add Account" #: src/js/services/bitpayAccountService.js:69 msgid "Add BitPay Account?" -msgstr "" +msgstr "Add BitPay Account?" #: www/views/addressbook.add.html:4 #: www/views/addressbook.html:22 msgid "Add Contact" -msgstr "" +msgstr "Add Contact" #: www/views/bitpayCard.html:28 msgid "Add Funds" -msgstr "" +msgstr "Add Funds" #: www/views/confirm.html:94 msgid "Add Memo" -msgstr "" +msgstr "Add Memo" #: www/views/join.html:87 #: www/views/tab-create-personal.html:59 #: www/views/tab-create-shared.html:88 msgid "Add a password" -msgstr "" +msgstr "Add a password" #: www/views/includes/accountSelector.html:27 msgid "Add account" -msgstr "" +msgstr "Add account" #: www/views/join.html:90 #: www/views/tab-create-personal.html:62 diff --git a/i18n/po/zh-CN/template-zh-CN.po b/i18n/po/zh-CN/template-zh-CN.po index 016f4db91..8c274b798 100644 --- a/i18n/po/zh-CN/template-zh-CN.po +++ b/i18n/po/zh-CN/template-zh-CN.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Chinese Simplified\n" "Language: zh\n" -"PO-Revision-Date: 2018-06-22T04:02:44+0000\n" +"PO-Revision-Date: 2018-07-04 03:57\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -77,6 +77,10 @@ msgstr "帐户" msgid "Account Number" msgstr "帐号" +#: www/views/tab-home.html:61 +msgid "Instant transactions with low fees" +msgstr "" + #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" msgstr "帐户" From aa9a4575687e3fdceb5c1492264abc0fcd497d4d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Wed, 4 Jul 2018 23:38:18 +0900 Subject: [PATCH 111/166] Update a text --- www/views/includes/walletSelector.html | 1 - 1 file changed, 1 deletion(-) diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index f0e4516fd..136aa4694 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -41,7 +41,6 @@
Bitcoin Core (BTC)
-
Slow transactions with high fees
Date: Wed, 4 Jul 2018 23:46:23 +0900 Subject: [PATCH 112/166] Update appConfig.json --- app-template/bitcoincom/appConfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 9dc184e7c..28e24e9fb 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,9 +24,9 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.12.1", - "fullVersion": "4.12-rc2", - "androidVersion": "412100", + "version": "4.12.2", + "fullVersion": "4.12-rc3", + "androidVersion": "412200", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, From 1ee95cf26268346d0ea59f166ca799a72fbe3707 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Mon, 9 Jul 2018 18:22:11 +0200 Subject: [PATCH 113/166] new send-tab --- src/js/controllers/tab-send-v2.js | 301 +++++++++++++++++++++++++ src/js/directives/gravatar.js | 17 +- src/js/routes.js | 9 + src/js/services/clipboardService.js | 20 ++ src/sass/buttons.scss | 23 ++ src/sass/views/address-book.scss | 1 - src/sass/views/tab-send-v2.scss | 228 +++++++++++++++++++ src/sass/views/views.scss | 1 + www/img/contact-placeholder.svg | 30 ++- www/img/icon-clipboard-paste-white.svg | 25 ++ www/img/icon-clipboard-paste.svg | 25 ++ www/img/icon-contact-add.svg | 10 + www/img/icon-scan-qr.svg | 63 ++++++ www/img/icon-w2w.svg | 26 +++ www/views/tab-send-v2.html | 143 ++++++++++++ www/views/tabs.html | 2 +- 16 files changed, 907 insertions(+), 17 deletions(-) create mode 100644 src/js/controllers/tab-send-v2.js create mode 100644 src/sass/views/tab-send-v2.scss create mode 100644 www/img/icon-clipboard-paste-white.svg create mode 100644 www/img/icon-clipboard-paste.svg create mode 100644 www/img/icon-contact-add.svg create mode 100644 www/img/icon-scan-qr.svg create mode 100644 www/img/icon-w2w.svg create mode 100644 www/views/tab-send-v2.html diff --git a/src/js/controllers/tab-send-v2.js b/src/js/controllers/tab-send-v2.js new file mode 100644 index 000000000..624acb5bb --- /dev/null +++ b/src/js/controllers/tab-send-v2.js @@ -0,0 +1,301 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('tabSendV2Controller', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { + var clipboardHasAddress = false; + + $scope.addContact = function() { + $state.go('tabs.settings').then(function() { + $state.go('tabs.addressbook').then(function() { + $state.go('tabs.addressbook.add'); + }); + }); + }; + + $scope.pasteClipboard = function() { + clipboardService.readFromClipboard(function(text) { + $scope.formData.search = text; + $scope.findContact($scope.formData.search); + }); + } + + $scope.$on("$ionicView.enter", function(event, data) { + clipboardService.readFromClipboard(function(text) { + $scope.clipboardHasAddress = false; + if ((text.indexOf('bitcoincash:') === 0 || text[0] === 'C' || text[0] === 'H' || text[0] === 'p' || text[0] === 'q') && text.replace('bitcoincash:', '').length === 42) { // CashAddr + $scope.clipboardHasAddress = true; + } else if ((text[0] === "1" || text[0] === "3" || text.substring(0, 3) === "bc1") && text.length >= 26 && text.length <= 35) { // Legacy Addresses + $scope.clipboardHasAddress = true; + } + }); + + $ionicNavBarDelegate.showBar(true); + if (!$scope.hasWallets) { + $scope.checkingBalance = false; + return; + } + updateHasFunds(); + updateWalletsList(); + updateContactsList(function() { + updateList(); + }); + }); + + + + + + + + + + + + + + + + + var originalList; + var CONTACTS_SHOW_LIMIT; + var currentContactsPage; + + $scope.sectionDisplay = { + transferToWallet: false + }; + + var hasWallets = function() { + $scope.wallets = profileService.getWallets({ + onlyComplete: true + }); + $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; + }; + + // THIS is ONLY to show the 'buy bitcoins' message + // does not has any other function. + + var updateHasFunds = function() { + + if ($rootScope.everHasFunds) { + $scope.hasFunds = true; + return; + } + + $scope.hasFunds = false; + var index = 0; + lodash.each($scope.wallets, function(w) { + walletService.getStatus(w, {}, function(err, status) { + + ++index; + if (err && !status) { + $log.error(err); + // error updating the wallet. Probably a network error, do not show + // the 'buy bitcoins' message. + + $scope.hasFunds = true; + } else if (status.availableBalanceSat > 0) { + $scope.hasFunds = true; + $rootScope.everHasFunds = true; + } + + if (index == $scope.wallets.length) { + $scope.checkingBalance = false; + $timeout(function() { + $scope.$apply(); + }); + } + }); + }); + }; + + var updateWalletsList = function() { + var config = configService.getSync(); + var networkResult = lodash.countBy($scope.wallets, 'network'); + + $scope.showTransferCard = $scope.hasWallets && (networkResult.livenet > 1 || networkResult.testnet > 1); + + if ($scope.showTransferCard) { + var walletsToTransfer = $scope.wallets; + if (!(networkResult.livenet > 1)) { + walletsToTransfer = lodash.filter(walletsToTransfer, function(item) { + return item.network == 'testnet'; + }); + } + if (!(networkResult.testnet > 1)) { + walletsToTransfer = lodash.filter(walletsToTransfer, function(item) { + return item.network == 'livenet'; + }); + } + + var walletList = []; + lodash.each(walletsToTransfer, function(v) { + var displayBalanceAsFiat = + // BD got v.status as undefined here once during development, just + // after creating a new wallet. + v.status && + v.status.alternativeBalanceAvailable && + config.wallet.settings.priceDisplay === 'fiat'; + + walletList.push({ + color: v.color, + name: v.name, + recipientType: 'wallet', + coin: v.coin, + network: v.network, + balanceString: displayBalanceAsFiat ? + v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode : + v.cachedBalance, + getAddress: function(cb) { + walletService.getAddress(v, false, cb); + }, + }); + }); + originalList = originalList.concat(walletList); + } + } + + var updateContactsList = function(cb) { + var config = configService.getSync(); + var defaults = configService.getDefaults(); + addressbookService.list(function(err, ab) { + if (err) $log.error(err); + + $scope.hasContacts = lodash.isEmpty(ab) ? false : true; + if (!$scope.hasContacts) return cb(); + + var completeContacts = []; + lodash.each(ab, function(v, k) { + completeContacts.push({ + name: lodash.isObject(v) ? v.name : v, + address: k, + email: lodash.isObject(v) ? v.email : null, + recipientType: 'contact', + coin: v.coin, + displayCoin: (v.coin == 'bch' + ? (config.bitcoinCashAlias || defaults.bitcoinCashAlias) + : (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(), + getAddress: function(cb) { + return cb(null, k); + }, + }); + }); + var contacts = completeContacts.slice(0, (currentContactsPage + 1) * CONTACTS_SHOW_LIMIT); + $scope.contactsShowMore = completeContacts.length > contacts.length; + originalList = originalList.concat(contacts); + return cb(); + }); + }; + + var updateList = function() { + $scope.list = lodash.clone(originalList); + $timeout(function() { + $ionicScrollDelegate.resize(); + $scope.$apply(); + }, 10); + }; + + $scope.openScanner = function() { + var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; + + if (!isWindowsPhoneApp) { + $state.go('tabs.scan'); + return; + } + + scannerService.useOldScanner(function(err, contents) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + incomingData.redir(contents); + }); + }; + + $scope.showMore = function() { + currentContactsPage++; + updateWalletsList(); + }; + + $scope.searchInFocus = function() { + $scope.searchFocus = true; + }; + + $scope.searchBlurred = function() { + if ($scope.formData.search == null || $scope.formData.search.length == 0) { + $scope.searchFocus = false; + } + }; + + $scope.findContact = function(search) { + + if (incomingData.redir(search)) { + return; + } + + if (!search || search.length < 2) { + $scope.list = originalList; + $timeout(function() { + $scope.$apply(); + }); + return; + } + + var result = lodash.filter(originalList, function(item) { + var val = item.name; + return lodash.includes(val.toLowerCase(), search.toLowerCase()); + }); + + $scope.list = result; + }; + + $scope.goToAmount = function(item) { + $timeout(function() { + item.getAddress(function(err, addr) { + if (err || !addr) { + //Error is already formated + return popupService.showAlert(err); + } + + if (item.recipientType && item.recipientType == 'contact') { + if (addr.indexOf('bch') == 0 || addr.indexOf('btc') == 0) { + addr = addr.substring(3); + } + } + + $log.debug('Got toAddress:' + addr + ' | ' + item.name); + return $state.transitionTo('tabs.send.amount', { + recipientType: item.recipientType, + displayAddress: item.coin == 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, + toAddress: addr, + toName: item.name, + toEmail: item.email, + toColor: item.color, + coin: item.coin + }); + }); + }); + }; + + // This could probably be enhanced refactoring the routes abstract states + $scope.createWallet = function() { + $state.go('tabs.home').then(function() { + $state.go('tabs.add.create-personal'); + }); + }; + + $scope.buyBitcoin = function() { + $state.go('tabs.home').then(function() { + $state.go('tabs.buyandsell'); + }); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.checkingBalance = true; + $scope.formData = { + search: null + }; + originalList = []; + CONTACTS_SHOW_LIMIT = 10; + currentContactsPage = 0; + hasWallets(); + }); +}); diff --git a/src/js/directives/gravatar.js b/src/js/directives/gravatar.js index 5f7931798..c96a63cfe 100644 --- a/src/js/directives/gravatar.js +++ b/src/js/directives/gravatar.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.directives') - .directive('gravatar', function(md5) { + .directive('gravatar', function(md5, $http) { return { restrict: 'AE', replace: true, @@ -9,13 +9,24 @@ angular.module('copayApp.directives') name: '@', height: '@', width: '@', - email: '@' + email: '@', + url: '@' }, link: function(scope, el, attr) { if (typeof scope.email === "string") { scope.emailHash = md5.createHash(scope.email.toLowerCase() || ''); + var req = { + method: 'GET', + url: 'https://secure.gravatar.com/'+scope.emailHash+'.json', + }; + scope.url = 'img/contact-placeholder.svg'; + $http(req).then(function (response) { + scope.url = 'https://secure.gravatar.com/avatar/'+scope.emailHash+'.jpg?s='+scope.width+'&d=mm'; + }, function (error) { + scope.url = 'img/contact-placeholder.svg'; + }); } }, - template: '{{ name }}' + template: '{{ name }}' }; }); diff --git a/src/js/routes.js b/src/js/routes.js index 4e72246ba..2399a2db9 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -270,6 +270,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) + .state('tabs.send2', { + url: '/send2', + views: { + 'tab-send': { + controller: 'tabSendV2Controller', + templateUrl: 'views/tab-send-v2.html', + } + } + }) .state('tabs.settings', { url: '/settings', views: { diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index e2e0e5fb3..ff28cd2e7 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -17,7 +17,27 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, // No supported return; } + }; + root.readFromClipboard = function (cb) { + $log.debug("Read from clipboard"); + if (platformInfo.isCordova) { + cordova.plugins.clipboard.paste(function(text) { + cb(text); + }) + } else if (platformInfo.isNW) { + cb(nodeWebkitService.readFromClipboard()); + } else { + navigator.clipboard.readText() + .then(text => { + cb(text); + }) + .catch(err => { + $log.debug("Clipboard reading is not supported in browser.."); + }); + + return; + } }; return root; diff --git a/src/sass/buttons.scss b/src/sass/buttons.scss index 348d6d378..a8512ae64 100644 --- a/src/sass/buttons.scss +++ b/src/sass/buttons.scss @@ -16,6 +16,8 @@ &.button-primary, &.button-secondary, &.button-light, + &.button-white, + &.button-green, &.button-assertive { &.button-standard { @extend %button-standard; @@ -33,6 +35,10 @@ } } +@mixin button-shadow() { + box-shadow: 0 2px 11px 0 #C1C1C1;; +} + .button { &.button-secondary { @include button-style($v-button-secondary-bg, $v-button-secondary-border, $v-button-secondary-active-bg, $v-button-secondary-active-border, $v-button-secondary-color); @@ -47,7 +53,24 @@ } .button { + border-radius: 6px; &.button-full { display: block; } + &-green { + @include button-style(#719561, #FFF, #606060, #FFF, #FFF); + @include button-clear(#FFF); + @include button-outline(#C1C1C1); + border: 0px; + @include button-shadow(); + } + &-white { + @include button-style(#FFF, #C1C1C1, #C1C1C1, #FFF, #606060); + @include button-clear(#FFF); + @include button-outline(#C1C1C1); + @include button-shadow(); + &.activated { + color: #FFF; + } + } } \ No newline at end of file diff --git a/src/sass/views/address-book.scss b/src/sass/views/address-book.scss index c0d0f99a8..8bbdbc6be 100644 --- a/src/sass/views/address-book.scss +++ b/src/sass/views/address-book.scss @@ -124,7 +124,6 @@ position: relative; height: 70px; border-color: $royal; - background-color: $royal; padding-top: 20px; margin-bottom: 50px; text-align: center; diff --git a/src/sass/views/tab-send-v2.scss b/src/sass/views/tab-send-v2.scss new file mode 100644 index 000000000..e9905fc17 --- /dev/null +++ b/src/sass/views/tab-send-v2.scss @@ -0,0 +1,228 @@ +#tab-send2 { + @extend .deflash-blue; + .input { + width: 100%; + input { + width: 100%; + height: 57px; + background: #FFF; + border: 1px #D9D9D9 solid; + &::placeholder { + color: #DCDCDC; + } + } + i { + &.left { + padding-left: 15px; + } + &.qr { + cursor: pointer; + cursor: hand; + padding-right: 5px; + } + } + } + + .send-wrapper { + &:after { + display: block; + position: relative; + height: 1px; + background: #DEDEDE; + bottom: 0; + content: ''; + margin: 20px 6px 0px; + } + margin: 18px 0 0; + padding: 9px; + background-color: #f2f2f2; + border-radius: 3px; + border: none; + &.focus { + .search-input { + padding-left: 30px; + &:focus::-webkit-input-placeholder { + opacity: 0; + } + } + } + .buttons { + margin: auto; + margin-top: 18px; + .button { + &-clipboard-paste { + margin-left: 0; + .address { + display: none; + } + .icon { + background: url(../img/icon-clipboard-paste.svg); + width: 15px; + height: 19px; + display: inline-block; + margin-bottom: 4px; + } + &.contains-address { + background: #FAB915; + color: #FFF !important; + border: 0; + @include button-shadow(); + .icon { + background: url(../img/icon-clipboard-paste-white.svg); + } + .address { + display: inline; + } + .non-address { + display: none; + } + } + } + span { + font-size: 14px; + } + img { + height: 16px; + width: auto; + margin: 2px 0 4px; + } + height: 60px; + line-height: 16px; + margin-right: 0px; + width: 95%; + max-width: none; + padding: 2px; + &-qr { + font-weight: bold; + max-width: none; + width: 100%; + height: 95px; + margin-top: 20px; + img { + vertical-align: middle; + margin-right: 12px; + width: 43px; + height: 43px; + } + span { + font-size: 19px; + } + } + } + } + } + .search-input { + background-color: transparent; + padding-left: 30px; + } + .sendTip { + padding-top: 5vh; + text-align: center; + .item { + border-style: none; + } + & > .title { + font-size: 20px; + color: $v-dark-gray; + margin: 20px 10px; + } + & > .subtitle { + font-size: 1rem; + line-height: 1.5em; + font-weight: 300; + color: #6F6F70; + margin: 20px 1em 2.5em; + } + .big-icon-svg { + .bg.green { + padding: 0 10px; + box-shadow: none; + } + } + .buttons { + margin-top: 18px; + .button { + font-weight: bold; + font-size: 19px; + } + } + .button-first-contact img { + height: 19px; + width: 19px; + margin-right: 6px; + vertical-align: sub; + } + } + .item-heading { + line-height: 16px; + font-size: 14px; + font-weight: bold; + .subtitle { + color: #B5B2B2; + font-size: 12px; + font-weight: 300; + } + } + .list { + .item { + font-weight: 600; + padding-top: 12px; + padding-bottom: 12px; + p { + font-weight: normal; + } + &.item-icon-left { + padding-left: 64px; + } + color: #444; + //border-top: none; + padding-top: 1.5rem; + padding-bottom: 1.5rem; + .big-icon-svg { + left: 5px; + & > .bg { + width: 30px; + height: 30px; + box-shadow: none; + } + } + &:before { + display: block; + position: absolute; + width: 100%; + height: 1px; + background: rgba(221, 221, 221, 0.3); + top: 0; + right: 0; + content: ''; + } + &.item-divider { + color: rgba(74, 74, 74, .8); + } + &.item-heading { + &:before { + top: 99%; + width: 100%; + } + } + &:nth-child(2) { + &:before { + width: 0; + } + } + .item-note { + color: rgb(58, 58, 58); + } + } + } + .scroll { + height: 100%; + } + + .card.contacts { + margin: 4px; + border-radius: 6px; + box-shadow: 0px 2px 1px 0 #C1C1C1; + } + +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 37754970f..5367ac5aa 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -8,6 +8,7 @@ @import "tab-receive"; @import "tab-scan"; @import "tab-send"; +@import "tab-send-v2"; @import "tab-settings"; @import "wallet-colors"; @import "walletBalance"; diff --git a/www/img/contact-placeholder.svg b/www/img/contact-placeholder.svg index f730da86b..54b0fcec2 100644 --- a/www/img/contact-placeholder.svg +++ b/www/img/contact-placeholder.svg @@ -1,12 +1,18 @@ - - - - - - + + + + Artboard + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/icon-clipboard-paste-white.svg b/www/img/icon-clipboard-paste-white.svg new file mode 100644 index 000000000..be0df78bc --- /dev/null +++ b/www/img/icon-clipboard-paste-white.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/www/img/icon-clipboard-paste.svg b/www/img/icon-clipboard-paste.svg new file mode 100644 index 000000000..a82edc11b --- /dev/null +++ b/www/img/icon-clipboard-paste.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/www/img/icon-contact-add.svg b/www/img/icon-contact-add.svg new file mode 100644 index 000000000..36d1f95bc --- /dev/null +++ b/www/img/icon-contact-add.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/www/img/icon-scan-qr.svg b/www/img/icon-scan-qr.svg new file mode 100644 index 000000000..bc4a2bc56 --- /dev/null +++ b/www/img/icon-scan-qr.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/img/icon-w2w.svg b/www/img/icon-w2w.svg new file mode 100644 index 000000000..082a0d8cc --- /dev/null +++ b/www/img/icon-w2w.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/www/views/tab-send-v2.html b/www/views/tab-send-v2.html new file mode 100644 index 000000000..b42784957 --- /dev/null +++ b/www/views/tab-send-v2.html @@ -0,0 +1,143 @@ + + + {{'Send' | translate}} + + +
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+
+ Your Bitcoin wallet is empty +
+
+
+

To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.

+

You can receive bitcoin from any wallet or service.

+
+
To get started, you'll need to create a bitcoin wallet and get some + bitcoin. +
+
+ + + +
+
+
+
+
+
+
+ +
+
Contacts
+
Saved frequently used addresses
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/views/tabs.html b/www/views/tabs.html index 69cf93309..19c33aad9 100644 --- a/www/views/tabs.html +++ b/www/views/tabs.html @@ -12,7 +12,7 @@ - + From a2bd6fc31906ec56f14c0b7a263dc2783e614a2c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 10 Jul 2018 16:39:30 +0900 Subject: [PATCH 114/166] Init BitAnalytics --- Gruntfile.js | 9 +- app-template/index.html | 3 +- bitanalytics/bitanalytics-0.1.0.js | 6493 ++++++++++++++++++++++++++++ src/js/routes.js | 6 +- www/index.html | 3 +- 5 files changed, 6510 insertions(+), 4 deletions(-) create mode 100644 bitanalytics/bitanalytics-0.1.0.js diff --git a/Gruntfile.js b/Gruntfile.js index 7ae74ed17..342cc85e7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -161,6 +161,12 @@ module.exports = function(grunt) { ], dest: 'www/lib/bitcoin-cash-js.js' }, + bitanalytics: { + src: [ + 'bitanalytics/bitanalytics-0.1.0.js' + ], + dest: 'www/lib/bitanalytics.js' + }, js: { src: [ 'src/js/app.js', @@ -202,7 +208,8 @@ module.exports = function(grunt) { files: { 'www/js/app.js': ['www/js/app.js'], 'www/lib/angular-components.js': ['www/lib/angular-components.js'], - 'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js'] + 'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js'], + 'www/lib/bitanalytics.js': ['www/lib/bitanalytics.js'] } } }, diff --git a/app-template/index.html b/app-template/index.html index 2946d7928..fe5262f52 100644 --- a/app-template/index.html +++ b/app-template/index.html @@ -11,7 +11,7 @@ - *USERVISIBLENAME* - *PURPOSELINE* + *USERVISIBLENAME* @@ -31,6 +31,7 @@ + diff --git a/bitanalytics/bitanalytics-0.1.0.js b/bitanalytics/bitanalytics-0.1.0.js new file mode 100644 index 000000000..c1907d7a5 --- /dev/null +++ b/bitanalytics/bitanalytics-0.1.0.js @@ -0,0 +1,6493 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.bitanalytics = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i/g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + return escaped; +}; + +_.extend = function(obj) { + _.each(slice.call(arguments, 1), function(source) { + for (var prop in source) { + if (source[prop] !== void 0) { + obj[prop] = source[prop]; + } + } + }); + return obj; +}; + +_.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; +}; + +// from a comment on http://dbj.org/dbj/?p=286 +// fails on only one very rare and deliberate custom object: +// var bomb = { toString : undefined, valueOf: function(o) { return "function BOMBA!"; }}; +_.isFunction = function(f) { + try { + return /^\s*\bfunction\b/.test(f); + } catch (x) { + return false; + } +}; + +_.isArguments = function(obj) { + return !!(obj && hasOwnProperty.call(obj, 'callee')); +}; + +_.toArray = function(iterable) { + if (!iterable) { + return []; + } + if (iterable.toArray) { + return iterable.toArray(); + } + if (_.isArray(iterable)) { + return slice.call(iterable); + } + if (_.isArguments(iterable)) { + return slice.call(iterable); + } + return _.values(iterable); +}; + +_.keys = function(obj) { + var results = []; + if (obj === null) { + return results; + } + _.each(obj, function(value, key) { + results[results.length] = key; + }); + return results; +}; + +_.values = function(obj) { + var results = []; + if (obj === null) { + return results; + } + _.each(obj, function(value) { + results[results.length] = value; + }); + return results; +}; + +_.identity = function(value) { + return value; +}; + +_.include = function(obj, target) { + var found = false; + if (obj === null) { + return found; + } + if (nativeIndexOf && obj.indexOf === nativeIndexOf) { + return obj.indexOf(target) != -1; + } + _.each(obj, function(value) { + if (found || (found = (value === target))) { + return breaker; + } + }); + return found; +}; + +_.includes = function(str, needle) { + return str.indexOf(needle) !== -1; +}; + +// Underscore Addons +_.inherit = function(subclass, superclass) { + subclass.prototype = new superclass(); + subclass.prototype.constructor = subclass; + subclass.superclass = superclass.prototype; + return subclass; +}; + +_.isObject = function(obj) { + return (obj === Object(obj) && !_.isArray(obj)); +}; + +_.isEmptyObject = function(obj) { + if (_.isObject(obj)) { + for (var key in obj) { + if (hasOwnProperty.call(obj, key)) { + return false; + } + } + return true; + } + return false; +}; + +_.isUndefined = function(obj) { + return obj === void 0; +}; + +_.isString = function(obj) { + return toString.call(obj) == '[object String]'; +}; + +_.isDate = function(obj) { + return toString.call(obj) == '[object Date]'; +}; + +_.isNumber = function(obj) { + return toString.call(obj) == '[object Number]'; +}; + +_.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); +}; + +_.encodeDates = function(obj) { + _.each(obj, function(v, k) { + if (_.isDate(v)) { + obj[k] = _.formatDate(v); + } else if (_.isObject(v)) { + obj[k] = _.encodeDates(v); // recurse + } + }); + return obj; +}; + +_.timestamp = function() { + Date.now = Date.now || function() { + return +new Date; + }; + return Date.now(); +}; + +_.formatDate = function(d) { + // YYYY-MM-DDTHH:MM:SS in UTC + function pad(n) { + return n < 10 ? '0' + n : n; + } + return d.getUTCFullYear() + '-' + + pad(d.getUTCMonth() + 1) + '-' + + pad(d.getUTCDate()) + 'T' + + pad(d.getUTCHours()) + ':' + + pad(d.getUTCMinutes()) + ':' + + pad(d.getUTCSeconds()); +}; + +_.safewrap = function(f) { + return function() { + try { + return f.apply(this, arguments); + } catch (e) { + console$1.critical('Implementation error. Please turn on debug and contact support@mixpanel.com.'); + if (Config.DEBUG){ + console$1.critical(e); + } + } + }; +}; + +_.safewrap_class = function(klass, functions) { + for (var i = 0; i < functions.length; i++) { + klass.prototype[functions[i]] = _.safewrap(klass.prototype[functions[i]]); + } +}; + +_.safewrap_instance_methods = function(obj) { + for (var func in obj) { + if (typeof(obj[func]) === 'function') { + obj[func] = _.safewrap(obj[func]); + } + } +}; + +_.strip_empty_properties = function(p) { + var ret = {}; + _.each(p, function(v, k) { + if (_.isString(v) && v.length > 0) { + ret[k] = v; + } + }); + return ret; +}; + +/* + * this function returns a copy of object after truncating it. If + * passed an Array or Object it will iterate through obj and + * truncate all the values recursively. + */ +_.truncate = function(obj, length) { + var ret; + + if (typeof(obj) === 'string') { + ret = obj.slice(0, length); + } else if (_.isArray(obj)) { + ret = []; + _.each(obj, function(val) { + ret.push(_.truncate(val, length)); + }); + } else if (_.isObject(obj)) { + ret = {}; + _.each(obj, function(val, key) { + ret[key] = _.truncate(val, length); + }); + } else { + ret = obj; + } + + return ret; +}; + +_.JSONEncode = (function() { + return function(mixed_val) { + var value = mixed_val; + var quote = function(string) { + var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; // eslint-disable-line no-control-regex + var meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"': '\\"', + '\\': '\\\\' + }; + + escapable.lastIndex = 0; + return escapable.test(string) ? + '"' + string.replace(escapable, function(a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + }; + + var str = function(key, holder) { + var gap = ''; + var indent = ' '; + var i = 0; // The loop counter. + var k = ''; // The member key. + var v = ''; // The member value. + var length = 0; + var mind = gap; + var partial = []; + var value = holder[key]; + + // If the value has a toJSON method, call it to obtain a replacement value. + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + // What happens next depends on the value's type. + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + // JSON numbers must be finite. Encode non-finite numbers as null. + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + // If the value is a boolean or null, convert it to a string. Note: + // typeof null does not produce 'null'. The case is included here in + // the remote chance that this gets fixed someday. + + return String(value); + + case 'object': + // If the type is 'object', we might be dealing with an object or an array or + // null. + // Due to a specification blunder in ECMAScript, typeof null is 'object', + // so watch out for that case. + if (!value) { + return 'null'; + } + + // Make an array to hold the partial results of stringifying this object value. + gap += indent; + partial = []; + + // Is the value an array? + if (toString.apply(value) === '[object Array]') { + // The value is an array. Stringify every element. Use null as a placeholder + // for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + + // Join all of the elements together, separated with commas, and wrap them in + // brackets. + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + + // Iterate through all of the keys in the object. + for (k in value) { + if (hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + + // Join all of the member texts together, separated with commas, + // and wrap them in braces. + v = partial.length === 0 ? '{}' : + gap ? '{' + partial.join(',') + '' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + }; + + // Make a fake root object containing our value under the key of ''. + // Return the result of stringifying the value. + return str('', { + '': value + }); + }; +})(); + +/** + * From https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js + * Slightly modified to throw a real Error rather than a POJO + */ +_.JSONDecode = (function() { + var at, // The index of the current character + ch, // The current character + escapee = { + '"': '"', + '\\': '\\', + '/': '/', + 'b': '\b', + 'f': '\f', + 'n': '\n', + 'r': '\r', + 't': '\t' + }, + text, + error = function(m) { + var e = new SyntaxError(m); + e.at = at; + e.text = text; + throw e; + }, + next = function(c) { + // If a c parameter is provided, verify that it matches the current character. + if (c && c !== ch) { + error('Expected \'' + c + '\' instead of \'' + ch + '\''); + } + // Get the next character. When there are no more characters, + // return the empty string. + ch = text.charAt(at); + at += 1; + return ch; + }, + number = function() { + // Parse a number value. + var number, + string = ''; + + if (ch === '-') { + string = '-'; + next('-'); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (!isFinite(number)) { + error('Bad number'); + } else { + return number; + } + }, + + string = function() { + // Parse a string value. + var hex, + i, + string = '', + uffff; + // When parsing for string values, we must look for " and \ characters. + if (ch === '"') { + while (next()) { + if (ch === '"') { + next(); + return string; + } + if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else { + string += ch; + } + } + } + error('Bad string'); + }, + white = function() { + // Skip whitespace. + while (ch && ch <= ' ') { + next(); + } + }, + word = function() { + // true, false, or null. + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error('Unexpected "' + ch + '"'); + }, + value, // Placeholder for the value function. + array = function() { + // Parse an array value. + var array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error('Bad array'); + }, + object = function() { + // Parse an object value. + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if (Object.hasOwnProperty.call(object, key)) { + error('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error('Bad object'); + }; + + value = function() { + // Parse a JSON value. It could be an object, an array, a string, + // a number, or a word. + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + + // Return the json_parse function. It will have access to all of the + // above functions and variables. + return function(source) { + var result; + + text = source; + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error('Syntax error'); + } + + return result; + }; +})(); + +_.base64Encode = function(data) { + var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = '', + tmp_arr = []; + + if (!data) { + return data; + } + + data = _.utf8Encode(data); + + do { // pack three octets into four hexets + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + // use hexets to index into b64, and append result to encoded string + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + switch (data.length % 3) { + case 1: + enc = enc.slice(0, -2) + '=='; + break; + case 2: + enc = enc.slice(0, -1) + '='; + break; + } + + return enc; +}; + +_.utf8Encode = function(string) { + string = (string + '').replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + + var utftext = '', + start, + end; + var stringl = 0, + n; + + start = end = 0; + stringl = string.length; + + for (n = 0; n < stringl; n++) { + var c1 = string.charCodeAt(n); + var enc = null; + + if (c1 < 128) { + end++; + } else if ((c1 > 127) && (c1 < 2048)) { + enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128); + } else { + enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128); + } + if (enc !== null) { + if (end > start) { + utftext += string.substring(start, end); + } + utftext += enc; + start = end = n + 1; + } + } + + if (end > start) { + utftext += string.substring(start, string.length); + } + + return utftext; +}; + +_.UUID = (function() { + + // Time/ticks information + // 1*new Date() is a cross browser version of Date.now() + var T = function() { + var d = 1 * new Date(), + i = 0; + + // this while loop figures how many browser ticks go by + // before 1*new Date() returns a new number, ie the amount + // of ticks that go by per millisecond + while (d == 1 * new Date()) { + i++; + } + + return d.toString(16) + i.toString(16); + }; + + // Math.Random entropy + var R = function() { + return Math.random().toString(16).replace('.', ''); + }; + + // User agent entropy + // This function takes the user agent string, and then xors + // together each sequence of 8 bytes. This produces a final + // sequence of 8 bytes which it returns as hex. + var UA = function() { + var ua = userAgent, + i, ch, buffer = [], + ret = 0; + + function xor(result, byte_array) { + var j, tmp = 0; + for (j = 0; j < byte_array.length; j++) { + tmp |= (buffer[j] << j * 8); + } + return result ^ tmp; + } + + for (i = 0; i < ua.length; i++) { + ch = ua.charCodeAt(i); + buffer.unshift(ch & 0xFF); + if (buffer.length >= 4) { + ret = xor(ret, buffer); + buffer = []; + } + } + + if (buffer.length > 0) { + ret = xor(ret, buffer); + } + + return ret.toString(16); + }; + + return function() { + var se = (screen.height * screen.width).toString(16); + return (T() + '-' + R() + '-' + UA() + '-' + se + '-' + T()); + }; +})(); + +// _.isBlockedUA() +// This is to block various web spiders from executing our JS and +// sending false tracking data +_.isBlockedUA = function(ua) { + if (/(google web preview|baiduspider|yandexbot|bingbot|googlebot|yahoo! slurp)/i.test(ua)) { + return true; + } + return false; +}; + +/** + * @param {Object=} formdata + * @param {string=} arg_separator + */ +_.HTTPBuildQuery = function(formdata, arg_separator) { + var use_val, use_key, tmp_arr = []; + + if (_.isUndefined(arg_separator)) { + arg_separator = '&'; + } + + _.each(formdata, function(val, key) { + use_val = encodeURIComponent(val.toString()); + use_key = encodeURIComponent(key); + tmp_arr[tmp_arr.length] = use_key + '=' + use_val; + }); + + return tmp_arr.join(arg_separator); +}; + +_.getQueryParam = function(url, param) { + // Expects a raw URL + + param = param.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]'); + var regexS = '[\\?&]' + param + '=([^&#]*)', + regex = new RegExp(regexS), + results = regex.exec(url); + if (results === null || (results && typeof(results[1]) !== 'string' && results[1].length)) { + return ''; + } else { + return decodeURIComponent(results[1]).replace(/\+/g, ' '); + } +}; + +_.getHashParam = function(hash, param) { + var matches = hash.match(new RegExp(param + '=([^&]*)')); + return matches ? matches[1] : null; +}; + +// _.cookie +// Methods partially borrowed from quirksmode.org/js/cookies.html +_.cookie = { + get: function(name) { + var nameEQ = name + '='; + var ca = document$1.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1, c.length); + } + if (c.indexOf(nameEQ) === 0) { + return decodeURIComponent(c.substring(nameEQ.length, c.length)); + } + } + return null; + }, + + parse: function(name) { + var cookie; + try { + cookie = _.JSONDecode(_.cookie.get(name)) || {}; + } catch (err) { + // noop + } + return cookie; + }, + + set_seconds: function(name, value, seconds, cross_subdomain, is_secure) { + var cdomain = '', + expires = '', + secure = ''; + + if (cross_subdomain) { + var matches = document$1.location.hostname.match(/[a-z0-9][a-z0-9\-]+\.[a-z\.]{2,6}$/i), + domain = matches ? matches[0] : ''; + + cdomain = ((domain) ? '; domain=.' + domain : ''); + } + + if (seconds) { + var date = new Date(); + date.setTime(date.getTime() + (seconds * 1000)); + expires = '; expires=' + date.toGMTString(); + } + + if (is_secure) { + secure = '; secure'; + } + + document$1.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure; + }, + + set: function(name, value, days, cross_subdomain, is_secure) { + var cdomain = '', expires = '', secure = ''; + + if (cross_subdomain) { + var matches = document$1.location.hostname.match(/[a-z0-9][a-z0-9\-]+\.[a-z\.]{2,6}$/i), + domain = matches ? matches[0] : ''; + + cdomain = ((domain) ? '; domain=.' + domain : ''); + } + + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = '; expires=' + date.toGMTString(); + } + + if (is_secure) { + secure = '; secure'; + } + + var new_cookie_val = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure; + document$1.cookie = new_cookie_val; + return new_cookie_val; + }, + + remove: function(name, cross_subdomain) { + _.cookie.set(name, '', -1, cross_subdomain); + } +}; + +// _.localStorage +var _localStorage_supported = null; +_.localStorage = { + is_supported: function() { + if (_localStorage_supported !== null) { + return _localStorage_supported; + } + + var supported = true; + try { + var key = '__mplssupport__', + val = 'xyz'; + _.localStorage.set(key, val); + if (_.localStorage.get(key) !== val) { + supported = false; + } + _.localStorage.remove(key); + } catch (err) { + supported = false; + } + if (!supported) { + console$1.error('localStorage unsupported; falling back to cookie store'); + } + + _localStorage_supported = supported; + return supported; + }, + + error: function(msg) { + console$1.error('localStorage error: ' + msg); + }, + + get: function(name) { + try { + return window.localStorage.getItem(name); + } catch (err) { + _.localStorage.error(err); + } + return null; + }, + + parse: function(name) { + try { + return _.JSONDecode(_.localStorage.get(name)) || {}; + } catch (err) { + // noop + } + return null; + }, + + set: function(name, value) { + try { + window.localStorage.setItem(name, value); + } catch (err) { + _.localStorage.error(err); + } + }, + + remove: function(name) { + try { + window.localStorage.removeItem(name); + } catch (err) { + _.localStorage.error(err); + } + } +}; + +_.register_event = (function() { + // written by Dean Edwards, 2005 + // with input from Tino Zijdel - crisp@xs4all.nl + // with input from Carl Sverre - mail@carlsverre.com + // with input from Mixpanel + // http://dean.edwards.name/weblog/2005/10/add-event/ + // https://gist.github.com/1930440 + + /** + * @param {Object} element + * @param {string} type + * @param {function(...[*])} handler + * @param {boolean=} oldSchool + * @param {boolean=} useCapture + */ + var register_event = function(element, type, handler, oldSchool, useCapture) { + if (!element) { + console$1.error('No valid element provided to register_event'); + return; + } + + if (element.addEventListener && !oldSchool) { + element.addEventListener(type, handler, !!useCapture); + } else { + var ontype = 'on' + type; + var old_handler = element[ontype]; // can be undefined + element[ontype] = makeHandler(element, handler, old_handler); + } + }; + + function makeHandler(element, new_handler, old_handlers) { + var handler = function(event) { + event = event || fixEvent(window.event); + + // this basically happens in firefox whenever another script + // overwrites the onload callback and doesn't pass the event + // object to previously defined callbacks. All the browsers + // that don't define window.event implement addEventListener + // so the dom_loaded handler will still be fired as usual. + if (!event) { + return undefined; + } + + var ret = true; + var old_result, new_result; + + if (_.isFunction(old_handlers)) { + old_result = old_handlers(event); + } + new_result = new_handler.call(element, event); + + if ((false === old_result) || (false === new_result)) { + ret = false; + } + + return ret; + }; + + return handler; + } + + function fixEvent(event) { + if (event) { + event.preventDefault = fixEvent.preventDefault; + event.stopPropagation = fixEvent.stopPropagation; + } + return event; + } + fixEvent.preventDefault = function() { + this.returnValue = false; + }; + fixEvent.stopPropagation = function() { + this.cancelBubble = true; + }; + + return register_event; +})(); + +_.dom_query = (function() { + /* document.getElementsBySelector(selector) + - returns an array of element objects from the current document + matching the CSS selector. Selectors can contain element names, + class names and ids and can be nested. For example: + + elements = document.getElementsBySelector('div#main p a.external') + + Will return an array of all 'a' elements with 'external' in their + class attribute that are contained inside 'p' elements that are + contained inside the 'div' element which has id="main" + + New in version 0.4: Support for CSS2 and CSS3 attribute selectors: + See http://www.w3.org/TR/css3-selectors/#attribute-selectors + + Version 0.4 - Simon Willison, March 25th 2003 + -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows + -- Opera 7 fails + + Version 0.5 - Carl Sverre, Jan 7th 2013 + -- Now uses jQuery-esque `hasClass` for testing class name + equality. This fixes a bug related to '-' characters being + considered not part of a 'word' in regex. + */ + + function getAllChildren(e) { + // Returns all children of element. Workaround required for IE5/Windows. Ugh. + return e.all ? e.all : e.getElementsByTagName('*'); + } + + var bad_whitespace = /[\t\r\n]/g; + + function hasClass(elem, selector) { + var className = ' ' + selector + ' '; + return ((' ' + elem.className + ' ').replace(bad_whitespace, ' ').indexOf(className) >= 0); + } + + function getElementsBySelector(selector) { + // Attempt to fail gracefully in lesser browsers + if (!document$1.getElementsByTagName) { + return []; + } + // Split selector in to tokens + var tokens = selector.split(' '); + var token, bits, tagName, found, foundCount, i, j, k, elements, currentContextIndex; + var currentContext = [document$1]; + for (i = 0; i < tokens.length; i++) { + token = tokens[i].replace(/^\s+/, '').replace(/\s+$/, ''); + if (token.indexOf('#') > -1) { + // Token is an ID selector + bits = token.split('#'); + tagName = bits[0]; + var id = bits[1]; + var element = document$1.getElementById(id); + if (!element || (tagName && element.nodeName.toLowerCase() != tagName)) { + // element not found or tag with that ID not found, return false + return []; + } + // Set currentContext to contain just this element + currentContext = [element]; + continue; // Skip to next token + } + if (token.indexOf('.') > -1) { + // Token contains a class selector + bits = token.split('.'); + tagName = bits[0]; + var className = bits[1]; + if (!tagName) { + tagName = '*'; + } + // Get elements matching tag, filter them for class selector + found = []; + foundCount = 0; + for (j = 0; j < currentContext.length; j++) { + if (tagName == '*') { + elements = getAllChildren(currentContext[j]); + } else { + elements = currentContext[j].getElementsByTagName(tagName); + } + for (k = 0; k < elements.length; k++) { + found[foundCount++] = elements[k]; + } + } + currentContext = []; + currentContextIndex = 0; + for (j = 0; j < found.length; j++) { + if (found[j].className && + _.isString(found[j].className) && // some SVG elements have classNames which are not strings + hasClass(found[j], className) + ) { + currentContext[currentContextIndex++] = found[j]; + } + } + continue; // Skip to next token + } + // Code to deal with attribute selectors + var token_match = token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/); + if (token_match) { + tagName = token_match[1]; + var attrName = token_match[2]; + var attrOperator = token_match[3]; + var attrValue = token_match[4]; + if (!tagName) { + tagName = '*'; + } + // Grab all of the tagName elements within current context + found = []; + foundCount = 0; + for (j = 0; j < currentContext.length; j++) { + if (tagName == '*') { + elements = getAllChildren(currentContext[j]); + } else { + elements = currentContext[j].getElementsByTagName(tagName); + } + for (k = 0; k < elements.length; k++) { + found[foundCount++] = elements[k]; + } + } + currentContext = []; + currentContextIndex = 0; + var checkFunction; // This function will be used to filter the elements + switch (attrOperator) { + case '=': // Equality + checkFunction = function(e) { + return (e.getAttribute(attrName) == attrValue); + }; + break; + case '~': // Match one of space seperated words + checkFunction = function(e) { + return (e.getAttribute(attrName).match(new RegExp('\\b' + attrValue + '\\b'))); + }; + break; + case '|': // Match start with value followed by optional hyphen + checkFunction = function(e) { + return (e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?'))); + }; + break; + case '^': // Match starts with value + checkFunction = function(e) { + return (e.getAttribute(attrName).indexOf(attrValue) === 0); + }; + break; + case '$': // Match ends with value - fails with "Warning" in Opera 7 + checkFunction = function(e) { + return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); + }; + break; + case '*': // Match ends with value + checkFunction = function(e) { + return (e.getAttribute(attrName).indexOf(attrValue) > -1); + }; + break; + default: + // Just test for existence of attribute + checkFunction = function(e) { + return e.getAttribute(attrName); + }; + } + currentContext = []; + currentContextIndex = 0; + for (j = 0; j < found.length; j++) { + if (checkFunction(found[j])) { + currentContext[currentContextIndex++] = found[j]; + } + } + // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue); + continue; // Skip to next token + } + // If we get here, token is JUST an element (not a class or ID selector) + tagName = token; + found = []; + foundCount = 0; + for (j = 0; j < currentContext.length; j++) { + elements = currentContext[j].getElementsByTagName(tagName); + for (k = 0; k < elements.length; k++) { + found[foundCount++] = elements[k]; + } + } + currentContext = found; + } + return currentContext; + } + + return function(query) { + if (_.isElement(query)) { + return [query]; + } else if (_.isObject(query) && !_.isUndefined(query.length)) { + return query; + } else { + return getElementsBySelector.call(this, query); + } + }; +})(); + +_.info = { + campaignParams: function() { + var campaign_keywords = 'utm_source utm_medium utm_campaign utm_content utm_term'.split(' '), + kw = '', + params = {}; + _.each(campaign_keywords, function(kwkey) { + kw = _.getQueryParam(document$1.URL, kwkey); + if (kw.length) { + params[kwkey] = kw; + } + }); + + return params; + }, + + searchEngine: function(referrer) { + if (referrer.search('https?://(.*)google.([^/?]*)') === 0) { + return 'google'; + } else if (referrer.search('https?://(.*)bing.com') === 0) { + return 'bing'; + } else if (referrer.search('https?://(.*)yahoo.com') === 0) { + return 'yahoo'; + } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) { + return 'duckduckgo'; + } else { + return null; + } + }, + + searchInfo: function(referrer) { + var search = _.info.searchEngine(referrer), + param = (search != 'yahoo') ? 'q' : 'p', + ret = {}; + + if (search !== null) { + ret['$search_engine'] = search; + + var keyword = _.getQueryParam(referrer, param); + if (keyword.length) { + ret['mp_keyword'] = keyword; + } + } + + return ret; + }, + + /** + * This function detects which browser is running this script. + * The order of the checks are important since many user agents + * include key words used in later checks. + */ + browser: function(user_agent, vendor, opera) { + vendor = vendor || ''; // vendor is undefined for at least IE9 + if (opera || _.includes(user_agent, ' OPR/')) { + if (_.includes(user_agent, 'Mini')) { + return 'Opera Mini'; + } + return 'Opera'; + } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) { + return 'BlackBerry'; + } else if (_.includes(user_agent, 'IEMobile') || _.includes(user_agent, 'WPDesktop')) { + return 'Internet Explorer Mobile'; + } else if (_.includes(user_agent, 'Edge')) { + return 'Microsoft Edge'; + } else if (_.includes(user_agent, 'FBIOS')) { + return 'Facebook Mobile'; + } else if (_.includes(user_agent, 'Chrome')) { + return 'Chrome'; + } else if (_.includes(user_agent, 'CriOS')) { + return 'Chrome iOS'; + } else if (_.includes(user_agent, 'UCWEB') || _.includes(user_agent, 'UCBrowser')) { + return 'UC Browser'; + } else if (_.includes(user_agent, 'FxiOS')) { + return 'Firefox iOS'; + } else if (_.includes(vendor, 'Apple')) { + if (_.includes(user_agent, 'Mobile')) { + return 'Mobile Safari'; + } + return 'Safari'; + } else if (_.includes(user_agent, 'Android')) { + return 'Android Mobile'; + } else if (_.includes(user_agent, 'Konqueror')) { + return 'Konqueror'; + } else if (_.includes(user_agent, 'Firefox')) { + return 'Firefox'; + } else if (_.includes(user_agent, 'MSIE') || _.includes(user_agent, 'Trident/')) { + return 'Internet Explorer'; + } else if (_.includes(user_agent, 'Gecko')) { + return 'Mozilla'; + } else { + return ''; + } + }, + + /** + * This function detects which browser version is running this script, + * parsing major and minor version (e.g., 42.1). User agent strings from: + * http://www.useragentstring.com/pages/useragentstring.php + */ + browserVersion: function(userAgent, vendor, opera) { + var browser = _.info.browser(userAgent, vendor, opera); + var versionRegexs = { + 'Internet Explorer Mobile': /rv:(\d+(\.\d+)?)/, + 'Microsoft Edge': /Edge\/(\d+(\.\d+)?)/, + 'Chrome': /Chrome\/(\d+(\.\d+)?)/, + 'Chrome iOS': /CriOS\/(\d+(\.\d+)?)/, + 'UC Browser' : /(UCBrowser|UCWEB)\/(\d+(\.\d+)?)/, + 'Safari': /Version\/(\d+(\.\d+)?)/, + 'Mobile Safari': /Version\/(\d+(\.\d+)?)/, + 'Opera': /(Opera|OPR)\/(\d+(\.\d+)?)/, + 'Firefox': /Firefox\/(\d+(\.\d+)?)/, + 'Firefox iOS': /FxiOS\/(\d+(\.\d+)?)/, + 'Konqueror': /Konqueror:(\d+(\.\d+)?)/, + 'BlackBerry': /BlackBerry (\d+(\.\d+)?)/, + 'Android Mobile': /android\s(\d+(\.\d+)?)/, + 'Internet Explorer': /(rv:|MSIE )(\d+(\.\d+)?)/, + 'Mozilla': /rv:(\d+(\.\d+)?)/ + }; + var regex = versionRegexs[browser]; + if (regex === undefined) { + return null; + } + var matches = userAgent.match(regex); + if (!matches) { + return null; + } + return parseFloat(matches[matches.length - 2]); + }, + + os: function() { + var a = userAgent; + if (/Windows/i.test(a)) { + if (/Phone/.test(a) || /WPDesktop/.test(a)) { + return 'Windows Phone'; + } + return 'Windows'; + } else if (/(iPhone|iPad|iPod)/.test(a)) { + return 'iOS'; + } else if (/Android/.test(a)) { + return 'Android'; + } else if (/(BlackBerry|PlayBook|BB10)/i.test(a)) { + return 'BlackBerry'; + } else if (/Mac/i.test(a)) { + return 'Mac OS X'; + } else if (/Linux/.test(a)) { + return 'Linux'; + } else if (/CrOS/.test(a)) { + return 'Chrome OS'; + } else { + return ''; + } + }, + + device: function(user_agent) { + if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) { + return 'Windows Phone'; + } else if (/iPad/.test(user_agent)) { + return 'iPad'; + } else if (/iPod/.test(user_agent)) { + return 'iPod Touch'; + } else if (/iPhone/.test(user_agent)) { + return 'iPhone'; + } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) { + return 'BlackBerry'; + } else if (/Android/.test(user_agent)) { + return 'Android'; + } else { + return ''; + } + }, + + referringDomain: function(referrer) { + var split = referrer.split('/'); + if (split.length >= 3) { + return split[2]; + } + return ''; + }, + + properties: function() { + return _.extend(_.strip_empty_properties({ + '$os': _.info.os(), + '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera), + '$referrer': document$1.referrer, + '$referring_domain': _.info.referringDomain(document$1.referrer), + '$device': _.info.device(userAgent) + }), { + '$current_url': window$1.location.href, + '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera), + '$screen_height': screen.height, + '$screen_width': screen.width, + 'mp_lib': 'web', + '$lib_version': Config.LIB_VERSION + }); + }, + + people_properties: function() { + return _.extend(_.strip_empty_properties({ + '$os': _.info.os(), + '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera) + }), { + '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera) + }); + }, + + pageviewInfo: function(page) { + return _.strip_empty_properties({ + 'mp_page': page, + 'mp_referrer': document$1.referrer, + 'mp_browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera), + 'mp_platform': _.info.os() + }); + } +}; + +// EXPORTS (for closure compiler) +_['toArray'] = _.toArray; +_['isObject'] = _.isObject; +_['JSONEncode'] = _.JSONEncode; +_['JSONDecode'] = _.JSONDecode; +_['isBlockedUA'] = _.isBlockedUA; +_['isEmptyObject'] = _.isEmptyObject; +_['info'] = _.info; +_['info']['device'] = _.info.device; +_['info']['browser'] = _.info.browser; +_['info']['properties'] = _.info.properties; + +/* + * Get the className of an element, accounting for edge cases where element.className is an object + * @param {Element} el - element to get the className of + * @returns {string} the element's class + */ +function getClassName(el) { + switch(typeof el.className) { + case 'string': + return el.className; + case 'object': // handle cases where className might be SVGAnimatedString or some other type + return el.className.baseVal || el.getAttribute('class') || ''; + default: // future proof + return ''; + } +} + +/* + * Get the direct text content of an element, protecting against sensitive data collection. + * Concats textContent of each of the element's text node children; this avoids potential + * collection of sensitive data that could happen if we used element.textContent and the + * element had sensitive child elements, since element.textContent includes child content. + * Scrubs values that look like they could be sensitive (i.e. cc or ssn number). + * @param {Element} el - element to get the text of + * @returns {string} the element's direct text content + */ +function getSafeText(el) { + var elText = ''; + + if (shouldTrackElement(el) && el.childNodes && el.childNodes.length) { + _.each(el.childNodes, function(child) { + if (isTextNode(child) && child.textContent) { + elText += _.trim(child.textContent) + // scrub potentially sensitive values + .split(/(\s+)/).filter(shouldTrackValue).join('') + // normalize whitespace + .replace(/[\r\n]/g, ' ').replace(/[ ]+/g, ' ') + // truncate + .substring(0, 255); + } + }); + } + + return _.trim(elText); +} + +/* + * Check whether an element has nodeType Node.ELEMENT_NODE + * @param {Element} el - element to check + * @returns {boolean} whether el is of the correct nodeType + */ +function isElementNode(el) { + return el && el.nodeType === 1; // Node.ELEMENT_NODE - use integer constant for browser portability +} + +/* + * Check whether an element is of a given tag type. + * Due to potential reference discrepancies (such as the webcomponents.js polyfill), + * we want to match tagNames instead of specific references because something like + * element === document.body won't always work because element might not be a native + * element. + * @param {Element} el - element to check + * @param {string} tag - tag name (e.g., "div") + * @returns {boolean} whether el is of the given tag type + */ +function isTag(el, tag) { + return el && el.tagName && el.tagName.toLowerCase() === tag.toLowerCase(); +} + +/* + * Check whether an element has nodeType Node.TEXT_NODE + * @param {Element} el - element to check + * @returns {boolean} whether el is of the correct nodeType + */ +function isTextNode(el) { + return el && el.nodeType === 3; // Node.TEXT_NODE - use integer constant for browser portability +} + +/* + * Check whether a DOM event should be "tracked" or if it may contain sentitive data + * using a variety of heuristics. + * @param {Element} el - element to check + * @param {Event} event - event to check + * @returns {boolean} whether the event should be tracked + */ +function shouldTrackDomEvent(el, event) { + if (!el || isTag(el, 'html') || !isElementNode(el)) { + return false; + } + var tag = el.tagName.toLowerCase(); + switch (tag) { + case 'html': + return false; + case 'form': + return event.type === 'submit'; + case 'input': + if (['button', 'submit'].indexOf(el.getAttribute('type')) === -1) { + return event.type === 'change'; + } else { + return event.type === 'click'; + } + case 'select': + case 'textarea': + return event.type === 'change'; + default: + return event.type === 'click'; + } +} + +/* + * Check whether a DOM element should be "tracked" or if it may contain sentitive data + * using a variety of heuristics. + * @param {Element} el - element to check + * @returns {boolean} whether the element should be tracked + */ +function shouldTrackElement(el) { + for (var curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode) { + var classes = getClassName(curEl).split(' '); + if (_.includes(classes, 'mp-sensitive') || _.includes(classes, 'mp-no-track')) { + return false; + } + } + + if (_.includes(getClassName(el).split(' '), 'mp-include')) { + return true; + } + + // don't send data from inputs or similar elements since there will always be + // a risk of clientside javascript placing sensitive data in attributes + if ( + isTag(el, 'input') || + isTag(el, 'select') || + isTag(el, 'textarea') || + el.getAttribute('contenteditable') === 'true' + ) { + return false; + } + + // don't include hidden or password fields + var type = el.type || ''; + if (typeof type === 'string') { // it's possible for el.type to be a DOM element if el is a form with a child input[name="type"] + switch(type.toLowerCase()) { + case 'hidden': + return false; + case 'password': + return false; + } + } + + // filter out data from fields that look like sensitive fields + var name = el.name || el.id || ''; + if (typeof name === 'string') { // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name="name"] + var sensitiveNameRegex = /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i; + if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) { + return false; + } + } + + return true; +} + +/* + * Check whether a string value should be "tracked" or if it may contain sentitive data + * using a variety of heuristics. + * @param {string} value - string value to check + * @returns {boolean} whether the element should be tracked + */ +function shouldTrackValue(value) { + if (value === null || _.isUndefined(value)) { + return false; + } + + if (typeof value === 'string') { + value = _.trim(value); + + // check to see if input value looks like a credit card number + // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html + var ccRegex = /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/; + if (ccRegex.test((value || '').replace(/[\- ]/g, ''))) { + return false; + } + + // check to see if input value looks like a social security number + var ssnRegex = /(^\d{3}-?\d{2}-?\d{4}$)/; + if (ssnRegex.test(value)) { + return false; + } + } + + return true; +} + +var autotrack = { + _initializedTokens: [], + + _previousElementSibling: function(el) { + if (el.previousElementSibling) { + return el.previousElementSibling; + } else { + do { + el = el.previousSibling; + } while (el && !isElementNode(el)); + return el; + } + }, + + _loadScript: function(scriptUrlToLoad, callback) { + var scriptTag = document.createElement('script'); + scriptTag.type = 'text/javascript'; + scriptTag.src = scriptUrlToLoad; + scriptTag.onload = callback; + + var scripts = document.getElementsByTagName('script'); + if (scripts.length > 0) { + scripts[0].parentNode.insertBefore(scriptTag, scripts[0]); + } else { + document.body.appendChild(scriptTag); + } + }, + + _getPropertiesFromElement: function(elem) { + var props = { + 'classes': getClassName(elem).split(' '), + 'tag_name': elem.tagName.toLowerCase() + }; + + if (shouldTrackElement(elem)) { + _.each(elem.attributes, function(attr) { + if (shouldTrackValue(attr.value)) { + props['attr__' + attr.name] = attr.value; + } + }); + } + + var nthChild = 1; + var nthOfType = 1; + var currentElem = elem; + while (currentElem = this._previousElementSibling(currentElem)) { // eslint-disable-line no-cond-assign + nthChild++; + if (currentElem.tagName === elem.tagName) { + nthOfType++; + } + } + props['nth_child'] = nthChild; + props['nth_of_type'] = nthOfType; + + return props; + }, + + _getDefaultProperties: function(eventType) { + return { + '$event_type': eventType, + '$ce_version': 1, + '$host': window.location.host, + '$pathname': window.location.pathname + }; + }, + + _extractCustomPropertyValue: function(customProperty) { + var propValues = []; + _.each(document.querySelectorAll(customProperty['css_selector']), function(matchedElem) { + var value; + + if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) { + value = matchedElem['value']; + } else if (matchedElem['textContent']) { + value = matchedElem['textContent']; + } + + if (shouldTrackValue(value)) { + propValues.push(value); + } + }); + return propValues.join(', '); + }, + + _getCustomProperties: function(targetElementList) { + var props = {}; + _.each(this._customProperties, function(customProperty) { + _.each(customProperty['event_selectors'], function(eventSelector) { + var eventElements = document.querySelectorAll(eventSelector); + _.each(eventElements, function(eventElement) { + if (_.includes(targetElementList, eventElement) && shouldTrackElement(eventElement)) { + props[customProperty['name']] = this._extractCustomPropertyValue(customProperty); + } + }, this); + }, this); + }, this); + return props; + }, + + _getEventTarget: function(e) { + // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes + if (typeof e.target === 'undefined') { + return e.srcElement; + } else { + return e.target; + } + }, + + _trackEvent: function(e, instance) { + /*** Don't mess with this code without running IE8 tests on it ***/ + var target = this._getEventTarget(e); + if (isTextNode(target)) { // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html) + target = target.parentNode; + } + + if (shouldTrackDomEvent(target, e)) { + var targetElementList = [target]; + var curEl = target; + while (curEl.parentNode && !isTag(curEl, 'body')) { + targetElementList.push(curEl.parentNode); + curEl = curEl.parentNode; + } + + var elementsJson = []; + var href, explicitNoTrack = false; + _.each(targetElementList, function(el) { + var shouldTrackEl = shouldTrackElement(el); + + // if the element or a parent element is an anchor tag + // include the href as a property + if (el.tagName.toLowerCase() === 'a') { + href = el.getAttribute('href'); + href = shouldTrackEl && shouldTrackValue(href) && href; + } + + // allow users to programatically prevent tracking of elements by adding class 'mp-no-track' + var classes = getClassName(el).split(' '); + if (_.includes(classes, 'mp-no-track')) { + explicitNoTrack = true; + } + + elementsJson.push(this._getPropertiesFromElement(el)); + }, this); + + if (explicitNoTrack) { + return false; + } + + // only populate text content from target element (not parents) + // to prevent text within a sensitive element from being collected + // as part of a parent's el.textContent + var elementText; + var safeElementText = getSafeText(target); + if (safeElementText && safeElementText.length) { + elementText = safeElementText; + } + + var props = _.extend( + this._getDefaultProperties(e.type), + { + '$elements': elementsJson, + '$el_attr__href': href, + '$el_text': elementText + }, + this._getCustomProperties(targetElementList) + ); + + instance.track('$web_event', props); + return true; + } + }, + + // only reason is to stub for unit tests + // since you can't override window.location props + _navigate: function(href) { + window.location.href = href; + }, + + _addDomEventHandlers: function(instance) { + var handler = _.bind(function(e) { + e = e || window.event; + this._trackEvent(e, instance); + }, this); + _.register_event(document, 'submit', handler, false, true); + _.register_event(document, 'change', handler, false, true); + _.register_event(document, 'click', handler, false, true); + }, + + _customProperties: {}, + init: function(instance) { + if (!(document && document.body)) { + console.log('document not ready yet, trying again in 500 milliseconds...'); + var that = this; + setTimeout(function() { that.init(instance); }, 500); + return; + } + + var token = instance.get_config('token'); + if (this._initializedTokens.indexOf(token) > -1) { + console.log('autotrack already initialized for token "' + token + '"'); + return; + } + this._initializedTokens.push(token); + + if (!this._maybeLoadEditor(instance)) { // don't autotrack actions when the editor is enabled + var parseDecideResponse = _.bind(function(response) { + if (response && response['config'] && response['config']['enable_collect_everything'] === true) { + + if (response['custom_properties']) { + this._customProperties = response['custom_properties']; + } + + instance.track('$web_event', _.extend({ + '$title': document.title + }, this._getDefaultProperties('pageview'))); + + this._addDomEventHandlers(instance); + + } else { + instance['__autotrack_enabled'] = false; + } + }, this); + + instance._send_request( + instance.get_config('api_host') + '/decide/', { + 'verbose': true, + 'version': '1', + 'lib': 'web', + 'token': token + }, + instance._prepare_callback(parseDecideResponse) + ); + } + }, + + _editorParamsFromHash: function(instance, hash) { + var editorParams; + try { + var state = _.getHashParam(hash, 'state'); + state = JSON.parse(decodeURIComponent(state)); + var expiresInSeconds = _.getHashParam(hash, 'expires_in'); + editorParams = { + 'accessToken': _.getHashParam(hash, 'access_token'), + 'accessTokenExpiresAt': (new Date()).getTime() + (Number(expiresInSeconds) * 1000), + 'bookmarkletMode': !!state['bookmarkletMode'], + 'projectId': state['projectId'], + 'projectOwnerId': state['projectOwnerId'], + 'projectToken': state['token'], + 'readOnly': state['readOnly'], + 'userFlags': state['userFlags'], + 'userId': state['userId'] + }; + window.sessionStorage.setItem('editorParams', JSON.stringify(editorParams)); + + if (state['desiredHash']) { + window.location.hash = state['desiredHash']; + } else if (window.history) { + history.replaceState('', document.title, window.location.pathname + window.location.search); // completely remove hash + } else { + window.location.hash = ''; // clear hash (but leaves # unfortunately) + } + } catch (e) { + console.error('Unable to parse data from hash', e); + } + return editorParams; + }, + + /** + * To load the visual editor, we need an access token and other state. That state comes from one of three places: + * 1. In the URL hash params if the customer is using an old snippet + * 2. From session storage under the key `_mpcehash` if the snippet already parsed the hash + * 3. From session storage under the key `editorParams` if the editor was initialized on a previous page + */ + _maybeLoadEditor: function(instance) { + try { + var parseFromUrl = false; + if (_.getHashParam(window.location.hash, 'state')) { + var state = _.getHashParam(window.location.hash, 'state'); + state = JSON.parse(decodeURIComponent(state)); + parseFromUrl = state['action'] === 'mpeditor'; + } + var parseFromStorage = !!window.sessionStorage.getItem('_mpcehash'); + var editorParams; + + if (parseFromUrl) { // happens if they are initializing the editor using an old snippet + editorParams = this._editorParamsFromHash(instance, window.location.hash); + } else if (parseFromStorage) { // happens if they are initialized the editor and using the new snippet + editorParams = this._editorParamsFromHash(instance, window.sessionStorage.getItem('_mpcehash')); + window.sessionStorage.removeItem('_mpcehash'); + } else { // get credentials from sessionStorage from a previous initialzation + editorParams = JSON.parse(window.sessionStorage.getItem('editorParams') || '{}'); + } + + if (editorParams['projectToken'] && instance.get_config('token') === editorParams['projectToken']) { + this._loadEditor(instance, editorParams); + return true; + } else { + return false; + } + } catch (e) { + return false; + } + }, + + _loadEditor: function(instance, editorParams) { + if (!window['_mpEditorLoaded']) { // only load the codeless event editor once, even if there are multiple instances of MixpanelLib + window['_mpEditorLoaded'] = true; + var editorUrl = instance.get_config('app_host') + + '/js-bundle/reports/collect-everything/editor.js?_ts=' + + (new Date()).getTime(); + this._loadScript(editorUrl, function() { + window['mp_load_editor'](editorParams); + }); + return true; + } + return false; + }, + + // this is a mechanism to ramp up CE with no server-side interaction. + // when CE is active, every page load results in a decide request. we + // need to gently ramp this up so we don't overload decide. this decides + // deterministically if CE is enabled for this project by modding the char + // value of the project token. + enabledForProject: function(token, numBuckets, numEnabledBuckets) { + numBuckets = !_.isUndefined(numBuckets) ? numBuckets : 10; + numEnabledBuckets = !_.isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10; + var charCodeSum = 0; + for (var i = 0; i < token.length; i++) { + charCodeSum += token.charCodeAt(i); + } + return (charCodeSum % numBuckets) < numEnabledBuckets; + }, + + isBrowserSupported: function() { + return _.isFunction(document.querySelectorAll); + } +}; + +_.bind_instance_methods(autotrack); +_.safewrap_instance_methods(autotrack); + +/** + * A function used to track a Mixpanel event (e.g. MixpanelLib.track) + * @callback trackFunction + * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc. + * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself. + * @param {Function} [callback] If provided, the callback function will be called after tracking the event. + */ + +/** Public **/ + +var GDPR_DEFAULT_PERSISTENCE_PREFIX = '__mp_opt_in_out_'; + +/** + * Opt the user in to data tracking and cookies/localstorage for the given token + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {trackFunction} [options.track] - function used for tracking a Mixpanel event to record the opt-in action + * @param {string} [options.trackEventName] - event name to be used for tracking the opt-in action + * @param {Object} [options.trackProperties] - set of properties to be tracked along with the opt-in action + * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires + * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not + * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not + */ +function optIn(token, options) { + _optInOut(true, token, options); +} + +/** + * Opt the user out of data tracking and cookies/localstorage for the given token + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires + * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not + * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not + */ +function optOut(token, options) { + _optInOut(false, token, options); +} + +/** + * Check whether the user has opted in to data tracking and cookies/localstorage for the given token + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @returns {boolean} whether the user has opted in to the given opt type + */ +function hasOptedIn(token, options) { + return _getStorageValue(token, options) === '1'; +} + +/** + * Check whether the user has opted out of data tracking and cookies/localstorage for the given token + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @returns {boolean} whether the user has opted out of the given opt type + */ +function hasOptedOut(token, options) { + if (_hasDoNotTrackFlagOn()) { + return true; + } + return _getStorageValue(token, options) === '0'; +} + +/** + * Wrap a MixpanelLib method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token + * If the user has opted out, return early instead of executing the method. + * If a callback argument was provided, execute it passing the 0 error code. + * @param {function} method - wrapped method to be executed if the user has not opted out + * @returns {*} the result of executing method OR undefined if the user has opted out + */ +function addOptOutCheckMixpanelLib(method) { + return _addOptOutCheck(method, function(name) { + return this.get_config(name); + }); +} + +/** + * Wrap a MixpanelPeople method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token + * If the user has opted out, return early instead of executing the method. + * If a callback argument was provided, execute it passing the 0 error code. + * @param {function} method - wrapped method to be executed if the user has not opted out + * @returns {*} the result of executing method OR undefined if the user has opted out + */ +function addOptOutCheckMixpanelPeople(method) { + return _addOptOutCheck(method, function(name) { + return this._get_config(name); + }); +} + +/** + * Clear the user's opt in/out status of data tracking and cookies/localstorage for the given token + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires + * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not + * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not + */ +function clearOptInOut(token, options) { + options = options || {}; + _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie); +} + +/** Private **/ + +/** + * Get storage util + * @param {Object} [options] + * @param {string} [options.persistenceType] + * @returns {object} either _.cookie or _.localstorage + */ +function _getStorage(options) { + options = options || {}; + return options.persistenceType === 'localStorage' ? _.localStorage : _.cookie; +} + +/** + * Get the name of the cookie that is used for the given opt type (tracking, cookie, etc.) + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @returns {string} the name of the cookie for the given opt type + */ +function _getStorageKey(token, options) { + options = options || {}; + return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token; +} + +/** + * Get the value of the cookie that is used for the given opt type (tracking, cookie, etc.) + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @returns {string} the value of the cookie for the given opt type + */ +function _getStorageValue(token, options) { + return _getStorage(options).get(_getStorageKey(token, options)); +} + +/** + * Check whether the user has set the DNT/doNotTrack setting to true in their browser + * @returns {boolean} whether the DNT setting is true + */ +function _hasDoNotTrackFlagOn() { + return !!(window$1.navigator && window$1.navigator.doNotTrack === '1'); +} + +/** + * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type + * @param {boolean} optValue - whether to opt the user in or out for the given opt type + * @param {string} token - Mixpanel project tracking token + * @param {Object} [options] + * @param {trackFunction} [options.track] - function used for tracking a Mixpanel event to record the opt-in action + * @param {string} [options.trackEventName] - event name to be used for tracking the opt-in action + * @param {Object} [options.trackProperties] - set of properties to be tracked along with the opt-in action + * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires + * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not + * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not + */ +function _optInOut(optValue, token, options) { + if (!_.isString(token) || !token.length) { + console.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token'); + return; + } + + options = options || {}; + + _getStorage(options).set( + _getStorageKey(token, options), + optValue ? 1 : 0, + _.isNumber(options.cookieExpiration) ? options.cookieExpiration : null, + !!options.crossSubdomainCookie, + !!options.secureCookie + ); + + if (options.track && optValue) { // only track event if opting in (optValue=true) + options.track(options.trackEventName || '$opt_in', options.trackProperties); + } +} + +/** + * Wrap a method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token + * If the user has opted out, return early instead of executing the method. + * If a callback argument was provided, execute it passing the 0 error code. + * @param {function} method - wrapped method to be executed if the user has not opted out + * @param {function} getConfigValue - getter function for the Mixpanel API token and other options to be used with opt-out check + * @returns {*} the result of executing method OR undefined if the user has opted out + */ +function _addOptOutCheck(method, getConfigValue) { + return function() { + var optedOut = false; + + try { + var token = getConfigValue.call(this, 'token'); + var persistenceType = getConfigValue.call(this, 'opt_out_tracking_persistence_type'); + var persistencePrefix = getConfigValue.call(this, 'opt_out_tracking_cookie_prefix'); + + if (token) { // if there was an issue getting the token, continue method execution as normal + optedOut = hasOptedOut(token, { + persistenceType: persistenceType, + persistencePrefix: persistencePrefix + }); + } + } catch(err) { + console.error('Unexpected error when checking tracking opt-out status: ' + err); + } + + if (!optedOut) { + return method.apply(this, arguments); + } + + var callback = arguments[arguments.length - 1]; + if (typeof(callback) === 'function') { + callback(0); + } + + return; + }; +} + +/* + * Mixpanel JS Library + * + * Copyright 2012, Mixpanel, Inc. All Rights Reserved + * http://mixpanel.com/ + * + * Includes portions of Underscore.js + * http://documentcloud.github.com/underscore/ + * (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. + * Released under the MIT License. + */ + +// ==ClosureCompiler== +// @compilation_level ADVANCED_OPTIMIZATIONS +// @output_file_name mixpanel-2.8.min.js +// ==/ClosureCompiler== + +/* +SIMPLE STYLE GUIDE: + +this.x === public function +this._x === internal - only use within this file +this.__x === private - only use within the class + +Globals should be all caps +*/ + +var init_type; // MODULE or SNIPPET loader +var mixpanel_master; // main mixpanel instance / object +var INIT_MODULE = 0; +var INIT_SNIPPET = 1; + +/* + * Constants + */ +/** @const */ var PRIMARY_INSTANCE_NAME = 'mixpanel'; +/** @const */ var SET_QUEUE_KEY = '__mps'; +/** @const */ var SET_ONCE_QUEUE_KEY = '__mpso'; +/** @const */ var UNSET_QUEUE_KEY = '__mpus'; +/** @const */ var ADD_QUEUE_KEY = '__mpa'; +/** @const */ var APPEND_QUEUE_KEY = '__mpap'; +/** @const */ var UNION_QUEUE_KEY = '__mpu'; +/** @const */ var SET_ACTION = '$set'; +/** @const */ var SET_ONCE_ACTION = '$set_once'; +/** @const */ var UNSET_ACTION = '$unset'; +/** @const */ var ADD_ACTION = '$add'; +/** @const */ var APPEND_ACTION = '$append'; +/** @const */ var UNION_ACTION = '$union'; +// This key is deprecated, but we want to check for it to see whether aliasing is allowed. +/** @const */ var PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'; +/** @const */ var ALIAS_ID_KEY = '__alias'; +/** @const */ var CAMPAIGN_IDS_KEY = '__cmpns'; +/** @const */ var EVENT_TIMERS_KEY = '__timers'; +/** @const */ var RESERVED_PROPERTIES = [ + SET_QUEUE_KEY, + SET_ONCE_QUEUE_KEY, + UNSET_QUEUE_KEY, + ADD_QUEUE_KEY, + APPEND_QUEUE_KEY, + UNION_QUEUE_KEY, + PEOPLE_DISTINCT_ID_KEY, + ALIAS_ID_KEY, + CAMPAIGN_IDS_KEY, + EVENT_TIMERS_KEY +]; + +/* + * Dynamic... constants? Is that an oxymoron? + */ + // http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ + // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials +var USE_XHR = (window$1.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()); + + // IE<10 does not support cross-origin XHR's but script tags + // with defer won't block window.onload; ENQUEUE_REQUESTS + // should only be true for Opera<12 +var ENQUEUE_REQUESTS = !USE_XHR && (userAgent.indexOf('MSIE') === -1) && (userAgent.indexOf('Mozilla') === -1); + +/* + * Module-level globals + */ +var DEFAULT_CONFIG = { + 'api_host': 'https://api.mixpanel.com', + 'app_host': 'https://mixpanel.com', + 'autotrack': true, + 'cdn': 'https://cdn.mxpnl.com', + 'cross_subdomain_cookie': true, + 'persistence': 'cookie', + 'persistence_name': '', + 'cookie_name': '', + 'loaded': function() {}, + 'store_google': true, + 'save_referrer': true, + 'test': false, + 'verbose': false, + 'img': false, + 'track_pageview': true, + 'debug': false, + 'track_links_timeout': 300, + 'cookie_expiration': 365, + 'upgrade': false, + 'disable_persistence': false, + 'disable_cookie': false, + 'secure_cookie': false, + 'ip': true, + 'opt_out_tracking_by_default': false, + 'opt_out_tracking_persistence_type': 'localStorage', + 'opt_out_tracking_cookie_prefix': null, + 'property_blacklist': [], + 'xhr_headers': {} // { header: value, header2: value } +}; + +var DOM_LOADED = false; + +/** + * DomTracker Object + * @constructor + */ +var DomTracker = function() {}; + +// interface +DomTracker.prototype.create_properties = function() {}; +DomTracker.prototype.event_handler = function() {}; +DomTracker.prototype.after_track_handler = function() {}; + +DomTracker.prototype.init = function(mixpanel_instance) { + this.mp = mixpanel_instance; + return this; +}; + +/** + * @param {Object|string} query + * @param {string} event_name + * @param {Object=} properties + * @param {function(...[*])=} user_callback + */ +DomTracker.prototype.track = function(query, event_name, properties, user_callback) { + var that = this; + var elements = _.dom_query(query); + + if (elements.length === 0) { + console$1.error('The DOM query (' + query + ') returned 0 elements'); + return; + } + + _.each(elements, function(element) { + _.register_event(element, this.override_event, function(e) { + var options = {}; + var props = that.create_properties(properties, this); + var timeout = that.mp.get_config('track_links_timeout'); + + that.event_handler(e, this, options); + + // in case the mixpanel servers don't get back to us in time + window$1.setTimeout(that.track_callback(user_callback, props, options, true), timeout); + + // fire the tracking event + that.mp.track(event_name, props, that.track_callback(user_callback, props, options)); + }); + }, this); + + return true; +}; + +/** + * @param {function(...[*])} user_callback + * @param {Object} props + * @param {boolean=} timeout_occured + */ +DomTracker.prototype.track_callback = function(user_callback, props, options, timeout_occured) { + timeout_occured = timeout_occured || false; + var that = this; + + return function() { + // options is referenced from both callbacks, so we can have + // a 'lock' of sorts to ensure only one fires + if (options.callback_fired) { return; } + options.callback_fired = true; + + if (user_callback && user_callback(timeout_occured, props) === false) { + // user can prevent the default functionality by + // returning false from their callback + return; + } + + that.after_track_handler(props, options, timeout_occured); + }; +}; + +DomTracker.prototype.create_properties = function(properties, element) { + var props; + + if (typeof(properties) === 'function') { + props = properties(element); + } else { + props = _.extend({}, properties); + } + + return props; +}; + +/** + * LinkTracker Object + * @constructor + * @extends DomTracker + */ +var LinkTracker = function() { + this.override_event = 'click'; +}; +_.inherit(LinkTracker, DomTracker); + +LinkTracker.prototype.create_properties = function(properties, element) { + var props = LinkTracker.superclass.create_properties.apply(this, arguments); + + if (element.href) { props['url'] = element.href; } + + return props; +}; + +LinkTracker.prototype.event_handler = function(evt, element, options) { + options.new_tab = ( + evt.which === 2 || + evt.metaKey || + evt.ctrlKey || + element.target === '_blank' + ); + options.href = element.href; + + if (!options.new_tab) { + evt.preventDefault(); + } +}; + +LinkTracker.prototype.after_track_handler = function(props, options) { + if (options.new_tab) { return; } + + setTimeout(function() { + window$1.location = options.href; + }, 0); +}; + +/** + * FormTracker Object + * @constructor + * @extends DomTracker + */ +var FormTracker = function() { + this.override_event = 'submit'; +}; +_.inherit(FormTracker, DomTracker); + +FormTracker.prototype.event_handler = function(evt, element, options) { + options.element = element; + evt.preventDefault(); +}; + +FormTracker.prototype.after_track_handler = function(props, options) { + setTimeout(function() { + options.element.submit(); + }, 0); +}; + +/** + * Mixpanel Persistence Object + * @constructor + */ +var MixpanelPersistence = function(config) { + this['props'] = {}; + this.campaign_params_saved = false; + + if (config['persistence_name']) { + this.name = 'mp_' + config['persistence_name']; + } else { + this.name = 'mp_' + config['token'] + '_mixpanel'; + } + + var storage_type = config['persistence']; + if (storage_type !== 'cookie' && storage_type !== 'localStorage') { + console$1.critical('Unknown persistence type ' + storage_type + '; falling back to cookie'); + storage_type = config['persistence'] = 'cookie'; + } + + if (storage_type === 'localStorage' && _.localStorage.is_supported()) { + this.storage = _.localStorage; + } else { + this.storage = _.cookie; + } + + this.load(); + this.update_config(config); + this.upgrade(config); + this.save(); +}; + +MixpanelPersistence.prototype.properties = function() { + var p = {}; + // Filter out reserved properties + _.each(this['props'], function(v, k) { + if (!_.include(RESERVED_PROPERTIES, k)) { + p[k] = v; + } + }); + return p; +}; + +MixpanelPersistence.prototype.load = function() { + if (this.disabled) { return; } + + var entry = this.storage.parse(this.name); + + if (entry) { + this['props'] = _.extend({}, entry); + } +}; + +MixpanelPersistence.prototype.upgrade = function(config) { + var upgrade_from_old_lib = config['upgrade'], + old_cookie_name, + old_cookie; + + if (upgrade_from_old_lib) { + old_cookie_name = 'mp_super_properties'; + // Case where they had a custom cookie name before. + if (typeof(upgrade_from_old_lib) === 'string') { + old_cookie_name = upgrade_from_old_lib; + } + + old_cookie = this.storage.parse(old_cookie_name); + + // remove the cookie + this.storage.remove(old_cookie_name); + this.storage.remove(old_cookie_name, true); + + if (old_cookie) { + this['props'] = _.extend( + this['props'], + old_cookie['all'], + old_cookie['events'] + ); + } + } + + if (!config['cookie_name'] && config['name'] !== 'mixpanel') { + // special case to handle people with cookies of the form + // mp_TOKEN_INSTANCENAME from the first release of this library + old_cookie_name = 'mp_' + config['token'] + '_' + config['name']; + old_cookie = this.storage.parse(old_cookie_name); + + if (old_cookie) { + this.storage.remove(old_cookie_name); + this.storage.remove(old_cookie_name, true); + + // Save the prop values that were in the cookie from before - + // this should only happen once as we delete the old one. + this.register_once(old_cookie); + } + } + + if (this.storage === _.localStorage) { + old_cookie = _.cookie.parse(this.name); + + _.cookie.remove(this.name); + _.cookie.remove(this.name, true); + + if (old_cookie) { + this.register_once(old_cookie); + } + } +}; + +MixpanelPersistence.prototype.save = function() { + if (this.disabled) { return; } + this._expire_notification_campaigns(); + this.storage.set( + this.name, + _.JSONEncode(this['props']), + this.expire_days, + this.cross_subdomain, + this.secure + ); +}; + +MixpanelPersistence.prototype.remove = function() { + // remove both domain and subdomain cookies + this.storage.remove(this.name, false); + this.storage.remove(this.name, true); +}; + +// removes the storage entry and deletes all loaded data +// forced name for tests +MixpanelPersistence.prototype.clear = function() { + this.remove(); + this['props'] = {}; +}; + +/** + * @param {Object} props + * @param {*=} default_value + * @param {number=} days + */ +MixpanelPersistence.prototype.register_once = function(props, default_value, days) { + if (_.isObject(props)) { + if (typeof(default_value) === 'undefined') { default_value = 'None'; } + this.expire_days = (typeof(days) === 'undefined') ? this.default_expiry : days; + + _.each(props, function(val, prop) { + if (!this['props'].hasOwnProperty(prop) || this['props'][prop] === default_value) { + this['props'][prop] = val; + } + }, this); + + this.save(); + + return true; + } + return false; +}; + +/** + * @param {Object} props + * @param {number=} days + */ +MixpanelPersistence.prototype.register = function(props, days) { + if (_.isObject(props)) { + this.expire_days = (typeof(days) === 'undefined') ? this.default_expiry : days; + + _.extend(this['props'], props); + + this.save(); + + return true; + } + return false; +}; + +MixpanelPersistence.prototype.unregister = function(prop) { + if (prop in this['props']) { + delete this['props'][prop]; + this.save(); + } +}; + +MixpanelPersistence.prototype._expire_notification_campaigns = _.safewrap(function() { + var campaigns_shown = this['props'][CAMPAIGN_IDS_KEY], + EXPIRY_TIME = Config.DEBUG ? 60 * 1000 : 60 * 60 * 1000; // 1 minute (Config.DEBUG) / 1 hour (PDXN) + if (!campaigns_shown) { + return; + } + for (var campaign_id in campaigns_shown) { + if (1 * new Date() - campaigns_shown[campaign_id] > EXPIRY_TIME) { + delete campaigns_shown[campaign_id]; + } + } + if (_.isEmptyObject(campaigns_shown)) { + delete this['props'][CAMPAIGN_IDS_KEY]; + } +}); + +MixpanelPersistence.prototype.update_campaign_params = function() { + if (!this.campaign_params_saved) { + this.register_once(_.info.campaignParams()); + this.campaign_params_saved = true; + } +}; + +MixpanelPersistence.prototype.update_search_keyword = function(referrer) { + this.register(_.info.searchInfo(referrer)); +}; + +// EXPORTED METHOD, we test this directly. +MixpanelPersistence.prototype.update_referrer_info = function(referrer) { + // If referrer doesn't exist, we want to note the fact that it was type-in traffic. + this.register_once({ + '$initial_referrer': referrer || '$direct', + '$initial_referring_domain': _.info.referringDomain(referrer) || '$direct' + }, ''); +}; + +MixpanelPersistence.prototype.get_referrer_info = function() { + return _.strip_empty_properties({ + '$initial_referrer': this['props']['$initial_referrer'], + '$initial_referring_domain': this['props']['$initial_referring_domain'] + }); +}; + +// safely fills the passed in object with stored properties, +// does not override any properties defined in both +// returns the passed in object +MixpanelPersistence.prototype.safe_merge = function(props) { + _.each(this['props'], function(val, prop) { + if (!(prop in props)) { + props[prop] = val; + } + }); + + return props; +}; + +MixpanelPersistence.prototype.update_config = function(config) { + this.default_expiry = this.expire_days = config['cookie_expiration']; + this.set_disabled(config['disable_persistence']); + this.set_cross_subdomain(config['cross_subdomain_cookie']); + this.set_secure(config['secure_cookie']); +}; + +MixpanelPersistence.prototype.set_disabled = function(disabled) { + this.disabled = disabled; + if (this.disabled) { + this.remove(); + } else { + this.save(); + } +}; + +MixpanelPersistence.prototype.set_cross_subdomain = function(cross_subdomain) { + if (cross_subdomain !== this.cross_subdomain) { + this.cross_subdomain = cross_subdomain; + this.remove(); + this.save(); + } +}; + +MixpanelPersistence.prototype.get_cross_subdomain = function() { + return this.cross_subdomain; +}; + +MixpanelPersistence.prototype.set_secure = function(secure) { + if (secure !== this.secure) { + this.secure = secure ? true : false; + this.remove(); + this.save(); + } +}; + +MixpanelPersistence.prototype._add_to_people_queue = function(queue, data) { + var q_key = this._get_queue_key(queue), + q_data = data[queue], + set_q = this._get_or_create_queue(SET_ACTION), + set_once_q = this._get_or_create_queue(SET_ONCE_ACTION), + unset_q = this._get_or_create_queue(UNSET_ACTION), + add_q = this._get_or_create_queue(ADD_ACTION), + union_q = this._get_or_create_queue(UNION_ACTION), + append_q = this._get_or_create_queue(APPEND_ACTION, []); + + if (q_key === SET_QUEUE_KEY) { + // Update the set queue - we can override any existing values + _.extend(set_q, q_data); + // if there was a pending increment, override it + // with the set. + this._pop_from_people_queue(ADD_ACTION, q_data); + // if there was a pending union, override it + // with the set. + this._pop_from_people_queue(UNION_ACTION, q_data); + this._pop_from_people_queue(UNSET_ACTION, q_data); + } else if (q_key === SET_ONCE_QUEUE_KEY) { + // only queue the data if there is not already a set_once call for it. + _.each(q_data, function(v, k) { + if (!(k in set_once_q)) { + set_once_q[k] = v; + } + }); + this._pop_from_people_queue(UNSET_ACTION, q_data); + } else if (q_key === UNSET_QUEUE_KEY) { + _.each(q_data, function(prop) { + + // undo previously-queued actions on this key + _.each([set_q, set_once_q, add_q, union_q], function(enqueued_obj) { + if (prop in enqueued_obj) { + delete enqueued_obj[prop]; + } + }); + _.each(append_q, function(append_obj) { + if (prop in append_obj) { + delete append_obj[prop]; + } + }); + + unset_q[prop] = true; + + }); + } else if (q_key === ADD_QUEUE_KEY) { + _.each(q_data, function(v, k) { + // If it exists in the set queue, increment + // the value + if (k in set_q) { + set_q[k] += v; + } else { + // If it doesn't exist, update the add + // queue + if (!(k in add_q)) { + add_q[k] = 0; + } + add_q[k] += v; + } + }, this); + this._pop_from_people_queue(UNSET_ACTION, q_data); + } else if (q_key === UNION_QUEUE_KEY) { + _.each(q_data, function(v, k) { + if (_.isArray(v)) { + if (!(k in union_q)) { + union_q[k] = []; + } + // We may send duplicates, the server will dedup them. + union_q[k] = union_q[k].concat(v); + } + }); + this._pop_from_people_queue(UNSET_ACTION, q_data); + } else if (q_key === APPEND_QUEUE_KEY) { + append_q.push(q_data); + this._pop_from_people_queue(UNSET_ACTION, q_data); + } + + console$1.log('MIXPANEL PEOPLE REQUEST (QUEUED, PENDING IDENTIFY):'); + console$1.log(data); + + this.save(); +}; + +MixpanelPersistence.prototype._pop_from_people_queue = function(queue, data) { + var q = this._get_queue(queue); + if (!_.isUndefined(q)) { + _.each(data, function(v, k) { + delete q[k]; + }, this); + + this.save(); + } +}; + +MixpanelPersistence.prototype._get_queue_key = function(queue) { + if (queue === SET_ACTION) { + return SET_QUEUE_KEY; + } else if (queue === SET_ONCE_ACTION) { + return SET_ONCE_QUEUE_KEY; + } else if (queue === UNSET_ACTION) { + return UNSET_QUEUE_KEY; + } else if (queue === ADD_ACTION) { + return ADD_QUEUE_KEY; + } else if (queue === APPEND_ACTION) { + return APPEND_QUEUE_KEY; + } else if (queue === UNION_ACTION) { + return UNION_QUEUE_KEY; + } else { + console$1.error('Invalid queue:', queue); + } +}; + +MixpanelPersistence.prototype._get_queue = function(queue) { + return this['props'][this._get_queue_key(queue)]; +}; +MixpanelPersistence.prototype._get_or_create_queue = function(queue, default_val) { + var key = this._get_queue_key(queue); + default_val = _.isUndefined(default_val) ? {} : default_val; + + return this['props'][key] || (this['props'][key] = default_val); +}; + +MixpanelPersistence.prototype.set_event_timer = function(event_name, timestamp) { + var timers = this['props'][EVENT_TIMERS_KEY] || {}; + timers[event_name] = timestamp; + this['props'][EVENT_TIMERS_KEY] = timers; + this.save(); +}; + +MixpanelPersistence.prototype.remove_event_timer = function(event_name) { + var timers = this['props'][EVENT_TIMERS_KEY] || {}; + var timestamp = timers[event_name]; + if (!_.isUndefined(timestamp)) { + delete this['props'][EVENT_TIMERS_KEY][event_name]; + this.save(); + } + return timestamp; +}; + +/** + * Mixpanel Library Object + * @constructor + */ +var MixpanelLib = function() {}; + +/** + * Mixpanel People Object + * @constructor + */ +var MixpanelPeople = function() {}; + +var MPNotif; + +/** + * create_mplib(token:string, config:object, name:string) + * + * This function is used by the init method of MixpanelLib objects + * as well as the main initializer at the end of the JSLib (that + * initializes document.mixpanel as well as any additional instances + * declared before this file has loaded). + */ +var create_mplib = function(token, config, name) { + var instance, + target = (name === PRIMARY_INSTANCE_NAME) ? mixpanel_master : mixpanel_master[name]; + + if (target && init_type === INIT_MODULE) { + instance = target; + } else { + if (target && !_.isArray(target)) { + console$1.error('You have already initialized ' + name); + return; + } + instance = new MixpanelLib(); + } + + instance._init(token, config, name); + + instance['people'] = new MixpanelPeople(); + instance['people']._init(instance); + + // if any instance on the page has debug = true, we set the + // global debug to be true + Config.DEBUG = Config.DEBUG || instance.get_config('debug'); + + instance['__autotrack_enabled'] = instance.get_config('autotrack'); + if (instance.get_config('autotrack')) { + var num_buckets = 100; + var num_enabled_buckets = 100; + if (!autotrack.enabledForProject(instance.get_config('token'), num_buckets, num_enabled_buckets)) { + instance['__autotrack_enabled'] = false; + console$1.log('Not in active bucket: disabling Automatic Event Collection.'); + } else if (!autotrack.isBrowserSupported()) { + instance['__autotrack_enabled'] = false; + console$1.log('Disabling Automatic Event Collection because this browser is not supported'); + } else { + autotrack.init(instance); + } + } + + // if target is not defined, we called init after the lib already + // loaded, so there won't be an array of things to execute + if (!_.isUndefined(target) && _.isArray(target)) { + // Crunch through the people queue first - we queue this data up & + // flush on identify, so it's better to do all these operations first + instance._execute_array.call(instance['people'], target['people']); + instance._execute_array(target); + } + + return instance; +}; + +// Initialization methods + +/** + * This function initializes a new instance of the Mixpanel tracking object. + * All new instances are added to the main mixpanel object as sub properties (such as + * mixpanel.library_name) and also returned by this function. To define a + * second instance on the page, you would call: + * + * mixpanel.init('new token', { your: 'config' }, 'library_name'); + * + * and use it like so: + * + * mixpanel.library_name.track(...); + * + * @param {String} token Your Mixpanel API token + * @param {Object} [config] A dictionary of config options to override. See a list of default config options. + * @param {String} [name] The name for the new mixpanel instance that you want created + */ +MixpanelLib.prototype.init = function (token, config, name) { + if (_.isUndefined(name)) { + console$1.error('You must name your new library: init(token, config, name)'); + return; + } + if (name === PRIMARY_INSTANCE_NAME) { + console$1.error('You must initialize the main mixpanel object right after you include the Mixpanel js snippet'); + return; + } + + var instance = create_mplib(token, config, name); + mixpanel_master[name] = instance; + instance._loaded(); + + return instance; +}; + +// mixpanel._init(token:string, config:object, name:string) +// +// This function sets up the current instance of the mixpanel +// library. The difference between this method and the init(...) +// method is this one initializes the actual instance, whereas the +// init(...) method sets up a new library and calls _init on it. +// +MixpanelLib.prototype._init = function(token, config, name) { + this['__loaded'] = true; + this['config'] = {}; + + this.set_config(_.extend({}, DEFAULT_CONFIG, config, { + 'name': name, + 'token': token, + 'callback_fn': ((name === PRIMARY_INSTANCE_NAME) ? name : PRIMARY_INSTANCE_NAME + '.' + name) + '._jsc' + })); + + this['_jsc'] = function() {}; + + this.__dom_loaded_queue = []; + this.__request_queue = []; + this.__disabled_events = []; + this._flags = { + 'disable_all_events': false, + 'identify_called': false + }; + + this['persistence'] = this['cookie'] = new MixpanelPersistence(this['config']); + this._init_gdpr_persistence(); + + this.register_once({'distinct_id': _.UUID()}, ''); +}; + +// Private methods + +MixpanelLib.prototype._update_persistence = function() { + var disablePersistence = this.get_config('disable_persistence') || this.has_opted_out_tracking(); + if (this['persistence'].disabled !== disablePersistence) { + this['persistence'].set_disabled(disablePersistence); + } +}; + +MixpanelLib.prototype._loaded = function() { + this.get_config('loaded')(this); + + // this happens after so a user can call identify/name_tag in + // the loaded callback + if (this.get_config('track_pageview')) { + this.track_pageview(); + } +}; + +MixpanelLib.prototype._dom_loaded = function() { + _.each(this.__dom_loaded_queue, function(item) { + this._track_dom.apply(this, item); + }, this); + + if (!this.has_opted_out_tracking()) { + _.each(this.__request_queue, function(item) { + this._send_request.apply(this, item); + }, this); + } + + delete this.__dom_loaded_queue; + delete this.__request_queue; +}; + +MixpanelLib.prototype._track_dom = function(DomClass, args) { + if (this.get_config('img')) { + console$1.error('You can\'t use DOM tracking functions with img = true.'); + return false; + } + + if (!DOM_LOADED) { + this.__dom_loaded_queue.push([DomClass, args]); + return false; + } + + var dt = new DomClass().init(this); + return dt.track.apply(dt, args); +}; + +/** + * _prepare_callback() should be called by callers of _send_request for use + * as the callback argument. + * + * If there is no callback, this returns null. + * If we are going to make XHR/XDR requests, this returns a function. + * If we are going to use script tags, this returns a string to use as the + * callback GET param. + */ +MixpanelLib.prototype._prepare_callback = function(callback, data) { + if (_.isUndefined(callback)) { + return null; + } + + if (USE_XHR) { + var callback_function = function(response) { + callback(response, data); + }; + return callback_function; + } else { + // if the user gives us a callback, we store as a random + // property on this instances jsc function and update our + // callback string to reflect that. + var jsc = this['_jsc']; + var randomized_cb = '' + Math.floor(Math.random() * 100000000); + var callback_string = this.get_config('callback_fn') + '[' + randomized_cb + ']'; + jsc[randomized_cb] = function(response) { + delete jsc[randomized_cb]; + callback(response, data); + }; + return callback_string; + } +}; + +MixpanelLib.prototype._send_request = function(url, data, callback) { + if (ENQUEUE_REQUESTS) { + this.__request_queue.push(arguments); + return; + } + + // needed to correctly format responses + var verbose_mode = this.get_config('verbose'); + if (data['verbose']) { verbose_mode = true; } + + if (this.get_config('test')) { data['test'] = 1; } + if (verbose_mode) { data['verbose'] = 1; } + if (this.get_config('img')) { data['img'] = 1; } + if (!USE_XHR) { + if (callback) { + data['callback'] = callback; + } else if (verbose_mode || this.get_config('test')) { + // Verbose output (from verbose mode, or an error in test mode) is a json blob, + // which by itself is not valid javascript. Without a callback, this verbose output will + // cause an error when returned via jsonp, so we force a no-op callback param. + // See the ECMA script spec: http://www.ecma-international.org/ecma-262/5.1/#sec-12.4 + data['callback'] = '(function(){})'; + } + } + + data['ip'] = this.get_config('ip')?1:0; + data['_'] = new Date().getTime().toString(); + url += '?' + _.HTTPBuildQuery(data); + + if ('img' in data) { + var img = document$1.createElement('img'); + img.src = url; + document$1.body.appendChild(img); + } else if (USE_XHR) { + try { + var req = new XMLHttpRequest(); + req.open('GET', url, true); + + var headers = this.get_config('xhr_headers'); + _.each(headers, function(headerValue, headerName) { + req.setRequestHeader(headerName, headerValue); + }); + + // send the mp_optout cookie + // withCredentials cannot be modified until after calling .open on Android and Mobile Safari + req.withCredentials = true; + req.onreadystatechange = function () { + if (req.readyState === 4) { // XMLHttpRequest.DONE == 4, except in safari 4 + if (req.status === 200) { + if (callback) { + if (verbose_mode) { + var response; + try { + response = _.JSONDecode(req.responseText); + } catch (e) { + console$1.error(e); + return; + } + callback(response); + } else { + callback(Number(req.responseText)); + } + } + } else { + var error = 'Bad HTTP status: ' + req.status + ' ' + req.statusText; + console$1.error(error); + if (callback) { + if (verbose_mode) { + callback({status: 0, error: error}); + } else { + callback(0); + } + } + } + } + }; + req.send(null); + } catch (e) { + console$1.error(e); + } + } else { + var script = document$1.createElement('script'); + script.type = 'text/javascript'; + script.async = true; + script.defer = true; + script.src = url; + var s = document$1.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(script, s); + } +}; + +/** + * _execute_array() deals with processing any mixpanel function + * calls that were called before the Mixpanel library were loaded + * (and are thus stored in an array so they can be called later) + * + * Note: we fire off all the mixpanel function calls && user defined + * functions BEFORE we fire off mixpanel tracking calls. This is so + * identify/register/set_config calls can properly modify early + * tracking calls. + * + * @param {Array} array + */ +MixpanelLib.prototype._execute_array = function(array) { + var fn_name, alias_calls = [], other_calls = [], tracking_calls = []; + _.each(array, function(item) { + if (item) { + fn_name = item[0]; + if (typeof(item) === 'function') { + item.call(this); + } else if (_.isArray(item) && fn_name === 'alias') { + alias_calls.push(item); + } else if (_.isArray(item) && fn_name.indexOf('track') !== -1 && typeof(this[fn_name]) === 'function') { + tracking_calls.push(item); + } else { + other_calls.push(item); + } + } + }, this); + + var execute = function(calls, context) { + _.each(calls, function(item) { + this[item[0]].apply(this, item.slice(1)); + }, context); + }; + + execute(alias_calls, this); + execute(other_calls, this); + execute(tracking_calls, this); +}; + +/** + * push() keeps the standard async-array-push + * behavior around after the lib is loaded. + * This is only useful for external integrations that + * do not wish to rely on our convenience methods + * (created in the snippet). + * + * ### Usage: + * mixpanel.push(['register', { a: 'b' }]); + * + * @param {Array} item A [function_name, args...] array to be executed + */ +MixpanelLib.prototype.push = function(item) { + this._execute_array([item]); +}; + +/** + * Disable events on the Mixpanel object. If passed no arguments, + * this function disables tracking of any event. If passed an + * array of event names, those events will be disabled, but other + * events will continue to be tracked. + * + * Note: this function does not stop other mixpanel functions from + * firing, such as register() or people.set(). + * + * @param {Array} [events] An array of event names to disable + */ +MixpanelLib.prototype.disable = function(events) { + if (typeof(events) === 'undefined') { + this._flags.disable_all_events = true; + } else { + this.__disabled_events = this.__disabled_events.concat(events); + } +}; + +/** + * Track an event. This is the most important and + * frequently used Mixpanel function. + * + * ### Usage: + * + * // track an event named 'Registered' + * mixpanel.track('Registered', {'Gender': 'Male', 'Age': 21}); + * + * To track link clicks or form submissions, see track_links() or track_forms(). + * + * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc. + * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself. + * @param {Function} [callback] If provided, the callback function will be called after tracking the event. + */ +MixpanelLib.prototype.track = addOptOutCheckMixpanelLib(function(event_name, properties, callback) { + if (typeof(callback) !== 'function') { + callback = function() {}; + } + + if (_.isUndefined(event_name)) { + console$1.error('No event name provided to mixpanel.track'); + return; + } + + if (this._event_is_disabled(event_name)) { + callback(0); + return; + } + + // set defaults + properties = properties || {}; + properties['token'] = this.get_config('token'); + + // set $duration if time_event was previously called for this event + var start_timestamp = this['persistence'].remove_event_timer(event_name); + if (!_.isUndefined(start_timestamp)) { + var duration_in_ms = new Date().getTime() - start_timestamp; + properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3)); + } + + // update persistence + this['persistence'].update_search_keyword(document$1.referrer); + + if (this.get_config('store_google')) { this['persistence'].update_campaign_params(); } + if (this.get_config('save_referrer')) { this['persistence'].update_referrer_info(document$1.referrer); } + + // note: extend writes to the first object, so lets make sure we + // don't write to the persistence properties object and info + // properties object by passing in a new object + + // update properties with pageview info and super-properties + properties = _.extend( + {}, + _.info.properties(), + this['persistence'].properties(), + properties + ); + + var property_blacklist = this.get_config('property_blacklist'); + if (_.isArray(property_blacklist)) { + _.each(property_blacklist, function(blacklisted_prop) { + delete properties[blacklisted_prop]; + }); + } else { + console$1.error('Invalid value for property_blacklist config: ' + property_blacklist); + } + + var data = { + 'event': event_name, + 'properties': properties + }; + + var truncated_data = _.truncate(data, 255); + var json_data = _.JSONEncode(truncated_data); + var encoded_data = _.base64Encode(json_data); + + console$1.log('MIXPANEL REQUEST:'); + console$1.log(truncated_data); + + this._send_request( + this.get_config('api_host') + '/track/', + { 'data': encoded_data }, + this._prepare_callback(callback, truncated_data) + ); + + return truncated_data; +}); + +/** + * Track a page view event, which is currently ignored by the server. + * This function is called by default on page load unless the + * track_pageview configuration variable is false. + * + * @param {String} [page] The url of the page to record. If you don't include this, it defaults to the current url. + * @api private + */ +MixpanelLib.prototype.track_pageview = function(page) { + if (_.isUndefined(page)) { + page = document$1.location.href; + } + this.track('mp_page_view', _.info.pageviewInfo(page)); +}; + +/** + * Track clicks on a set of document elements. Selector must be a + * valid query. Elements must exist on the page at the time track_links is called. + * + * ### Usage: + * + * // track click for link id #nav + * mixpanel.track_links('#nav', 'Clicked Nav Link'); + * + * ### Notes: + * + * This function will wait up to 300 ms for the Mixpanel + * servers to respond. If they have not responded by that time + * it will head to the link without ensuring that your event + * has been tracked. To configure this timeout please see the + * set_config() documentation below. + * + * If you pass a function in as the properties argument, the + * function will receive the DOMElement that triggered the + * event as an argument. You are expected to return an object + * from the function; any properties defined on this object + * will be sent to mixpanel as event properties. + * + * @type {Function} + * @param {Object|String} query A valid DOM query, element or jQuery-esque list + * @param {String} event_name The name of the event to track + * @param {Object|Function} [properties] A properties object or function that returns a dictionary of properties when passed a DOMElement + */ +MixpanelLib.prototype.track_links = function() { + return this._track_dom.call(this, LinkTracker, arguments); +}; + +/** + * Track form submissions. Selector must be a valid query. + * + * ### Usage: + * + * // track submission for form id 'register' + * mixpanel.track_forms('#register', 'Created Account'); + * + * ### Notes: + * + * This function will wait up to 300 ms for the mixpanel + * servers to respond, if they have not responded by that time + * it will head to the link without ensuring that your event + * has been tracked. To configure this timeout please see the + * set_config() documentation below. + * + * If you pass a function in as the properties argument, the + * function will receive the DOMElement that triggered the + * event as an argument. You are expected to return an object + * from the function; any properties defined on this object + * will be sent to mixpanel as event properties. + * + * @type {Function} + * @param {Object|String} query A valid DOM query, element or jQuery-esque list + * @param {String} event_name The name of the event to track + * @param {Object|Function} [properties] This can be a set of properties, or a function that returns a set of properties after being passed a DOMElement + */ +MixpanelLib.prototype.track_forms = function() { + return this._track_dom.call(this, FormTracker, arguments); +}; + +/** + * Time an event by including the time between this call and a + * later 'track' call for the same event in the properties sent + * with the event. + * + * ### Usage: + * + * // time an event named 'Registered' + * mixpanel.time_event('Registered'); + * mixpanel.track('Registered', {'Gender': 'Male', 'Age': 21}); + * + * When called for a particular event name, the next track call for that event + * name will include the elapsed time between the 'time_event' and 'track' + * calls. This value is stored as seconds in the '$duration' property. + * + * @param {String} event_name The name of the event. + */ +MixpanelLib.prototype.time_event = function(event_name) { + if (_.isUndefined(event_name)) { + console$1.error('No event name provided to mixpanel.time_event'); + return; + } + + if (this._event_is_disabled(event_name)) { + return; + } + + this['persistence'].set_event_timer(event_name, new Date().getTime()); +}; + +/** + * Register a set of super properties, which are included with all + * events. This will overwrite previous super property values. + * + * ### Usage: + * + * // register 'Gender' as a super property + * mixpanel.register({'Gender': 'Female'}); + * + * // register several super properties when a user signs up + * mixpanel.register({ + * 'Email': 'jdoe@example.com', + * 'Account Type': 'Free' + * }); + * + * @param {Object} properties An associative array of properties to store about the user + * @param {Number} [days] How many days since the user's last visit to store the super properties + */ +MixpanelLib.prototype.register = function(props, days) { + this['persistence'].register(props, days); +}; + +/** + * Register a set of super properties only once. This will not + * overwrite previous super property values, unlike register(). + * + * ### Usage: + * + * // register a super property for the first time only + * mixpanel.register_once({ + * 'First Login Date': new Date().toISOString() + * }); + * + * ### Notes: + * + * If default_value is specified, current super properties + * with that value will be overwritten. + * + * @param {Object} properties An associative array of properties to store about the user + * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None' + * @param {Number} [days] How many days since the users last visit to store the super properties + */ +MixpanelLib.prototype.register_once = function(props, default_value, days) { + this['persistence'].register_once(props, default_value, days); +}; + +/** + * Delete a super property stored with the current user. + * + * @param {String} property The name of the super property to remove + */ +MixpanelLib.prototype.unregister = function(property) { + this['persistence'].unregister(property); +}; + +MixpanelLib.prototype._register_single = function(prop, value) { + var props = {}; + props[prop] = value; + this.register(props); +}; + +/** + * Identify a user with a unique ID instead of a Mixpanel + * randomly generated distinct_id. If the method is never called, + * then unique visitors will be identified by a UUID generated + * the first time they visit the site. + * + * ### Notes: + * + * You can call this function to overwrite a previously set + * unique ID for the current user. Mixpanel cannot translate + * between IDs at this time, so when you change a user's ID + * they will appear to be a new user. + * + * When used alone, mixpanel.identify will change the user's + * distinct_id to the unique ID provided. When used in tandem + * with mixpanel.alias, it will allow you to identify based on + * unique ID and map that back to the original, anonymous + * distinct_id given to the user upon her first arrival to your + * site (thus connecting anonymous pre-signup activity to + * post-signup activity). Though the two work together, do not + * call identify() at the same time as alias(). Calling the two + * at the same time can cause a race condition, so it is best + * practice to call identify on the original, anonymous ID + * right after you've aliased it. + * Learn more about how mixpanel.identify and mixpanel.alias can be used. + * + * @param {String} [unique_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used. + */ +MixpanelLib.prototype.identify = function( + unique_id, _set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback +) { + // Optional Parameters + // _set_callback:function A callback to be run if and when the People set queue is flushed + // _add_callback:function A callback to be run if and when the People add queue is flushed + // _append_callback:function A callback to be run if and when the People append queue is flushed + // _set_once_callback:function A callback to be run if and when the People set_once queue is flushed + // _union_callback:function A callback to be run if and when the People union queue is flushed + // _unset_callback:function A callback to be run if and when the People unset queue is flushed + + // identify only changes the distinct id if it doesn't match either the existing or the alias; + // if it's new, blow away the alias as well. + if (unique_id !== this.get_distinct_id() && unique_id !== this.get_property(ALIAS_ID_KEY)) { + this.unregister(ALIAS_ID_KEY); + this._register_single('distinct_id', unique_id); + } + this._check_and_handle_notifications(this.get_distinct_id()); + this._flags.identify_called = true; + // Flush any queued up people requests + this['people']._flush(_set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback); +}; + +/** + * Clears super properties and generates a new random distinct_id for this instance. + * Useful for clearing data when a user logs out. + */ +MixpanelLib.prototype.reset = function() { + this['persistence'].clear(); + this._flags.identify_called = false; + this.register_once({'distinct_id': _.UUID()}, ''); +}; + +/** + * Returns the current distinct id of the user. This is either the id automatically + * generated by the library or the id that has been passed by a call to identify(). + * + * ### Notes: + * + * get_distinct_id() can only be called after the Mixpanel library has finished loading. + * init() has a loaded function available to handle this automatically. For example: + * + * // set distinct_id after the mixpanel library has loaded + * mixpanel.init('YOUR PROJECT TOKEN', { + * loaded: function(mixpanel) { + * distinct_id = mixpanel.get_distinct_id(); + * } + * }); + */ +MixpanelLib.prototype.get_distinct_id = function() { + return this.get_property('distinct_id'); +}; + +/** + * Create an alias, which Mixpanel will use to link two distinct_ids going forward (not retroactively). + * Multiple aliases can map to the same original ID, but not vice-versa. Aliases can also be chained - the + * following is a valid scenario: + * + * mixpanel.alias('new_id', 'existing_id'); + * ... + * mixpanel.alias('newer_id', 'new_id'); + * + * If the original ID is not passed in, we will use the current distinct_id - probably the auto-generated GUID. + * + * ### Notes: + * + * The best practice is to call alias() when a unique ID is first created for a user + * (e.g., when a user first registers for an account and provides an email address). + * alias() should never be called more than once for a given user, except to + * chain a newer ID to a previously new ID, as described above. + * + * @param {String} alias A unique identifier that you want to use for this user in the future. + * @param {String} [original] The current identifier being used for this user. + */ +MixpanelLib.prototype.alias = function(alias, original) { + // If the $people_distinct_id key exists in persistence, there has been a previous + // mixpanel.people.identify() call made for this user. It is VERY BAD to make an alias with + // this ID, as it will duplicate users. + if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) { + console$1.critical('Attempting to create alias for existing People user - aborting.'); + return -2; + } + + var _this = this; + if (_.isUndefined(original)) { + original = this.get_distinct_id(); + } + if (alias !== original) { + this._register_single(ALIAS_ID_KEY, alias); + return this.track('$create_alias', { 'alias': alias, 'distinct_id': original }, function() { + // Flush the people queue + _this.identify(alias); + }); + } else { + console$1.error('alias matches current distinct_id - skipping api call.'); + this.identify(alias); + return -1; + } +}; + +/** + * Provide a string to recognize the user by. The string passed to + * this method will appear in the Mixpanel Streams product rather + * than an automatically generated name. Name tags do not have to + * be unique. + * + * This value will only be included in Streams data. + * + * @param {String} name_tag A human readable name for the user + * @api private + */ +MixpanelLib.prototype.name_tag = function(name_tag) { + this._register_single('mp_name_tag', name_tag); +}; + +/** + * Update the configuration of a mixpanel library instance. + * + * The default config is: + * + * { + * // super properties cookie expiration (in days) + * cookie_expiration: 365 + * + * // super properties span subdomains + * cross_subdomain_cookie: true + * + * // debug mode + * debug: false + * + * // if this is true, the mixpanel cookie or localStorage entry + * // will be deleted, and no user persistence will take place + * disable_persistence: false + * + * // if this is true, Mixpanel will automatically determine + * // City, Region and Country data using the IP address of + * //the client + * ip: true + * + * // opt users out of tracking by this Mixpanel instance by default + * opt_out_tracking_by_default: false + * + * // persistence mechanism used by opt-in/opt-out methods - cookie + * // or localStorage - falls back to cookie if localStorage is unavailable + * opt_out_tracking_persistence_type: 'localStorage' + * + * // customize the name of cookie/localStorage set by opt-in/opt-out methods + * opt_out_tracking_cookie_prefix: null + * + * // type of persistent store for super properties (cookie/ + * // localStorage) if set to 'localStorage', any existing + * // mixpanel cookie value with the same persistence_name + * // will be transferred to localStorage and deleted + * persistence: 'cookie' + * + * // name for super properties persistent store + * persistence_name: '' + * + * // names of properties/superproperties which should never + * // be sent with track() calls + * property_blacklist: [] + * + * // if this is true, mixpanel cookies will be marked as + * // secure, meaning they will only be transmitted over https + * secure_cookie: false + * + * // the amount of time track_links will + * // wait for Mixpanel's servers to respond + * track_links_timeout: 300 + * + * // should we track a page view on page load + * track_pageview: true + * + * // if you set upgrade to be true, the library will check for + * // a cookie from our old js library and import super + * // properties from it, then the old cookie is deleted + * // The upgrade config option only works in the initialization, + * // so make sure you set it when you create the library. + * upgrade: false + * + * // extra HTTP request headers to set for each API request, in + * // the format {'Header-Name': value} + * xhr_headers: {} + * } + * + * + * @param {Object} config A dictionary of new configuration values to update + */ +MixpanelLib.prototype.set_config = function(config) { + if (_.isObject(config)) { + _.extend(this['config'], config); + + if (!this.get_config('persistence_name')) { + this['config']['persistence_name'] = this['config']['cookie_name']; + } + if (!this.get_config('disable_persistence')) { + this['config']['disable_persistence'] = this['config']['disable_cookie']; + } + + if (this['persistence']) { + this['persistence'].update_config(this['config']); + } + Config.DEBUG = Config.DEBUG || this.get_config('debug'); + } +}; + +/** + * returns the current config object for the library. + */ +MixpanelLib.prototype.get_config = function(prop_name) { + return this['config'][prop_name]; +}; + +/** + * Returns the value of the super property named property_name. If no such + * property is set, get_property() will return the undefined value. + * + * ### Notes: + * + * get_property() can only be called after the Mixpanel library has finished loading. + * init() has a loaded function available to handle this automatically. For example: + * + * // grab value for 'user_id' after the mixpanel library has loaded + * mixpanel.init('YOUR PROJECT TOKEN', { + * loaded: function(mixpanel) { + * user_id = mixpanel.get_property('user_id'); + * } + * }); + * + * @param {String} property_name The name of the super property you want to retrieve + */ +MixpanelLib.prototype.get_property = function(property_name) { + return this['persistence']['props'][property_name]; +}; + +MixpanelLib.prototype.toString = function() { + var name = this.get_config('name'); + if (name !== PRIMARY_INSTANCE_NAME) { + name = PRIMARY_INSTANCE_NAME + '.' + name; + } + return name; +}; + +MixpanelLib.prototype._event_is_disabled = function(event_name) { + return _.isBlockedUA(userAgent) || + this._flags.disable_all_events || + _.include(this.__disabled_events, event_name); +}; + +MixpanelLib.prototype._check_and_handle_notifications = addOptOutCheckMixpanelLib(function(distinct_id) { + if ( + !distinct_id || + this._flags.identify_called || + this.get_config('disable_notifications') + ) { + return; + } + + console$1.log('MIXPANEL NOTIFICATION CHECK'); + + var data = { + 'verbose': true, + 'version': '2', + 'lib': 'web', + 'token': this.get_config('token'), + 'distinct_id': distinct_id + }; + var self = this; + this._send_request( + this.get_config('api_host') + '/decide/', + data, + this._prepare_callback(function(r) { + if (r['notifications'] && r['notifications'].length > 0) { + self._show_notification.call(self, r['notifications'][0]); + } + }) + ); +}); + +MixpanelLib.prototype._show_notification = function(notification_data) { + var notification = new MPNotif(notification_data, this); + notification.show(); +}; + +// perform some housekeeping around GDPR persistence of opt-in/out state +MixpanelLib.prototype._init_gdpr_persistence = function() { + var is_localStorage_requested = this.get_config('opt_out_tracking_persistence_type') === 'localStorage'; + + // try to convert opt-in/out cookies to localStorage if possible + if (is_localStorage_requested && _.localStorage.is_supported()) { + if (!this.has_opted_in_tracking() && this.has_opted_in_tracking({'persistence_type': 'cookie'})) { + this.opt_in_tracking(); + } + if (!this.has_opted_out_tracking() && this.has_opted_out_tracking({'persistence_type': 'cookie'})) { + this.opt_out_tracking(); + } + this.clear_opt_in_out_tracking({'persistence_type': 'cookie'}); + } + + // check whether we should opt out by default and update persistence accordingly + if (this.get_config('opt_out_tracking_by_default') || _.cookie.get('mp_optout')) { + _.cookie.remove('mp_optout'); + this.opt_out_tracking(); + } + this._update_persistence(); +}; + +// call a base gdpr function after constructing the appropriate token and options args +MixpanelLib.prototype._call_gdpr_func = function(func, options) { + options = _.extend({ + 'track': _.bind(this.track, this), + 'persistence_type': this.get_config('opt_out_tracking_persistence_type'), + 'cookie_prefix': this.get_config('opt_out_tracking_cookie_prefix'), + 'cookie_expiration': this.get_config('cookie_expiration'), + 'cross_subdomain_cookie': this.get_config('cross_subdomain_cookie'), + 'secure_cookie': this.get_config('secure_cookie') + }, options); + + // check if localStorage can be used for recording opt out status, fall back to cookie if not + if (!_.localStorage.is_supported()) { + options['persistence_type'] = 'cookie'; + } + + return func(this.get_config('token'), { + track: options['track'], + trackEventName: options['track_event_name'], + trackProperties: options['track_properties'], + persistenceType: options['persistence_type'], + persistencePrefix: options['cookie_prefix'], + cookieExpiration: options['cookie_expiration'], + crossSubdomainCookie: options['cross_subdomain_cookie'], + secureCookie: options['secure_cookie'] + }); +}; + +/** + * Opt the user in to data tracking and cookies/localstorage for this Mixpanel instance + * + * ### Usage + * + * // opt user in + * mixpanel.opt_in_tracking(); + * + * // opt user in with specific event name, properties, cookie configuration + * mixpanel.opt_in_tracking({ + * track_event_name: 'User opted in', + * track_event_properties: { + * 'Email': 'jdoe@example.com' + * }, + * cookie_expiration: 30, + * secure_cookie: true + * }); + * + * @param {Object} [options] A dictionary of config options to override + * @param {function} [options.track] Function used for tracking a Mixpanel event to record the opt-in action (default is this Mixpanel instance's track method) + * @param {string} [options.track_event_name=$opt_in] Event name to be used for tracking the opt-in action + * @param {Object} [options.track_properties] Set of properties to be tracked along with the opt-in action + * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable + * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config) + */ +MixpanelLib.prototype.opt_in_tracking = function(options) { + this._call_gdpr_func(optIn, options); + this._update_persistence(); +}; + +/** + * Opt the user out of data tracking and cookies/localstorage for this Mixpanel instance + * + * ### Usage + * + * // opt user out + * mixpanel.opt_out_tracking(); + * + * // opt user out with different cookie configuration from Mixpanel instance + * mixpanel.opt_out_tracking({ + * cookie_expiration: 30, + * secure_cookie: true + * }); + * + * @param {Object} [options] A dictionary of config options to override + * @param {boolean} [options.delete_user=true] If true, will delete the currently identified user's profile and clear all charges after opting the user out + * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable + * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config) + */ +MixpanelLib.prototype.opt_out_tracking = function(options) { + // delete use and clear charges since these methods may be disabled by opt-out + options = _.extend({'delete_user': true}, options); + if (options['delete_user'] && this['people'] && this['people']._identify_called()) { + this['people'].delete_user(); + this['people'].clear_charges(); + } + + this._call_gdpr_func(optOut, options); + this._update_persistence(); +}; + +/** + * Check whether the user has opted in to data tracking and cookies/localstorage for this Mixpanel instance + * + * ### Usage + * + * var has_opted_in = mixpanel.has_opted_in_tracking(); + * // use has_opted_in value + * + * @param {Object} [options] A dictionary of config options to override + * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable + * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name + * @returns {boolean} current opt-in status + */ +MixpanelLib.prototype.has_opted_in_tracking = function(options) { + return this._call_gdpr_func(hasOptedIn, options); +}; + +/** + * Check whether the user has opted out of data tracking and cookies/localstorage for this Mixpanel instance + * + * ### Usage + * + * var has_opted_out = mixpanel.has_opted_out_tracking(); + * // use has_opted_out value + * + * @param {Object} [options] A dictionary of config options to override + * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable + * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name + * @returns {boolean} current opt-out status + */ +MixpanelLib.prototype.has_opted_out_tracking = function(options) { + return this._call_gdpr_func(hasOptedOut, options); +}; + +/** + * Clear the user's opt in/out status of data tracking and cookies/localstorage for this Mixpanel instance + * + * ### Usage + * + * // clear user's opt-in/out status + * mixpanel.clear_opt_in_out_tracking(); + * + * // clear user's opt-in/out status with specific cookie configuration - should match + * // configuration used when opt_in_tracking/opt_out_tracking methods were called. + * mixpanel.clear_opt_in_out_tracking({ + * cookie_expiration: 30, + * secure_cookie: true + * }); + * + * @param {Object} [options] A dictionary of config options to override + * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable + * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name + * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config) + * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config) + */ +MixpanelLib.prototype.clear_opt_in_out_tracking = function(options) { + this._call_gdpr_func(clearOptInOut, options); + this._update_persistence(); +}; + + +MixpanelPeople.prototype._init = function(mixpanel_instance) { + this._mixpanel = mixpanel_instance; +}; + +/* + * Set properties on a user record. + * + * ### Usage: + * + * mixpanel.people.set('gender', 'm'); + * + * // or set multiple properties at once + * mixpanel.people.set({ + * 'Company': 'Acme', + * 'Plan': 'Premium', + * 'Upgrade date': new Date() + * }); + * // properties can be strings, integers, dates, or lists + * + * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values. + * @param {*} [to] A value to set on the given property name + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.set = addOptOutCheckMixpanelPeople(function(prop, to, callback) { + var data = {}; + var $set = {}; + if (_.isObject(prop)) { + _.each(prop, function(v, k) { + if (!this._is_reserved_property(k)) { + $set[k] = v; + } + }, this); + callback = to; + } else { + $set[prop] = to; + } + + // make sure that the referrer info has been updated and saved + if (this._get_config('save_referrer')) { + this._mixpanel['persistence'].update_referrer_info(document$1.referrer); + } + + // update $set object with default people properties + $set = _.extend( + {}, + _.info.people_properties(), + this._mixpanel['persistence'].get_referrer_info(), + $set + ); + + data[SET_ACTION] = $set; + + return this._send_request(data, callback); +}); + +/* + * Set properties on a user record, only if they do not yet exist. + * This will not overwrite previous people property values, unlike + * people.set(). + * + * ### Usage: + * + * mixpanel.people.set_once('First Login Date', new Date()); + * + * // or set multiple properties at once + * mixpanel.people.set_once({ + * 'First Login Date': new Date(), + * 'Starting Plan': 'Premium' + * }); + * + * // properties can be strings, integers or dates + * + * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values. + * @param {*} [to] A value to set on the given property name + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.set_once = addOptOutCheckMixpanelPeople(function(prop, to, callback) { + var data = {}; + var $set_once = {}; + if (_.isObject(prop)) { + _.each(prop, function(v, k) { + if (!this._is_reserved_property(k)) { + $set_once[k] = v; + } + }, this); + callback = to; + } else { + $set_once[prop] = to; + } + data[SET_ONCE_ACTION] = $set_once; + return this._send_request(data, callback); +}); + +/* + * Unset properties on a user record (permanently removes the properties and their values from a profile). + * + * ### Usage: + * + * mixpanel.people.unset('gender'); + * + * // or unset multiple properties at once + * mixpanel.people.unset(['gender', 'Company']); + * + * @param {Array|String} prop If a string, this is the name of the property. If an array, this is a list of property names. + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.unset = function(prop, callback) { + var data = {}; + var $unset = []; + if (!_.isArray(prop)) { + prop = [prop]; + } + + _.each(prop, function(k) { + if (!this._is_reserved_property(k)) { + $unset.push(k); + } + }, this); + + data[UNSET_ACTION] = $unset; + + return this._send_request(data, callback); +}; + +/* + * Increment/decrement numeric people analytics properties. + * + * ### Usage: + * + * mixpanel.people.increment('page_views', 1); + * + * // or, for convenience, if you're just incrementing a counter by + * // 1, you can simply do + * mixpanel.people.increment('page_views'); + * + * // to decrement a counter, pass a negative number + * mixpanel.people.increment('credits_left', -1); + * + * // like mixpanel.people.set(), you can increment multiple + * // properties at once: + * mixpanel.people.increment({ + * counter1: 1, + * counter2: 6 + * }); + * + * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and numeric values. + * @param {Number} [by] An amount to increment the given property + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.increment = addOptOutCheckMixpanelPeople(function(prop, by, callback) { + var data = {}; + var $add = {}; + if (_.isObject(prop)) { + _.each(prop, function(v, k) { + if (!this._is_reserved_property(k)) { + if (isNaN(parseFloat(v))) { + console$1.error('Invalid increment value passed to mixpanel.people.increment - must be a number'); + return; + } else { + $add[k] = v; + } + } + }, this); + callback = by; + } else { + // convenience: mixpanel.people.increment('property'); will + // increment 'property' by 1 + if (_.isUndefined(by)) { + by = 1; + } + $add[prop] = by; + } + data[ADD_ACTION] = $add; + + return this._send_request(data, callback); +}); + +/* + * Append a value to a list-valued people analytics property. + * + * ### Usage: + * + * // append a value to a list, creating it if needed + * mixpanel.people.append('pages_visited', 'homepage'); + * + * // like mixpanel.people.set(), you can append multiple + * // properties at once: + * mixpanel.people.append({ + * list1: 'bob', + * list2: 123 + * }); + * + * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values. + * @param {*} [value] An item to append to the list + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.append = addOptOutCheckMixpanelPeople(function(list_name, value, callback) { + var data = {}; + var $append = {}; + if (_.isObject(list_name)) { + _.each(list_name, function(v, k) { + if (!this._is_reserved_property(k)) { + $append[k] = v; + } + }, this); + callback = value; + } else { + $append[list_name] = value; + } + data[APPEND_ACTION] = $append; + + return this._send_request(data, callback); +}); + +/* + * Merge a given list with a list-valued people analytics property, + * excluding duplicate values. + * + * ### Usage: + * + * // merge a value to a list, creating it if needed + * mixpanel.people.union('pages_visited', 'homepage'); + * + * // like mixpanel.people.set(), you can append multiple + * // properties at once: + * mixpanel.people.union({ + * list1: 'bob', + * list2: 123 + * }); + * + * // like mixpanel.people.append(), you can append multiple + * // values to the same list: + * mixpanel.people.union({ + * list1: ['bob', 'billy'] + * }); + * + * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values. + * @param {*} [value] Value / values to merge with the given property + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.union = addOptOutCheckMixpanelPeople(function(list_name, values, callback) { + var data = {}; + var $union = {}; + if (_.isObject(list_name)) { + _.each(list_name, function(v, k) { + if (!this._is_reserved_property(k)) { + $union[k] = _.isArray(v) ? v : [v]; + } + }, this); + callback = values; + } else { + $union[list_name] = _.isArray(values) ? values : [values]; + } + data[UNION_ACTION] = $union; + + return this._send_request(data, callback); +}); + +/* + * Record that you have charged the current user a certain amount + * of money. Charges recorded with track_charge() will appear in the + * Mixpanel revenue report. + * + * ### Usage: + * + * // charge a user $50 + * mixpanel.people.track_charge(50); + * + * // charge a user $30.50 on the 2nd of january + * mixpanel.people.track_charge(30.50, { + * '$time': new Date('jan 1 2012') + * }); + * + * @param {Number} amount The amount of money charged to the current user + * @param {Object} [properties] An associative array of properties associated with the charge + * @param {Function} [callback] If provided, the callback will be called when the server responds + */ +MixpanelPeople.prototype.track_charge = addOptOutCheckMixpanelPeople(function(amount, properties, callback) { + if (!_.isNumber(amount)) { + amount = parseFloat(amount); + if (isNaN(amount)) { + console$1.error('Invalid value passed to mixpanel.people.track_charge - must be a number'); + return; + } + } + + return this.append('$transactions', _.extend({ + '$amount': amount + }, properties), callback); +}); + +/* + * Permanently clear all revenue report transactions from the + * current user's people analytics profile. + * + * ### Usage: + * + * mixpanel.people.clear_charges(); + * + * @param {Function} [callback] If provided, the callback will be called after the tracking event + */ +MixpanelPeople.prototype.clear_charges = function(callback) { + return this.set('$transactions', [], callback); +}; + +/* + * Permanently deletes the current people analytics profile from + * Mixpanel (using the current distinct_id). + * + * ### Usage: + * + * // remove the all data you have stored about the current user + * mixpanel.people.delete_user(); + * + */ +MixpanelPeople.prototype.delete_user = function() { + if (!this._identify_called()) { + console$1.error('mixpanel.people.delete_user() requires you to call identify() first'); + return; + } + var data = {'$delete': this._mixpanel.get_distinct_id()}; + return this._send_request(data); +}; + +MixpanelPeople.prototype.toString = function() { + return this._mixpanel.toString() + '.people'; +}; + +MixpanelPeople.prototype._send_request = function(data, callback) { + data['$token'] = this._get_config('token'); + data['$distinct_id'] = this._mixpanel.get_distinct_id(); + + var date_encoded_data = _.encodeDates(data); + var truncated_data = _.truncate(date_encoded_data, 255); + var json_data = _.JSONEncode(date_encoded_data); + var encoded_data = _.base64Encode(json_data); + + if (!this._identify_called()) { + this._enqueue(data); + if (!_.isUndefined(callback)) { + if (this._get_config('verbose')) { + callback({status: -1, error: null}); + } else { + callback(-1); + } + } + return truncated_data; + } + + console$1.log('MIXPANEL PEOPLE REQUEST:'); + console$1.log(truncated_data); + + this._mixpanel._send_request( + this._get_config('api_host') + '/engage/', + {'data': encoded_data}, + this._mixpanel._prepare_callback(callback, truncated_data) + ); + + return truncated_data; +}; + +MixpanelPeople.prototype._get_config = function(conf_var) { + return this._mixpanel.get_config(conf_var); +}; + +MixpanelPeople.prototype._identify_called = function() { + return this._mixpanel._flags.identify_called === true; +}; + +// Queue up engage operations if identify hasn't been called yet. +MixpanelPeople.prototype._enqueue = function(data) { + if (SET_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(SET_ACTION, data); + } else if (SET_ONCE_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(SET_ONCE_ACTION, data); + } else if (UNSET_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(UNSET_ACTION, data); + } else if (ADD_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(ADD_ACTION, data); + } else if (APPEND_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(APPEND_ACTION, data); + } else if (UNION_ACTION in data) { + this._mixpanel['persistence']._add_to_people_queue(UNION_ACTION, data); + } else { + console$1.error('Invalid call to _enqueue():', data); + } +}; + +MixpanelPeople.prototype._flush_one_queue = function(action, action_method, callback, queue_to_params_fn) { + var _this = this; + var queued_data = _.extend({}, this._mixpanel['persistence']._get_queue(action)); + var action_params = queued_data; + + if (!_.isUndefined(queued_data) && _.isObject(queued_data) && !_.isEmptyObject(queued_data)) { + _this._mixpanel['persistence']._pop_from_people_queue(action, queued_data); + if (queue_to_params_fn) { + action_params = queue_to_params_fn(queued_data); + } + action_method.call(_this, action_params, function(response, data) { + // on bad response, we want to add it back to the queue + if (response === 0) { + _this._mixpanel['persistence']._add_to_people_queue(action, queued_data); + } + if (!_.isUndefined(callback)) { + callback(response, data); + } + }); + } +}; + +// Flush queued engage operations - order does not matter, +// and there are network level race conditions anyway +MixpanelPeople.prototype._flush = function( + _set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback +) { + var _this = this; + var $append_queue = this._mixpanel['persistence']._get_queue(APPEND_ACTION); + + this._flush_one_queue(SET_ACTION, this.set, _set_callback); + this._flush_one_queue(SET_ONCE_ACTION, this.set_once, _set_once_callback); + this._flush_one_queue(UNSET_ACTION, this.unset, _unset_callback, function(queue) { return _.keys(queue); }); + this._flush_one_queue(ADD_ACTION, this.increment, _add_callback); + this._flush_one_queue(UNION_ACTION, this.union, _union_callback); + + // we have to fire off each $append individually since there is + // no concat method server side + if (!_.isUndefined($append_queue) && _.isArray($append_queue) && $append_queue.length) { + var $append_item; + var callback = function(response, data) { + if (response === 0) { + _this._mixpanel['persistence']._add_to_people_queue(APPEND_ACTION, $append_item); + } + if (!_.isUndefined(_append_callback)) { + _append_callback(response, data); + } + }; + for (var i = $append_queue.length - 1; i >= 0; i--) { + $append_item = $append_queue.pop(); + _this.append($append_item, callback); + } + // Save the shortened append queue + _this._mixpanel['persistence'].save(); + } +}; + +MixpanelPeople.prototype._is_reserved_property = function(prop) { + return prop === '$distinct_id' || prop === '$token'; +}; + + +// Internal class for notification display +MixpanelLib._Notification = function(notif_data, mixpanel_instance) { + _.bind_instance_methods(this); + + this.mixpanel = mixpanel_instance; + this.persistence = this.mixpanel['persistence']; + + this.campaign_id = _.escapeHTML(notif_data['id']); + this.message_id = _.escapeHTML(notif_data['message_id']); + + this.body = (_.escapeHTML(notif_data['body']) || '').replace(/\n/g, '
'); + this.cta = _.escapeHTML(notif_data['cta']) || 'Close'; + this.notif_type = _.escapeHTML(notif_data['type']) || 'takeover'; + this.style = _.escapeHTML(notif_data['style']) || 'light'; + this.title = _.escapeHTML(notif_data['title']) || ''; + this.video_width = MPNotif.VIDEO_WIDTH; + this.video_height = MPNotif.VIDEO_HEIGHT; + + // These fields are url-sanitized in the backend already. + this.dest_url = notif_data['cta_url'] || null; + this.image_url = notif_data['image_url'] || null; + this.thumb_image_url = notif_data['thumb_image_url'] || null; + this.video_url = notif_data['video_url'] || null; + + this.clickthrough = true; + if (!this.dest_url) { + this.dest_url = '#dismiss'; + this.clickthrough = false; + } + + this.mini = this.notif_type === 'mini'; + if (!this.mini) { + this.notif_type = 'takeover'; + } + this.notif_width = !this.mini ? MPNotif.NOTIF_WIDTH : MPNotif.NOTIF_WIDTH_MINI; + + this._set_client_config(); + this.imgs_to_preload = this._init_image_html(); + this._init_video(); +}; + +MPNotif = MixpanelLib._Notification; + +MPNotif.ANIM_TIME = 200; +MPNotif.MARKUP_PREFIX = 'mixpanel-notification'; +MPNotif.BG_OPACITY = 0.6; +MPNotif.NOTIF_TOP = 25; +MPNotif.NOTIF_START_TOP = 200; +MPNotif.NOTIF_WIDTH = 388; +MPNotif.NOTIF_WIDTH_MINI = 420; +MPNotif.NOTIF_HEIGHT_MINI = 85; +MPNotif.THUMB_BORDER_SIZE = 5; +MPNotif.THUMB_IMG_SIZE = 60; +MPNotif.THUMB_OFFSET = Math.round(MPNotif.THUMB_IMG_SIZE / 2); +MPNotif.VIDEO_WIDTH = 595; +MPNotif.VIDEO_HEIGHT = 334; + +MPNotif.prototype.show = function() { + var self = this; + this._set_client_config(); + + // don't display until HTML body exists + if (!this.body_el) { + setTimeout(function() { self.show(); }, 300); + return; + } + + this._init_styles(); + this._init_notification_el(); + + // wait for any images to load before showing notification + this._preload_images(this._attach_and_animate); +}; + +MPNotif.prototype.dismiss = _.safewrap(function() { + if (!this.marked_as_shown) { + // unexpected condition: user interacted with notif even though we didn't consider it + // visible (see _mark_as_shown()); send tracking signals to mark delivery + this._mark_delivery({'invisible': true}); + } + + var exiting_el = this.showing_video ? this._get_el('video') : this._get_notification_display_el(); + if (this.use_transitions) { + this._remove_class('bg', 'visible'); + this._add_class(exiting_el, 'exiting'); + setTimeout(this._remove_notification_el, MPNotif.ANIM_TIME); + } else { + var notif_attr, notif_start, notif_goal; + if (this.mini) { + notif_attr = 'right'; + notif_start = 20; + notif_goal = -100; + } else { + notif_attr = 'top'; + notif_start = MPNotif.NOTIF_TOP; + notif_goal = MPNotif.NOTIF_START_TOP + MPNotif.NOTIF_TOP; + } + this._animate_els([ + { + el: this._get_el('bg'), + attr: 'opacity', + start: MPNotif.BG_OPACITY, + goal: 0.0 + }, + { + el: exiting_el, + attr: 'opacity', + start: 1.0, + goal: 0.0 + }, + { + el: exiting_el, + attr: notif_attr, + start: notif_start, + goal: notif_goal + } + ], MPNotif.ANIM_TIME, this._remove_notification_el); + } +}); + +MPNotif.prototype._add_class = _.safewrap(function(el, class_name) { + class_name = MPNotif.MARKUP_PREFIX + '-' + class_name; + if (typeof el === 'string') { + el = this._get_el(el); + } + if (!el.className) { + el.className = class_name; + } else if (!~(' ' + el.className + ' ').indexOf(' ' + class_name + ' ')) { + el.className += ' ' + class_name; + } +}); +MPNotif.prototype._remove_class = _.safewrap(function(el, class_name) { + class_name = MPNotif.MARKUP_PREFIX + '-' + class_name; + if (typeof el === 'string') { + el = this._get_el(el); + } + if (el.className) { + el.className = (' ' + el.className + ' ') + .replace(' ' + class_name + ' ', '') + .replace(/^[\s\xA0]+/, '') + .replace(/[\s\xA0]+$/, ''); + } +}); + +MPNotif.prototype._animate_els = _.safewrap(function(anims, mss, done_cb, start_time) { + var self = this, + in_progress = false, + ai, anim, + cur_time = 1 * new Date(), time_diff; + + start_time = start_time || cur_time; + time_diff = cur_time - start_time; + + for (ai = 0; ai < anims.length; ai++) { + anim = anims[ai]; + if (typeof anim.val === 'undefined') { + anim.val = anim.start; + } + if (anim.val !== anim.goal) { + in_progress = true; + var anim_diff = anim.goal - anim.start, + anim_dir = anim.goal >= anim.start ? 1 : -1; + anim.val = anim.start + anim_diff * time_diff / mss; + if (anim.attr !== 'opacity') { + anim.val = Math.round(anim.val); + } + if ((anim_dir > 0 && anim.val >= anim.goal) || (anim_dir < 0 && anim.val <= anim.goal)) { + anim.val = anim.goal; + } + } + } + if (!in_progress) { + if (done_cb) { + done_cb(); + } + return; + } + + for (ai = 0; ai < anims.length; ai++) { + anim = anims[ai]; + if (anim.el) { + var suffix = anim.attr === 'opacity' ? '' : 'px'; + anim.el.style[anim.attr] = String(anim.val) + suffix; + } + } + setTimeout(function() { self._animate_els(anims, mss, done_cb, start_time); }, 10); +}); + +MPNotif.prototype._attach_and_animate = _.safewrap(function() { + var self = this; + + // no possibility to double-display + if (this.shown || this._get_shown_campaigns()[this.campaign_id]) { + return; + } + this.shown = true; + + this.body_el.appendChild(this.notification_el); + setTimeout(function() { + var notif_el = self._get_notification_display_el(); + if (self.use_transitions) { + if (!self.mini) { + self._add_class('bg', 'visible'); + } + self._add_class(notif_el, 'visible'); + self._mark_as_shown(); + } else { + var notif_attr, notif_start, notif_goal; + if (self.mini) { + notif_attr = 'right'; + notif_start = -100; + notif_goal = 20; + } else { + notif_attr = 'top'; + notif_start = MPNotif.NOTIF_START_TOP + MPNotif.NOTIF_TOP; + notif_goal = MPNotif.NOTIF_TOP; + } + self._animate_els([ + { + el: self._get_el('bg'), + attr: 'opacity', + start: 0.0, + goal: MPNotif.BG_OPACITY + }, + { + el: notif_el, + attr: 'opacity', + start: 0.0, + goal: 1.0 + }, + { + el: notif_el, + attr: notif_attr, + start: notif_start, + goal: notif_goal + } + ], MPNotif.ANIM_TIME, self._mark_as_shown); + } + }, 100); + _.register_event(self._get_el('cancel'), 'click', function(e) { + e.preventDefault(); + self.dismiss(); + }); + var click_el = self._get_el('button') || + self._get_el('mini-content'); + _.register_event(click_el, 'click', function(e) { + e.preventDefault(); + if (self.show_video) { + self._track_event('$campaign_open', {'$resource_type': 'video'}); + self._switch_to_video(); + } else { + self.dismiss(); + if (self.clickthrough) { + self._track_event('$campaign_open', {'$resource_type': 'link'}, function() { + window$1.location.href = self.dest_url; + }); + } + } + }); +}); + +MPNotif.prototype._get_el = function(id) { + return document$1.getElementById(MPNotif.MARKUP_PREFIX + '-' + id); +}; + +MPNotif.prototype._get_notification_display_el = function() { + return this._get_el(this.notif_type); +}; + +MPNotif.prototype._get_shown_campaigns = function() { + return this.persistence['props'][CAMPAIGN_IDS_KEY] || (this.persistence['props'][CAMPAIGN_IDS_KEY] = {}); +}; + +MPNotif.prototype._browser_lte = function(browser, version) { + return this.browser_versions[browser] && this.browser_versions[browser] <= version; +}; + +MPNotif.prototype._init_image_html = function() { + var imgs_to_preload = []; + + if (!this.mini) { + if (this.image_url) { + imgs_to_preload.push(this.image_url); + this.img_html = ''; + } else { + this.img_html = ''; + } + if (this.thumb_image_url) { + imgs_to_preload.push(this.thumb_image_url); + this.thumb_img_html = + '
' + + '' + + '
'; + } else { + this.thumb_img_html = ''; + } + } else { + this.thumb_image_url = this.thumb_image_url || '//cdn.mxpnl.com/site_media/images/icons/notifications/mini-news-dark.png'; + imgs_to_preload.push(this.thumb_image_url); + } + + return imgs_to_preload; +}; + +MPNotif.prototype._init_notification_el = function() { + var notification_html = ''; + var video_src = ''; + var video_html = ''; + var cancel_html = '
' + + '
' + + '
'; + + this.notification_el = document$1.createElement('div'); + this.notification_el.id = MPNotif.MARKUP_PREFIX + '-wrapper'; + if (!this.mini) { + // TAKEOVER notification + var close_html = (this.clickthrough || this.show_video) ? '' : '
', + play_html = this.show_video ? '
' : ''; + if (this._browser_lte('ie', 7)) { + close_html = ''; + play_html = ''; + } + notification_html = + '
' + + this.thumb_img_html + + '
' + + cancel_html + + '
' + + this.img_html + + '
' + this.title + '
' + + '
' + this.body + '
' + + '
' + + 'POWERED BY MIXPANEL' + + '
' + + '
' + + '
' + + close_html + + '' + this.cta + '' + + play_html + + '
' + + '
' + + '
'; + } else { + // MINI notification + notification_html = + '
' + + '
' + + cancel_html + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + this.body + '
' + + '
' + + '
' + + '
' + + '
' + + '
'; + } + if (this.youtube_video) { + video_src = '//www.youtube.com/embed/' + this.youtube_video + + '?wmode=transparent&showinfo=0&modestbranding=0&rel=0&autoplay=1&loop=0&vq=hd1080'; + if (this.yt_custom) { + video_src += '&enablejsapi=1&html5=1&controls=0'; + video_html = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
'; + } + } else if (this.vimeo_video) { + video_src = '//player.vimeo.com/video/' + this.vimeo_video + '?autoplay=1&title=0&byline=0&portrait=0'; + } + if (this.show_video) { + this.video_iframe = + ''; + video_html = + '
' + + '
' + + '
' + + video_html + + '
' + + '
'; + } + var main_html = video_html + notification_html; + if (this.flip_animate) { + main_html = + (this.mini ? notification_html : '') + + '
' + + (this.mini ? video_html : main_html) + + '
'; + } + + this.notification_el.innerHTML = + ('
' + + '
' + + '
' + + '
' + + main_html + + '
' + + '
' + + '
') + .replace(/class=\"/g, 'class="' + MPNotif.MARKUP_PREFIX + '-') + .replace(/id=\"/g, 'id="' + MPNotif.MARKUP_PREFIX + '-'); +}; + +MPNotif.prototype._init_styles = function() { + if (this.style === 'dark') { + this.style_vals = { + bg: '#1d1f25', + bg_actions: '#282b32', + bg_hover: '#3a4147', + bg_light: '#4a5157', + border_gray: '#32353c', + cancel_opacity: '0.4', + mini_hover: '#2a3137', + text_title: '#fff', + text_main: '#9498a3', + text_tagline: '#464851', + text_hover: '#ddd' + }; + } else { + this.style_vals = { + bg: '#fff', + bg_actions: '#e7eaee', + bg_hover: '#eceff3', + bg_light: '#f5f5f5', + border_gray: '#e4ecf2', + cancel_opacity: '1.0', + mini_hover: '#fafafa', + text_title: '#5c6578', + text_main: '#8b949b', + text_tagline: '#ced9e6', + text_hover: '#7c8598' + }; + } + var shadow = '0px 0px 35px 0px rgba(45, 49, 56, 0.7)', + video_shadow = shadow, + mini_shadow = shadow, + thumb_total_size = MPNotif.THUMB_IMG_SIZE + MPNotif.THUMB_BORDER_SIZE * 2, + anim_seconds = (MPNotif.ANIM_TIME / 1000) + 's'; + if (this.mini) { + shadow = 'none'; + } + + // don't display on small viewports + var notif_media_queries = {}, + min_width = MPNotif.NOTIF_WIDTH_MINI + 20; + notif_media_queries['@media only screen and (max-width: ' + (min_width - 1) + 'px)'] = { + '#overlay': { + 'display': 'none' + } + }; + var notif_styles = { + '.flipped': { + 'transform': 'rotateY(180deg)' + }, + '#overlay': { + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'overflow': 'auto', + 'text-align': 'center', + 'z-index': '10000', + 'font-family': '"Helvetica", "Arial", sans-serif', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' + }, + '#overlay.mini': { + 'height': '0', + 'overflow': 'visible' + }, + '#overlay a': { + 'width': 'initial', + 'padding': '0', + 'text-decoration': 'none', + 'text-transform': 'none', + 'color': 'inherit' + }, + '#bgwrapper': { + 'position': 'relative', + 'width': '100%', + 'height': '100%' + }, + '#bg': { + 'position': 'fixed', + 'top': '0', + 'left': '0', + 'width': '100%', + 'height': '100%', + 'min-width': this.doc_width * 4 + 'px', + 'min-height': this.doc_height * 4 + 'px', + 'background-color': 'black', + 'opacity': '0.0', + '-ms-filter': 'progid:DXImageTransform.Microsoft.Alpha(Opacity=60)', // IE8 + 'filter': 'alpha(opacity=60)', // IE5-7 + 'transition': 'opacity ' + anim_seconds + }, + '#bg.visible': { + 'opacity': MPNotif.BG_OPACITY + }, + '.mini #bg': { + 'width': '0', + 'height': '0', + 'min-width': '0' + }, + '#flipcontainer': { + 'perspective': '1000px', + 'position': 'absolute', + 'width': '100%' + }, + '#flipper': { + 'position': 'relative', + 'transform-style': 'preserve-3d', + 'transition': '0.3s' + }, + '#takeover': { + 'position': 'absolute', + 'left': '50%', + 'width': MPNotif.NOTIF_WIDTH + 'px', + 'margin-left': Math.round(-MPNotif.NOTIF_WIDTH / 2) + 'px', + 'backface-visibility': 'hidden', + 'transform': 'rotateY(0deg)', + 'opacity': '0.0', + 'top': MPNotif.NOTIF_START_TOP + 'px', + 'transition': 'opacity ' + anim_seconds + ', top ' + anim_seconds + }, + '#takeover.visible': { + 'opacity': '1.0', + 'top': MPNotif.NOTIF_TOP + 'px' + }, + '#takeover.exiting': { + 'opacity': '0.0', + 'top': MPNotif.NOTIF_START_TOP + 'px' + }, + '#thumbspacer': { + 'height': MPNotif.THUMB_OFFSET + 'px' + }, + '#thumbborder-wrapper': { + 'position': 'absolute', + 'top': (-MPNotif.THUMB_BORDER_SIZE) + 'px', + 'left': (MPNotif.NOTIF_WIDTH / 2 - MPNotif.THUMB_OFFSET - MPNotif.THUMB_BORDER_SIZE) + 'px', + 'width': thumb_total_size + 'px', + 'height': (thumb_total_size / 2) + 'px', + 'overflow': 'hidden' + }, + '#thumbborder': { + 'position': 'absolute', + 'width': thumb_total_size + 'px', + 'height': thumb_total_size + 'px', + 'border-radius': thumb_total_size + 'px', + 'background-color': this.style_vals.bg_actions, + 'opacity': '0.5' + }, + '#thumbnail': { + 'position': 'absolute', + 'top': '0px', + 'left': (MPNotif.NOTIF_WIDTH / 2 - MPNotif.THUMB_OFFSET) + 'px', + 'width': MPNotif.THUMB_IMG_SIZE + 'px', + 'height': MPNotif.THUMB_IMG_SIZE + 'px', + 'overflow': 'hidden', + 'z-index': '100', + 'border-radius': MPNotif.THUMB_IMG_SIZE + 'px' + }, + '#mini': { + 'position': 'absolute', + 'right': '20px', + 'top': MPNotif.NOTIF_TOP + 'px', + 'width': this.notif_width + 'px', + 'height': MPNotif.NOTIF_HEIGHT_MINI * 2 + 'px', + 'margin-top': 20 - MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'backface-visibility': 'hidden', + 'opacity': '0.0', + 'transform': 'rotateX(90deg)', + 'transition': 'opacity 0.3s, transform 0.3s, right 0.3s' + }, + '#mini.visible': { + 'opacity': '1.0', + 'transform': 'rotateX(0deg)' + }, + '#mini.exiting': { + 'opacity': '0.0', + 'right': '-150px' + }, + '#mainbox': { + 'border-radius': '4px', + 'box-shadow': shadow, + 'text-align': 'center', + 'background-color': this.style_vals.bg, + 'font-size': '14px', + 'color': this.style_vals.text_main + }, + '#mini #mainbox': { + 'height': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'margin-top': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'border-radius': '3px', + 'transition': 'background-color ' + anim_seconds + }, + '#mini-border': { + 'height': (MPNotif.NOTIF_HEIGHT_MINI + 6) + 'px', + 'width': (MPNotif.NOTIF_WIDTH_MINI + 6) + 'px', + 'position': 'absolute', + 'top': '-3px', + 'left': '-3px', + 'margin-top': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'border-radius': '6px', + 'opacity': '0.25', + 'background-color': '#fff', + 'z-index': '-1', + 'box-shadow': mini_shadow + }, + '#mini-icon': { + 'position': 'relative', + 'display': 'inline-block', + 'width': '75px', + 'height': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'border-radius': '3px 0 0 3px', + 'background-color': this.style_vals.bg_actions, + 'background': 'linear-gradient(135deg, ' + this.style_vals.bg_light + ' 0%, ' + this.style_vals.bg_actions + ' 100%)', + 'transition': 'background-color ' + anim_seconds + }, + '#mini:hover #mini-icon': { + 'background-color': this.style_vals.mini_hover + }, + '#mini:hover #mainbox': { + 'background-color': this.style_vals.mini_hover + }, + '#mini-icon-img': { + 'position': 'absolute', + 'background-image': 'url(' + this.thumb_image_url + ')', + 'width': '48px', + 'height': '48px', + 'top': '20px', + 'left': '12px' + }, + '#content': { + 'padding': '30px 20px 0px 20px' + }, + '#mini-content': { + 'text-align': 'left', + 'height': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'cursor': 'pointer' + }, + '#img': { + 'width': '328px', + 'margin-top': '30px', + 'border-radius': '5px' + }, + '#title': { + 'max-height': '600px', + 'overflow': 'hidden', + 'word-wrap': 'break-word', + 'padding': '25px 0px 20px 0px', + 'font-size': '19px', + 'font-weight': 'bold', + 'color': this.style_vals.text_title + }, + '#body': { + 'max-height': '600px', + 'margin-bottom': '25px', + 'overflow': 'hidden', + 'word-wrap': 'break-word', + 'line-height': '21px', + 'font-size': '15px', + 'font-weight': 'normal', + 'text-align': 'left' + }, + '#mini #body': { + 'display': 'inline-block', + 'max-width': '250px', + 'margin': '0 0 0 30px', + 'height': MPNotif.NOTIF_HEIGHT_MINI + 'px', + 'font-size': '16px', + 'letter-spacing': '0.8px', + 'color': this.style_vals.text_title + }, + '#mini #body-text': { + 'display': 'table', + 'height': MPNotif.NOTIF_HEIGHT_MINI + 'px' + }, + '#mini #body-text div': { + 'display': 'table-cell', + 'vertical-align': 'middle' + }, + '#tagline': { + 'margin-bottom': '15px', + 'font-size': '10px', + 'font-weight': '600', + 'letter-spacing': '0.8px', + 'color': '#ccd7e0', + 'text-align': 'left' + }, + '#tagline a': { + 'color': this.style_vals.text_tagline, + 'transition': 'color ' + anim_seconds + }, + '#tagline a:hover': { + 'color': this.style_vals.text_hover + }, + '#cancel': { + 'position': 'absolute', + 'right': '0', + 'width': '8px', + 'height': '8px', + 'padding': '10px', + 'border-radius': '20px', + 'margin': '12px 12px 0 0', + 'box-sizing': 'content-box', + 'cursor': 'pointer', + 'transition': 'background-color ' + anim_seconds + }, + '#mini #cancel': { + 'margin': '7px 7px 0 0' + }, + '#cancel-icon': { + 'width': '8px', + 'height': '8px', + 'overflow': 'hidden', + 'background-image': 'url(//cdn.mxpnl.com/site_media/images/icons/notifications/cancel-x.png)', + 'opacity': this.style_vals.cancel_opacity + }, + '#cancel:hover': { + 'background-color': this.style_vals.bg_hover + }, + '#button': { + 'display': 'block', + 'height': '60px', + 'line-height': '60px', + 'text-align': 'center', + 'background-color': this.style_vals.bg_actions, + 'border-radius': '0 0 4px 4px', + 'overflow': 'hidden', + 'cursor': 'pointer', + 'transition': 'background-color ' + anim_seconds + }, + '#button-close': { + 'display': 'inline-block', + 'width': '9px', + 'height': '60px', + 'margin-right': '8px', + 'vertical-align': 'top', + 'background-image': 'url(//cdn.mxpnl.com/site_media/images/icons/notifications/close-x-' + this.style + '.png)', + 'background-repeat': 'no-repeat', + 'background-position': '0px 25px' + }, + '#button-play': { + 'display': 'inline-block', + 'width': '30px', + 'height': '60px', + 'margin-left': '15px', + 'background-image': 'url(//cdn.mxpnl.com/site_media/images/icons/notifications/play-' + this.style + '-small.png)', + 'background-repeat': 'no-repeat', + 'background-position': '0px 15px' + }, + 'a#button-link': { + 'display': 'inline-block', + 'vertical-align': 'top', + 'text-align': 'center', + 'font-size': '17px', + 'font-weight': 'bold', + 'overflow': 'hidden', + 'word-wrap': 'break-word', + 'color': this.style_vals.text_title, + 'transition': 'color ' + anim_seconds + }, + '#button:hover': { + 'background-color': this.style_vals.bg_hover, + 'color': this.style_vals.text_hover + }, + '#button:hover a': { + 'color': this.style_vals.text_hover + }, + + '#video-noflip': { + 'position': 'relative', + 'top': (-this.video_height * 2) + 'px' + }, + '#video-flip': { + 'backface-visibility': 'hidden', + 'transform': 'rotateY(180deg)' + }, + '#video': { + 'position': 'absolute', + 'width': (this.video_width - 1) + 'px', + 'height': this.video_height + 'px', + 'top': MPNotif.NOTIF_TOP + 'px', + 'margin-top': '100px', + 'left': '50%', + 'margin-left': Math.round(-this.video_width / 2) + 'px', + 'overflow': 'hidden', + 'border-radius': '5px', + 'box-shadow': video_shadow, + 'transform': 'translateZ(1px)', // webkit rendering bug http://stackoverflow.com/questions/18167981/clickable-link-area-unexpectedly-smaller-after-css-transform + 'transition': 'opacity ' + anim_seconds + ', top ' + anim_seconds + }, + '#video.exiting': { + 'opacity': '0.0', + 'top': this.video_height + 'px' + }, + '#video-holder': { + 'position': 'absolute', + 'width': (this.video_width - 1) + 'px', + 'height': this.video_height + 'px', + 'overflow': 'hidden', + 'border-radius': '5px' + }, + '#video-frame': { + 'margin-left': '-1px', + 'width': this.video_width + 'px' + }, + '#video-controls': { + 'opacity': '0', + 'transition': 'opacity 0.5s' + }, + '#video:hover #video-controls': { + 'opacity': '1.0' + }, + '#video .video-progress-el': { + 'position': 'absolute', + 'bottom': '0', + 'height': '25px', + 'border-radius': '0 0 0 5px' + }, + '#video-progress': { + 'width': '90%' + }, + '#video-progress-total': { + 'width': '100%', + 'background-color': this.style_vals.bg, + 'opacity': '0.7' + }, + '#video-elapsed': { + 'width': '0', + 'background-color': '#6cb6f5', + 'opacity': '0.9' + }, + '#video #video-time': { + 'width': '10%', + 'right': '0', + 'font-size': '11px', + 'line-height': '25px', + 'color': this.style_vals.text_main, + 'background-color': '#666', + 'border-radius': '0 0 5px 0' + } + }; + + // IE hacks + if (this._browser_lte('ie', 8)) { + _.extend(notif_styles, { + '* html #overlay': { + 'position': 'absolute' + }, + '* html #bg': { + 'position': 'absolute' + }, + 'html, body': { + 'height': '100%' + } + }); + } + if (this._browser_lte('ie', 7)) { + _.extend(notif_styles, { + '#mini #body': { + 'display': 'inline', + 'zoom': '1', + 'border': '1px solid ' + this.style_vals.bg_hover + }, + '#mini #body-text': { + 'padding': '20px' + }, + '#mini #mini-icon': { + 'display': 'none' + } + }); + } + + // add vendor-prefixed style rules + var VENDOR_STYLES = ['backface-visibility', 'border-radius', 'box-shadow', 'opacity', + 'perspective', 'transform', 'transform-style', 'transition'], + VENDOR_PREFIXES = ['khtml', 'moz', 'ms', 'o', 'webkit']; + for (var selector in notif_styles) { + for (var si = 0; si < VENDOR_STYLES.length; si++) { + var prop = VENDOR_STYLES[si]; + if (prop in notif_styles[selector]) { + var val = notif_styles[selector][prop]; + for (var pi = 0; pi < VENDOR_PREFIXES.length; pi++) { + notif_styles[selector]['-' + VENDOR_PREFIXES[pi] + '-' + prop] = val; + } + } + } + } + + var inject_styles = function(styles, media_queries) { + var create_style_text = function(style_defs) { + var st = ''; + for (var selector in style_defs) { + var mp_selector = selector + .replace(/#/g, '#' + MPNotif.MARKUP_PREFIX + '-') + .replace(/\./g, '.' + MPNotif.MARKUP_PREFIX + '-'); + st += '\n' + mp_selector + ' {'; + var props = style_defs[selector]; + for (var k in props) { + st += k + ':' + props[k] + ';'; + } + st += '}'; + } + return st; + }; + var create_media_query_text = function(mq_defs) { + var mqt = ''; + for (var mq in mq_defs) { + mqt += '\n' + mq + ' {' + create_style_text(mq_defs[mq]) + '\n}'; + } + return mqt; + }; + + var style_text = create_style_text(styles) + create_media_query_text(media_queries), + head_el = document$1.head || document$1.getElementsByTagName('head')[0] || document$1.documentElement, + style_el = document$1.createElement('style'); + head_el.appendChild(style_el); + style_el.setAttribute('type', 'text/css'); + if (style_el.styleSheet) { // IE + style_el.styleSheet.cssText = style_text; + } else { + style_el.textContent = style_text; + } + }; + inject_styles(notif_styles, notif_media_queries); +}; + +MPNotif.prototype._init_video = _.safewrap(function() { + if (!this.video_url) { + return; + } + var self = this; + + // Youtube iframe API compatibility + self.yt_custom = 'postMessage' in window$1; + + self.dest_url = self.video_url; + var youtube_match = self.video_url.match( + // http://stackoverflow.com/questions/2936467/parse-youtube-video-id-using-preg-match + /(?:youtube(?:-nocookie)?\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/ ]{11})/i + ), + vimeo_match = self.video_url.match( + /vimeo\.com\/.*?(\d+)/i + ); + if (youtube_match) { + self.show_video = true; + self.youtube_video = youtube_match[1]; + + if (self.yt_custom) { + window$1['onYouTubeIframeAPIReady'] = function() { + if (self._get_el('video-frame')) { + self._yt_video_ready(); + } + }; + + // load Youtube iframe API; see https://developers.google.com/youtube/iframe_api_reference + var tag = document$1.createElement('script'); + tag.src = '//www.youtube.com/iframe_api'; + var firstScriptTag = document$1.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + } + } else if (vimeo_match) { + self.show_video = true; + self.vimeo_video = vimeo_match[1]; + } + + // IE <= 7, FF <= 3: fall through to video link rather than embedded player + if (self._browser_lte('ie', 7) || self._browser_lte('firefox', 3)) { + self.show_video = false; + self.clickthrough = true; + } +}); + +MPNotif.prototype._mark_as_shown = _.safewrap(function() { + // click on background to dismiss + var self = this; + _.register_event(self._get_el('bg'), 'click', function() { + self.dismiss(); + }); + + var get_style = function(el, style_name) { + var styles = {}; + if (document$1.defaultView && document$1.defaultView.getComputedStyle) { + styles = document$1.defaultView.getComputedStyle(el, null); // FF3 requires both args + } else if (el.currentStyle) { // IE + styles = el.currentStyle; + } + return styles[style_name]; + }; + + if (this.campaign_id) { + var notif_el = this._get_el('overlay'); + if (notif_el && get_style(notif_el, 'visibility') !== 'hidden' && get_style(notif_el, 'display') !== 'none') { + this._mark_delivery(); + } + } +}); + +MPNotif.prototype._mark_delivery = _.safewrap(function(extra_props) { + if (!this.marked_as_shown) { + this.marked_as_shown = true; + + if (this.campaign_id) { + // mark notification shown (local cache) + this._get_shown_campaigns()[this.campaign_id] = 1 * new Date(); + this.persistence.save(); + } + + // track delivery + this._track_event('$campaign_delivery', extra_props); + + // mark notification shown (mixpanel property) + this.mixpanel['people']['append']({ + '$campaigns': this.campaign_id, + '$notifications': { + 'campaign_id': this.campaign_id, + 'message_id': this.message_id, + 'type': 'web', + 'time': new Date() + } + }); + } +}); + +MPNotif.prototype._preload_images = function(all_loaded_cb) { + var self = this; + if (this.imgs_to_preload.length === 0) { + all_loaded_cb(); + return; + } + + var preloaded_imgs = 0; + var img_objs = []; + var onload = function() { + preloaded_imgs++; + if (preloaded_imgs === self.imgs_to_preload.length && all_loaded_cb) { + all_loaded_cb(); + all_loaded_cb = null; + } + }; + for (var i = 0; i < this.imgs_to_preload.length; i++) { + var img = new Image(); + img.onload = onload; + img.src = this.imgs_to_preload[i]; + if (img.complete) { + onload(); + } + img_objs.push(img); + } + + // IE6/7 doesn't fire onload reliably + if (this._browser_lte('ie', 7)) { + setTimeout(function() { + var imgs_loaded = true; + for (i = 0; i < img_objs.length; i++) { + if (!img_objs[i].complete) { + imgs_loaded = false; + } + } + if (imgs_loaded && all_loaded_cb) { + all_loaded_cb(); + all_loaded_cb = null; + } + }, 500); + } +}; + +MPNotif.prototype._remove_notification_el = _.safewrap(function() { + window$1.clearInterval(this._video_progress_checker); + this.notification_el.style.visibility = 'hidden'; + this.body_el.removeChild(this.notification_el); +}); + +MPNotif.prototype._set_client_config = function() { + var get_browser_version = function(browser_ex) { + var match = navigator.userAgent.match(browser_ex); + return match && match[1]; + }; + this.browser_versions = {}; + this.browser_versions['chrome'] = get_browser_version(/Chrome\/(\d+)/); + this.browser_versions['firefox'] = get_browser_version(/Firefox\/(\d+)/); + this.browser_versions['ie'] = get_browser_version(/MSIE (\d+).+/); + if (!this.browser_versions['ie'] && !(window$1.ActiveXObject) && 'ActiveXObject' in window$1) { + this.browser_versions['ie'] = 11; + } + + this.body_el = document$1.body || document$1.getElementsByTagName('body')[0]; + if (this.body_el) { + this.doc_width = Math.max( + this.body_el.scrollWidth, document$1.documentElement.scrollWidth, + this.body_el.offsetWidth, document$1.documentElement.offsetWidth, + this.body_el.clientWidth, document$1.documentElement.clientWidth + ); + this.doc_height = Math.max( + this.body_el.scrollHeight, document$1.documentElement.scrollHeight, + this.body_el.offsetHeight, document$1.documentElement.offsetHeight, + this.body_el.clientHeight, document$1.documentElement.clientHeight + ); + } + + // detect CSS compatibility + var ie_ver = this.browser_versions['ie']; + var sample_styles = document$1.createElement('div').style, + is_css_compatible = function(rule) { + if (rule in sample_styles) { + return true; + } + if (!ie_ver) { + rule = rule[0].toUpperCase() + rule.slice(1); + var props = ['O' + rule, 'Webkit' + rule, 'Moz' + rule]; + for (var i = 0; i < props.length; i++) { + if (props[i] in sample_styles) { + return true; + } + } + } + return false; + }; + this.use_transitions = this.body_el && + is_css_compatible('transition') && + is_css_compatible('transform'); + this.flip_animate = (this.browser_versions['chrome'] >= 33 || this.browser_versions['firefox'] >= 15) && + this.body_el && + is_css_compatible('backfaceVisibility') && + is_css_compatible('perspective') && + is_css_compatible('transform'); +}; + +MPNotif.prototype._switch_to_video = _.safewrap(function() { + var self = this, + anims = [ + { + el: self._get_notification_display_el(), + attr: 'opacity', + start: 1.0, + goal: 0.0 + }, + { + el: self._get_notification_display_el(), + attr: 'top', + start: MPNotif.NOTIF_TOP, + goal: -500 + }, + { + el: self._get_el('video-noflip'), + attr: 'opacity', + start: 0.0, + goal: 1.0 + }, + { + el: self._get_el('video-noflip'), + attr: 'top', + start: -self.video_height * 2, + goal: 0 + } + ]; + + if (self.mini) { + var bg = self._get_el('bg'), + overlay = self._get_el('overlay'); + bg.style.width = '100%'; + bg.style.height = '100%'; + overlay.style.width = '100%'; + + self._add_class(self._get_notification_display_el(), 'exiting'); + self._add_class(bg, 'visible'); + + anims.push({ + el: self._get_el('bg'), + attr: 'opacity', + start: 0.0, + goal: MPNotif.BG_OPACITY + }); + } + + var video_el = self._get_el('video-holder'); + video_el.innerHTML = self.video_iframe; + + var video_ready = function() { + if (window$1['YT'] && window$1['YT']['loaded']) { + self._yt_video_ready(); + } + self.showing_video = true; + self._get_notification_display_el().style.visibility = 'hidden'; + }; + if (self.flip_animate) { + self._add_class('flipper', 'flipped'); + setTimeout(video_ready, MPNotif.ANIM_TIME); + } else { + self._animate_els(anims, MPNotif.ANIM_TIME, video_ready); + } +}); + +MPNotif.prototype._track_event = function(event_name, properties, cb) { + if (this.campaign_id) { + properties = properties || {}; + properties = _.extend(properties, { + 'campaign_id': this.campaign_id, + 'message_id': this.message_id, + 'message_type': 'web_inapp', + 'message_subtype': this.notif_type + }); + this.mixpanel['track'](event_name, properties, cb); + } else if (cb) { + cb.call(); + } +}; + +MPNotif.prototype._yt_video_ready = _.safewrap(function() { + var self = this; + if (self.video_inited) { + return; + } + self.video_inited = true; + + var progress_bar = self._get_el('video-elapsed'), + progress_time = self._get_el('video-time'), + progress_el = self._get_el('video-progress'); + + new window$1['YT']['Player'](MPNotif.MARKUP_PREFIX + '-video-frame', { + 'events': { + 'onReady': function(event) { + var ytplayer = event['target'], + video_duration = ytplayer['getDuration'](), + pad = function(i) { + return ('00' + i).slice(-2); + }, + update_video_time = function(current_time) { + var secs = Math.round(video_duration - current_time), + mins = Math.floor(secs / 60), + hours = Math.floor(mins / 60); + secs -= mins * 60; + mins -= hours * 60; + progress_time.innerHTML = '-' + (hours ? hours + ':' : '') + pad(mins) + ':' + pad(secs); + }; + update_video_time(0); + self._video_progress_checker = window$1.setInterval(function() { + var current_time = ytplayer['getCurrentTime'](); + progress_bar.style.width = (current_time / video_duration * 100) + '%'; + update_video_time(current_time); + }, 250); + _.register_event(progress_el, 'click', function(e) { + var clickx = Math.max(0, e.pageX - progress_el.getBoundingClientRect().left); + ytplayer['seekTo'](video_duration * clickx / progress_el.clientWidth, true); + }); + } + } + }); +}); + +// EXPORTS (for closure compiler) + +// MixpanelLib Exports +MixpanelLib.prototype['init'] = MixpanelLib.prototype.init; +MixpanelLib.prototype['reset'] = MixpanelLib.prototype.reset; +MixpanelLib.prototype['disable'] = MixpanelLib.prototype.disable; +MixpanelLib.prototype['time_event'] = MixpanelLib.prototype.time_event; +MixpanelLib.prototype['track'] = MixpanelLib.prototype.track; +MixpanelLib.prototype['track_links'] = MixpanelLib.prototype.track_links; +MixpanelLib.prototype['track_forms'] = MixpanelLib.prototype.track_forms; +MixpanelLib.prototype['track_pageview'] = MixpanelLib.prototype.track_pageview; +MixpanelLib.prototype['register'] = MixpanelLib.prototype.register; +MixpanelLib.prototype['register_once'] = MixpanelLib.prototype.register_once; +MixpanelLib.prototype['unregister'] = MixpanelLib.prototype.unregister; +MixpanelLib.prototype['identify'] = MixpanelLib.prototype.identify; +MixpanelLib.prototype['alias'] = MixpanelLib.prototype.alias; +MixpanelLib.prototype['name_tag'] = MixpanelLib.prototype.name_tag; +MixpanelLib.prototype['set_config'] = MixpanelLib.prototype.set_config; +MixpanelLib.prototype['get_config'] = MixpanelLib.prototype.get_config; +MixpanelLib.prototype['get_property'] = MixpanelLib.prototype.get_property; +MixpanelLib.prototype['get_distinct_id'] = MixpanelLib.prototype.get_distinct_id; +MixpanelLib.prototype['toString'] = MixpanelLib.prototype.toString; +MixpanelLib.prototype['_check_and_handle_notifications'] = MixpanelLib.prototype._check_and_handle_notifications; +MixpanelLib.prototype['_show_notification'] = MixpanelLib.prototype._show_notification; +MixpanelLib.prototype['opt_out_tracking'] = MixpanelLib.prototype.opt_out_tracking; +MixpanelLib.prototype['opt_in_tracking'] = MixpanelLib.prototype.opt_in_tracking; +MixpanelLib.prototype['has_opted_out_tracking'] = MixpanelLib.prototype.has_opted_out_tracking; +MixpanelLib.prototype['has_opted_in_tracking'] = MixpanelLib.prototype.has_opted_in_tracking; +MixpanelLib.prototype['clear_opt_in_out_tracking'] = MixpanelLib.prototype.clear_opt_in_out_tracking; + +// MixpanelPersistence Exports +MixpanelPersistence.prototype['properties'] = MixpanelPersistence.prototype.properties; +MixpanelPersistence.prototype['update_search_keyword'] = MixpanelPersistence.prototype.update_search_keyword; +MixpanelPersistence.prototype['update_referrer_info'] = MixpanelPersistence.prototype.update_referrer_info; +MixpanelPersistence.prototype['get_cross_subdomain'] = MixpanelPersistence.prototype.get_cross_subdomain; +MixpanelPersistence.prototype['clear'] = MixpanelPersistence.prototype.clear; + +// MixpanelPeople Exports +MixpanelPeople.prototype['set'] = MixpanelPeople.prototype.set; +MixpanelPeople.prototype['set_once'] = MixpanelPeople.prototype.set_once; +MixpanelPeople.prototype['unset'] = MixpanelPeople.prototype.unset; +MixpanelPeople.prototype['increment'] = MixpanelPeople.prototype.increment; +MixpanelPeople.prototype['append'] = MixpanelPeople.prototype.append; +MixpanelPeople.prototype['union'] = MixpanelPeople.prototype.union; +MixpanelPeople.prototype['track_charge'] = MixpanelPeople.prototype.track_charge; +MixpanelPeople.prototype['clear_charges'] = MixpanelPeople.prototype.clear_charges; +MixpanelPeople.prototype['delete_user'] = MixpanelPeople.prototype.delete_user; +MixpanelPeople.prototype['toString'] = MixpanelPeople.prototype.toString; + +_.safewrap_class(MixpanelLib, ['identify', '_check_and_handle_notifications', '_show_notification']); + +var instances = {}; +var extend_mp = function() { + // add all the sub mixpanel instances + _.each(instances, function(instance, name) { + if (name !== PRIMARY_INSTANCE_NAME) { mixpanel_master[name] = instance; } + }); + + // add private functions as _ + mixpanel_master['_'] = _; +}; + +var override_mp_init_func = function() { + // we override the snippets init function to handle the case where a + // user initializes the mixpanel library after the script loads & runs + mixpanel_master['init'] = function(token, config, name) { + if (name) { + // initialize a sub library + if (!mixpanel_master[name]) { + mixpanel_master[name] = instances[name] = create_mplib(token, config, name); + mixpanel_master[name]._loaded(); + } + return mixpanel_master[name]; + } else { + var instance = mixpanel_master; + + if (instances[PRIMARY_INSTANCE_NAME]) { + // main mixpanel lib already initialized + instance = instances[PRIMARY_INSTANCE_NAME]; + } else if (token) { + // intialize the main mixpanel lib + instance = create_mplib(token, config, PRIMARY_INSTANCE_NAME); + instance._loaded(); + instances[PRIMARY_INSTANCE_NAME] = instance; + } + + mixpanel_master = instance; + if (init_type === INIT_SNIPPET) { + window$1[PRIMARY_INSTANCE_NAME] = mixpanel_master; + } + extend_mp(); + } + }; +}; + +var add_dom_loaded_handler = function() { + // Cross browser DOM Loaded support + function dom_loaded_handler() { + // function flag since we only want to execute this once + if (dom_loaded_handler.done) { return; } + dom_loaded_handler.done = true; + + DOM_LOADED = true; + ENQUEUE_REQUESTS = false; + + _.each(instances, function(inst) { + inst._dom_loaded(); + }); + } + + function do_scroll_check() { + try { + document$1.documentElement.doScroll('left'); + } catch(e) { + setTimeout(do_scroll_check, 1); + return; + } + + dom_loaded_handler(); + } + + if (document$1.addEventListener) { + if (document$1.readyState === 'complete') { + // safari 4 can fire the DOMContentLoaded event before loading all + // external JS (including this file). you will see some copypasta + // on the internet that checks for 'complete' and 'loaded', but + // 'loaded' is an IE thing + dom_loaded_handler(); + } else { + document$1.addEventListener('DOMContentLoaded', dom_loaded_handler, false); + } + } else if (document$1.attachEvent) { + // IE + document$1.attachEvent('onreadystatechange', dom_loaded_handler); + + // check to make sure we arn't in a frame + var toplevel = false; + try { + toplevel = window$1.frameElement === null; + } catch(e) { + // noop + } + + if (document$1.documentElement.doScroll && toplevel) { + do_scroll_check(); + } + } + + // fallback handler, always will work + _.register_event(window$1, 'load', dom_loaded_handler, true); +}; + +function init_as_module() { + init_type = INIT_MODULE; + mixpanel_master = new MixpanelLib(); + + override_mp_init_func(); + mixpanel_master['init'](); + add_dom_loaded_handler(); + + return mixpanel_master; +} + +var mixpanel = init_as_module(); + +module.exports = mixpanel; +},{}],2:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var log_event_handlers_1 = __importDefault(require("./log-event-handlers")); +var log_event_1 = __importDefault(require("./log-event")); +var adjust_channel_1 = __importDefault(require("./channels/adjust-channel")); +var mixpanel_channel_1 = __importDefault(require("./channels/mixpanel-channel")); +var channels; +(function (channels) { + channels.AdjustChannel = adjust_channel_1.default; + channels.MixpanelChannel = mixpanel_channel_1.default; +})(channels = exports.channels || (exports.channels = {})); +var BitAnalytics = /** @class */ (function () { + function BitAnalytics() { + } + BitAnalytics.initialize = function (os, appVersion, channelConfigs) { + if (typeof window === 'undefined') { + console.error('BitAnalytics can be used only in a web browser.'); + return; + } + BitAnalytics.LogEventHandlers = new log_event_handlers_1.default(os, appVersion, channelConfigs); + BitAnalytics.LogEvent = log_event_1.default; + }; + BitAnalytics.main = function () { + if (window) { + window.BitAnalytics = BitAnalytics; + } + }; + return BitAnalytics; +}()); +exports.default = BitAnalytics; +BitAnalytics.main(); + +},{"./channels/adjust-channel":5,"./channels/mixpanel-channel":7,"./log-event":10,"./log-event-handlers":9}],3:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var mixpanel_channel_1 = __importDefault(require("./channels/mixpanel-channel")); +var firebase_channel_1 = __importDefault(require("./channels/firebase-channel")); +var adjust_channel_1 = __importDefault(require("./channels/adjust-channel")); +var ChannelFactory = /** @class */ (function () { + function ChannelFactory() { + } + ChannelFactory.createChannel = function (name, config) { + // Check if the channel is available + if (ChannelFactory.classDictionary[name] == undefined) { + throw new DOMException(name + ' is not available.'); + } + else { + // Create a channel + var channel = Object.create(ChannelFactory.classDictionary[name].prototype); + channel.constructor.apply(channel, [name, config]); + channel = channel; + console.log(channel); + return channel; + } + }; + ChannelFactory.classDictionary = { + 'mixpanel': mixpanel_channel_1.default, + 'firebase': firebase_channel_1.default, + 'adjust': adjust_channel_1.default + }; + return ChannelFactory; +}()); +exports.default = ChannelFactory; + +},{"./channels/adjust-channel":5,"./channels/firebase-channel":6,"./channels/mixpanel-channel":7}],4:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Channel = /** @class */ (function () { + function Channel(name) { + this.isReady = false; + this.queue = new Array(); + this.name = name; + } + /** + * + * Public methods + * + */ + Channel.prototype.getName = function () { + return this.name; + }; + /** + * + * Protected methods + * + */ + Channel.prototype.flush = function () { + this.queue.forEach(function (f) { + f(); + }); + this.queue = new Array(); + }; + Channel.prototype.enqueue = function (f) { + this.queue.push(f); + }; + return Channel; +}()); +exports.default = Channel; + +},{}],5:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require('../lib/adjust'); +var channel_1 = __importDefault(require("../channel")); +var AdjustChannel = /** @class */ (function (_super) { + __extends(AdjustChannel, _super); + function AdjustChannel(name, config) { + var _this = _super.call(this, name) || this; + _this.device_ids = { + "gps_adid": "3ea5fac8-cf01-47d5-8aec-9a1354f5e84a" + }; + _this.eventTypes = { + "wallet_created": "nd3dg5" + }; + if (!config.token) { + throw new DOMException('Config incorrect.'); + } + if (Adjust) { + _this.adjust = new Adjust("au1onbhgg5q8", "sandbox", "android"); + //this.adjust.trackSession(this.device_ids); + _this.isReady = true; + console.log('Adjust initialised.'); + } + else { + console.log('Adjust missing.'); + } + return _this; + } + AdjustChannel.prototype.postEvent = function (name, params) { + //var result = this.mixpanelInstance.track(logEvent.name); + if (this.isReady) { + this.adjust.trackEvent('nd3dg5', this.device_ids); + } + }; + return AdjustChannel; +}(channel_1.default)); +exports.default = AdjustChannel; + +},{"../channel":4,"../lib/adjust":8}],6:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_1 = __importDefault(require("../channel")); +var FirebaseChannel = /** @class */ (function (_super) { + __extends(FirebaseChannel, _super); + function FirebaseChannel(name, config) { + var _this = _super.call(this, name) || this; + /** + * Firebase available only on ios and android + */ + if (config['os'] != 'android' && config['os'] != 'ios') { + throw new DOMException('Firebase is not supported on ' + config['os']); + } + if (!window.FirebasePlugin) { + throw new DOMException('Firebase cordova plugin is not installed correctly.'); + } + _this.firebaseInstance = window.FirebasePlugin; + _this.isReady = true; + return _this; + } + FirebaseChannel.prototype.postEvent = function (name, params) { + var _this = this; + if (!this.isReady) { + this.enqueue(function () { _this.postEvent(name, params); }); + } + else { + this.firebaseInstance.logEvent(name, params); + } + }; + return FirebaseChannel; +}(channel_1.default)); +exports.default = FirebaseChannel; + +},{"../channel":4}],7:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_1 = __importDefault(require("../channel")); +var mixpanel = require('mixpanel-browser'); +var MixpanelChannel = /** @class */ (function (_super) { + __extends(MixpanelChannel, _super); + function MixpanelChannel(name, config) { + var _this = _super.call(this, name) || this; + if (!config.token) { + throw new DOMException('Config incorrect.'); + } + _this.mixpanelInstance = mixpanel; + mixpanel.init(config.token, config.config); + return _this; + } + MixpanelChannel.prototype.postEvent = function (name, params) { + var result = this.mixpanelInstance.track(name); + }; + return MixpanelChannel; +}(channel_1.default)); +exports.default = MixpanelChannel; + +},{"../channel":4,"mixpanel-browser":1}],8:[function(require,module,exports){ +"use strict"; +(function (window) { + var sendRequest = function (method, url, data, success_cb, error_cb) { + var req = new XMLHttpRequest(); + req.open(method, url, !0); + req.setRequestHeader("Client-SDK", "js4.0.0"); + req.onreadystatechange = function () { if (req.readyState == 4) { + if (req.status >= 200 && req.status < 400) { + !!success_cb && success_cb(req.responseText); + } + else if (!!error_cb) { + !!error_cb && error_cb(new Error("Server responded with HTTP " + req.status), xhr); + } + } }; + if (!!error_cb) { + req.onerror = error_cb; + } + req.send(data); + }; + var encodeQueryString = function (params) { + var pairs = []; + for (var k in params) { + if (!params.hasOwnProperty(k)) { + continue; + } + pairs.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k])); + } + return pairs.join("&"); + }; + var cloneObj = function (obj) { + var copy = {}; + if (typeof (obj) != "object" || !obj) { + return copy; + } + for (var k in obj) { + if (!obj.hasOwnProperty(k)) { + continue; + } + copy[k] = obj[k]; + } + return copy; + }; + if (!'withCredentials' in new XMLHttpRequest()) { + sendRequest = function () { }; + } + window.Adjust = function (app_token, environment, os_name) { this.trackSession = function (device_ids) { var params = cloneObj(device_ids); params.app_token = app_token; params.os_name = os_name; params.environment = environment; sendRequest("GET", "https://app.adjust.com/session?" + encodeQueryString(params)); }; this.trackEvent = function (event_token, device_ids) { var params = cloneObj(device_ids); params.app_token = app_token; params.event_token = event_token; params.os_name = os_name; params.environment = environment; sendRequest("GET", "https://app.adjust.com/event?" + encodeQueryString(params)); }; }; +})(window); + +},{}],9:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_factory_1 = __importDefault(require("./channel-factory")); +var LogEventHandlers = /** @class */ (function () { + function LogEventHandlers(os, appVersion, channelConfigs) { + this.os = os; + this.appVersion = appVersion; + this.channels = []; + this.isReady = false; // Ready once all channels are ready or one channel is ready? + this.initialize(channelConfigs); + LogEventHandlers.instance = this; + } + /** + * + * Public methods + * + */ + LogEventHandlers.sharedInstance = function () { + if (LogEventHandlers.instance) { + return LogEventHandlers.instance; + } + else { + throw new DOMException('LogEventHandlers need to be initialized'); + } + }; + LogEventHandlers.prototype.initialize = function (channelConfigs) { + var _this = this; + // Get the channel names by the keys + var channelNames = Object.keys(channelConfigs); + // Iterate to init the several channels given in the config + channelNames.map(function (channelName) { + var channelConfig = channelConfigs[channelName]; + // OS shared to check the availability of this channel on this OS. + channelConfig['os'] = _this.os; + try { + var channel = channel_factory_1.default.createChannel(channelName, channelConfig); + _this.channels.push(channel); + } + catch (error) { + console.log(error.name + ': ' + error.message); + } + }); + }; + LogEventHandlers.prototype.postEvent = function (logEvent) { + var _this = this; + /** + * 0 is shared params + * 1 is first channel + * 2 is second channel + * ... + */ + var logEventParams = logEvent.getParams(); + // params + var params = { + 'os': this.os, + 'appVersion': this.appVersion + }; + // Concat the shared params + if (logEventParams.length > 0) { + // concat specific params needed + params = Object.assign({}, logEventParams[0], params); + } + // Post event depending of the channel + logEvent.getChannelNames().map(function (channelName, i) { + var channel = _this.getChannelByName(channelName); + if (channel) { + // Real index (first param is shared by all channels) + var index = i + 1; + // concat if needed + if (logEventParams.length > index) { + // concat specific params needed + params = Object.assign({}, logEventParams[index], params); + } + channel.postEvent(logEvent.getName(), params); + console.log('LogEvent "' + logEvent.getName() + '" sent to ' + channelName + '.'); + } + else { + // Channel not available + console.log('LogEvent "' + logEvent.getName() + '" cannot send to ' + channelName + ', this channel is not available.'); + } + }); + }; + /** + * + * Private methods + * + */ + LogEventHandlers.prototype.getChannelByName = function (channelName) { + console.log(channelName); + console.log(this.channels); + var channels = this.channels.filter(function (channel) { return channel.getName() == channelName; }); + if (channels.length > 0) { + return channels[0]; + } + else { + return undefined; + } + }; + return LogEventHandlers; +}()); +exports.default = LogEventHandlers; + +},{"./channel-factory":3}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var LogEvent = /** @class */ (function () { + function LogEvent(name, params, channelNames) { + if (channelNames.length == 0) { + throw new DOMException('Minimum one channel is needed.'); + } + this.name = name; + this.params = params; + this.channelNames = channelNames; + } + /** + * + * Public methods + * + */ + LogEvent.prototype.getName = function () { + return this.name; + }; + LogEvent.prototype.getParams = function () { + return this.params; + }; + LogEvent.prototype.getChannelNames = function () { + return this.channelNames; + }; + return LogEvent; +}()); +exports.default = LogEvent; + +},{}]},{},[2])(2) +}); diff --git a/src/js/routes.js b/src/js/routes.js index 4e72246ba..dabebdf65 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1211,7 +1211,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr .run(function($rootScope, $state, $location, $log, $timeout, startupService, ionicToast, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, emailService, /* plugins START HERE => */ buydotbitcoindotcomService, glideraService, amazonService, bitpayCardService, applicationService, mercadoLibreService, rateService) { $ionicPlatform.ready(function() { - + + // Init BitAnalytics + var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop'; + window.BitAnalytics.initialize(os, $window.fullVersion, {"firebase": {}}); + // Init language uxLanguage.init(function (lang) { diff --git a/www/index.html b/www/index.html index 47dc27d2a..a4ab55678 100644 --- a/www/index.html +++ b/www/index.html @@ -11,7 +11,7 @@ - Bitcoin.com Wallet + Bitcoin.com Wallet - Bitcoin.com Wallet @@ -31,6 +31,7 @@ + From 658a91e9ccbda784a1ab0d9d8c2276ba15b6d09e Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 09:54:49 +0200 Subject: [PATCH 115/166] round gravatar --- src/sass/views/tab-send-v2.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sass/views/tab-send-v2.scss b/src/sass/views/tab-send-v2.scss index e9905fc17..a44973285 100644 --- a/src/sass/views/tab-send-v2.scss +++ b/src/sass/views/tab-send-v2.scss @@ -223,6 +223,9 @@ margin: 4px; border-radius: 6px; box-shadow: 0px 2px 1px 0 #C1C1C1; + .gravatar { + border-radius: 30px; + } } } From 94e6dd7dac86c96c3b320eec3afa1b72a81c1731 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 11:08:03 +0200 Subject: [PATCH 116/166] clipboard features --- src/js/controllers/tab-send-v2.js | 20 +++++++++++++++----- src/sass/views/tab-send-v2.scss | 17 +++++++++++------ www/views/tab-send-v2.html | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/js/controllers/tab-send-v2.js b/src/js/controllers/tab-send-v2.js index 624acb5bb..5c75957c4 100644 --- a/src/js/controllers/tab-send-v2.js +++ b/src/js/controllers/tab-send-v2.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('tabSendV2Controller', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; + var clipboardHasContent = false; $scope.addContact = function() { $state.go('tabs.settings').then(function() { @@ -12,19 +13,28 @@ angular.module('copayApp.controllers').controller('tabSendV2Controller', functio }; $scope.pasteClipboard = function() { - clipboardService.readFromClipboard(function(text) { - $scope.formData.search = text; - $scope.findContact($scope.formData.search); - }); - } + if ($scope.clipboardHasAddress || $scope.clipboardHasContent) { + clipboardService.readFromClipboard(function(text) { + $scope.formData.search = text; + $scope.findContact($scope.formData.search); + }); + } + }; $scope.$on("$ionicView.enter", function(event, data) { clipboardService.readFromClipboard(function(text) { + if (text.length > 200) { + text = text.substring(0, 200); + } + $scope.clipboardHasAddress = false; + $scope.clipboardHasContent = false; if ((text.indexOf('bitcoincash:') === 0 || text[0] === 'C' || text[0] === 'H' || text[0] === 'p' || text[0] === 'q') && text.replace('bitcoincash:', '').length === 42) { // CashAddr $scope.clipboardHasAddress = true; } else if ((text[0] === "1" || text[0] === "3" || text.substring(0, 3) === "bc1") && text.length >= 26 && text.length <= 35) { // Legacy Addresses $scope.clipboardHasAddress = true; + } else if (text.length > 1) { + $scope.clipboardHasContent = true; } }); diff --git a/src/sass/views/tab-send-v2.scss b/src/sass/views/tab-send-v2.scss index a44973285..630828ae0 100644 --- a/src/sass/views/tab-send-v2.scss +++ b/src/sass/views/tab-send-v2.scss @@ -62,7 +62,10 @@ display: inline-block; margin-bottom: 4px; } - &.contains-address { + &.contains-address, &.contains-content { + .address { + display: none; + } background: #FAB915; color: #FFF !important; border: 0; @@ -70,11 +73,13 @@ .icon { background: url(../img/icon-clipboard-paste-white.svg); } - .address { - display: inline; - } - .non-address { - display: none; + &.contains-address { + .address { + display: inline; + } + .non-address { + display: none; + } } } } diff --git a/www/views/tab-send-v2.html b/www/views/tab-send-v2.html index b42784957..510633a3a 100644 --- a/www/views/tab-send-v2.html +++ b/www/views/tab-send-v2.html @@ -15,7 +15,7 @@
- -
-
- -
-
-
- -
-
-
-
- -
-
-
- Send Bitcoin faster! -
-
-
-

Save frequently used addresses and send them Bitcoin in just one tap

-
- -
-
-
- -
-
-
- Your Bitcoin wallet is empty -
-
-
-

To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.

-

You can receive bitcoin from any wallet or service.

-
-
To get started, you'll need to create a bitcoin wallet and get some - bitcoin. -
-
- - - -
-
-
-
-
-
-
- -
-
Contacts
-
Saved frequently used addresses
- - - -
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 838c04299..a3a0b99d4 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -3,15 +3,57 @@ {{'Send' | translate}} -
-
-
Recipient
-
- -
- - +
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ Send Bitcoin faster! +
+
+
+

Save frequently used addresses and send them Bitcoin in just one tap

+
+
@@ -19,72 +61,83 @@
-
-
- - - -
- Start sending bitcoin + Your Bitcoin wallet is empty
- To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service. - To get started, you'll need to create a bitcoin wallet and get some bitcoin. -
- - - +
+

To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.

+

You can receive bitcoin from any wallet or service.

+
+
To get started, you'll need to create a bitcoin wallet and get some + bitcoin. +
+
+ + + +
+
+
+
+
+
+
+ +
+
Contacts
+
Saved frequently used addresses
+ + + +
+
- - -
-
- Transfer to Wallet - - -
- -
+ + + + + + + + + + + + + + + + + + + + + From 39cb416c300f2b692f37c67564fbdde72da14d55 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 11:12:43 +0200 Subject: [PATCH 118/166] changed route and tab --- src/js/routes.js | 9 --------- www/views/tabs.html | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/js/routes.js b/src/js/routes.js index 2399a2db9..4e72246ba 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -270,15 +270,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.send2', { - url: '/send2', - views: { - 'tab-send': { - controller: 'tabSendV2Controller', - templateUrl: 'views/tab-send-v2.html', - } - } - }) .state('tabs.settings', { url: '/settings', views: { diff --git a/www/views/tabs.html b/www/views/tabs.html index 19c33aad9..69cf93309 100644 --- a/www/views/tabs.html +++ b/www/views/tabs.html @@ -12,7 +12,7 @@ - + From 5070a0042c15abbe55b494d04a1a1faf55399692 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 11:15:17 +0200 Subject: [PATCH 119/166] small refactor --- src/js/controllers/tab-send.js | 2 +- src/sass/views/views.scss | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 5c75957c4..a4c4a7152 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendV2Controller', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 5367ac5aa..37754970f 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -8,7 +8,6 @@ @import "tab-receive"; @import "tab-scan"; @import "tab-send"; -@import "tab-send-v2"; @import "tab-settings"; @import "wallet-colors"; @import "walletBalance"; From e6da12c17e894c0072c4de53f68527eeedfc146b Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 14:27:51 +0200 Subject: [PATCH 120/166] tab-send --- src/js/controllers/tab-send.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 5c75957c4..a4c4a7152 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendV2Controller', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; From 7cc806b00c1fbdc7e23d7f34b46bf2fc84a0b58c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 10 Jul 2018 15:11:17 +0200 Subject: [PATCH 121/166] Filter contacts on "starting with" instead of "contains" and some refactors --- src/js/controllers/tab-send.js | 104 +++++++++------------------------ www/views/tab-send.html | 3 - 2 files changed, 29 insertions(+), 78 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index a4c4a7152..f9a58e94c 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -3,6 +3,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; + var originalList; $scope.addContact = function() { $state.go('tabs.settings').then(function() { @@ -50,27 +51,26 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); }); + $scope.findContact = function(search) { + if (incomingData.redir(search)) { + return; + } + if (!search || search.length < 1) { + $scope.list = originalList; + $timeout(function() { + $scope.$apply(); + }); + return; + } + var result = lodash.filter(originalList, function(item) { + var val = item.name; + return lodash.startsWith(val.toLowerCase(), search.toLowerCase()); + }); - - - - - - - - - - - - var originalList; - var CONTACTS_SHOW_LIMIT; - var currentContactsPage; - - $scope.sectionDisplay = { - transferToWallet: false + $scope.list = result; }; var hasWallets = function() { @@ -80,6 +80,8 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; }; + + // THIS is ONLY to show the 'buy bitcoins' message // does not has any other function. @@ -138,12 +140,12 @@ angular.module('copayApp.controllers').controller('tabSendController', function( var walletList = []; lodash.each(walletsToTransfer, function(v) { - var displayBalanceAsFiat = - // BD got v.status as undefined here once during development, just - // after creating a new wallet. - v.status && - v.status.alternativeBalanceAvailable && - config.wallet.settings.priceDisplay === 'fiat'; + var displayBalanceAsFiat = + // BD got v.status as undefined here once during development, just + // after creating a new wallet. + v.status && + v.status.alternativeBalanceAvailable && + config.wallet.settings.priceDisplay === 'fiat'; walletList.push({ color: v.color, @@ -152,7 +154,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( coin: v.coin, network: v.network, balanceString: displayBalanceAsFiat ? - v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode : + v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode : v.cachedBalance, getAddress: function(cb) { walletService.getAddress(v, false, cb); @@ -181,16 +183,14 @@ angular.module('copayApp.controllers').controller('tabSendController', function( recipientType: 'contact', coin: v.coin, displayCoin: (v.coin == 'bch' - ? (config.bitcoinCashAlias || defaults.bitcoinCashAlias) - : (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(), + ? (config.bitcoinCashAlias || defaults.bitcoinCashAlias) + : (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(), getAddress: function(cb) { return cb(null, k); }, }); }); - var contacts = completeContacts.slice(0, (currentContactsPage + 1) * CONTACTS_SHOW_LIMIT); - $scope.contactsShowMore = completeContacts.length > contacts.length; - originalList = originalList.concat(contacts); + originalList = completeContacts; return cb(); }); }; @@ -203,28 +203,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }, 10); }; - $scope.openScanner = function() { - var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; - - if (!isWindowsPhoneApp) { - $state.go('tabs.scan'); - return; - } - - scannerService.useOldScanner(function(err, contents) { - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } - incomingData.redir(contents); - }); - }; - - $scope.showMore = function() { - currentContactsPage++; - updateWalletsList(); - }; - $scope.searchInFocus = function() { $scope.searchFocus = true; }; @@ -235,28 +213,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( } }; - $scope.findContact = function(search) { - - if (incomingData.redir(search)) { - return; - } - - if (!search || search.length < 2) { - $scope.list = originalList; - $timeout(function() { - $scope.$apply(); - }); - return; - } - - var result = lodash.filter(originalList, function(item) { - var val = item.name; - return lodash.includes(val.toLowerCase(), search.toLowerCase()); - }); - - $scope.list = result; - }; - $scope.goToAmount = function(item) { $timeout(function() { item.getAddress(function(err, addr) { @@ -304,8 +260,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( search: null }; originalList = []; - CONTACTS_SHOW_LIMIT = 10; - currentContactsPage = 0; hasWallets(); }); }); diff --git a/www/views/tab-send.html b/www/views/tab-send.html index a3a0b99d4..3346ebf71 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -109,9 +109,6 @@

-
- Show more -
From 41a2a3c97123566d2367082d7fe598706c92076c Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 11 Jul 2018 14:36:22 +0200 Subject: [PATCH 122/166] scrollable contact view + better quality contact icons --- src/sass/views/tab-send.scss | 26 +++++++++++++++++++------- www/views/tab-send.html | 6 +++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index aabb76cda..f2d0dd1dd 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -1,5 +1,18 @@ #tab-send { @extend .deflash-blue; + + &-header{ + position: absolute; + height: 300px; + width: 100%; + } + &-contacts { + position: absolute; + top: 300px; + height: calc(100vh - 300px - 50px - 44px); + overflow: scroll; + } + .input { width: 100%; input { @@ -31,10 +44,9 @@ background: #DEDEDE; bottom: 0; content: ''; - margin: 20px 6px 0px; + margin: 10px 6px 0px; } - margin: 18px 0 0; - padding: 9px; + padding: 18px 9px 9px 9px; background-color: #f2f2f2; border-radius: 3px; border: none; @@ -171,8 +183,6 @@ .list { .item { font-weight: 600; - padding-top: 12px; - padding-bottom: 12px; p { font-weight: normal; } @@ -181,8 +191,8 @@ } color: #444; //border-top: none; - padding-top: 1.5rem; - padding-bottom: 1.5rem; + padding-top: 0.6rem; + padding-bottom: 0.6rem;; .big-icon-svg { left: 5px; & > .bg { @@ -230,6 +240,8 @@ box-shadow: 0px 2px 1px 0 #C1C1C1; .gravatar { border-radius: 30px; + height: 40px; + width: 40px; } } diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 3346ebf71..98bdae6f5 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -3,7 +3,7 @@ {{'Send' | translate}} -
+
@@ -86,7 +86,7 @@
-
+
@@ -101,7 +101,7 @@ - + {{item.name}}

From be32f53668a5d39094d81a46f315465542376b5f Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 11 Jul 2018 17:31:58 +0200 Subject: [PATCH 123/166] Wallet 2 wallet transfer --- src/js/controllers/tab-send.js | 83 +++++++++++++--------------------- www/views/tab-send.html | 34 ++++---------- 2 files changed, 41 insertions(+), 76 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index f9a58e94c..5c9ee4f5d 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -45,12 +45,42 @@ angular.module('copayApp.controllers').controller('tabSendController', function( return; } updateHasFunds(); - updateWalletsList(); updateContactsList(function() { updateList(); }); }); + var walletToWalletFrom = false; + var walletToWalletTo = false; + + $scope.onWalletSelect = function(wallet) { + if (!$scope.walletToWalletFrom) { + $scope.walletToWalletFrom = wallet; + $scope.walletSelectorTitle = gettextCatalog.getString('Send to'); + $timeout(function(){ + $scope.showWallets = true; + }, 200); + + } else { + $scope.walletToWalletTo = wallet; + walletService.getAddress($scope.walletToWalletFrom, true, function(err, addr) { + return $state.transitionTo('tabs.send.amount', { + displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, + fromWalletId: $scope.walletToWalletFrom.walletId, + toAddress: addr, + coin: $scope.walletToWalletFrom.coin + }); + }); + + } + }; + + $scope.showWalletSelector = function() { + $scope.walletToWalletFrom = false; + $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); + $scope.showWallets = true; + }; + $scope.findContact = function(search) { if (incomingData.redir(search)) { @@ -80,11 +110,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; }; - - - // THIS is ONLY to show the 'buy bitcoins' message - // does not has any other function. - var updateHasFunds = function() { if ($rootScope.everHasFunds) { @@ -119,52 +144,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); }; - var updateWalletsList = function() { - var config = configService.getSync(); - var networkResult = lodash.countBy($scope.wallets, 'network'); - - $scope.showTransferCard = $scope.hasWallets && (networkResult.livenet > 1 || networkResult.testnet > 1); - - if ($scope.showTransferCard) { - var walletsToTransfer = $scope.wallets; - if (!(networkResult.livenet > 1)) { - walletsToTransfer = lodash.filter(walletsToTransfer, function(item) { - return item.network == 'testnet'; - }); - } - if (!(networkResult.testnet > 1)) { - walletsToTransfer = lodash.filter(walletsToTransfer, function(item) { - return item.network == 'livenet'; - }); - } - - var walletList = []; - lodash.each(walletsToTransfer, function(v) { - var displayBalanceAsFiat = - // BD got v.status as undefined here once during development, just - // after creating a new wallet. - v.status && - v.status.alternativeBalanceAvailable && - config.wallet.settings.priceDisplay === 'fiat'; - - walletList.push({ - color: v.color, - name: v.name, - recipientType: 'wallet', - coin: v.coin, - network: v.network, - balanceString: displayBalanceAsFiat ? - v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode : - v.cachedBalance, - getAddress: function(cb) { - walletService.getAddress(v, false, cb); - }, - }); - }); - originalList = originalList.concat(walletList); - } - } - var updateContactsList = function(cb) { var config = configService.getSync(); var defaults = configService.getDefaults(); diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 98bdae6f5..a2174e1fa 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -22,7 +22,7 @@

- @@ -113,28 +113,14 @@
- - - - - - - - - - - - - - - - - - - - - - - + + From d8785f7928698c62f6253bb53cccc80d2b72a06f Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Wed, 11 Jul 2018 17:34:32 +0200 Subject: [PATCH 124/166] remove hide titles --- www/views/tab-send.html | 1 - 1 file changed, 1 deletion(-) diff --git a/www/views/tab-send.html b/www/views/tab-send.html index a2174e1fa..e11d9c8ef 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -116,7 +116,6 @@ Date: Thu, 12 Jul 2018 15:25:11 +0200 Subject: [PATCH 125/166] Wallet to wallet flow --- src/js/controllers/tab-send.js | 39 ++++++++++++++++++++------ src/js/directives/walletSelector.js | 2 ++ www/views/includes/walletSelector.html | 2 +- www/views/tab-send.html | 20 ++++++++++++- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 5c9ee4f5d..66ac10b14 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -4,6 +4,8 @@ angular.module('copayApp.controllers').controller('tabSendController', function( var clipboardHasAddress = false; var clipboardHasContent = false; var originalList; + $scope.displayBalanceAsFiat = true; + $scope.walletSelectorTitleForce = true; $scope.addContact = function() { $state.go('tabs.settings').then(function() { @@ -50,22 +52,25 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); }); + var wallets; + var walletsBch; + var walletsBtc; var walletToWalletFrom = false; - var walletToWalletTo = false; $scope.onWalletSelect = function(wallet) { if (!$scope.walletToWalletFrom) { $scope.walletToWalletFrom = wallet; - $scope.walletSelectorTitle = gettextCatalog.getString('Send to'); - $timeout(function(){ - $scope.showWallets = true; - }, 200); - + if (wallet.coin === 'bch') { + $scope.showWalletsBch = true; + } else if (wallet.coin === 'btc') { + $scope.showWalletsBtc = true; + } + $scope.walletSelectorTitleTo = gettextCatalog.getString('Send to'); } else { - $scope.walletToWalletTo = wallet; - walletService.getAddress($scope.walletToWalletFrom, true, function(err, addr) { + walletService.getAddress(wallet, true, function(err, addr) { return $state.transitionTo('tabs.send.amount', { displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, + recipientType: 'wallet', fromWalletId: $scope.walletToWalletFrom.walletId, toAddress: addr, coin: $scope.walletToWalletFrom.coin @@ -77,7 +82,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.showWalletSelector = function() { $scope.walletToWalletFrom = false; - $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); + $scope.walletSelectorTitleFrom = gettextCatalog.getString('Send from'); $scope.showWallets = true; }; @@ -107,6 +112,14 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.wallets = profileService.getWallets({ onlyComplete: true }); + $scope.walletsBch = profileService.getWallets({ + onlyComplete: true, + coin: 'bch' + }); + $scope.walletsBtc = profileService.getWallets({ + onlyComplete: true, + coin: 'btc' + }); $scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true; }; @@ -234,11 +247,19 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }; $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.showWalletsBch = $scope.showWalletsBtc = $scope.showWallets = false; + $scope.checkingBalance = true; $scope.formData = { search: null }; originalList = []; hasWallets(); + + configService.whenAvailable(function(_config) { + $scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat'; + config = _config; + }); + }); }); diff --git a/src/js/directives/walletSelector.js b/src/js/directives/walletSelector.js index 79053f812..dabd1fbcd 100644 --- a/src/js/directives/walletSelector.js +++ b/src/js/directives/walletSelector.js @@ -8,6 +8,7 @@ angular.module('copayApp.directives') transclude: true, scope: { title: '=walletSelectorTitle', + forceTitle: '=walletSelectorForceTitle', show: '=walletSelectorShow', wallets: '=walletSelectorWallets', selectedWallet: '=walletSelectorSelectedWallet', @@ -15,6 +16,7 @@ angular.module('copayApp.directives') displayBalanceAsFiat : '=walletSelectorDisplayBalanceAsFiat' }, link: function(scope, element, attrs) { + console.log(scope, element, attrs); scope.hide = function() { scope.show = false; }; diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index 136aa4694..97dfeb552 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -5,7 +5,7 @@ ng-init="wallet.coin == 'btc' ? walletsBtc.push(wallet) : walletsBch.push(wallet)"> -
{{title}}
+
{{title}}
Bitcoin Cash (BCH)
diff --git a/www/views/tab-send.html b/www/views/tab-send.html index e11d9c8ef..c261ad06d 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -115,11 +115,29 @@
+ + + + + From 554d40d08f6d0fb1af66567dc78fccc9f6e9b372 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 12 Jul 2018 15:25:42 +0200 Subject: [PATCH 126/166] config variable --- src/js/controllers/tab-send.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 66ac10b14..f1f1d6116 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -258,7 +258,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( configService.whenAvailable(function(_config) { $scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat'; - config = _config; }); }); From a3ef304e09890edbc7242773bbe28145947820a4 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 12 Jul 2018 17:40:31 +0200 Subject: [PATCH 127/166] wallet to wallet back-button --- src/js/controllers/tab-send.js | 7 +++++++ src/js/directives/walletSelector.js | 4 ++++ www/views/tab-send.html | 2 ++ 3 files changed, 13 insertions(+) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index f1f1d6116..a90effe7b 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -7,6 +7,13 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.displayBalanceAsFiat = true; $scope.walletSelectorTitleForce = true; + + + $scope.walletHide = function() { + console.log("wallet HIDE"); + alert('test'); + }; + $scope.addContact = function() { $state.go('tabs.settings').then(function() { $state.go('tabs.addressbook').then(function() { diff --git a/src/js/directives/walletSelector.js b/src/js/directives/walletSelector.js index dabd1fbcd..8a96a0805 100644 --- a/src/js/directives/walletSelector.js +++ b/src/js/directives/walletSelector.js @@ -13,12 +13,16 @@ angular.module('copayApp.directives') wallets: '=walletSelectorWallets', selectedWallet: '=walletSelectorSelectedWallet', onSelect: '=walletSelectorOnSelect', + onHide: '=walletSelectorOnHide', displayBalanceAsFiat : '=walletSelectorDisplayBalanceAsFiat' }, link: function(scope, element, attrs) { console.log(scope, element, attrs); scope.hide = function() { scope.show = false; + if (typeof scope.onHide === "function") { + scope.onHide() + } }; scope.selectWallet = function(wallet) { $timeout(function() { diff --git a/www/views/tab-send.html b/www/views/tab-send.html index c261ad06d..28ba48a50 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -124,6 +124,7 @@ wallet-selector-display-balance-as-fiat="displayBalanceAsFiat">
Date: Fri, 13 Jul 2018 15:03:57 +1200 Subject: [PATCH 128/166] Shows "Empty case" send screen after sending all funds from wallets. --- src/js/controllers/tab-send.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index a90effe7b..00328d5db 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -132,11 +132,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function( var updateHasFunds = function() { - if ($rootScope.everHasFunds) { - $scope.hasFunds = true; - return; - } - $scope.hasFunds = false; var index = 0; lodash.each($scope.wallets, function(w) { @@ -151,10 +146,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.hasFunds = true; } else if (status.availableBalanceSat > 0) { $scope.hasFunds = true; - $rootScope.everHasFunds = true; } - if (index == $scope.wallets.length) { + if (index === $scope.wallets.length) { $scope.checkingBalance = false; $timeout(function() { $scope.$apply(); From eff8442f695d1ebfcbd3e89d320791d3bf1f4987 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 13 Jul 2018 15:36:34 +1200 Subject: [PATCH 129/166] "Show my address" button can now be clicked. --- www/views/tab-send.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 28ba48a50..3fabea47a 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -86,9 +86,9 @@
-
+
-
+
Contacts
From 2121155dd00252565732d76a0186e67f47617845 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 13 Jul 2018 17:18:41 +1200 Subject: [PATCH 130/166] When pasting from clipboard using the button on send screen, the text now appears the first time. --- src/js/controllers/tab-send.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 00328d5db..bcaaaef5c 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -25,7 +25,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.pasteClipboard = function() { if ($scope.clipboardHasAddress || $scope.clipboardHasContent) { clipboardService.readFromClipboard(function(text) { - $scope.formData.search = text; + $scope.$apply(function() { + $scope.formData.search = text; + }); $scope.findContact($scope.formData.search); }); } From 658c58c59fbdf1a0b4e8e37f5740caa2d3eb073b Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 13 Jul 2018 17:50:50 +1200 Subject: [PATCH 131/166] In Send screen, contacts positioned below buttons. --- src/sass/views/tab-send.scss | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index f2d0dd1dd..717ebff89 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -2,13 +2,10 @@ @extend .deflash-blue; &-header{ - position: absolute; height: 300px; width: 100%; } &-contacts { - position: absolute; - top: 300px; height: calc(100vh - 300px - 50px - 44px); overflow: scroll; } From 4e1ddfe88388d334ebc8582b0417a4cd0e47d59f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 13 Jul 2018 16:15:04 +0900 Subject: [PATCH 132/166] Integration BitAnalytics --- bitanalytics/bitanalytics-0.1.0.js | 563 +++++++++++++++++++---- src/js/routes.js | 63 ++- www/index.html | 5 +- www/views/includes/community.html | 6 +- www/views/includes/homeIntegrations.html | 9 +- www/views/includes/nextSteps.html | 4 +- www/views/includes/services.html | 2 +- www/views/tab-home.html | 2 +- www/views/tab-send.html | 2 +- www/views/tabs.html | 11 +- 10 files changed, 555 insertions(+), 112 deletions(-) diff --git a/bitanalytics/bitanalytics-0.1.0.js b/bitanalytics/bitanalytics-0.1.0.js index c1907d7a5..cf85b3c14 100644 --- a/bitanalytics/bitanalytics-0.1.0.js +++ b/bitanalytics/bitanalytics-0.1.0.js @@ -6069,10 +6069,225 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); +var click_action_1 = __importDefault(require("./actions/click-action")); +var ActionFactory = /** @class */ (function () { + function ActionFactory() { + } + ActionFactory.createAction = function (type, config) { + // Check if the action is available + if (ActionFactory.classDictionary[type] == undefined) { + throw new Error('[BitAnalytics] ' + type + ' is not available.'); + } + else { + // Create a action + var action = Object.create(ActionFactory.classDictionary[type].prototype); + action.constructor.apply(action, [config]); + action = action; + return action; + } + }; + ActionFactory.classDictionary = { + 'click': click_action_1.default + }; + return ActionFactory; +}()); +exports.default = ActionFactory; + +},{"./actions/click-action":5}],3:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ActionHandlers = /** @class */ (function () { + function ActionHandlers() { + this.actions = []; + var self = this; + var callback = function () { + if (self.timeout) { + clearTimeout(self.timeout); + } + self.timeout = setTimeout(function () { + console.log('[BitAnalytics] Content modified, refreshing trackers'); + self.refreshTrackers(); + self.timeout = undefined; + }, 300); + }; + if (MutationObserver) { + var targetNode = document.getElementsByTagName('body'); + var config = { attributes: true, childList: true, subtree: true }; + // Create an observer instance linked to the callback function + var observer = new MutationObserver(callback); + // Start observing the target node for configured mutations + observer.observe(targetNode[0], config); + } + else { + window.addEventListener("DOMSubtreeModified", callback); + } + } + /** + * + * Public methods + * + */ + ActionHandlers.prototype.refreshTrackers = function () { + this.actions.map(function (action) { + try { + action.stopTracking(); + } + catch (err) { + console.log(err); + } + try { + action.startTracking(); + } + catch (err) { + console.log(err); + } + }); + }; + ActionHandlers.prototype.trackAction = function (action) { + this.actions.push(action); + }; + return ActionHandlers; +}()); +exports.default = ActionHandlers; + +},{}],4:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Action = /** @class */ (function () { + function Action(config) { + if (!config.name) { + throw new Error('[BitAnalytics] Action should have a name config : { name : ... }'); + } + this.name = config.name; + this.isTracking = false; + } + return Action; +}()); +exports.default = Action; + +},{}],5:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var action_1 = __importDefault(require("../action")); +var log_event_handlers_1 = __importDefault(require("../log-event-handlers")); +var log_event_1 = __importDefault(require("../log-event")); +var ClickAction = /** @class */ (function (_super) { + __extends(ClickAction, _super); + function ClickAction(config) { + var _this = _super.call(this, config) || this; + _this.params = []; + if (!config.class || !config.channels) { + throw new Error('[BitAnalytics] ClickAction should have a config like this : { class : ..., channels: ... }'); + } + if (config.params) { + _this.params = config.params; + } + _this.class = config.class; + _this.channels = config.channels; + var self = _this; + _this.listener = function (event) { + /*console.log('on click'); + console.log(event.target.id); + console.log(event.target.outerHTML); + console.log(event.target.outerText);*/ + var params = {}; + var target = _this.searchTarget(event.srcElement); + // If I found my element, that should happen 100% + if (target) { + self.params.map(function (param) { + var value = target[param]; + if (value) { + params[param] = value; + } + else { + var item = target.attributes.getNamedItem(param); + if (item) { + params[param] = item.value; + } + } + }); + } + var logEvent = new log_event_1.default(self.name, [params], self.channels); + log_event_handlers_1.default.sharedInstance().postEvent(logEvent); + }; + _this.isTracking = false; + return _this; + } + /** + * + * Private methods + * + */ + ClickAction.prototype.searchTarget = function (element) { + if (element && element.classList && element.classList.contains(this.class)) { + return element; + } + else if (element.parentElement) { + return this.searchTarget(element.parentElement); + } + else { + return undefined; + } + }; + /** + * + * Public methods + * + */ + ClickAction.prototype.startTracking = function () { + if (this.isTracking) { + throw new Error('[BitAnalytics] The tacking is already started'); + } + this.isTracking = true; + var elements = document.getElementsByClassName(this.class); + // Add event listener to all the elements found + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + console.log('init ' + this.name); + element.addEventListener('click', this.listener); + } + }; + ClickAction.prototype.stopTracking = function () { + if (!this.isTracking) { + throw new Error('[BitAnalytics] The tacking is already stopped'); + } + var elements = document.getElementsByClassName(this.class); + // Add event listener to all the elements found + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.removeEventListener('click', this.listener); + } + this.isTracking = false; + }; + return ClickAction; +}(action_1.default)); +exports.default = ClickAction; + +},{"../action":4,"../log-event":15,"../log-event-handlers":14}],6:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); var log_event_handlers_1 = __importDefault(require("./log-event-handlers")); var log_event_1 = __importDefault(require("./log-event")); +var action_factory_1 = __importDefault(require("./action-factory")); var adjust_channel_1 = __importDefault(require("./channels/adjust-channel")); var mixpanel_channel_1 = __importDefault(require("./channels/mixpanel-channel")); +var action_handlers_1 = __importDefault(require("./action-handlers")); var channels; (function (channels) { channels.AdjustChannel = adjust_channel_1.default; @@ -6082,12 +6297,13 @@ var BitAnalytics = /** @class */ (function () { function BitAnalytics() { } BitAnalytics.initialize = function (os, appVersion, channelConfigs) { - if (typeof window === 'undefined') { - console.error('BitAnalytics can be used only in a web browser.'); - return; + if (window == undefined) { + console.error('[BitAnalytics] BitAnalytics cannot be integrated in window.'); } BitAnalytics.LogEventHandlers = new log_event_handlers_1.default(os, appVersion, channelConfigs); + BitAnalytics.ActionHandlers = new action_handlers_1.default(); BitAnalytics.LogEvent = log_event_1.default; + BitAnalytics.ActionFactory = action_factory_1.default; }; BitAnalytics.main = function () { if (window) { @@ -6099,42 +6315,43 @@ var BitAnalytics = /** @class */ (function () { exports.default = BitAnalytics; BitAnalytics.main(); -},{"./channels/adjust-channel":5,"./channels/mixpanel-channel":7,"./log-event":10,"./log-event-handlers":9}],3:[function(require,module,exports){ +},{"./action-factory":2,"./action-handlers":3,"./channels/adjust-channel":9,"./channels/mixpanel-channel":12,"./log-event":15,"./log-event-handlers":14}],7:[function(require,module,exports){ "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -var mixpanel_channel_1 = __importDefault(require("./channels/mixpanel-channel")); -var firebase_channel_1 = __importDefault(require("./channels/firebase-channel")); var adjust_channel_1 = __importDefault(require("./channels/adjust-channel")); +var firebase_channel_1 = __importDefault(require("./channels/firebase-channel")); +var ga_channel_1 = __importDefault(require("./channels/ga-channel")); +var mixpanel_channel_1 = __importDefault(require("./channels/mixpanel-channel")); var ChannelFactory = /** @class */ (function () { function ChannelFactory() { } ChannelFactory.createChannel = function (name, config) { // Check if the channel is available if (ChannelFactory.classDictionary[name] == undefined) { - throw new DOMException(name + ' is not available.'); + throw new Error('[BitAnalytics] ' + name + ' is not available.'); } else { // Create a channel var channel = Object.create(ChannelFactory.classDictionary[name].prototype); channel.constructor.apply(channel, [name, config]); channel = channel; - console.log(channel); return channel; } }; ChannelFactory.classDictionary = { - 'mixpanel': mixpanel_channel_1.default, + 'adjust': adjust_channel_1.default, 'firebase': firebase_channel_1.default, - 'adjust': adjust_channel_1.default + 'ga': ga_channel_1.default, + 'mixpanel': mixpanel_channel_1.default }; return ChannelFactory; }()); exports.default = ChannelFactory; -},{"./channels/adjust-channel":5,"./channels/firebase-channel":6,"./channels/mixpanel-channel":7}],4:[function(require,module,exports){ +},{"./channels/adjust-channel":9,"./channels/firebase-channel":10,"./channels/ga-channel":11,"./channels/mixpanel-channel":12}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Channel = /** @class */ (function () { @@ -6143,14 +6360,6 @@ var Channel = /** @class */ (function () { this.queue = new Array(); this.name = name; } - /** - * - * Public methods - * - */ - Channel.prototype.getName = function () { - return this.name; - }; /** * * Protected methods @@ -6169,7 +6378,7 @@ var Channel = /** @class */ (function () { }()); exports.default = Channel; -},{}],5:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -6185,43 +6394,119 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -require('../lib/adjust'); var channel_1 = __importDefault(require("../channel")); +// Loading Adjust websdk +require('../external-libs/adjust'); var AdjustChannel = /** @class */ (function (_super) { __extends(AdjustChannel, _super); function AdjustChannel(name, config) { var _this = _super.call(this, name) || this; - _this.device_ids = { - "gps_adid": "3ea5fac8-cf01-47d5-8aec-9a1354f5e84a" - }; - _this.eventTypes = { - "wallet_created": "nd3dg5" - }; if (!config.token) { - throw new DOMException('Config incorrect.'); + throw new Error('[BitAnalytics] Adjust config is missing token.'); } - if (Adjust) { - _this.adjust = new Adjust("au1onbhgg5q8", "sandbox", "android"); - //this.adjust.trackSession(this.device_ids); - _this.isReady = true; - console.log('Adjust initialised.'); + if (!config.eventTypes) { + throw new Error('[BitAnalytics] Adjust config is missing event types.'); } - else { - console.log('Adjust missing.'); + if (!Adjust) { + throw new Error('[BitAnalytics] Adjust cordova plugin is not installed correctly.'); } + _this.eventTypes = config.eventTypes; + var os = _this.adjustedOs(config.os); + _this.advertisingId = _this.getAdvertisingId(os); + console.log('Advertising ID for adjust: ' + _this.advertisingId); + // TODO: Different initialisation for Cordova. + var sessionParams = { + app_version: config.appVersion, + app_version_short: config.appVersion, + os_name: os + }; + _this.addAdvertisingId(os, sessionParams); + var environment = config.environment || 'production'; + _this.adjustInstance = new Adjust(config.token, environment, os); + _this.adjustInstance.trackSession(sessionParams); + _this.isReady = true; return _this; } + /** + * + * Public methods + * + */ AdjustChannel.prototype.postEvent = function (name, params) { - //var result = this.mixpanelInstance.track(logEvent.name); if (this.isReady) { - this.adjust.trackEvent('nd3dg5', this.device_ids); + var eventType = this.eventTypes[name]; + // Each event needs to be added on adjust, and config for adjust. + if (!eventType) { + throw new Error('This event name does not exist on Adjust.'); + } + params.os = this.adjustedOs(params.os); + this.addAdvertisingId(params.os, params); + this.adjustInstance.trackEvent(eventType, params); } }; + /** + * + * Private methods + * + */ + AdjustChannel.prototype.addAdvertisingId = function (os, params) { + if (os === 'ios') { + params.idfa = this.advertisingId; + } + else if (os === 'android') { + params.gps_adid = this.advertisingId; + } + else { + params.win_hwid = this.advertisingId; + params.win_naid = this.advertisingId; + params.win_adid = this.advertisingId; + } + }; + // Desktop version will pretend to be Windows + AdjustChannel.prototype.adjustedOs = function (os) { + if (os === 'ios' || os === 'android') { + return os; + } + else { + return 'wstore'; + } + }; + AdjustChannel.prototype.generateRandomGuid = function () { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }; + // Example: 107e8ea14329d4a2194ebbb6dc0c0fd7 + AdjustChannel.prototype.generateWindowsAdvertisingId = function () { + var id = ''; + for (var i = 0; i < 32; i++) { + id += Math.floor(Math.random() * 16).toString(16); + } + return id; + }; + // https://docs.adjust.com/en/event-tracking/ + AdjustChannel.prototype.getAdvertisingId = function (os) { + var adid = localStorage.getItem('adid'); + if (!adid) { + if (os === 'ios') { + adid = this.generateRandomGuid().toUpperCase(); + } + else if (os === 'android') { + adid = this.generateRandomGuid(); + } + else { + adid = this.generateWindowsAdvertisingId(); + } + localStorage.setItem('adid', adid); + } + return adid; + }; return AdjustChannel; }(channel_1.default)); exports.default = AdjustChannel; -},{"../channel":4,"../lib/adjust":8}],6:[function(require,module,exports){ +},{"../channel":8,"../external-libs/adjust":13}],10:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -6245,16 +6530,21 @@ var FirebaseChannel = /** @class */ (function (_super) { /** * Firebase available only on ios and android */ - if (config['os'] != 'android' && config['os'] != 'ios') { - throw new DOMException('Firebase is not supported on ' + config['os']); + if (config.os != 'android' && config.os != 'ios') { + throw new Error('[BitAnalytics] Firebase is not supported on ' + config.os); } if (!window.FirebasePlugin) { - throw new DOMException('Firebase cordova plugin is not installed correctly.'); + throw new Error('[BitAnalytics] Firebase cordova plugin is not installed correctly.'); } _this.firebaseInstance = window.FirebasePlugin; _this.isReady = true; return _this; } + /** + * + * Public methods + * + */ FirebaseChannel.prototype.postEvent = function (name, params) { var _this = this; if (!this.isReady) { @@ -6268,7 +6558,90 @@ var FirebaseChannel = /** @class */ (function (_super) { }(channel_1.default)); exports.default = FirebaseChannel; -},{"../channel":4}],7:[function(require,module,exports){ +},{"../channel":8}],11:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_1 = __importDefault(require("../channel")); +var GoogleAnalyticsChannel = /** @class */ (function (_super) { + __extends(GoogleAnalyticsChannel, _super); + function GoogleAnalyticsChannel(name, config) { + var _this = _super.call(this, name) || this; + _this.dataLayer = null; + _this.gaInstance = null; + _this.trackingId = ''; + _this.eventLabels = ['id']; + if (!config.trackingId) { + throw new Error('[BitAnalytics] Google Analytics config is missing tracking ID.'); + } + if (config.eventLabels) { + _this.eventLabels = config.eventLabels; + } + _this.trackingId = config.trackingId; + _this.setUpGa(); + return _this; + } + /** + * + * Public methods + * + */ + GoogleAnalyticsChannel.prototype.postEvent = function (name, params) { + // Default Google Analytics Events + // https://developers.google.com/analytics/devguides/collection/gtagjs/events + // Useful to convert to these, or start with these? + if (this.isReady) { + params.event_category = name; + for (var _i = 0, _a = this.eventLabels; _i < _a.length; _i++) { + var eventLabel = _a[_i]; + if (params[eventLabel]) { + params.event_label = params[eventLabel]; + break; + } + } + this.gtag('event', name, params); + } + }; + /** + * + * Private methods + * + */ + /** + * Mimics function in the tracking snippet + */ + GoogleAnalyticsChannel.prototype.gtag = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + console.log(arguments); + window.dataLayer.push(arguments); + }; + GoogleAnalyticsChannel.prototype.setUpGa = function () { + // From what GA recommends to insert into page + window.dataLayer = window.dataLayer || []; + this.gtag('js', new Date()); + this.gtag('config', this.trackingId); + this.isReady = true; + }; + return GoogleAnalyticsChannel; +}(channel_1.default)); +exports.default = GoogleAnalyticsChannel; + +},{"../channel":8}],12:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -6291,12 +6664,17 @@ var MixpanelChannel = /** @class */ (function (_super) { function MixpanelChannel(name, config) { var _this = _super.call(this, name) || this; if (!config.token) { - throw new DOMException('Config incorrect.'); + throw new DOMException('[BitAnalytics] Config incorrect.'); } _this.mixpanelInstance = mixpanel; mixpanel.init(config.token, config.config); return _this; } + /** + * + * Public methods + * + */ MixpanelChannel.prototype.postEvent = function (name, params) { var result = this.mixpanelInstance.track(name); }; @@ -6304,7 +6682,7 @@ var MixpanelChannel = /** @class */ (function (_super) { }(channel_1.default)); exports.default = MixpanelChannel; -},{"../channel":4,"mixpanel-browser":1}],8:[function(require,module,exports){ +},{"../channel":8,"mixpanel-browser":1}],13:[function(require,module,exports){ "use strict"; (function (window) { var sendRequest = function (method, url, data, success_cb, error_cb) { @@ -6353,7 +6731,7 @@ exports.default = MixpanelChannel; window.Adjust = function (app_token, environment, os_name) { this.trackSession = function (device_ids) { var params = cloneObj(device_ids); params.app_token = app_token; params.os_name = os_name; params.environment = environment; sendRequest("GET", "https://app.adjust.com/session?" + encodeQueryString(params)); }; this.trackEvent = function (event_token, device_ids) { var params = cloneObj(device_ids); params.app_token = app_token; params.event_token = event_token; params.os_name = os_name; params.environment = environment; sendRequest("GET", "https://app.adjust.com/event?" + encodeQueryString(params)); }; }; })(window); -},{}],9:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; @@ -6366,7 +6744,7 @@ var LogEventHandlers = /** @class */ (function () { this.appVersion = appVersion; this.channels = []; this.isReady = false; // Ready once all channels are ready or one channel is ready? - this.initialize(channelConfigs); + this.initializeChannels(channelConfigs); LogEventHandlers.instance = this; } /** @@ -6379,27 +6757,9 @@ var LogEventHandlers = /** @class */ (function () { return LogEventHandlers.instance; } else { - throw new DOMException('LogEventHandlers need to be initialized'); + throw new Error('[BitAnalytics] LogEventHandlers need to be initialized'); } }; - LogEventHandlers.prototype.initialize = function (channelConfigs) { - var _this = this; - // Get the channel names by the keys - var channelNames = Object.keys(channelConfigs); - // Iterate to init the several channels given in the config - channelNames.map(function (channelName) { - var channelConfig = channelConfigs[channelName]; - // OS shared to check the availability of this channel on this OS. - channelConfig['os'] = _this.os; - try { - var channel = channel_factory_1.default.createChannel(channelName, channelConfig); - _this.channels.push(channel); - } - catch (error) { - console.log(error.name + ': ' + error.message); - } - }); - }; LogEventHandlers.prototype.postEvent = function (logEvent) { var _this = this; /** @@ -6408,7 +6768,7 @@ var LogEventHandlers = /** @class */ (function () { * 2 is second channel * ... */ - var logEventParams = logEvent.getParams(); + var logEventParams = logEvent.params; // params var params = { 'os': this.os, @@ -6417,10 +6777,10 @@ var LogEventHandlers = /** @class */ (function () { // Concat the shared params if (logEventParams.length > 0) { // concat specific params needed - params = Object.assign({}, logEventParams[0], params); + params = this.concatObject(logEventParams[0], params); } // Post event depending of the channel - logEvent.getChannelNames().map(function (channelName, i) { + logEvent.channelNames.map(function (channelName, i) { var channel = _this.getChannelByName(channelName); if (channel) { // Real index (first param is shared by all channels) @@ -6428,14 +6788,21 @@ var LogEventHandlers = /** @class */ (function () { // concat if needed if (logEventParams.length > index) { // concat specific params needed - params = Object.assign({}, logEventParams[index], params); + params = _this.concatObject(logEventParams[index], params); + } + console.log('[BitAnalytics] Params: ' + JSON.stringify(params)); + try { + channel.postEvent(logEvent.name, params); + console.log('[BitAnalytics] LogEvent "' + logEvent.name + '" sent to ' + channelName + '.'); + } + catch (e) { + console.error('[BitAnalytics] LogEvent "' + logEvent.name + '" failed to send with "' + channelName + '. '); + console.log(e); } - channel.postEvent(logEvent.getName(), params); - console.log('LogEvent "' + logEvent.getName() + '" sent to ' + channelName + '.'); } else { // Channel not available - console.log('LogEvent "' + logEvent.getName() + '" cannot send to ' + channelName + ', this channel is not available.'); + console.log('[BitAnalytics] LogEvent "' + logEvent.name + '" cannot send to ' + channelName + ', this channel is not available.'); } }); }; @@ -6444,10 +6811,17 @@ var LogEventHandlers = /** @class */ (function () { * Private methods * */ + LogEventHandlers.prototype.concatObject = function (from, to) { + var keys = Object.keys(from); + keys.map(function (key) { + if (!to[key]) { + to[key] = from[key]; + } + }); + return to; + }; LogEventHandlers.prototype.getChannelByName = function (channelName) { - console.log(channelName); - console.log(this.channels); - var channels = this.channels.filter(function (channel) { return channel.getName() == channelName; }); + var channels = this.channels.filter(function (channel) { return channel.name == channelName; }); if (channels.length > 0) { return channels[0]; } @@ -6455,39 +6829,44 @@ var LogEventHandlers = /** @class */ (function () { return undefined; } }; + LogEventHandlers.prototype.initializeChannels = function (channelConfigs) { + var _this = this; + // Get the channel names by the keys + var channelNames = Object.keys(channelConfigs); + // Iterate to init the several channels given in the config + channelNames.map(function (channelName) { + var channelConfig = channelConfigs[channelName]; + // OS shared to check the availability of this channel on this OS. + channelConfig.os = _this.os; + channelConfig.appVersion = _this.appVersion; + try { + var channel = channel_factory_1.default.createChannel(channelName, channelConfig); + _this.channels.push(channel); + } + catch (error) { + console.log('[BitAnalytics] ' + error.name + ': ' + error.message); + } + }); + }; return LogEventHandlers; }()); exports.default = LogEventHandlers; -},{"./channel-factory":3}],10:[function(require,module,exports){ +},{"./channel-factory":7}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LogEvent = /** @class */ (function () { function LogEvent(name, params, channelNames) { if (channelNames.length == 0) { - throw new DOMException('Minimum one channel is needed.'); + throw new Error('[BitAnalytics] Minimum one channel is needed.'); } this.name = name; this.params = params; this.channelNames = channelNames; } - /** - * - * Public methods - * - */ - LogEvent.prototype.getName = function () { - return this.name; - }; - LogEvent.prototype.getParams = function () { - return this.params; - }; - LogEvent.prototype.getChannelNames = function () { - return this.channelNames; - }; return LogEvent; }()); exports.default = LogEvent; -},{}]},{},[2])(2) +},{}]},{},[6])(6) }); diff --git a/src/js/routes.js b/src/js/routes.js index dabebdf65..ee7abba58 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1214,8 +1214,65 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr // Init BitAnalytics var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop'; - window.BitAnalytics.initialize(os, $window.fullVersion, {"firebase": {}}); - + window.BitAnalytics.initialize(os, $window.fullVersion, {"firebase": {}, + "ga": { + "trackingId": "UA-59964190-23", + "eventLabels": ["id", "icon-off"] + }, + "adjust": { + "token": "au1onbhgg5q8", + "environment" : "production", + "eventTypes": { + "banner_click": "sc5i8u", + "buy_bitcoin_click": "t1vcdz", + "transfer_success": "f68evo", + "wallet_created": "nd3dg5", + "wallet_opened": "4n39l7" + } + } + }); + + var channel = "ga"; + if (platformInfo.isNW) { + channel = "ga"; + } + + // Send a log to test + var log = new window.BitAnalytics.LogEvent("wallet_opened", [], [channel, "adjust"]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + + var actionBanner = new window.BitAnalytics.ActionFactory.createAction('click', { + name: 'banner_click', + class: 'track_banner_click', + params: ['href-banner', 'id'], + channels: [channel, 'adjust'] + }); + window.BitAnalytics.ActionHandlers.trackAction(actionBanner); + + var actionBuyBitcoin = new window.BitAnalytics.ActionFactory.createAction('click', { + name: 'buy_bitcoin_click', + class: 'track_buy_bitcoin_click', + params: ['href', 'id'], + channels: [channel, 'adjust'] + }); + window.BitAnalytics.ActionHandlers.trackAction(actionBuyBitcoin); + + var actionLinkClickOut = new window.BitAnalytics.ActionFactory.createAction('click', { + name: 'link_click_out', + class: 'track_link_click_out', + params: ['href', 'id'], + channels: [channel] + }); + window.BitAnalytics.ActionHandlers.trackAction(actionLinkClickOut); + + var actionTabOpen = new window.BitAnalytics.ActionFactory.createAction('click', { + name: 'tab_open', + class: 'track_tab_open', + params: ['href', 'title', 'icon-off'], + channels: [channel] + }); + window.BitAnalytics.ActionHandlers.trackAction(actionTabOpen); + // Init language uxLanguage.init(function (lang) { @@ -1385,7 +1442,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } win.menu = nativeMenuBar; } - + $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { if (document.body.classList.contains('keyboard-open')) { document.body.classList.remove('keyboard-open'); diff --git a/www/index.html b/www/index.html index a4ab55678..4c73317e3 100644 --- a/www/index.html +++ b/www/index.html @@ -12,7 +12,8 @@ Bitcoin.com Wallet - Bitcoin.com Wallet - + + @@ -30,7 +31,7 @@ - + diff --git a/www/views/includes/community.html b/www/views/includes/community.html index a8c021745..86841a77c 100644 --- a/www/views/includes/community.html +++ b/www/views/includes/community.html @@ -6,14 +6,14 @@
- +
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 4d494e9ec..97dd2bd16 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -92,7 +92,7 @@
- + diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 838c04299..ab40e7e42 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -32,7 +32,7 @@ To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service. To get started, you'll need to create a bitcoin wallet and get some bitcoin.
- +
diff --git a/www/views/tabs.html b/www/views/tabs.html index 69cf93309..3c2683a13 100644 --- a/www/views/tabs.html +++ b/www/views/tabs.html @@ -1,22 +1,21 @@ - - + - + - + - + - + From 8abaf184aaa3ca3599420f63e1f9b74bdb624933 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 13 Jul 2018 17:19:31 +0900 Subject: [PATCH 133/166] 458 - Add Statistic --- src/js/controllers/addressbookAdd.js | 10 ++++++++++ src/js/controllers/confirm.js | 13 +++++++++++++ src/js/controllers/preferencesNotifications.js | 9 +++++++++ src/js/controllers/tab-receive.js | 10 ++++++++++ src/js/controllers/walletDetails.js | 7 +++++++ src/js/routes.js | 2 +- src/js/services/profileService.js | 9 +++++++++ 7 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index a57839aa1..dcdb43b9f 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -35,6 +35,16 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu var translated = bitcoinCashJsService.readAddress(addressbook.address); addressbook.address = translated.legacy; } + + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("contact_created", [{ + "coin": $scope.addressbookEntry.coin + }], [channel]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + $timeout(function() { addressbookService.add(addressbook, function(err, ab) { if (err) { diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index f1fab5b02..03af26fd1 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -643,6 +643,19 @@ angular.module('copayApp.controllers').controller('confirmController', function( soundService.play('misc/payment_sent.mp3'); } + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("transfer_success", [{ + "coin": $scope.wallet.coin, + "type": "outgoing", + "amount": $scope.amount, + "fees": $scope.fee + }], [channel, "adjust"]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + + // Should be removed firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin }); $timeout(function() { $scope.$digest(); diff --git a/src/js/controllers/preferencesNotifications.js b/src/js/controllers/preferencesNotifications.js index 7351a9f23..edfb983b5 100644 --- a/src/js/controllers/preferencesNotifications.js +++ b/src/js/controllers/preferencesNotifications.js @@ -75,6 +75,15 @@ angular.module('copayApp.controllers').controller('preferencesNotificationsContr }; emailService.updateEmail(opts); + + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{ + "toggle": $scope.emailNotifications.value + }], [channel]); + window.BitAnalytics.LogEventHandlers.postEvent(log); }; $scope.soundNotificationsChange = function() { diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 629e59b51..6c11c2dbd 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -143,6 +143,16 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi } $scope.paymentReceivedCoin = $scope.wallet.coin; + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("transfer_success", [{ + "coin": $scope.wallet.coin, + "type": "incoming" + }], [channel, "adjust"]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + if ($state.current.name === "tabs.receive") { soundService.play('misc/payment_received.mp3'); } diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 88ee871ff..24237f6c9 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -12,6 +12,13 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun $scope.isAndroid = platformInfo.isAndroid; $scope.isIOS = platformInfo.isIOS; + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + $scope.amountIsCollapsible = !$scope.isAndroid; $scope.openExternalLink = function(url, target) { diff --git a/src/js/routes.js b/src/js/routes.js index ee7abba58..63b436a85 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1232,7 +1232,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); - var channel = "ga"; + var channel = "firebase"; if (platformInfo.isNW) { channel = "ga"; } diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 25f2a6852..4f8710c28 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -427,6 +427,15 @@ angular.module('copayApp.services') }, function(err, secret) { if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb); + var channel = "firebase"; + if (platformInfo.isNW) { + channel = "ga"; + } + var log = new window.BitAnalytics.LogEvent("wallet_created", [{ + "coin": opts.coin + }], [channel]); + window.BitAnalytics.LogEventHandlers.postEvent(log); + return cb(null, walletClient, secret); }); }); From 1150e843d75900f4c2a2db11eba9458f5669a528 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 13 Jul 2018 17:50:21 +0900 Subject: [PATCH 134/166] 474 - Link updated --- src/js/services/bitcoincomService.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/js/services/bitcoincomService.js b/src/js/services/bitcoincomService.js index 681ed8f4d..d7883b68e 100644 --- a/src/js/services/bitcoincomService.js +++ b/src/js/services/bitcoincomService.js @@ -20,28 +20,28 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http, name: 'games', title: 'Bitcoin Cash Games', icon: 'icon-games', - href: 'http://cashgames.bitcoin.com' + href: 'https://cashgames.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=CashGames' }; var newsItem = { name: 'news', title: 'News', icon: 'icon-news', - href: 'http://news.bitcoin.com' + href: 'https://news.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=News' }; var poolItem = { name: 'pool', title: 'Mining Pool', icon: 'icon-mining', - href: 'http://pool.bitcoin.com' + href: 'https://pool.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Pool' }; var toolsItem = { name: 'tools', title: 'Tools', icon: 'icon-tools', - href: 'http://tools.bitcoin.com' + href: 'https://tools.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Tools' }; var priceChartItem = { @@ -55,7 +55,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http, name: 'faucet', title: 'Free Bitcoin Cash', icon: 'icon-faucet', - href: 'https://free.bitcoin.com/' + href: 'https://free.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Faucet' }; var _getBitPay = function(endpoint) { From 63c64bce0ee795070fc4e427f5897f692c554ce3 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 13 Jul 2018 17:53:18 +0900 Subject: [PATCH 135/166] 474 - Link changed --- www/views/buyBitcoindotcom.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/views/buyBitcoindotcom.html b/www/views/buyBitcoindotcom.html index 2c8ef36f1..a8a7889e3 100644 --- a/www/views/buyBitcoindotcom.html +++ b/www/views/buyBitcoindotcom.html @@ -15,7 +15,7 @@
- +
From aed9657714d4bce025ebc9ed8eb96b60912b48e9 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 13 Jul 2018 21:02:57 +1200 Subject: [PATCH 136/166] Removed extraneous .com in email subject line. --- src/js/controllers/tab-settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 7106aa743..4d0636d53 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -46,7 +46,7 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct }; $scope.sendFeedback = function() { - var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet.com'; + var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet'; if (platformInfo.isNW) { nw.Shell.openExternal(mailToLink); } else if (platformInfo.isCordova) { From 04b5a5103e268f894726071aad47a8b8d2d81bf8 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Fri, 13 Jul 2018 21:36:35 +1200 Subject: [PATCH 137/166] Fixed up last merge by removing feedbackService parameter. --- src/js/controllers/tab-home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 43021d7e2..a04820ebd 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) { var wallet; var listeners = []; var notifications = []; From 02e22517cbde7a17980dd5ccff7cbf7de949b91b Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 11:44:24 +0200 Subject: [PATCH 138/166] scrollable contacts fix --- src/js/controllers/tab-send.js | 1 + src/sass/views/tab-send.scss | 5 ++++- www/views/tab-send.html | 3 +-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index bcaaaef5c..e0806816b 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -250,6 +250,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }; $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isIOS = platformInfo.isIOS && platformInfo.isCordova; $scope.showWalletsBch = $scope.showWalletsBtc = $scope.showWallets = false; $scope.checkingBalance = true; diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index 717ebff89..89c2fc2c4 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -6,7 +6,10 @@ width: 100%; } &-contacts { - height: calc(100vh - 300px - 50px - 44px); + height: calc(100vh - 300px /* button container */ - 50px /* bottom-tab-menu */ - 44px /* header top */); + &.ios { + height: calc(100vh - 300px - 50px - 44px - 20pt); // Remove the notification-bar height on iOS + } overflow: scroll; } diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 3fabea47a..4d9506592 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -86,10 +86,9 @@
-
+
-
Contacts
Saved frequently used addresses
From ca7cd448101c3e9ff6d06d1d9d14de8d4d963c55 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 12:46:06 +0200 Subject: [PATCH 139/166] iPhone SE styles --- src/sass/views/tab-send.scss | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index 89c2fc2c4..a4025156f 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -6,9 +6,9 @@ width: 100%; } &-contacts { - height: calc(100vh - 300px /* button container */ - 50px /* bottom-tab-menu */ - 44px /* header top */); + height: calc(100vh - 300px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */ &.ios { - height: calc(100vh - 300px - 50px - 44px - 20pt); // Remove the notification-bar height on iOS + height: calc(100vh - 300px - 50px - 44px - 18px); // Remove the notification-bar height on iOS } overflow: scroll; } @@ -235,7 +235,8 @@ } .card.contacts { - margin: 4px; + margin: 4px 4px 16px 4px; + border-radius: 6px; box-shadow: 0px 2px 1px 0 #C1C1C1; .gravatar { @@ -245,4 +246,24 @@ } } + + ///* iPhone 5/SE and other small screen devices */ + @media only screen and (min-device-width : 320px) and (max-device-width : 568px) { + .send-wrapper .buttons .button-qr { + height: 60px; + span { + font-size: 16px; + } + } + #tab-send-header { + height: 270px; + } + #tab-send-contacts { + height: calc(100vh - 270px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */ + &.ios { + height: calc(100vh - 270px - 50px - 44px - 18px); // Remove the notification-bar height on iOS + } + } + } + } From c515a080e5061bada67d2d6f41809b3bf03a3979 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 13:01:30 +0200 Subject: [PATCH 140/166] translations + fixed the tags for those --- i18n/po/template.pot | 69 +++++++++++++++++++++++++++++++++++++++-- www/views/tab-send.html | 28 ++++++----------- 2 files changed, 77 insertions(+), 20 deletions(-) diff --git a/i18n/po/template.pot b/i18n/po/template.pot index 66a2e7ca8..12a9c1f5c 100644 --- a/i18n/po/template.pot +++ b/i18n/po/template.pot @@ -610,10 +610,14 @@ msgstr "" msgid "Connection reset by peer" msgstr "" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "" @@ -814,7 +818,7 @@ msgstr "" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "" @@ -2582,9 +2586,70 @@ msgid "Send by email" msgstr "" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "" + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "" + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "" + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "" diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 4d9506592..6bd32398d 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -46,8 +46,8 @@ Send Bitcoin faster!
-
-

Save frequently used addresses and send them Bitcoin in just one tap

+
+

Save frequently used addresses and send them Bitcoin in just one tap

-
-

To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.

-

You can receive bitcoin from any wallet or service.

-
-
To get started, you'll need to create a bitcoin wallet and get some - bitcoin. +
+

To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address.

+

You can receive bitcoin from any wallet or service.

+
To get started, you'll need to create a bitcoin wallet and get some bitcoin.
- - - + + +
@@ -91,7 +83,7 @@
Contacts
-
Saved frequently used addresses
+
Saved frequently used addresses
From 501e8ce7384e251d940e55fcb8cb65bcb57790bc Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 14:02:48 +0200 Subject: [PATCH 141/166] Only show "from"-wallets with balance --- src/js/controllers/tab-send.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index e0806816b..c13a27f7e 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -119,7 +119,8 @@ angular.module('copayApp.controllers').controller('tabSendController', function( var hasWallets = function() { $scope.wallets = profileService.getWallets({ - onlyComplete: true + onlyComplete: true, + hasFunds: true }); $scope.walletsBch = profileService.getWallets({ onlyComplete: true, From 358ae5842cf243d58e351eef868f84bd40909c40 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 14:16:15 +0200 Subject: [PATCH 142/166] Clipboard empty message + translations --- i18n/po/template.pot | 8 ++++++++ src/js/controllers/tab-send.js | 14 ++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/i18n/po/template.pot b/i18n/po/template.pot index 12a9c1f5c..a23e5dbae 100644 --- a/i18n/po/template.pot +++ b/i18n/po/template.pot @@ -2528,6 +2528,14 @@ msgstr "" msgid "Search or enter bitcoin address" msgstr "" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "" diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index c13a27f7e..3c73c229c 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,19 +1,12 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; var originalList; $scope.displayBalanceAsFiat = true; $scope.walletSelectorTitleForce = true; - - - $scope.walletHide = function() { - console.log("wallet HIDE"); - alert('test'); - }; - $scope.addContact = function() { $state.go('tabs.settings').then(function() { $state.go('tabs.addressbook').then(function() { @@ -30,6 +23,11 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); $scope.findContact($scope.formData.search); }); + } else { + $ionicPopup.alert({ + title: gettextCatalog.getString('Clipboard'), + template: gettextCatalog.getString('Your Clipboard is empty') + }); } }; From d801e287fd41c211bfdff70a81684e11ea88cd9b Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 14:23:09 +0200 Subject: [PATCH 143/166] Only copy address to clipboard after click "generate new address" --- src/js/controllers/tab-receive.js | 14 ++++++++------ www/views/tab-receive.html | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 629e59b51..249cf8e5a 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -24,7 +24,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }); }; - $scope.setAddress = function(newAddr) { + $scope.setAddress = function(newAddr, copyAddress) { $scope.addr = null; if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return; $scope.generatingAddress = true; @@ -58,11 +58,13 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi paymentSubscriptionObj.addr = $scope.addr } - try { - clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr); - } catch (error) { - $log.debug("Error copying to clipboard:"); - $log.debug(error); + if (copyAddress === true) { + try { + clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr); + } catch (error) { + $log.debug("Error copying to clipboard:"); + $log.debug(error); + } } // create subscription var msg = JSON.stringify(paymentSubscriptionObj); diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 28f0e51ad..046a19ba8 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -48,7 +48,7 @@
-
From 00b4ee5849f09a13cd8ee8b3c0cfd913199ee0ec Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Fri, 13 Jul 2018 14:54:26 +0200 Subject: [PATCH 144/166] wallet empty/no wallet fixes --- src/js/controllers/tab-send.js | 5 ++++- www/views/tab-send.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 3c73c229c..2ddad8dad 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -116,10 +116,13 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }; var hasWallets = function() { - $scope.wallets = profileService.getWallets({ + $scope.walletsWithFunds = profileService.getWallets({ onlyComplete: true, hasFunds: true }); + $scope.wallets = profileService.getWallets({ + onlyComplete: true, + }); $scope.walletsBch = profileService.getWallets({ onlyComplete: true, coin: 'bch' diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 6bd32398d..05230af06 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -108,7 +108,7 @@ Date: Mon, 16 Jul 2018 12:40:17 +1200 Subject: [PATCH 145/166] BitAnalytics with Firebase parameter name fix. --- bitanalytics/bitanalytics-0.1.0.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/bitanalytics/bitanalytics-0.1.0.js b/bitanalytics/bitanalytics-0.1.0.js index cf85b3c14..db149e481 100644 --- a/bitanalytics/bitanalytics-0.1.0.js +++ b/bitanalytics/bitanalytics-0.1.0.js @@ -6547,13 +6547,26 @@ var FirebaseChannel = /** @class */ (function (_super) { */ FirebaseChannel.prototype.postEvent = function (name, params) { var _this = this; + var sanitizedParams = this.sanitizeParams(params); if (!this.isReady) { - this.enqueue(function () { _this.postEvent(name, params); }); + this.enqueue(function () { _this.postEvent(name, sanitizedParams); }); } else { - this.firebaseInstance.logEvent(name, params); + this.firebaseInstance.logEvent(name, sanitizedParams); } }; + // [Firebase/Analytics][I-ACS013002] Event parameter name must contain only letters, numbers, or underscores + FirebaseChannel.prototype.sanitizeParams = function (params) { + var keys = Object.keys(params); + var keysLength = keys.length; + var sanitized = {}; + for (var i = 0; i < keysLength; i++) { + var key = keys[i]; + var cleanKey = key.replace('-', '_').replace(/[\W]+/g, ''); + sanitized[cleanKey] = params[key]; + } + return sanitized; + }; return FirebaseChannel; }(channel_1.default)); exports.default = FirebaseChannel; From 415b79c12e209ad99228b5c9b2d2cb80a93da9b0 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 16 Jul 2018 14:20:40 +0900 Subject: [PATCH 146/166] 474 - Fix os in the link --- src/js/services/bitcoincomService.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/js/services/bitcoincomService.js b/src/js/services/bitcoincomService.js index d7883b68e..b404031b1 100644 --- a/src/js/services/bitcoincomService.js +++ b/src/js/services/bitcoincomService.js @@ -1,12 +1,13 @@ 'use strict'; -angular.module('copayApp.services').factory('bitcoincomService', function($http, $log, lodash, moment, storageService, configService, platformInfo, nextStepsService, homeIntegrationsService) { +angular.module('copayApp.services').factory('bitcoincomService', function(platformInfo, nextStepsService) { var root = {}; var credentials = {}; /* * Development: 'testnet' * Production: 'livenet' - */ + */ + var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop'; credentials.NETWORK = 'livenet'; //credentials.NETWORK = 'testnet'; @@ -20,28 +21,28 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http, name: 'games', title: 'Bitcoin Cash Games', icon: 'icon-games', - href: 'https://cashgames.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=CashGames' + href: 'https://cashgames.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=CashGames' }; var newsItem = { name: 'news', title: 'News', icon: 'icon-news', - href: 'https://news.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=News' + href: 'https://news.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=News' }; var poolItem = { name: 'pool', title: 'Mining Pool', icon: 'icon-mining', - href: 'https://pool.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Pool' + href: 'https://pool.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Pool' }; var toolsItem = { name: 'tools', title: 'Tools', icon: 'icon-tools', - href: 'https://tools.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Tools' + href: 'https://tools.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Tools' }; var priceChartItem = { @@ -55,7 +56,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http, name: 'faucet', title: 'Free Bitcoin Cash', icon: 'icon-faucet', - href: 'https://free.bitcoin.com/?utm_source=WalletApp&utm_medium=iOS&utm_campaign=Faucet' + href: 'https://free.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Faucet' }; var _getBitPay = function(endpoint) { From ea3cee4ebfe5bb7b3c8b09fd7c8e7f6c28714977 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 16 Jul 2018 14:40:02 +0900 Subject: [PATCH 147/166] 474 - Fix link --- src/js/controllers/buyBitcoindotcom.js | 4 +++- www/views/buyBitcoindotcom.html | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/buyBitcoindotcom.js b/src/js/controllers/buyBitcoindotcom.js index 741898c34..64766eede 100644 --- a/src/js/controllers/buyBitcoindotcom.js +++ b/src/js/controllers/buyBitcoindotcom.js @@ -1,7 +1,9 @@ 'use strict'; angular.module('copayApp.controllers').controller('buyBitcoindotcomController', - function($scope, $timeout, $ionicModal, $log, $state, $ionicHistory, lodash, bitcoincomService, externalLinkService, popupService) { + function($scope, platformInfo, externalLinkService) { + + $scope.os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop'; $scope.openExternalLink = function(url) { externalLinkService.open(url); diff --git a/www/views/buyBitcoindotcom.html b/www/views/buyBitcoindotcom.html index a8a7889e3..f0f8e27e3 100644 --- a/www/views/buyBitcoindotcom.html +++ b/www/views/buyBitcoindotcom.html @@ -15,7 +15,7 @@
- +
From 85e910dc467bc1d408b481fdd8fb0c63057e5b84 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Mon, 16 Jul 2018 17:55:21 +1200 Subject: [PATCH 148/166] Make the Cash Games link work again. --- src/js/services/bitcoincomService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/bitcoincomService.js b/src/js/services/bitcoincomService.js index b404031b1..051123111 100644 --- a/src/js/services/bitcoincomService.js +++ b/src/js/services/bitcoincomService.js @@ -21,7 +21,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function(platfo name: 'games', title: 'Bitcoin Cash Games', icon: 'icon-games', - href: 'https://cashgames.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=CashGames' + href: 'https://cashgames.bitcoin.com' }; var newsItem = { From a4f0f887660e720c859bf470024b02df181abfa8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Mon, 16 Jul 2018 15:52:33 +0900 Subject: [PATCH 149/166] Fix addressbookAdd --- src/js/controllers/addressbookAdd.js | 2 +- src/js/controllers/tab-send.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index dcdb43b9f..9529d943e 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService) { +angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService, platformInfo) { var config = configService.getSync(); var defaults = configService.getDefaults(); diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 2ddad8dad..2bfbee665 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -8,11 +8,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $scope.walletSelectorTitleForce = true; $scope.addContact = function() { - $state.go('tabs.settings').then(function() { - $state.go('tabs.addressbook').then(function() { - $state.go('tabs.addressbook.add'); - }); - }); + $state.go('tabs.send.addressbook'); }; $scope.pasteClipboard = function() { From 7fa1cd166845477fbc1c01738a3b916a6e2aeafb Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 11:02:25 +0900 Subject: [PATCH 150/166] Fix contacts --- src/js/controllers/tab-send.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 2bfbee665..671c0a91a 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -15,9 +15,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function( if ($scope.clipboardHasAddress || $scope.clipboardHasContent) { clipboardService.readFromClipboard(function(text) { $scope.$apply(function() { - $scope.formData.search = text; + $scope.formData.search = text; + $scope.findContact($scope.formData.search); }); - $scope.findContact($scope.formData.search); }); } else { $ionicPopup.alert({ From 7459fcffd20f0951fabd90ff74fa69b733f9c236 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 13:43:47 +0900 Subject: [PATCH 151/166] 416 - Fix : Show the menu only if we are on the scan tab. --- src/js/services/incomingData.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index a318e1157..1bb87b49c 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -228,10 +228,12 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat } else if (/^https?:\/\//.test(data)) { payproService.getPayProDetails(data, coin, function(err, details) { if (err) { - root.showMenu({ - data: data, - type: 'url' - }); + if ($state.includes('tabs.scan')) { + root.showMenu({ + data: data, + type: 'url' + }); + } return; } handlePayPro(details); From 8a7aeefc1c2bfc667129a3a2441ee055c98a2fde Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 14:20:06 +0900 Subject: [PATCH 152/166] Fix multiple selections --- www/views/tab-send.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 05230af06..8b39808db 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -115,7 +115,7 @@ wallet-selector-display-balance-as-fiat="displayBalanceAsFiat"> - From 6e8ec0b295b845c798d4b772dbd4c9a44a7e3daa Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 14:20:45 +0900 Subject: [PATCH 153/166] Add a loading popup --- src/js/controllers/tab-send.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 671c0a91a..cdfe48657 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, ongoingProcess, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; var originalList; @@ -70,7 +70,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function( } $scope.walletSelectorTitleTo = gettextCatalog.getString('Send to'); } else { + ongoingProcess.set(null, true); walletService.getAddress(wallet, true, function(err, addr) { + ongoingProcess.set(null, false); return $state.transitionTo('tabs.send.amount', { displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, recipientType: 'wallet', From b181854ca400119364858825e6496d53e96f7b45 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 14:40:43 +0900 Subject: [PATCH 154/166] 416 - ionicLoading --- src/js/controllers/tab-send.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index cdfe48657..da9414d05 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, ongoingProcess, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, $ionicLoading, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) { var clipboardHasAddress = false; var clipboardHasContent = false; var originalList; @@ -70,9 +70,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function( } $scope.walletSelectorTitleTo = gettextCatalog.getString('Send to'); } else { - ongoingProcess.set(null, true); + $ionicLoading.show(); walletService.getAddress(wallet, true, function(err, addr) { - ongoingProcess.set(null, false); + $ionicLoading.hide(); return $state.transitionTo('tabs.send.amount', { displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, recipientType: 'wallet', From 255e3b85bb2aa5a8a27c46c06e561c45d440c90c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 16:01:37 +0900 Subject: [PATCH 155/166] Fix wallet from --- src/js/controllers/amount.js | 8 ++++++-- src/js/controllers/tab-send.js | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index f10121ee6..c54145947 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -38,9 +38,11 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount); $scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount); $scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId; - $scope.fromWalletId = data.stateParams.fromWalletId; } + // To get the wallet from with the new flow + $scope.fromWalletId = data.stateParams.fromWalletId; + if (data.stateParams.noPrefix) { $scope.showWarningMessage = data.stateParams.noPrefix != 0; if ($scope.showWarningMessage) { @@ -458,7 +460,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ amount: $scope.useSendMax ? null : _amount, currency: unit.id.toUpperCase(), coin: coin, - useSendMax: $scope.useSendMax + useSendMax: $scope.useSendMax, + fromWalletId: $scope.fromWalletId || undefined }); } else { var amount = _amount; @@ -479,6 +482,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ toColor: $scope.toColor, coin: coin, useSendMax: $scope.useSendMax, + fromWalletId: $scope.fromWalletId || undefined }; if ($scope.shapeshiftOrderId) { diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index da9414d05..99265457d 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -76,7 +76,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( return $state.transitionTo('tabs.send.amount', { displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr, recipientType: 'wallet', - fromWalletId: $scope.walletToWalletFrom.walletId, + fromWalletId: $scope.walletToWalletFrom.id, toAddress: addr, coin: $scope.walletToWalletFrom.coin }); From 90fbf801d38dfde2e97dff2d3fa9f5fa9c64d75a Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Tue, 17 Jul 2018 19:10:33 +1200 Subject: [PATCH 156/166] Removed unnecessary logic. --- src/js/controllers/amount.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index c54145947..52695e829 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -461,7 +461,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ currency: unit.id.toUpperCase(), coin: coin, useSendMax: $scope.useSendMax, - fromWalletId: $scope.fromWalletId || undefined + fromWalletId: $scope.fromWalletId }); } else { var amount = _amount; @@ -482,7 +482,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ toColor: $scope.toColor, coin: coin, useSendMax: $scope.useSendMax, - fromWalletId: $scope.fromWalletId || undefined + fromWalletId: $scope.fromWalletId }; if ($scope.shapeshiftOrderId) { From 9b630547a2f6cc4628f431d032f3e3ae460a7ba8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 17:28:15 +0900 Subject: [PATCH 157/166] Incremente version --- app-template/bitcoincom/appConfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 28e24e9fb..fefcb9a4f 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,9 +24,9 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.12.2", - "fullVersion": "4.12-rc3", - "androidVersion": "412200", + "version": "4.13.0", + "fullVersion": "4.13-rc1", + "androidVersion": "413000", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, From e18e446eef72090cb2bc1693ebb074f9c66ce12b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Tue, 17 Jul 2018 18:37:46 +0900 Subject: [PATCH 158/166] => Unsupported uglify --- src/js/services/clipboardService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index ff28cd2e7..ebd30c28c 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -29,10 +29,10 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, cb(nodeWebkitService.readFromClipboard()); } else { navigator.clipboard.readText() - .then(text => { + .then(function (text) { cb(text); }) - .catch(err => { + .catch(function (err) { $log.debug("Clipboard reading is not supported in browser.."); }); From cb82aa7253bf55bea89d5eebedda69b9809686d0 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 19 Jul 2018 17:11:24 +0200 Subject: [PATCH 159/166] OSX clipboard bugfix --- src/js/services/clipboardService.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index ff28cd2e7..c53a1b764 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('clipboardService', function ($http, $log, platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { +angular.module('copayApp.services').factory('clipboardService', function ($http, $log, $timeout, platformInfo,nodeWebkitService, gettextCatalog, ionicToast, clipboard) { var root = {}; root.copyToClipboard = function (data) { @@ -26,7 +26,9 @@ angular.module('copayApp.services').factory('clipboardService', function ($http, cb(text); }) } else if (platformInfo.isNW) { - cb(nodeWebkitService.readFromClipboard()); + $timeout(function() { + cb(nodeWebkitService.readFromClipboard()); + },0); } else { navigator.clipboard.readText() .then(text => { From 1d5e116fa92f96bf99ab576d910de61e058f193f Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Thu, 19 Jul 2018 17:13:19 +0200 Subject: [PATCH 160/166] spacing --- src/js/services/clipboardService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/clipboardService.js b/src/js/services/clipboardService.js index 2420d45e9..b9851d626 100644 --- a/src/js/services/clipboardService.js +++ b/src/js/services/clipboardService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('clipboardService', function ($http, $log, $timeout, platformInfo,nodeWebkitService, gettextCatalog, ionicToast, clipboard) { +angular.module('copayApp.services').factory('clipboardService', function ($http, $log, $timeout, platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { var root = {}; root.copyToClipboard = function (data) { From e344fd567b3e1bbc74727dc5a1a898ffb85aa1cf Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 27 Jul 2018 17:45:12 +0900 Subject: [PATCH 161/166] Add translations and remove googletagmanager --- i18n/po/ca/template-ca.po | 128 +++++++++- i18n/po/cs/template-cs.po | 130 +++++++++- i18n/po/de/template-de.po | 412 +++++++++++++++++++++----------- i18n/po/es-ES/template-es-ES.po | 130 +++++++++- i18n/po/fa/template-fa.po | 130 +++++++++- i18n/po/fr/template-fr.po | 134 ++++++++++- i18n/po/it/template-it.po | 130 +++++++++- i18n/po/ja/template-ja.po | 140 ++++++++++- i18n/po/ko/template-ko.po | 130 +++++++++- i18n/po/nl/template-nl.po | 130 +++++++++- i18n/po/pl/template-pl.po | 194 ++++++++++++--- i18n/po/pt-BR/template-pt-BR.po | 130 +++++++++- i18n/po/ru/template-ru.po | 130 +++++++++- i18n/po/sv-SE/template-sv-SE.po | 128 +++++++++- i18n/po/vi/template-vi.po | 401 ++++++++++++++++++++----------- i18n/po/zh-CN/template-zh-CN.po | 164 +++++++++++-- www/index.html | 7 +- 17 files changed, 2351 insertions(+), 397 deletions(-) diff --git a/i18n/po/ca/template-ca.po b/i18n/po/ca/template-ca.po index 515fcd814..088cd870b 100644 --- a/i18n/po/ca/template-ca.po +++ b/i18n/po/ca/template-ca.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Catalan\n" "Language: ca\n" -"PO-Revision-Date: 2018-07-04 09:26\n" +"PO-Revision-Date: 2018-07-27 08:43\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Compra & ven bitcoins" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Compra bitcoins" @@ -619,10 +620,14 @@ msgstr "S'està connectant a Glidera..." msgid "Connection reset by peer" msgstr "Connexió reiniciada per un parell" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contactes" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Adreces utilitzades freqüentment desades" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continua" @@ -823,7 +828,7 @@ msgstr "Crea una cartera compartida" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Crea una cartera bitcoin" @@ -2533,6 +2538,14 @@ msgstr "Cerca transaccions" msgid "Search or enter bitcoin address" msgstr "Cerca o introdueix l'adreça bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Porta-retalls" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Teniu el porta-retalls buit" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Cerca transaccions" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Envia per correu electrònic" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Envia des de" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Enviat a" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Enganxa des del porta-retalls" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Enganxa l'adreça" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Transferència de cartera a cartera" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Escaneja el codi QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envia bitcoins més ràpid!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envia bitcoins més ràpid!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Deseu adreces utilitzades freqüentment i envieu-los bitcoins d'un sol toc" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Afegiu el primer contacte" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "La vostra cartera bitcoin és buida" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Per començar, compreu Bitcoin Cash (BCH) o Bitcoin Core (BTC), o compartiu la vostra adreça." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Podeu rebre bitcoins des de qualsevol cartera o servei." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Per començar, heu de crear una cartera bitcoin i obtenir uns quants bitcoins." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Compra Bitcoins ara" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Mostra la meva adreça" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Envia import màxim" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transaccions descarregades" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-de-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Comunitat" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Reddit de Bitcoin Cash" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Twitter de Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Explora Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Jocs de Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Notícies" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Xarxa minera" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Eines" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Gràfiques de preus del bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash gratis" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Les vostres carteres bitcoin ja estan a punt!" + diff --git a/i18n/po/cs/template-cs.po b/i18n/po/cs/template-cs.po index 14fe7faf2..5a3702736 100644 --- a/i18n/po/cs/template-cs.po +++ b/i18n/po/cs/template-cs.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Czech\n" "Language: cs\n" -"PO-Revision-Date: 2018-07-04 09:26\n" +"PO-Revision-Date: 2018-07-27 08:43\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Koupit & prodat Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Koupit Bitcoin" @@ -619,10 +620,14 @@ msgstr "Připojování ke Glidera..." msgid "Connection reset by peer" msgstr "Připojení přerušeno druhou stranou" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Kontakty" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Uložené, často používané adresy" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Pokračovat" @@ -823,7 +828,7 @@ msgstr "Vytvořit sdílenou peněženku" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Vytvořit Bitcoin peněženku" @@ -2533,6 +2538,14 @@ msgstr "Vyhledávání transakcí" msgid "Search or enter bitcoin address" msgstr "Vyhledat nebo zadat Bitcoin adresu" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Schránka" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Vaše schránka je prázdná" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Vyhledávání transakcí" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Poslat e-mailem" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Odeslat z" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Odeslat" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Vložit ze schránky" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Vložit adresu" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Převod mezi peněženkami" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Skenovat QR kód" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Odesílejte Bitcoin rychleji!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Odesílejte Bitcoin rychleji!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Uložte si často používané adresy a posílejte jim Bitcoin jedním kliknutím" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Přidat váš první kontakt" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Vaše Bitcoin peněženka je prázdná" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Chcete-li začít, nakupte Bitcoin Cash (BCH) nebo Bitcoin Core (BTC), nebo sdílejte svou adresu." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Můžete přijímat Bitcoin z jakékoliv peněženky nebo služby." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Chcete-li začít, budete muset vytvořit Bitcoin peněženku a Bitcoin získat." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Koupit Bitcoin" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Zobrazit mou adresu" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Odeslat maximální částku" @@ -3030,7 +3104,7 @@ msgstr "Chcete-li začít, nakupte Bitcoin nebo sdílejte svou adresu. Můžete #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Chcete-li začít, budete muset vytvořit Bitcoin peněženku a Bitcoin získat." +msgstr "Chcete-li začít, budete potřebovat vytvořit Bitcoin peněženku a získat Bitcoin." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transakcí staženo" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-z-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Komunita" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Prohlédnout Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash hry" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Novinky" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Těžební pool" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Nástroje" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Grafy cen Bitcoinu" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash zdarma" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Vaše Bitcoin peněženka je připravena!" + diff --git a/i18n/po/de/template-de.po b/i18n/po/de/template-de.po index 7b3a50d69..18d8ca0f4 100644 --- a/i18n/po/de/template-de.po +++ b/i18n/po/de/template-de.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: German\n" "Language: de\n" -"PO-Revision-Date: 2018-07-04 03:57\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -79,7 +79,7 @@ msgstr "Kontonummer" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "" +msgstr "Sofortige Transaktionen mit niedrigen Gebühren" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -226,7 +226,7 @@ msgstr "Betrag zu hoch" #: www/views/includes/walletHistory.html:31 msgid "Amount too low to spend" -msgstr "Betrag ist zu niedrig zum ausgeben" +msgstr "Betrag ist zu niedrig zum Ausgeben" #: src/js/controllers/tab-home.js:147 msgid "An update to this app is available. For your security, please update to the latest version." @@ -384,7 +384,7 @@ msgstr "Bitcoin-Netzwerk Gebührenübersicht" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "Bitcoin Core Brieftaschen" +msgstr "Bitcoin Core Wallets" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Kaufe & Verkaufe Bitcoins" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Kaufe Bitcoins" @@ -547,7 +548,7 @@ msgstr "Schließen" #: www/views/includes/cash.html:2 #: www/views/preferencesInformation.html:17 msgid "Coin" -msgstr "" +msgstr "Münze" #: www/views/preferences.html:22 msgid "Color" @@ -563,7 +564,7 @@ msgstr "Beenden Sie den Backupvorgang um diese Option zu nutzen" #: www/views/bitpayCard.html:93 msgid "Completed" -msgstr "" +msgstr "Abgeschlossen" #: src/js/controllers/buyAmazon.js:311 #: src/js/controllers/buyMercadoLibre.js:305 @@ -584,7 +585,7 @@ msgstr "Bestätigen & Beenden" #: www/views/buyAmazon.html:90 msgid "Confirm purchase" -msgstr "" +msgstr "Kauf bestätigen" #: www/views/modals/pin.html:10 msgid "Confirm your PIN" @@ -619,10 +620,14 @@ msgstr "Verbinde mit Glidera..." msgid "Connection reset by peer" msgstr "Verbindung von Peer zurückgesetzt" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Kontakte" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Gespeicherte häufig verwendete Adressen" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Weiter" @@ -633,7 +638,7 @@ msgstr "Übersetzungen beitragen" #: src/js/controllers/confirm.js:130 msgid "Copay only supports Bitcoin Cash using new version numbers addresses" -msgstr "" +msgstr "Copay unterstützt nur Bitcoin Cash bei Adressen welche das neue Adressformat benutzen" #: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" @@ -675,7 +680,7 @@ msgstr "In die Zwischenablage kopieren" #: src/js/controllers/buyMercadoLibre.js:102 msgid "Could not access Gift Card Service" -msgstr "" +msgstr "Der Geschenkkartendienst konnte nicht erreicht werden" #: www/views/tab-import-phrase.html:2 msgid "Could not access the wallet at the server. Please check:" @@ -683,7 +688,7 @@ msgstr "Kein Zugriff auf Wallet des Servers. Überprüfen Sie bitte:" #: src/js/controllers/buyAmazon.js:102 msgid "Could not access to Amazon.com" -msgstr "" +msgstr "Auf Amazon.com konnte nicht zugegriffen werden" #: src/js/services/profileService.js:511 msgid "Could not access wallet" @@ -707,13 +712,13 @@ msgstr "Adresse konnte nicht erstellt werden" #: src/js/controllers/topup.js:92 msgid "Could not create the invoice" -msgstr "" +msgstr "Die Rechnung konnte nicht erstellt werden" #: src/js/controllers/buyAmazon.js:164 #: src/js/controllers/buyMercadoLibre.js:164 #: src/js/controllers/topup.js:142 msgid "Could not create transaction" -msgstr "" +msgstr "Transaktion konnte nicht erstellt werden" #: src/js/services/profileService.js:350 msgid "Could not create using the specified extended private key" @@ -737,7 +742,7 @@ msgstr "Zahlungsvorschlag konnte nicht gelöscht werden" #: src/js/controllers/cashScan.js:117 msgid "Could not duplicate" -msgstr "" +msgstr "Konnte nicht duplizieren" #: src/js/services/feeService.js:73 msgid "Could not get dynamic fee" @@ -749,13 +754,13 @@ msgstr "Dynamische Gebühr für den Level konnte nicht abgerufen werden: {{feeLe #: src/js/controllers/modals/feeLevels.js:112 msgid "Could not get fee levels" -msgstr "" +msgstr "Gebühren konnten nicht abgerufen werden" #: src/js/controllers/buyAmazon.js:122 #: src/js/controllers/buyMercadoLibre.js:122 #: src/js/controllers/topup.js:100 msgid "Could not get the invoice" -msgstr "" +msgstr "Konnte die Rechnung nicht erhalten" #: src/js/controllers/bitpayCard.js:66 msgid "Could not get transactions" @@ -800,7 +805,7 @@ msgstr "Zahlung kann nicht gesendet werden" #: src/js/controllers/buyMercadoLibre.js:318 #: src/js/controllers/topup.js:299 msgid "Could not send transaction" -msgstr "" +msgstr "Transaktion konnte nicht gesendet werden" #: www/views/walletDetails.html:210 msgid "Could not update transaction history" @@ -823,7 +828,7 @@ msgstr "Erstelle eine gemeinsame Wallet" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Erstelle Bitcoin-Wallet" @@ -859,7 +864,7 @@ msgstr "Aktuelle Gebühr für dieses Verfahren" #: src/js/services/feeService.js:15 msgid "Custom" -msgstr "" +msgstr "Eigene" #: www/views/customAmount.html:9 msgid "Custom Amount" @@ -867,7 +872,7 @@ msgstr "Benutzerdefinierter Betrag" #: src/js/controllers/preferencesFee.js:85 msgid "Custom Fee" -msgstr "" +msgstr "Eigene Gebühr" #: www/views/modals/mercadolibre-card-details.html:56 #: www/views/modals/txp-details.html:87 @@ -944,11 +949,11 @@ msgstr "Herunterladen" #: www/views/cashScan.html:37 msgid "Duplicate for BCH" -msgstr "Duplikat für BCH" +msgstr "Für BCH duplizieren" #: src/js/services/onGoingProcess.js:49 msgid "Duplicating wallet..." -msgstr "" +msgstr "Wallet wird dupliziert..." #: www/views/addresses.html:19 msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." @@ -960,7 +965,7 @@ msgstr "Wirtschaftlich" #: www/views/onboarding/collectEmail.html:27 msgid "Edit" -msgstr "" +msgstr "Bearbeiten" #: www/views/addressbook.add.html:29 #: www/views/addressbook.view.html:22 @@ -977,7 +982,7 @@ msgstr "Obergrenze für leere Adressen erreicht. Neue Adressen können nicht gen #: www/views/preferencesCash.html:17 msgid "Enable Bitcoin Cash wallet creation and operation within the App." -msgstr "" +msgstr "Bitcoin Cash-Wallet-Erstellung und Betrieb innerhalb der App aktivieren." #: www/views/tab-scan.html:19 msgid "Enable camera access in your device settings to get started." @@ -993,7 +998,7 @@ msgstr "Pushbenachrichtigungen aktivieren" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "Sound einschalten" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1014,11 +1019,11 @@ msgstr "Eingabe des Zwei-Faktor-Authentifizierungs-Codes für das BitPay Konto" #: www/views/amount.html:4 msgid "Enter amount" -msgstr "" +msgstr "Betrag eingeben" #: www/views/modals/chooseFeeLevel.html:41 msgid "Enter custom fee" -msgstr "" +msgstr "Eigene Gebühr eingeben" #: src/js/services/walletService.js:1029 msgid "Enter new spending password" @@ -1032,7 +1037,7 @@ msgstr "Wiederherstellungsphrase eingeben (BIP39)" #: www/views/onboarding/collectEmail.html:13 msgid "Enter your email" -msgstr "" +msgstr "Ihre E-Mail Adresse eingeben" #: www/views/backup.html:69 msgid "Enter your password" @@ -1123,12 +1128,12 @@ msgstr "Fehler beim bestätigen" #: src/js/controllers/buyAmazon.js:179 msgid "Error creating gift card" -msgstr "" +msgstr "Fehler beim Erstellen der Geschenkkarte" #: src/js/controllers/buyAmazon.js:94 #: src/js/controllers/buyMercadoLibre.js:94 msgid "Error creating the invoice" -msgstr "" +msgstr "Fehler beim Erstellen der Rechnung" #: src/js/services/profileService.js:412 msgid "Error creating wallet" @@ -1136,17 +1141,17 @@ msgstr "Fehler beim Erstellen des Wallets" #: src/js/controllers/confirm.js:296 msgid "Error getting SendMax information" -msgstr "" +msgstr "Fehler beim Abrufen der SendMax Informationen" #: src/js/controllers/buyAmazon.js:136 #: src/js/controllers/buyMercadoLibre.js:136 #: src/js/controllers/topup.js:114 msgid "Error in Payment Protocol" -msgstr "" +msgstr "Fehler im Zahlungsprotokoll" #: src/js/controllers/bitpayCardIntro.js:14 msgid "Error pairing BitPay Account" -msgstr "" +msgstr "Fehler beim Paaren mit BitPay Konto" #: src/js/controllers/paperWallet.js:41 msgid "Error scanning funds:" @@ -1201,7 +1206,7 @@ msgstr "Erweiterte öffentliche Schlüssel" #: src/js/services/onGoingProcess.js:20 msgid "Extracting Wallet information..." -msgstr "" +msgstr "Wallet-Informationen extrahieren..." #: src/js/controllers/export.js:115 #: src/js/controllers/export.js:126 @@ -1222,16 +1227,16 @@ msgstr "Gebühr" #: www/views/modals/chooseFeeLevel.html:75 msgid "Fee level" -msgstr "" +msgstr "Gebührenstufe" #: src/js/controllers/modals/feeLevels.js:100 msgid "Fee level is not defined" -msgstr "" +msgstr "Gebührenstufe ist nicht definiert" #: www/views/confirm.html:79 #: www/views/modals/txp-details.html:99 msgid "Fee:" -msgstr "" +msgstr "Gebühr:" #: src/js/controllers/feedback/send.js:23 msgid "Feedback could not be submitted. Please try again later." @@ -1243,7 +1248,7 @@ msgstr "BitPay Konto abrufen..." #: src/js/services/onGoingProcess.js:21 msgid "Fetching payment information" -msgstr "" +msgstr "Zahlungsinformationen abrufen" #: www/views/export.html:14 #: www/views/import.html:16 @@ -1252,7 +1257,7 @@ msgstr "Datei/Text" #: www/views/preferencesLogs.html:17 msgid "Filter setting" -msgstr "" +msgstr "Filtereinstellungen" #: src/js/services/fingerprintService.js:43 #: src/js/services/fingerprintService.js:48 @@ -1285,7 +1290,7 @@ msgstr "Von BitPay Konto" #: www/views/tab-import-phrase.html:57 msgid "From Hardware Wallet" -msgstr "" +msgstr "Aus der Hardware-Wallet" #: www/views/tab-export-qrCode.html:5 msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" @@ -1301,7 +1306,7 @@ msgstr "Betrag gefunden:" #: www/views/topup.html:49 msgid "Funds to be added" -msgstr "" +msgstr "Hinzuzufügende Mittel" #: www/views/paperWallet.html:51 msgid "Funds transferred" @@ -1309,7 +1314,7 @@ msgstr "Betrag übermittelt" #: www/views/topup.html:103 msgid "Funds were added to debit card" -msgstr "" +msgstr "Mittel wurden auf die Debitkarte hinzugefügt" #: www/views/paperWallet.html:22 msgid "Funds will be transferred to" @@ -1317,7 +1322,7 @@ msgstr "Beträge werden überwiesen an" #: www/views/tab-receive.html:51 msgid "Generate new address" -msgstr "" +msgstr "Neue Adresse generieren" #: src/js/services/onGoingProcess.js:22 msgid "Generating .csv file..." @@ -1338,7 +1343,7 @@ msgstr "Erhalten Sie Neuigkeiten und Aktualisierungen von BitPay" #: www/views/onboarding/welcome.html:8 msgctxt "button" msgid "Get started" -msgstr "" +msgstr "Loslegen" #: www/views/bitpayCard.html:49 msgid "Get started" @@ -1355,20 +1360,20 @@ msgstr "Entgelt-Level werden abgerufen..." #: www/views/buyAmazon.html:43 #: www/views/buyMercadoLibre.html:42 msgid "Gift Card" -msgstr "Geschenk-Karte" +msgstr "Geschenkkarte" #: www/views/modals/mercadolibre-card-details.html:30 #: www/views/modals/mercadolibre-card-details.html:35 msgid "Gift Card is not available to use anymore" -msgstr "" +msgstr "Geschenkkarte kann nicht mehr verwendet werden" #: src/js/controllers/buyAmazon.js:204 msgid "Gift card expired" -msgstr "" +msgstr "Geschenkkarte ist abgelaufen" #: www/views/buyAmazon.html:111 msgid "Gift card generated and ready to use." -msgstr "" +msgstr "Geschenkkarte generiert und einsatzbereit." #: src/js/controllers/bitpayCard.js:114 #: src/js/controllers/bitpayCard.js:124 @@ -1414,7 +1419,7 @@ msgstr "Hardware-Wallet" #: src/js/controllers/create.js:180 #: src/js/controllers/join.js:145 msgid "Hardware wallets are not yet supported with Bitcoin Cash" -msgstr "" +msgstr "Bitcoin Cash unterstützt keine Hardware-Wallets" #: www/views/tab-settings.html:20 msgid "Help & Support" @@ -1531,7 +1536,7 @@ msgstr "Wenn Sie einen Screenshot erstellen, kann die Sicherung von anderen Apps #: www/views/tab-import-hardware.html:42 #: www/views/tab-import-phrase.html:80 msgid "Import" -msgstr "" +msgstr "Import" #: www/views/import.html:3 msgid "Import Wallet" @@ -1580,13 +1585,13 @@ msgstr "QR code hat falsches Format" #: src/js/services/bwcError.js:113 msgid "Incorrect network address" -msgstr "" +msgstr "Falsche Netzwerkadresse" #: src/js/controllers/confirm.js:114 #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "Unzureichende bestätigte Mittel" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -1606,7 +1611,7 @@ msgstr "Ungültig" #: src/js/controllers/buyMercadoLibre.js:137 #: src/js/controllers/topup.js:115 msgid "Invalid URL" -msgstr "" +msgstr "Ungültige URL" #: src/js/controllers/create.js:186 #: src/js/controllers/import.js:345 @@ -1635,7 +1640,7 @@ msgstr "Einladung um eine {{appName}} Wallet zu teilen" #: www/views/mercadoLibreCards.html:20 #: www/views/modals/mercadolibre-card-details.html:48 msgid "Invoice expired" -msgstr "" +msgstr "Rechnung abgelaufen" #: src/js/controllers/feedback/send.js:79 msgid "Is there anything we could do better?" @@ -1696,7 +1701,7 @@ msgstr "Letzter Monat" #: www/views/preferencesCash.html:18 #: www/views/tx-details.html:94 msgid "Learn more" -msgstr "" +msgstr "Weitere Informationen" #: www/views/backup.html:43 msgid "Let's verify your backup phrase." @@ -1737,15 +1742,15 @@ msgstr "Zeitsperre aktiv. Bitte auf die Entfernung des Zahlungsvorschlags warten #: www/views/includes/logOptions.html:3 msgid "Log options" -msgstr "" +msgstr "Log-Optionen" #: www/views/modals/bitpay-card-confirmation.html:14 msgid "Log out" -msgstr "" +msgstr "Abmelden" #: www/views/addresses.html:87 msgid "Low amount inputs" -msgstr "" +msgstr "Zu wenige Inputs" #: www/views/includes/walletHistory.html:27 msgid "Low fees" @@ -1777,11 +1782,11 @@ msgstr "Notiz" #: www/views/mercadoLibre.html:6 msgid "Mercado Livre Brazil Gift Cards" -msgstr "" +msgstr "Mercado Livre Brazil Geschenkkarten" #: src/js/controllers/buyMercadoLibre.js:98 msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later." -msgstr "" +msgstr "Der MercadoLibre Geschenkkarten-Dienst ist aktuell nicht erreichbar. Bitte versuchen Sie es später noch einmal." #: www/views/modals/txp-details.html:131 msgid "Merchant Message" @@ -1791,7 +1796,7 @@ msgstr "Händlernachricht" #: www/views/buyMercadoLibre.html:54 #: www/views/topup.html:63 msgid "Miner Fee" -msgstr "" +msgstr "Miner-Gebühr" #: src/js/services/bwcError.js:134 msgid "Missing parameter" @@ -1828,13 +1833,13 @@ msgstr "Hinweis: Um eine Brieftasche aus einer 3rd-Party-Software zu importieren #: www/views/preferences.html:15 #: www/views/preferencesAlias.html:17 msgid "Name" -msgstr "" +msgstr "Name" #: www/views/buyAmazon.html:49 #: www/views/buyMercadoLibre.html:48 #: www/views/topup.html:56 msgid "Network Cost" -msgstr "" +msgstr "Netzwerkkosten" #: src/js/services/bwcError.js:47 msgid "Network error" @@ -1863,7 +1868,7 @@ msgstr "Keine Wallet" #: src/js/controllers/buyAmazon.js:115 #: src/js/controllers/buyMercadoLibre.js:115 msgid "No access key defined" -msgstr "" +msgstr "Kein Zugangsschlüssel definiert" #: www/views/onboarding/backupRequest.html:5 msgid "No backup, no bitcoin." @@ -1875,7 +1880,7 @@ msgstr "Noch keine Kontakte" #: www/views/preferencesLogs.html:16 msgid "No entries for this log level" -msgstr "" +msgstr "Keine Einträge für dieses Log-level" #: www/views/preferencesExternal.html:12 msgid "No hardware information available." @@ -1896,7 +1901,7 @@ msgstr "Keine aktuellen Transaktionen" #: src/js/controllers/buyAmazon.js:44 #: src/js/controllers/topup.js:47 msgid "No signing proposal: No private key" -msgstr "" +msgstr "Kein Unterzeichnungsvorschlag: Privater Schlüssel nicht vorhanden" #: www/views/walletDetails.html:204 msgid "No transactions yet" @@ -1915,7 +1920,7 @@ msgstr "Kein Wallet ausgewählt" #: src/js/controllers/confirm.js:85 #: src/js/controllers/topup.js:265 msgid "No wallets available" -msgstr "" +msgstr "Keine Wallets verfügbar" #: www/views/paperWallet.html:45 msgid "No wallets available to receive funds" @@ -1923,19 +1928,19 @@ msgstr "Keine Wallet verfügbar um Guthaben zu erhalten" #: www/views/cashScan.html:15 msgid "No wallets eligible for Bitcoin Cash support" -msgstr "" +msgstr "Keine Wallet zur Unterstützung von Bitcoin Cash geeignet" #: src/js/controllers/cashScan.js:58 msgid "Non BIP44 wallet" -msgstr "" +msgstr "Wallet ist keine BIP44-Wallet" #: www/views/cashScan.html:46 msgid "Non eligible BTC wallets" -msgstr "" +msgstr "Keine geeigneten BTC Wallets" #: src/js/services/feeService.js:12 msgid "Normal" -msgstr "" +msgstr "Normal" #: src/js/services/bwcError.js:80 msgid "Not authorized" @@ -1964,7 +1969,7 @@ msgstr "Notiz" #: www/views/backup.html:19 msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase." -msgstr "" +msgstr "Hinweis: Wenn diese BCH-Wallet aus einer BTC-Wallet dupliziert wurde, verwenden sie die selbe Wiederherstellungsphrase." #: www/views/modals/wallets.html:25 msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" @@ -1977,15 +1982,15 @@ msgstr "Benachrichtigungen" #: www/views/onboarding/collectEmail.html:9 msgid "Notifications by email" -msgstr "" +msgstr "Benachrichtigungen per e-Mail" #: www/views/tx-details.html:117 msgid "Notify me if confirmed" -msgstr "" +msgstr "Benachrichtige mich sobald sie bestätigt ist" #: www/views/preferencesNotifications.html:24 msgid "Notify me when transactions are confirmed" -msgstr "" +msgstr "Benachrichtigen Sie mich, wenn Transaktionen bestätigt werden" #: www/views/includes/backupNeededPopup.html:8 msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." @@ -2004,7 +2009,7 @@ msgstr "Jetzt ist die perfekte Zeit um Ihre Umgebung zu überprüfen. In der Nä #: src/js/services/popupService.js:72 #: www/views/modals/chooseFeeLevel.html:6 msgid "OK" -msgstr "" +msgstr "Okay" #: www/views/modals/tx-status.html:12 #: www/views/modals/tx-status.html:24 @@ -2023,7 +2028,7 @@ msgstr "Oh nein!" #: src/js/controllers/buyMercadoLibre.js:306 msgid "Ok" -msgstr "" +msgstr "Okay" #: www/views/tab-home.html:39 msgid "On this screen you can see all your wallets, accounts, and assets." @@ -2053,7 +2058,7 @@ msgstr "Öffne GitHub Projekt" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "Explorer öffnen" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -2069,11 +2074,11 @@ msgstr "Öffne Website" #: src/js/controllers/preferencesCash.js:32 msgid "Open bitcoincash.org?" -msgstr "" +msgstr "bitcoincash.org öffnen?" #: src/js/controllers/cashScan.js:18 msgid "Open the recovery tool." -msgstr "" +msgstr "Öffnen Sie das Recovery-Tool." #: www/views/tab-receive.html:27 msgid "Open wallet" @@ -2081,7 +2086,7 @@ msgstr "Öffne Wallet" #: www/views/includes/incomingDataMenu.html:19 msgid "Open website" -msgstr "" +msgstr "Öffne Website" #: www/views/bitpayCardIntro.html:34 msgid "Order the BitPay Card" @@ -2173,7 +2178,7 @@ msgstr "Zahlung akzeptiert. Sie wird durch Glidera übermittelt. Falls ein Probl #: src/js/services/incomingData.js:152 msgid "Payment address was translated to new Bitcoin Cash address format:" -msgstr "" +msgstr "Die Zahlungsadresse wurde auf das neue Bitcoin Cash-Adressformat übersetzt:" #: www/views/modals/txp-details.html:107 msgid "Payment details" @@ -2186,7 +2191,7 @@ msgstr "Zahlungsanforderung" #: www/views/mercadoLibreCards.html:22 #: www/views/modals/mercadolibre-card-details.html:39 msgid "Pending" -msgstr "" +msgstr "Ausstehend" #: www/views/proposals.html:4 msgid "Pending Proposals" @@ -2232,7 +2237,7 @@ msgstr "Bitte Copay aktualisieren, um diese Aktion auszuführen" #: www/views/walletDetails.html:142 #: www/views/walletDetails.html:62 msgid "Please wait" -msgstr "" +msgstr "Bitte warten" #: src/js/controllers/import.js:238 msgid "Please, select your backup file" @@ -2240,7 +2245,7 @@ msgstr "Bitte die Sicherungsdatei wählen" #: www/views/bitpayCard.html:81 msgid "Pre-Auth Holds" -msgstr "" +msgstr "Pre-Auth Holds" #: www/views/tab-settings.html:40 msgid "Preferences" @@ -2264,7 +2269,7 @@ msgstr "höchste Priorität" #: www/views/includes/incomingDataMenu.html:80 msgid "Private Key" -msgstr "" +msgstr "Privater Schlüssel" #: src/js/controllers/paperWallet.js:136 msgid "Private key encrypted. Enter password" @@ -2298,11 +2303,11 @@ msgstr "Vorschläge" #: src/js/controllers/buyAmazon.js:282 msgid "Purchase Amount is limited to {{limitPerDay}} {{currency}} per day" -msgstr "" +msgstr "Kaufbetrag beschränkt ist auf {{limitPerDay}} {{currency}} pro Tag beschränkt" #: src/js/controllers/buyMercadoLibre.js:281 msgid "Purchase amount must be a value between 50 and 2000" -msgstr "" +msgstr "Kaufbetrag muss ein Wert zwischen 50 und 2000 sein" #: www/views/onboarding/notifications.html:3 msgid "Push Notifications" @@ -2340,11 +2345,11 @@ msgstr "Mehr anzeigen" #: src/js/controllers/preferences.js:65 #: src/js/controllers/tx-details.js:54 msgid "Read more in our Wiki" -msgstr "" +msgstr "Lesen Sie mehr in unserem Wiki" #: src/js/controllers/cashScan.js:61 msgid "Read only wallet" -msgstr "" +msgstr "Schreibgeschützte Wallet" #: www/views/tab-receive.html:3 #: www/views/tabs.html:7 @@ -2353,7 +2358,7 @@ msgstr "Empfangen" #: www/views/customAmount.html:44 msgid "Receive in" -msgstr "" +msgstr "Erhalten in" #: www/views/includes/walletHistory.html:24 #: www/views/tx-details.html:18 @@ -2402,7 +2407,7 @@ msgstr "Wallet wiederherstellen..." #: www/views/modals/mercadolibre-card-details.html:22 msgid "Redeem now" -msgstr "" +msgstr "Jetzt einlösen" #: src/js/controllers/modals/txpDetails.js:63 #: src/js/controllers/tx-details.js:80 @@ -2420,7 +2425,7 @@ msgstr "Release-Informationen" #: www/views/addressbook.view.html:36 #: www/views/modals/mercadolibre-card-details.html:69 msgid "Remove" -msgstr "" +msgstr "Entfernen" #: src/js/controllers/preferencesBitpayServices.js:7 msgid "Remove BitPay Account?" @@ -2503,7 +2508,7 @@ msgstr "Adresse auf neue Beträge überprüfen" #: www/views/modals/fingerprintCheck.html:11 msgid "Scan again" -msgstr "" +msgstr "Erneut scannen" #: src/js/services/fingerprintService.js:56 msgid "Scan your fingerprint please" @@ -2511,7 +2516,7 @@ msgstr "Scannen Sie bitte Ihren Fingerabdruck" #: www/views/preferencesCash.html:23 msgid "Scan your wallets for Bitcoin Cash" -msgstr "" +msgstr "Durchsuche deine Wallet nach Bitcoin Cash" #: src/js/services/onGoingProcess.js:30 msgid "Scanning Wallet funds..." @@ -2519,7 +2524,7 @@ msgstr "Prüfe Wallet auf neue Beträge..." #: www/views/includes/walletList.html:11 msgid "Scanning funds..." -msgstr "" +msgstr "Mittel werden durchsucht..." #: www/views/includes/screenshotWarningModal.html:7 msgid "Screenshots are not secure" @@ -2533,6 +2538,14 @@ msgstr "Transaktionen durchsuchen" msgid "Search or enter bitcoin address" msgstr "Bitcoin-Adresse suchen oder eingeben" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Zwischenablage" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Ihre Zwischenablage ist leer" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Transaktionen durchsuchen" @@ -2547,7 +2560,7 @@ msgstr "Sicherheit" #: www/views/modals/mercadolibre-card-details.html:64 msgid "See invoice" -msgstr "" +msgstr "Rechnung einsehen" #: www/views/tab-import-file.html:7 msgid "Select a backup file" @@ -2591,16 +2604,77 @@ msgid "Send by email" msgstr "Per E-Mail versenden" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Senden von" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Senden an" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Aus Zwischenablage einfügen" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Adresse einfügen" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Wallet-zu-Wallet-Überweisung" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "QR-Code scannen" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Versenden Sie Bitcoin schneller!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Versenden Sie Bitcoin schneller!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Speichern Sie häufig verwendete Adressen und senden Sie ihnen Bitcoin mit nur einem Tippen" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Ihren ersten Kontakt hinzufügen" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Ihre Bitcoin-Wallet ist leer" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Um loszulegen, können sie entweder Bitcoin Cash (BCH) oder Bitcoin Core (BTC) kaufen, oder uns ihre Adresse mitteilen." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Sie können Bitcoin von jeder Wallet oder jedem Dienst erhalten." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Um loszulegen müssen Sie eine Bitcoin-Wallet erstellen und einige Bitcoins erhalten." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Bitcoin jetzt kaufen" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Meine Adresse anzeigen" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Sende max. Betrag" #: www/views/includes/incomingDataMenu.html:46 msgid "Send payment to this address" -msgstr "" +msgstr "Zahlung an diese Adresse senden" #: www/views/feedback/rateApp.html:17 msgid "Send us feedback instead" @@ -2651,11 +2725,11 @@ msgstr "Antwort des Servers konnte nicht verifiziert werden" #: src/js/controllers/buyAmazon.js:97 #: src/js/controllers/buyMercadoLibre.js:97 msgid "Service not available" -msgstr "" +msgstr "Dienst ist nicht verfügbar" #: www/views/includes/homeIntegrations.html:3 msgid "Services" -msgstr "" +msgstr "Dienste" #: www/views/preferencesLogs.html:3 msgid "Session Log" @@ -2671,7 +2745,7 @@ msgstr "Passwort einrichten" #: src/js/controllers/preferencesFee.js:85 msgid "Set your own fee in satoshis/byte" -msgstr "" +msgstr "Legen Sie Ihre eigene Gebühr in Satoshis/byte fest" #: www/views/tab-settings.html:3 #: www/views/tabs.html:19 @@ -2747,24 +2821,24 @@ msgstr "Überspringen" #: src/js/controllers/confirm.js:371 #: src/js/controllers/modals/txpDetails.js:47 msgid "Slide to accept" -msgstr "" +msgstr "Zum Akzeptieren schieben" #: www/views/buyAmazon.html:96 msgid "Slide to buy" -msgstr "" +msgstr "Zum Kaufen schieben" #: src/js/controllers/confirm.js:365 msgid "Slide to pay" -msgstr "" +msgstr "Zum Bezahlen schieben" #: src/js/controllers/confirm.js:377 #: src/js/controllers/modals/txpDetails.js:40 msgid "Slide to send" -msgstr "" +msgstr "Zum Senden schieben" #: www/views/cashScan.html:56 msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" -msgstr "" +msgstr "Einige ihrer Wallets sind nicht zur Unterstützung von Bitcoin Cash geeignet. Sie können versuchen, auf BCH Mittel von diesen Wallets aus zuzugreifen indem Sie die" #: src/js/controllers/create.js:88 #: src/js/controllers/join.js:71 @@ -2785,7 +2859,7 @@ msgstr "Berechtigungscode erforderlich" #: www/views/walletDetails.html:173 msgid "Spending this balance will need significant Bitcoin network fees" -msgstr "" +msgstr "Die Ausgabe dieses Betrages wird signifikante Bitcoin-Netzwerkgebühren erfordern" #: www/views/tab-send.html:28 msgid "Start sending bitcoin" @@ -2798,11 +2872,11 @@ msgstr "Sperre des Startups" #: www/views/mercadoLibreCards.html:21 #: www/views/modals/mercadolibre-card-details.html:42 msgid "Still pending" -msgstr "" +msgstr "Noch ausstehend" #: www/views/topup.html:101 msgid "Success" -msgstr "" +msgstr "Erfolg" #: src/js/services/feeService.js:14 msgid "Super Economy" @@ -2810,7 +2884,7 @@ msgstr "Niedrigste Priorität" #: www/views/preferencesCash.html:11 msgid "Support Bitcoin Cash" -msgstr "" +msgstr "Bitcoin Cash unterstützen" #: www/views/paperWallet.html:7 msgid "Sweep" @@ -2840,7 +2914,7 @@ msgstr "Anzeigen durch tippen und halten" #: www/views/includes/walletInfo.html:3 msgid "Tap to recreate" -msgstr "" +msgstr "Zum neu erstellen tippen" #: www/views/includes/walletInfo.html:4 msgid "Tap to retry" @@ -2860,11 +2934,11 @@ msgstr "Nutzungsbedingungen" #: www/views/tab-create-personal.html:118 #: www/views/tab-import-phrase.html:68 msgid "Testnet" -msgstr "" +msgstr "Testnet" #: www/views/includes/incomingDataMenu.html:61 msgid "Text" -msgstr "" +msgstr "Text" #: src/js/controllers/feedback/send.js:27 #: src/js/controllers/feedback/send.js:76 @@ -2999,7 +3073,7 @@ msgstr "Diese Wiederherstellungsphrase entstand mit einem Passwort. Zur Wiederhe #: www/views/tx-details.html:91 msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." -msgstr "" +msgstr "Dieser Betrag ist zu klein im Vergleich zu den aktuellen Bitcoin-Netzwerk-Gebühren. Diese Mittel benötigen eine Bitcoin Netzwerk Gebühr mit vergleichbarer Größe zu den Mitteln." #: www/views/tx-details.html:87 msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" @@ -3034,15 +3108,15 @@ msgstr "Um loszulegen müssen Sie eine Bitcoin-Wallet erstellen und einige Bitco #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" -msgstr "" +msgstr "Zum {{reason}} müssen Sie erst Ihr BitPay-Konto hinzufügen - {{email}}" #: src/js/services/onGoingProcess.js:48 msgid "Top up in progress..." -msgstr "" +msgstr "Aufladung in Bearbeitung..." #: src/js/controllers/topup.js:206 msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" -msgstr "" +msgstr "Laden sie {{amountStr}} auf die Debitkarte ({{cardLastNumber}}) auf" #: www/views/buyAmazon.html:61 #: www/views/buyMercadoLibre.html:60 @@ -3061,7 +3135,7 @@ msgstr "Gesamtanzahl der Copayer" #: www/views/addresses.html:81 msgid "Total wallet inputs" -msgstr "" +msgstr "Alle Wallet-Inputs" #: src/js/services/fingerprintService.js:63 #: src/js/services/fingerprintService.js:68 @@ -3074,7 +3148,7 @@ msgstr "Transaktion" #: www/views/confirm.html:126 msgid "Transaction Created" -msgstr "" +msgstr "Transaktion erstellt" #: www/views/preferencesAdvanced.html:29 #: www/views/preferencesHistory.html:3 @@ -3089,11 +3163,11 @@ msgstr "Transaktion wurde bereits übermittelt" #: src/js/controllers/buyMercadoLibre.js:301 #: src/js/controllers/topup.js:281 msgid "Transaction has not been created" -msgstr "" +msgstr "Transaktion wurde nicht erstellt" #: www/views/topup.html:104 msgid "Transaction initiated" -msgstr "" +msgstr "Transaktion eingeleitet" #: src/js/controllers/tx-details.js:119 msgid "Transaction not available at this time" @@ -3106,11 +3180,11 @@ msgstr "Transaktion konnte nicht gefunden werden" #: www/views/modals/chooseFeeLevel.html:55 msgid "Transactions without fee are not supported." -msgstr "" +msgstr "Transaktionen ohne Gebühren werden nicht unterstützt." #: src/js/controllers/paperWallet.js:109 msgid "Transfer to" -msgstr "" +msgstr "Transfer zu" #: www/views/tab-send.html:67 msgid "Transfer to Wallet" @@ -3130,7 +3204,7 @@ msgstr "Wiederherstellungsphrase eingeben (in der Regel 12 Wörter)" #: src/js/controllers/backup.js:75 msgid "Uh oh..." -msgstr "" +msgstr "Oh oh..." #: www/views/tx-details.html:100 msgid "Unconfirmed" @@ -3178,12 +3252,12 @@ msgstr "Überprüfe Wiederherstellungsphrase..." #: www/views/modals/fingerprintCheck.html:4 msgid "Verify your identity" -msgstr "" +msgstr "Bestätigen Sie Ihre Identität" #: www/views/preferencesAbout.html:14 #: www/views/preferencesExternal.html:25 msgid "Version" -msgstr "" +msgstr "Version" #: www/views/tab-export-file.html:69 msgid "View" @@ -3200,7 +3274,7 @@ msgstr "Nutzungsbedingungen anzeigen" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "Transaktion auf Explorer.Bitcoin.com ansehen" #: src/js/controllers/tab-home.js:148 msgid "View Update" @@ -3212,7 +3286,7 @@ msgstr "Auf blockchain anzeigen" #: www/views/mercadoLibre.html:26 msgid "Visit mercadolivre.com.br →" -msgstr "" +msgstr "Besuchen Sie mercadolivre.com.br →" #: www/views/walletDetails.html:182 msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." @@ -3274,7 +3348,7 @@ msgstr "Wallet-Informationen" #: www/views/addresses.html:76 msgid "Wallet Inputs" -msgstr "" +msgstr "Wallet-Inputs" #: www/views/join.html:26 msgid "Wallet Invitation" @@ -3328,7 +3402,7 @@ msgstr "Wallet exstiert bereits" #: src/js/services/profileService.js:516 msgid "Wallet already in {{appName}}" -msgstr "" +msgstr "Wallet bereits in {{appName}}" #: www/views/includes/walletActivity.html:6 msgid "Wallet created" @@ -3379,7 +3453,7 @@ msgstr "Wallet ist nicht beim Wallet-Service registiert. Neu erzeugen mit \"Neue #: www/views/backup.html:12 msgid "Wallet recovery phrase not available" -msgstr "" +msgstr "Wallet Wiederherstellungsphrase ist nicht verfügbar" #: src/js/services/bwcError.js:50 msgid "Wallet service not found" @@ -3387,7 +3461,7 @@ msgstr "Wallet-Dienst nicht gefunden" #: www/views/tab-home.html:69 msgid "Wallets" -msgstr "" +msgstr "Wallets" #: src/js/controllers/addressbookView.js:36 #: src/js/controllers/modals/txpDetails.js:153 @@ -3424,7 +3498,7 @@ msgstr "Wir sind immer auf der Suche nach Möglichkeiten um {{appName}} zu verbe #: www/views/includes/incomingDataMenu.html:6 msgid "Website" -msgstr "" +msgstr "Webseite" #: www/views/preferencesLanguage.html:16 msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." @@ -3504,11 +3578,11 @@ msgstr "Sie kontrollieren Ihre Bitcoins." #: www/views/modals/chooseFeeLevel.html:64 msgid "You should not set a fee higher than {{maxFeeRecommended}} satoshis/byte." -msgstr "" +msgstr "Sie sollten keine Gebühren welche höher als {{maxFeeRecommended}} satoshis/byte sind wählen." #: www/views/modals/bitpay-card-confirmation.html:5 msgid "You will need to log back for fill in your BitPay Card." -msgstr "" +msgstr "Sie müssen sich wieder anmelden um ihre BitPay-Karte aufzufüllen." #: www/views/preferencesNotifications.html:34 msgid "You'll receive email notifications about payments sent and received from your wallets." @@ -3516,12 +3590,12 @@ msgstr "Sie erhalten E-Mail Benachrichtigungen über gesendete und empfangen Zah #: www/views/bitpayCard.html:50 msgid "Your BitPay Card is ready. Add funds to your card to start using it at stores and ATMs worldwide." -msgstr "" +msgstr "Ihre BitPay-Karte ist bereit. Fügen sie Mittel auf Ihre Karte hinzu um diesen bei Geschäften und Geldautomaten weltweit zu benutzen." #: www/views/mercadoLibre.html:57 #: www/views/mercadoLibreCards.html:6 msgid "Your Gift Cards" -msgstr "" +msgstr "Ihre Geschenkkarten" #: www/views/includes/confirmBackupPopup.html:6 msgid "Your bitcoin wallet is backed up!" @@ -3533,7 +3607,7 @@ msgstr "Ihre Bitcoin-Wallet ist fertig!" #: www/views/modals/chooseFeeLevel.html:61 msgid "Your fee is lower than recommended." -msgstr "" +msgstr "Ihre Gebühren sind niedriger als empfohlen." #: www/views/feedback/send.html:42 msgid "Your ideas, feedback, or comments" @@ -3554,11 +3628,11 @@ msgstr "Passwort" #: www/views/buyAmazon.html:102 msgid "Your purchase could not be completed" -msgstr "" +msgstr "Ihre Bestellung konnte nicht abgeschlossen werden" #: www/views/buyAmazon.html:105 msgid "Your purchase was added to the list of pending" -msgstr "" +msgstr "Ihre Bestellung wurde in die Liste der anstehenden Bestellungen hinzugefügt" #: www/views/onboarding/backupRequest.html:10 msgid "Your wallet is never saved to cloud storage or standard device backups." @@ -3580,7 +3654,7 @@ msgstr "[Guthaben versteckt]" #: www/views/walletDetails.html:141 #: www/views/walletDetails.html:61 msgid "[Scanning Funds]" -msgstr "" +msgstr "[Mittel werden durchsucht...]" #: src/js/controllers/bitpayCardIntro.js:11 msgid "add your BitPay Visa card(s)" @@ -3604,15 +3678,15 @@ msgstr "in Arbeit..." #: www/views/cashScan.html:57 msgid "recovery tool." -msgstr "" +msgstr "Wiederherstellungstool." #: src/js/controllers/buyAmazon.js:239 msgid "{{amountStr}} for Amazon.com Gift Card" -msgstr "" +msgstr "{{amountStr}} für Amazon.com Geschenkkarte" #: src/js/controllers/buyMercadoLibre.js:237 msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" -msgstr "" +msgstr "{{amountStr}} für Mercado Livre Brazil Geschenkkarte" #: www/views/preferencesBwsUrl.html:21 msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." @@ -3624,7 +3698,7 @@ msgstr "{{fee}} wird für Bitcoin-Netzwerkgebühren abgezogen werden." #: www/views/confirm.html:85 msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" -msgstr "" +msgstr "{{tx.txp[wallet.id].feeRatePerStr}} von dem sendenden Betrag" #: www/views/walletDetails.html:218 msgid "{{updatingTxHistoryProgress}} transactions downloaded" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} Transaktionen werden heruntergeladen" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-von-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Community" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Erkunden Sie Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash Spiele" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Neuigkeiten" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Mining-Pool" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Werkzeuge" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Bitcoin Preis-Charts" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Kostenloses Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Ihre Bitcoin-Wallet ist fertig!" + diff --git a/i18n/po/es-ES/template-es-ES.po b/i18n/po/es-ES/template-es-ES.po index e062b4d1e..9338825d0 100644 --- a/i18n/po/es-ES/template-es-ES.po +++ b/i18n/po/es-ES/template-es-ES.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Spanish\n" "Language: es\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Comprar & Vender Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Comprar Bitcoin" @@ -619,10 +620,14 @@ msgstr "Conectando a Glidera..." msgid "Connection reset by peer" msgstr "Conexión re establecida" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contactos" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Direcciones frecuentes guardadas" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continuar" @@ -823,7 +828,7 @@ msgstr "Crear billetera compartida" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Crear billetera" @@ -2533,6 +2538,14 @@ msgstr "Buscar transacciones" msgid "Search or enter bitcoin address" msgstr "Buscar o introducir dirección bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Portapapeles" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Portapapeles vacío" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Buscar transacciones" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Enviar por correo electrónico" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Enviar desde" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Enviar a" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Pegar portapapeles" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Pegar dirección" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Billetera a billetera" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Escanear código QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "¡Envía Bitcoin más rápido!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "¡Envía Bitcoin más rápido!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Guardar las direcciones que usas frecuentemente y envía Bitcoin en un click" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Añadie tu primer contacto" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Tu billetera Bitcoin está vacía" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Para empezar, compra Bitcoin Cash (BCH) o Bitcoin Core (BTC), o comparte tu dirección." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Puedes recibir bitcoin desde cualquier billetera o servicio." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Comprar Bitcoin ahora" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Ver mi dirección" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Enviar la máxima cantidad" @@ -3030,7 +3104,7 @@ msgstr "Para empezar, compra bitcoin o comparte tu dirección. Puedes recibir bi #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins." +msgstr "Para empezar, necesitarás crear una billetera y obtener Bitcoins." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transacciones descargadas" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-de-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift - Cambia BTC a BCH" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Comunidad" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Reddit de Bitcoin Cash" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Twitter de Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Explora Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Juegos de Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Noticias" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Minería en la nube" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Herramientas" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Gráfica de precios Bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash gratis" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "¡Tus billeteras Bitcoin están listas!" + diff --git a/i18n/po/fa/template-fa.po b/i18n/po/fa/template-fa.po index aa4b76892..148ac9147 100644 --- a/i18n/po/fa/template-fa.po +++ b/i18n/po/fa/template-fa.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Persian\n" "Language: fa\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "خرید & فروش بیتکوین" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "خرید بیتکوین" @@ -619,10 +620,14 @@ msgstr "در حال اتصال به Glidera..." msgid "Connection reset by peer" msgstr "ریست اتصال توسط همکار" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "تماسها" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "آدرس های ذخیره شده که اغلب مورد استفاده قرار گرفته اند" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "ادامه" @@ -823,7 +828,7 @@ msgstr "ایجاد کیف پول مشترک" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "ایجاد کیف پول بیتکوین" @@ -2533,6 +2538,14 @@ msgstr "جستجوی تراکنش ها" msgid "Search or enter bitcoin address" msgstr "جستجو و یا وارد کردن آدرس بیتکوین" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "کلیپ بورد" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "کلیپ بورد شما خالی است" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "جستجوی تراکنش ها" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "ارسال توسط ایمیل" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "ارسال از" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "ارسال به" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "جای گذاری کلیپ برد" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "جای گذاری آدرس" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "انتقال پول از کیف پول به کیف پول" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "اسکن کد QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "ارسال سریع تر بیت کوین!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "ارسال سریع تر بیت کوین!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "ذخیره آدرس های اغلب استفاده شده و ارسال بیت کوین به آنها تنها با یک ضربه" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "اولین تماس خود اضافه کنید" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "کیف پول بیت کوین شما خالی است" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "برای شروع، Bitcoin Cash (BCH) یا Bitcoin Core (BTC) بخرید و یا آدرس خود را به اشتراک بگذارید." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "شما می توانید از هر کیف پول و یا خدمات بیت کوین دریافت کنید." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "برای شروع، شما نیاز دارید که یک کیف پول ایجاد کنید و مقداری بیتکوین تهیه کنید." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "خرید بیت کوین همین الان" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "نمایش آدرس من" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "ارسال حداکثر مقدار" @@ -3030,7 +3104,7 @@ msgstr "برای شروع، بیتکوین بخرید و یا آدرس خود ر #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "برای شروع، شما نیاز دارید که یک کیف پول ایجاد کنید و مقداری بیتکوین تهیه کنید." +msgstr "برای شروع، شما نیاز دارید که یک کیف پول بیت کوین ایجاد کرده و مقداری بیت کوین تهیه کنید." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} تراکنش دانلود شد" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}} از {{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "جامعه" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "توییتر Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "کاوش Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash Games" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "اخبار" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "استخر استخراج" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "ابزارها" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "نمودارهای قیمت بیت کوین" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "رایگان Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "کیف پول بیت کوین شما آماده است!" + diff --git a/i18n/po/fr/template-fr.po b/i18n/po/fr/template-fr.po index f49b0fe55..d87845d47 100644 --- a/i18n/po/fr/template-fr.po +++ b/i18n/po/fr/template-fr.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: French\n" "Language: fr\n" -"PO-Revision-Date: 2018-07-04 09:26\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -79,7 +79,7 @@ msgstr "Numéro de compte" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "Transactions instantanées à bas frais" +msgstr "Instant transactions with low fees" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Acheter & vendre des bitcoins" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Acheter des bitcoins" @@ -619,10 +620,14 @@ msgstr "Connexion à Glidera..." msgid "Connection reset by peer" msgstr "Connexion réinitialisée par un pair" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contacts" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Adresses fréquemment utilisées enregistrées" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continuer" @@ -823,7 +828,7 @@ msgstr "Créer un portefeuille partagé" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Créer un portefeuille bitcoin" @@ -993,7 +998,7 @@ msgstr "Autoriser les notifications" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "Activer le son" +msgstr "Malayu" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -2533,6 +2538,14 @@ msgstr "Rechercher des transactions" msgid "Search or enter bitcoin address" msgstr "Recherchez ou saisissez une adresse bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Presse-papiers" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Votre presse-papiers est vide" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Rechercher des transactions" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Envoyer par e-mail" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Envoyer à partir de" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Envoyer à" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Coller le contenu du presse-papiers" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Coller l'adresse" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Transfert de portefeuille à portefeuille" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Numérisez le code QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envoyez des Bitcoin plus vite !" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envoyez des Bitcoin plus vite !" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Enregistrez les adresses fréquemment utilisées et envoyez-leurs des Bitcoins en un seul geste" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Ajoutez votre premier contact" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Votre portefeuille Bitcoin est vide" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Pour commencer, achetez des Bitcoins Cash (BCH) ou des Bitcoins Core (BTC), ou partagez votre adresse." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Vous pouvez recevoir des Bitcoins de n'importe quel portefeuille ou service." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Acheter des Bitcoins maintenant" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Afficher mon adresse" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Envoyer le montant maximal" @@ -3030,7 +3104,7 @@ msgstr "Pour commencer, achetez des bitcoins ou partagez votre adresse. Vous pou #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins." +msgstr "Pour commencer, vous aurez besoin de créer un portefeuille Bitcoin et d'obtenir quelques bitcoins." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transactions téléchargées" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-sur-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Communauté" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Reddit Bitcoin Cash" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Twitter Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Explorez Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Jeux Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Nouvelles" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Coopératives de mineurs" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Outils" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Graphiques du prix du Bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash Gratuit" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Vos portefeuilles bitcoin sont prêts !" + diff --git a/i18n/po/it/template-it.po b/i18n/po/it/template-it.po index 1fcaea030..62738bf84 100644 --- a/i18n/po/it/template-it.po +++ b/i18n/po/it/template-it.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Italian\n" "Language: it\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Comprare & Vendere Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Acquista Bitcoin" @@ -619,10 +620,14 @@ msgstr "Connessione a Glidera..." msgid "Connection reset by peer" msgstr "Connessione ripristinata dall'utente" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contatti" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Indirizzi più utilizzati salvati" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continua" @@ -823,7 +828,7 @@ msgstr "Creare portafoglio condiviso" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Creare portafoglio bitcoin" @@ -2533,6 +2538,14 @@ msgstr "Cerca Transazioni" msgid "Search or enter bitcoin address" msgstr "Cerca o inserisci indirizzo bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Appunti" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Gli appunti sono vuoti" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Ricerca transazioni" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Invia via email" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Inviata Da" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Invia a" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Incolla appunti" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Incolla indirizzo" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Trasferimento da portafoglio a portafoglio" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Scansiona codice QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Invia Bitcoin più velocemente!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Invia Bitcoin più velocemente!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Salva gli indirizzi più utilizzati e invia Bitcoin con un solo tocco" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Aggiungi il tuo primo contatto" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Il tuo portafoglio Bitcoin è vuoto" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Per iniziare, acquista Bitcoin Cash (BCH) o Bitcoin Core (BTC), oppure condividi il tuo indirizzo." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Puoi ricevere Bitcoin da qualsiasi portafoglio o servizio." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Acquista subito Bitcoin" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Visualizza il mio indirizzo" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Inviare l'importo massimo" @@ -3030,7 +3104,7 @@ msgstr "Per iniziare, acquista bitcoin o condividi il tuo indirizzo. È possibil #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno." +msgstr "Per iniziare, devi creare un portafoglio bitcoin e ottenere qualche bitcoin." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transazioni scaricate" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-di-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Community" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash su Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com su Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Esplora Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Giochi Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "News" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Mining Pool" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Strumenti" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Tabella prezzi Bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash gratis" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "I tuoi portafogli Bitcoin sono pronti!" + diff --git a/i18n/po/ja/template-ja.po b/i18n/po/ja/template-ja.po index e7df99c1b..30668ce9d 100644 --- a/i18n/po/ja/template-ja.po +++ b/i18n/po/ja/template-ja.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Japanese\n" "Language: ja\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -406,7 +406,7 @@ msgstr "ビットコインは世界で
最も安全な仮想通貨。" #: www/views/preferencesFee.html:11 msgid "Bitcoin transactions include a fee collected by miners on the network." -msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる者達に送る手数料が含まれます。" +msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる方達に送る手数料が含まれます。" #: www/views/buyAmazon.html:108 msgid "Bought {{amountUnitStr}}" @@ -439,6 +439,7 @@ msgid "Buy & Sell Bitcoin" msgstr "ビットコインの購入&売却" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "ビットコインを購入" @@ -621,10 +622,14 @@ msgstr "Glidera に接続中…" msgid "Connection reset by peer" msgstr "接続がピアによってリセットされました" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "連絡先" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "よく使う保存済みのアドレス" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "続ける" @@ -825,7 +830,7 @@ msgstr "共有ウォレットを作成" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "ビットコインウォレット作成" @@ -995,7 +1000,7 @@ msgstr "プッシュ通知を有効化" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "音を有効にする" +msgstr "サウンドを有効にする" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1348,7 +1353,7 @@ msgstr "始めよう" #: www/views/addressbook.html:20 msgid "Get started by adding your first one." -msgstr "初めての連絡先を追加しましょう。" +msgstr "連絡先を追加しましょう。" #: src/js/services/onGoingProcess.js:23 msgid "Getting fee levels..." @@ -1873,7 +1878,7 @@ msgstr "バックアップは非常に重要です!" #: www/views/addressbook.html:19 msgid "No contacts yet" -msgstr "連絡先が無い" +msgstr "連絡先はありません" #: www/views/preferencesLogs.html:16 msgid "No entries for this log level" @@ -2006,7 +2011,7 @@ msgstr "今一度周りの環境をよく見てみましょう。隠しカメラ #: src/js/services/popupService.js:72 #: www/views/modals/chooseFeeLevel.html:6 msgid "OK" -msgstr "わかりました" +msgstr "OK" #: www/views/modals/tx-status.html:12 #: www/views/modals/tx-status.html:24 @@ -2535,6 +2540,14 @@ msgstr "取引を検索" msgid "Search or enter bitcoin address" msgstr "連絡先検索かビットコインアドレスを指定" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "クリップボード" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "クリップボードは空です" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "取引を検索" @@ -2593,9 +2606,70 @@ msgid "Send by email" msgstr "メールで送信" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "ここから送金" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "送金先:" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "クリップボードからペースト" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "アドレスをペースト" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "ウォレット間送金" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "QRコードを読み取る" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "ビットコイン送金をより高速に!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "ビットコイン送金をより高速に!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "よく使うアドレスを保存すればワンタップでビットコインを送金できます" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "最初の連絡先を追加" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "ビットコインウォレットが空です" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "始めるには、Bitcoin Cash (BCH) または Bitcoin Core (BTC) を購入するか、あなたのアドレスを共有してください。" + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "どのウォレットやサービスからでもビットコインを受け取ることができます。" + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "はじめに、ビットコインウォレットを作成し、ビットコインを入手する必要があります。" + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "今すぐビットコインを購入" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "自分のアドレスを表示" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "全残高を送金" @@ -3450,7 +3524,7 @@ msgstr "送金発生時のメール通知はどのメールアドレスで受け #: www/views/addresses.html:19 msgid "Why?" -msgstr "なぜ?" +msgstr "なぜですか?" #: www/views/feedback/rateApp.html:10 msgid "Would you be willing to rate {{appName}} in the app store?" @@ -3642,3 +3716,51 @@ msgstr "{{updatingTxHistoryProgress}} 個の取引ダウンロード済み" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}} の{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "コミュニティ" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Bitcoin.com を参照" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash ゲーム" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "ニュース" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "マイニングプール" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "ツール" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "ビットコインの価格チャート" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "無料 Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "ビットコインウォレットが完成しました!" + diff --git a/i18n/po/ko/template-ko.po b/i18n/po/ko/template-ko.po index cee1be7d1..6285496ae 100644 --- a/i18n/po/ko/template-ko.po +++ b/i18n/po/ko/template-ko.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Korean\n" "Language: ko\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "비트코인 구매 & 판매" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "비트코인 구매" @@ -619,10 +620,14 @@ msgstr "Glidera에 연결 중..." msgid "Connection reset by peer" msgstr "연결 실패" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "연락처" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "자주 사용하는 저장된 주소" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "계속하기" @@ -823,7 +828,7 @@ msgstr "공유 지갑 만들기" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "비트코인 지갑 만들기" @@ -2533,6 +2538,14 @@ msgstr "거래 기록 검색하기" msgid "Search or enter bitcoin address" msgstr "비트코인 주소를 찾거나 작성" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "클립보드" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "클립보드가 비어 있습니다" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "거래 기록 검색" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "이메일로 보내기" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "출처" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "보내기" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "클립보드 붙여넣기" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "주소 붙여넣기" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "지갑 간 전송" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "QR 코드 스캔" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "비트코인 속성 전송!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "비트코인 속성 전송!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "자주 사용하는 주소를 저장하고 한 번의 탭으로 저장된 주소에 비트코인 전송" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "첫 번째 연락처 추가" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "비트코인 지갑이 비어 있습니다" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "시작하려면 비트코인 캐시(BCH) 또는 비트코인 코어(BTC)를 구매하거나 주소를 공유합니다." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "지갑 또는 서비스에서 비트코인을 받을 수 있습니다." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "시작하시기 위해선 비트코인 지갑을 생성하시거나 비트코인을 구매하세요." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "지금 비트코인 구매" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "내 주소 보기" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "최대 수량 보내기" @@ -3030,7 +3104,7 @@ msgstr "시작하시려면 비트코인을 구매하시거나 주소를 등록 #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "시작하시기 위해선 비트코인 지갑을 생성하시거나 비트코인을 구매하세요." +msgstr "시작하려면 비트코인 지갑을 만들고 비트코인을 구매하십시오." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} 거래 내역 다운로드 완료" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.n}}의 {{wallet.m}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "커뮤니티" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "BCH Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com 트위터" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Bitcoin.com 탐색" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "BCH 게임" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "소식" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "채굴 풀" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "도구" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "비트코인 가격 차트" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "무료 BCH" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "비트코인 지갑이 완료되었습니다!" + diff --git a/i18n/po/nl/template-nl.po b/i18n/po/nl/template-nl.po index 754c41e21..b66d0b892 100644 --- a/i18n/po/nl/template-nl.po +++ b/i18n/po/nl/template-nl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Dutch\n" "Language: nl\n" -"PO-Revision-Date: 2018-07-04 09:26\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Koop & Verkoop Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Bitcoin kopen" @@ -619,10 +620,14 @@ msgstr "Verbinding maken met Glidera..." msgid "Connection reset by peer" msgstr "Verbinding is gereset door peer" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contactpersonen" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Opgeslagen veelgebruikte adressen" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Ga verder" @@ -823,7 +828,7 @@ msgstr "Gedeelde Portemonnee Aanmaken" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Bitcoin portemonnee aanmaken" @@ -2533,6 +2538,14 @@ msgstr "Doorzoek Transacties" msgid "Search or enter bitcoin address" msgstr "Zoeken of bitcoin adres invullen" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Klembord" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Uw klembord is leeg" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Doorzoek transacties" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Verstuur via email" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Verzenden vanuit" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Verzenden naar" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Klembord plakken" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Adres plakken" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Portemonnee overdracht" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Scan QR-code" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Stuur Bitcoin sneller!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Stuur Bitcoin sneller!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Sla veelgebruikte adressen op en verstuur ze Bitcoin met een druk op de knop" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Uw eerste contact toevoegen" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Uw Bitcoin portemonnee is leeg" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Om aan de slag te gaan, koop Bitcoin Cash (BCH) of Bitcoin Core (BTC), of deel uw adres." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "U kunt Bitcoin ontvangen van elke portemonnee of dienst." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Om aan de slag te gaan zult u een bitcoin portemonnee moeten aanmaken en wat bitcoin moeten verkrijgen." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Bitcoin kopen" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Toon mijn adres" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Verzend maximale hoeveelheid" @@ -3030,7 +3104,7 @@ msgstr "Om aan de slag te gaan, koop bitcoin of deel uw adres. U kunt bitcoin on #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Om aan de slag te gaan zult u een bitcoin portemonnee moeten aanmaken en wat bitcoin moeten verkrijgen." +msgstr "Om aan de slag te gaan, zult u een Bitcoin-portemonnee aan moeten maken en wat Bitcoin moeten verkrijgen." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transacties gedownload" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-van-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Community" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Bitcoin.com verkennen" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash spellen" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Nieuws" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Mining Pool" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Hulpmiddelen" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Bitcoin prijs grafieken" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Gratis Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Uw bitcoin portemonnee is gereed!" + diff --git a/i18n/po/pl/template-pl.po b/i18n/po/pl/template-pl.po index ce075e00b..ef9888ca5 100644 --- a/i18n/po/pl/template-pl.po +++ b/i18n/po/pl/template-pl.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Polish\n" "Language: pl\n" -"PO-Revision-Date: 2018-07-04 03:58\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -79,7 +79,7 @@ msgstr "Numer konta" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "" +msgstr "Natychmiastowe transakcje z niskimi prowizjami" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -363,12 +363,12 @@ msgstr "Adres bitcoin" #: www/views/cashScan.html:4 msgid "Bitcoin Cash (BCH) Balances" -msgstr "" +msgstr "Salda Bitcoin Cash (BCH)" #: www/views/preferencesCash.html:3 #: www/views/tab-settings.html:47 msgid "Bitcoin Cash Support" -msgstr "" +msgstr "Wsparcie Bitcoin Cash" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 @@ -384,7 +384,7 @@ msgstr "Polityka prowizji sieci bitcoin" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "" +msgstr "Portfele Bitcoin Core" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Kup & sprzedaj bitcoiny" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Kup bitcoiny" @@ -619,10 +620,14 @@ msgstr "Łączenie z Gildera..." msgid "Connection reset by peer" msgstr "Połączenie zostało zresetowane" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Kontakty" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Zapisane często używane adresy" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Dalej" @@ -823,7 +828,7 @@ msgstr "Utwórz współdzielony portfel" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Utwórz portfel bitcoin" @@ -977,7 +982,7 @@ msgstr "Puste adresy osiągnęły limit. Nowe adresy nie mogą być generowane." #: www/views/preferencesCash.html:17 msgid "Enable Bitcoin Cash wallet creation and operation within the App." -msgstr "" +msgstr "Włącz tworzenie i obsługę portfela Bitcoin Cash w aplikacji." #: www/views/tab-scan.html:19 msgid "Enable camera access in your device settings to get started." @@ -993,7 +998,7 @@ msgstr "Włącz powiadomienia" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "Włącz dźwięk" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1001,7 +1006,7 @@ msgstr "Włącz kamerę aby rozpocząć." #: www/views/tab-settings.html:49 msgid "Enabled" -msgstr "" +msgstr "Włączono" #: src/js/services/walletService.js:1047 #: src/js/services/walletService.js:1062 @@ -1586,7 +1591,7 @@ msgstr "Nieprawidłowy adres" #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "Niewystarczające potwierdzone środki" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -1931,7 +1936,7 @@ msgstr "Nie BIP44 portfel" #: www/views/cashScan.html:46 msgid "Non eligible BTC wallets" -msgstr "" +msgstr "Niewspierane portfele BTC" #: src/js/services/feeService.js:12 msgid "Normal" @@ -2004,7 +2009,7 @@ msgstr "Nadszedł czas, aby sprawdzić swoje otoczenie. Czy jesteś w pobliżu o #: src/js/services/popupService.js:72 #: www/views/modals/chooseFeeLevel.html:6 msgid "OK" -msgstr "" +msgstr "OK" #: www/views/modals/tx-status.html:12 #: www/views/modals/tx-status.html:24 @@ -2023,7 +2028,7 @@ msgstr "O nie!" #: src/js/controllers/buyMercadoLibre.js:306 msgid "Ok" -msgstr "" +msgstr "Ok" #: www/views/tab-home.html:39 msgid "On this screen you can see all your wallets, accounts, and assets." @@ -2053,7 +2058,7 @@ msgstr "Otwórz projekt GitHub" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "Otwórz Explorer" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -2069,7 +2074,7 @@ msgstr "Otwórz stronę internetową" #: src/js/controllers/preferencesCash.js:32 msgid "Open bitcoincash.org?" -msgstr "" +msgstr "Otworzyć bitcoincash.org?" #: src/js/controllers/cashScan.js:18 msgid "Open the recovery tool." @@ -2240,7 +2245,7 @@ msgstr "Proszę wybrać plik kopii zapasowej" #: www/views/bitpayCard.html:81 msgid "Pre-Auth Holds" -msgstr "" +msgstr "Wstrzymanie przedautoryzacyjne" #: www/views/tab-settings.html:40 msgid "Preferences" @@ -2353,7 +2358,7 @@ msgstr "Otrzymaj" #: www/views/customAmount.html:44 msgid "Receive in" -msgstr "" +msgstr "Otrzymaj w" #: www/views/includes/walletHistory.html:24 #: www/views/tx-details.html:18 @@ -2511,7 +2516,7 @@ msgstr "Proszę zeskanować linie papilarne" #: www/views/preferencesCash.html:23 msgid "Scan your wallets for Bitcoin Cash" -msgstr "" +msgstr "Skanuj portfele w poszukiwaniu Bitcoin Cash" #: src/js/services/onGoingProcess.js:30 msgid "Scanning Wallet funds..." @@ -2533,6 +2538,14 @@ msgstr "Szukaj transakcji" msgid "Search or enter bitcoin address" msgstr "Wyszukaj lub wpisz adres bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Schowek" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Schowek jest pusty" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Szukaj transakcji" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Wyślij przez e-mail" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Wyślij z" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Wyślij do" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Wklej ze schowka" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Wklej adres" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Transfer z portfela do portfela" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Zeskanuj kod QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Przesyłaj Bitcoiny szybciej!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Przesyłaj Bitcoiny szybciej!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Zapisz często używane adresy i wyślij im Bitcoin za pomocą jednego dotknięcia" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Dodaj swój pierwszy kontakt" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Twój portfel jest pusty" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Aby zacząć, kup Bitcoin Cash (BCH) lub Bitcoin Core (BTC), albo udostępnij swój adres." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Bitcoiny można odbierać z dowolnego portfela lub usługi." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Kup Bitcoin teraz" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Pokaż mój adres" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Wyślij całą kwotę" @@ -2764,7 +2838,7 @@ msgstr "Przesuń, aby wysłać" #: www/views/cashScan.html:56 msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the" -msgstr "" +msgstr "Niektóre z twoich portfeli nie kwalifikują się do wsparcia Bitcoin Cash. Dostęp do środków BCH z tych portfeli można spróbować uzyskać, korzystając z" #: src/js/controllers/create.js:88 #: src/js/controllers/join.js:71 @@ -2785,7 +2859,7 @@ msgstr "Wymagane hasło wypłat" #: www/views/walletDetails.html:173 msgid "Spending this balance will need significant Bitcoin network fees" -msgstr "" +msgstr "Wydanie tego salda będzie wymagało znacznych opłat sieciowych Bitcoin" #: www/views/tab-send.html:28 msgid "Start sending bitcoin" @@ -2810,7 +2884,7 @@ msgstr "Super Ekonomiczna" #: www/views/preferencesCash.html:11 msgid "Support Bitcoin Cash" -msgstr "" +msgstr "Wsparcie Bitcoin Cash" #: www/views/paperWallet.html:7 msgid "Sweep" @@ -2860,7 +2934,7 @@ msgstr "Warunki użytkowania" #: www/views/tab-create-personal.html:118 #: www/views/tab-import-phrase.html:68 msgid "Testnet" -msgstr "" +msgstr "Testnet" #: www/views/includes/incomingDataMenu.html:61 msgid "Text" @@ -2999,7 +3073,7 @@ msgstr "Ta kluczowa fraza został utworzona przy użyciu hasła. Aby odzyskać p #: www/views/tx-details.html:91 msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself." -msgstr "" +msgstr "Ta kwota transakcji jest zbyt mała w porównaniu z obecnymi opłatami sieci Bitcoin. Wydanie tych środków będzie wymagało opłaty sieciowej Bitcoin, która jest porównywalna do kosztów samych funduszy." #: www/views/tx-details.html:87 msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender" @@ -3034,15 +3108,15 @@ msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" -msgstr "" +msgstr "Aby móc wykonać czynność {{reason}}, musisz przedtem dodać swoje konto BitPay – {{email}}" #: src/js/services/onGoingProcess.js:48 msgid "Top up in progress..." -msgstr "" +msgstr "Doładowanie w trakcie..." #: src/js/controllers/topup.js:206 msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})" -msgstr "" +msgstr "Doładuj o {{amountStr}} kartę debetową ({{cardLastNumber}})" #: www/views/buyAmazon.html:61 #: www/views/buyMercadoLibre.html:60 @@ -3061,7 +3135,7 @@ msgstr "Liczba współwłaścicieli portfela" #: www/views/addresses.html:81 msgid "Total wallet inputs" -msgstr "" +msgstr "Dane wejściowe portfela łącznie" #: src/js/services/fingerprintService.js:63 #: src/js/services/fingerprintService.js:68 @@ -3200,7 +3274,7 @@ msgstr "Zobacz zasady użytkowania" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "Zobacz transakcję na Explorer.Bitcoin.com" #: src/js/controllers/tab-home.js:148 msgid "View Update" @@ -3212,7 +3286,7 @@ msgstr "Zobacz na blockchainie" #: www/views/mercadoLibre.html:26 msgid "Visit mercadolivre.com.br →" -msgstr "" +msgstr "Odwiedź mercadolivre.com.br →" #: www/views/walletDetails.html:182 msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." @@ -3274,7 +3348,7 @@ msgstr "Informacje o portfelu" #: www/views/addresses.html:76 msgid "Wallet Inputs" -msgstr "" +msgstr "Dane wejściowe portfela" #: www/views/join.html:26 msgid "Wallet Invitation" @@ -3328,7 +3402,7 @@ msgstr "Portfel już istnieje" #: src/js/services/profileService.js:516 msgid "Wallet already in {{appName}}" -msgstr "" +msgstr "Portfel już w aplikacji {{appName}}" #: www/views/includes/walletActivity.html:6 msgid "Wallet created" @@ -3508,7 +3582,7 @@ msgstr "Nie należy ustawiać opłatę wyższą niż {{maxFeeRecommended}} satos #: www/views/modals/bitpay-card-confirmation.html:5 msgid "You will need to log back for fill in your BitPay Card." -msgstr "" +msgstr "Musisz zalogować się ponownie, aby wypełnić swoją kartę BitPay." #: www/views/preferencesNotifications.html:34 msgid "You'll receive email notifications about payments sent and received from your wallets." @@ -3580,7 +3654,7 @@ msgstr "[Balans ukryty]" #: www/views/walletDetails.html:141 #: www/views/walletDetails.html:61 msgid "[Scanning Funds]" -msgstr "" +msgstr "[Skanowanie środków]" #: src/js/controllers/bitpayCardIntro.js:11 msgid "add your BitPay Visa card(s)" @@ -3612,7 +3686,7 @@ msgstr "{{amountStr}} dla karty upominkowej Amazon.com" #: src/js/controllers/buyMercadoLibre.js:237 msgid "{{amountStr}} for Mercado Livre Brazil Gift Card" -msgstr "" +msgstr "{{amountStr}} na karcie podarunkowej Mercado Livre Brazil" #: www/views/preferencesBwsUrl.html:21 msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)." @@ -3624,7 +3698,7 @@ msgstr "{{fee}} zostanie potrącone jako prowizja sieci bitcoin." #: www/views/confirm.html:85 msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount" -msgstr "" +msgstr "{{tx.txp[wallet.id].feeRatePerStr}} wysyłanej kwoty" #: www/views/walletDetails.html:218 msgid "{{updatingTxHistoryProgress}} transactions downloaded" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transakcje pobrane" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-z-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Społeczność" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Reddit Bitcoin Cash" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Twitter Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Poznaj Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Gry Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Aktualności" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Pula kopalni" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Narzędzia" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Wykresy kursu Bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Darmowa Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Twoje portfele Bitcoin są gotowe!" + diff --git a/i18n/po/pt-BR/template-pt-BR.po b/i18n/po/pt-BR/template-pt-BR.po index c83259bf9..6879b52c4 100644 --- a/i18n/po/pt-BR/template-pt-BR.po +++ b/i18n/po/pt-BR/template-pt-BR.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Comprar & Vender Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Comprar Bitcoin" @@ -619,10 +620,14 @@ msgstr "A conectar ao Glidera..." msgid "Connection reset by peer" msgstr "Ligação redefinida pelo mesmo nível" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Contactos" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Salvou os endereços usados com frequência" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continuar" @@ -823,7 +828,7 @@ msgstr "Criar carteira partilhada" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Criar carteira bitcoin" @@ -2533,6 +2538,14 @@ msgstr "Procurar transações" msgid "Search or enter bitcoin address" msgstr "Procure ou digite o endereço bitcoin" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Área de transferência" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "A sua área de transferência está vazia" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Procurar transações" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Enviar por E-mail" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Enviar De" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Enviar para" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Colar na área de trabalho" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Colar endereço" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Transferência de carteira para carteira" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Digitalizar o código QR" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envie Bitcoin mais rápido!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Envie Bitcoin mais rápido!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Salvar endereços usados com frequência e enviar Bitcoin com apenas um toque" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Adicionar o seu primeiro contato" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Sua carteira de Bitcoin está vazia" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Para começar, compre Bitcoin Cash (BCH) ou Bitcoin Core (BTC) ou compartilhe o seu endereço." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Você pode receber bitcoin de qualquer carteira ou serviço." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Compre Bitcoin agora" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Mostrar meu endereço" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Quantidade Máxima de envio" @@ -3030,7 +3104,7 @@ msgstr "Para começar, compre bitcoins ou compartilhe seu endereço. Você pode #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins." +msgstr "Para começar, você precisará criar uma carteira e obter algum bitcoin." #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3636,3 +3710,51 @@ msgstr "Transações de {{updatingTxHistoryProgress}} transferidas" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-de-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Comunidade" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Twitter Bitcoin.com" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Explore Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Jogos Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Notícias" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Pool de mineração" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Ferramentas" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Gráficos de preço do Bitcoin" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash grátis" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "As suas carteiras de Bitcoin estão prontas!" + diff --git a/i18n/po/ru/template-ru.po b/i18n/po/ru/template-ru.po index 074fa9937..a9d5d2970 100644 --- a/i18n/po/ru/template-ru.po +++ b/i18n/po/ru/template-ru.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Russian\n" "Language: ru\n" -"PO-Revision-Date: 2018-07-04 09:27\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -79,7 +79,7 @@ msgstr "Номер учётной записи" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "Мгновенные транзакции с низкой оплатой" +msgstr "Мгновенные транзакции с низкой комиссией" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "Купить & продать биткойн" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "Купить биткойн" @@ -619,10 +620,14 @@ msgstr "Подключение к Glidera..." msgid "Connection reset by peer" msgstr "Соединение сброшено другой стороной" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "Контакты" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Сохраненные часто используемые адреса" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Продолжить" @@ -823,7 +828,7 @@ msgstr "Создать общий кошелёк" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "Создать биткойн-кошелёк" @@ -2533,6 +2538,14 @@ msgstr "Поиск транзакций" msgid "Search or enter bitcoin address" msgstr "Найти или ввести биткойн-адрес" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "Буфер обмена" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "Буфер обмена пуст" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "Поиск транзакций" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "Отправить на email" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "Отправить от" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "Получатель" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "Вставить из буфера обмена" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "Вставить адрес" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "Перевод с кошелька на кошелек" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "Сканировать QR код" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Отправляйте биткойны еще быстрее!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "Отправляйте биткойны еще быстрее!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "Сохраняйте часто используемые адреса кошельков и отправляйте на них биткойны одним нажатием" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "Добавить первый контакт" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "Ваш кошелёк пуст" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "Чтобы начать работу, купите Bitcoin Cash (BCH) или Bitcoin Core (BTC), или поделитесь вашим адресом." + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "Вы можете получать биткойны с любого кошелька или сервиса." + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Чтобы начать работу, вам нужно создать кошелёк и получить биткойн." + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "Купить биткойны сейчас" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "Показать мой адрес" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "Отправить макс. сумму" @@ -3636,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} транзакций загружено" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}-из-{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "Сообщество" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "Обзор Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Игры Bitcoin Cash" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "Новости" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "Пул для майнинга" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "Инструменты" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "Динамика курса биткойна" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "Bitcoin Cash бесплатно" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "Ваши кошельки готовы!" + diff --git a/i18n/po/sv-SE/template-sv-SE.po b/i18n/po/sv-SE/template-sv-SE.po index bc496d6d5..7ffdda946 100644 --- a/i18n/po/sv-SE/template-sv-SE.po +++ b/i18n/po/sv-SE/template-sv-SE.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Swedish\n" "Language: sv\n" -"PO-Revision-Date: 2018-07-04 03:58\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "" @@ -619,10 +620,14 @@ msgstr "" msgid "Connection reset by peer" msgstr "" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "" @@ -823,7 +828,7 @@ msgstr "" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "" @@ -2533,6 +2538,14 @@ msgstr "" msgid "Search or enter bitcoin address" msgstr "" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "" + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "" + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "" + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "" @@ -3636,3 +3710,51 @@ msgstr "" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "" + diff --git a/i18n/po/vi/template-vi.po b/i18n/po/vi/template-vi.po index d965b6ee8..ef9db2029 100644 --- a/i18n/po/vi/template-vi.po +++ b/i18n/po/vi/template-vi.po @@ -11,11 +11,11 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Vietnamese\n" "Language: vi\n" -"PO-Revision-Date: 2018-07-04 03:58\n" +"PO-Revision-Date: 2018-07-27 08:44\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" -msgstr "(Đáng tin cậy)" +msgstr "(Tin cậy)" #: www/views/includes/txp.html:23 #: www/views/includes/walletHistory.html:64 @@ -28,7 +28,7 @@ msgstr "* A payment proposal can be deleted if 1) you are the creator, and no ot #: www/views/tx-details.html:82 msgid "- {{btx.feeRateStr}} of the transaction" -msgstr "{{btx.feeRateStr}} của giao dịch" +msgstr "- {{btx.feeRateStr}} of the transaction" #: www/views/modals/txp-details.html:102 msgid "- {{tx.feeRateStr}} of the transaction" @@ -41,7 +41,9 @@ msgstr "Xếp hạng 5 sao giúp chúng tôi để {{appName}} đến tay nhiề #: www/views/mercadoLibre.html:18 #: www/views/mercadoLibre.html:40 msgid "Only redeemable on Mercado Livre (Brazil)" -msgstr "Only redeemable on Mercado Livre (Brazil)" +msgstr "Only redeemable on \n" +"Mercado Livre (Brazil) #\n\n" +"2" #: src/js/controllers/feedback/send.js:27 #: www/views/feedback/complete.html:21 @@ -54,7 +56,8 @@ msgstr "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size all #: src/js/controllers/confirm.js:395 msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." +msgstr "Tổng cộng {{amountBelowFeeStr}} đã bị loại trừ. Số tiền này đến từ UTXOs nhỏ hơn chi phí mạng cung cấp.#\n" +"1" #: src/js/controllers/preferencesAbout.js:6 #: www/views/tab-settings.html:156 @@ -79,7 +82,7 @@ msgstr "Account Number" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "" +msgstr "2" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -124,338 +127,339 @@ msgstr "Add account" #: www/views/tab-create-personal.html:62 #: www/views/tab-create-shared.html:91 msgid "Add an optional password to secure the recovery phrase" -msgstr "" +msgstr "Add a password option to allow a secure cluster" #: www/views/includes/incomingDataMenu.html:41 msgid "Add as a contact" -msgstr "" +msgstr "Thêm như một liên hệ" #: src/js/controllers/confirm.js:424 msgid "Add description" -msgstr "" +msgstr "Thêm mô tả" #: www/views/topup.html:6 msgid "Add funds" -msgstr "" +msgstr "Nạp tiền" #: src/js/services/bitpayAccountService.js:78 msgid "Add this BitPay account ({{email}})?" -msgstr "" +msgstr "Thêm BitPay ({{email}}) tài khoản này?" #: www/views/add.html:3 msgid "Add wallet" -msgstr "" +msgstr "Thêm ví" #: www/views/addressbook.view.html:26 #: www/views/customAmount.html:28 #: www/views/modals/paypro.html:24 msgid "Address" -msgstr "" +msgstr "Địa chỉ" #: www/views/addressbook.html:6 #: www/views/tab-settings.html:13 msgid "Address Book" -msgstr "" +msgstr "Sổ địa chỉ" #: www/views/preferencesInformation.html:41 msgid "Address Type" -msgstr "" +msgstr "Loại địa chỉ" #: www/views/addresses.html:64 msgid "Addresses With Balance" -msgstr "" +msgstr "Địa chỉ với số dư" #: www/views/tab-settings.html:149 msgid "Advanced" -msgstr "" +msgstr "Nâng cao" #: www/views/advancedSettings.html:3 msgid "Advanced Settings" -msgstr "" +msgstr "Cài đặt nâng cao" #: www/views/bitpayCard.html:62 msgid "All" -msgstr "" +msgstr "Tất cả" #: www/views/allAddresses.html:3 msgid "All Addresses" -msgstr "" +msgstr "Tất cả địa chỉ" #: www/views/modals/wallet-balance.html:18 msgid "All of your bitcoin wallet balance may not be available for immediate spending." -msgstr "" +msgstr "Tất cả số dư ví bitcoin của bạn có thể không có sẵn cho chi tiêu ngay lập tức." #: www/views/tab-receive.html:25 msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." -msgstr "" +msgstr "All contract device will be added to this multisig before the bitcoin address has been created." #: www/views/tab-scan.html:21 msgid "Allow Camera Access" -msgstr "" +msgstr "Allow camera access" #: www/views/onboarding/notifications.html:7 msgid "Allow notifications" -msgstr "" +msgstr "Allow notification" #: www/views/onboarding/disclaimer.html:14 msgid "Almost done! Let's review." -msgstr "" +msgstr "Most as completed! We see review." #: www/views/preferencesAltCurrency.html:4 #: www/views/tab-settings.html:79 msgid "Alternative Currency" -msgstr "" +msgstr "Money Currency instead" #: src/js/controllers/buyAmazon.js:98 msgid "Amazon.com is not available at this moment. Please try back later." -msgstr "" +msgstr "Amazon.com is not available at this time. Please try again again." #: www/views/amount.html:44 #: www/views/customAmount.html:34 #: www/views/includes/output.html:7 msgid "Amount" -msgstr "" +msgstr "Quantity" #: src/js/services/bwcError.js:110 msgid "Amount below minimum allowed" -msgstr "" +msgstr "Maximum amount of the minimum amount" #: src/js/controllers/confirm.js:216 msgid "Amount too big" -msgstr "" +msgstr "Amount too large" #: www/views/includes/walletHistory.html:31 msgid "Amount too low to spend" -msgstr "" +msgstr "Amount too low for standard" #: src/js/controllers/tab-home.js:147 msgid "An update to this app is available. For your security, please update to the latest version." -msgstr "" +msgstr "Hotel have a Update for this application. To preserve your password, please please update the latest version." #: www/views/backupWarning.html:14 msgid "Anyone with your backup phrase can access or spend your bitcoin." -msgstr "" +msgstr "Każdy, kto ma Twoją kluczową là một trong những điều tuyệt vời nhất." #: www/views/addresses.html:94 msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)" -msgstr "" +msgstr "La taxa approssimativa della rete Bitcoin cho mỗi lần gửi tiền theo yêu cầu của bạn" #: www/views/backupWarning.html:10 msgid "Are you being watched?" -msgstr "" +msgstr "Chúng tôi vigilen?" #: src/js/controllers/preferencesExternal.js:15 msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin." -msgstr "" +msgstr "You are tracking? Bất cứ ai có thể phục hồi từ bạn, bạn có thể truy cập hoặc bitcoin chi tiêu của bạn." #: src/js/controllers/copayers.js:56 msgid "Are you sure you want to cancel and delete this wallet?" -msgstr "" +msgstr "Are you sure you want to cancel and remove this video?" #: src/js/controllers/addressbookView.js:37 msgid "Are you sure you want to delete this contact?" -msgstr "" +msgstr "Bạn có chắc chắn muốn xóa địa chỉ liên hệ này không?" #: src/js/controllers/preferencesDelete.js:25 msgid "Are you sure you want to delete this wallet?" -msgstr "" +msgstr "Are you sure you want to delete this wallet?" #: src/js/controllers/modals/txpDetails.js:154 msgid "Are you sure you want to reject this transaction?" -msgstr "" +msgstr "Are you sure you want to reject this transaction?" #: src/js/controllers/modals/txpDetails.js:171 msgid "Are you sure you want to remove this transaction?" -msgstr "" +msgstr "Are you sure you want to remove this transaction?" #: src/js/controllers/onboarding/backupRequest.js:23 msgid "Are you sure you want to skip it?" -msgstr "" +msgstr "Are you sure you want to skip it?" #: www/views/modals/bitpay-card-confirmation.html:4 msgid "Are you sure you would like to log out of your BitPay Card account?" -msgstr "" +msgstr "Bạn có chắc chắn muốn đăng xuất khỏi tài khoản Thẻ BitPay của mình không?" #: src/js/controllers/preferencesBitpayCard.js:7 #: src/js/controllers/preferencesBitpayServices.js:20 msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" -msgstr "" +msgstr "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?" #: www/views/includes/walletInfo.html:10 msgid "Auditable" -msgstr "" +msgstr "Auditable" #: www/views/modals/wallet-balance.html:42 msgid "Available" -msgstr "" +msgstr "Available" #: www/views/includes/available-balance.html:3 msgid "Available Balance" -msgstr "" +msgstr "Available Balance" #: www/views/modals/chooseFeeLevel.html:24 #: www/views/preferencesFee.html:15 msgid "Average confirmation time" -msgstr "" +msgstr "Average confirmation time" #: www/views/join.html:143 #: www/views/tab-create-personal.html:113 #: www/views/tab-create-shared.html:142 #: www/views/tab-import-phrase.html:51 msgid "BIP32 path for address derivation" -msgstr "" +msgstr "Đường dẫn BIP32 cho dẫn xuất địa chỉ" #: www/views/cashScan.html:25 msgid "BTC wallets" -msgstr "" +msgstr "Ví BTC" #: www/views/preferences.html:34 msgid "Backup" -msgstr "" +msgstr "Backup" #: www/views/includes/backupNeededPopup.html:7 msgid "Backup Needed" -msgstr "" +msgstr "Backup Needed" #: src/js/controllers/lockSetup.js:87 msgid "Backup all livenet wallets before using this function" -msgstr "" +msgstr "Backup all livenet wallets before using this function" #: src/js/controllers/cashScan.js:64 #: www/views/includes/walletListSettings.html:12 #: www/views/preferences.html:36 msgid "Backup needed" -msgstr "" +msgstr "Cần sao lưu" #: www/views/includes/backupNeededPopup.html:9 msgid "Backup now" -msgstr "" +msgstr "Sao lưu ngay" #: www/views/onboarding/backupRequest.html:11 #: www/views/tab-export-file.html:89 msgid "Backup wallet" -msgstr "" +msgstr "Backup wallet" #: src/js/controllers/lockSetup.js:84 msgid "Backup your wallet before using this function" -msgstr "" +msgstr "Backup your wallet before using this function" #: src/js/services/profileService.js:446 msgid "Bad wallet invitation" -msgstr "" +msgstr "Bad wallet invitation" #: www/views/preferencesInformation.html:102 msgid "Balance By Address" -msgstr "" +msgstr "Balance By Address" #: www/views/includes/confirmBackupPopup.html:7 msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." -msgstr "" +msgstr "Hãy chắc chắn lưu trữ cụm từ khôi phục của bạn ở một nơi an toàn. Nếu ứng dụng này bị xóa, tiền của bạn không thể được phục hồi mà không có nó." #: www/views/preferencesBitpayServices.html:9 msgid "BitPay Visa® Cards" -msgstr "" +msgstr "BitPay Visa & reg; thẻ" #: www/views/addressbook.add.html:38 #: www/views/includes/incomingDataMenu.html:29 msgid "Bitcoin Address" -msgstr "" +msgstr "Bitcoin Address" #: www/views/cashScan.html:4 msgid "Bitcoin Cash (BCH) Balances" -msgstr "" +msgstr "Bitcoin Cash (BCH) Balances" #: www/views/preferencesCash.html:3 #: www/views/tab-settings.html:47 msgid "Bitcoin Cash Support" -msgstr "" +msgstr "Bitcoin Cash Support" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 msgid "Bitcoin Cash Wallets" -msgstr "" +msgstr "Bitcoin Cash Wallets" #: www/views/modals/chooseFeeLevel.html:4 #: www/views/preferencesFee.html:4 #: www/views/tab-settings.html:90 msgid "Bitcoin Network Fee Policy" -msgstr "" +msgstr "Bitcoin Network Fee Policy" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "" +msgstr "Bitcoin Core Wallets" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" -msgstr "" +msgstr "Bitcoin cash Payment" #: www/views/onboarding/tour.html:31 msgid "Bitcoin is a currency." -msgstr "" +msgstr "Bitcoin is a currency." #: www/views/onboarding/disclaimer.html:15 msgid "Bitcoin is different – it cannot be safely held with a bank or web service." -msgstr "" +msgstr "–." #: www/views/onboarding/tour.html:18 msgid "Bitcoin is secure,
digital money." -msgstr "" +msgstr "Bitcoin là an toàn,
tiền kỹ thuật số." #: www/views/preferencesFee.html:11 msgid "Bitcoin transactions include a fee collected by miners on the network." -msgstr "" +msgstr "Bitcoin transactions include a fee collected by miners on the network." #: www/views/buyAmazon.html:108 msgid "Bought {{amountUnitStr}}" -msgstr "" +msgstr "Bought {{amountUnitStr}}" #: www/views/modals/txp-details.html:36 msgid "Broadcast Payment" -msgstr "" +msgstr "Broadcast Payment" #: src/js/controllers/modals/txpDetails.js:64 #: src/js/controllers/tx-details.js:81 msgid "Broadcasted" -msgstr "" +msgstr "Broadcasted" #: src/js/services/onGoingProcess.js:11 msgid "Broadcasting transaction" -msgstr "" +msgstr "Broadcasting transaction" #: www/views/unsupported.html:6 msgid "Browser unsupported" -msgstr "" +msgstr "Browser unsupported" #: www/views/buyAmazon.html:5 #: www/views/buyMercadoLibre.html:6 msgid "Buy" -msgstr "" +msgstr "Buy" #: www/views/includes/buyAndSellCard.html:3 msgid "Buy & Sell Bitcoin" -msgstr "" +msgstr "Buy & Sell Bitcoin" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" -msgstr "" +msgstr "Buy Bitcoin" #: www/views/mercadoLibre.html:22 #: www/views/mercadoLibre.html:50 msgid "Buy a Gift Card" -msgstr "" +msgstr "Buy a Gift Card" #: src/js/controllers/buyAmazon.js:334 msgid "Buy from" -msgstr "" +msgstr "Buy from" #: src/js/services/onGoingProcess.js:40 msgid "Buying Bitcoin..." -msgstr "" +msgstr "Mua Bitcoin..." #: src/js/services/onGoingProcess.js:12 msgid "Calculating fee" -msgstr "" +msgstr "Phí tính toán" #: src/js/controllers/buyAmazon.js:313 #: src/js/controllers/buyMercadoLibre.js:307 @@ -474,65 +478,65 @@ msgstr "" #: www/views/modals/bitpay-card-confirmation.html:8 #: www/views/modals/confirmation.html:13 msgid "Cancel" -msgstr "" +msgstr "Hủy bỏ" #: www/views/copayers.html:36 msgid "Cancel invitation" -msgstr "" +msgstr "Hủy lời mời" #: src/js/controllers/onboarding/tour.js:52 msgid "Cannot Create Wallet" -msgstr "" +msgstr "Không thể tạo Wallet" #: src/js/services/profileService.js:442 msgid "Cannot join the same wallet more that once" -msgstr "" +msgstr "Cannot join the same wallet more that once" #: www/views/includes/bitpayCardsCard.html:2 msgid "Cards" -msgstr "" +msgstr "Cards" #: www/views/modals/paypro.html:30 msgid "Certified by" -msgstr "" +msgstr "Certified by" #: www/views/preferencesExternal.html:19 msgid "Check installation and retry." -msgstr "" +msgstr "Check installation and retry." #: www/views/tab-import-file.html:4 msgid "Choose a backup file from your computer" -msgstr "" +msgstr "Chọn tệp sao lưu từ máy tính của bạn" #: www/views/modals/wallets.html:9 msgid "Choose your destination wallet" -msgstr "" +msgstr "Choose your destination wallet" #: www/views/modals/wallets.html:10 msgid "Choose your source wallet" -msgstr "" +msgstr "Chọn ví nguồn của bạn" #: www/views/backup.html:61 msgid "Clear" -msgstr "" +msgstr "Clear" #: www/views/preferencesHistory.html:24 msgid "Clear cache" -msgstr "" +msgstr "Clear cache" #: src/js/controllers/confirm.js:373 #: src/js/controllers/modals/txpDetails.js:49 msgid "Click to accept" -msgstr "" +msgstr "Click to accept" #: src/js/controllers/confirm.js:367 msgid "Click to pay" -msgstr "" +msgstr "Click to pay" #: src/js/controllers/confirm.js:379 #: src/js/controllers/modals/txpDetails.js:42 msgid "Click to send" -msgstr "" +msgstr "Click to send" #: www/views/customAmount.html:4 #: www/views/modals/mercadolibre-card-details.html:3 @@ -542,28 +546,28 @@ msgstr "" #: www/views/modals/wallet-balance.html:3 #: www/views/modals/wallets.html:5 msgid "Close" -msgstr "" +msgstr "Close" #: www/views/includes/cash.html:2 #: www/views/preferencesInformation.html:17 msgid "Coin" -msgstr "" +msgstr "Coin" #: www/views/preferences.html:22 msgid "Color" -msgstr "" +msgstr "Màu" #: www/views/preferencesAbout.html:21 msgid "Commit hash" -msgstr "" +msgstr "Commit hash" #: www/views/preferences.html:49 msgid "Complete the backup process to use this option" -msgstr "" +msgstr "Complete the backup process to use this option" #: www/views/bitpayCard.html:93 msgid "Completed" -msgstr "" +msgstr "Completed" #: src/js/controllers/buyAmazon.js:311 #: src/js/controllers/buyMercadoLibre.js:305 @@ -575,95 +579,99 @@ msgstr "" #: www/views/confirm.html:4 #: www/views/onboarding/collectEmail.html:32 msgid "Confirm" -msgstr "" +msgstr "Confirm" #: www/views/modals/terms.html:26 #: www/views/onboarding/disclaimer.html:44 msgid "Confirm & Finish" -msgstr "" +msgstr "Confirm & Finish" #: www/views/buyAmazon.html:90 msgid "Confirm purchase" -msgstr "" +msgstr "Confirm purchase" #: www/views/modals/pin.html:10 msgid "Confirm your PIN" -msgstr "" +msgstr "Confirm your PIN" #: src/js/services/walletService.js:1033 msgid "Confirm your new spending password" -msgstr "" +msgstr "Confirm your new spending password" #: www/views/tx-details.html:98 msgid "Confirmations" -msgstr "" +msgstr "Confirmations" #: www/views/bitpayCard.html:68 #: www/views/modals/wallet-balance.html:61 msgid "Confirming" -msgstr "" +msgstr "Xác nhận" #: www/views/bitpayCardIntro.html:37 msgid "Connect my BitPay Card" -msgstr "" +msgstr "Kết nối thẻ BitPay của tôi" #: src/js/services/onGoingProcess.js:13 msgid "Connecting to Coinbase..." -msgstr "" +msgstr "Connecting to Coinbase..." #: src/js/services/onGoingProcess.js:14 msgid "Connecting to Glidera..." -msgstr "" +msgstr "Đang kết nối với Glidera ..." #: src/js/services/bwcError.js:53 msgid "Connection reset by peer" -msgstr "" +msgstr "Đặt lại kết nối theo ngang hàng" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" -msgstr "" +msgstr "Contacts" + +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "Save the regular usage" #: www/views/onboarding/notifications.html:9 msgid "Continue" -msgstr "" +msgstr "Continue" #: www/views/preferencesLanguage.html:26 msgid "Contribute Translations" -msgstr "" +msgstr "Contribute Translations" #: src/js/controllers/confirm.js:130 msgid "Copay only supports Bitcoin Cash using new version numbers addresses" -msgstr "" +msgstr "Copay chỉ hỗ trợ Bitcoin Cash bằng cách sử dụng số phiên bản mới" #: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" -msgstr "" +msgstr "Copayer already in this wallet" #: src/js/services/bwcError.js:77 msgid "Copayer already voted on this spend proposal" -msgstr "" +msgstr "Coper is this option" #: src/js/services/bwcError.js:107 msgid "Copayer data mismatch" -msgstr "" +msgstr "Dữ liệu Copayer không khớp" #: www/views/includes/walletActivity.html:2 msgid "Copayer joined" -msgstr "" +msgstr "Copayer joined" #: www/views/preferencesInformation.html:94 msgid "Copayer {{$index}}" -msgstr "" +msgstr "Copayer {{$index}}" #: src/js/controllers/copayers.js:79 #: src/js/controllers/export.js:193 #: www/views/includes/copyToClipboard.html:4 msgid "Copied to clipboard" -msgstr "" +msgstr "Sao chép vào clipboard" #: www/views/tab-export-file.html:94 msgid "Copy this text as it is to a safe place (notepad or email)" -msgstr "" +msgstr "Copy this text as it is to a safe place (notepad or email)" #: www/views/includes/incomingDataMenu.html:51 #: www/views/includes/incomingDataMenu.html:70 @@ -671,35 +679,35 @@ msgstr "" #: www/views/includes/logOptions.html:9 #: www/views/tab-export-file.html:78 msgid "Copy to clipboard" -msgstr "" +msgstr "Sao chép vào clipboard" #: src/js/controllers/buyMercadoLibre.js:102 msgid "Could not access Gift Card Service" -msgstr "" +msgstr "Could not access Gift Card Service" #: www/views/tab-import-phrase.html:2 msgid "Could not access the wallet at the server. Please check:" -msgstr "" +msgstr "Could not access the wallet at the server. Please check:" #: src/js/controllers/buyAmazon.js:102 msgid "Could not access to Amazon.com" -msgstr "" +msgstr "Could not access to Amazon.com" #: src/js/services/profileService.js:511 msgid "Could not access wallet" -msgstr "" +msgstr "Could not access wallet" #: src/js/controllers/confirm.js:210 msgid "Could not add message to imported wallet without shared encrypting key" -msgstr "" +msgstr "Could not add message to imported wallet without shared encrypting key" #: src/js/controllers/modals/txpDetails.js:199 msgid "Could not broadcast payment" -msgstr "" +msgstr "Could not broadcast payment" #: src/js/services/bwcError.js:41 msgid "Could not build transaction" -msgstr "" +msgstr "Cannot build transaction" #: src/js/services/walletService.js:854 msgid "Could not create address" @@ -823,7 +831,7 @@ msgstr "" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "" @@ -916,7 +924,7 @@ msgstr "" #: www/views/modals/mercadolibre-card-details.html:6 #: www/views/topup.html:45 msgid "Details" -msgstr "" +msgstr "Chi tiết" #: src/js/controllers/lockSetup.js:9 #: src/js/controllers/tab-settings.js:65 @@ -2533,6 +2541,14 @@ msgstr "" msgid "Search or enter bitcoin address" msgstr "" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "" @@ -2591,9 +2607,70 @@ msgid "Send by email" msgstr "" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "" + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "" + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "" + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "" @@ -3636,3 +3713,51 @@ msgstr "" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "" + diff --git a/i18n/po/zh-CN/template-zh-CN.po b/i18n/po/zh-CN/template-zh-CN.po index 8c274b798..eb8304e89 100644 --- a/i18n/po/zh-CN/template-zh-CN.po +++ b/i18n/po/zh-CN/template-zh-CN.po @@ -11,7 +11,7 @@ msgstr "" "Last-Translator: emilold\n" "Language-Team: Chinese Simplified\n" "Language: zh\n" -"PO-Revision-Date: 2018-07-04 03:57\n" +"PO-Revision-Date: 2018-07-27 08:43\n" #: www/views/modals/paypro.html:34 msgid "(Trusted)" @@ -79,7 +79,7 @@ msgstr "帐号" #: www/views/tab-home.html:61 msgid "Instant transactions with low fees" -msgstr "" +msgstr "以较低费用进行即时交易" #: www/views/preferencesBitpayServices.html:23 msgid "Accounts" @@ -363,12 +363,12 @@ msgstr "比特币地址" #: www/views/cashScan.html:4 msgid "Bitcoin Cash (BCH) Balances" -msgstr "" +msgstr "Bitcoin Cash (BCH) 余额" #: www/views/preferencesCash.html:3 #: www/views/tab-settings.html:47 msgid "Bitcoin Cash Support" -msgstr "" +msgstr "Bitcoin Cash 支持" #: www/views/tab-home.html:98 #: www/views/tab-settings.html:115 @@ -384,7 +384,7 @@ msgstr "比特币网络手续费策略" #: www/views/tab-home.html:83 #: www/views/tab-settings.html:107 msgid "Bitcoin Core Wallets" -msgstr "" +msgstr "Bitcoin Core 钱包" #: src/js/services/incomingData.js:151 msgid "Bitcoin cash Payment" @@ -437,6 +437,7 @@ msgid "Buy & Sell Bitcoin" msgstr "购买或出售比特币" #: www/views/tab-send.html:35 +#: src/js/services/buyAndSellService.js:26 msgid "Buy Bitcoin" msgstr "购买比特币" @@ -619,10 +620,14 @@ msgstr "正在连接 Glidera..." msgid "Connection reset by peer" msgstr "连接被对方重置" -#: www/views/tab-send.html:45 +#: www/views/tab-send.html:85 msgid "Contacts" msgstr "联系人" +#: www/views/tab-send.html:86 +msgid "Saved frequently used addresses" +msgstr "保存的常用地址" + #: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "继续" @@ -653,7 +658,7 @@ msgstr "Copayer 加入" #: www/views/preferencesInformation.html:94 msgid "Copayer {{$index}}" -msgstr "" +msgstr "Copayer {{$index}}" #: src/js/controllers/copayers.js:79 #: src/js/controllers/export.js:193 @@ -823,7 +828,7 @@ msgstr "创建自己的免费钱包" #: www/views/onboarding/tour.html:51 #: www/views/tab-home.html:75 -#: www/views/tab-send.html:36 +#: www/views/tab-send.html:75 msgid "Create bitcoin wallet" msgstr "创建比特币的钱包" @@ -977,7 +982,7 @@ msgstr "已达到空地址限制。无法生成新的地址。" #: www/views/preferencesCash.html:17 msgid "Enable Bitcoin Cash wallet creation and operation within the App." -msgstr "" +msgstr "在应用内启用 Bitcoin Cash 创建和操作。" #: www/views/tab-scan.html:19 msgid "Enable camera access in your device settings to get started." @@ -993,7 +998,7 @@ msgstr "启用推式通知" #: www/views/preferencesNotifications.html:33 msgid "Enable sound" -msgstr "" +msgstr "启用声音" #: www/views/tab-scan.html:18 msgid "Enable the camera to get started." @@ -1001,7 +1006,7 @@ msgstr "使该摄像机开始。" #: www/views/tab-settings.html:49 msgid "Enabled" -msgstr "" +msgstr "已启用" #: src/js/services/walletService.js:1047 #: src/js/services/walletService.js:1062 @@ -1586,7 +1591,7 @@ msgstr "网络地址不正确" #: src/js/controllers/confirm.js:306 #: src/js/services/bwcError.js:44 msgid "Insufficient confirmed funds" -msgstr "" +msgstr "确认的资金不足" #: src/js/controllers/topup.js:165 #: src/js/controllers/topup.js:177 @@ -2011,7 +2016,7 @@ msgstr "好的" #: www/views/modals/tx-status.html:36 #: www/views/modals/tx-status.html:46 msgid "OKAY" -msgstr "" +msgstr "确定" #: www/views/modals/terms.html:15 msgid "Official English Disclaimer" @@ -2053,7 +2058,7 @@ msgstr "打开 GitHub 项目" #: src/js/controllers/bitpayCard.js:123 #: src/js/controllers/tx-details.js:192 msgid "Open Explorer" -msgstr "" +msgstr "打开浏览器" #: www/views/tab-scan.html:22 msgid "Open Settings" @@ -2069,7 +2074,7 @@ msgstr "打开网站" #: src/js/controllers/preferencesCash.js:32 msgid "Open bitcoincash.org?" -msgstr "" +msgstr "打开 bitcoincash.org?" #: src/js/controllers/cashScan.js:18 msgid "Open the recovery tool." @@ -2511,7 +2516,7 @@ msgstr "请扫描你的指纹" #: www/views/preferencesCash.html:23 msgid "Scan your wallets for Bitcoin Cash" -msgstr "" +msgstr "扫描您的 Bitcoin Cash 钱包" #: src/js/services/onGoingProcess.js:30 msgid "Scanning Wallet funds..." @@ -2533,6 +2538,14 @@ msgstr "搜索交易" msgid "Search or enter bitcoin address" msgstr "搜索或输入比特币地址" +#: src/js/controllers/tab-send.js:28 +msgid "Clipboard" +msgstr "剪贴板" + +#: src/js/controllers/tab-send.js:29 +msgid "Your Clipboard is empty" +msgstr "您的剪贴板为空" + #: www/views/modals/search.html:16 msgid "Search transactions" msgstr "搜索交易" @@ -2591,9 +2604,70 @@ msgid "Send by email" msgstr "通过电邮发送" #: src/js/controllers/confirm.js:177 +#: src/js/controllers/tab-send.js:94 msgid "Send from" msgstr "从发送" +#: src/js/controllers/tab-send.js:77 +msgid "Send to" +msgstr "发送到" + +#: www/views/tab-send.html:20 +msgid "Paste Clipboard" +msgstr "粘贴剪贴板" + +#: www/views/tab-send.html:21 +msgid "Paste Address" +msgstr "粘贴地址" + +#: www/views/tab-send.html:27 +msgid "Wallet to Wallet Transfer" +msgstr "钱包转账" + +#: www/views/tab-send.html:35 +msgid "Scan QR Code" +msgstr "扫描二维码" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "更快地发送比特币!" + +#: www/views/tab-send.html:46 +msgid "Send Bitcoin faster!" +msgstr "更快地发送比特币!" + +#: www/views/tab-send.html:50 +msgid "Save frequently used addresses and send them Bitcoin in just one tap" +msgstr "保存常用地址,只需点击一下即可将比特币发送到这些地址" + +#: www/views/tab-send.html:55 +msgid "Add your first contact" +msgstr "添加您的第一个联系人" + +#: www/views/tab-send.html:65 +msgid "Your Bitcoin wallet is empty" +msgstr "您的比特币钱包为空" + +#: www/views/tab-send.html:69 +msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address." +msgstr "首先,购买 Bitcoin Cash (BCH) 或 Bitcoin Core (BTC),或者共享您的地址。" + +#: www/views/tab-send.html:70 +msgid "You can receive bitcoin from any wallet or service." +msgstr "您可以从任何钱包或服务接收比特币。" + +#: www/views/tab-send.html:72 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。" + +#: www/views/tab-send.html:74 +msgid "Buy Bitcoin now" +msgstr "立即购买比特币" + +#: www/views/tab-send.html:76 +msgid "Show my address" +msgstr "显示我的地址" + #: www/views/includes/itemSelector.html:8 msgid "Send max amount" msgstr "发送最大数量" @@ -2810,7 +2884,7 @@ msgstr "超级经济" #: www/views/preferencesCash.html:11 msgid "Support Bitcoin Cash" -msgstr "" +msgstr "支持 Bitcoin Cash" #: www/views/paperWallet.html:7 msgid "Sweep" @@ -2860,7 +2934,7 @@ msgstr "使用条款" #: www/views/tab-create-personal.html:118 #: www/views/tab-import-phrase.html:68 msgid "Testnet" -msgstr "" +msgstr "测试网" #: www/views/includes/incomingDataMenu.html:61 msgid "Text" @@ -3030,7 +3104,7 @@ msgstr "若要开始,请买比特币或共享您的地址。你可以从任何 #: www/views/tab-send.html:33 msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." -msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。" +msgstr "首先,您需要创建一个比特币钱包,并获得一些比特币。" #: src/js/services/bitpayAccountService.js:73 msgid "To {{reason}} you must first add your BitPay account - {{email}}" @@ -3200,7 +3274,7 @@ msgstr "查看服务条款" #: src/js/controllers/bitpayCard.js:122 #: src/js/controllers/tx-details.js:191 msgid "View Transaction on Explorer.Bitcoin.com" -msgstr "" +msgstr "在 Explorer.Bitcoin.com 上查看交易" #: src/js/controllers/tab-home.js:148 msgid "View Update" @@ -3596,7 +3670,7 @@ msgstr "我" #: www/views/addressbook.add.html:32 msgid "name@example.com" -msgstr "" +msgstr "name@example.com" #: www/views/preferencesHistory.html:15 msgid "preparing..." @@ -3636,3 +3710,51 @@ msgstr "下载的 {{updatingTxHistoryProgress}} 交易" msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "{{wallet.m}}{{wallet.n}}" +#: src/js/services/shapeshiftService.js:8 +msgid "Shapeshift" +msgstr "Shapeshift" + +#: www/views/includes/community.html:3 +msgid "Community" +msgstr "社区" + +#: src/js/services/communityService.js:40 +msgid "Bitcoin Cash Reddit" +msgstr "Bitcoin Cash Reddit" + +#: src/js/services/communityService.js:47 +msgid "Bitcoin.com Twitter" +msgstr "Bitcoin.com Twitter" + +#: www/views/includes/nextSteps.html:3 +msgid "Explore Bitcoin.com" +msgstr "探索 Bitcoin.com" + +#: src/js/services/bitcoincomService.js:21 +msgid "Bitcoin Cash Games" +msgstr "Bitcoin Cash 游戏" + +#: src/js/services/bitcoincomService.js:28 +msgid "News" +msgstr "新闻" + +#: src/js/services/bitcoincomService.js:35 +msgid "Mining Pool" +msgstr "矿池" + +#: src/js/services/bitcoincomService.js:42 +msgid "Tools" +msgstr "工具" + +#: src/js/services/bitcoincomService.js:49 +msgid "Bitcoin Price Charts" +msgstr "比特币价格图表" + +#: src/js/services/bitcoincomService.js:56 +msgid "Free Bitcoin Cash" +msgstr "免费的 Bitcoin Cash" + +#: www/views/tab-home.html:30 +msgid "Your Bitcoin Wallets are ready!" +msgstr "您的比特币钱包已就绪!" + diff --git a/www/index.html b/www/index.html index 4c73317e3..ecc2d923c 100644 --- a/www/index.html +++ b/www/index.html @@ -11,9 +11,8 @@ - Bitcoin.com Wallet - Bitcoin.com Wallet - - + Bitcoin.com Wallet + @@ -31,7 +30,7 @@ - + From d122048a7b7d25a3934ef5557a778bfcff46317e Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 27 Jul 2018 17:46:19 +0900 Subject: [PATCH 162/166] Increment version --- app-template/bitcoincom/appConfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index fefcb9a4f..238f38002 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,9 +24,9 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.13.0", - "fullVersion": "4.13-rc1", - "androidVersion": "413000", + "version": "4.13.1", + "fullVersion": "4.13-rc2", + "androidVersion": "413100", "_extraCSS": "", "_enabledExtensions": { "coinbase": false, From a952edfe692ee0c82c873544d0a4a7e21a075315 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 31 Jul 2018 17:40:58 +0200 Subject: [PATCH 163/166] border-radius fix --- src/sass/buttons.scss | 1 + src/sass/views/includes/clickToAccept.scss | 1 + src/sass/views/includes/slideToAccept.scss | 3 +++ 3 files changed, 5 insertions(+) diff --git a/src/sass/buttons.scss b/src/sass/buttons.scss index a8512ae64..e343f8fd2 100644 --- a/src/sass/buttons.scss +++ b/src/sass/buttons.scss @@ -55,6 +55,7 @@ .button { border-radius: 6px; &.button-full { + border-radius: 0; display: block; } &-green { diff --git a/src/sass/views/includes/clickToAccept.scss b/src/sass/views/includes/clickToAccept.scss index a38455ac3..cbc7a2c75 100644 --- a/src/sass/views/includes/clickToAccept.scss +++ b/src/sass/views/includes/clickToAccept.scss @@ -8,6 +8,7 @@ click-to-accept { .click-to-accept { &__button.button.button-primary.button-standard { + border-radius: 0; height: 100%; max-width: 9999px; width: 100%; diff --git a/src/sass/views/includes/slideToAccept.scss b/src/sass/views/includes/slideToAccept.scss index 75502c6a8..24775116d 100644 --- a/src/sass/views/includes/slideToAccept.scss +++ b/src/sass/views/includes/slideToAccept.scss @@ -13,6 +13,9 @@ slide-to-accept { } .slide { + .button { + border-radius: 0; + } &__listener { height: 100%; width: 100%; From 66c9cefb0c539ed1817b3ecb7674082a5eb9f924 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 3 Aug 2018 01:15:54 +0900 Subject: [PATCH 164/166] Fix the tx history --- src/js/services/walletService.js | 42 +++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 774fa0906..7ea98600f 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -343,21 +343,23 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (err) return cb(err); if (!txsFromServer.length) - return cb(); + return cb(null, []); - var res = lodash.takeWhile(txsFromServer, function(tx) { + /*var res = lodash.takeWhile(txsFromServer, function(tx) { return tx.txid != endingTxid; - }); + });*/ - return cb(null, res, res.length >= limit); + return cb(null, txsFromServer); }); }; var removeAndMarkSoftConfirmedTx = function(txs) { return lodash.filter(txs, function(tx) { - if (tx.confirmations >= root.SOFT_CONFIRMATION_LIMIT) - return tx; - tx.recent = true; + var isConfirm = (tx.confirmations >= root.SOFT_CONFIRMATION_LIMIT); + if (!isConfirm) { + tx.recent = true; + } + return isConfirm; }); } @@ -437,12 +439,14 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null; var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null; + $log.debug('Confirmed TXs. Got:' + confirmedTxs.length + '/' + txsFromLocal.length); + // First update progressFn(txsFromLocal, 0); wallet.completeHistory = txsFromLocal; function getNewTxs(newTxs, skip, next) { - getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res, shouldContinue) { + getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res) { if (err) { $log.warn(bwcError.msg(err, 'Server Error')); //TODO if (err instanceof errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) { @@ -454,7 +458,27 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim return next(err); } - newTxs = newTxs.concat(processNewTxs(wallet, lodash.compact(res))); + // Check if new txs are founds, if yes, lets investigate in the 50 next + // To be sure we are not missing txs by order (maybe a new tx is after the "endingTxid" + + var newDiscoveredTxs = res.filter(function (x) { + return confirmedTxs.filter(function (confX) { + return confX.txid == x.txid; + }).length == 0; + }); + + $log.debug('Discovering TXs. Got:' + newDiscoveredTxs.length); + + /*var newDiscoveredTxs = lodash.uniq(lodash.union(res, newTxs), function(x) { + return x.txid; + });*/ + + var shouldContinue = newDiscoveredTxs.length > 0; + + // If no new tx, no need to check + if (shouldContinue) { + newTxs = newTxs.concat(processNewTxs(wallet, lodash.compact(newDiscoveredTxs))); + } progressFn(newTxs.concat(txsFromLocal), newTxs.length); From 9c8ec7d3a21f890d73ac18dc84a82e76c99266fe Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 3 Aug 2018 01:17:01 +0900 Subject: [PATCH 165/166] Fix tx history --- src/js/services/walletService.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 7ea98600f..cb04ffbe3 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -345,10 +345,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (!txsFromServer.length) return cb(null, []); - /*var res = lodash.takeWhile(txsFromServer, function(tx) { - return tx.txid != endingTxid; - });*/ - return cb(null, txsFromServer); }); }; @@ -459,8 +455,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim } // Check if new txs are founds, if yes, lets investigate in the 50 next - // To be sure we are not missing txs by order (maybe a new tx is after the "endingTxid" - + // To be sure we are not missing txs by sorting (maybe a new tx is after the "endingTxid" var newDiscoveredTxs = res.filter(function (x) { return confirmedTxs.filter(function (confX) { return confX.txid == x.txid; @@ -469,10 +464,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim $log.debug('Discovering TXs. Got:' + newDiscoveredTxs.length); - /*var newDiscoveredTxs = lodash.uniq(lodash.union(res, newTxs), function(x) { - return x.txid; - });*/ - var shouldContinue = newDiscoveredTxs.length > 0; // If no new tx, no need to check From 9e5bd663a7c7146729de82d8d5772c2d361b3954 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Dominguez Date: Fri, 3 Aug 2018 10:37:49 +0900 Subject: [PATCH 166/166] Update appConfig.json --- app-template/bitcoincom/appConfig.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app-template/bitcoincom/appConfig.json b/app-template/bitcoincom/appConfig.json index 238f38002..084a586ce 100644 --- a/app-template/bitcoincom/appConfig.json +++ b/app-template/bitcoincom/appConfig.json @@ -24,9 +24,9 @@ "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "pushSenderId": "1036948132229", "description": "A Secure Bitcoin Wallet", - "version": "4.13.1", - "fullVersion": "4.13-rc2", - "androidVersion": "413100", + "version": "4.13.2", + "fullVersion": "4.13-rc3", + "androidVersion": "413200", "_extraCSS": "", "_enabledExtensions": { "coinbase": false,