Merge remote-tracking branch 'origin/wallet/sprint/18' into wallet/task/366
This commit is contained in:
commit
c40b6c168a
62 changed files with 6227 additions and 420 deletions
131
Gruntfile.js
131
Gruntfile.js
|
|
@ -8,6 +8,21 @@ module.exports = function(grunt) {
|
|||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
exec: {
|
||||
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'
|
||||
},
|
||||
|
|
@ -20,9 +35,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'
|
||||
},
|
||||
|
|
@ -61,7 +73,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'
|
||||
|
|
@ -152,11 +164,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',
|
||||
|
|
@ -222,38 +245,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: {
|
||||
'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/'
|
||||
}
|
||||
|
|
@ -272,9 +335,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', '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']);
|
||||
|
|
@ -286,6 +346,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('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']);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ var templates = {
|
|||
'ionic.config.json': '/',
|
||||
'.desktop': 'webkitbuilds/',
|
||||
'setup-win.iss': 'webkitbuilds/',
|
||||
'build-macos.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': '/',
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,15 +18,15 @@
|
|||
"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",
|
||||
"pushSenderId": "1036948132229",
|
||||
"description": "A Secure Bitcoin Wallet",
|
||||
"version": "4.11.0",
|
||||
"fullVersion": "4.11-rc1",
|
||||
"androidVersion": "411000",
|
||||
"version": "4.12.0",
|
||||
"fullVersion": "4.12-rc1",
|
||||
"androidVersion": "412000",
|
||||
"_extraCSS": "",
|
||||
"_enabledExtensions": {
|
||||
"coinbase": false,
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
<plugin name="cordova-plugin-queries-schemes" spec="~0.1.5" />
|
||||
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase.git" />
|
||||
<plugin name="cordova-plugin-wkwebview-inputfocusfix" spec="https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix.git" />
|
||||
<plugin name="cordova-plugin-nativeaudio" spec="^3.0.9" />
|
||||
<!-- Changes in error descriptions may break the use of cordova-plugin-secure-storage -->
|
||||
<plugin name="cordova-plugin-secure-storage" spec="2.6.8" />
|
||||
<!-- Supported Platforms -->
|
||||
|
|
|
|||
49
app-template/build-macos.sh → app-template/create-dmg-dist.sh
Executable file → Normal file
49
app-template/build-macos.sh → app-template/create-dmg-dist.sh
Executable file → Normal file
|
|
@ -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
|
||||
|
|
@ -66,25 +64,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 +154,14 @@ hdiutil detach "${DEVICE}"
|
|||
echo "Creating compressed image"
|
||||
hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
|
||||
|
||||
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}"
|
||||
54
app-template/create-others-dist.sh
Normal file
54
app-template/create-others-dist.sh
Normal file
|
|
@ -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
|
||||
45
app-template/create-pkg-dist.sh
Normal file
45
app-template/create-pkg-dist.sh
Normal file
|
|
@ -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
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
"description": "*DESCRIPTION*",
|
||||
"author": "BitPay",
|
||||
"version": "*VERSION*",
|
||||
"androidVersion": "*ANDROIDVERSION*",
|
||||
"fullVersion": "*FULLVERSION*",
|
||||
"keywords": [
|
||||
"bitcoin",
|
||||
|
|
@ -14,8 +15,9 @@
|
|||
],
|
||||
"main": "www/index.html",
|
||||
"title": "*USERVISIBLENAME*",
|
||||
"nameCaseNoSpace": "*NAMECASENOSPACE*",
|
||||
"window": {
|
||||
"title": "*USERVISIBLENAME* - *PURPOSELINE*",
|
||||
"title": "*USERVISIBLENAME*",
|
||||
"icon": "www/img/app/icon.png",
|
||||
"toolbar": false,
|
||||
"show": true,
|
||||
|
|
@ -69,6 +71,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",
|
||||
|
|
@ -81,11 +85,12 @@
|
|||
"load-grunt-tasks": "^3.5.0",
|
||||
"shelljs": "^0.3.0",
|
||||
"android-versions": "^1.2.1",
|
||||
"bitcoincashjs": "^0.1.7"
|
||||
"bitcoincashjs-fork": "^1.0.3"
|
||||
},
|
||||
"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",
|
||||
|
|
@ -99,23 +104,27 @@
|
|||
"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": "npm run build:desktop && npm run build:osx",
|
||||
"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",
|
||||
"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"
|
||||
|
|
@ -124,6 +133,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"
|
||||
|
|
|
|||
40
app-template/sign-desktop-dist.sh
Normal file
40
app-template/sign-desktop-dist.sh
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#!/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"
|
||||
|
||||
##
|
||||
# INIT GPG (YOU NEED THE PRIVATE KEY CONNECTED TO YOUR DESKTOP)
|
||||
# gpg --card-edit
|
||||
|
||||
##
|
||||
# LINUX
|
||||
|
||||
# Sig 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 --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 --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 --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"
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
var bitcoinCashJsModule = angular.module('bitcoinCashJsModule', []);
|
||||
var bchjs = require('../node_modules/bitcoincashjs');
|
||||
var bchjs = require('../node_modules/bitcoincashjs-fork');
|
||||
|
||||
bitcoinCashJsModule.constant('MODULE_VERSION', '1.0.0');
|
||||
|
||||
|
|
|
|||
3634
i18n/po/ca/template-ca.po
Normal file
3634
i18n/po/ca/template-ca.po
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 "<b>Only</b> redeemable on Mercado Livre (Brazil)"
|
||||
msgstr ""
|
||||
msgstr "<b>Nur</b> 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"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -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."
|
||||
|
|
|
|||
|
|
@ -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 "<b>Only</b> redeemable on Mercado Livre (Brazil)"
|
||||
msgstr ""
|
||||
msgstr "<b>Only</b> 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."
|
||||
|
|
|
|||
|
|
@ -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)"
|
||||
|
|
|
|||
BIN
resources/bitcoin.com/mac/pkg/app.icns
Normal file
BIN
resources/bitcoin.com/mac/pkg/app.icns
Normal file
Binary file not shown.
32
resources/bitcoin.com/mac/pkg/build.cfg
Normal file
32
resources/bitcoin.com/mac/pkg/build.cfg
Normal file
|
|
@ -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 = ../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
|
||||
## additional [Locale locale_name] section for each locale containing localized strings.
|
||||
## Locales not in the list will be removed.
|
||||
Locales = en
|
||||
253
resources/bitcoin.com/mac/pkg/build_mas.py
Executable file
253
resources/bitcoin.com/mac/pkg/build_mas.py
Executable file
|
|
@ -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()
|
||||
10
resources/bitcoin.com/mac/pkg/entitlements-child.plist
Normal file
10
resources/bitcoin.com/mac/pkg/entitlements-child.plist
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.inherit</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
16
resources/bitcoin.com/mac/pkg/entitlements-parent.plist
Normal file
16
resources/bitcoin.com/mac/pkg/entitlements-parent.plist
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<string>$GROUPID</string>
|
||||
<key>com.apple.security.files.user-selected.read-only</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.device.camera</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
@ -104,12 +104,12 @@ angular.module('copayApp.controllers').controller('searchController', function($
|
|||
};
|
||||
|
||||
$scope.searchOnBlockchain = function(searchTerm) {
|
||||
const url = 'https://explorer.bitcoin.com/'+$scope.wallet.coin+'/search/' + searchTerm;
|
||||
const optIn = true;
|
||||
const title = null;
|
||||
const message = gettextCatalog.getString('Search on Explorer.Bitcoin.com');
|
||||
const okText = gettextCatalog.getString('Open Explorer');
|
||||
const cancelText = gettextCatalog.getString('Go Back');
|
||||
var url = 'https://explorer.bitcoin.com/'+$scope.wallet.coin+'/search/' + searchTerm;
|
||||
var optIn = true;
|
||||
var title = null;
|
||||
var message = gettextCatalog.getString('Search on Explorer.Bitcoin.com');
|
||||
var okText = gettextCatalog.getString('Open Explorer');
|
||||
var cancelText = gettextCatalog.getString('Go Back');
|
||||
externalLinkService.open(url, optIn, title, message, okText, cancelText);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,24 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
|||
var currentAddressSocket = {};
|
||||
var paymentSubscriptionObj = { op:"addr_sub" }
|
||||
|
||||
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() {
|
||||
|
|
@ -129,6 +147,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.ogg').play(); // NW.js has no mp3 support
|
||||
}
|
||||
} else {
|
||||
$log.debug('Sound is disabled.');
|
||||
}
|
||||
$scope.showingPaymentReceived = true;
|
||||
});
|
||||
}
|
||||
|
|
@ -215,12 +244,14 @@ 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;
|
||||
});
|
||||
});
|
||||
|
||||
$scope.$on("$ionicView.enter", function(event, data) {
|
||||
$scope.showingPaymentReceived = false;
|
||||
$ionicNavBarDelegate.showBar(true);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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 || {}));
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer
|
|||
enabled: false,
|
||||
},
|
||||
|
||||
soundsEnabled: false,
|
||||
soundsEnabled: true,
|
||||
|
||||
log: {
|
||||
filter: 'debug',
|
||||
|
|
@ -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
|
||||
|
|
|
|||
53
src/js/services/rateService.spec.js
Normal file
53
src/js/services/rateService.spec.js
Normal file
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
308
src/js/services/secureStorageService.spec.js
Normal file
308
src/js/services/secureStorageService.spec.js
Normal file
|
|
@ -0,0 +1,308 @@
|
|||
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;
|
||||
|
||||
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('platformInfo', platformInfoStub);
|
||||
});
|
||||
|
||||
inject(function($injector){
|
||||
sss = $injector.get('secureStorageService');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
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;
|
||||
|
||||
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');
|
||||
});
|
||||
|
||||
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.')
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
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.')
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
|
@ -144,11 +144,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);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -157,6 +162,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
|
||||
|
|
@ -197,6 +233,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;
|
||||
|
|
@ -216,11 +259,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 {
|
||||
|
|
@ -228,20 +272,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);
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
1119
src/js/services/storageService.spec.js
Normal file
1119
src/js/services/storageService.spec.js
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -1179,12 +1179,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
|||
|
||||
if (signedTxp.status == 'accepted') {
|
||||
ongoingProcess.set('broadcastingTx', true, customStatusHandler);
|
||||
function handleBroadcastTx(err, broadcastedTxp) {
|
||||
|
||||
var handleBroadcastTx = function(err, broadcastedTxp) {
|
||||
ongoingProcess.set('broadcastingTx', false, customStatusHandler);
|
||||
if (err) return cb(bwcError.msg(err));
|
||||
if (err) return cb(bwcError.msg(err));
|
||||
$rootScope.$emit('Local/TxAction', wallet.id);
|
||||
return cb(null, broadcastedTxp);
|
||||
}
|
||||
};
|
||||
|
||||
if (signedTxp.payProUrl && signedTxp.coin == 'bch') {
|
||||
payproService.broadcastBchTx(signedTxp, handleBroadcastTx);
|
||||
|
|
|
|||
|
|
@ -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%;
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
@import "icons";
|
||||
@import "buttons";
|
||||
@import "forms";
|
||||
@import "qr";
|
||||
@import "mixins/mixins";
|
||||
@import "views/views";
|
||||
@import "directives/directives";
|
||||
|
|
|
|||
20
src/sass/qr.scss
Normal file
20
src/sass/qr.scss
Normal file
|
|
@ -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/qr-overlay-bch.png');
|
||||
}
|
||||
&--btc::before {
|
||||
background-image: url('../img/qr-overlay-btc.png');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
}
|
||||
}
|
||||
|
|
@ -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 */
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,11 @@ wallet-selector {
|
|||
font-weight: bold;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid #EFEFEF;
|
||||
.subtitle {
|
||||
color: $v-mid-gray;
|
||||
font-size: $font-size-small;
|
||||
font-weight: 300;
|
||||
}
|
||||
.wallet-coin-logo {
|
||||
vertical-align: middle;
|
||||
margin-right: 5px;
|
||||
|
|
|
|||
|
|
@ -43,6 +43,11 @@
|
|||
.icon {
|
||||
color: $v-mid-gray;
|
||||
}
|
||||
.subtitle {
|
||||
color: $v-mid-gray;
|
||||
font-size: $font-size-small;
|
||||
font-weight: 300;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
91
test/karma.conf.js
Normal file
91
test/karma.conf.js
Normal file
|
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
@ -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%; }
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1,62 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Wallet"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 40 40"
|
||||
style="enable-background:new 0 0 40 40;"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="icon-wallet.svg"
|
||||
inkscape:version="0.92.1 r15371"><metadata
|
||||
id="metadata10"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs8" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:zoom="19.825"
|
||||
inkscape:cx="12.559899"
|
||||
inkscape:cy="26.610103"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Wallet" /><style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:none;stroke:#FFFFFF;}
|
||||
</style><text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:42.66666667px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
|
||||
x="-7.263556"
|
||||
y="11.197982"
|
||||
id="text4493"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4491"
|
||||
x="-7.263556"
|
||||
y="46.588608" /></text>
|
||||
<g
|
||||
aria-label=""
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.29528046px;line-height:125%;font-family:icomoon;-inkscape-font-specification:icomoon;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.607382px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="text4497"><path
|
||||
d="m 30.194736,19.685663 h -3.226717 q -0.735501,0 -1.233744,0.521969 -0.498243,0.498243 -0.498243,1.210019 0,0.711776 0.498243,1.233745 0.521969,0.498243 1.233744,0.498243 h 3.226717 q 0.308437,0 0.521969,-0.213533 0.237259,-0.237259 0.237259,-0.545695 v -2.016698 q 0,-0.260984 -0.237259,-0.474517 -0.213532,-0.213533 -0.521969,-0.213533 z m -11.649397,2.06415 h -2.775925 v 3.155539 h 2.704748 q 0.166081,0 0.379613,-0.02372 0.237259,-0.02373 0.427066,-0.0949 0.379614,-0.166081 0.616872,-0.569421 0.237259,-0.403339 0.237259,-0.901582 0,-0.711776 -0.450791,-1.138842 -0.427066,-0.427065 -1.138842,-0.427065 z m 8.42268,2.396312 q -1.138841,0 -1.94552,-0.782954 -0.782953,-0.806679 -0.782953,-1.94552 0,-1.138841 0.782953,-1.945521 0.806679,-0.806679 1.94552,-0.806679 h 3.226717 q 0,0 0,0 0,0 0,0 v -3.962218 q 0,-0.949035 -0.664324,-1.589633 -0.664324,-0.664324 -1.589632,-0.664324 V 11.45279 q 0,-0.735502 -0.521969,-1.233745 Q 26.920568,9.7208021 26.208792,9.7208021 H 9.5295125 q -0.7117758,0 -1.2337447,0.5219689 -0.498243,0.498243 -0.498243,1.210019 v 16.655553 q 0,0.949035 0.664324,1.613359 0.6643241,0.640598 1.5896322,0.640598 h 17.913025 q 0.949034,0 1.589632,-0.640598 0.664324,-0.664324 0.664324,-1.613359 v -3.962218 q 0,0 0,0 0,0 0,0 H 26.968019 Z M 9.6481418,12.449276 q -0.3558879,0 -0.6168723,-0.260984 Q 8.770285,11.927307 8.770285,11.571419 v 0 q 0,-0.355888 0.2609845,-0.616872 0.2609844,-0.260985 0.6168723,-0.260985 H 26.090163 q 0.355888,0 0.616872,0.260985 0.260984,0.260984 0.260984,0.616872 v 0.877857 H 9.6481418 Z M 19.779084,25.783209 q -0.332162,0.118629 -0.664324,0.166081 -0.332162,0.02373 -0.711776,0.02373 h -0.521969 v 0.711776 q 0,0.118629 -0.07118,0.213533 -0.07118,0.07118 -0.189807,0.07118 h -0.759228 q -0.118629,0 -0.213533,-0.07118 -0.07118,-0.0949 -0.07118,-0.213533 v -0.711776 h -0.854131 v 0.711776 q 0,0.118629 -0.07118,0.213533 -0.07118,0.07118 -0.189807,0.07118 H 14.70175 q -0.118629,0 -0.213533,-0.07118 -0.07118,-0.0949 -0.07118,-0.213533 v -0.711776 h -0.711776 q -0.0949,0 -0.166081,-0.07118 -0.04745,-0.07118 -0.04745,-0.142355 v -0.640598 q 0,-0.0949 0.04745,-0.142355 0.07118,-0.07118 0.166081,-0.07118 h 0.711776 v -6.951677 h -0.782954 q -0.07118,0 -0.118629,-0.04745 -0.02373,-0.04745 -0.02373,-0.11863 v -0.711775 q 0,-0.07118 0.02373,-0.11863 0.04745,-0.04745 0.118629,-0.04745 h 0.782954 v -0.735502 q 0,-0.0949 0.07118,-0.166081 0.0949,-0.0949 0.213533,-0.0949 h 0.759227 q 0.11863,0 0.189807,0.0949 0.07118,0.07118 0.07118,0.166081 v 0.735502 h 0.854131 v -0.735502 q 0,-0.0949 0.07118,-0.166081 0.0949,-0.0949 0.213533,-0.0949 h 0.759228 q 0.118629,0 0.189807,0.0949 0.07118,0.07118 0.07118,0.166081 v 0.735502 h 0.332162 q 0.498243,0 0.877857,0.07118 0.379614,0.04745 0.711776,0.213533 0.545695,0.237259 0.877857,0.782953 0.355888,0.521969 0.355888,1.233745 0,0.664324 -0.308437,1.186293 -0.28471,0.498243 -0.830405,0.759228 v 0.04745 q 0.711776,0.189807 1.115116,0.806679 0.403339,0.616873 0.403339,1.3761 0.02373,0.877857 -0.474517,1.518455 -0.474517,0.640599 -1.162567,0.877857 z m 0,-6.47716 q 0,-0.379613 -0.166081,-0.688049 -0.142355,-0.332163 -0.427066,-0.498244 -0.166081,-0.07118 -0.403339,-0.118629 -0.237259,-0.04745 -0.521969,-0.04745 H 15.79314 v 2.7522 h 2.681022 q 0.593146,0 0.949034,-0.379614 0.355888,-0.403339 0.355888,-1.020212 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.607382px"
|
||||
id="path4499" /></g></svg>
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 70 70"><title>icon-wallet</title><path d="M45.65,41.24a2.74,2.74,0,1,0-2.73-2.75h0a2.74,2.74,0,0,0,2.73,2.74m0-3.46a.72.72,0,1,1-.72.72.7.7,0,0,1,.68-.72h0" style="fill:#fff"/><path d="M50.83,14.51H15.17A4.46,4.46,0,0,0,10.71,19V51.75a3.9,3.9,0,0,0,3.88,3.88H54.85a3.88,3.88,0,0,0,3.88-3.88h0V25.29a3.88,3.88,0,0,0-3.88-3.88h-3V15.52a1,1,0,0,0-1-1m-35.66,2H49.82v4.89H15.17a2.45,2.45,0,0,1,0-4.89M56.72,43.84H39.9a.69.69,0,0,1-.72-.66V33.92a.69.69,0,0,1,.66-.72H56.72ZM54.85,23.43a1.85,1.85,0,0,1,1.87,1.83v5.93H39.9a2.73,2.73,0,0,0-2.73,2.73h0v9.2a2.73,2.73,0,0,0,2.73,2.73H56.72v5.9a1.85,1.85,0,0,1-1.83,1.87H14.59a1.85,1.85,0,0,1-1.86-1.84V22.69l.21.13a4.61,4.61,0,0,0,2.23.61Z" style="fill:#fff"/><path d="M29.83,38.06h0a3.91,3.91,0,0,0,2.11-3.61,4,4,0,0,0-2.3-3.77,6.89,6.89,0,0,0-2.94-.5h-.63V28.77a.5.5,0,0,0-.48-.48h-1.4a.49.49,0,0,0-.49.48v1.37H22.13V28.77a.49.49,0,0,0-.49-.48h-1.4a.5.5,0,0,0-.48.48v1.37H18.33a.31.31,0,0,0-.31.31v1.33a.31.31,0,0,0,.31.31h1.43V44.94H18.41a.38.38,0,0,0-.39.39h0V46.5a.38.38,0,0,0,.39.39h1.35v1.35a.49.49,0,0,0,.48.49h1.4a.49.49,0,0,0,.49-.49h0V46.88H23.7v1.35a.49.49,0,0,0,.49.49h1.4a.49.49,0,0,0,.48-.49V46.88H27a8,8,0,0,0,2.52-.3,4.63,4.63,0,0,0,3.08-4.46,4,4,0,0,0-2.77-4.06m-7.7-6H26.7a3.69,3.69,0,0,1,1.73.33,2.41,2.41,0,0,1,1.09,2.2,2.37,2.37,0,0,1-2.16,2.56H22.13ZM28.59,44.7a4,4,0,0,1-1.49.24h-5V39.13h5.16a2.71,2.71,0,0,1,2.92,2.49,2.41,2.41,0,0,1,0,.38,2.8,2.8,0,0,1-1.59,2.7" style="fill:#fff"/></svg>
|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 1.5 KiB |
BIN
www/img/qr-overlay-bch.png
Normal file
BIN
www/img/qr-overlay-bch.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
www/img/qr-overlay-btc.png
Normal file
BIN
www/img/qr-overlay-btc.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
|
|
@ -11,7 +11,7 @@
|
|||
<link rel="stylesheet" type="text/css" href="css/chartist.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/bitcoin.com.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/icomoon.css">
|
||||
<title>Bitcoin.com - Bitcoin.com Wallet</title>
|
||||
<title>Bitcoin.com Wallet</title>
|
||||
<link rel="shortcut icon" href="img/app/favicon.ico">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
BIN
www/misc/coin_received.mp3
Normal file
BIN
www/misc/coin_received.mp3
Normal file
Binary file not shown.
BIN
www/misc/coin_received.ogg
Normal file
BIN
www/misc/coin_received.ogg
Normal file
Binary file not shown.
|
|
@ -8,8 +8,8 @@
|
|||
<div class="header" ng-if="!walletsBtc[0] || !walletsBch[0]">{{title}}</div>
|
||||
|
||||
<div class="subheader" ng-if="walletsBch[0] && walletsBtc[0]">
|
||||
<img class="wallet-coin-logo" src="img/bitcoin-cash-logo.svg" width="22">
|
||||
<span translate>Bitcoin Cash (BCH)</span>
|
||||
<div translate>Bitcoin Cash (BCH)</div>
|
||||
<div translate class="subtitle">Instant transactions with low fees</div>
|
||||
</div>
|
||||
<a
|
||||
ng-repeat="wallet in walletsBch track by $index"
|
||||
|
|
@ -40,8 +40,8 @@
|
|||
</a>
|
||||
|
||||
<div class="subheader" ng-if="walletsBtc[0] && walletsBch[0]" translate>
|
||||
<img class="wallet-coin-logo" src="img/icon-bitcoin.svg" width="18">
|
||||
<span translate>Bitcoin Core (BTC)</span>
|
||||
<div translate>Bitcoin Core (BTC)</div>
|
||||
<div translate class="subtitle">Slow transactions with high fees</div>
|
||||
</div>
|
||||
<a
|
||||
ng-repeat="wallet in walletsBtc track by $index"
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@
|
|||
|
||||
<div class="list card">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<img class="wallet-coin-logo" src="img/bitcoin-cash-logo.svg" width="22">
|
||||
<span translate>Bitcoin Cash (BCH)</span>
|
||||
<div translate>Bitcoin Cash (BCH)</div>
|
||||
<div translate class="subtitle">Instant transactions with low fees</div>
|
||||
<a ui-sref="tabs.add({coin:'bch'})"><i class="icon ion-ios-plus-empty list-add-button"></i></a>
|
||||
</div>
|
||||
<div>
|
||||
|
|
@ -72,8 +72,8 @@
|
|||
|
||||
<div class="list card">
|
||||
<div class="item item-icon-right item-heading">
|
||||
<img class="wallet-coin-logo" src="img/icon-bitcoin.svg" width="18">
|
||||
<span translate>Bitcoin Core (BTC)</span>
|
||||
<div translate>Bitcoin Core (BTC)</div>
|
||||
<div translate class="subtitle">Slow transactions with high fees</div>
|
||||
<a ui-sref="tabs.add"><i class="icon ion-ios-plus-empty list-add-button"></i></a>
|
||||
</div>
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
</button>
|
||||
</span>
|
||||
|
||||
<qrcode ng-if="addr" size="220" data="{{ protocolHandler }}:{{addr}}" color="#334"></qrcode>
|
||||
<qrcode class="qr-icon qr-icon--{{ wallet.coin }}" ng-if="addr" size="220" data="{{ protocolHandler }}:{{addr}}" color="#334"></qrcode>
|
||||
<div class="address-label">
|
||||
<span class="ellipsis">{{addr}}</span>
|
||||
<ion-spinner ng-show="!addr" class="spinner-dark" icon="crescent"></ion-spinner>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue