Compare commits
170 commits
wallet/tas
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e73e4c16d | ||
|
|
06f1f4df91 | ||
|
|
70f520ea43 | ||
|
|
f1d2b00b2b | ||
|
|
4e524a7500 | ||
|
|
c0a14fe11c | ||
|
|
d47393f160 | ||
|
|
898b7d03fe | ||
|
|
49a6711970 |
||
|
|
d72a71d920 | ||
|
|
4d623d51d7 | ||
|
|
ff40317d87 | ||
|
|
2e1cc9fa87 | ||
|
|
cecad4a072 | ||
|
|
61c91d518a | ||
|
|
a17c3518c3 | ||
|
|
6554b385cb |
||
|
|
c0912c5f17 | ||
|
|
e7eac1ee16 |
||
|
|
46413fa6aa |
||
|
|
fb2802f392 |
||
|
|
ea51e035ab | ||
|
|
0c8d145f73 | ||
|
|
977d03429d |
||
|
|
a8e5c212f0 | ||
|
|
4250a98718 | ||
|
|
a3614566e3 | ||
|
|
5cb3d7521d | ||
|
|
3cad7d7ad8 |
||
|
|
4d6aeb4f91 | ||
|
|
78e4942fd6 |
||
|
|
7b6efaa1db | ||
|
|
ebc32a2d85 | ||
|
|
e02368ea3c | ||
|
|
92c1b4b346 | ||
|
|
8bf31f97d8 | ||
|
|
f3902ba3f0 | ||
|
|
6aa7ee2bbb |
||
|
|
ac82b51848 | ||
|
|
e6d8ddb360 |
||
|
|
eb3067d369 |
||
|
|
908dcbf968 |
||
|
|
6692812d55 |
||
|
|
9438960e24 | ||
|
|
d55fc70e7d | ||
|
|
ad4aa76902 |
||
|
|
c1f6e56b56 | ||
|
|
7d29490b0f | ||
|
|
a54b30f6ae |
||
|
|
319a5c86ec | ||
|
|
8bc73353d5 | ||
|
|
101e33ec36 | ||
|
|
51c35101a6 | ||
|
|
3d3fdd7425 | ||
|
|
d361956290 |
||
|
|
46b5317f5e |
||
|
|
230b6e2228 | ||
|
|
81852836dd | ||
|
|
9c0b54a7ce |
||
|
|
47e1d0bdc7 |
||
|
|
5386c5f7a6 |
||
|
|
6a8f8ca33b | ||
|
|
828cb927dc |
||
|
|
176f0c3141 | ||
|
|
c14820ea34 |
||
|
|
57ce93ccb8 | ||
|
|
b6f63706f3 | ||
|
|
b0fba31040 | ||
|
|
b0178c0673 |
||
|
|
b2e22647e2 |
||
|
|
688f2b97bc |
||
|
|
c79ca6d1af | ||
|
|
71e530f535 | ||
|
|
a397e83cf0 | ||
|
|
1905be6f14 |
||
|
|
98e6e8ac75 | ||
|
|
0d8812509d | ||
|
|
3de34dbf15 | ||
|
|
394317bc46 | ||
|
|
f52b2e7f09 |
||
|
|
525afac92e |
||
|
|
22e1c397d0 |
||
|
|
74a9fe9691 |
||
|
|
70663492eb |
||
|
|
477a9b6995 |
||
|
|
2d6a1528c1 | ||
|
|
3b6bb1fcdd | ||
|
|
2a607d245d | ||
|
|
fa8ce4779f | ||
|
|
d01baa6060 | ||
|
|
ce02025991 | ||
|
|
d2715016b5 | ||
|
|
2c398bbe03 | ||
|
|
9128d3ebe2 | ||
|
|
887270bfa9 | ||
|
|
f7cde7a071 | ||
|
|
3afbdf73d3 |
||
|
|
00e4f8ac39 | ||
|
|
5e034e7b8b | ||
|
|
c553b51817 | ||
|
|
c40eabf807 | ||
|
|
9ff9e2ea91 | ||
|
|
5c5558fbd4 | ||
|
|
8c62bc445a | ||
|
|
ba2fa1f26e | ||
|
|
8dedc04fe8 | ||
|
|
ea23b26795 | ||
|
|
2121655249 | ||
|
|
001cd82afb |
||
|
|
793bfee6a2 |
||
|
|
6c8a1cfd5a | ||
|
|
3ab535a36b | ||
|
|
8b505141d7 | ||
|
|
d934a9241a | ||
|
|
ce3fcacac3 |
||
|
|
4c14bdcce0 |
||
|
|
2cec6a476b |
||
|
|
b766f2723c |
||
|
|
911247e463 |
||
|
|
8b38cb2d21 |
||
|
|
57efbc3c63 |
||
|
|
7353e0ff06 |
||
|
|
7b1597e229 |
||
|
|
38037f34fe |
||
|
|
1453a74302 |
||
|
|
4315d16f73 | ||
|
|
4dc3e7c2e8 | ||
|
|
b2178c84e3 | ||
|
|
52f18c3c9b | ||
|
|
383d811067 |
||
|
|
274d221af0 |
||
|
|
b1bf269ca2 |
||
|
|
b7dda8b6ca | ||
|
|
8908b5ef80 | ||
|
|
d65e4401dd |
||
|
|
4564040459 | ||
|
|
3cab114618 |
||
|
|
2c2c21bcdf |
||
|
|
8217351141 |
||
|
|
43592a1689 |
||
|
|
1c450418b8 |
||
|
|
7718724958 | ||
|
|
9a44a4b33b |
||
|
|
1fa87fc9a0 |
||
|
|
ed998e9036 |
||
|
|
4cf268682b |
||
|
|
feca8b5807 | ||
|
|
e6beb6fed1 | ||
|
|
745737ef73 | ||
|
|
95de043d3d | ||
|
|
ad6a1fbe8d | ||
|
|
ecb3b2391d | ||
|
|
14f77cf03f | ||
|
|
e5560bf63a | ||
|
|
d5f01e9713 |
||
|
|
78f0ff28cd | ||
|
|
0bd94601ae | ||
|
|
72cb94d212 | ||
|
|
ba98fbe187 | ||
|
|
03fa87adbc | ||
|
|
bbe2fb20c4 | ||
|
|
2a5a21f7d7 | ||
|
|
09871c9eba | ||
|
|
bb92f5ec1b | ||
|
|
33d780f2e5 | ||
|
|
93b6c3f1be | ||
|
|
0ae6f043ed |
||
|
|
4e2c06f69d | ||
|
|
15b161d55d |
||
|
|
e127b81e7c |
14
.vscode/launch.json
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Program",
|
||||||
|
"program": "${workspaceFolder}/www/index.html"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
158
Gruntfile.js
|
|
@ -8,26 +8,32 @@ module.exports = function(grunt) {
|
||||||
grunt.initConfig({
|
grunt.initConfig({
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
exec: {
|
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: {
|
appConfig: {
|
||||||
command: 'node ./util/buildAppConfig.js'
|
command: 'node ./util/buildAppConfig.js'
|
||||||
},
|
},
|
||||||
externalServices: {
|
android_studio: {
|
||||||
command: 'node ./util/buildExternalServices.js'
|
command: ' open -a open -a /Applications/Android\\ Studio.app platforms/android',
|
||||||
|
},
|
||||||
|
build_android_debug: {
|
||||||
|
command: 'cordova prepare android && cordova build android --debug',
|
||||||
|
},
|
||||||
|
build_android_release: {
|
||||||
|
command: 'cordova prepare android && cordova build android --release',
|
||||||
|
},
|
||||||
|
build_ios_debug: {
|
||||||
|
command: 'cordova prepare ios && cordova build ios --debug',
|
||||||
|
options: {
|
||||||
|
maxBuffer: 3200 * 1024
|
||||||
|
}
|
||||||
|
},
|
||||||
|
build_ios_release: {
|
||||||
|
command: 'cordova prepare ios && cordova build ios --release',
|
||||||
|
options: {
|
||||||
|
maxBuffer: 1600 * 1024
|
||||||
|
}
|
||||||
|
},
|
||||||
|
chrome: {
|
||||||
|
command: 'make -C chrome-app '
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
command: 'rm -Rf bower_components node_modules'
|
command: 'rm -Rf bower_components node_modules'
|
||||||
|
|
@ -38,8 +44,38 @@ module.exports = function(grunt) {
|
||||||
coveralls: {
|
coveralls: {
|
||||||
command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js'
|
command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js'
|
||||||
},
|
},
|
||||||
chrome: {
|
create_dmg_dist: {
|
||||||
command: 'make -C chrome-app '
|
command: 'sh webkitbuilds/create-dmg-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"'
|
||||||
|
},
|
||||||
|
create_others_dist: {
|
||||||
|
command: 'sh webkitbuilds/create-others-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 %>"'
|
||||||
|
},
|
||||||
|
externalServices: {
|
||||||
|
command: 'node ./util/buildExternalServices.js'
|
||||||
|
},
|
||||||
|
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'
|
||||||
|
},
|
||||||
|
log_android: {
|
||||||
|
command: 'adb logcat | grep chromium',
|
||||||
|
},
|
||||||
|
run_android: {
|
||||||
|
command: 'cordova run android --device',
|
||||||
|
},
|
||||||
|
run_android_emulator: {
|
||||||
|
command: 'cordova run android --emulator',
|
||||||
|
},
|
||||||
|
sign_android: {
|
||||||
|
// When the build log outputs "Built the following apk(s):", it seems to need the filename to start with "android-release".
|
||||||
|
// It looks like it simply lists all apk files starting with "android-release"
|
||||||
|
command: 'rm -f platforms/android/build/outputs/apk/android-release-signed-*.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 && zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/bitcoin-com-wallet-<%= pkg.fullVersion %>-android-signed-aligned.apk',
|
||||||
|
stdin: true,
|
||||||
|
},
|
||||||
|
sign_desktop_dist: {
|
||||||
|
command: 'sh webkitbuilds/sign-desktop-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>"'
|
||||||
},
|
},
|
||||||
wpinit: {
|
wpinit: {
|
||||||
command: 'make -C cordova wp-init',
|
command: 'make -C cordova wp-init',
|
||||||
|
|
@ -47,40 +83,9 @@ module.exports = function(grunt) {
|
||||||
wpcopy: {
|
wpcopy: {
|
||||||
command: 'make -C cordova wp-copy',
|
command: 'make -C cordova wp-copy',
|
||||||
},
|
},
|
||||||
iosdebug: {
|
|
||||||
command: 'npm run build:ios',
|
|
||||||
},
|
|
||||||
ios: {
|
|
||||||
command: 'npm run build:ios-release',
|
|
||||||
},
|
|
||||||
xcode: {
|
xcode: {
|
||||||
command: 'npm run open:ios',
|
command: 'open platforms/ios/*.xcodeproj',
|
||||||
},
|
}
|
||||||
androiddebug: {
|
|
||||||
command: 'npm run build:android',
|
|
||||||
},
|
|
||||||
android: {
|
|
||||||
command: 'npm run build:android-release',
|
|
||||||
},
|
|
||||||
androidrun: {
|
|
||||||
command: 'npm run run:android && npm run log:android',
|
|
||||||
},
|
|
||||||
androidbuild: {
|
|
||||||
command: 'cd cordova/project && cordova build android --release',
|
|
||||||
},
|
|
||||||
androidsign: {
|
|
||||||
command: 'rm -f cordova/project/platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../bitcoin-com-release-key.jks -signedjar cordova/project/platforms/android/build/outputs/apk/android-release-signed.apk cordova/project/platforms/android/build/outputs/apk/android-release-unsigned.apk bitcoin-com && ../android-sdk-macosx/build-tools/27.0.1/zipalign -v 4 cordova/project/platforms/android/build/outputs/apk/android-release-signed.apk cordova/project/platforms/android/build/outputs/apk/android-release-signed-aligned.apk ',
|
|
||||||
stdin: true,
|
|
||||||
},
|
|
||||||
desktopsign: {
|
|
||||||
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'
|
|
||||||
},
|
|
||||||
osxsign: {
|
|
||||||
cmd: 'gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>.dmg.sig --detach-sig webkitbuilds/<%= pkg.title %>.dmg'
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
options: {
|
options: {
|
||||||
|
|
@ -296,10 +301,10 @@ module.exports = function(grunt) {
|
||||||
},
|
},
|
||||||
pkg: {
|
pkg: {
|
||||||
options: {
|
options: {
|
||||||
appName: '<%= pkg.nameCaseNoSpace %>',
|
appName: '<%= pkg.title %>',
|
||||||
platforms: ['osx64'],
|
platforms: ['osx64'],
|
||||||
buildDir: './webkitbuilds/pkg',
|
buildDir: './webkitbuilds/pkg',
|
||||||
version: '0.19.5',
|
version: '0.19.4',
|
||||||
macIcns: './resources/<%= pkg.name %>/mac/pkg/app.icns',
|
macIcns: './resources/<%= pkg.name %>/mac/pkg/app.icns',
|
||||||
exeIco: './www/img/app/logo.ico',
|
exeIco: './www/img/app/logo.ico',
|
||||||
macPlist: {
|
macPlist: {
|
||||||
|
|
@ -348,30 +353,49 @@ module.exports = function(grunt) {
|
||||||
grunt.registerTask('wp', ['prod', 'exec:wp']);
|
grunt.registerTask('wp', ['prod', 'exec:wp']);
|
||||||
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
|
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
|
||||||
grunt.registerTask('wp-init', ['default', 'exec:wpinit']);
|
grunt.registerTask('wp-init', ['default', 'exec:wpinit']);
|
||||||
grunt.registerTask('ios', ['exec:ios']);
|
|
||||||
grunt.registerTask('ios-debug', ['exec:iosdebug']);
|
|
||||||
grunt.registerTask('ios-run', ['exec:xcode']);
|
|
||||||
grunt.registerTask('cordovaclean', ['exec:cordovaclean']);
|
grunt.registerTask('cordovaclean', ['exec:cordovaclean']);
|
||||||
grunt.registerTask('android-debug', ['exec:androiddebug', 'exec:androidrun']);
|
|
||||||
grunt.registerTask('android', ['exec:android']);
|
// Build all
|
||||||
grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']);
|
grunt.registerTask('build-app-release', ['build-mobile-release', 'build-desktop-release']);
|
||||||
grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']);
|
|
||||||
|
/**
|
||||||
|
* Mobile app
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Build mobile app
|
||||||
|
grunt.registerTask('build-mobile-release', ['build-ios-release', 'build-android-release']);
|
||||||
|
|
||||||
|
// Build ios
|
||||||
|
grunt.registerTask('start-ios', ['default', 'exec:build_ios_debug', 'exec:xcode']);
|
||||||
|
grunt.registerTask('build-ios-debug', ['default', 'exec:build_ios_debug']);
|
||||||
|
grunt.registerTask('build-ios-release', ['prod', 'exec:build_ios_release']);
|
||||||
|
|
||||||
|
// Build android
|
||||||
|
grunt.registerTask('start-android', ['build-android-debug', 'exec:run_android']);
|
||||||
|
grunt.registerTask('build-android-debug', ['default', 'exec:build_android_debug']);
|
||||||
|
grunt.registerTask('start-android-emulator', ['build-android-debug', 'exec:run_android_emulator']);
|
||||||
|
grunt.registerTask('build-android-release', ['prod', 'exec:build_android_release', 'sign-android']);
|
||||||
|
grunt.registerTask('sign-android', ['exec:sign_android']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Desktop app
|
||||||
|
*/
|
||||||
|
|
||||||
// Build desktop
|
// Build desktop
|
||||||
grunt.registerTask('desktop-build', ['desktop-others', 'desktop-osx-dmg', 'desktop-osx-pkg']);
|
grunt.registerTask('build-desktop', ['build-desktop-others', 'build-desktop-osx-dmg', 'build-desktop-osx-pkg']);
|
||||||
|
|
||||||
// Build desktop win64 & linux64
|
// Build desktop win64 & linux64
|
||||||
grunt.registerTask('desktop-others', ['prod', 'nwjs:others', 'copy:linux', 'exec:create_others_dist']);
|
grunt.registerTask('build-desktop-others', ['prod', 'nwjs:others', 'copy:linux', 'exec:create_others_dist']);
|
||||||
|
|
||||||
// Build desktop osx pkg
|
// Build desktop osx pkg
|
||||||
grunt.registerTask('desktop-osx-pkg', ['prod', 'exec:get_nwjs_for_pkg', 'nwjs:pkg', 'exec:create_pkg_dist']);
|
grunt.registerTask('build-desktop-osx-pkg', ['prod', 'exec:get_nwjs_for_pkg', 'nwjs:pkg', 'exec:create_pkg_dist']);
|
||||||
|
|
||||||
// Build desktop osx dmg
|
// Build desktop osx dmg
|
||||||
grunt.registerTask('desktop-osx-dmg', ['prod', 'nwjs:dmg', 'exec:create_dmg_dist']);
|
grunt.registerTask('build-desktop-osx-dmg', ['prod', 'nwjs:dmg', 'exec:create_dmg_dist']);
|
||||||
|
|
||||||
// Sign desktop
|
// Sign desktop
|
||||||
grunt.registerTask('desktop-sign', ['exec:sign_desktop_dist']);
|
grunt.registerTask('sign-desktop', ['exec:sign_desktop_dist']);
|
||||||
|
|
||||||
// Release desktop
|
// Release desktop
|
||||||
grunt.registerTask('desktop-release', ['desktop-build', 'desktop-sign']);
|
grunt.registerTask('build-desktop-release', ['build-desktop', 'sign-desktop']);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
29
README.md
|
|
@ -1,3 +1,24 @@
|
||||||
|
This is a fork of the Bitcoin.com wallet to add additional features.
|
||||||
|
Features included:
|
||||||
|
|
||||||
|
- Zero fee transactions (only works for Bitcoin Cash). You will be asked for, if you want to send a transaction as zero fee on the confirmation page.
|
||||||
|
|
||||||
|
## Zero fee transactions:
|
||||||
|
Because most network nodes on the Bitcoin Cash network don't relay zero fee txs, you will experience some strange issues, but don't worry: for me personally the Bitcoin.com pool has included all my zero fee transactions, but please beware that the receiver probably won't see your tx before it has been confirmed and please do also keep in mind, that the transactions coming after it won't confirm or be seen before the zero fee one has been confirmed.
|
||||||
|
|
||||||
|
If you do already have a Bitcoin.com wallet, you need to create a new one to use this feature or change the wallet URL to: https://bws.freepages.dk/bws/api
|
||||||
|
|
||||||
|
## Disclaimer
|
||||||
|
|
||||||
|
Please beware this is my personal experimental project. You are more than welcome to play with it, but I don't take any responsibility of loss of funds due to errors in the code, so please make sure you made a backup before running this software.
|
||||||
|
|
||||||
|
## Builds
|
||||||
|
|
||||||
|
You can build the software yourself using the instructions below or use prebuilt binaries which can be found here (currently Windows and Linux only): https://ipfs.io/ipfs/QmR1DaS3QsDS48SzAWKUWFfmtMfJc4tgMtkSk3JFmuzewe
|
||||||
|
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
The Bitcoin.com wallet is a fork of the Copay Wallet (https://github.com/bitpay/copay).
|
The Bitcoin.com wallet is a fork of the Copay Wallet (https://github.com/bitpay/copay).
|
||||||
|
|
||||||
The Bitcoin.com wallet is a secure bitcoin wallet platform for both desktop and mobile devices. It uses [Bitcore Wallet Service](https://github.com/Bitcoin-com/bitcore-wallet-service) (our fork of the [Bitpay Bitcore Wallet Service](https://github.com/bitpay/bitcore-wallet-service)) (BWS) for peer synchronization and network interfacing.
|
The Bitcoin.com wallet is a secure bitcoin wallet platform for both desktop and mobile devices. It uses [Bitcore Wallet Service](https://github.com/Bitcoin-com/bitcore-wallet-service) (our fork of the [Bitpay Bitcore Wallet Service](https://github.com/bitpay/bitcore-wallet-service)) (BWS) for peer synchronization and network interfacing.
|
||||||
|
|
@ -113,14 +134,14 @@ npm run start:desktop
|
||||||
|
|
||||||
Before building the release version for a platform, run the `clean-all` command to delete any untracked files in your current working directory. (Be sure to stash any uncommited changes you've made.) This guarantees consistency across builds for the current state of this repository.
|
Before building the release version for a platform, run the `clean-all` command to delete any untracked files in your current working directory. (Be sure to stash any uncommited changes you've made.) This guarantees consistency across builds for the current state of this repository.
|
||||||
|
|
||||||
The `final` commands build the production version of the app, and bundle it with the release version of the platform being built.
|
The `build:*-release` commands build the production version of the app, and bundle it with the release version of the platform being built.
|
||||||
|
|
||||||
### Android
|
### Android
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm run clean-all
|
npm run clean-all
|
||||||
npm run apply:bitcoincom
|
npm run apply:bitcoincom
|
||||||
npm run final:android
|
npm run build:android-release
|
||||||
```
|
```
|
||||||
|
|
||||||
### iOS
|
### iOS
|
||||||
|
|
@ -128,7 +149,7 @@ npm run final:android
|
||||||
```sh
|
```sh
|
||||||
npm run clean-all
|
npm run clean-all
|
||||||
npm run apply:bitcoincom
|
npm run apply:bitcoincom
|
||||||
npm run final:ios
|
npm run build:ios-release
|
||||||
```
|
```
|
||||||
|
|
||||||
### Desktop (Linux, macOS, and Windows)
|
### Desktop (Linux, macOS, and Windows)
|
||||||
|
|
@ -136,7 +157,7 @@ npm run final:ios
|
||||||
```sh
|
```sh
|
||||||
npm run clean-all
|
npm run clean-all
|
||||||
npm run apply:bitcoincom
|
npm run apply:bitcoincom
|
||||||
npm run final:desktop
|
npm run build:desktop-release
|
||||||
```
|
```
|
||||||
|
|
||||||
## About The Bitcoin.com Wallet
|
## About The Bitcoin.com Wallet
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,9 @@
|
||||||
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
|
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
|
||||||
"pushSenderId": "1036948132229",
|
"pushSenderId": "1036948132229",
|
||||||
"description": "A Secure Bitcoin Wallet",
|
"description": "A Secure Bitcoin Wallet",
|
||||||
"version": "5.0.2",
|
"version": "5.1.3",
|
||||||
"fullVersion": "5.0-rc3",
|
"fullVersion": "5.1-rc2",
|
||||||
"androidVersion": "500200",
|
"androidVersion": "501003",
|
||||||
"_extraCSS": "",
|
"_extraCSS": "",
|
||||||
"_enabledExtensions": {
|
"_enabledExtensions": {
|
||||||
"coinbase": false,
|
"coinbase": false,
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,12 @@
|
||||||
<config-file platform="ios" target="*-Info.plist" parent="UIStatusBarHidden"><true/></config-file>
|
<config-file platform="ios" target="*-Info.plist" parent="UIStatusBarHidden"><true/></config-file>
|
||||||
<config-file platform="ios" target="*-Info.plist" parent="UIViewControllerBasedStatusBarAppearance"><false/></config-file>
|
<config-file platform="ios" target="*-Info.plist" parent="UIViewControllerBasedStatusBarAppearance"><false/></config-file>
|
||||||
<config-file target="*-Info.plist" parent="ITSAppUsesNonExemptEncryption"><false/></config-file>
|
<config-file target="*-Info.plist" parent="ITSAppUsesNonExemptEncryption"><false/></config-file>
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/AppIcon24x24@2x.png" width="48" height="48" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/AppIcon27.5x27.5@2x.png" width="55" height="55" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/AppIcon44x44@2x.png" width="88" height="88" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/AppIcon86x86@2x.png" width="172" height="172" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/AppIcon98x98@2x.png" width="196" height="196" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-20.png" width="20" height="20" />
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60@3x.png" width="180" height="180" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60@3x.png" width="180" height="180" />
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60.png" width="60" height="60" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60.png" width="60" height="60" />
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60@2x.png" width="120" height="120" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60@2x.png" width="120" height="120" />
|
||||||
|
|
@ -102,6 +108,7 @@
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-small@3x.png" width="87" height="87" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-small@3x.png" width="87" height="87" />
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-50.png" width="50" height="50" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-50.png" width="50" height="50" />
|
||||||
<icon src="resources/*PACKAGENAME*/ios/icon/icon-50@2x.png" width="100" height="100" />
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-50@2x.png" width="100" height="100" />
|
||||||
|
<icon src="resources/*PACKAGENAME*/ios/icon/icon-1024.png" width="1024" height="1024" />
|
||||||
|
|
||||||
<splash src="resources/*PACKAGENAME*/ios/splash/Default~iphone.png" width="320" height="480"/>
|
<splash src="resources/*PACKAGENAME*/ios/splash/Default~iphone.png" width="320" height="480"/>
|
||||||
<splash src="resources/*PACKAGENAME*/ios/splash/Default@2x~iphone.png" width="640" height="960"/>
|
<splash src="resources/*PACKAGENAME*/ios/splash/Default@2x~iphone.png" width="640" height="960"/>
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,9 @@ ln -s ../resources/bitcoin.com/mac/pkg/build.cfg build.cfg
|
||||||
rm build_mas.py
|
rm build_mas.py
|
||||||
ln -s ../resources/bitcoin.com/mac/pkg/build_mas.py build_mas.py
|
ln -s ../resources/bitcoin.com/mac/pkg/build_mas.py build_mas.py
|
||||||
|
|
||||||
echo "Signing ${APP_NAME}"
|
echo "Signing ${APP_FULLNAME}"
|
||||||
export APP_PATH="pkg/${APP_NAME}/osx64/${APP_NAME}"
|
export CURRENT_PATH=`pwd`
|
||||||
|
export APP_PATH="pkg/${APP_FULLNAME}/osx64/${APP_FULLNAME}"
|
||||||
export TMP_PATH="tmp"
|
export TMP_PATH="tmp"
|
||||||
export DIST_PATH="dist"
|
export DIST_PATH="dist"
|
||||||
|
|
||||||
|
|
@ -36,10 +37,16 @@ if [ ! -d $DIST_PATH ]; then
|
||||||
mkdir $DIST_PATH
|
mkdir $DIST_PATH
|
||||||
fi
|
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"
|
cd "${APP_PATH}.app/Contents/Versions"
|
||||||
|
ln -s "55.0.2883.87" "Current"
|
||||||
|
|
||||||
|
cd $CURRENT_PATH
|
||||||
|
chmod -vR 777 "${APP_PATH}.app/Contents"
|
||||||
|
|
||||||
|
python build_mas.py -C build.cfg -O "${TMP_PATH}/${APP_FULLNAME}.app" -I "${APP_PATH}.app" -P "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"
|
||||||
|
|
||||||
echo "Signing Done"
|
echo "Signing Done"
|
||||||
|
|
||||||
echo "Done."
|
echo "Done."
|
||||||
|
|
||||||
exit
|
exit
|
||||||
|
|
@ -87,46 +87,53 @@
|
||||||
"bitcoincashjs-fork": "^1.0.3"
|
"bitcoincashjs-fork": "^1.0.3"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "bower install",
|
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare && cd ../ && ./fix-asn1.sh",
|
||||||
"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\"",
|
"build:app-release": "grunt build-app-release",
|
||||||
"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",
|
"build:mobile-release": "grunt build-mobile-release",
|
||||||
"start:windows": "npm run build:www && npm run build:windows",
|
"build:desktop-release": "grunt build-desktop-release",
|
||||||
"start:desktop": "npm start",
|
|
||||||
"watch": "grunt watch",
|
"build:android-debug": "grunt build-android-debug",
|
||||||
|
"build:android-release": "grunt build-android-release",
|
||||||
|
|
||||||
|
"build:ios-debug": "grunt build-ios-debug",
|
||||||
|
"build:ios-release": "grunt build-ios-release",
|
||||||
|
|
||||||
|
"build:desktop": "grunt build-desktop",
|
||||||
|
"build:osx-pkg": "grunt build-desktop-osx-pkg",
|
||||||
|
"build:osx-dmg": "grunt build-desktop-osx-dmg",
|
||||||
|
"build:others": "grunt build-desktop-others",
|
||||||
|
|
||||||
|
"build:windows": "cordova prepare windows && cordova build windows -- --arch=\"ARM\"",
|
||||||
|
"build:windows-release": "cordova prepare windows && cordova build windows --release --arch=\"ARM\"",
|
||||||
"build:www": "grunt",
|
"build:www": "grunt",
|
||||||
"build:www-release": "grunt prod",
|
"build:www-release": "grunt prod",
|
||||||
"build:ios": "cordova prepare ios && cordova build ios --debug",
|
|
||||||
"build:android": "cordova prepare android && cordova build android --debug",
|
|
||||||
"build:windows": "cordova prepare windows && cordova build windows -- --arch=\"ARM\"",
|
|
||||||
"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-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 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 && 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 && cd ../ && ./fix-asn1.sh",
|
|
||||||
"test": "karma start test/karma.conf.js --single-run",
|
|
||||||
"clean": "trash platforms && trash plugins && cordova prepare",
|
"clean": "trash platforms && trash plugins && cordova prepare",
|
||||||
|
"clean-all": "git clean -dfx",
|
||||||
|
|
||||||
|
"log:android": "adb logcat | grep chromium",
|
||||||
|
|
||||||
|
"open:android": "grunt exec:android_studio",
|
||||||
|
"open:ios": "grunt exec:xcode",
|
||||||
|
|
||||||
|
"postinstall": "bower install",
|
||||||
|
|
||||||
|
"sign:android": "grunt sign-android",
|
||||||
|
"sign:desktop": "grunt sign-desktop",
|
||||||
|
|
||||||
|
"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:android": "grunt start-android",
|
||||||
|
"start:android-emulator": "grunt start-android",
|
||||||
|
"start:android-log": "grunt start-android && npm run log:android",
|
||||||
|
"start:ios": "grunt start-ios",
|
||||||
|
"start:windows": "npm run build:www && npm run build:windows",
|
||||||
|
|
||||||
|
"test": "karma start test/karma.conf.js --single-run",
|
||||||
"unstage-package": "git reset package.json",
|
"unstage-package": "git reset package.json",
|
||||||
"clean-all": "git clean -dfx"
|
"watch": "grunt watch"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cordova": "^6.3.1",
|
"cordova": "^6.3.1",
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Catalan\n"
|
"Language-Team: Catalan\n"
|
||||||
"Language: ca\n"
|
"Language: ca\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "No es pot crear la cartera"
|
msgstr "No es pot crear la cartera"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "No us podeu unir a la mateixa cartera més d'un cop"
|
msgstr "No us podeu unir a la mateixa cartera més d'un cop"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Escombratge"
|
msgstr "Escombratge"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Escombra la cartera de paper"
|
msgstr "Escombra la cartera de paper"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Escombra la cartera de paper"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "S'està escombrant la cartera..."
|
msgstr "S'està escombrant la cartera..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Explora Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Jocs de Bitcoin Cash"
|
msgstr "Jocs de Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Comparteix l'aplicació de la cartera"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Notícies"
|
msgstr "Notícies"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Menys d'1 cèntim"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Aquesta factura ja no accepta pagaments"
|
msgstr "Aquesta factura ja no accepta pagaments"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Envia la quantitat màxima"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Error desconegut."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "No hi ha cap cartera de Bitcoin Cash per transferir els fons trobats."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "No s'ha trobat cap Bitcoin Cash."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "S'ha trobat Bitcoin Core:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "No hi ha cap cartera de Bitcoin Core per transferir els fons trobats."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "No s'ha trobat cap Bitcoin Core."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "L'escaneig ha fallat"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "No s'han reconegut les dades."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "No compatible"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet no és compatible."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Obre a l'explorador web"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Adreça no vàlida"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "No s'ha definit l'import"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "L'import és inferior al mínim"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "L'import supera el límit"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Resposta no vàlida de Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Czech\n"
|
"Language-Team: Czech\n"
|
||||||
"Language: cs\n"
|
"Language: cs\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,8 +520,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Není možné vytvořit peněženku"
|
msgstr "Není možné vytvořit peněženku"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Není možné několikrát sloučit stejnou peněženku"
|
msgstr "Nelze se připojit vícekrát ke stejné peněžence"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -1297,7 +1297,7 @@ msgstr "Nastavení filtru"
|
||||||
#: src/js/services/fingerprintService.js:43
|
#: src/js/services/fingerprintService.js:43
|
||||||
#: src/js/services/fingerprintService.js:48
|
#: src/js/services/fingerprintService.js:48
|
||||||
msgid "Finger Scan Failed"
|
msgid "Finger Scan Failed"
|
||||||
msgstr "Scan otisku prstu se nezdařil"
|
msgstr "Sken otisku prstu se nezdařil"
|
||||||
|
|
||||||
#: src/js/controllers/feedback/send.js:34
|
#: src/js/controllers/feedback/send.js:34
|
||||||
#: www/views/feedback/complete.html:7
|
#: www/views/feedback/complete.html:7
|
||||||
|
|
@ -1667,7 +1667,7 @@ msgstr "Neplatná odvozovací cesta"
|
||||||
|
|
||||||
#: src/js/controllers/copayers.js:90
|
#: src/js/controllers/copayers.js:90
|
||||||
msgid "Invitation to share a {{appName}} Wallet"
|
msgid "Invitation to share a {{appName}} Wallet"
|
||||||
msgstr "Pozvání ke sdílení {{appName}} peněženky"
|
msgstr "Pozvánka ke sdílení {{appName}} peněženky"
|
||||||
|
|
||||||
#: www/views/mercadoLibreCards.html:20
|
#: www/views/mercadoLibreCards.html:20
|
||||||
#: www/views/modals/mercadolibre-card-details.html:48
|
#: www/views/modals/mercadolibre-card-details.html:48
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Sweep"
|
msgstr "Sweep"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Sweep papírové peněženky"
|
msgstr "Sweep papírové peněženky"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Sweep papírové peněženky"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Probíhá sweep peněženky..."
|
msgstr "Probíhá sweep peněženky..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Prohlédnout Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash hry"
|
msgstr "Bitcoin Cash hry"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Sdílet aplikaci peněženky"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Novinky"
|
msgstr "Novinky"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Méně než 1 koruna"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Tato faktura již nepřijímá platby"
|
msgstr "Tato faktura již nepřijímá platby"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Odeslat maximální částku"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Neznámá chyba."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Žádná Bitcoin Cash peněženka pro transfer nalezených prostředků."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Žádný Bitcoin Cash nenalezen."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Nalezen Bitcoin Core:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Žádná Bitcoin Core peněženka pro transfer nalezených prostředků."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Žádný Bitcoin Core nenalezen."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Sken selhal"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Data nebyla rozpoznána."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Nepodporováno"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet není podporován."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Otevřít ve webovém prohlížeči"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Neplatná adresa"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Částka nedefinována"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Nižší než minimální částka"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Nadlimitní částka"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Neplatná odpověď z Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Wallet kann nicht erstellt werden"
|
msgstr "Wallet kann nicht erstellt werden"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "An einem Wallet kann nicht mehrfach teilgenommen werden"
|
msgstr "An einem Wallet kann nicht mehrfach teilgenommen werden"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Leeren"
|
msgstr "Leeren"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Paperwallet löschen"
|
msgstr "Paperwallet löschen"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Paperwallet löschen"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Leere Wallet..."
|
msgstr "Leere Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Erkunden Sie Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash Spiele"
|
msgstr "Bitcoin Cash Spiele"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Die Wallet-App teilen"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Neuigkeiten"
|
msgstr "Neuigkeiten"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Weniger als 1 Cent"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Diese Rechnung akzeptiert keine Zahlungen mehr"
|
msgstr "Diese Rechnung akzeptiert keine Zahlungen mehr"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Maximalen Betrag senden"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Unbekannter Fehler."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Keine Bitcoin Cash Wallet, zu welchem Geld verschickt werden kann, gefunden."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Kein Bitcoin Cash gefunden."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core gefunden:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Keine Bitcoin Core Wallet, zu welchem Geld verschickt werden kann, gefunden."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Kein Bitcoin Core gefunden."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Scan ist fehlgeschlagen"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Daten nicht erkannt."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Nicht unterstützt"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet wird nicht unterstützt."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Im Webbrowser öffnen"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Ungültige Adresse"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Betrag ist nicht definiert"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Menge liegt unter dem Minimum"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Betrag ist über dem Grenzwert"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Ungültige Antwort von Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Spanish\n"
|
"Language-Team: Spanish\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "No se pudo crear la billetera"
|
msgstr "No se pudo crear la billetera"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "No puede unirse a la misma billetera más de una vez"
|
msgstr "No puede unirse a la misma billetera más de una vez"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2674,7 +2674,7 @@ msgstr "Guardar las direcciones que usas frecuentemente y envía Bitcoin en un c
|
||||||
|
|
||||||
#: www/views/tab-send.html:55
|
#: www/views/tab-send.html:55
|
||||||
msgid "Add your first contact"
|
msgid "Add your first contact"
|
||||||
msgstr "Añadie tu primer contacto"
|
msgstr "Añade tu primer contacto"
|
||||||
|
|
||||||
#: www/views/tab-send.html:65
|
#: www/views/tab-send.html:65
|
||||||
msgid "Your Bitcoin wallet is empty"
|
msgid "Your Bitcoin wallet is empty"
|
||||||
|
|
@ -2925,9 +2925,14 @@ msgid "Sweep"
|
||||||
msgstr "Importar"
|
msgstr "Importar"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Importar billetera en papel"
|
msgstr "Importar billetera de papel"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Importar billetera de papel"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Explora Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Juegos de Bitcoin Cash"
|
msgstr "Juegos de Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Comparte esta app"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Noticias"
|
msgstr "Noticias"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Menos de 1 centavo"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Esta factura ya no está aceptando pagos"
|
msgstr "Esta factura ya no está aceptando pagos"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Enviar cantidad máxima"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Error desconocido."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "No se encontró billetera BCH para transferir estos fondos."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "No se encontró Bitcoin Cash."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core encontrado:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "No se encontró billetera BTC para transferir estos fondos."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "No se encontró Bitcoin Core."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Falló el escaneado"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Datos no reconocidos."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "No compatible"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet no es compatible."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Abrir en navegador web"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Dirección inválida"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Cantidad no definida"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Cantidad por debajo del mínimo"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Cantidad por encima del límite"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Respuesta inválida de Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Persian\n"
|
"Language-Team: Persian\n"
|
||||||
"Language: fa\n"
|
"Language: fa\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "قادر به ایجاد کیف پول نیست"
|
msgstr "قادر به ایجاد کیف پول نیست"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "امکان بیش از یک بار پیوستن به یک کیف پول نیست"
|
msgstr "امکان بیش از یک بار پیوستن به یک کیف پول نیست"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,9 +2925,14 @@ msgid "Sweep"
|
||||||
msgstr "وارد کردن و تغییر آدرس به جدید(sweep)"
|
msgstr "وارد کردن و تغییر آدرس به جدید(sweep)"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "وارد کردن والت کاغذی و تغییر آدرس به جدید(sweep)"
|
msgstr "جاروب کردن کیف پول کاغذی"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "جاروب کردن کیف پول کاغذی"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "کاوش Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash Games"
|
msgstr "Bitcoin Cash Games"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "اشتراک گذاری نرم افزار کیف پول"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "اخبار"
|
msgstr "اخبار"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "کمتر از 1 سنت"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "این صورت حساب دیگر پرداخت ها را نمی پذیرد"
|
msgstr "این صورت حساب دیگر پرداخت ها را نمی پذیرد"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "ارسال حداکثر مقدار"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "خطای ناشناخته."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "هیچ کیف پولی از نوع Bitcoin Cash برای انتقال وجه یافت نشد."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Bitcoin Cash یافت نشد."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core یافت شده:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "هیچ کیف پولی از نوع Bitcoin Core برای انتقال وجه یافت نشد."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Bitcoin Core یافت نشد."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "اسکن انجام نشد"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "داده ها شناسایی نشد."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "پشتیبانی نشده"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet پشتیبانی نمی شود."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "آدرس"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "باز کردن در مرورگر"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "آدرس نامعتبر"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "مبلغ تعریف نشده است"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "مقدار زیر مقدار حداقل است"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "مقدار بالاتر از حد است"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "پاسخ نامعتبر از Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: French\n"
|
"Language-Team: French\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,8 +520,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Impossible de créer le portefeuille"
|
msgstr "Impossible de créer le portefeuille"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Impossible de rejoindre le même portefeuille plus d'une fois"
|
msgstr "Impossible de joindre le même portefeuille plus d'une fois"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -2925,9 +2925,14 @@ msgid "Sweep"
|
||||||
msgstr "Balayer"
|
msgstr "Balayer"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Balayer un portefeuille de papier"
|
msgstr "Balayer un portefeuille papier"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Balayer un portefeuille papier"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Explorez Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Jeux Bitcoin Cash"
|
msgstr "Jeux Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Partager l’application Wallet"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Nouvelles"
|
msgstr "Nouvelles"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Moins de 1 centime"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Cette facture n’accepte plus les paiements"
|
msgstr "Cette facture n’accepte plus les paiements"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Envoi du montant maximal"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Erreur inconnue."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Aucun portefeuille Bitcoin Cash auquel transférer des fonds trouvé."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Pas de Bitcoin Cash trouvé."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core trouvé :"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Aucun portefeuille Bitcoin Core auquel transférer des fonds trouvé."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Pas de Bitcoin Core trouvé."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Échec de l'analyse"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Données non reconnues."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Non pris en charge"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet n’est pas pris en charge."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Ouvrir dans le navigateur web"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Adresse invalide"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Le montant n’est pas défini"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Le montant est inférieur au minimum"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Le montant est supérieur à la limite"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Réponse de Shapeshift invalide"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Italian\n"
|
"Language-Team: Italian\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Impossibile creare portafoglio"
|
msgstr "Impossibile creare portafoglio"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Non è possibile aggiungere un portafoglio più di una volta"
|
msgstr "Non è possibile aggiungere un portafoglio più di una volta"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Spazzola"
|
msgstr "Spazzola"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Spazzare il portafoglio di carta"
|
msgstr "Spazzare il portafoglio di carta"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Spazzare il portafoglio di carta"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Spazzolamento Portafoglio..."
|
msgstr "Spazzolamento Portafoglio..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Esplora Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Giochi Bitcoin Cash"
|
msgstr "Giochi Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Condividere l'app Portafoglio"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "News"
|
msgstr "News"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Meno di 1 centesimo"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Questa fattura non accetta più pagamenti"
|
msgstr "Questa fattura non accetta più pagamenti"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Inviare importo massimo"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Errore sconosciuto."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Nessun portafoglio Bitcoin Cash trovato per il trasferimento di fondi."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Nessun Bitcoin Cash trovato."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core trovato:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Nessun portafoglio Bitcoin Core trovato per il trasferimento di fondi."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Nessun Bitcoin Core trovato."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Scansione non riuscita"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Dati non riconosciuti."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Non supportato"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet non supportato."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Aprire nel browser web"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Indirizzo non valido"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Importo non definito"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Importo inferiore al minimo"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Importo sopra il limite"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Risposta non valida da Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Japanese\n"
|
"Language-Team: Japanese\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -522,8 +522,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "ウォレットを作成できません。"
|
msgstr "ウォレットを作成できません。"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "同じ端末で同じウォレットに複数回参加することができません。"
|
msgstr "同じ端末で同じウォレットに複数回参加することはできません。"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -2929,10 +2929,15 @@ msgid "Sweep"
|
||||||
msgstr "全残高インポート"
|
msgstr "全残高インポート"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "ペーパーウォレットの全残高インポート"
|
msgstr "ペーパーウォレットの全残高インポート"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "ペーパーウォレットの全残高インポート"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "ビットコイン回収中…"
|
msgstr "ビットコイン回収中…"
|
||||||
|
|
@ -3798,6 +3803,10 @@ msgstr "Bitcoin.com を参照"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash ゲーム"
|
msgstr "Bitcoin Cash ゲーム"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "ウォレットアプリを共有"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "ニュース"
|
msgstr "ニュース"
|
||||||
|
|
@ -3866,3 +3875,75 @@ msgstr "1セント以下"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "この請求書はもう支払を受け付けていません"
|
msgstr "この請求書はもう支払を受け付けていません"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "全残高を送金"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "不明なエラーです。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "資金を送金できるビットコインキャッシュウォレットが見つかりません。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "ビットコインキャッシュが見つかりません。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "ビットコインが見つかりました:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "資金を送金できるビットコインウォレットが見つかりません。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "ビットコインが見つかりません。"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "スキャンできませんでした"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "データが認識されていません。"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "未対応"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet には対応していません。"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "ウェブブラウザで開く"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "無効なアドレス"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "金額が定義されていません"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "金額が最少額を下回っています"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "金額が上限を超えています"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Shapeshift から無効な応答がありました"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Korean\n"
|
"Language-Team: Korean\n"
|
||||||
"Language: ko\n"
|
"Language: ko\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -233,12 +233,12 @@ msgstr "가격 표시"
|
||||||
#: src/js/controllers/tab-settings.js:19
|
#: src/js/controllers/tab-settings.js:19
|
||||||
#: www/views/preferencesPriceDisplay.html:12
|
#: www/views/preferencesPriceDisplay.html:12
|
||||||
msgid "Fiat"
|
msgid "Fiat"
|
||||||
msgstr "고정비"
|
msgstr "법정 화폐"
|
||||||
|
|
||||||
#: src/js/controllers/tab-settings.js:19
|
#: src/js/controllers/tab-settings.js:19
|
||||||
#: www/views/preferencesPriceDisplay.html:15
|
#: www/views/preferencesPriceDisplay.html:15
|
||||||
msgid "Cryptocurrency"
|
msgid "Cryptocurrency"
|
||||||
msgstr "가상화폐"
|
msgstr "가상 화폐"
|
||||||
|
|
||||||
#: src/js/controllers/buyAmazon.js:98
|
#: src/js/controllers/buyAmazon.js:98
|
||||||
msgid "Amazon.com is not available at this moment. Please try back later."
|
msgid "Amazon.com is not available at this moment. Please try back later."
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "지갑을 생성할 수 없습니다"
|
msgstr "지갑을 생성할 수 없습니다"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "같은 지갑에 한 번 이상 접속할 수 없습니다"
|
msgstr "같은 지갑에 한 번 이상 접속할 수 없습니다"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2658,7 +2658,7 @@ msgstr "주소 붙여넣기"
|
||||||
|
|
||||||
#: www/views/tab-send.html:27
|
#: www/views/tab-send.html:27
|
||||||
msgid "Transfer between wallets"
|
msgid "Transfer between wallets"
|
||||||
msgstr "월릿 간 전송"
|
msgstr "지갑 간 전송"
|
||||||
|
|
||||||
#: www/views/tab-send.html:35
|
#: www/views/tab-send.html:35
|
||||||
msgid "Scan QR Code"
|
msgid "Scan QR Code"
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "스윕하기"
|
msgstr "스윕하기"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "종이 지갑 스윕하기"
|
msgstr "종이 지갑 스윕하기"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "종이 지갑 스윕하기"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "지갑 스윕 중..."
|
msgstr "지갑 스윕 중..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Bitcoin.com 탐색"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "BCH 게임"
|
msgstr "BCH 게임"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "지갑 응용 프로그램 공유"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "소식"
|
msgstr "소식"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "1센트 미만"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "이 청구서는 더 이상 결제를 수락하지 않습니다"
|
msgstr "이 청구서는 더 이상 결제를 수락하지 않습니다"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "최대 수량 보내는 중"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "알 수 없는 오류가 발생 했습니다."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "자금 찾을 없습니다 Bitcoin Cash 현금 지갑."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "찾을 수 없습니다 Bitcoin Cash 현금."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core 코어 발견:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "자금 찾을 없습니다 Bitcoin Core 현금 지갑."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "찾을 수 없습니다 Bitcoin Core 현금."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "검색 실패"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "데이터 인식 되지입니다."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "지원 되지 않는"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet는 지원 되지 않습니다."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "웹 브라우저에서 열기"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "주소 오류"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "금액은 정의 되지 않은"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Minimun 아래 금액은"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "제한 위에 금액은"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "변신에서 잘못 된 응답"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Dutch\n"
|
"Language-Team: Dutch\n"
|
||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,8 +520,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Kan Portemonnee Niet Aanmaken"
|
msgstr "Kan Portemonnee Niet Aanmaken"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Kan niet meerdere keren tegelijk deelnemen aan een portemonnee"
|
msgstr "Je kan niet meerdere keren tegelijk aan een portemonnee deelnemen"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -2925,9 +2925,14 @@ msgid "Sweep"
|
||||||
msgstr "Saldo opnemen"
|
msgstr "Saldo opnemen"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Saldo papieren portemonnee opnemen"
|
msgstr "Paper wallet leeghalen"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Paper wallet leeghalen"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Bitcoin.com verkennen"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash spellen"
|
msgstr "Bitcoin Cash spellen"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Wallet app delen"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Nieuws"
|
msgstr "Nieuws"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Minder dan 1 cent"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Deze factuur accepteert geen betalingen meer"
|
msgstr "Deze factuur accepteert geen betalingen meer"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Alles versturen"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Onbekende fout."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Geen Bitcoin Cash portemonnee gevonden om bedrag naartoe over te maken."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Geen Bitcoin Cash gevonden."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core gevonden:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Geen Bitcoin Core portemonnee gevonden om waarde naartoe te versturen."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Geen Bitcoin Core gevonden."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Scannen mislukt"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Gegevens niet herkend."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Niet ondersteund"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet wordt niet ondersteund."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Open in webbrowser"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Ongeldig adres"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Bedrag is niet gespecificeerd"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Bedrag lager is dan het minimum"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Bedrag is boven het limiet"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Ongeldig respons van Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Polish\n"
|
"Language-Team: Polish\n"
|
||||||
"Language: pl\n"
|
"Language: pl\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Nie można utworzyć portfela"
|
msgstr "Nie można utworzyć portfela"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Nie można dołączyć tego samego portfela więcej niż raz"
|
msgstr "Nie można dołączyć tego samego portfela więcej niż raz"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Opróżnij"
|
msgstr "Opróżnij"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Wyczyść papierowy portfel"
|
msgstr "Wyczyść papierowy portfel"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Wyczyść papierowy portfel"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Sczytywanie portfela..."
|
msgstr "Sczytywanie portfela..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Poznaj Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Gry Bitcoin Cash"
|
msgstr "Gry Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Udostępnij aplikację Portfel"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Aktualności"
|
msgstr "Aktualności"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Mniej niż 1 cent"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Nie można już opłacić tej faktury"
|
msgstr "Nie można już opłacić tej faktury"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Wyślij maksymalną kwotę"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Nieznany błąd."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Nie znaleziono portfela Bitcoin Cash do przekazania środków."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Nie znaleziono Bitcoin Cash."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Znaleziono Bitcoin Core:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Nie znaleziono portfela Bitcoin Core do przekazania środków."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Nie znaleziono Bitcoin Core."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Skanowanie nie powiodło się"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Nie rozpoznano danych."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Nieobsługiwane"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Sieć testowa nie jest obsługiwana."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "Adres URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Otwórz w przeglądarce internetowej"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Nieprawidłowy adres"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Kwota nie jest określona"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Kwota niższa od minimalnej"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Kwota przekracza limit"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Nieprawidłowa odpowiedź z Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Portuguese, Brazilian\n"
|
"Language-Team: Portuguese, Brazilian\n"
|
||||||
"Language: pt\n"
|
"Language: pt\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,8 +520,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Não é possível criar a carteira"
|
msgstr "Não é possível criar a carteira"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Não pode juntar-se a mesma carteira mais que uma vez"
|
msgstr "Não pode juntar-se à mesma carteira mais que uma vez"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -1623,7 +1623,7 @@ msgstr "Endereço de rede incorreto"
|
||||||
#: src/js/controllers/confirm.js:306
|
#: src/js/controllers/confirm.js:306
|
||||||
#: src/js/services/bwcError.js:44
|
#: src/js/services/bwcError.js:44
|
||||||
msgid "Insufficient confirmed funds"
|
msgid "Insufficient confirmed funds"
|
||||||
msgstr "Insuficiência de fundos confirmados"
|
msgstr "Insuficiência de fundos confirmada"
|
||||||
|
|
||||||
#: src/js/controllers/topup.js:165
|
#: src/js/controllers/topup.js:165
|
||||||
#: src/js/controllers/topup.js:177
|
#: src/js/controllers/topup.js:177
|
||||||
|
|
@ -2090,7 +2090,7 @@ msgstr "Abrir Projeto no GitHub"
|
||||||
#: src/js/controllers/bitpayCard.js:123
|
#: src/js/controllers/bitpayCard.js:123
|
||||||
#: src/js/controllers/tx-details.js:192
|
#: src/js/controllers/tx-details.js:192
|
||||||
msgid "Open Explorer"
|
msgid "Open Explorer"
|
||||||
msgstr "Abra o Explorer"
|
msgstr "Abrir o Explorer"
|
||||||
|
|
||||||
#: www/views/tab-scan.html:22
|
#: www/views/tab-scan.html:22
|
||||||
msgid "Open Settings"
|
msgid "Open Settings"
|
||||||
|
|
@ -2222,7 +2222,7 @@ msgstr "Detalhes do pagamento"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:6
|
#: www/views/modals/paypro.html:6
|
||||||
msgid "Payment Request"
|
msgid "Payment Request"
|
||||||
msgstr "Pedido de pagamento"
|
msgstr "Solicitação de pagamento"
|
||||||
|
|
||||||
#: www/views/mercadoLibreCards.html:22
|
#: www/views/mercadoLibreCards.html:22
|
||||||
#: www/views/modals/mercadolibre-card-details.html:39
|
#: www/views/modals/mercadolibre-card-details.html:39
|
||||||
|
|
@ -2696,7 +2696,7 @@ msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter algu
|
||||||
|
|
||||||
#: www/views/tab-send.html:74
|
#: www/views/tab-send.html:74
|
||||||
msgid "Buy Bitcoin now"
|
msgid "Buy Bitcoin now"
|
||||||
msgstr "Compre Bitcoin agora"
|
msgstr "Comprar Bitcoin agora"
|
||||||
|
|
||||||
#: www/views/tab-send.html:76
|
#: www/views/tab-send.html:76
|
||||||
msgid "Show my address"
|
msgid "Show my address"
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Limpar"
|
msgstr "Limpar"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Varrer a carteira de papel"
|
msgstr "Varrer a carteira de papel"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Varrer a carteira de papel"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Carteira de varredura..."
|
msgstr "Carteira de varredura..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Explore Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Jogos Bitcoin Cash"
|
msgstr "Jogos Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Compartilhar o app de carteira"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Notícias"
|
msgstr "Notícias"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "Menos de 1 centavo"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "Essa fatura não aceita mais pagamentos"
|
msgstr "Essa fatura não aceita mais pagamentos"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Enviar montante máximo"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Erro desconhecido."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Nenhuma carteira de Bitcoin Cash para transferir fundos encontrada."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Bitcoin Cash não encontrado."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Bitcoin Core encontrado:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Nenhuma carteira de Bitcoin Core para transferir fundos encontrada."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Nenhum Bitcoin Core encontrado."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Falha de verificação"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Dados não reconhecidos."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Não suportado"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet não suportado."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Abrir no navegador da Web"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Endereço inválido"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Montante não definido"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Montante abaixo do mínimo"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Montante acima do limite"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Resposta inválida do Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Russian\n"
|
"Language-Team: Russian\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Не удаётся создать кошелёк"
|
msgstr "Не удаётся создать кошелёк"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Нельзя присоединиться к одному и тому же кошельку более одного раза"
|
msgstr "Нельзя присоединиться к одному и тому же кошельку более одного раза"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr "Считать"
|
msgstr "Считать"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Пополнить с бумажного кошелька"
|
msgstr "Пополнить с бумажного кошелька"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Пополнить с бумажного кошелька"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr "Считывание кошелька..."
|
msgstr "Считывание кошелька..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "Обзор Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Игры Bitcoin Cash"
|
msgstr "Игры Bitcoin Cash"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "Поделиться программой «Кошелёк»"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "Новости"
|
msgstr "Новости"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "менее 1 копейки"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "По этому инвойсу платежи больше не принимаются"
|
msgstr "По этому инвойсу платежи больше не принимаются"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "Отправить максимальную сумму"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "Неизвестная ошибка."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "Не найден кошелек Bitcoin Cash для перевода средств."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "Не найден Bitcoin Cash."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "Найден Bitcoin Core:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "Не найден кошелек Bitcoin Core для перевода средств."
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "Не найден Bitcoin Core."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "Ошибка сканирования"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "Данные не распознаны."
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "Не поддерживается"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "Testnet не поддерживается."
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "URL-адрес"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "Открыть в веб-браузере"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "Неверный адрес"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "Сумма не задана"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "Сумма ниже минимума"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "Сумма больше ограничения"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Неправильный ответ от Shapeshift"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Swedish\n"
|
"Language-Team: Swedish\n"
|
||||||
"Language: sv\n"
|
"Language: sv\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-06 16:45\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Kan inte skapa plånbok"
|
msgstr "Kan inte skapa plånbok"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,10 +2925,15 @@ msgid "Sweep"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr ""
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr ""
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -511,7 +511,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2916,10 +2916,15 @@ msgid "Sweep"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3783,6 +3788,10 @@ msgstr ""
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3851,6 +3860,34 @@ msgstr ""
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/controllers/tab-scan.js:120
|
#: src/js/controllers/tab-scan.js:120
|
||||||
msgid "Scan Failed"
|
msgid "Scan Failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -3873,4 +3910,24 @@ msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:90
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
msgid "Open in web browser"
|
msgid "Open in web browser"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Vietnamese\n"
|
"Language-Team: Vietnamese\n"
|
||||||
"Language: vi\n"
|
"Language: vi\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:40\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -36,7 +36,7 @@ msgstr "{{tx.feeRateStr}} của giao dịch"
|
||||||
|
|
||||||
#: www/views/feedback/rateApp.html:7
|
#: 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!"
|
msgid "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!"
|
||||||
msgstr "5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!"
|
msgstr "{{appName}} 5-star ratings help us get {{appName}} into more hands, and more users means more resources can be committed to the app!"
|
||||||
|
|
||||||
#: www/views/mercadoLibre.html:18
|
#: www/views/mercadoLibre.html:18
|
||||||
#: www/views/mercadoLibre.html:40
|
#: www/views/mercadoLibre.html:40
|
||||||
|
|
@ -56,8 +56,8 @@ msgstr "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size all
|
||||||
|
|
||||||
#: src/js/controllers/confirm.js:395
|
#: src/js/controllers/confirm.js:395
|
||||||
msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided."
|
msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided."
|
||||||
msgstr "Tổng cộng {{amountBelowFeeStr}} đã bị loại trừ. Số tiền này đến từ UTXOs nhỏ hơn chi phí mạng cung cấp.#\n"
|
msgstr "{{amountBelowFeeStr}} Tổng cộng {{amountBelowFeeStr}} đã bị loại trừ. Số tiền này đến từ UTXOs nhỏ hơn chi phí mạng cung cấp.#\n"
|
||||||
"1"
|
"1."
|
||||||
|
|
||||||
#: src/js/controllers/preferencesAbout.js:6
|
#: src/js/controllers/preferencesAbout.js:6
|
||||||
#: www/views/tab-settings.html:156
|
#: www/views/tab-settings.html:156
|
||||||
|
|
@ -67,7 +67,7 @@ msgstr "About"
|
||||||
#: src/js/controllers/modals/txpDetails.js:62
|
#: src/js/controllers/modals/txpDetails.js:62
|
||||||
#: src/js/controllers/tx-details.js:79
|
#: src/js/controllers/tx-details.js:79
|
||||||
msgid "Accepted"
|
msgid "Accepted"
|
||||||
msgstr "Accepted"
|
msgstr "Chấp nhận"
|
||||||
|
|
||||||
#: www/views/preferencesInformation.html:72
|
#: www/views/preferencesInformation.html:72
|
||||||
msgid "Account"
|
msgid "Account"
|
||||||
|
|
@ -78,7 +78,7 @@ msgstr "Account"
|
||||||
#: www/views/tab-create-shared.html:74
|
#: www/views/tab-create-shared.html:74
|
||||||
#: www/views/tab-import-hardware.html:19
|
#: www/views/tab-import-hardware.html:19
|
||||||
msgid "Account Number"
|
msgid "Account Number"
|
||||||
msgstr "Account Number"
|
msgstr "Account Number0941162662"
|
||||||
|
|
||||||
#: www/views/tab-home.html:61
|
#: www/views/tab-home.html:61
|
||||||
msgid "Instant transactions with low fees"
|
msgid "Instant transactions with low fees"
|
||||||
|
|
@ -241,7 +241,7 @@ msgstr "Fiat"
|
||||||
#: src/js/controllers/tab-settings.js:19
|
#: src/js/controllers/tab-settings.js:19
|
||||||
#: www/views/preferencesPriceDisplay.html:15
|
#: www/views/preferencesPriceDisplay.html:15
|
||||||
msgid "Cryptocurrency"
|
msgid "Cryptocurrency"
|
||||||
msgstr "Cryptocurrency"
|
msgstr "Cryptocurrencyg"
|
||||||
|
|
||||||
#: src/js/controllers/buyAmazon.js:98
|
#: src/js/controllers/buyAmazon.js:98
|
||||||
msgid "Amazon.com is not available at this moment. Please try back later."
|
msgid "Amazon.com is not available at this moment. Please try back later."
|
||||||
|
|
@ -523,8 +523,8 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "Cannot Create Wallet"
|
msgstr "Cannot Create Wallet"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "Cannot join the same wallet more that once"
|
msgstr ""
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
msgid "Cards"
|
msgid "Cards"
|
||||||
|
|
@ -2928,9 +2928,14 @@ msgid "Sweep"
|
||||||
msgstr "Sweep"
|
msgstr "Sweep"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Sweep paper wallet"
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "Sweep Paper Wallet"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3795,6 +3800,10 @@ msgstr "Explore Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash Games"
|
msgstr "Bitcoin Cash Games"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "News"
|
msgstr "News"
|
||||||
|
|
@ -3863,3 +3872,75 @@ msgstr "Less than 1 cent"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "This invoice is no longer accepting payments"
|
msgstr "This invoice is no longer accepting payments"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ msgstr ""
|
||||||
"Last-Translator: emilold\n"
|
"Last-Translator: emilold\n"
|
||||||
"Language-Team: Chinese Simplified\n"
|
"Language-Team: Chinese Simplified\n"
|
||||||
"Language: zh\n"
|
"Language: zh\n"
|
||||||
"PO-Revision-Date: 2018-08-21 03:39\n"
|
"PO-Revision-Date: 2018-09-15 05:56\n"
|
||||||
|
|
||||||
#: www/views/modals/paypro.html:34
|
#: www/views/modals/paypro.html:34
|
||||||
msgid "(Trusted)"
|
msgid "(Trusted)"
|
||||||
|
|
@ -520,7 +520,7 @@ msgid "Cannot Create Wallet"
|
||||||
msgstr "不能创建钱包"
|
msgstr "不能创建钱包"
|
||||||
|
|
||||||
#: src/js/services/profileService.js:442
|
#: src/js/services/profileService.js:442
|
||||||
msgid "Cannot join the same wallet more that once"
|
msgid "Cannot join the same wallet more than once"
|
||||||
msgstr "无法重复加入同一个钱包"
|
msgstr "无法重复加入同一个钱包"
|
||||||
|
|
||||||
#: www/views/includes/bitpayCardsCard.html:2
|
#: www/views/includes/bitpayCardsCard.html:2
|
||||||
|
|
@ -2925,9 +2925,14 @@ msgid "Sweep"
|
||||||
msgstr "扫描"
|
msgstr "扫描"
|
||||||
|
|
||||||
#: www/views/includes/incomingDataMenu.html:89
|
#: www/views/includes/incomingDataMenu.html:89
|
||||||
#: www/views/paperWallet.html:3
|
msgctxt "List item"
|
||||||
msgid "Sweep paper wallet"
|
msgid "Sweep paper wallet"
|
||||||
msgstr "Sweep 纸钱包"
|
msgstr "清空纸钱包"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:3
|
||||||
|
msgctxt "Page title"
|
||||||
|
msgid "Sweep Paper Wallet"
|
||||||
|
msgstr "清空纸钱包"
|
||||||
|
|
||||||
#: src/js/services/onGoingProcess.js:33
|
#: src/js/services/onGoingProcess.js:33
|
||||||
msgid "Sweeping Wallet..."
|
msgid "Sweeping Wallet..."
|
||||||
|
|
@ -3792,6 +3797,10 @@ msgstr "探索 Bitcoin.com"
|
||||||
msgid "Bitcoin Cash Games"
|
msgid "Bitcoin Cash Games"
|
||||||
msgstr "Bitcoin Cash 游戏"
|
msgstr "Bitcoin Cash 游戏"
|
||||||
|
|
||||||
|
#: www/views/includes/community.html:29
|
||||||
|
msgid "Share the Wallet App"
|
||||||
|
msgstr "分享钱包应用"
|
||||||
|
|
||||||
#: src/js/services/bitcoincomService.js:28
|
#: src/js/services/bitcoincomService.js:28
|
||||||
msgid "News"
|
msgid "News"
|
||||||
msgstr "新闻"
|
msgstr "新闻"
|
||||||
|
|
@ -3860,3 +3869,75 @@ msgstr "少于 1 美分"
|
||||||
msgid "This invoice is no longer accepting payments"
|
msgid "This invoice is no longer accepting payments"
|
||||||
msgstr "此发票不再接受付款"
|
msgstr "此发票不再接受付款"
|
||||||
|
|
||||||
|
#: www/views/amount.html.js:60
|
||||||
|
msgid "Send Maximum Amount"
|
||||||
|
msgstr "发送最大金额"
|
||||||
|
|
||||||
|
#: src/js/controllers/amount.controller.js:239
|
||||||
|
msgid "Unknown error."
|
||||||
|
msgstr "未知错误。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:48
|
||||||
|
msgid "No Bitcoin Cash wallet to transfer funds to found."
|
||||||
|
msgstr "未找到可以转入资金的 Bitcoin Cash 钱包。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:54
|
||||||
|
msgid "No Bitcoin Cash found."
|
||||||
|
msgstr "未找到 Bitcoin Cash。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:60
|
||||||
|
msgid "Bitcoin Core found:"
|
||||||
|
msgstr "已找到 Bitcoin Core:"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:98
|
||||||
|
msgid "No Bitcoin Core wallet to transfer funds to found."
|
||||||
|
msgstr "未找到可以转入资金的 Bitcoin Core 钱包。"
|
||||||
|
|
||||||
|
#: www/views/paperWallet.html:104
|
||||||
|
msgid "No Bitcoin Core found."
|
||||||
|
msgstr "未找到 Bitcoin Core。"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:120
|
||||||
|
msgid "Scan Failed"
|
||||||
|
msgstr "扫描失败"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Data not recognised."
|
||||||
|
msgstr "数据未被识别。"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Unsupported"
|
||||||
|
msgstr "不受支持"
|
||||||
|
|
||||||
|
#: src/js/controllers/tab-scan.js:121
|
||||||
|
msgid "Testnet is not supported."
|
||||||
|
msgstr "不支持测试网。"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:81
|
||||||
|
msgid "URL"
|
||||||
|
msgstr "网址"
|
||||||
|
|
||||||
|
#: www/views/includes/incomingDataMenu.html:90
|
||||||
|
msgid "Open in web browser"
|
||||||
|
msgstr "在网络浏览器中打开"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid address"
|
||||||
|
msgstr "地址无效"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is not defined"
|
||||||
|
msgstr "未定义金额"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is below the minimun"
|
||||||
|
msgstr "金额低于最低金额"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Amount is above the limit"
|
||||||
|
msgstr "金额高于限额"
|
||||||
|
|
||||||
|
#: src/js/services/shapeshift.service.js.html:90
|
||||||
|
msgid "Invalid response from Shapeshift"
|
||||||
|
msgstr "Shapeshift 的响应无效"
|
||||||
|
|
||||||
|
|
|
||||||
BIN
resources/bitcoin.com/ios/icon/AppIcon24x24@2x.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
resources/bitcoin.com/ios/icon/AppIcon27.5x27.5@2x.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/bitcoin.com/ios/icon/AppIcon44x44@2x.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
resources/bitcoin.com/ios/icon/AppIcon86x86@2x.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
resources/bitcoin.com/ios/icon/AppIcon98x98@2x.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
resources/bitcoin.com/ios/icon/icon-1024.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
resources/bitcoin.com/ios/icon/icon-20.png
Normal file
|
After Width: | Height: | Size: 425 B |
|
|
@ -178,11 +178,17 @@ def codesign_app(config, args):
|
||||||
|
|
||||||
plistlib.writePlist(child_entitlements, tmp_child_entitlements)
|
plistlib.writePlist(child_entitlements, tmp_child_entitlements)
|
||||||
info('Child entitlements: %s' % 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))
|
libffmpeg = glob(os.path.join(args.output, 'Contents/Versions/55.0.2883.87/nwjs Framework.framework/Versions/A'), 'libffmpeg.dylib', returnOnFound=True)
|
||||||
helperApp = glob(args.output, 'nwjs Helper.app', returnOnFound=True)
|
system('codesign --deep --force --verbose --verify --sign "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, libffmpeg))
|
||||||
system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, helperApp))
|
libnode = glob(os.path.join(args.output, 'Contents/Versions/55.0.2883.87/nwjs Framework.framework/Versions/A'), 'libnode.dylib', returnOnFound=True)
|
||||||
|
system('codesign --deep --force --verbose --verify --sign "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, libnode))
|
||||||
|
|
||||||
|
helperApp = glob(args.output, 'nwjs Helper.app', returnOnFound=True)
|
||||||
|
system('codesign --deep --force --verbose --verify --sign "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, helperApp))
|
||||||
|
framework = glob(args.output, 'nwjs Framework.framework', returnOnFound=True)
|
||||||
|
system('codesign --deep --force --verbose --verify --sign "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, framework))
|
||||||
|
|
||||||
## sign parent app
|
## sign parent app
|
||||||
(_, tmp_parent_entitlements) = tempfile.mkstemp()
|
(_, tmp_parent_entitlements) = tempfile.mkstemp()
|
||||||
if config.has_option('Sign', 'ParentEntitlements'):
|
if config.has_option('Sign', 'ParentEntitlements'):
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<string>$GROUPID</string>
|
<array>
|
||||||
|
<string>299HJ3G3BP.com.bitcoin.mwallet.mac</string>
|
||||||
|
</array>
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
<key>com.apple.security.files.user-selected.read-only</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.network.client</key>
|
<key>com.apple.security.network.client</key>
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ var modules = [
|
||||||
'copayApp.controllers',
|
'copayApp.controllers',
|
||||||
'copayApp.directives',
|
'copayApp.directives',
|
||||||
'copayApp.addons',
|
'copayApp.addons',
|
||||||
|
'bitcoincom.controllers',
|
||||||
'bitcoincom.directives',
|
'bitcoincom.directives',
|
||||||
'bitcoincom.services'
|
'bitcoincom.services'
|
||||||
];
|
];
|
||||||
|
|
@ -30,5 +31,6 @@ angular.module('copayApp.services', []);
|
||||||
angular.module('copayApp.controllers', []);
|
angular.module('copayApp.controllers', []);
|
||||||
angular.module('copayApp.directives', []);
|
angular.module('copayApp.directives', []);
|
||||||
angular.module('copayApp.addons', []);
|
angular.module('copayApp.addons', []);
|
||||||
|
angular.module('bitcoincom.controllers', []);
|
||||||
angular.module('bitcoincom.directives', []);
|
angular.module('bitcoincom.directives', []);
|
||||||
angular.module('bitcoincom.services', []);
|
angular.module('bitcoincom.services', []);
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,23 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('amountController', amountController);
|
(function(){
|
||||||
|
|
||||||
function amountController(configService, $filter, gettextCatalog, $ionicHistory, $ionicModal, $ionicScrollDelegate, lodash, $log, nodeWebkitService, rateService, $scope, $state, $timeout, sendFlowService, shapeshiftService, txFormatService, platformInfo, profileService, walletService, $window) {
|
angular
|
||||||
|
.module('bitcoincom.controllers')
|
||||||
|
.controller('amountController', amountController);
|
||||||
|
|
||||||
|
function amountController(configService, $filter, gettextCatalog, $ionicHistory, $ionicModal, $ionicScrollDelegate, lodash, $log, nodeWebkitService, rateService, $scope, $state, $timeout, sendFlowService, shapeshiftService, txFormatService, platformInfo, ongoingProcess, popupService, profileService, walletService, $window) {
|
||||||
var vm = this;
|
var vm = this;
|
||||||
|
|
||||||
|
// Variables
|
||||||
vm.allowSend = false;
|
vm.allowSend = false;
|
||||||
vm.altCurrencyList = [];
|
vm.altCurrencyList = [];
|
||||||
vm.alternativeAmount = '';
|
vm.alternativeAmount = '';
|
||||||
vm.alternativeUnit = '';
|
vm.alternativeUnit = '';
|
||||||
vm.amount = '0';
|
vm.amount = '0';
|
||||||
vm.availableFunds = '';
|
vm.availableFunds = '';
|
||||||
|
vm.canSendAllAvailableFunds = true;
|
||||||
|
vm.errorMessage = '';
|
||||||
// Use insufficient for logic, as when the amount is invalid, funds being
|
// Use insufficient for logic, as when the amount is invalid, funds being
|
||||||
// either sufficent or insufficient doesn't make sense.
|
// either sufficent or insufficient doesn't make sense.
|
||||||
vm.fundsAreInsufficient = false;
|
vm.fundsAreInsufficient = false;
|
||||||
|
|
@ -20,9 +27,13 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
vm.lastUsedPopularList = [];
|
vm.lastUsedPopularList = [];
|
||||||
vm.maxAmount = 0;
|
vm.maxAmount = 0;
|
||||||
vm.minAmount = 0;
|
vm.minAmount = 0;
|
||||||
|
vm.sendableFunds = '';
|
||||||
|
vm.showSendMaxButton = false;
|
||||||
|
vm.showSendLimitMaxButton = false;
|
||||||
vm.thirdParty = false;
|
vm.thirdParty = false;
|
||||||
vm.unit = '';
|
vm.unit = '';
|
||||||
|
|
||||||
|
// Functions
|
||||||
vm.changeUnit = changeUnit;
|
vm.changeUnit = changeUnit;
|
||||||
vm.close = close;
|
vm.close = close;
|
||||||
vm.findCurrency = findCurrency;
|
vm.findCurrency = findCurrency;
|
||||||
|
|
@ -35,7 +46,7 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
vm.removeDigit = removeDigit;
|
vm.removeDigit = removeDigit;
|
||||||
vm.save = save;
|
vm.save = save;
|
||||||
vm.sendMax = sendMax;
|
vm.sendMax = sendMax;
|
||||||
vm.errorMessage = '';
|
|
||||||
|
|
||||||
$scope.$on('$ionicView.beforeEnter', onBeforeEnter);
|
$scope.$on('$ionicView.beforeEnter', onBeforeEnter);
|
||||||
$scope.$on('$ionicView.leave', onLeave);
|
$scope.$on('$ionicView.leave', onLeave);
|
||||||
|
|
@ -46,10 +57,8 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
|
|
||||||
var altCurrencyModal = null;
|
var altCurrencyModal = null;
|
||||||
var altUnitIndex = 0;
|
var altUnitIndex = 0;
|
||||||
var availableFundsInCrypto = '';
|
|
||||||
var availableFundsInFiat = '';
|
|
||||||
var availableSatoshis = null;
|
|
||||||
var availableUnits = [];
|
var availableUnits = [];
|
||||||
|
var canSendMax = true;
|
||||||
var fiatCode;
|
var fiatCode;
|
||||||
var isNW = platformInfo.isNW;
|
var isNW = platformInfo.isNW;
|
||||||
var isAndroid = platformInfo.isAndroid;
|
var isAndroid = platformInfo.isAndroid;
|
||||||
|
|
@ -57,10 +66,18 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
var lastUsedAltCurrencyList = [];
|
var lastUsedAltCurrencyList = [];
|
||||||
var passthroughParams = {};
|
var passthroughParams = {};
|
||||||
var satToUnit;
|
var satToUnit;
|
||||||
|
var transactionSendableAmount = {
|
||||||
|
crypto: '',
|
||||||
|
satoshis: null
|
||||||
|
};
|
||||||
var unitDecimals;
|
var unitDecimals;
|
||||||
var unitIndex = 0;
|
var unitIndex = 0;
|
||||||
var unitToSatoshi;
|
var unitToSatoshi;
|
||||||
var useSendMax = false;
|
var useSendMax = false;
|
||||||
|
var walletSpendableAmount = {
|
||||||
|
crypto: '',
|
||||||
|
satoshis: null
|
||||||
|
};
|
||||||
|
|
||||||
function onLeave() {
|
function onLeave() {
|
||||||
angular.element($window).off('keydown');
|
angular.element($window).off('keydown');
|
||||||
|
|
@ -74,7 +91,6 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
initCurrencies();
|
initCurrencies();
|
||||||
|
|
||||||
passthroughParams = sendFlowService.state.getClone();
|
passthroughParams = sendFlowService.state.getClone();
|
||||||
|
|
||||||
console.log('amount onBeforeEnter after back sendflow ', passthroughParams);
|
console.log('amount onBeforeEnter after back sendflow ', passthroughParams);
|
||||||
|
|
||||||
vm.fromWalletId = passthroughParams.fromWalletId;
|
vm.fromWalletId = passthroughParams.fromWalletId;
|
||||||
|
|
@ -82,29 +98,13 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
vm.minAmount = parseFloat(passthroughParams.minAmount);
|
vm.minAmount = parseFloat(passthroughParams.minAmount);
|
||||||
vm.maxAmount = parseFloat(passthroughParams.maxAmount);
|
vm.maxAmount = parseFloat(passthroughParams.maxAmount);
|
||||||
|
|
||||||
if (passthroughParams.thirdParty) {
|
|
||||||
vm.thirdParty = passthroughParams.thirdParty; // Parse stringified JSON-object
|
|
||||||
if (vm.thirdParty) {
|
|
||||||
if (vm.thirdParty.id === 'shapeshift') {
|
|
||||||
if (!vm.thirdParty.data) {
|
|
||||||
vm.thirdParty.data = {};
|
|
||||||
}
|
|
||||||
vm.thirdParty.data['fromWalletId'] = vm.fromWalletId;
|
|
||||||
|
|
||||||
vm.fromWallet = profileService.getWallet(vm.fromWalletId);
|
|
||||||
vm.toWallet = profileService.getWallet(vm.toWalletId);
|
|
||||||
|
|
||||||
shapeshiftService.getMarketData(vm.fromWallet.coin, vm.toWallet.coin, function(data) {
|
|
||||||
vm.thirdParty.data['minAmount'] = vm.minAmount = parseFloat(data.minimum);
|
|
||||||
vm.thirdParty.data['maxAmount'] = vm.maxAmount = parseFloat(data.maxLimit);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vm.isRequestingSpecificAmount = !passthroughParams.fromWalletId;
|
vm.isRequestingSpecificAmount = !passthroughParams.fromWalletId;
|
||||||
|
vm.showSendMaxButton = !vm.isRequestingSpecificAmount;
|
||||||
|
|
||||||
var config = configService.getSync().wallet.settings;
|
var config = configService.getSync().wallet.settings;
|
||||||
|
unitToSatoshi = config.unitToSatoshi;
|
||||||
|
satToUnit = 1 / unitToSatoshi;
|
||||||
|
unitDecimals = config.unitDecimals;
|
||||||
|
|
||||||
setAvailableUnits();
|
setAvailableUnits();
|
||||||
updateUnitUI();
|
updateUnitUI();
|
||||||
|
|
@ -113,7 +113,7 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
var reOp = /^[\*\+\-\/]$/;
|
var reOp = /^[\*\+\-\/]$/;
|
||||||
|
|
||||||
if (!isAndroid && !isIos) {
|
if (!isAndroid && !isIos) {
|
||||||
var disableKeys = angular.element($window).on('keydown', function(e) {
|
angular.element($window).on('keydown', function(e) {
|
||||||
if (!e.key) return;
|
if (!e.key) return;
|
||||||
if (e.which === 8) { // you can add others here inside brackets.
|
if (e.which === 8) { // you can add others here inside brackets.
|
||||||
if (!altCurrencyModal) {
|
if (!altCurrencyModal) {
|
||||||
|
|
@ -136,10 +136,7 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
unitToSatoshi = config.unitToSatoshi;
|
|
||||||
satToUnit = 1 / unitToSatoshi;
|
|
||||||
unitDecimals = config.unitDecimals;
|
|
||||||
|
|
||||||
resetAmount();
|
resetAmount();
|
||||||
|
|
||||||
processAmount();
|
processAmount();
|
||||||
|
|
@ -211,6 +208,13 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
var fromWallet = profileService.getWallet(passthroughParams.fromWalletId);
|
var fromWallet = profileService.getWallet(passthroughParams.fromWalletId);
|
||||||
updateAvailableFundsFromWallet(fromWallet);
|
updateAvailableFundsFromWallet(fromWallet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (passthroughParams.thirdParty) {
|
||||||
|
vm.thirdParty = passthroughParams.thirdParty; // Parse stringified JSON-object
|
||||||
|
if (vm.thirdParty) {
|
||||||
|
initShapeshift();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,6 +222,34 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
sendFlowService.router.goBack();
|
sendFlowService.router.goBack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function initShapeshift() {
|
||||||
|
if (vm.thirdParty.id === 'shapeshift') {
|
||||||
|
vm.thirdParty.data = vm.thirdParty.data || {};
|
||||||
|
|
||||||
|
vm.fromWallet = profileService.getWallet(vm.fromWalletId);
|
||||||
|
vm.toWallet = profileService.getWallet(vm.toWalletId);
|
||||||
|
|
||||||
|
vm.showSendMaxButton = false;
|
||||||
|
vm.showSendLimitMaxButton = false;
|
||||||
|
vm.canSendAllAvailableFunds = false;
|
||||||
|
|
||||||
|
ongoingProcess.set('connectingShapeshift', true);
|
||||||
|
shapeshiftService.getMarketData(vm.fromWallet.coin, vm.toWallet.coin, function onMarketData(err, data) {
|
||||||
|
ongoingProcess.set('connectingShapeshift', false);
|
||||||
|
if (err) {
|
||||||
|
// Error stop here
|
||||||
|
popupService.showAlert(gettextCatalog.getString('Shapeshift Error'), err.message, function () {
|
||||||
|
goBack();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
vm.thirdParty.data.minAmount = vm.minAmount = parseFloat(data.minimum);
|
||||||
|
vm.thirdParty.data.maxAmount = vm.maxAmount = parseFloat(data.maxLimit);
|
||||||
|
setMaximumButtonFromWallet(vm.fromWallet);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function paste(value) {
|
function paste(value) {
|
||||||
vm.amount = value;
|
vm.amount = value;
|
||||||
processAmount();
|
processAmount();
|
||||||
|
|
@ -233,8 +265,28 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendMax() {
|
function sendMax() {
|
||||||
useSendMax = true;
|
if (canSendMax) {
|
||||||
finish();
|
useSendMax = true;
|
||||||
|
finish();
|
||||||
|
} else {
|
||||||
|
var transactionSendableAmountInUnits = transactionSendableAmount.satoshis * satToUnit;
|
||||||
|
if (vm.minAmount && transactionSendableAmountInUnits < vm.minAmount) {
|
||||||
|
popupService.showAlert(
|
||||||
|
gettextCatalog.getString('Insufficient funds'),
|
||||||
|
gettextCatalog.getString('Amount below minimum allowed')
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Need to be precise, so use crypto directly rather than fiat with exchange rate
|
||||||
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
|
var tempIndex = altUnitIndex;
|
||||||
|
altUnitIndex = unitIndex;
|
||||||
|
unitIndex = tempIndex;
|
||||||
|
}
|
||||||
|
vm.amount = transactionSendableAmountInUnits.toFixed(LENGTH_AFTER_COMMA_EXPRESSION_LIMIT);
|
||||||
|
useSendMax = true;
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateUnitUI() {
|
function updateUnitUI() {
|
||||||
|
|
@ -354,8 +406,8 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
amountInCrypto = a;
|
amountInCrypto = a;
|
||||||
var amountInSatoshis = a * unitToSatoshi;
|
var amountInSatoshis = a * unitToSatoshi;
|
||||||
vm.fundsAreInsufficient = !!passthroughParams.fromWalletId
|
vm.fundsAreInsufficient = !!passthroughParams.fromWalletId
|
||||||
&& availableSatoshis !== null
|
&& walletSpendableAmount.satoshis !== null
|
||||||
&& availableSatoshis < amountInSatoshis;
|
&& walletSpendableAmount.satoshis < amountInSatoshis;
|
||||||
|
|
||||||
vm.alternativeAmount = txFormatService.formatAmount(amountInSatoshis, true);
|
vm.alternativeAmount = txFormatService.formatAmount(amountInSatoshis, true);
|
||||||
vm.allowSend = lodash.isNumber(a)
|
vm.allowSend = lodash.isNumber(a)
|
||||||
|
|
@ -375,8 +427,8 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
} else {
|
} else {
|
||||||
amountInCrypto = result;
|
amountInCrypto = result;
|
||||||
vm.fundsAreInsufficient = passthroughParams.fromWalletId
|
vm.fundsAreInsufficient = passthroughParams.fromWalletId
|
||||||
&& availableSatoshis !== null
|
&& walletSpendableAmount.satoshis !== null
|
||||||
&& availableSatoshis < result * unitToSatoshi;
|
&& walletSpendableAmount.satoshis < result * unitToSatoshi;
|
||||||
|
|
||||||
vm.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
|
vm.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
|
||||||
vm.allowSend = lodash.isNumber(result)
|
vm.allowSend = lodash.isNumber(result)
|
||||||
|
|
@ -450,13 +502,13 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
|
|
||||||
var satoshis = 0;
|
var satoshis = 0;
|
||||||
if (unit.isFiat) {
|
if (unit.isFiat) {
|
||||||
satoshis = (fromFiat(uiAmount) * unitToSatoshi).toFixed(0);
|
satoshis = Math.floor(fromFiat(uiAmount) * unitToSatoshi);
|
||||||
} else {
|
} else {
|
||||||
satoshis = (uiAmount * unitToSatoshi).toFixed(0);
|
satoshis = Math.floor(uiAmount * unitToSatoshi);
|
||||||
}
|
}
|
||||||
|
|
||||||
var confirmData = {
|
var confirmData = {
|
||||||
amount: useSendMax ? undefined : satoshis,
|
amount: (useSendMax && canSendMax) ? undefined : satoshis,
|
||||||
displayAddress: passthroughParams.displayAddress,
|
displayAddress: passthroughParams.displayAddress,
|
||||||
fromWalletId: passthroughParams.fromWalletId,
|
fromWalletId: passthroughParams.fromWalletId,
|
||||||
sendMax: useSendMax,
|
sendMax: useSendMax,
|
||||||
|
|
@ -472,7 +524,7 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
$state.transitionTo('tabs.paymentRequest.confirm', confirmData);
|
$state.transitionTo('tabs.paymentRequest.confirm', confirmData);
|
||||||
} else {
|
} else {
|
||||||
sendFlowService.goNext(confirmData);
|
sendFlowService.goNext(confirmData);
|
||||||
$scope.useSendMax = null;
|
useSendMax = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -590,18 +642,73 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAvailableFundsStringIfNeeded() {
|
function updateAvailableFundsStringIfNeeded() {
|
||||||
if (passthroughParams.fromWalletId && availableSatoshis !== null) {
|
if (passthroughParams.fromWalletId && walletSpendableAmount.satoshis !== null) {
|
||||||
availableFundsInFiat = '';
|
vm.availableFunds = walletSpendableAmount.crypto;
|
||||||
vm.availableFunds = availableFundsInCrypto;
|
|
||||||
|
|
||||||
if (availableUnits[unitIndex].isFiat) {
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
var coin = availableUnits[altUnitIndex].id;
|
var coin = availableUnits[altUnitIndex].id;
|
||||||
txFormatService.formatAlternativeStr(coin, availableSatoshis, function formatCallback(formatted){
|
txFormatService.formatAlternativeStr(coin, walletSpendableAmount.satoshis, function formatCallback(formatted){
|
||||||
if (formatted) {
|
|
||||||
availableFundsInFiat = formatted;
|
|
||||||
|
|
||||||
|
if (formatted) {
|
||||||
$scope.$apply(function() {
|
$scope.$apply(function() {
|
||||||
vm.availableFunds = availableFundsInFiat;
|
vm.availableFunds = formatted;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
updateMaximumButtonIfNeeded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateAvailableFundsFromWallet(wallet) {
|
||||||
|
console.log('amount updateAvailableFundsFromWallet()');
|
||||||
|
var availableFundsInFiat = '';
|
||||||
|
if (wallet.status && wallet.status.isValid) {
|
||||||
|
walletSpendableAmount.crypto = wallet.status.spendableBalanceStr;
|
||||||
|
walletSpendableAmount.satoshis = wallet.status.spendableAmount;
|
||||||
|
if (wallet.status.alternativeBalanceAvailable) {
|
||||||
|
availableFundsInFiat = wallet.status.spendableBalanceAlternative + ' ' + wallet.status.alternativeIsoCode;
|
||||||
|
} else {
|
||||||
|
availableFundsInFiat = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (wallet.cachedStatus && wallet.cachedStatus.isValid) {
|
||||||
|
|
||||||
|
if (wallet.cachedStatus.alternativeBalanceAvailable) {
|
||||||
|
availableFundsInFiat = wallet.cachedStatus.spendableBalanceAlternative + ' ' + wallet.cachedStatus.alternativeIsoCode;
|
||||||
|
} else {
|
||||||
|
availableFundsInFiat = '';
|
||||||
|
}
|
||||||
|
walletSpendableAmount.crypto = wallet.cachedStatus.spendableBalanceStr;
|
||||||
|
walletSpendableAmount.satoshis = wallet.cachedStatus.spendableAmount;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
walletSpendableAmount.crypto = '';
|
||||||
|
walletSpendableAmount.satoshis = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
|
vm.availableFunds = availableFundsInFiat || walletSpendableAmount.crypto;
|
||||||
|
} else {
|
||||||
|
vm.availableFunds = walletSpendableAmount.crypto;
|
||||||
|
}
|
||||||
|
|
||||||
|
setMaximumButtonFromWallet(wallet);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateMaximumButtonIfNeeded() {
|
||||||
|
console.log('sendmax updateMaximumButtonIfNeeded()');
|
||||||
|
if (vm.showSendMaxButton || vm.showSendLimitMaxButton) {
|
||||||
|
transactionSendableAmount.fiat = '';
|
||||||
|
vm.sendableFunds = transactionSendableAmount.crypto;
|
||||||
|
|
||||||
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
|
var coin = availableUnits[altUnitIndex].id;
|
||||||
|
txFormatService.formatAlternativeStr(coin, transactionSendableAmount.satoshis, function formatCallback(formatted){
|
||||||
|
if (formatted) {
|
||||||
|
$scope.$apply(function onApply() {
|
||||||
|
vm.sendableFunds = formatted;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -609,37 +716,59 @@ function amountController(configService, $filter, gettextCatalog, $ionicHistory,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateAvailableFundsFromWallet(wallet) {
|
function setMaximumButtonFromWallet(wallet) {
|
||||||
if (wallet.status && wallet.status.isValid) {
|
console.log('sendmax setMaximumButtonFromWallet()');
|
||||||
availableFundsInCrypto = wallet.status.spendableBalanceStr;
|
var minSatoshis = vm.minAmount * unitToSatoshi;
|
||||||
availableSatoshis = wallet.status.spendableAmount;
|
var maxSatoshis = vm.maxAmount * unitToSatoshi;
|
||||||
if (wallet.status.alternativeBalanceAvailable) {
|
|
||||||
availableFundsInFiat = wallet.status.spendableBalanceAlternative + ' ' + wallet.status.alternativeIsoCode;
|
if (minSatoshis > walletSpendableAmount.satoshis) {
|
||||||
|
console.log('sendmax Hiding max buttons as minimum is too high.');
|
||||||
|
canSendMax = false;
|
||||||
|
vm.showSendMaxButton = true;
|
||||||
|
vm.showSendLimitMaxButton = false;
|
||||||
|
transactionSendableAmount.satoshis = walletSpendableAmount.satoshis;
|
||||||
|
|
||||||
|
} else if (maxSatoshis) {
|
||||||
|
if (walletSpendableAmount.satoshis > maxSatoshis) {
|
||||||
|
console.log('sendmax Showing max limit button as available is greater than max limit.');
|
||||||
|
canSendMax = false;
|
||||||
|
vm.showSendMaxButton = false;
|
||||||
|
vm.showSendLimitMaxButton = true;
|
||||||
|
transactionSendableAmount.satoshis = maxSatoshis;
|
||||||
} else {
|
} else {
|
||||||
availableFundsInFiat = '';
|
console.log('sendmax Showing sendmax as all available as less than max limit.');
|
||||||
|
// Enabling send max here is a little dangerous, if they receive funds between pressing
|
||||||
|
// this and the calculation in the Review screen.
|
||||||
|
canSendMax = false;
|
||||||
|
vm.showSendMaxButton = true;
|
||||||
|
vm.showSendLimitMaxButton = false;
|
||||||
|
transactionSendableAmount.satoshis = walletSpendableAmount.satoshis;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (wallet.cachedStatus && wallet.status.isValid) {
|
} else {
|
||||||
|
console.log('sendmax Showing sendmax as all available because no limits.');
|
||||||
|
canSendMax = true;
|
||||||
|
vm.showSendMaxButton = true;
|
||||||
|
vm.showSendLimitMaxButton = false;
|
||||||
|
transactionSendableAmount.satoshis = walletSpendableAmount.satoshis;
|
||||||
|
}
|
||||||
|
|
||||||
if (wallet.cachedStatus.alternativeBalanceAvailable) {
|
if (vm.showSendMaxButton || vm.showSendLimitMaxButton) {
|
||||||
availableFundsInFiat = wallet.cachedStatus.spendableBalanceAlternative + ' ' + wallet.cachedStatus.alternativeIsoCode;
|
console.log('sendmax Setting max button text');
|
||||||
} else {
|
transactionSendableAmount.crypto = txFormatService.formatAmountStr(wallet.coin, transactionSendableAmount.satoshis);
|
||||||
availableFundsInFiat = '';
|
vm.sendableFunds = transactionSendableAmount.crypto;
|
||||||
|
|
||||||
|
if (availableUnits[unitIndex].isFiat) {
|
||||||
|
txFormatService.formatAlternativeStr(wallet.coin, transactionSendableAmount.satoshis, function onFormat(formatted){
|
||||||
|
if (formatted) {
|
||||||
|
$scope.$apply(function onApply() {
|
||||||
|
vm.sendableFunds = formatted;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
availableFundsInCrypto = wallet.cachedStatus.spendableBalanceStr;
|
|
||||||
availableSatoshis = wallet.cachedStatus.spendableAmount;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
availableFundsInFiat = '';
|
|
||||||
availableFundsInCrypto = '';
|
|
||||||
availableSatoshis = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availableUnits[unitIndex].isFiat) {
|
|
||||||
vm.availableFunds = availableFundsInFiat || availableFundsInCrypto;
|
|
||||||
} else {
|
|
||||||
vm.availableFunds = availableFundsInCrypto;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})();
|
||||||
|
|
@ -1,14 +1,20 @@
|
||||||
describe('amountController', function(){
|
describe('amountController', function(){
|
||||||
var configCache,
|
var configCache,
|
||||||
configService,
|
configService,
|
||||||
|
gettextCatalog,
|
||||||
$controller,
|
$controller,
|
||||||
$ionicHistory,
|
$ionicHistory,
|
||||||
$rootScope,
|
$rootScope,
|
||||||
|
ongoingProcess,
|
||||||
platformInfo,
|
platformInfo,
|
||||||
|
popupService,
|
||||||
profileService,
|
profileService,
|
||||||
rateService,
|
rateService,
|
||||||
sendFlowService,
|
sendFlowService,
|
||||||
shapeshiftService,
|
shapeshiftService,
|
||||||
|
txFormatService,
|
||||||
|
$scope,
|
||||||
|
$state,
|
||||||
$stateParams;
|
$stateParams;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -20,7 +26,7 @@ describe('amountController', function(){
|
||||||
configCache = {
|
configCache = {
|
||||||
wallet: {
|
wallet: {
|
||||||
settings: {
|
settings: {
|
||||||
|
unitToSatoshi: 100000000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -33,20 +39,42 @@ describe('amountController', function(){
|
||||||
});
|
});
|
||||||
configService.getSync.and.returnValue(configCache);
|
configService.getSync.and.returnValue(configCache);
|
||||||
|
|
||||||
|
gettextCatalog = jasmine.createSpyObj(['getString']);
|
||||||
|
gettextCatalog.getString.and.callFake(function(str){ return str; });
|
||||||
$ionicHistory = jasmine.createSpyObj(['backView']);
|
$ionicHistory = jasmine.createSpyObj(['backView']);
|
||||||
|
|
||||||
|
ongoingProcess = jasmine.createSpyObj(['set']);
|
||||||
|
|
||||||
platformInfo = {
|
platformInfo = {
|
||||||
isChromeApp: false,
|
isChromeApp: false,
|
||||||
isAndroid: false,
|
isAndroid: false,
|
||||||
isIos: true
|
isIos: true
|
||||||
};
|
};
|
||||||
|
popupService = jasmine.createSpyObj(['showAlert']);
|
||||||
profileService = jasmine.createSpyObj(['getWallet', 'getWallets']);
|
profileService = jasmine.createSpyObj(['getWallet', 'getWallets']);
|
||||||
|
|
||||||
rateService = jasmine.createSpyObj(['fromFiat', 'whenAvailable']);
|
rateService = jasmine.createSpyObj(['fromFiat', 'listAlternatives', 'updateRates', 'whenAvailable']);
|
||||||
sendFlowService = jasmine.createSpyObj(['getStateClone']);
|
sendFlowService = jasmine.createSpyObj(['getStateClone', 'pushState']);
|
||||||
shapeshiftService = jasmine.createSpyObj(['shiftIt']);
|
shapeshiftService = jasmine.createSpyObj(['getMarketData']);
|
||||||
|
txFormatService = jasmine.createSpyObj(['formatAlternativeStr', 'formatAmountStr']);
|
||||||
|
|
||||||
|
txFormatService.formatAlternativeStr.and.callFake(function(coin, satoshis, cb) {
|
||||||
|
if (typeof satoshis !== "number") {
|
||||||
|
throw "satoshis in formatAlternativeStr() is not a number."
|
||||||
|
}
|
||||||
|
var units = satoshis / 100000000;
|
||||||
|
var formatted = (units * 10000).toFixed(2) + ' USD';
|
||||||
|
cb(formatted);
|
||||||
|
});
|
||||||
|
|
||||||
|
txFormatService.formatAmountStr.and.callFake(function(coin, satoshis) {
|
||||||
|
if (typeof satoshis !== "number") {
|
||||||
|
throw "satoshis in formatAmountStr() is not a number."
|
||||||
|
}
|
||||||
|
return (satoshis * 100000000).toFixed(8) + ' ' + (coin || 'bch').toUpperCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
$state = jasmine.createSpyObj(['transitionTo']);
|
||||||
$stateParams = {};
|
$stateParams = {};
|
||||||
|
|
||||||
inject(function(_$controller_, _$rootScope_){
|
inject(function(_$controller_, _$rootScope_){
|
||||||
|
|
@ -67,7 +95,10 @@ describe('amountController', function(){
|
||||||
$ionicHistory.backView.and.returnValue(backView);
|
$ionicHistory.backView.and.returnValue(backView);
|
||||||
|
|
||||||
var wallet = {
|
var wallet = {
|
||||||
|
status: {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 123456
|
||||||
|
}
|
||||||
};
|
};
|
||||||
profileService.getWallet.and.returnValue(wallet);
|
profileService.getWallet.and.returnValue(wallet);
|
||||||
profileService.getWallets.and.returnValue([{}]);
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
|
@ -78,22 +109,22 @@ describe('amountController', function(){
|
||||||
|
|
||||||
var amountController = $controller('amountController', {
|
var amountController = $controller('amountController', {
|
||||||
configService: configService,
|
configService: configService,
|
||||||
gettextCatalog: {},
|
gettextCatalog: gettextCatalog,
|
||||||
$ionicHistory: $ionicHistory,
|
$ionicHistory: $ionicHistory,
|
||||||
$ionicModal: {},
|
$ionicModal: {},
|
||||||
$ionicScrollDelegate: {},
|
$ionicScrollDelegate: {},
|
||||||
nodeWebkitService: {},
|
nodeWebkitService: {},
|
||||||
ongoingProcess: {},
|
ongoingProcess: ongoingProcess,
|
||||||
platformInfo: platformInfo,
|
platformInfo: platformInfo,
|
||||||
profileService: profileService,
|
profileService: profileService,
|
||||||
popupService: {},
|
popupService: popupService,
|
||||||
rateService: rateService,
|
rateService: rateService,
|
||||||
$scope: $scope,
|
$scope: $scope,
|
||||||
sendFlowService: sendFlowService,
|
sendFlowService: sendFlowService,
|
||||||
shapeshiftService: shapeshiftService,
|
shapeshiftService: shapeshiftService,
|
||||||
$state: {},
|
$state: {},
|
||||||
$stateParams: $stateParams,
|
$stateParams: $stateParams,
|
||||||
txFormatService: {},
|
txFormatService: txFormatService,
|
||||||
walletService: {}
|
walletService: {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -110,4 +141,464 @@ describe('amountController', function(){
|
||||||
//expect($scope.toAddress).toBe('qrup46avn8t466xxwlzs4qelht7cnwvesv2e29wf7s');
|
//expect($scope.toAddress).toBe('qrup46avn8t466xxwlzs4qelht7cnwvesv2e29wf7s');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
describe('Shapeshift', function() {
|
||||||
|
var walletFrom;
|
||||||
|
var walletTo;
|
||||||
|
|
||||||
|
beforeEach(function(){
|
||||||
|
walletFrom = {};
|
||||||
|
walletTo = {};
|
||||||
|
|
||||||
|
profileService.getWallet.and.callFake(function(walletId){
|
||||||
|
if (walletId === '4cd7673e-7320-4dfa-86e5-d4edb51d460a') {
|
||||||
|
return walletFrom;
|
||||||
|
} else if (walletId === 'bf00af8f-0788-4b57-b30a-0390747407e9') {
|
||||||
|
return walletTo;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
rateService.listAlternatives.and.returnValue([
|
||||||
|
{name: "Australian Dollar", isoCode: "AUD"},
|
||||||
|
{name: "United States Dollar", isoCode: "USD"}
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('with available balance below limit, shows sendMax for triggering alert', function() {
|
||||||
|
|
||||||
|
walletFrom.coin = 'btc';
|
||||||
|
walletFrom.status = {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 789
|
||||||
|
};
|
||||||
|
walletTo.coin = 'bch';
|
||||||
|
|
||||||
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
rateService.fromFiat.and.returnValue(12);
|
||||||
|
|
||||||
|
var $scope = $rootScope.$new();
|
||||||
|
|
||||||
|
var amountController = $controller('amountController', {
|
||||||
|
configService: configService,
|
||||||
|
gettextCatalog: gettextCatalog,
|
||||||
|
$ionicHistory: $ionicHistory,
|
||||||
|
$ionicModal: {},
|
||||||
|
$ionicScrollDelegate: {},
|
||||||
|
nodeWebkitService: {},
|
||||||
|
ongoingProcess: ongoingProcess,
|
||||||
|
platformInfo: platformInfo,
|
||||||
|
profileService: profileService,
|
||||||
|
popupService: popupService,
|
||||||
|
rateService: rateService,
|
||||||
|
$scope: $scope,
|
||||||
|
sendFlowService: sendFlowService,
|
||||||
|
shapeshiftService: shapeshiftService,
|
||||||
|
$state: $state,
|
||||||
|
$stateParams: $stateParams,
|
||||||
|
txFormatService: txFormatService,
|
||||||
|
walletService: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
rateService.whenAvailable.and.callFake(function(cb){
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
var sendFlowState = {
|
||||||
|
amount: '',
|
||||||
|
displayAddress: null,
|
||||||
|
fromWalletId: '4cd7673e-7320-4dfa-86e5-d4edb51d460a',
|
||||||
|
sendMax: false,
|
||||||
|
thirdParty: {
|
||||||
|
id: 'shapeshift',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
toAddress: '',
|
||||||
|
toWalletId: 'bf00af8f-0788-4b57-b30a-0390747407e9'
|
||||||
|
};
|
||||||
|
|
||||||
|
sendFlowService.getStateClone.and.returnValue(sendFlowState);
|
||||||
|
|
||||||
|
var reqCoinIn = '';
|
||||||
|
var reqCoinOut = '';
|
||||||
|
shapeshiftService.getMarketData.and.callFake(function(coinIn, coinOut, cb){
|
||||||
|
reqCoinIn = coinIn;
|
||||||
|
reqCoinOut = coinOut;
|
||||||
|
cb({
|
||||||
|
maxLimit: '0.6846239',
|
||||||
|
minimum: '0.00013692'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.$emit('$ionicView.beforeEnter', {});
|
||||||
|
|
||||||
|
expect(rateService.updateRates.calls.any()).toEqual(true);
|
||||||
|
|
||||||
|
expect(reqCoinIn).toBe('btc');
|
||||||
|
expect(reqCoinOut).toBe('bch');
|
||||||
|
|
||||||
|
expect(amountController.maxAmount).toBe(0.68462390);
|
||||||
|
expect(amountController.minAmount).toBe(0.00013692);
|
||||||
|
|
||||||
|
expect(amountController.showSendMaxButton).toEqual(true);
|
||||||
|
expect(amountController.showSendLimitMaxButton).toEqual(false);
|
||||||
|
|
||||||
|
expect(amountController.sendableFunds).toEqual('0.08 USD');
|
||||||
|
|
||||||
|
// Now hit the Send Max button
|
||||||
|
amountController.sendMax();
|
||||||
|
|
||||||
|
expect(popupService.showAlert.calls.argsFor(0)[0]).toEqual('Insufficient funds');
|
||||||
|
expect(popupService.showAlert.calls.argsFor(0)[1]).toEqual('Amount below minimum allowed');
|
||||||
|
expect(sendFlowService.pushState.calls.any()).toEqual(false);
|
||||||
|
expect($state.transitionTo.calls.any()).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('with available balance between limits, uses sendMax', function() {
|
||||||
|
|
||||||
|
walletFrom.coin = 'btc';
|
||||||
|
walletFrom.status = {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 456789
|
||||||
|
};
|
||||||
|
walletTo.coin = 'bch';
|
||||||
|
|
||||||
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
rateService.fromFiat.and.returnValue(12);
|
||||||
|
|
||||||
|
var $scope = $rootScope.$new();
|
||||||
|
|
||||||
|
var amountController = $controller('amountController', {
|
||||||
|
configService: configService,
|
||||||
|
gettextCatalog: {},
|
||||||
|
$ionicHistory: $ionicHistory,
|
||||||
|
$ionicModal: {},
|
||||||
|
$ionicScrollDelegate: {},
|
||||||
|
nodeWebkitService: {},
|
||||||
|
ongoingProcess: ongoingProcess,
|
||||||
|
platformInfo: platformInfo,
|
||||||
|
profileService: profileService,
|
||||||
|
popupService: {},
|
||||||
|
rateService: rateService,
|
||||||
|
$scope: $scope,
|
||||||
|
sendFlowService: sendFlowService,
|
||||||
|
shapeshiftService: shapeshiftService,
|
||||||
|
$state: $state,
|
||||||
|
$stateParams: $stateParams,
|
||||||
|
txFormatService: txFormatService,
|
||||||
|
walletService: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
rateService.whenAvailable.and.callFake(function(cb){
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
var sendFlowState = {
|
||||||
|
amount: '',
|
||||||
|
displayAddress: null,
|
||||||
|
fromWalletId: '4cd7673e-7320-4dfa-86e5-d4edb51d460a',
|
||||||
|
sendMax: false,
|
||||||
|
thirdParty: {
|
||||||
|
id: 'shapeshift',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
toAddress: '',
|
||||||
|
toWalletId: 'bf00af8f-0788-4b57-b30a-0390747407e9'
|
||||||
|
};
|
||||||
|
|
||||||
|
sendFlowService.getStateClone.and.returnValue(sendFlowState);
|
||||||
|
|
||||||
|
var reqCoinIn = '';
|
||||||
|
var reqCoinOut = '';
|
||||||
|
shapeshiftService.getMarketData.and.callFake(function(coinIn, coinOut, cb){
|
||||||
|
reqCoinIn = coinIn;
|
||||||
|
reqCoinOut = coinOut;
|
||||||
|
cb({
|
||||||
|
maxLimit: '0.6846239',
|
||||||
|
minimum: '0.00013692'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.$emit('$ionicView.beforeEnter', {});
|
||||||
|
|
||||||
|
expect(rateService.updateRates.calls.any()).toEqual(true);
|
||||||
|
|
||||||
|
expect(reqCoinIn).toBe('btc');
|
||||||
|
expect(reqCoinOut).toBe('bch');
|
||||||
|
|
||||||
|
expect(amountController.maxAmount).toBe(0.68462390);
|
||||||
|
expect(amountController.minAmount).toBe(0.00013692);
|
||||||
|
|
||||||
|
expect(amountController.showSendMaxButton).toEqual(true);
|
||||||
|
expect(amountController.showSendLimitMaxButton).toEqual(false);
|
||||||
|
|
||||||
|
// Now hit the Send Max button
|
||||||
|
var pushedState = null;
|
||||||
|
sendFlowService.pushState.and.callFake(function (sendFlowState){
|
||||||
|
pushedState = sendFlowState;
|
||||||
|
});
|
||||||
|
|
||||||
|
amountController.sendMax();
|
||||||
|
|
||||||
|
expect(pushedState.amount).toBeUndefined();
|
||||||
|
expect(pushedState.fromWalletId).toEqual('4cd7673e-7320-4dfa-86e5-d4edb51d460a');
|
||||||
|
expect(pushedState.sendMax).toEqual(true);
|
||||||
|
expect(pushedState.toWalletId).toEqual('bf00af8f-0788-4b57-b30a-0390747407e9');
|
||||||
|
|
||||||
|
expect(pushedState.thirdParty.id).toEqual('shapeshift');
|
||||||
|
expect(pushedState.thirdParty.data.maxAmount).toEqual(0.6846239);
|
||||||
|
expect(pushedState.thirdParty.data.minAmount).toEqual(0.00013692);
|
||||||
|
|
||||||
|
expect($state.transitionTo.calls.count()).toEqual(1);
|
||||||
|
expect($state.transitionTo.calls.argsFor(0)[0]).toEqual('tabs.send.review');
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('with available balance higher than max, uses send limit max instead of sendMax', function() {
|
||||||
|
|
||||||
|
walletFrom.coin = 'btc';
|
||||||
|
walletFrom.status = {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 123456789
|
||||||
|
};
|
||||||
|
walletTo.coin = 'bch';
|
||||||
|
|
||||||
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
rateService.fromFiat.and.returnValue(12); // satoshis or coins?
|
||||||
|
|
||||||
|
var $scope = $rootScope.$new();
|
||||||
|
|
||||||
|
var amountController = $controller('amountController', {
|
||||||
|
configService: configService,
|
||||||
|
gettextCatalog: {},
|
||||||
|
$ionicHistory: $ionicHistory,
|
||||||
|
$ionicModal: {},
|
||||||
|
$ionicScrollDelegate: {},
|
||||||
|
nodeWebkitService: {},
|
||||||
|
ongoingProcess: ongoingProcess,
|
||||||
|
platformInfo: platformInfo,
|
||||||
|
profileService: profileService,
|
||||||
|
popupService: {},
|
||||||
|
rateService: rateService,
|
||||||
|
$scope: $scope,
|
||||||
|
sendFlowService: sendFlowService,
|
||||||
|
shapeshiftService: shapeshiftService,
|
||||||
|
$state: $state,
|
||||||
|
$stateParams: $stateParams,
|
||||||
|
txFormatService: txFormatService,
|
||||||
|
walletService: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
rateService.whenAvailable.and.callFake(function(cb){
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
var sendFlowState = {
|
||||||
|
amount: '',
|
||||||
|
displayAddress: null,
|
||||||
|
fromWalletId: '4cd7673e-7320-4dfa-86e5-d4edb51d460a',
|
||||||
|
sendMax: false,
|
||||||
|
thirdParty: {
|
||||||
|
id: 'shapeshift',
|
||||||
|
data: {},
|
||||||
|
},
|
||||||
|
toAddress: '',
|
||||||
|
toWalletId: 'bf00af8f-0788-4b57-b30a-0390747407e9'
|
||||||
|
};
|
||||||
|
|
||||||
|
sendFlowService.getStateClone.and.returnValue(sendFlowState);
|
||||||
|
|
||||||
|
var reqCoinIn = '';
|
||||||
|
var reqCoinOut = '';
|
||||||
|
shapeshiftService.getMarketData.and.callFake(function(coinIn, coinOut, cb){
|
||||||
|
reqCoinIn = coinIn;
|
||||||
|
reqCoinOut = coinOut;
|
||||||
|
cb({
|
||||||
|
maxLimit: '0.6846239',
|
||||||
|
minimum: '0.00013692'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.$emit('$ionicView.beforeEnter', {});
|
||||||
|
|
||||||
|
expect(rateService.updateRates.calls.any()).toEqual(true);
|
||||||
|
|
||||||
|
expect(reqCoinIn).toBe('btc');
|
||||||
|
expect(reqCoinOut).toBe('bch');
|
||||||
|
|
||||||
|
expect(amountController.maxAmount).toBe(0.6846239);
|
||||||
|
expect(amountController.minAmount).toBe(0.00013692);
|
||||||
|
|
||||||
|
expect(amountController.showSendMaxButton).toEqual(false);
|
||||||
|
expect(amountController.showSendLimitMaxButton).toEqual(true);
|
||||||
|
|
||||||
|
// Now hit the Send Max button
|
||||||
|
var pushedState = null;
|
||||||
|
sendFlowService.pushState.and.callFake(function (sendFlowState){
|
||||||
|
pushedState = sendFlowState;
|
||||||
|
});
|
||||||
|
|
||||||
|
amountController.sendMax();
|
||||||
|
|
||||||
|
expect(pushedState.amount).toEqual(68462390);
|
||||||
|
expect(pushedState.fromWalletId).toEqual('4cd7673e-7320-4dfa-86e5-d4edb51d460a');
|
||||||
|
expect(pushedState.sendMax).toEqual(false);
|
||||||
|
expect(pushedState.toWalletId).toEqual('bf00af8f-0788-4b57-b30a-0390747407e9');
|
||||||
|
|
||||||
|
expect(pushedState.thirdParty.id).toEqual('shapeshift');
|
||||||
|
expect(pushedState.thirdParty.data.maxAmount).toEqual(0.6846239);
|
||||||
|
expect(pushedState.thirdParty.data.minAmount).toEqual(0.00013692);
|
||||||
|
|
||||||
|
expect($state.transitionTo.calls.count()).toEqual(1);
|
||||||
|
expect($state.transitionTo.calls.argsFor(0)[0]).toEqual('tabs.send.review');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('Wallet transfer', function() {
|
||||||
|
var walletFrom;
|
||||||
|
var walletTo;
|
||||||
|
|
||||||
|
beforeEach(function(){
|
||||||
|
walletFrom = {};
|
||||||
|
walletTo = {};
|
||||||
|
|
||||||
|
profileService.getWallet.and.callFake(function(walletId){
|
||||||
|
if (walletId === '4cd7673e-7320-4dfa-86e5-d4edb51d460a') {
|
||||||
|
return walletFrom;
|
||||||
|
} else if (walletId === 'bf00af8f-0788-4b57-b30a-0390747407e9') {
|
||||||
|
return walletTo;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
rateService.listAlternatives.and.returnValue([
|
||||||
|
{name: "Australian Dollar", isoCode: "AUD"},
|
||||||
|
{name: "United States Dollar", isoCode: "USD"}
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('wallet transfer send max.', function() {
|
||||||
|
|
||||||
|
walletFrom.coin = 'btc';
|
||||||
|
walletFrom.status = {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 123456789
|
||||||
|
};
|
||||||
|
|
||||||
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
|
||||||
|
var $scope = $rootScope.$new();
|
||||||
|
|
||||||
|
var amountController = $controller('amountController', {
|
||||||
|
configService: configService,
|
||||||
|
gettextCatalog: gettextCatalog,
|
||||||
|
$ionicHistory: $ionicHistory,
|
||||||
|
$ionicModal: {},
|
||||||
|
$ionicScrollDelegate: {},
|
||||||
|
nodeWebkitService: {},
|
||||||
|
ongoingProcess: ongoingProcess,
|
||||||
|
platformInfo: platformInfo,
|
||||||
|
profileService: profileService,
|
||||||
|
popupService: popupService,
|
||||||
|
rateService: rateService,
|
||||||
|
$scope: $scope,
|
||||||
|
sendFlowService: sendFlowService,
|
||||||
|
shapeshiftService: shapeshiftService,
|
||||||
|
$state: $state,
|
||||||
|
$stateParams: $stateParams,
|
||||||
|
txFormatService: txFormatService,
|
||||||
|
walletService: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
var sendFlowState = {
|
||||||
|
fromWalletId: '4cd7673e-7320-4dfa-86e5-d4edb51d460a',
|
||||||
|
toWalletId: 'bf00af8f-0788-4b57-b30a-0390747407e9'
|
||||||
|
};
|
||||||
|
|
||||||
|
sendFlowService.getStateClone.and.returnValue(sendFlowState);
|
||||||
|
|
||||||
|
$scope.$emit('$ionicView.beforeEnter', {});
|
||||||
|
|
||||||
|
expect(amountController.showSendMaxButton).toEqual(true);
|
||||||
|
expect(amountController.showSendLimitMaxButton).toEqual(false);
|
||||||
|
|
||||||
|
expect(amountController.sendableFunds).toEqual('12345.68 USD');
|
||||||
|
|
||||||
|
// Now hit the Send Max button
|
||||||
|
var pushedState = null;
|
||||||
|
sendFlowService.pushState.and.callFake(function (sendFlowState){
|
||||||
|
pushedState = sendFlowState;
|
||||||
|
});
|
||||||
|
|
||||||
|
amountController.sendMax();
|
||||||
|
|
||||||
|
expect(pushedState.amount).toBeUndefined();
|
||||||
|
expect(pushedState.fromWalletId).toEqual('4cd7673e-7320-4dfa-86e5-d4edb51d460a');
|
||||||
|
expect(pushedState.sendMax).toEqual(true);
|
||||||
|
expect(pushedState.toWalletId).toEqual('bf00af8f-0788-4b57-b30a-0390747407e9');
|
||||||
|
|
||||||
|
expect($state.transitionTo.calls.count()).toEqual(1);
|
||||||
|
expect($state.transitionTo.calls.argsFor(0)[0]).toEqual('tabs.send.review');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// This situation was seen in real life
|
||||||
|
it('wallet transfer with valid cached status only.', function() {
|
||||||
|
|
||||||
|
walletFrom.coin = 'btc';
|
||||||
|
walletFrom.status = {
|
||||||
|
isValid: false,
|
||||||
|
};
|
||||||
|
walletFrom.cachedStatus = {
|
||||||
|
isValid: true,
|
||||||
|
spendableAmount: 5678
|
||||||
|
};
|
||||||
|
|
||||||
|
profileService.getWallets.and.returnValue([{}]);
|
||||||
|
|
||||||
|
var $scope = $rootScope.$new();
|
||||||
|
|
||||||
|
var amountController = $controller('amountController', {
|
||||||
|
configService: configService,
|
||||||
|
gettextCatalog: gettextCatalog,
|
||||||
|
$ionicHistory: $ionicHistory,
|
||||||
|
$ionicModal: {},
|
||||||
|
$ionicScrollDelegate: {},
|
||||||
|
nodeWebkitService: {},
|
||||||
|
ongoingProcess: ongoingProcess,
|
||||||
|
platformInfo: platformInfo,
|
||||||
|
profileService: profileService,
|
||||||
|
popupService: popupService,
|
||||||
|
rateService: rateService,
|
||||||
|
$scope: $scope,
|
||||||
|
sendFlowService: sendFlowService,
|
||||||
|
shapeshiftService: shapeshiftService,
|
||||||
|
$state: $state,
|
||||||
|
$stateParams: $stateParams,
|
||||||
|
txFormatService: txFormatService,
|
||||||
|
walletService: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
var sendFlowState = {
|
||||||
|
fromWalletId: '4cd7673e-7320-4dfa-86e5-d4edb51d460a',
|
||||||
|
toWalletId: 'bf00af8f-0788-4b57-b30a-0390747407e9'
|
||||||
|
};
|
||||||
|
|
||||||
|
sendFlowService.getStateClone.and.returnValue(sendFlowState);
|
||||||
|
|
||||||
|
$scope.$emit('$ionicView.beforeEnter', {});
|
||||||
|
|
||||||
|
expect(amountController.showSendMaxButton).toEqual(true);
|
||||||
|
expect(amountController.showSendLimitMaxButton).toEqual(false);
|
||||||
|
|
||||||
|
expect(amountController.sendableFunds).toEqual('0.57 USD');
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
@ -517,7 +517,8 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
if (!lodash.isEmpty(warningMsg))
|
if (!lodash.isEmpty(warningMsg))
|
||||||
msg += '\n' + warningMsg;
|
msg += '\n' + warningMsg;
|
||||||
|
|
||||||
popupService.showAlert(null, msg, function() {});
|
popupService.showAlert(null, msg, function() {});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.onWalletSelect = function(wallet) {
|
$scope.onWalletSelect = function(wallet) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
angular.module('copayApp.controllers').controller('tourController',
|
angular.module('copayApp.controllers').controller('tourController',
|
||||||
function($scope, $state, $log, $timeout, $filter, ongoingProcess, profileService, rateService, popupService, gettextCatalog, startupService, storageService, walletService, $q) {
|
function ($scope, $state, $log, $timeout, $filter, ongoingProcess, configService, profileService, rateService, popupService, gettextCatalog, lodash, startupService, storageService, uxLanguage, walletService, $q) {
|
||||||
|
|
||||||
$scope.data = {
|
$scope.data = {
|
||||||
index: 0
|
index: 0
|
||||||
|
|
@ -46,62 +46,90 @@ angular.module('copayApp.controllers').controller('tourController',
|
||||||
creatingWallet = true;
|
creatingWallet = true;
|
||||||
ongoingProcess.set('creatingWallet', true);
|
ongoingProcess.set('creatingWallet', true);
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
profileService.createDefaultWallet(function(err, walletClients) {
|
uxLanguage.init(function(lang) {
|
||||||
if (err) {
|
var rateCode = uxLanguage.getRateCode(lang);
|
||||||
$log.warn(err);
|
console.log("When Available: rateService");
|
||||||
|
rateService.whenAvailable(function() {
|
||||||
|
var alternatives = rateService.listAlternatives(true);
|
||||||
|
|
||||||
return $timeout(function() {
|
var newAltCurrency = lodash.find(alternatives, {
|
||||||
$log.warn('Retrying to create default wallet.....:' + ++retryCount);
|
'isoCode': rateCode
|
||||||
if (retryCount > 3) {
|
|
||||||
ongoingProcess.set('creatingWallet', false);
|
|
||||||
popupService.showAlert(
|
|
||||||
gettextCatalog.getString('Cannot Create Wallet'), err,
|
|
||||||
function() {
|
|
||||||
retryCount = 0;
|
|
||||||
return $scope.createDefaultWallet();
|
|
||||||
}, gettextCatalog.getString('Retry'));
|
|
||||||
} else {
|
|
||||||
return $scope.createDefaultWallet();
|
|
||||||
}
|
|
||||||
}, 2000);
|
|
||||||
};
|
|
||||||
|
|
||||||
ongoingProcess.set('creatingWallet', false);
|
|
||||||
var bchWallet = walletClients[0];
|
|
||||||
var btcWallet = walletClients[1];
|
|
||||||
var bchWalletId = bchWallet.credentials.walletId;
|
|
||||||
var btcWalletId = btcWallet.credentials.walletId;
|
|
||||||
|
|
||||||
function createAddressPromise(wallet) {
|
|
||||||
return $q(function(resolve, reject) {
|
|
||||||
walletService.getAddress(wallet, true, function(e, addr) {
|
|
||||||
if (e) reject(e);
|
|
||||||
resolve(addr);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
configService.whenAvailable(function(config) {
|
||||||
|
var opts = {
|
||||||
|
wallet: {
|
||||||
|
settings: {
|
||||||
|
alternativeName: newAltCurrency.name,
|
||||||
|
alternativeIsoCode: newAltCurrency.isoCode,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
configService.set(opts, function(err) {
|
||||||
|
if (err) $log.warn(err);
|
||||||
|
|
||||||
|
profileService.createDefaultWallet(function(err, walletClients) {
|
||||||
|
if (err) {
|
||||||
|
$log.warn(err);
|
||||||
|
|
||||||
|
return $timeout(function() {
|
||||||
|
$log.warn('Retrying to create default wallet.....:' + ++retryCount);
|
||||||
|
if (retryCount > 3) {
|
||||||
|
ongoingProcess.set('creatingWallet', false);
|
||||||
|
popupService.showAlert(
|
||||||
|
gettextCatalog.getString('Cannot Create Wallet'), err,
|
||||||
|
function() {
|
||||||
|
retryCount = 0;
|
||||||
|
return $scope.createDefaultWallet();
|
||||||
|
}, gettextCatalog.getString('Retry'));
|
||||||
|
} else {
|
||||||
|
return $scope.createDefaultWallet();
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
ongoingProcess.set('creatingWallet', false);
|
||||||
|
var bchWallet = walletClients[0];
|
||||||
|
var btcWallet = walletClients[1];
|
||||||
|
var bchWalletId = bchWallet.credentials.walletId;
|
||||||
|
var btcWalletId = btcWallet.credentials.walletId;
|
||||||
|
|
||||||
|
function createAddressPromise(wallet) {
|
||||||
|
return $q(function (resolve, reject) {
|
||||||
|
walletService.getAddress(wallet, true, function (e, addr) {
|
||||||
|
if (e) reject(e);
|
||||||
|
resolve(addr);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function goToCollectEmail() {
|
||||||
|
$state.go('onboarding.collectEmail', {
|
||||||
|
bchWalletId: bchWalletId,
|
||||||
|
btcWalletId: btcWalletId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var bchAddressPromise = createAddressPromise(bchWallet);
|
||||||
|
var btcAddressPromise = createAddressPromise(btcWallet);
|
||||||
|
ongoingProcess.set('generatingNewAddress', true);
|
||||||
|
|
||||||
|
$q.all([bchAddressPromise, btcAddressPromise]).then(function (addresses) {
|
||||||
|
ongoingProcess.set('generatingNewAddress', false);
|
||||||
|
$state.go('tabs.home');
|
||||||
|
}, function (e) {
|
||||||
|
ongoingProcess.set('generatingNewAddress', false);
|
||||||
|
$log.warn(e);
|
||||||
|
popupService.showAlert(gettextCatalog.getString('Error'), e);
|
||||||
|
$state.go('tabs.home');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$log.debug('Setting default currency : ' + newAltCurrency);
|
||||||
});
|
});
|
||||||
}
|
})
|
||||||
|
}, 300);
|
||||||
function goToCollectEmail() {
|
};
|
||||||
$state.go('onboarding.collectEmail', {
|
});
|
||||||
bchWalletId: bchWalletId,
|
|
||||||
btcWalletId: btcWalletId
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var bchAddressPromise = createAddressPromise(bchWallet);
|
|
||||||
var btcAddressPromise = createAddressPromise(btcWallet);
|
|
||||||
ongoingProcess.set('generatingNewAddress', true);
|
|
||||||
|
|
||||||
$q.all([bchAddressPromise, btcAddressPromise]).then(function(addresses) {
|
|
||||||
ongoingProcess.set('generatingNewAddress', false);
|
|
||||||
$state.go('tabs.home');
|
|
||||||
}, function(e) {
|
|
||||||
ongoingProcess.set('generatingNewAddress', false);
|
|
||||||
$log.warn(e);
|
|
||||||
popupService.showAlert(gettextCatalog.getString('Error'), e);
|
|
||||||
$state.go('tabs.home');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}, 300);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('servicesController', function($scope, $ionicScrollDelegate, $timeout, servicesService, configService) {
|
angular.module('copayApp.controllers').controller('servicesController', function(externalLinkService, $scope, $ionicScrollDelegate, $timeout, servicesService, configService) {
|
||||||
$scope.hide = false;
|
$scope.hide = false;
|
||||||
|
|
||||||
configService.whenAvailable(function(config) {
|
configService.whenAvailable(function(config) {
|
||||||
|
|
@ -20,4 +20,8 @@ angular.module('copayApp.controllers').controller('servicesController', function
|
||||||
}, 10);
|
}, 10);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.open = function(url) {
|
||||||
|
externalLinkService.open(url, false);
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ angular.module('copayApp.controllers').controller('shapeshiftController', functi
|
||||||
walletsBtc = profileService.getWallets({coin: 'btc'});
|
walletsBtc = profileService.getWallets({coin: 'btc'});
|
||||||
walletsBch = profileService.getWallets({coin: 'bch'});
|
walletsBch = profileService.getWallets({coin: 'bch'});
|
||||||
$scope.fromWallets = lodash.filter(walletsBtc.concat(walletsBch), function(w) {
|
$scope.fromWallets = lodash.filter(walletsBtc.concat(walletsBch), function(w) {
|
||||||
return w.status.balance.availableAmount > 0;
|
return (w.status && w.status.balance && w.status.balance.availableAmount > 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.singleFromWallet = $scope.fromWallets.length === 1;
|
$scope.singleFromWallet = $scope.fromWallets.length === 1;
|
||||||
|
|
|
||||||
|
|
@ -43,21 +43,20 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope.isNW) {
|
latestReleaseService.checkLatestRelease(function(err, newReleaseData) {
|
||||||
latestReleaseService.checkLatestRelease(function(err, newRelease) {
|
if (err) {
|
||||||
if (err) {
|
$log.warn(err);
|
||||||
$log.warn(err);
|
return;
|
||||||
return;
|
}
|
||||||
}
|
if (newReleaseData) {
|
||||||
if (newRelease) {
|
$scope.newRelease = true;
|
||||||
$scope.newRelease = true;
|
$scope.newReleaseText = gettextCatalog.getString('There is a new version of {{appName}} available', {
|
||||||
$scope.updateText = gettextCatalog.getString('There is a new version of {{appName}} available', {
|
appName: $scope.name
|
||||||
appName: $scope.name
|
});
|
||||||
});
|
$scope.newReleaseNotes = newReleaseData.releaseNotes;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
function onEnter(event, data) {
|
function onEnter(event, data) {
|
||||||
$ionicNavBarDelegate.showBar(true);
|
$ionicNavBarDelegate.showBar(true);
|
||||||
|
|
@ -109,13 +108,13 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
}, 10);
|
}, 10);
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function onLeave (event, data) {
|
function onLeave (event, data) {
|
||||||
lodash.each(listeners, function(x) {
|
lodash.each(listeners, function(x) {
|
||||||
x();
|
x();
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
$scope.createdWithinPastDay = function(time) {
|
$scope.createdWithinPastDay = function(time) {
|
||||||
return timeService.withinPastDay(time);
|
return timeService.withinPastDay(time);
|
||||||
|
|
@ -125,14 +124,8 @@ angular.module('copayApp.controllers').controller('tabHomeController',
|
||||||
sendFlowService.start();
|
sendFlowService.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.openExternalLink = function() {
|
$scope.showUpdatePopup = function() {
|
||||||
var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest';
|
latestReleaseService.showUpdatePopup();
|
||||||
var optIn = true;
|
|
||||||
var title = gettextCatalog.getString('Update Available');
|
|
||||||
var message = gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.');
|
|
||||||
var okText = gettextCatalog.getString('View Update');
|
|
||||||
var cancelText = gettextCatalog.getString('Go Back');
|
|
||||||
externalLinkService.open(url, optIn, title, message, okText, cancelText);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.openBannerUrl = function() {
|
$scope.openBannerUrl = function() {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, sendFlowService, txFormatService, soundService, clipboardService) {
|
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, sendFlowService, txFormatService, soundService, clipboardService) {
|
||||||
|
|
||||||
|
var CLOSE_NORMAL = 1000;
|
||||||
var listeners = [];
|
var listeners = [];
|
||||||
$scope.bchAddressType = { type: 'cashaddr' };
|
$scope.bchAddressType = { type: 'cashaddr' };
|
||||||
var bchAddresses = {};
|
var bchAddresses = {};
|
||||||
|
|
@ -10,12 +11,11 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
$scope.isCordova = platformInfo.isCordova;
|
$scope.isCordova = platformInfo.isCordova;
|
||||||
$scope.isNW = platformInfo.isNW;
|
$scope.isNW = platformInfo.isNW;
|
||||||
|
|
||||||
var currentAddressSocket = {};
|
var currentAddressSocket = null;
|
||||||
var paymentSubscriptionObj = { op:"addr_sub" }
|
var paymentSubscriptionObj = { op:'addr_sub' };
|
||||||
|
|
||||||
var config;
|
|
||||||
|
|
||||||
$scope.displayBalanceAsFiat = true;
|
$scope.displayBalanceAsFiat = true;
|
||||||
|
$scope.$on('$ionicView.beforeLeave', onBeforeLeave);
|
||||||
|
|
||||||
$scope.requestSpecificAmount = function() {
|
$scope.requestSpecificAmount = function() {
|
||||||
sendFlowService.start({
|
sendFlowService.start({
|
||||||
|
|
@ -24,6 +24,50 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function connectSocket() {
|
||||||
|
// Close existing socket if not connected with current address
|
||||||
|
if (currentAddressSocket) {
|
||||||
|
currentAddressSocket.close([CLOSE_NORMAL]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope.wallet.coin === 'bch') {
|
||||||
|
// listen to bch address
|
||||||
|
currentAddressSocket = new WebSocket('wss://ws.blockchain.info/bch/inv');
|
||||||
|
paymentSubscriptionObj.addr = $scope.addrBchLegacy;
|
||||||
|
} else {
|
||||||
|
// listen to btc address
|
||||||
|
currentAddressSocket = new WebSocket('wss://ws.blockchain.info/inv');
|
||||||
|
paymentSubscriptionObj.addr = $scope.addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create subscription to address
|
||||||
|
var msg = JSON.stringify(paymentSubscriptionObj);
|
||||||
|
currentAddressSocket.onopen = function (event) {
|
||||||
|
currentAddressSocket.send(msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
// listen for response
|
||||||
|
currentAddressSocket.onmessage = function (event) {
|
||||||
|
//console.log("message received:" + event.data);
|
||||||
|
receivedPayment(event.data);
|
||||||
|
};
|
||||||
|
|
||||||
|
currentAddressSocket.onclose = function(event) {
|
||||||
|
if (event.code !== CLOSE_NORMAL) {
|
||||||
|
$log.debug('Socket was closed abnormally. Reconnect will be attempted in 1 second.');
|
||||||
|
$timeout(function() {
|
||||||
|
connectSocket();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
currentAddressSocket.onerror = function(err) {
|
||||||
|
console.error('Socket encountered error: ', err, 'Closing socket');
|
||||||
|
currentAddressSocket.close();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
$scope.setAddress = function(newAddr, copyAddress) {
|
$scope.setAddress = function(newAddr, copyAddress) {
|
||||||
$scope.addr = null;
|
$scope.addr = null;
|
||||||
if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return;
|
if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return;
|
||||||
|
|
@ -36,49 +80,24 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
popupService.showAlert(err);
|
popupService.showAlert(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
//close existing socket
|
if ($scope.wallet.coin === 'bch') {
|
||||||
if (currentAddressSocket.close === 'function') {
|
bchAddresses = bitcoinCashJsService.translateAddresses(addr);
|
||||||
currentAddressSocket.close();
|
$scope.addr = bchAddresses[$scope.bchAddressType.type];
|
||||||
}
|
$scope.addrBchLegacy = bchAddresses['legacy'];
|
||||||
|
|
||||||
if ($scope.wallet.coin == 'bch') {
|
|
||||||
bchAddresses = bitcoinCashJsService.translateAddresses(addr);
|
|
||||||
$scope.addr = bchAddresses[$scope.bchAddressType.type];
|
|
||||||
$scope.addrBchLegacy = bchAddresses['legacy'];
|
|
||||||
|
|
||||||
// listen to bch address
|
|
||||||
currentAddressSocket = new WebSocket("wss://ws.blockchain.info/bch/inv");
|
|
||||||
paymentSubscriptionObj.addr = bchAddresses['legacy'];
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$scope.addr = addr;
|
$scope.addr = addr;
|
||||||
|
|
||||||
// listen to btc address
|
|
||||||
currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv");
|
|
||||||
paymentSubscriptionObj.addr = $scope.addr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connectSocket();
|
||||||
|
|
||||||
if (copyAddress === true) {
|
if (copyAddress === true) {
|
||||||
try {
|
try {
|
||||||
clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr);
|
clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
$log.debug("Error copying to clipboard:");
|
$log.debug('Error copying to clipboard:');
|
||||||
$log.debug(error);
|
$log.debug(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// create subscription
|
|
||||||
var msg = JSON.stringify(paymentSubscriptionObj);
|
|
||||||
currentAddressSocket.onopen = function (event) {
|
|
||||||
//console.log("message sent: " + msg);
|
|
||||||
currentAddressSocket.send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// listen for response
|
|
||||||
currentAddressSocket.onmessage = function (event) {
|
|
||||||
//console.log("message received:" + event.data);
|
|
||||||
receivedPayment(event.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
|
|
@ -164,7 +183,6 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
// Notify new tx
|
// Notify new tx
|
||||||
$scope.$emit('bwsEvent', $scope.wallet.id);
|
$scope.$emit('bwsEvent', $scope.wallet.id);
|
||||||
|
|
||||||
|
|
||||||
$scope.$apply(function () {
|
$scope.$apply(function () {
|
||||||
$scope.showingPaymentReceived = true;
|
$scope.showingPaymentReceived = true;
|
||||||
});
|
});
|
||||||
|
|
@ -233,6 +251,10 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function onBeforeLeave() {
|
||||||
|
currentAddressSocket.close([CLOSE_NORMAL]);
|
||||||
|
}
|
||||||
|
|
||||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||||
$scope.wallets = profileService.getWallets();
|
$scope.wallets = profileService.getWallets();
|
||||||
$scope.singleWallet = $scope.wallets.length == 1;
|
$scope.singleWallet = $scope.wallets.length == 1;
|
||||||
|
|
@ -258,7 +280,6 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
|
||||||
|
|
||||||
configService.whenAvailable(function(_config) {
|
configService.whenAvailable(function(_config) {
|
||||||
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
|
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
|
||||||
config = _config;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,52 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService, sendFlowService, storageService, $ionicScrollDelegate, $window, bwcError, gettextCatalog, timeService, feeService, appConfigService, rateService) {
|
angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService, sendFlowService, storageService, $ionicScrollDelegate, $window, bwcError, gettextCatalog, timeService, feeService, appConfigService, rateService, walletHistoryService) {
|
||||||
|
// Desktop can display 13 rows of transactions, bump it up to a nice round 15.
|
||||||
var HISTORY_SHOW_LIMIT = 10;
|
var DISPLAY_PAGE_SIZE = 15;
|
||||||
var currentTxHistoryPage = 0;
|
var currentTxHistoryDisplayPage = 0;
|
||||||
|
var completeTxHistory = []
|
||||||
var listeners = [];
|
var listeners = [];
|
||||||
$scope.txps = [];
|
|
||||||
$scope.completeTxHistory = [];
|
// For gradual migration for doing it properly
|
||||||
$scope.openTxpModal = txpModalService.open;
|
$scope.vm = {
|
||||||
|
allowInfiniteScroll: false,
|
||||||
|
gettingCachedHistory: true,
|
||||||
|
gettingInitialHistory: true,
|
||||||
|
updatingTxHistory: false,
|
||||||
|
fetchedAllTxHistory: false,
|
||||||
|
//updateTxHistoryError: false
|
||||||
|
updateTxHistoryFailed: false
|
||||||
|
};
|
||||||
|
|
||||||
|
// Need flag for when to allow infinite scroll at bottom
|
||||||
|
// - ie not when loading initial data and there is no more cached data
|
||||||
|
|
||||||
|
$scope.amountIsCollapsible = false;
|
||||||
|
$scope.color = '#888888';
|
||||||
|
|
||||||
|
$scope.filteredTxHistory = [];
|
||||||
$scope.isCordova = platformInfo.isCordova;
|
$scope.isCordova = platformInfo.isCordova;
|
||||||
$scope.isAndroid = platformInfo.isAndroid;
|
$scope.isAndroid = platformInfo.isAndroid;
|
||||||
$scope.isIOS = platformInfo.isIOS;
|
$scope.isIOS = platformInfo.isIOS;
|
||||||
|
$scope.isSearching = false;
|
||||||
|
$scope.openTxpModal = txpModalService.open;
|
||||||
|
$scope.requiresMultipleSignatures = false;
|
||||||
|
$scope.showBalanceButton = false;
|
||||||
|
$scope.status = null;
|
||||||
|
// Displaying 50 transactions when entering the screen takes a while, so only display a subset
|
||||||
|
// of everything we have, not the complete history.
|
||||||
|
$scope.txHistory = []; // This is what is displayed
|
||||||
|
$scope.txHistorySearchResults = [];
|
||||||
|
$scope.txps = [];
|
||||||
|
$scope.updatingStatus = false;
|
||||||
|
$scope.updateStatusError = null;
|
||||||
|
$scope.updatingTxHistoryProgress = 0;
|
||||||
|
$scope.wallet = null;
|
||||||
|
$scope.walletId = '';
|
||||||
|
$scope.walletNotRegistered = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var channel = "ga";
|
var channel = "ga";
|
||||||
if (platformInfo.isCordova) {
|
if (platformInfo.isCordova) {
|
||||||
|
|
@ -19,8 +55,6 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
|
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
|
||||||
window.BitAnalytics.LogEventHandlers.postEvent(log);
|
window.BitAnalytics.LogEventHandlers.postEvent(log);
|
||||||
|
|
||||||
$scope.amountIsCollapsible = !$scope.isAndroid;
|
|
||||||
|
|
||||||
$scope.openExternalLink = function(url, target) {
|
$scope.openExternalLink = function(url, target) {
|
||||||
externalLinkService.open(url, target);
|
externalLinkService.open(url, target);
|
||||||
};
|
};
|
||||||
|
|
@ -52,6 +86,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
$scope.updatingStatus = true;
|
$scope.updatingStatus = true;
|
||||||
$scope.updateStatusError = null;
|
$scope.updateStatusError = null;
|
||||||
$scope.walletNotRegistered = false;
|
$scope.walletNotRegistered = false;
|
||||||
|
$scope.vm.fetchedAllTxHistory = false;
|
||||||
|
|
||||||
walletService.getStatus($scope.wallet, {
|
walletService.getStatus($scope.wallet, {
|
||||||
force: !!force,
|
force: !!force,
|
||||||
|
|
@ -135,68 +170,97 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
if (err) return;
|
if (err) return;
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
walletService.startScan($scope.wallet, function() {
|
walletService.startScan($scope.wallet, function() {
|
||||||
$scope.updateAll();
|
$scope.updateAll(true, true);
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var updateTxHistory = function(cb) {
|
|
||||||
if (!cb) cb = function() {};
|
|
||||||
$scope.updateTxHistoryError = false;
|
|
||||||
$scope.updatingTxHistoryProgress = 0;
|
|
||||||
|
|
||||||
feeService.getFeeLevels($scope.wallet.coin, function(err, levels) {
|
|
||||||
walletService.getTxHistory($scope.wallet, {
|
|
||||||
feeLevels: levels
|
|
||||||
}, function(err, txHistory) {
|
|
||||||
$scope.updatingTxHistory = false;
|
|
||||||
if (err) {
|
|
||||||
$scope.txHistory = null;
|
|
||||||
$scope.updateTxHistoryError = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
applyCurrencyAliases(txHistory);
|
|
||||||
|
|
||||||
var config = configService.getSync();
|
|
||||||
var fiatCode = config.wallet.settings.alternativeIsoCode;
|
|
||||||
lodash.each(txHistory, function(t) {
|
|
||||||
var r = rateService.toFiat(t.amount, fiatCode, $scope.wallet.coin);
|
|
||||||
t.alternativeAmountStr = r.toFixed(2) + ' ' + fiatCode;
|
|
||||||
});
|
|
||||||
|
|
||||||
$scope.completeTxHistory = txHistory;
|
|
||||||
|
|
||||||
$scope.showHistory();
|
|
||||||
$timeout(function() {
|
|
||||||
$scope.$apply();
|
|
||||||
});
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function applyCurrencyAliases(txHistory) {
|
function applyCurrencyAliases(txHistory) {
|
||||||
var defaults = configService.getDefaults();
|
var defaults = configService.getDefaults();
|
||||||
var configCache = configService.getSync();
|
var configCache = configService.getSync();
|
||||||
|
|
||||||
lodash.each(txHistory, function(t) {
|
lodash.each(txHistory, function onTx(tx) {
|
||||||
t.amountUnitStr = $scope.wallet.coin == 'btc'
|
tx.amountUnitStr = $scope.wallet.coin == 'btc'
|
||||||
? (configCache.bitcoinAlias || defaults.bitcoinAlias)
|
? (configCache.bitcoinAlias || defaults.bitcoinAlias)
|
||||||
: (configCache.bitcoinCashAlias || defaults.bitcoinCashAlias);
|
: (configCache.bitcoinCashAlias || defaults.bitcoinCashAlias);
|
||||||
|
|
||||||
t.amountUnitStr = t.amountUnitStr.toUpperCase();
|
tx.amountUnitStr = tx.amountUnitStr.toUpperCase();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$scope.showHistory = function() {
|
function formatTxHistoryForDisplay(txHistory) {
|
||||||
if ($scope.completeTxHistory) {
|
applyCurrencyAliases(txHistory);
|
||||||
$scope.txHistory = $scope.completeTxHistory.slice(0, (currentTxHistoryPage + 1) * HISTORY_SHOW_LIMIT);
|
|
||||||
$scope.txHistoryShowMore = $scope.completeTxHistory.length > $scope.txHistory.length;
|
var config = configService.getSync();
|
||||||
|
var fiatCode = config.wallet.settings.alternativeIsoCode;
|
||||||
|
lodash.each(txHistory, function(t) {
|
||||||
|
var r = rateService.toFiat(t.amount, fiatCode, $scope.wallet.coin);
|
||||||
|
t.alternativeAmountStr = r.toFixed(2) + ' ' + fiatCode;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function updateTxHistoryFromCachedData() {
|
||||||
|
$scope.vm.gettingCachedHistory = true;
|
||||||
|
walletHistoryService.getCachedTxHistory($scope.wallet.id, function onGetCachedTxHistory(err, txHistory){
|
||||||
|
$scope.vm.gettingCachedHistory = false;
|
||||||
|
if (err) {
|
||||||
|
// Don't display an error because we are also requesting the history.
|
||||||
|
$log.error('Error getting cached tx history.', err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!txHistory) {
|
||||||
|
$log.debug('No cached tx history.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatTxHistoryForDisplay(txHistory);
|
||||||
|
|
||||||
|
completeTxHistory = txHistory;
|
||||||
|
showHistory(false);
|
||||||
|
$scope.$apply();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchAndShowTxHistory(getLatest, flushCacheOnNew) {
|
||||||
|
$scope.vm.updatingTxHistory = true;
|
||||||
|
|
||||||
|
walletHistoryService.updateLocalTxHistoryByPage($scope.wallet, getLatest, flushCacheOnNew, function onUpdateLocalTxHistoryByPage(err, txHistory, fetchedAllTransactions) {
|
||||||
|
$scope.vm.gettingInitialHistory = false;
|
||||||
|
$scope.vm.updatingTxHistory = false;
|
||||||
|
$scope.$broadcast('scroll.infiniteScrollComplete');
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
console.error('pagination Failed to get history.', err);
|
||||||
|
$scope.vm.updateTxHistoryFailed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fetchedAllTransactions) {
|
||||||
|
$scope.vm.fetchedAllTxHistory = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatTxHistoryForDisplay(txHistory);
|
||||||
|
|
||||||
|
completeTxHistory = txHistory;
|
||||||
|
showHistory(true);
|
||||||
|
$scope.$apply();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function showHistory(showAll) {
|
||||||
|
if (completeTxHistory) {
|
||||||
|
$scope.txHistory = showAll ? completeTxHistory : completeTxHistory.slice(0, (currentTxHistoryDisplayPage + 1) * DISPLAY_PAGE_SIZE);
|
||||||
|
$scope.vm.allowInfiniteScroll = !$scope.vm.fetchedAllTxHistory && !(completeTxHistory.length === $scope.txHistory.length && $scope.vm.gettingInitialHistory);
|
||||||
|
} else {
|
||||||
|
$scope.vm.allowInfiniteScroll = false;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
$scope.getDate = function(txCreated) {
|
$scope.getDate = function(txCreated) {
|
||||||
var date = new Date(txCreated * 1000);
|
var date = new Date(txCreated * 1000);
|
||||||
|
|
@ -235,24 +299,35 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
return !tx.confirmations || tx.confirmations === 0;
|
return !tx.confirmations || tx.confirmations === 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// on-infinite="showMore()"
|
||||||
$scope.showMore = function() {
|
$scope.showMore = function() {
|
||||||
$timeout(function() {
|
// Check if we have more than we are displaying
|
||||||
currentTxHistoryPage++;
|
if (completeTxHistory.length > $scope.txHistory.length) {
|
||||||
$scope.showHistory();
|
currentTxHistoryDisplayPage++;
|
||||||
|
showHistory(false);
|
||||||
$scope.$broadcast('scroll.infiniteScrollComplete');
|
$scope.$broadcast('scroll.infiniteScrollComplete');
|
||||||
}, 100);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope.vm.updatingTxHistory) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchAndShowTxHistory(false, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// on-refresh="onRefresh()"
|
||||||
$scope.onRefresh = function() {
|
$scope.onRefresh = function() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$scope.$broadcast('scroll.refreshComplete');
|
$scope.$broadcast('scroll.refreshComplete');
|
||||||
}, 300);
|
}, 300);
|
||||||
$scope.updateAll(true);
|
$scope.updateAll(true, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.updateAll = function(force, cb) {
|
$scope.updateAll = function(forceStatusUpdate, flushTxCacheOnNew) {
|
||||||
updateStatus(force);
|
updateStatus(forceStatusUpdate);
|
||||||
updateTxHistory(cb);
|
//updateTxHistory(cb);
|
||||||
|
fetchAndShowTxHistory(true, flushTxCacheOnNew);
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.hideToggle = function() {
|
$scope.hideToggle = function() {
|
||||||
|
|
@ -262,97 +337,32 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
};
|
};
|
||||||
|
|
||||||
var prevPos;
|
var prevPos;
|
||||||
|
$scope.txHistoryPaddingBottom = 0;
|
||||||
function getScrollPosition() {
|
function getScrollPosition() {
|
||||||
var scrollPosition = $ionicScrollDelegate.getScrollPosition();
|
var scrollPosition = $ionicScrollDelegate.getScrollPosition();
|
||||||
|
|
||||||
|
$timeout(function() {
|
||||||
|
getScrollPosition();
|
||||||
|
}, 200);
|
||||||
|
|
||||||
if (!scrollPosition) {
|
if (!scrollPosition) {
|
||||||
$window.requestAnimationFrame(function() {
|
|
||||||
getScrollPosition();
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var pos = scrollPosition.top;
|
var pos = scrollPosition.top;
|
||||||
|
if (pos > 0) {
|
||||||
|
$scope.txHistoryPaddingBottom = "200px";
|
||||||
|
}
|
||||||
if (pos === prevPos) {
|
if (pos === prevPos) {
|
||||||
$window.requestAnimationFrame(function() {
|
|
||||||
getScrollPosition();
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
prevPos = pos;
|
prevPos = pos;
|
||||||
refreshAmountSection(pos);
|
$scope.scrollPosition = pos;
|
||||||
};
|
|
||||||
|
|
||||||
function refreshAmountSection(scrollPos) {
|
|
||||||
var AMOUNT_HEIGHT_BASE = 210;
|
|
||||||
$scope.showBalanceButton = false;
|
|
||||||
if ($scope.status) {
|
|
||||||
$scope.showBalanceButton = ($scope.status.totalBalanceSat != $scope.status.spendableAmount);
|
|
||||||
if ($scope.showBalanceButton) {
|
|
||||||
AMOUNT_HEIGHT_BASE = 270;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$scope.amountIsCollapsible) {
|
|
||||||
var t = ($scope.showBalanceButton ? 15 : 45);
|
|
||||||
$scope.amountScale = 'translateY(' + t + 'px)';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollPos = scrollPos || 0;
|
|
||||||
var amountHeight = AMOUNT_HEIGHT_BASE - scrollPos;
|
|
||||||
if (amountHeight < 80) {
|
|
||||||
amountHeight = 80;
|
|
||||||
}
|
|
||||||
var contentMargin = amountHeight;
|
|
||||||
if (contentMargin > AMOUNT_HEIGHT_BASE) {
|
|
||||||
contentMargin = AMOUNT_HEIGHT_BASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
var amountScale = (amountHeight / AMOUNT_HEIGHT_BASE);
|
|
||||||
if (amountScale < 0.5) {
|
|
||||||
amountScale = 0.5;
|
|
||||||
}
|
|
||||||
if (amountScale > 1.1) {
|
|
||||||
amountScale = 1.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var s = amountScale;
|
|
||||||
|
|
||||||
// Make space for the balance button when it needs to display.
|
|
||||||
var TOP_NO_BALANCE_BUTTON = 115;
|
|
||||||
var TOP_BALANCE_BUTTON = 30;
|
|
||||||
var top = TOP_NO_BALANCE_BUTTON;
|
|
||||||
if ($scope.showBalanceButton) {
|
|
||||||
top = TOP_BALANCE_BUTTON;
|
|
||||||
}
|
|
||||||
|
|
||||||
var amountTop = ((amountScale - 0.80) / 0.80) * top;
|
|
||||||
if (amountTop < -2) {
|
|
||||||
amountTop = -2;
|
|
||||||
}
|
|
||||||
if (amountTop > top) {
|
|
||||||
amountTop = top;
|
|
||||||
}
|
|
||||||
|
|
||||||
var t = amountTop;
|
|
||||||
|
|
||||||
$scope.altAmountOpacity = (amountHeight - 100) / 80;
|
|
||||||
$scope.buttonsOpacity = (amountHeight - 140) / 70;
|
|
||||||
$window.requestAnimationFrame(function() {
|
|
||||||
$scope.amountHeight = amountHeight + 'px';
|
|
||||||
$scope.contentMargin = contentMargin + 'px';
|
|
||||||
$scope.amountScale = 'scale3d(' + s + ',' + s + ',' + s + ') translateY(' + t + 'px)';
|
|
||||||
$scope.$digest();
|
|
||||||
getScrollPosition();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var scrollWatcherInitialized;
|
var scrollWatcherInitialized;
|
||||||
|
|
||||||
$scope.$on("$ionicView.enter", function(event, data) {
|
$scope.$on("$ionicView.enter", function(event, data) {
|
||||||
if ($scope.isCordova && $scope.isAndroid) setAndroidStatusBarColor();
|
if ($scope.isCordova && $scope.isAndroid) setAndroidStatusBarColor();
|
||||||
if (scrollWatcherInitialized || !$scope.amountIsCollapsible) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
scrollWatcherInitialized = true;
|
scrollWatcherInitialized = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -370,7 +380,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
if (!$scope.wallet) return;
|
if (!$scope.wallet) return;
|
||||||
$scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1;
|
$scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1;
|
||||||
|
|
||||||
$scope.updatingTxHistory = true;
|
$scope.vm.gettingInitialHistory = true;
|
||||||
|
|
||||||
addressbookService.list(function(err, ab) {
|
addressbookService.list(function(err, ab) {
|
||||||
if (err) $log.error(err);
|
if (err) $log.error(err);
|
||||||
|
|
@ -380,21 +390,25 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
|
||||||
listeners = [
|
listeners = [
|
||||||
$rootScope.$on('bwsEvent', function(e, walletId) {
|
$rootScope.$on('bwsEvent', function(e, walletId) {
|
||||||
if (walletId == $scope.wallet.id && e.type != 'NewAddress')
|
if (walletId == $scope.wallet.id && e.type != 'NewAddress')
|
||||||
$scope.updateAll();
|
$scope.updateAll(false, false);
|
||||||
}),
|
}),
|
||||||
$rootScope.$on('Local/TxAction', function(e, walletId) {
|
$rootScope.$on('Local/TxAction', function(e, walletId) {
|
||||||
if (walletId == $scope.wallet.id)
|
if (walletId == $scope.wallet.id)
|
||||||
$scope.updateAll();
|
$scope.updateAll(false, false);
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
|
||||||
var refreshInterval;
|
var refreshInterval;
|
||||||
|
|
||||||
$scope.$on("$ionicView.afterEnter", function(event, data) {
|
$scope.$on("$ionicView.afterEnter", function onAfterEnter(event, data) {
|
||||||
$scope.updateAll();
|
updateTxHistoryFromCachedData();
|
||||||
refreshAmountSection();
|
$scope.updateAll(true, true);
|
||||||
|
// refreshAmountSection();
|
||||||
refreshInterval = $interval($scope.onRefresh, 10 * 1000);
|
refreshInterval = $interval($scope.onRefresh, 10 * 1000);
|
||||||
|
$timeout(function() {
|
||||||
|
getScrollPosition();
|
||||||
|
}, 1000);
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.$on("$ionicView.afterLeave", function(event, data) {
|
$scope.$on("$ionicView.afterLeave", function(event, data) {
|
||||||
|
|
|
||||||
|
|
@ -1,189 +1,204 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('walletSelectorController', function($scope, $state, sendFlowService, configService, gettextCatalog, profileService, txFormatService) {
|
(function () {
|
||||||
|
|
||||||
var fromWalletId = '';
|
angular
|
||||||
var priceDisplayAsFiat = false;
|
.module('copayApp.controllers')
|
||||||
var unitDecimals = 0;
|
.controller('walletSelectorController', walletSelectorController);
|
||||||
var unitsFromSatoshis = 0;
|
|
||||||
|
|
||||||
$scope.$on("$ionicView.beforeEnter", onBeforeEnter);
|
function walletSelectorController ($scope, $state, sendFlowService, configService, gettextCatalog, ongoingProcess, profileService, walletService, txFormatService) {
|
||||||
$scope.$on("$ionicView.enter", onEnter);
|
var fromWalletId = '';
|
||||||
|
var priceDisplayAsFiat = false;
|
||||||
function onBeforeEnter(event, data) {
|
var unitDecimals = 0;
|
||||||
if (data.direction == "back") {
|
var unitsFromSatoshis = 0;
|
||||||
sendFlowService.state.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.params = sendFlowService.state.getClone();
|
$scope.$on("$ionicView.beforeEnter", onBeforeEnter);
|
||||||
|
$scope.$on("$ionicView.enter", onEnter);
|
||||||
console.log('walletSelector onBeforeEnter after back sendflow', $scope.params);
|
|
||||||
|
function onBeforeEnter(event, data) {
|
||||||
var config = configService.getSync().wallet.settings;
|
if (data.direction == "back") {
|
||||||
priceDisplayAsFiat = config.priceDisplay === 'fiat';
|
sendFlowService.state.pop();
|
||||||
unitDecimals = config.unitDecimals;
|
|
||||||
unitsFromSatoshis = 1 / config.unitToSatoshi;
|
|
||||||
|
|
||||||
if ($scope.params.isWalletTransfer) {
|
|
||||||
$scope.sendFlowTitle = gettextCatalog.getString('Transfer between wallets');
|
|
||||||
} else if (!$scope.params.thirdParty) {
|
|
||||||
$scope.sendFlowTitle = gettextCatalog.getString('Send');
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.coin = false; // Wallets to show (for destination screen or contacts)
|
|
||||||
$scope.type = $scope.params['fromWalletId'] ? 'destination' : 'origin'; // origin || destination
|
|
||||||
fromWalletId = $scope.params['fromWalletId'];
|
|
||||||
|
|
||||||
if ($scope.type === 'destination' && $scope.params.toAddress) {
|
|
||||||
$state.transitionTo(getNextStep($scope.params));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($scope.params.coin) {
|
|
||||||
$scope.coin = $scope.params.coin; // Contacts have a coin embedded
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($scope.params.amount) { // There is an amount, so presume that it is a payment request
|
|
||||||
$scope.sendFlowTitle = gettextCatalog.getString('Payment Request');
|
|
||||||
$scope.specificAmount = $scope.specificAlternativeAmount = '';
|
|
||||||
$scope.isPaymentRequest = true;
|
|
||||||
}
|
|
||||||
if ($scope.params.thirdParty) {
|
|
||||||
$scope.thirdParty = $scope.params.thirdParty;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function onEnter (event, data) {
|
|
||||||
configService.whenAvailable(function(config) {
|
|
||||||
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
|
|
||||||
});
|
|
||||||
|
|
||||||
if ($scope.thirdParty) {
|
|
||||||
// Third party services specific logic
|
|
||||||
handleThirdPartyIfShapeshift();
|
|
||||||
}
|
|
||||||
|
|
||||||
prepareWalletLists();
|
|
||||||
formatRequestedAmount();
|
|
||||||
};
|
|
||||||
|
|
||||||
function formatRequestedAmount() {
|
|
||||||
if ($scope.params.amount) {
|
|
||||||
var cryptoAmount = (unitsFromSatoshis * $scope.params.amount).toFixed(unitDecimals);
|
|
||||||
var cryptoCoin = $scope.coin.toUpperCase();
|
|
||||||
|
|
||||||
txFormatService.formatAlternativeStr($scope.coin, $scope.params.amount, function onFormatAlternativeStr(formatted){
|
|
||||||
if (formatted) {
|
|
||||||
var fiatParts = formatted.split(' ');
|
|
||||||
var fiatAmount = fiatParts[0];
|
|
||||||
var fiatCurrrency = fiatParts.length > 1 ? fiatParts[1] : '';
|
|
||||||
|
|
||||||
if (priceDisplayAsFiat) {
|
|
||||||
$scope.requestAmount = fiatAmount;
|
|
||||||
$scope.requestCurrency = fiatCurrrency;
|
|
||||||
|
|
||||||
$scope.requestAmountSecondary = cryptoAmount;
|
|
||||||
$scope.requestCurrencySecondary = cryptoCoin;
|
|
||||||
} else {
|
|
||||||
$scope.requestAmount = cryptoAmount;
|
|
||||||
$scope.requestCurrency = cryptoCoin;
|
|
||||||
|
|
||||||
$scope.requestAmountSecondary = fiatAmount;
|
|
||||||
$scope.requestCurrencySecondary = fiatCurrrency;
|
|
||||||
}
|
|
||||||
$scope.$apply();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleThirdPartyIfShapeshift() {
|
|
||||||
console.log($scope.thirdParty, $scope.coin);
|
|
||||||
if ($scope.thirdParty.id === 'shapeshift' && $scope.type === 'destination') { // Shapeshift wants to know the
|
|
||||||
$scope.coin = profileService.getWallet(fromWalletId).coin;
|
|
||||||
if ($scope.coin === 'bch') {
|
|
||||||
$scope.coin = 'btc';
|
|
||||||
} else {
|
|
||||||
$scope.coin = 'bch';
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function prepareWalletLists() {
|
$scope.params = sendFlowService.state.getClone();
|
||||||
var walletsAll = [];
|
|
||||||
var walletsSufficientFunds = [];
|
|
||||||
$scope.walletsInsufficientFunds = []; // For origin screen
|
|
||||||
|
|
||||||
if ($scope.type === 'origin') {
|
console.log('walletSelector onBeforeEnter after back sendflow', $scope.params);
|
||||||
$scope.headerTitle = gettextCatalog.getString('Choose a wallet to send from');
|
|
||||||
|
|
||||||
|
var config = configService.getSync().wallet.settings;
|
||||||
|
priceDisplayAsFiat = config.priceDisplay === 'fiat';
|
||||||
|
unitDecimals = config.unitDecimals;
|
||||||
|
unitsFromSatoshis = 1 / config.unitToSatoshi;
|
||||||
|
|
||||||
|
if ($scope.params.isWalletTransfer) {
|
||||||
|
$scope.sendFlowTitle = gettextCatalog.getString('Transfer between wallets');
|
||||||
|
} else if (!$scope.params.thirdParty) {
|
||||||
|
$scope.sendFlowTitle = gettextCatalog.getString('Send');
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.coin = false; // Wallets to show (for destination screen or contacts)
|
||||||
|
$scope.type = $scope.params['fromWalletId'] ? 'destination' : 'origin'; // origin || destination
|
||||||
|
fromWalletId = $scope.params['fromWalletId'];
|
||||||
|
|
||||||
|
if ($scope.type === 'destination' && $scope.params.toAddress) {
|
||||||
|
$state.transitionTo(getNextStep($scope.params));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope.params.coin) {
|
||||||
|
$scope.coin = $scope.params.coin; // Contacts have a coin embedded
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scope.params.amount) { // There is an amount, so presume that it is a payment request
|
||||||
|
$scope.sendFlowTitle = gettextCatalog.getString('Payment Request');
|
||||||
|
$scope.specificAmount = $scope.specificAlternativeAmount = '';
|
||||||
|
$scope.isPaymentRequest = true;
|
||||||
|
}
|
||||||
|
if ($scope.params.thirdParty) {
|
||||||
|
$scope.thirdParty = $scope.params.thirdParty;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function onEnter (event, data) {
|
||||||
|
configService.whenAvailable(function(config) {
|
||||||
|
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($scope.thirdParty) {
|
||||||
|
// Third party services specific logic
|
||||||
|
handleThirdPartyIfShapeshift();
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareWalletLists();
|
||||||
|
formatRequestedAmount();
|
||||||
|
};
|
||||||
|
|
||||||
|
function formatRequestedAmount() {
|
||||||
if ($scope.params.amount) {
|
if ($scope.params.amount) {
|
||||||
|
var cryptoAmount = (unitsFromSatoshis * $scope.params.amount).toFixed(unitDecimals);
|
||||||
|
var cryptoCoin = $scope.coin.toUpperCase();
|
||||||
|
|
||||||
walletsAll = profileService.getWallets({coin: $scope.coin});
|
txFormatService.formatAlternativeStr($scope.coin, $scope.params.amount, function onFormatAlternativeStr(formatted){
|
||||||
|
if (formatted) {
|
||||||
|
var fiatParts = formatted.split(' ');
|
||||||
|
var fiatAmount = fiatParts[0];
|
||||||
|
var fiatCurrrency = fiatParts.length > 1 ? fiatParts[1] : '';
|
||||||
|
|
||||||
|
if (priceDisplayAsFiat) {
|
||||||
|
$scope.requestAmount = fiatAmount;
|
||||||
|
$scope.requestCurrency = fiatCurrrency;
|
||||||
|
|
||||||
|
$scope.requestAmountSecondary = cryptoAmount;
|
||||||
|
$scope.requestCurrencySecondary = cryptoCoin;
|
||||||
|
} else {
|
||||||
|
$scope.requestAmount = cryptoAmount;
|
||||||
|
$scope.requestCurrency = cryptoCoin;
|
||||||
|
|
||||||
|
$scope.requestAmountSecondary = fiatAmount;
|
||||||
|
$scope.requestCurrencySecondary = fiatCurrrency;
|
||||||
|
}
|
||||||
|
$scope.$apply();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleThirdPartyIfShapeshift() {
|
||||||
|
console.log($scope.thirdParty, $scope.coin);
|
||||||
|
if ($scope.thirdParty.id === 'shapeshift' && $scope.type === 'destination') { // Shapeshift wants to know the
|
||||||
|
$scope.coin = profileService.getWallet(fromWalletId).coin;
|
||||||
|
if ($scope.coin === 'bch') {
|
||||||
|
$scope.coin = 'btc';
|
||||||
|
} else {
|
||||||
|
$scope.coin = 'bch';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function prepareWalletLists() {
|
||||||
|
var walletsAll = [];
|
||||||
|
var walletsSufficientFunds = [];
|
||||||
|
$scope.walletsInsufficientFunds = []; // For origin screen
|
||||||
|
|
||||||
|
if ($scope.type === 'origin') {
|
||||||
|
$scope.headerTitle = gettextCatalog.getString('Choose a wallet to send from');
|
||||||
|
|
||||||
|
if ($scope.params.amount || $scope.coin) {
|
||||||
|
|
||||||
|
walletsAll = profileService.getWallets({coin: $scope.coin});
|
||||||
|
ongoingProcess.set('scanning', true);
|
||||||
|
walletsAll.forEach(function forWallet(wallet) {
|
||||||
|
if (!wallet.status && !wallet.cachedStatus) {
|
||||||
|
walletService.getStatus(wallet, {}, function(err, status) {
|
||||||
|
wallet.status = status;
|
||||||
|
if (status.availableBalanceSat > ($scope.params.amount ? $scope.params.amount : 0)) {
|
||||||
|
walletsSufficientFunds.push(wallet);
|
||||||
|
} else {
|
||||||
|
$scope.walletsInsufficientFunds.push(wallet);
|
||||||
|
}
|
||||||
|
if ($scope.coin === 'btc') { // As this is a promise
|
||||||
|
$scope.walletsBtc = walletsSufficientFunds;
|
||||||
|
} else {
|
||||||
|
$scope.walletsBch = walletsSufficientFunds;
|
||||||
|
}
|
||||||
|
ongoingProcess.set('scanning', false);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var walletStatus = null;
|
||||||
|
if (wallet.status && wallet.status.isValid) {
|
||||||
|
walletStatus = wallet.status;
|
||||||
|
} else if (wallet.cachedStatus && wallet.status.isValid) {
|
||||||
|
walletStatus = wallet.cachedStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (walletStatus && walletStatus.availableBalanceSat > ($scope.params.amount ? $scope.params.amount : 0)) {
|
||||||
|
walletsSufficientFunds.push(wallet);
|
||||||
|
} else {
|
||||||
|
$scope.walletsInsufficientFunds.push(wallet);
|
||||||
|
}
|
||||||
|
ongoingProcess.set('scanning', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($scope.coin === 'btc') {
|
||||||
|
$scope.walletsBtc = walletsSufficientFunds;
|
||||||
|
} else {
|
||||||
|
$scope.walletsBch = walletsSufficientFunds;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$scope.walletsBch = profileService.getWallets({coin: 'bch', hasFunds: true});
|
||||||
|
$scope.walletsBtc = profileService.getWallets({coin: 'btc', hasFunds: true});
|
||||||
|
$scope.walletsInsufficientFunds = profileService.getWallets({coin: $scope.coin, hasNoFunds: true});
|
||||||
|
}
|
||||||
|
|
||||||
walletsAll.forEach(function forWallet(wallet){
|
} else if ($scope.type === 'destination') {
|
||||||
if (wallet.status.availableBalanceSat > $scope.params.amount) {
|
if (!$scope.coin) { // Allow for the coin to be set by a third party
|
||||||
walletsSufficientFunds.push(wallet);
|
$scope.fromWallet = profileService.getWallet(fromWalletId);
|
||||||
} else {
|
$scope.coin = $scope.fromWallet.coin; // Only show wallets with the select origin wallet coin
|
||||||
$scope.walletsInsufficientFunds.push(wallet);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if ($scope.coin === 'btc') {
|
|
||||||
$scope.walletsBtc = walletsSufficientFunds;
|
|
||||||
} else {
|
|
||||||
$scope.walletsBch = walletsSufficientFunds;
|
|
||||||
}
|
}
|
||||||
|
$scope.headerTitle = gettextCatalog.getString('Choose a wallet to send to');
|
||||||
|
|
||||||
} else if ($scope.coin) {
|
if ($scope.coin === 'btc') { // if no specific coin is set or coin is set btc
|
||||||
walletsAll = profileService.getWallets({coin: $scope.coin});
|
$scope.walletsBtc = profileService.getWallets({coin: $scope.coin});
|
||||||
walletsAll.forEach(function forWallet(wallet){
|
|
||||||
if (wallet.status.availableBalanceSat > 0) {
|
|
||||||
walletsSufficientFunds.push(wallet);
|
|
||||||
} else {
|
|
||||||
$scope.walletsInsufficientFunds.push(wallet);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if ($scope.coin === 'btc') {
|
|
||||||
$scope.walletsBtc = walletsSufficientFunds;
|
|
||||||
} else {
|
} else {
|
||||||
$scope.walletsBch = walletsSufficientFunds;
|
$scope.walletsBch = profileService.getWallets({coin: $scope.coin});
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$scope.walletsBch = profileService.getWallets({coin: 'bch', hasFunds: true});
|
|
||||||
$scope.walletsBtc = profileService.getWallets({coin: 'btc', hasFunds: true});
|
|
||||||
$scope.walletsInsufficientFunds = profileService.getWallets({coin: $scope.coin, hasNoFunds: true});
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ($scope.type === 'destination') {
|
|
||||||
if (!$scope.coin) { // Allow for the coin to be set by a third party
|
|
||||||
$scope.fromWallet = profileService.getWallet(fromWalletId);
|
|
||||||
$scope.coin = $scope.fromWallet.coin; // Only show wallets with the select origin wallet coin
|
|
||||||
}
|
|
||||||
$scope.headerTitle = gettextCatalog.getString('Choose a wallet to send to');
|
|
||||||
|
|
||||||
if ($scope.coin === 'btc') { // if no specific coin is set or coin is set btc
|
|
||||||
$scope.walletsBtc = profileService.getWallets({coin: $scope.coin});
|
|
||||||
} else {
|
|
||||||
$scope.walletsBch = profileService.getWallets({coin: $scope.coin});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$scope.useWallet = function(wallet) {
|
$scope.useWallet = function(wallet) {
|
||||||
var params = sendFlowService.state.getClone();
|
var params = sendFlowService.state.getClone();
|
||||||
if ($scope.type === 'origin') { // we're on the origin screen, set wallet to send from
|
if ($scope.type === 'origin') { // we're on the origin screen, set wallet to send from
|
||||||
params.fromWalletId = wallet.id;
|
params.fromWalletId = wallet.id;
|
||||||
} else { // we're on the destination screen, set wallet to send to
|
} else { // we're on the destination screen, set wallet to send to
|
||||||
params.toWalletId = wallet.id;
|
params.toWalletId = wallet.id;
|
||||||
|
}
|
||||||
|
sendFlowService.goNext(params);
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.goBack = function() {
|
||||||
|
sendFlowService.router.goBack();
|
||||||
}
|
}
|
||||||
sendFlowService.goNext(params);
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.goBack = function() {
|
|
||||||
sendFlowService.router.goBack();
|
|
||||||
}
|
}
|
||||||
|
})();
|
||||||
});
|
|
||||||
|
|
@ -116,7 +116,8 @@ angular.module('copayApp.directives')
|
||||||
|
|
||||||
function getTransformStyle(translatePct) {
|
function getTransformStyle(translatePct) {
|
||||||
return {
|
return {
|
||||||
'transform': 'translateX(' + translatePct + '%)'
|
'transform': 'translateX(' + translatePct + '%)',
|
||||||
|
'-webkit-transform': 'translateX(' + translatePct + '%)'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
totalBalanceSat: '@',
|
totalBalanceSat: '@',
|
||||||
// The Wallet object is sometimes not stringify()-able, so not interpolatable,
|
// The Wallet object is sometimes not stringify()-able, so not interpolatable,
|
||||||
// so can't be passed to a directive.
|
// so can't be passed to a directive.
|
||||||
|
walletCoin: '@',
|
||||||
walletStatus: '@',
|
walletStatus: '@',
|
||||||
walletCachedBalance: '@',
|
walletCachedBalance: '@',
|
||||||
walletCachedBalanceUpdatedOn: '@',
|
walletCachedBalanceUpdatedOn: '@',
|
||||||
|
|
@ -31,7 +32,6 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
function displayCryptoBalance(walletStatus, walletCachedBalance, walletCachedBalanceUpdatedOn, walletCachedStatus) {
|
function displayCryptoBalance(walletStatus, walletCachedBalance, walletCachedBalanceUpdatedOn, walletCachedStatus) {
|
||||||
console.log('displayCryptoBalance()');
|
|
||||||
|
|
||||||
if (walletStatus && walletStatus.isValid && walletStatus.totalBalanceStr) {
|
if (walletStatus && walletStatus.isValid && walletStatus.totalBalanceStr) {
|
||||||
setDisplay(walletStatus.totalBalanceStr, '');
|
setDisplay(walletStatus.totalBalanceStr, '');
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
setDisplay('', '');
|
setDisplay('', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayFiatBalance(walletStatus, walletCachedStatus) {
|
function displayFiatBalance(walletStatus, walletCachedStatus, walletCoin) {
|
||||||
var displayAmount = '';
|
var displayAmount = '';
|
||||||
if (walletStatus && walletStatus.isValid && walletStatus.alternativeBalanceAvailable) {
|
if (walletStatus && walletStatus.isValid && walletStatus.alternativeBalanceAvailable) {
|
||||||
displayAmount = walletStatus.totalBalanceAlternative + ' ' + walletStatus.alternativeIsoCode;
|
displayAmount = walletStatus.totalBalanceAlternative + ' ' + walletStatus.alternativeIsoCode;
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getFiatBalance(wallet);
|
getFiatBalance(walletStatus, walletCachedStatus, walletCoin);
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatBalance() {
|
function formatBalance() {
|
||||||
|
|
@ -94,19 +94,30 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (displayAsFiat) {
|
if (displayAsFiat) {
|
||||||
displayFiatBalance(walletStatusObj, walletCachedStatusObj);
|
displayFiatBalance(walletStatusObj, walletCachedStatusObj, $scope.walletCoin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFiatBalance(wallet) {
|
function getFiatBalance(walletStatus, walletCachedStatus, walletCoin) {
|
||||||
if (!(wallet.status && wallet.status.isValid)) {
|
var totalBalanceSat = null;
|
||||||
$log.warn('Abandoning call to get fiat balance, because no valid wallet status.');
|
|
||||||
|
if (walletStatus && walletStatus.isValid) {
|
||||||
|
totalBalanceSat = walletStatus.totalBalanceSat
|
||||||
|
} else if (walletCachedStatus && walletCachedStatus.isValid) {
|
||||||
|
totalBalanceSat = walletCachedStatus.totalBalanceSat
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 is valid
|
||||||
|
if (totalBalanceSat === null) {
|
||||||
|
$log.warn('Abandoning call to get fiat balance, because no valid wallet status (cached or otherwise).');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
txFormatService.formatAlternativeStr(wallet.coin, wallet.status.totalBalanceSat, function onFormatAlernativeStr(formatted) {
|
txFormatService.formatAlternativeStr(walletCoin, totalBalanceSat, function onFormatAlernativeStr(formatted) {
|
||||||
if (formatted) {
|
if (formatted) {
|
||||||
setDisplay(formatted, '');
|
setDisplay(formatted, '');
|
||||||
|
} else {
|
||||||
|
$log.error('Failed to format fiat balance of wallet.');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +85,9 @@ angular.module('copayApp.services').factory('bitcoincomService', function(gettex
|
||||||
};
|
};
|
||||||
|
|
||||||
var register = function() {
|
var register = function() {
|
||||||
nextStepsService.register(cashGamesItem);
|
if (!platformInfo.isAndroid) { // To comply with Google Play policies
|
||||||
|
nextStepsService.register(cashGamesItem);
|
||||||
|
}
|
||||||
nextStepsService.register(newsItem);
|
nextStepsService.register(newsItem);
|
||||||
nextStepsService.register(poolItem);
|
nextStepsService.register(poolItem);
|
||||||
nextStepsService.register(toolsItem);
|
nextStepsService.register(toolsItem);
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer
|
||||||
},
|
},
|
||||||
|
|
||||||
bwscash: {
|
bwscash: {
|
||||||
url: 'https://bwscash.bitcoin.com/bws/api'
|
url: 'https://bws.freepages.dk/bws/api'
|
||||||
},
|
},
|
||||||
|
|
||||||
download: {
|
download: {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou
|
||||||
normal: gettext('Normal'),
|
normal: gettext('Normal'),
|
||||||
economy: gettext('Economy'),
|
economy: gettext('Economy'),
|
||||||
superEconomy: gettext('Super Economy'),
|
superEconomy: gettext('Super Economy'),
|
||||||
|
// free: gettext('No fee (works only for BCH)'),
|
||||||
custom: gettext('Custom')
|
custom: gettext('Custom')
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -31,6 +32,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou
|
||||||
root.getFeeRate = function(coin, network, feeLevel, cb) {
|
root.getFeeRate = function(coin, network, feeLevel, cb) {
|
||||||
|
|
||||||
if (feeLevel == 'custom') return cb();
|
if (feeLevel == 'custom') return cb();
|
||||||
|
// if (feeLevel == 'free') return cb(null, 0);
|
||||||
|
|
||||||
network = network || 'livenet';
|
network = network || 'livenet';
|
||||||
|
|
||||||
|
|
@ -48,9 +50,9 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var feeRate = feeLevelRate.feePerKb;
|
var feeRate = feeLevelRate.feePerKb;
|
||||||
|
|
||||||
|
|
||||||
if (!fromCache) $log.debug('Dynamic fee: ' + feeLevel + '/' + network + ' ' + (feeLevelRate.feePerKb / 1000).toFixed() + ' SAT/B');
|
if (!fromCache) $log.debug('Dynamic fee: ' + feeLevel + '/' + network + ' ' + (feeLevelRate.feePerKb / 1000).toFixed() + ' SAT/B');
|
||||||
|
|
||||||
return cb(null, feeRate);
|
return cb(null, feeRate);
|
||||||
|
|
|
||||||
180
src/js/services/latest-release.service.js
Normal file
|
|
@ -0,0 +1,180 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('bitcoincom.services')
|
||||||
|
.factory('latestReleaseService', latestReleaseService);
|
||||||
|
|
||||||
|
function latestReleaseService($log, $http, $ionicPopup, configService, externalLinkService, gettextCatalog, platformInfo) {
|
||||||
|
|
||||||
|
var service = {
|
||||||
|
// Functions
|
||||||
|
checkLatestRelease: checkLatestRelease,
|
||||||
|
requestLatestRelease: requestLatestRelease,
|
||||||
|
showUpdatePopup: showUpdatePopup
|
||||||
|
};
|
||||||
|
|
||||||
|
return service;
|
||||||
|
|
||||||
|
function checkLatestRelease(cb) {
|
||||||
|
var releaseURL = configService.getDefaults().release.url;
|
||||||
|
|
||||||
|
requestLatestRelease(releaseURL, function (err, releaseData) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
var currentVersion = window.version;
|
||||||
|
var latestVersion = releaseData.tag_name;
|
||||||
|
|
||||||
|
if (!verifyTagFormat(currentVersion))
|
||||||
|
return cb('Cannot verify the format of version tag: ' + currentVersion);
|
||||||
|
if (!verifyTagFormat(latestVersion))
|
||||||
|
return cb('Cannot verify the format of latest release tag: ' + latestVersion);
|
||||||
|
|
||||||
|
var current = formatTagNumber(currentVersion);
|
||||||
|
var latest = formatTagNumber(latestVersion);
|
||||||
|
|
||||||
|
if (latest.major < current.major || (latest.major === current.major && latest.minor <= current.minor)) {
|
||||||
|
return cb(null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseSearchTerm = "";
|
||||||
|
if (platformInfo.isNW) { // XX SP: DESKTOP: Check if the latest release is already available for current OS
|
||||||
|
var platform = process.platform;
|
||||||
|
if (platform === "darwin") {
|
||||||
|
releaseSearchTerm = "osx";
|
||||||
|
} else if (platform === "win32") {
|
||||||
|
releaseSearchTerm = "win";
|
||||||
|
} else if (platform === "linux") {
|
||||||
|
releaseSearchTerm = "linux";
|
||||||
|
}
|
||||||
|
var foundNewVersion = false;
|
||||||
|
for (var i in releaseData.assets) {
|
||||||
|
if (releaseData.assets[i].name.indexOf(releaseSearchTerm) !== -1) {
|
||||||
|
foundNewVersion = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$log.debug('A new version is available: ' + latestVersion);
|
||||||
|
|
||||||
|
var releaseNotes = false;
|
||||||
|
if (releaseData.body) {
|
||||||
|
var releaseLines = releaseData.body.split('\n');
|
||||||
|
for (var lineNum in releaseLines) {
|
||||||
|
if (releaseLines[lineNum].substring(0, 2) === "# ") {
|
||||||
|
releaseLines[lineNum] = "<strong>" + releaseLines[lineNum].substring(2) + "</strong>";
|
||||||
|
} else if (releaseLines[lineNum].substring(0, 2) === "- ") {
|
||||||
|
releaseLines[lineNum] = "• " + releaseLines[lineNum].substring(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
releaseNotes = releaseLines.join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
return cb(null, {latestVersion: latestVersion, releaseNotes: releaseNotes});
|
||||||
|
});
|
||||||
|
|
||||||
|
function verifyTagFormat(tag) {
|
||||||
|
var regex = /^v?\d+\.\d+(\.\d+)?(-rc\d)?$/i;
|
||||||
|
return regex.exec(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatTagNumber(tag) {
|
||||||
|
var label = false;
|
||||||
|
if (tag.split("-")[1]) { // Move postfixes like "-rc2" to a variable
|
||||||
|
label = tag.split("-")[1];
|
||||||
|
tag = tag.split("-")[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
var formattedNumber = tag.replace(/^v/i, '').split('.');
|
||||||
|
return {
|
||||||
|
major: +(formattedNumber[0] ? +formattedNumber[0] : 0),
|
||||||
|
minor: +(formattedNumber[1] ? +formattedNumber[1] : 0),
|
||||||
|
patch: +(formattedNumber[2] ? +formattedNumber[2] : 0),
|
||||||
|
label: label /* XX SP: Maybe we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requestLatestRelease(releaseURL, cb) {
|
||||||
|
$log.debug('Retrieving latest release information...');
|
||||||
|
|
||||||
|
var request = {
|
||||||
|
url: releaseURL,
|
||||||
|
method: 'GET',
|
||||||
|
json: true
|
||||||
|
};
|
||||||
|
|
||||||
|
$http(request).then(function (release) {
|
||||||
|
$log.debug('Latest release: ' + release.data.name);
|
||||||
|
return cb(null, release.data);
|
||||||
|
}, function (err) {
|
||||||
|
return cb('Cannot get the release information: ' + err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showUpdatePopup() {
|
||||||
|
var buttons = [];
|
||||||
|
|
||||||
|
if (!platformInfo.isIOS) { // There is no GitHub-release for iPhone
|
||||||
|
buttons.push({
|
||||||
|
text: "GitHub",
|
||||||
|
type: 'button-positive',
|
||||||
|
onTap: function () {
|
||||||
|
var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest';
|
||||||
|
externalLinkService.open(url, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (platformInfo.isAndroid) {
|
||||||
|
buttons.unshift({
|
||||||
|
text: "Google Play Store",
|
||||||
|
type: 'button-positive',
|
||||||
|
onTap: function () {
|
||||||
|
var url = 'https://play.google.com/store/apps/details?id=com.bitcoin.mwallet';
|
||||||
|
externalLinkService.open(url, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (platformInfo.isIOS) {
|
||||||
|
buttons.unshift({
|
||||||
|
text: "App Store",
|
||||||
|
type: 'button-positive',
|
||||||
|
onTap: function () {
|
||||||
|
var url = 'https://itunes.apple.com/app/id1252903728';
|
||||||
|
externalLinkService.open(url, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (platformInfo.isNW) {
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
buttons.unshift({
|
||||||
|
text: "Mac App Store",
|
||||||
|
type: 'button-positive',
|
||||||
|
onTap: function () {
|
||||||
|
var url = 'https://itunes.apple.com/app/bitcoin-com-wallet/id1383072453';
|
||||||
|
externalLinkService.open(url, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buttons.length === 1) { // There is only one source to download (probably on desktop, so open GitHub release page..)
|
||||||
|
buttons[0].onTap();
|
||||||
|
} else {
|
||||||
|
buttons.push({
|
||||||
|
text: gettextCatalog.getString('Go Back'),
|
||||||
|
type: 'button-positive',
|
||||||
|
onTap: function () {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$ionicPopup.show({
|
||||||
|
title: gettextCatalog.getString('Update Available'),
|
||||||
|
subTitle: gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.'),
|
||||||
|
cssClass: 'popup-update',
|
||||||
|
buttons: buttons
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
'use strict';
|
|
||||||
angular.module('copayApp.services')
|
|
||||||
.factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService) {
|
|
||||||
|
|
||||||
var root = {};
|
|
||||||
|
|
||||||
root.checkLatestRelease = function(cb) {
|
|
||||||
var releaseURL = configService.getDefaults().release.url;
|
|
||||||
|
|
||||||
requestLatestRelease(releaseURL, function(err, release) {
|
|
||||||
if (err) return cb(err);
|
|
||||||
var currentVersion = window.version;
|
|
||||||
var latestVersion = release.data.tag_name;
|
|
||||||
|
|
||||||
if (!verifyTagFormat(currentVersion))
|
|
||||||
return cb('Cannot verify the format of version tag: ' + currentVersion);
|
|
||||||
if (!verifyTagFormat(latestVersion))
|
|
||||||
return cb('Cannot verify the format of latest release tag: ' + latestVersion);
|
|
||||||
|
|
||||||
var current = formatTagNumber(currentVersion);
|
|
||||||
var latest = formatTagNumber(latestVersion);
|
|
||||||
|
|
||||||
if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor))
|
|
||||||
return cb(null, false);
|
|
||||||
|
|
||||||
$log.debug('A new version is available: ' + latestVersion);
|
|
||||||
return cb(null, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
function verifyTagFormat(tag) {
|
|
||||||
var regex = /^v?\d+\.\d+\.\d+$/i;
|
|
||||||
return regex.exec(tag);
|
|
||||||
};
|
|
||||||
|
|
||||||
function formatTagNumber(tag) {
|
|
||||||
var formattedNumber = tag.replace(/^v/i, '').split('.');
|
|
||||||
return {
|
|
||||||
major: +formattedNumber[0],
|
|
||||||
minor: +formattedNumber[1],
|
|
||||||
patch: +formattedNumber[2]
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
function requestLatestRelease(releaseURL, cb) {
|
|
||||||
$log.debug('Retrieving latest relsease information...');
|
|
||||||
|
|
||||||
var request = {
|
|
||||||
url: releaseURL,
|
|
||||||
method: 'GET',
|
|
||||||
json: true
|
|
||||||
};
|
|
||||||
|
|
||||||
$http(request).then(function(release) {
|
|
||||||
$log.debug('Latest release: ' + release.data.name);
|
|
||||||
return cb(null, release);
|
|
||||||
}, function(err) {
|
|
||||||
return cb('Cannot get the release information: ' + err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return root;
|
|
||||||
});
|
|
||||||
|
|
@ -52,11 +52,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
|
||||||
|
|
||||||
root.clear = function() {
|
root.clear = function() {
|
||||||
ongoingProcess = {};
|
ongoingProcess = {};
|
||||||
if (isCordova && !isWindowsPhoneApp) {
|
$ionicLoading.hide();
|
||||||
window.plugins.spinnerDialog.hide();
|
|
||||||
} else {
|
|
||||||
$ionicLoading.hide();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
root.get = function(processName) {
|
root.get = function(processName) {
|
||||||
|
|
@ -78,28 +74,21 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
|
||||||
root.onGoingProcessName = name;
|
root.onGoingProcessName = name;
|
||||||
|
|
||||||
var showName = $filter('translate')(processNames[name] || name);
|
var showName = $filter('translate')(processNames[name] || name);
|
||||||
|
|
||||||
|
if (root.onGoingProcessName) {
|
||||||
|
var tmpl;
|
||||||
|
if (isWindowsPhoneApp) tmpl = '<div>' + showName + '</div>';
|
||||||
|
else tmpl = '<div class="item-icon-left">' + showName + '<ion-spinner class="spinner-stable" icon="lines"></ion-spinner></div>';
|
||||||
|
$ionicLoading.show({
|
||||||
|
template: tmpl,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$ionicLoading.hide();
|
||||||
|
}
|
||||||
|
|
||||||
if (customHandler) {
|
if (customHandler) {
|
||||||
customHandler(processName, showName, isOn);
|
customHandler(processName, showName, isOn);
|
||||||
} else if (root.onGoingProcessName) {
|
}
|
||||||
if (isCordova && !isWindowsPhoneApp) {
|
|
||||||
window.plugins.spinnerDialog.show(null, showName, root.clear);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
var tmpl;
|
|
||||||
if (isWindowsPhoneApp) tmpl = '<div>' + showName + '</div>';
|
|
||||||
else tmpl = '<div class="item-icon-left">' + showName + '<ion-spinner class="spinner-stable" icon="lines"></ion-spinner></div>';
|
|
||||||
$ionicLoading.show({
|
|
||||||
template: tmpl
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isCordova && !isWindowsPhoneApp) {
|
|
||||||
window.plugins.spinnerDialog.hide();
|
|
||||||
} else {
|
|
||||||
$ionicLoading.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ angular
|
||||||
var service = {
|
var service = {
|
||||||
// Variables
|
// Variables
|
||||||
state: {
|
state: {
|
||||||
amount: '',
|
amount: 0,
|
||||||
displayAddress: null,
|
displayAddress: null,
|
||||||
fromWalletId: '',
|
fromWalletId: '',
|
||||||
sendMax: false,
|
sendMax: false,
|
||||||
|
|
@ -67,7 +67,7 @@ angular
|
||||||
$log.debug("send-flow-state clearCurrent()");
|
$log.debug("send-flow-state clearCurrent()");
|
||||||
|
|
||||||
service.state = {
|
service.state = {
|
||||||
amount: '',
|
amount: 0,
|
||||||
displayAddress: null,
|
displayAddress: null,
|
||||||
fromWalletId: '',
|
fromWalletId: '',
|
||||||
sendMax: false,
|
sendMax: false,
|
||||||
|
|
@ -101,7 +101,7 @@ angular
|
||||||
Object.keys(params).forEach(function forNewParam(key) {
|
Object.keys(params).forEach(function forNewParam(key) {
|
||||||
service.state[key] = params[key];
|
service.state[key] = params[key];
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pop state
|
* Pop state
|
||||||
|
|
@ -116,7 +116,7 @@ angular
|
||||||
} else {
|
} else {
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Push state
|
* Push state
|
||||||
|
|
@ -129,14 +129,14 @@ angular
|
||||||
service.previousStates.push(currentParams);
|
service.previousStates.push(currentParams);
|
||||||
clearCurrent();
|
clearCurrent();
|
||||||
map(params);
|
map(params);
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is empty stack
|
* Is empty stack
|
||||||
*/
|
*/
|
||||||
function isEmpty() {
|
function isEmpty() {
|
||||||
return service.previousStates.length == 0;
|
return service.previousStates.length == 0;
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
@ -144,6 +144,5 @@ angular
|
||||||
sendFlowStateService.pop();
|
sendFlowStateService.pop();
|
||||||
sendFlowRouterService.goBack();
|
sendFlowRouterService.goBack();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
@ -5,7 +5,7 @@ angular.module('copayApp.services').factory('servicesService', function(configSe
|
||||||
name: 'shapeshift',
|
name: 'shapeshift',
|
||||||
title: 'Shapeshift',
|
title: 'Shapeshift',
|
||||||
icon: 'icon-shapeshift',
|
icon: 'icon-shapeshift',
|
||||||
sref: 'tabs.shapeshift',
|
href: 'https://shapeshift.io/'
|
||||||
}];
|
}];
|
||||||
|
|
||||||
root.register = function(serviceInfo) {
|
root.register = function(serviceInfo) {
|
||||||
|
|
|
||||||
|
|
@ -328,18 +328,23 @@ angular.module('copayApp.services').factory('shapeshiftApiService', function($q)
|
||||||
$scope.amount, $scope.withdrawalAddress,
|
$scope.amount, $scope.withdrawalAddress,
|
||||||
$scope.coinIn, $scope.coinOut
|
$scope.coinIn, $scope.coinOut
|
||||||
);
|
);
|
||||||
|
console.log('shapeshiftApiService.FixedAmountTx()');
|
||||||
console.log(fixedTx);
|
console.log(fixedTx);
|
||||||
SSA.FixedAmountTx(fixedTx, function (data) {
|
SSA.FixedAmountTx(fixedTx, function (data) {
|
||||||
console.log(data)
|
console.log(data);
|
||||||
return promise.resolve({ fixedTxData : data.success });
|
promise.resolve(data);
|
||||||
});
|
});
|
||||||
return promise.promise;
|
return promise.promise;
|
||||||
},
|
},
|
||||||
NormalTx : function($scope){
|
NormalTx : function($scope){
|
||||||
var promise = $q.defer();
|
var promise = $q.defer();
|
||||||
var normalTx = SSA.CreateNormalTx($scope.withdrawalAddress, $scope.coinIn, $scope.coinOut);
|
var normalTx = SSA.CreateNormalTx($scope.withdrawalAddress, $scope.coinIn, $scope.coinOut);
|
||||||
|
|
||||||
|
console.log('shapeshiftApiService.NormalTx()');
|
||||||
|
console.log(normalTx);
|
||||||
SSA.NormalTx(normalTx, function (data) {
|
SSA.NormalTx(normalTx, function (data) {
|
||||||
promise.resolve({ normalTxData : data });
|
console.log(data);
|
||||||
|
promise.resolve(data);
|
||||||
});
|
});
|
||||||
return promise.promise;
|
return promise.promise;
|
||||||
},
|
},
|
||||||
|
|
@ -360,11 +365,12 @@ angular.module('copayApp.services').factory('shapeshiftApiService', function($q)
|
||||||
return promise.promise;
|
return promise.promise;
|
||||||
},
|
},
|
||||||
ValidateAddress : function(address, coin) {
|
ValidateAddress : function(address, coin) {
|
||||||
var promise = $q.defer();
|
var promise = $q.defer();
|
||||||
SSA.ValidateAdddress(address, coin, function(data){
|
SSA.ValidateAdddress(address, coin, function onRequest(data){
|
||||||
promise.resolve(data);
|
console.log(data);
|
||||||
});
|
promise.resolve(data);
|
||||||
return promise.promise;
|
});
|
||||||
|
return promise.promise;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
112
src/js/services/shapeshift.service.js
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('bitcoincom.services')
|
||||||
|
.factory('shapeshiftService', shapeshiftService);
|
||||||
|
|
||||||
|
function shapeshiftService(shapeshiftApiService, gettextCatalog) {
|
||||||
|
|
||||||
|
var service = {
|
||||||
|
// Variables
|
||||||
|
coinIn: '',
|
||||||
|
coinOut: '',
|
||||||
|
withdrawalAddress: '',
|
||||||
|
returnAddress: '',
|
||||||
|
amount: '',
|
||||||
|
marketData: {},
|
||||||
|
coins: {
|
||||||
|
'BTC': {name: 'Bitcoin', symbol: 'BTC'},
|
||||||
|
'BCH': {name: 'Bitcoin Cash', symbol: 'BCH'}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Functions
|
||||||
|
getMarketData: getMarketData,
|
||||||
|
shiftIt: shiftIt
|
||||||
|
};
|
||||||
|
|
||||||
|
return service;
|
||||||
|
|
||||||
|
function handleError(response, defaultMessage, cb) {
|
||||||
|
if (response && typeof response.error === "string") {
|
||||||
|
cb(new Error(response.error));
|
||||||
|
} else if (response && response.error && response.error.message) {
|
||||||
|
cb(new Error(response.error.message));
|
||||||
|
} else {
|
||||||
|
cb(new Error(defaultMessage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMarketData(coinIn, coinOut, cb) {
|
||||||
|
service.coinIn = coinIn;
|
||||||
|
service.coinOut = coinOut;
|
||||||
|
shapeshiftApiService
|
||||||
|
.marketInfo(service.coinIn, service.coinOut)
|
||||||
|
.then(function (response) {
|
||||||
|
if (!response || response.error) {
|
||||||
|
handleError(response, 'Invalid response from Shapeshift', cb);
|
||||||
|
} else {
|
||||||
|
service.marketData = response;
|
||||||
|
service.rateString = service.marketData.rate.toString() + ' ' + coinOut.toUpperCase() + '/' + coinIn.toUpperCase();
|
||||||
|
cb(null, response);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function shiftIt(coinIn, coinOut, withdrawalAddress, returnAddress, amount, cb) {
|
||||||
|
// Test if the amount is correct depending on the min and max
|
||||||
|
if (!amount || typeof amount !== 'number') {
|
||||||
|
cb(new Error(gettextCatalog.getString('Amount is not defined')));
|
||||||
|
} else if (amount < service.marketData.minimum) {
|
||||||
|
cb(new Error(gettextCatalog.getString('Amount is below the minimun')));
|
||||||
|
} else if (amount > service.marketData.maxLimit) {
|
||||||
|
cb(new Error(gettextCatalog.getString('Amount is above the limit')));
|
||||||
|
} else {
|
||||||
|
// Init service data
|
||||||
|
service.withdrawalAddress = withdrawalAddress;
|
||||||
|
service.returnAddress = returnAddress;
|
||||||
|
service.coinIn = coinIn;
|
||||||
|
service.coinOut = coinOut;
|
||||||
|
service.amount = amount;
|
||||||
|
|
||||||
|
// Check the address
|
||||||
|
shapeshiftApiService
|
||||||
|
.ValidateAddress(withdrawalAddress, coinOut)
|
||||||
|
.then(function onSuccess(response) {
|
||||||
|
if (response && response.isvalid) {
|
||||||
|
// Prepare the transaction shapeshift side
|
||||||
|
shapeshiftApiService.NormalTx(service).then(function onResponse(response) {
|
||||||
|
// If error, return it
|
||||||
|
if (!response || response.error) {
|
||||||
|
handleError(response, gettextCatalog.getString('Invalid response from Shapeshift'), cb);
|
||||||
|
} else {
|
||||||
|
var txData = response;
|
||||||
|
|
||||||
|
// If the content is not that it was expected, get back an error
|
||||||
|
if (!txData || !txData.orderId || !txData.deposit) {
|
||||||
|
cb(new Error(gettextCatalog.getString('Invalid response from Shapeshift')));
|
||||||
|
} else {
|
||||||
|
// Get back the data
|
||||||
|
service.depositInfo = txData;
|
||||||
|
var shapeshiftData = {
|
||||||
|
coinIn: coinIn,
|
||||||
|
coinOut: coinOut,
|
||||||
|
toWalletId: service.toWalletId,
|
||||||
|
minAmount: service.marketData.minimum,
|
||||||
|
maxAmount: service.marketData.maxLimit,
|
||||||
|
orderId: txData.orderId,
|
||||||
|
toAddress: txData.deposit
|
||||||
|
};
|
||||||
|
cb(null, shapeshiftData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
cb(new Error(gettextCatalog.getString('Invalid address')));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
@ -1,141 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
angular.module('copayApp.services').factory('shapeshiftService', function ($http, $interval, $log, lodash, moment, ongoingProcess, shapeshiftApiService, storageService, configService, incomingDataService, platformInfo, servicesService) {
|
|
||||||
var root = {};
|
|
||||||
root.ShiftState = 'Shift';
|
|
||||||
root.coinIn = '';
|
|
||||||
root.coinOut = '';
|
|
||||||
root.withdrawalAddress = '';
|
|
||||||
root.returnAddress = '';
|
|
||||||
root.amount = '';
|
|
||||||
root.marketData = {};
|
|
||||||
|
|
||||||
root.getMarketDataIn = function (coin) {
|
|
||||||
if (coin === root.coinOut) return root.getMarketData(root.coinOut, root.coinIn);
|
|
||||||
return root.getMarketData(coin, root.coinOut);
|
|
||||||
};
|
|
||||||
root.getMarketDataOut = function (coin) {
|
|
||||||
if (coin === root.coinIn) return root.getMarketData(root.coinOut, root.coinIn);
|
|
||||||
return root.getMarketData(root.coinIn, coin);
|
|
||||||
};
|
|
||||||
root.getMarketData = function (coinIn, coinOut, cb) {
|
|
||||||
root.coinIn = coinIn;
|
|
||||||
root.coinOut = coinOut;
|
|
||||||
if (root.coinIn === undefined || root.coinOut === undefined) return;
|
|
||||||
shapeshiftApiService
|
|
||||||
.marketInfo(root.coinIn, root.coinOut)
|
|
||||||
.then(function (marketData) {
|
|
||||||
root.marketData = marketData;
|
|
||||||
root.rateString = root.marketData.rate.toString() + ' ' + coinOut.toUpperCase() + '/' + coinIn.toUpperCase();
|
|
||||||
if (cb) {
|
|
||||||
cb(marketData);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/*shapeshiftApiService.coins().then(function(coins){
|
|
||||||
root.coins = coins;
|
|
||||||
root.coinIn = coins['BTC'].symbol;
|
|
||||||
root.coinOut = coins['BCH'].symbol;
|
|
||||||
root.getMarketData(root.coinIn, root.coinOut);
|
|
||||||
});*/
|
|
||||||
|
|
||||||
root.coins = {
|
|
||||||
'BTC': {name: 'Bitcoin', symbol: 'BTC'},
|
|
||||||
'BCH': {name: 'Bitcoin Cash', symbol: 'BCH'}
|
|
||||||
};
|
|
||||||
|
|
||||||
function checkForError(data) {
|
|
||||||
if (data.err) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
root.shiftIt = function (coinIn, coinOut, withdrawalAddress, returnAddress, cb) {
|
|
||||||
ongoingProcess.set('connectingShapeshift', true);
|
|
||||||
root.withdrawalAddress = withdrawalAddress;
|
|
||||||
root.returnAddress = returnAddress;
|
|
||||||
root.coinIn = coinIn;
|
|
||||||
root.coinOut = coinOut;
|
|
||||||
shapeshiftApiService.ValidateAddress(withdrawalAddress, coinOut).then(function (valid) {
|
|
||||||
var tx = ShapeShift();
|
|
||||||
var coin;
|
|
||||||
console.log("Starting");
|
|
||||||
tx.then(function (txData) {
|
|
||||||
console.log("Got txData", txData);
|
|
||||||
if (txData['fixedTxData']) {
|
|
||||||
txData = txData.fixedTxData;
|
|
||||||
if (checkForError(txData)) return cb(txData.err);
|
|
||||||
//console.log(txData)
|
|
||||||
var coinPair = txData.pair.split('_');
|
|
||||||
txData.depositType = coinPair[0].toUpperCase();
|
|
||||||
txData.withdrawalType = coinPair[1].toUpperCase();
|
|
||||||
coin = root.coins[txData.depositType].name.toLowerCase();
|
|
||||||
|
|
||||||
txData.depositQR = coin + ":" + txData.deposit + "?amount=" + txData.depositAmount;
|
|
||||||
|
|
||||||
root.txFixedPending = true;
|
|
||||||
|
|
||||||
} else if (txData['normalTxData']) {
|
|
||||||
txData = txData.normalTxData;
|
|
||||||
if (checkForError(txData)) return cb(txData.err);
|
|
||||||
coin = root.coins[txData.depositType.toUpperCase()].name.toLowerCase();
|
|
||||||
txData.depositQR = coin + ":" + txData.deposit;
|
|
||||||
} else if (txData['cancelTxData']) {
|
|
||||||
txData = txData.cancelTxData;
|
|
||||||
if (checkForError(txData)) return cb(txData.err);
|
|
||||||
if (root.txFixedPending) {
|
|
||||||
root.txFixedPending = false;
|
|
||||||
}
|
|
||||||
root.ShiftState = 'Shift';
|
|
||||||
}
|
|
||||||
root.depositInfo = txData;
|
|
||||||
//console.log(root.marketData);
|
|
||||||
//console.log(root.depositInfo);
|
|
||||||
var sendAddress = txData.depositQR;
|
|
||||||
if (sendAddress && sendAddress.indexOf('bitcoin cash') >= 0)
|
|
||||||
sendAddress = sendAddress.replace('bitcoin cash', 'bitcoincash');
|
|
||||||
|
|
||||||
ongoingProcess.set('connectingShapeshift', false);
|
|
||||||
|
|
||||||
root.ShiftState = 'Cancel';
|
|
||||||
//root.GetStatus();
|
|
||||||
//root.txInterval=$interval(root.GetStatus, 8000);
|
|
||||||
|
|
||||||
var shapeshiftData = {
|
|
||||||
coinIn: coinIn,
|
|
||||||
coinOut: coinOut,
|
|
||||||
toWalletId: root.toWalletId,
|
|
||||||
minAmount: root.marketData.minimum,
|
|
||||||
maxAmount: root.marketData.maxLimit,
|
|
||||||
orderId: root.depositInfo.orderId,
|
|
||||||
toAddress: txData.deposit
|
|
||||||
};
|
|
||||||
//
|
|
||||||
// if (incomingDataService.redir(sendAddress, 'shapeshift', shapeshiftData)) {
|
|
||||||
ongoingProcess.set('connectingShapeshift', false);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
cb(null, shapeshiftData);
|
|
||||||
});
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
function ShapeShift() {
|
|
||||||
if (parseFloat(root.amount) > 0) return shapeshiftApiService.FixedAmountTx(root);
|
|
||||||
return shapeshiftApiService.NormalTx(root);
|
|
||||||
}
|
|
||||||
|
|
||||||
root.GetStatus = function () {
|
|
||||||
var address = root.depositInfo.deposit
|
|
||||||
shapeshiftApiService.GetStatusOfDepositToAddress(address).then(function (data) {
|
|
||||||
root.DepositStatus = data;
|
|
||||||
if (root.DepositStatus.status === 'complete') {
|
|
||||||
$interval.cancel(root.txInterval);
|
|
||||||
root.depositInfo = null;
|
|
||||||
root.ShiftState = 'Shift'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
return root;
|
|
||||||
});
|
|
||||||
|
|
@ -10,7 +10,7 @@ angular.module('copayApp.services')
|
||||||
isoCode: 'en',
|
isoCode: 'en',
|
||||||
rateCode: 'USD'
|
rateCode: 'USD'
|
||||||
}, {
|
}, {
|
||||||
name: 'català',
|
name: 'Català',
|
||||||
isoCode: 'ca',
|
isoCode: 'ca',
|
||||||
rateCode: 'EUR'
|
rateCode: 'EUR'
|
||||||
},{
|
},{
|
||||||
|
|
@ -59,10 +59,6 @@ angular.module('copayApp.services')
|
||||||
name: 'Português',
|
name: 'Português',
|
||||||
isoCode: 'pt',
|
isoCode: 'pt',
|
||||||
rateCode: 'EUR'
|
rateCode: 'EUR'
|
||||||
}, {
|
|
||||||
name: 'русский язык',
|
|
||||||
isoCode: 'ru',
|
|
||||||
rateCode: 'RUB'
|
|
||||||
}, {
|
}, {
|
||||||
name: '한국어',
|
name: '한국어',
|
||||||
isoCode: 'ko',
|
isoCode: 'ko',
|
||||||
|
|
|
||||||
275
src/js/services/wallet-history.service.js
Normal file
|
|
@ -0,0 +1,275 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('bitcoincom.services')
|
||||||
|
.factory('walletHistoryService', walletHistoryService);
|
||||||
|
|
||||||
|
function walletHistoryService(configService, storageService, lodash, $log, txFormatService) {
|
||||||
|
//var PAGE_SIZE = 50;
|
||||||
|
var PAGE_SIZE = 20; // For dev only
|
||||||
|
// How much to overlap on each end of the page, for mitigating inconsistent sort order.
|
||||||
|
var PAGE_OVERLAP_FRACTION = 0.2;
|
||||||
|
var PAGE_OVERLAP = Math.floor(PAGE_SIZE * PAGE_OVERLAP_FRACTION);
|
||||||
|
// The fraction of transactions in the new overlapping resultset that we already know about.
|
||||||
|
// If we know about at least this many, then there are probably no gaps.
|
||||||
|
var MIN_KNOWN_TX_OVERLAP_FRACTION = 0.5;
|
||||||
|
|
||||||
|
var SAFE_CONFIRMATIONS = 6;
|
||||||
|
|
||||||
|
var allTransactionsFetched = false;
|
||||||
|
var service = {
|
||||||
|
getCachedTxHistory: getCachedTxHistory,
|
||||||
|
updateLocalTxHistoryByPage: updateLocalTxHistoryByPage,
|
||||||
|
};
|
||||||
|
return service;
|
||||||
|
|
||||||
|
function addEarlyTransactions(walletId, cachedTxs, newTxs) {
|
||||||
|
|
||||||
|
var cachedTxIndexFromId = {};
|
||||||
|
cachedTxs.forEach(function forCachedTx(tx){
|
||||||
|
cachedTxIndexFromId[tx.txid] = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
var confirmationsUpdated = false;
|
||||||
|
var someTransactionsWereNew = false;
|
||||||
|
var overlappingTxsCount = 0;
|
||||||
|
|
||||||
|
newTxs.forEach(function forNewTx(tx){
|
||||||
|
if (typeof cachedTxIndexFromId[tx.txid] === "undefined") {
|
||||||
|
someTransactionsWereNew = true;
|
||||||
|
cachedTxs.push(tx);
|
||||||
|
} else {
|
||||||
|
var txUpdated = updateCachedTx(cachedTxs, cachedTxIndexFromId, tx);
|
||||||
|
confirmationsUpdated = confirmationsUpdated || txUpdated;
|
||||||
|
overlappingTxsCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var overlappingTxFraction = overlappingTxsCount / Math.min(cachedTxs.length, PAGE_OVERLAP);
|
||||||
|
console.log('overlappingTxFraction:', overlappingTxFraction);
|
||||||
|
|
||||||
|
if (overlappingTxFraction >= MIN_KNOWN_TX_OVERLAP_FRACTION) { // We are good
|
||||||
|
if (someTransactionsWereNew) {
|
||||||
|
saveTxHistory(walletId, cachedTxs);
|
||||||
|
} else if (confirmationsUpdated) {
|
||||||
|
saveTxHistory(walletId, cachedTxs);
|
||||||
|
} else if (overlappingTxsCount === newTxs.length) {
|
||||||
|
allTransactionsFetched = true;
|
||||||
|
}
|
||||||
|
return cachedTxs;
|
||||||
|
} else {
|
||||||
|
// We might be missing some txs.
|
||||||
|
console.error('We might be missing some txs in the history.');
|
||||||
|
// Our history is wrong, so remove it - we could instead, try to fetch data that was not so early.
|
||||||
|
storageService.removeTxHistory(walletId, function onRemoveTxHistory(){});
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function addLatestTransactions(walletId, cachedTxs, newTxs) {
|
||||||
|
var cachedTxIndexFromId = {};
|
||||||
|
cachedTxs.forEach(function forCachedTx(tx, txIndex){
|
||||||
|
cachedTxIndexFromId[tx.txid] = txIndex;
|
||||||
|
});
|
||||||
|
|
||||||
|
var someTransactionsWereNew = false;
|
||||||
|
var confirmationsUpdated = false;
|
||||||
|
var overlappingTxsCount = 0;
|
||||||
|
var uniqueNewTxs = [];
|
||||||
|
|
||||||
|
newTxs.forEach(function forNewTx(tx){
|
||||||
|
if (typeof cachedTxIndexFromId[tx.txid] === "undefined") {
|
||||||
|
someTransactionsWereNew = true;
|
||||||
|
uniqueNewTxs.push(tx);
|
||||||
|
} else {
|
||||||
|
var txUpdated = updateCachedTx(cachedTxs, cachedTxIndexFromId, tx);
|
||||||
|
confirmationsUpdated = confirmationsUpdated || txUpdated;
|
||||||
|
overlappingTxsCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var overlappingTxFraction = overlappingTxsCount / Math.min(cachedTxs.length, PAGE_OVERLAP);
|
||||||
|
|
||||||
|
if (overlappingTxFraction >= MIN_KNOWN_TX_OVERLAP_FRACTION) { // We are good
|
||||||
|
if (someTransactionsWereNew) {
|
||||||
|
var allTxs = uniqueNewTxs.concat(cachedTxs);
|
||||||
|
saveTxHistory(walletId, allTxs);
|
||||||
|
return allTxs;
|
||||||
|
} else {
|
||||||
|
if (confirmationsUpdated) {
|
||||||
|
saveTxHistory(walletId, cachedTxs);
|
||||||
|
}
|
||||||
|
return cachedTxs;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We might be missing some txs.
|
||||||
|
// Our history is wrong, so just include the latest ones
|
||||||
|
saveTxHistory(walletId, newTxs);
|
||||||
|
return newTxs;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only clear the cache once we have received new transactions from the server.
|
||||||
|
/**
|
||||||
|
* @param wallet
|
||||||
|
* @param start
|
||||||
|
* @param {function(err, txs)} cb - transactions is always an array, may be empty
|
||||||
|
*/
|
||||||
|
function fetchTxHistoryByPage(wallet, start, cb) {
|
||||||
|
var skip = Math.max(0, start - PAGE_OVERLAP);
|
||||||
|
var limit = PAGE_SIZE;
|
||||||
|
|
||||||
|
var opts = {
|
||||||
|
skip: skip,
|
||||||
|
limit: limit
|
||||||
|
};
|
||||||
|
wallet.getTxHistory(opts, function onTxHistory(err, txsFromServer) {
|
||||||
|
if (err) {
|
||||||
|
return cb(err, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (txsFromServer.length === 0) {
|
||||||
|
return cb(null, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
var processedTxs = processNewTxs(wallet, txsFromServer);
|
||||||
|
|
||||||
|
return cb(null, processedTxs);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} walletId
|
||||||
|
* @param {function(error, txs)} cb - txs is always an array, may be empty
|
||||||
|
*/
|
||||||
|
function getCachedTxHistory(walletId, cb) {
|
||||||
|
console.log('txhistory updateLocalTxHistoryByPage()');
|
||||||
|
storageService.getTxHistory(walletId, function onGetTxHistory(err, txHistoryString){
|
||||||
|
if (err) {
|
||||||
|
return cb(err, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!txHistoryString) {
|
||||||
|
return cb(null, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
var txHistory = JSON.parse(txHistoryString);
|
||||||
|
return cb(null, txHistory);
|
||||||
|
} catch (e) {
|
||||||
|
$log.error('Failed to parse tx history.', e);
|
||||||
|
return cb(e, []);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function processNewTxs(wallet, txs) {
|
||||||
|
var now = Math.floor(Date.now() / 1000);
|
||||||
|
var txHistoryUnique = {};
|
||||||
|
var processedTxs = [];
|
||||||
|
wallet.hasUnsafeConfirmed = false;
|
||||||
|
|
||||||
|
lodash.each(txs, function(tx) {
|
||||||
|
tx = txFormatService.processTx(wallet.coin, tx);
|
||||||
|
|
||||||
|
// no future transactions...
|
||||||
|
if (tx.time > now)
|
||||||
|
tx.time = now;
|
||||||
|
|
||||||
|
if (tx.confirmations >= SAFE_CONFIRMATIONS) {
|
||||||
|
tx.safeConfirmed = SAFE_CONFIRMATIONS + '+';
|
||||||
|
} else {
|
||||||
|
tx.safeConfirmed = false;
|
||||||
|
wallet.hasUnsafeConfirmed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tx.note) {
|
||||||
|
delete tx.note.encryptedEditedByName;
|
||||||
|
delete tx.note.encryptedBody;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!txHistoryUnique[tx.txid]) {
|
||||||
|
processedTxs.push(tx);
|
||||||
|
txHistoryUnique[tx.txid] = true;
|
||||||
|
} else {
|
||||||
|
$log.debug('Ignoring duplicate TX in history: ' + tx.txid)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return processedTxs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveTxHistory(walletId, processedTxs) {
|
||||||
|
storageService.setTxHistory(processedTxs, walletId, function onSetTxHistory(error){
|
||||||
|
if (error) {
|
||||||
|
$log.error('pagination Failed to save tx history.', error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the cached tx was updated
|
||||||
|
* @param {*} cachedTxs
|
||||||
|
* @param {*} cachedTxIndexFromId - Indices for cachedTxs, based on txid
|
||||||
|
* @param {*} tx - The most recent tx info
|
||||||
|
*/
|
||||||
|
function updateCachedTx(cachedTxs, cachedTxIndexFromId, tx) {
|
||||||
|
var updated = false;
|
||||||
|
var txIndex = cachedTxIndexFromId[tx.txid];
|
||||||
|
var cachedTx = cachedTxs[txIndex];
|
||||||
|
|
||||||
|
if (cachedTx.confirmations < SAFE_CONFIRMATIONS && tx.confirmations > cachedTx.confirmations) {
|
||||||
|
cachedTxs[txIndex].confirmations = tx.confirmations;
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
return updated;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLocalTxHistoryByPage(wallet, getLatest, flushCacheOnNew, cb) {
|
||||||
|
console.log('txhistory updaetLocalTxHistoryByPage()');
|
||||||
|
if (flushCacheOnNew) {
|
||||||
|
fetchTxHistoryByPage(wallet, 0, function onFetchTxHistory(err, txs){
|
||||||
|
if (err) {
|
||||||
|
return cb(err, txs);
|
||||||
|
}
|
||||||
|
saveTxHistory(wallet.id, txs);
|
||||||
|
return cb(null, txs);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
getCachedTxHistory(wallet.id, function onCachedHistory(err, cachedTxs){
|
||||||
|
if (err) {
|
||||||
|
$log.error('Failed to get cached tx history.', err);
|
||||||
|
return cb(err, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
var start = getLatest ? 0 : cachedTxs.length;
|
||||||
|
fetchTxHistoryByPage(wallet, start, function onFetchHistory(err, fetchedTxs){
|
||||||
|
if (err) {
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fetchedTxs.length === 0) {
|
||||||
|
return cb(null, cachedTxs, true /*fetchedAllTransactions*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
var txs = [];
|
||||||
|
if (getLatest) {
|
||||||
|
txs = addLatestTransactions(wallet.id, cachedTxs, fetchedTxs);
|
||||||
|
} else {
|
||||||
|
allTransactionsFetched = false;
|
||||||
|
txs = addEarlyTransactions(wallet.id, cachedTxs, fetchedTxs);
|
||||||
|
return cb(null, txs, allTransactionsFetched);
|
||||||
|
}
|
||||||
|
return cb(null, txs);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
@ -396,6 +396,23 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var skipped = 0;
|
||||||
|
|
||||||
|
function fixTxsUnit(txs) {
|
||||||
|
if (!txs || !txs[0] || !txs[0].amountStr) return;
|
||||||
|
|
||||||
|
var cacheCoin = txs[0].amountStr.split(' ')[1];
|
||||||
|
|
||||||
|
if (cacheCoin == 'bits') {
|
||||||
|
|
||||||
|
$log.debug('Fixing Tx Cache Unit to: ' + wallet.coin)
|
||||||
|
lodash.each(txs, function(tx) {
|
||||||
|
tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount);
|
||||||
|
tx.feeStr = txFormatService.formatAmountStr(wallet.coin, tx.fees);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var updateLocalTxHistory = function(wallet, opts, cb) {
|
var updateLocalTxHistory = function(wallet, opts, cb) {
|
||||||
var FIRST_LIMIT = 5;
|
var FIRST_LIMIT = 5;
|
||||||
var LIMIT = 50;
|
var LIMIT = 50;
|
||||||
|
|
@ -406,25 +423,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
var progressFn = opts.progressFn || function() {};
|
var progressFn = opts.progressFn || function() {};
|
||||||
var foundLimitTx = false;
|
var foundLimitTx = false;
|
||||||
|
|
||||||
|
|
||||||
if (opts.feeLevels) {
|
if (opts.feeLevels) {
|
||||||
opts.lowAmount = root.getLowAmount(wallet, opts.feeLevels);
|
opts.lowAmount = root.getLowAmount(wallet, opts.feeLevels);
|
||||||
}
|
}
|
||||||
|
|
||||||
var fixTxsUnit = function(txs) {
|
|
||||||
if (!txs || !txs[0] || !txs[0].amountStr) return;
|
|
||||||
|
|
||||||
var cacheCoin = txs[0].amountStr.split(' ')[1];
|
|
||||||
|
|
||||||
if (cacheCoin == 'bits') {
|
|
||||||
|
|
||||||
$log.debug('Fixing Tx Cache Unit to: ' + wallet.coin)
|
|
||||||
lodash.each(txs, function(tx) {
|
|
||||||
tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount);
|
|
||||||
tx.feeStr = txFormatService.formatAmountStr(wallet.coin, tx.fees);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
getSavedTxs(walletId, function(err, txsFromLocal) {
|
getSavedTxs(walletId, function(err, txsFromLocal) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
@ -435,13 +437,14 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null;
|
var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null;
|
||||||
var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null;
|
var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null;
|
||||||
|
|
||||||
$log.debug('Confirmed TXs. Got:' + confirmedTxs.length + '/' + txsFromLocal.length);
|
console.log('pagination Hard confirmed TXs. Got:' + confirmedTxs.length + '/' + txsFromLocal.length);
|
||||||
|
|
||||||
// First update
|
// First update
|
||||||
progressFn(txsFromLocal, 0);
|
progressFn(txsFromLocal, 0);
|
||||||
wallet.completeHistory = txsFromLocal;
|
wallet.completeHistory = txsFromLocal;
|
||||||
|
|
||||||
function getNewTxs(newTxs, skip, next) {
|
function getNewTxs(newTxs, skip, next) {
|
||||||
|
console.log('pagination getNewTxs skip: ' + skip);
|
||||||
getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res) {
|
getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res) {
|
||||||
if (err) {
|
if (err) {
|
||||||
$log.warn(bwcError.msg(err, 'Server Error')); //TODO
|
$log.warn(bwcError.msg(err, 'Server Error')); //TODO
|
||||||
|
|
@ -454,6 +457,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('pagination Result count: ' + res.length);
|
||||||
// Check if new txs are founds, if yes, lets investigate in the 50 next
|
// Check if new txs are founds, if yes, lets investigate in the 50 next
|
||||||
// To be sure we are not missing txs by sorting (maybe a new tx is after the "endingTxid"
|
// To be sure we are not missing txs by sorting (maybe a new tx is after the "endingTxid"
|
||||||
var newDiscoveredTxs = res.filter(function (x) {
|
var newDiscoveredTxs = res.filter(function (x) {
|
||||||
|
|
@ -462,7 +466,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
}).length == 0;
|
}).length == 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
$log.debug('Discovering TXs. Got:' + newDiscoveredTxs.length);
|
console.log('pagination Discovering new TXs. Got:' + newDiscoveredTxs.length);
|
||||||
|
|
||||||
var shouldContinue = newDiscoveredTxs.length > 0;
|
var shouldContinue = newDiscoveredTxs.length > 0;
|
||||||
|
|
||||||
|
|
@ -475,7 +479,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
|
|
||||||
skip = skip + requestLimit;
|
skip = skip + requestLimit;
|
||||||
|
|
||||||
$log.debug('Syncing TXs. Got:' + newTxs.length + ' Skip:' + skip, ' EndingTxid:', endingTxid, ' Continue:', shouldContinue);
|
console.log('pagination Syncing TXs. Got:' + newTxs.length + ' Skip:' + skip, ' EndingTxid:', endingTxid, ' Continue:', shouldContinue);
|
||||||
|
|
||||||
// TODO Dirty <HACK>
|
// TODO Dirty <HACK>
|
||||||
// do not sync all history, just looking for a single TX.
|
// do not sync all history, just looking for a single TX.
|
||||||
|
|
@ -492,14 +496,16 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
}
|
}
|
||||||
// </HACK>
|
// </HACK>
|
||||||
|
|
||||||
|
shouldContinue = false;
|
||||||
|
|
||||||
|
skipped = skip;
|
||||||
|
|
||||||
if (!shouldContinue) {
|
if (!shouldContinue) {
|
||||||
$log.debug('Finished Sync: New / soft confirmed Txs: ' + newTxs.length);
|
console.log('pagination Finished Sync: New / soft confirmed Txs: ' + newTxs.length);
|
||||||
return next(null, newTxs);
|
return next(null, newTxs);
|
||||||
}
|
}
|
||||||
|
|
||||||
requestLimit = LIMIT;
|
requestLimit = LIMIT;
|
||||||
getNewTxs(newTxs, skip, next);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -535,6 +541,87 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (opts.getMoreTxs) {
|
||||||
|
var requestLimit = LIMIT;
|
||||||
|
getNewTxs([], skipped, function(err, txs) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
console.log();
|
||||||
|
createReceivedEvents(txs);
|
||||||
|
|
||||||
|
var newHistory = lodash.uniq(lodash.compact(txs.concat(confirmedTxs)), function(x) {
|
||||||
|
return x.txid;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function updateNotes(cb2) {
|
||||||
|
if (!endingTs) return cb2();
|
||||||
|
|
||||||
|
$log.debug('Syncing notes from: ' + endingTs);
|
||||||
|
wallet.getTxNotes({
|
||||||
|
minTs: endingTs
|
||||||
|
}, function(err, notes) {
|
||||||
|
if (err) {
|
||||||
|
$log.warn(err);
|
||||||
|
return cb2();
|
||||||
|
};
|
||||||
|
lodash.each(notes, function(note) {
|
||||||
|
$log.debug('Note for ' + note.txid);
|
||||||
|
lodash.each(newHistory, function(tx) {
|
||||||
|
if (tx.txid == note.txid) {
|
||||||
|
$log.debug('...updating note for ' + note.txid);
|
||||||
|
tx.note = note;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return cb2();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLowAmount(txs) {
|
||||||
|
if (!opts.lowAmount) return;
|
||||||
|
|
||||||
|
lodash.each(txs, function(tx) {
|
||||||
|
tx.lowAmount = tx.amount < opts.lowAmount;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
updateLowAmount(txs);
|
||||||
|
|
||||||
|
updateNotes(function() {
|
||||||
|
|
||||||
|
// <HACK>
|
||||||
|
if (foundLimitTx) {
|
||||||
|
$log.debug('Tx history read until limitTx: ' + opts.limitTx);
|
||||||
|
return cb(null, newHistory);
|
||||||
|
}
|
||||||
|
// </HACK>
|
||||||
|
|
||||||
|
var historyToSave = JSON.stringify(newHistory);
|
||||||
|
|
||||||
|
lodash.each(txs, function(tx) {
|
||||||
|
tx.recent = true;
|
||||||
|
})
|
||||||
|
|
||||||
|
$log.debug('Tx History synced. Total Txs: ' + newHistory.length);
|
||||||
|
|
||||||
|
// Final update
|
||||||
|
if (walletId == wallet.credentials.walletId) {
|
||||||
|
wallet.completeHistory = newHistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
return storageService.setTxHistory(historyToSave, walletId, function() {
|
||||||
|
$log.debug('Tx History saved.');
|
||||||
|
return cb(null, newHistory);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
skipped = 0;
|
||||||
|
|
||||||
getNewTxs([], 0, function(err, txs) {
|
getNewTxs([], 0, function(err, txs) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
|
@ -603,14 +690,19 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
|
|
||||||
return storageService.setTxHistory(historyToSave, walletId, function() {
|
return storageService.setTxHistory(historyToSave, walletId, function() {
|
||||||
$log.debug('Tx History saved.');
|
$log.debug('Tx History saved.');
|
||||||
|
return cb(null, newHistory);
|
||||||
return cb();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
root.getMoreTxs = function(wallet, cb) {
|
||||||
|
var opts = {};
|
||||||
|
opts.getMoreTxs = true;
|
||||||
|
updateLocalTxHistory(wallet, opts, cb);
|
||||||
|
};
|
||||||
|
|
||||||
root.getTxNote = function(wallet, txid, cb) {
|
root.getTxNote = function(wallet, txid, cb) {
|
||||||
wallet.getTxNote({
|
wallet.getTxNote({
|
||||||
txid: txid
|
txid: txid
|
||||||
|
|
@ -634,7 +726,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
};
|
};
|
||||||
|
|
||||||
root.getTx = function(wallet, txid, cb) {
|
root.getTx = function(wallet, txid, cb) {
|
||||||
|
|
||||||
function finish(list) {
|
function finish(list) {
|
||||||
var tx = lodash.find(list, {
|
var tx = lodash.find(list, {
|
||||||
txid: txid
|
txid: txid
|
||||||
|
|
@ -651,7 +742,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
limitTx: txid
|
limitTx: txid
|
||||||
}, function(err, txHistory) {
|
}, function(err, txHistory) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
finish(txHistory);
|
finish(txHistory);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -675,16 +765,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
root.getTxHistory = function(wallet, opts, cb) {
|
root.getTxHistory = function(wallet, opts, cb) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
var walletId = wallet.credentials.walletId;
|
|
||||||
|
|
||||||
if (!wallet.isComplete()) return cb();
|
if (!wallet.isComplete()) return cb();
|
||||||
|
|
||||||
function isHistoryCached() {
|
// var historyIsCached = wallet.completeHistory && wallet.completeHistory.isValid;
|
||||||
return wallet.completeHistory && wallet.completeHistory.isValid;
|
// if (historyIsCached && !opts.force) return cb(null, wallet.completeHistory);
|
||||||
};
|
|
||||||
|
|
||||||
// disable caching
|
|
||||||
//if (isHistoryCached() && !opts.force) return cb(null, wallet.completeHistory);
|
|
||||||
|
|
||||||
$log.debug('Updating Transaction History');
|
$log.debug('Updating Transaction History');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
%button-standard {
|
%button-standard {
|
||||||
width: 85%;
|
width: 90%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
.fee-summary {
|
.fee-summary {
|
||||||
position: relative;
|
background-color: #F2F2F2;
|
||||||
|
box-sizing: border-box;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
|
||||||
padding: 5px 12px 15px;
|
padding: 5px 12px 15px;
|
||||||
box-sizing: border-box;
|
position: relative;
|
||||||
background-color: #F2F2F2;
|
width: 100%;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
content: '';
|
content: '';
|
||||||
|
|
@ -18,12 +18,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.amount {
|
.amount {
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
.fee-fiat {
|
.fee-fiat {
|
||||||
|
display: inline;
|
||||||
|
|
||||||
&.positive {
|
&.positive {
|
||||||
color: #70955F;
|
color: #70955F;
|
||||||
}
|
}
|
||||||
|
|
@ -35,6 +34,7 @@
|
||||||
|
|
||||||
.fee-crypto {
|
.fee-crypto {
|
||||||
color: #A7A7A7;
|
color: #A7A7A7;
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
left: 13px;
|
left: 13px;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
-webkit-transform: translate(0,-50%);
|
||||||
transform: translate(0,-50%);
|
transform: translate(0,-50%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,8 @@
|
||||||
.button {
|
.button {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 19px;
|
font-size: 19px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding: 8px 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.button-first-contact img {
|
.button-first-contact img {
|
||||||
|
|
|
||||||
|
|
@ -350,6 +350,7 @@
|
||||||
.primary-amount-display {
|
.primary-amount-display {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.fee-summary {
|
.fee-summary {
|
||||||
position: absolute;
|
|
||||||
bottom: 92px;
|
bottom: 92px;
|
||||||
|
bottom: calc(92px + constant(safe-area-inset-bottom)); /* iOS 11.0 */
|
||||||
|
bottom: calc(92px + env(safe-area-inset-bottom)); /* iOS 11.2 */
|
||||||
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shapeshift-banner, .bitpay-banner, .egifter-banner {
|
.shapeshift-banner, .bitpay-banner, .egifter-banner {
|
||||||
|
|
@ -17,4 +19,5 @@
|
||||||
.warning {
|
.warning {
|
||||||
color: $v-warning-color-2;
|
color: $v-warning-color-2;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -83,14 +83,14 @@
|
||||||
.button {
|
.button {
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-radius: 47px;
|
border-radius: 47px;
|
||||||
padding: 0 15px 0 15px;
|
padding: 8px 2px 8px 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
font-size: 19px;
|
font-size: 19px;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
min-height: auto;
|
min-height: 0;
|
||||||
line-height: 36px;
|
line-height: 19px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.wallet-coin-logo {
|
.wallet-coin-logo {
|
||||||
|
|
@ -173,6 +173,11 @@
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #444;
|
color: #444;
|
||||||
}
|
}
|
||||||
|
.release-notes {
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-line;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
.button {
|
.button {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: none;
|
border: none;
|
||||||
|
|
@ -190,3 +195,13 @@
|
||||||
top:11px;
|
top:11px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.popup-update {
|
||||||
|
.popup-buttons {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.popup-buttons .button{
|
||||||
|
display:block;
|
||||||
|
min-width: 100% !important;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -84,6 +84,9 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.payment-received-container {
|
.payment-received-container {
|
||||||
|
svg {
|
||||||
|
max-height: 400px;
|
||||||
|
}
|
||||||
margin: 0 20px;
|
margin: 0 20px;
|
||||||
.payment-received-amount {
|
.payment-received-amount {
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@
|
||||||
width: auto;
|
width: auto;
|
||||||
margin: 2px 0 4px;
|
margin: 2px 0 4px;
|
||||||
}
|
}
|
||||||
height: 60px;
|
min-height: 65px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin-right: 0px;
|
margin-right: 0px;
|
||||||
width: 95%;
|
width: 95%;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
$wallet-details-collapse-transition: all 0.25s ease-in-out;
|
||||||
.wallet-details {
|
.wallet-details {
|
||||||
&__tx-amount {
|
&__tx-amount {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|
@ -137,6 +138,20 @@
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-top: env(safe-area-inset-top);
|
margin-top: env(safe-area-inset-top);
|
||||||
}
|
}
|
||||||
|
&.collapse {
|
||||||
|
ion-content {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
.amount {
|
||||||
|
&__scale, &__error {
|
||||||
|
-webkit-transform: scale3d(0.5, 0.5, 0.5) translateY(0px);
|
||||||
|
transform: scale3d(0.5, 0.5, 0.5) translateY(0px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.amount-alternative, .send-receive-buttons, .wallet-details-wallet-info {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.bar-header {
|
.bar-header {
|
||||||
border: 0;
|
border: 0;
|
||||||
|
|
@ -152,13 +167,14 @@
|
||||||
background-color: inherit !important;
|
background-color: inherit !important;
|
||||||
}
|
}
|
||||||
ion-content {
|
ion-content {
|
||||||
|
|
||||||
&.collapsible {
|
|
||||||
margin-top: 230px;
|
|
||||||
}
|
|
||||||
|
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
transition: $wallet-details-collapse-transition;
|
||||||
|
|
||||||
|
margin-top: 185px;
|
||||||
|
@media only screen and (max-height:500px) {
|
||||||
|
margin-top: 165px;
|
||||||
|
}
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
||||||
.scroll {
|
.scroll {
|
||||||
|
|
@ -199,7 +215,7 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 20px;
|
bottom: 20px;
|
||||||
|
transition: $wallet-details-collapse-transition;
|
||||||
>.col {
|
>.col {
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
|
@ -207,30 +223,37 @@
|
||||||
.button {
|
.button {
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-radius: 47px;
|
border-radius: 47px;
|
||||||
padding: 0 15px 0 15px;
|
padding: 6px 2px 6px 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
font-size: 19px;
|
font-size: 19px;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
min-height: auto;
|
min-height: 0;
|
||||||
line-height: 36px;
|
line-height: 19px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.amount {
|
.amount {
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
color: #fff;
|
|
||||||
height: 230px;
|
|
||||||
padding-top: 40px;
|
|
||||||
display: block;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
color: #fff;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
height: 230px;
|
||||||
|
@media only screen and (max-height:500px) {
|
||||||
|
height: 210px;
|
||||||
|
}
|
||||||
|
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
padding-top: 40px;
|
||||||
|
text-align: center;
|
||||||
|
transition: $wallet-details-collapse-transition;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
&__balance {
|
&__balance {
|
||||||
-webkit-transform: scale3d(1, 1, 1) translateY(45px);
|
-webkit-transform: scale3d(1, 1, 1) translateY(45px);
|
||||||
transform: scale3d(1, 1, 1) translateY(45px);
|
transform: scale3d(1, 1, 1) translateY(45px);
|
||||||
|
transition: $wallet-details-collapse-transition;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__updating {
|
&__updating {
|
||||||
|
|
@ -240,6 +263,7 @@
|
||||||
|
|
||||||
&-alternative {
|
&-alternative {
|
||||||
line-height: 36px;
|
line-height: 36px;
|
||||||
|
transition: $wallet-details-collapse-transition;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__button-balance {
|
&__button-balance {
|
||||||
|
|
@ -255,6 +279,7 @@
|
||||||
&__error {
|
&__error {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 35px 20px;
|
padding: 35px 20px;
|
||||||
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -341,4 +366,6 @@ a.item {
|
||||||
|
|
||||||
.loading-wallet svg {
|
.loading-wallet svg {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
}
|
}
|
||||||
|
|
@ -8,4 +8,56 @@ if (!ArrayBuffer['isView']) {
|
||||||
ArrayBuffer.isView = function(a) {
|
ArrayBuffer.isView = function(a) {
|
||||||
return a !== null && typeof(a) === "object" && a['buffer'] instanceof ArrayBuffer;
|
return a !== null && typeof(a) === "object" && a['buffer'] instanceof ArrayBuffer;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
||||||
|
if (!Array.prototype.includes) {
|
||||||
|
Object.defineProperty(Array.prototype, 'includes', {
|
||||||
|
value: function(searchElement, fromIndex) {
|
||||||
|
|
||||||
|
if (this == null) {
|
||||||
|
throw new TypeError('"this" is null or not defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Let O be ? ToObject(this value).
|
||||||
|
var o = Object(this);
|
||||||
|
|
||||||
|
// 2. Let len be ? ToLength(? Get(O, "length")).
|
||||||
|
var len = o.length >>> 0;
|
||||||
|
|
||||||
|
// 3. If len is 0, return false.
|
||||||
|
if (len === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Let n be ? ToInteger(fromIndex).
|
||||||
|
// (If fromIndex is undefined, this step produces the value 0.)
|
||||||
|
var n = fromIndex | 0;
|
||||||
|
|
||||||
|
// 5. If n ≥ 0, then
|
||||||
|
// a. Let k be n.
|
||||||
|
// 6. Else n < 0,
|
||||||
|
// a. Let k be len + n.
|
||||||
|
// b. If k < 0, let k be 0.
|
||||||
|
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
||||||
|
|
||||||
|
function sameValueZero(x, y) {
|
||||||
|
return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. Repeat, while k < len
|
||||||
|
while (k < len) {
|
||||||
|
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
|
||||||
|
// b. If SameValueZero(searchElement, elementK) is true, return true.
|
||||||
|
if (sameValueZero(o[k], searchElement)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// c. Increase k by 1.
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. Return false
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
209
www/css/main.css
|
|
@ -10083,7 +10083,7 @@ ion-view.deflash-blue:before, ion-view#view-amount:before, ion-view#view-confirm
|
||||||
.onboarding .button.button-white.button-standard,
|
.onboarding .button.button-white.button-standard,
|
||||||
.onboarding .button.button-green.button-standard,
|
.onboarding .button.button-green.button-standard,
|
||||||
.onboarding .button.button-assertive.button-standard, #shapeshift .button-shapeshift {
|
.onboarding .button.button-assertive.button-standard, #shapeshift .button-shapeshift {
|
||||||
width: 85%;
|
width: 90%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
|
@ -10195,6 +10195,7 @@ ion-view.deflash-blue:before, ion-view#view-amount:before, ion-view#view-confirm
|
||||||
.button {
|
.button {
|
||||||
border-radius: 6px; }
|
border-radius: 6px; }
|
||||||
.button.button-full {
|
.button.button-full {
|
||||||
|
border-radius: 0;
|
||||||
display: block; }
|
display: block; }
|
||||||
.button-green {
|
.button-green {
|
||||||
border-color: #FFF;
|
border-color: #FFF;
|
||||||
|
|
@ -10263,8 +10264,8 @@ ion-view.deflash-blue:before, ion-view#view-amount:before, ion-view#view-confirm
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
text-decoration: none; }
|
text-decoration: none; }
|
||||||
.button-white-outline.active, .button-white-outline.activated {
|
.button-white-outline.active, .button-white-outline.activated {
|
||||||
border-color: #FFF;
|
border-color: #FFFFFF;
|
||||||
background-color: #FAFAFA; }
|
background-color: #FFFFFF; }
|
||||||
.button-white-outline.button-outline {
|
.button-white-outline.button-outline {
|
||||||
border-color: #FFFFFF;
|
border-color: #FFFFFF;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
|
|
@ -10632,7 +10633,7 @@ qrcode {
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long .primary-amount-display {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.long .primary-amount-display {
|
||||||
font-size: 2em; } }
|
font-size: 2em; } }
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .primary-amount-display {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .primary-amount-display {
|
||||||
font-size: 0.9em; }
|
font-size: 1.2em; }
|
||||||
@media (min-width: 375px) {
|
@media (min-width: 375px) {
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .primary-amount-display {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long input, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .unit, #view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount.very-long .primary-amount-display {
|
||||||
font-size: 1.3em; } }
|
font-size: 1.3em; } }
|
||||||
|
|
@ -10659,7 +10660,8 @@ qrcode {
|
||||||
line-height: 1em; }
|
line-height: 1em; }
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount .primary-amount-display {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .primary-amount .primary-amount-display {
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
word-break: break-all; }
|
word-break: break-all;
|
||||||
|
width: 100%; }
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .alternative-amount {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .alternative-amount {
|
||||||
color: #6F6F70; }
|
color: #6F6F70; }
|
||||||
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .switch-currencies {
|
#view-amount .scroll-content .send-amount .send-amount-tool .send-amount-tool-input .switch-currencies {
|
||||||
|
|
@ -10680,30 +10682,33 @@ qrcode {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin: 0 14px; }
|
margin: 0 14px; }
|
||||||
#view-amount .scroll-content .send-amount-extras .available-funds {
|
#view-amount .scroll-content .send-amount-extras .available-funds {
|
||||||
color: #6F6F70; }
|
color: #6F6F70;
|
||||||
|
text-align: left; }
|
||||||
|
#view-amount .scroll-content .send-amount-extras .change-currency {
|
||||||
|
text-align: right; }
|
||||||
#view-amount .scroll-content .send-amount-extras .warning {
|
#view-amount .scroll-content .send-amount-extras .warning {
|
||||||
color: #b7664d; }
|
color: #b7664d; }
|
||||||
#view-amount .scroll-content .send-amount-extras .extra,
|
#view-amount .scroll-content .send-amount-extras .extra {
|
||||||
#view-amount .scroll-content .send-amount-extras button.extra {
|
flex: 1;
|
||||||
/*display: flex;*/
|
|
||||||
flex: 0 1 auto; }
|
|
||||||
#view-amount .scroll-content .send-amount-extras button.extra {
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
color: #000;
|
|
||||||
font-family: 'ProximaNova';
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: normal;
|
|
||||||
min-height: auto;
|
|
||||||
min-width: auto;
|
|
||||||
padding: 0; }
|
|
||||||
#view-amount .scroll-content .send-amount-extras .button .icon:before {
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: normal; }
|
line-height: normal; }
|
||||||
#view-amount .scroll-content .send-amount-extras .button span {
|
#view-amount .scroll-content .send-amount-extras .extra .button {
|
||||||
display: flex;
|
background: none;
|
||||||
align-items: center;
|
border: none;
|
||||||
justify-content: center; }
|
border-radius: 0;
|
||||||
|
color: #000;
|
||||||
|
font-family: 'ProximaNova';
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: normal;
|
||||||
|
min-height: auto;
|
||||||
|
min-width: auto;
|
||||||
|
padding: 0; }
|
||||||
|
#view-amount .scroll-content .send-amount-extras .extra .button .icon:before {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: normal; }
|
||||||
|
#view-amount .scroll-content .send-amount-extras .extra .button span {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center; }
|
||||||
#view-amount .scroll-content .button.no-margin {
|
#view-amount .scroll-content .button.no-margin {
|
||||||
margin: 0; }
|
margin: 0; }
|
||||||
#view-amount .scroll-content .notification-warning {
|
#view-amount .scroll-content .notification-warning {
|
||||||
|
|
@ -10939,14 +10944,14 @@ qrcode {
|
||||||
#tab-home .buttons .button {
|
#tab-home .buttons .button {
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-radius: 47px;
|
border-radius: 47px;
|
||||||
padding: 0 15px 0 15px;
|
padding: 8px 2px 8px 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
font-size: 19px;
|
font-size: 19px;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
min-height: auto;
|
min-height: 0;
|
||||||
line-height: 36px; }
|
line-height: 19px; }
|
||||||
|
|
||||||
#tab-home .wallet-coin-logo {
|
#tab-home .wallet-coin-logo {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
@ -11013,6 +11018,10 @@ qrcode {
|
||||||
#tab-home .release .title {
|
#tab-home .release .title {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #444; }
|
color: #444; }
|
||||||
|
#tab-home .release .release-notes {
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-line;
|
||||||
|
text-align: left; }
|
||||||
#tab-home .release .button {
|
#tab-home .release .button {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: none; }
|
border: none; }
|
||||||
|
|
@ -11025,6 +11034,14 @@ qrcode {
|
||||||
#tab-home .badge {
|
#tab-home .badge {
|
||||||
top: 11px; }
|
top: 11px; }
|
||||||
|
|
||||||
|
.popup-update .popup-buttons {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
|
.popup-update .popup-buttons .button {
|
||||||
|
display: block;
|
||||||
|
min-width: 100% !important;
|
||||||
|
margin-top: 4px; }
|
||||||
|
|
||||||
#tab-receive .button-share {
|
#tab-receive .button-share {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
|
@ -11101,6 +11118,8 @@ qrcode {
|
||||||
|
|
||||||
#tab-receive .payment-received-container {
|
#tab-receive .payment-received-container {
|
||||||
margin: 0 20px; }
|
margin: 0 20px; }
|
||||||
|
#tab-receive .payment-received-container svg {
|
||||||
|
max-height: 400px; }
|
||||||
#tab-receive .payment-received-container .payment-received-amount {
|
#tab-receive .payment-received-container .payment-received-amount {
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
display: block;
|
display: block;
|
||||||
|
|
@ -11207,7 +11226,7 @@ qrcode {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
margin-top: 18px; }
|
margin-top: 18px; }
|
||||||
#tab-send .send-wrapper .buttons .button {
|
#tab-send .send-wrapper .buttons .button {
|
||||||
height: 60px;
|
min-height: 65px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
margin-right: 0px;
|
margin-right: 0px;
|
||||||
width: 95%;
|
width: 95%;
|
||||||
|
|
@ -11284,7 +11303,9 @@ qrcode {
|
||||||
margin-top: 18px; }
|
margin-top: 18px; }
|
||||||
#tab-send .sendTip .buttons .button {
|
#tab-send .sendTip .buttons .button {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 19px; }
|
font-size: 19px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding: 8px 6px; }
|
||||||
#tab-send .sendTip .button-first-contact img {
|
#tab-send .sendTip .button-first-contact img {
|
||||||
height: 19px;
|
height: 19px;
|
||||||
width: 19px;
|
width: 19px;
|
||||||
|
|
@ -11920,6 +11941,13 @@ qrcode {
|
||||||
#walletDetails .bp-content.status-bar {
|
#walletDetails .bp-content.status-bar {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-top: env(safe-area-inset-top); }
|
margin-top: env(safe-area-inset-top); }
|
||||||
|
#walletDetails .bp-content.collapse ion-content {
|
||||||
|
margin-top: 40px; }
|
||||||
|
#walletDetails .bp-content.collapse .amount__scale, #walletDetails .bp-content.collapse .amount__error {
|
||||||
|
-webkit-transform: scale3d(0.5, 0.5, 0.5) translateY(0px);
|
||||||
|
transform: scale3d(0.5, 0.5, 0.5) translateY(0px); }
|
||||||
|
#walletDetails .bp-content.collapse .amount-alternative, #walletDetails .bp-content.collapse .send-receive-buttons, #walletDetails .bp-content.collapse .wallet-details-wallet-info {
|
||||||
|
opacity: 0; }
|
||||||
#walletDetails .bar-header {
|
#walletDetails .bar-header {
|
||||||
border: 0;
|
border: 0;
|
||||||
background: #eeb640; }
|
background: #eeb640; }
|
||||||
|
|
@ -11932,9 +11960,12 @@ qrcode {
|
||||||
#walletDetails ion-content {
|
#walletDetails ion-content {
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
transition: all 0.25s ease-in-out;
|
||||||
|
margin-top: 185px;
|
||||||
margin-bottom: 16px; }
|
margin-bottom: 16px; }
|
||||||
#walletDetails ion-content.collapsible {
|
@media only screen and (max-height: 500px) {
|
||||||
margin-top: 230px; }
|
#walletDetails ion-content {
|
||||||
|
margin-top: 165px; } }
|
||||||
#walletDetails ion-content .scroll {
|
#walletDetails ion-content .scroll {
|
||||||
background: #f8f8f9;
|
background: #f8f8f9;
|
||||||
min-height: 300px; }
|
min-height: 300px; }
|
||||||
|
|
@ -11965,38 +11996,45 @@ qrcode {
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 20px; }
|
bottom: 20px;
|
||||||
|
transition: all 0.25s ease-in-out; }
|
||||||
#walletDetails .amount-wrapper .send-receive-buttons > .col {
|
#walletDetails .amount-wrapper .send-receive-buttons > .col {
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
margin-bottom: 0; }
|
margin-bottom: 0; }
|
||||||
#walletDetails .amount-wrapper .send-receive-buttons .button {
|
#walletDetails .amount-wrapper .send-receive-buttons .button {
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-radius: 47px;
|
border-radius: 47px;
|
||||||
padding: 0 15px 0 15px;
|
padding: 6px 2px 6px 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
font-size: 19px;
|
font-size: 19px;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
min-height: auto;
|
min-height: 0;
|
||||||
line-height: 36px; }
|
line-height: 19px; }
|
||||||
#walletDetails .amount {
|
#walletDetails .amount {
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
color: #fff;
|
|
||||||
height: 230px;
|
|
||||||
padding-top: 40px;
|
|
||||||
display: block;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center; }
|
color: #fff;
|
||||||
|
display: block;
|
||||||
|
height: 230px;
|
||||||
|
justify-content: center;
|
||||||
|
padding-top: 40px;
|
||||||
|
text-align: center;
|
||||||
|
transition: all 0.25s ease-in-out;
|
||||||
|
width: 100%; }
|
||||||
|
@media only screen and (max-height: 500px) {
|
||||||
|
#walletDetails .amount {
|
||||||
|
height: 210px; } }
|
||||||
#walletDetails .amount__balance {
|
#walletDetails .amount__balance {
|
||||||
-webkit-transform: scale3d(1, 1, 1) translateY(45px);
|
-webkit-transform: scale3d(1, 1, 1) translateY(45px);
|
||||||
transform: scale3d(1, 1, 1) translateY(45px); }
|
transform: scale3d(1, 1, 1) translateY(45px);
|
||||||
|
transition: all 0.25s ease-in-out; }
|
||||||
#walletDetails .amount__updating {
|
#walletDetails .amount__updating {
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
margin-top: -2.1rem; }
|
margin-top: -2.1rem; }
|
||||||
#walletDetails .amount-alternative {
|
#walletDetails .amount-alternative {
|
||||||
line-height: 36px; }
|
line-height: 36px;
|
||||||
|
transition: all 0.25s ease-in-out; }
|
||||||
#walletDetails .amount__button-balance {
|
#walletDetails .amount__button-balance {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.25);
|
border: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
|
|
@ -12006,7 +12044,8 @@ qrcode {
|
||||||
vertical-align: middle; }
|
vertical-align: middle; }
|
||||||
#walletDetails .amount__error {
|
#walletDetails .amount__error {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 35px 20px; }
|
padding: 35px 20px;
|
||||||
|
opacity: 1; }
|
||||||
#walletDetails .no-alternative {
|
#walletDetails .no-alternative {
|
||||||
padding-top: 45px; }
|
padding-top: 45px; }
|
||||||
#walletDetails .item.item-footer {
|
#walletDetails .item.item-footer {
|
||||||
|
|
@ -12071,7 +12110,9 @@ a.item {
|
||||||
font-size: 0.9em; }
|
font-size: 0.9em; }
|
||||||
|
|
||||||
.loading-wallet svg {
|
.loading-wallet svg {
|
||||||
margin-top: 0; }
|
margin-top: 0;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px; }
|
||||||
|
|
||||||
#advanced-settings .list .item:before {
|
#advanced-settings .list .item:before {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
@ -12125,7 +12166,9 @@ a.item {
|
||||||
margin-top: 18px; }
|
margin-top: 18px; }
|
||||||
#shapeshift .empty-case .buttons .button {
|
#shapeshift .empty-case .buttons .button {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 19px; }
|
font-size: 19px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding: 8px 6px; }
|
||||||
#shapeshift .empty-case .button-first-contact img {
|
#shapeshift .empty-case .button-first-contact img {
|
||||||
height: 19px;
|
height: 19px;
|
||||||
width: 19px;
|
width: 19px;
|
||||||
|
|
@ -13812,6 +13855,7 @@ click-to-accept {
|
||||||
height: 92px;
|
height: 92px;
|
||||||
width: 100%; }
|
width: 100%; }
|
||||||
click-to-accept .click-to-accept__button.button.button-primary.button-standard {
|
click-to-accept .click-to-accept__button.button.button-primary.button-standard {
|
||||||
|
border-radius: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
max-width: 9999px;
|
max-width: 9999px;
|
||||||
width: 100%; }
|
width: 100%; }
|
||||||
|
|
@ -13918,6 +13962,8 @@ slide-to-accept {
|
||||||
height: 92px;
|
height: 92px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: #494949; }
|
background: #494949; }
|
||||||
|
slide-to-accept .slide .button {
|
||||||
|
border-radius: 0; }
|
||||||
slide-to-accept .slide__listener {
|
slide-to-accept .slide__listener {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
@ -15349,20 +15395,25 @@ log-options #check-bar .checkbox-icon {
|
||||||
#cash-scan a {
|
#cash-scan a {
|
||||||
cursor: pointer; }
|
cursor: pointer; }
|
||||||
|
|
||||||
#view-review {
|
#view-review slide-to-accept, #view-review slide-to-accept-success {
|
||||||
background-color: #494949; }
|
margin-bottom: constant(safe-area-inset-bottom);
|
||||||
#view-review slide-to-accept, #view-review slide-to-accept-success {
|
/* iOS 11.0 */
|
||||||
margin-bottom: constant(safe-area-inset-bottom);
|
margin-bottom: env(safe-area-inset-bottom);
|
||||||
/* iOS 11.0 */
|
/* iOS 11.2 */ }
|
||||||
margin-bottom: env(safe-area-inset-bottom);
|
|
||||||
/* iOS 11.2 */ }
|
#view-review .fee-summary {
|
||||||
#view-review .fee-summary {
|
bottom: 92px;
|
||||||
position: absolute;
|
bottom: calc(92px + constant(safe-area-inset-bottom));
|
||||||
bottom: 92px; }
|
/* iOS 11.0 */
|
||||||
#view-review .shapeshift-banner, #view-review .bitpay-banner, #view-review .egifter-banner {
|
bottom: calc(92px + env(safe-area-inset-bottom));
|
||||||
box-shadow: none; }
|
/* iOS 11.2 */
|
||||||
#view-review .warning {
|
position: absolute; }
|
||||||
color: #b7664d; }
|
|
||||||
|
#view-review .shapeshift-banner, #view-review .bitpay-banner, #view-review .egifter-banner {
|
||||||
|
box-shadow: none; }
|
||||||
|
|
||||||
|
#view-review .warning {
|
||||||
|
color: #b7664d; }
|
||||||
|
|
||||||
.gravatar {
|
.gravatar {
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
|
@ -15395,6 +15446,7 @@ log-options #check-bar .checkbox-icon {
|
||||||
left: 13px;
|
left: 13px;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
-webkit-transform: translate(0, -50%);
|
||||||
transform: translate(0, -50%); }
|
transform: translate(0, -50%); }
|
||||||
|
|
||||||
.item .item-content.item-content-compact {
|
.item .item-content.item-content-compact {
|
||||||
|
|
@ -15463,8 +15515,8 @@ ion-content.padded-bottom-cta-with-summary {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis; }
|
text-overflow: ellipsis; }
|
||||||
.address-frame.expanded {
|
.address-frame.expanded {
|
||||||
white-space: pre-wrap;
|
white-space: normal;
|
||||||
word-break: break-all; }
|
text-overflow: clip; }
|
||||||
.address-frame .prefix {
|
.address-frame .prefix {
|
||||||
color: #000000; }
|
color: #000000; }
|
||||||
.address-frame .mid {
|
.address-frame .mid {
|
||||||
|
|
@ -15507,13 +15559,13 @@ ion-content.padded-bottom-cta-with-summary {
|
||||||
transform: scale(1, 1); }
|
transform: scale(1, 1); }
|
||||||
|
|
||||||
.fee-summary {
|
.fee-summary {
|
||||||
position: relative;
|
background-color: #F2F2F2;
|
||||||
|
box-sizing: border-box;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
width: 100%;
|
|
||||||
padding: 5px 12px 15px;
|
padding: 5px 12px 15px;
|
||||||
box-sizing: border-box;
|
position: relative;
|
||||||
background-color: #F2F2F2; }
|
width: 100%; }
|
||||||
.fee-summary:before {
|
.fee-summary:before {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|
@ -15523,16 +15575,16 @@ ion-content.padded-bottom-cta-with-summary {
|
||||||
height: 15px;
|
height: 15px;
|
||||||
background: linear-gradient(to bottom, rgba(242, 242, 242, 0) 0%, #f2f2f2 100%); }
|
background: linear-gradient(to bottom, rgba(242, 242, 242, 0) 0%, #f2f2f2 100%); }
|
||||||
.fee-summary .amount {
|
.fee-summary .amount {
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
width: 100%; }
|
width: 100%; }
|
||||||
.fee-summary .amount .fee-fiat.positive {
|
.fee-summary .amount .fee-fiat {
|
||||||
color: #70955F; }
|
display: inline; }
|
||||||
.fee-summary .amount .fee-fiat.negative {
|
.fee-summary .amount .fee-fiat.positive {
|
||||||
color: #C24633; }
|
color: #70955F; }
|
||||||
|
.fee-summary .amount .fee-fiat.negative {
|
||||||
|
color: #C24633; }
|
||||||
.fee-summary .amount .fee-crypto {
|
.fee-summary .amount .fee-crypto {
|
||||||
color: #A7A7A7; }
|
color: #A7A7A7;
|
||||||
|
float: right; }
|
||||||
|
|
||||||
.formatted-amount {
|
.formatted-amount {
|
||||||
display: inline-block; }
|
display: inline-block; }
|
||||||
|
|
@ -15557,6 +15609,9 @@ ion-content.padded-bottom-cta-with-summary {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
text-transform: uppercase; }
|
text-transform: uppercase; }
|
||||||
|
|
||||||
|
.wallet-balance-directive {
|
||||||
|
display: inline-block; }
|
||||||
|
|
||||||
/* This is for rules that don't yet have a home.
|
/* This is for rules that don't yet have a home.
|
||||||
* Our goal is to delete this file. Search the regex: /class=".*CLASS.*?"/
|
* Our goal is to delete this file. Search the regex: /class=".*CLASS.*?"/
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -53,11 +53,12 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="keypad-container" style="background: #fff; position: absolute; bottom: 0; margin-bottom: 57px; width: 100%;">
|
<div class="keypad-container" style="background: #fff; position: absolute; bottom: 0; margin-bottom: 57px; width: 100%;">
|
||||||
<div class="sendmax" ng-if="vm.availableFunds && !vm.isRequestingSpecificAmount">
|
<div class="sendmax" ng-if="vm.showSendMaxButton || vm.showSendLimitMaxButton">
|
||||||
<button class="button button-sendmax" ng-click="vm.sendMax()">
|
<button class="button button-sendmax" ng-click="vm.sendMax()">
|
||||||
<span>
|
<span>
|
||||||
<span translate>Use All Available Funds</span> 
|
<span ng-if="vm.showSendMaxButton" translate>Use All Available Funds</span>
|
||||||
<span class="available-funds-amount">(<formatted-amount value="{{vm.availableFunds}}"></formatted-amount>)</span>
|
<span ng-if="vm.showSendLimitMaxButton" translate>Send Maximum Amount</span> 
|
||||||
|
<span class="available-funds-amount">(<formatted-amount value="{{vm.sendableFunds}}"></formatted-amount>)</span>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
<i class="icon big-icon-svg theme-circle theme-circle-community">
|
<i class="icon big-icon-svg theme-circle theme-circle-community">
|
||||||
<div class="bg icon-share"></div>
|
<div class="bg icon-share"></div>
|
||||||
</i>
|
</i>
|
||||||
<span>Share the Wallet App</span>
|
<span translate>Share the Wallet App</span>
|
||||||
<i class="icon bp-arrow-right"></i>
|
<i class="icon bp-arrow-right"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,14 @@
|
||||||
</div>
|
</div>
|
||||||
<div ng-show="!hide">
|
<div ng-show="!hide">
|
||||||
<div ng-repeat="service in services track by $index">
|
<div ng-repeat="service in services track by $index">
|
||||||
<a ui-sref="{{service.sref}}" id="home_{{service.name}}" title="{{service.title || service.name}}" class="track_link_click_out item item-sub item-icon-left item-big-icon-left item-icon-right next-step">
|
<a ng-if="service.sref" ui-sref="{{service.sref}}" id="home_{{service.name}}" title="{{service.title || service.name}}" class="track_link_click_out item item-sub item-icon-left item-big-icon-left item-icon-right next-step">
|
||||||
|
<i class="icon big-icon-svg theme-circle theme-circle-services">
|
||||||
|
<div class="bg {{service.icon}}"></div>
|
||||||
|
</i>
|
||||||
|
<span>{{service.title || service.name}}</span>
|
||||||
|
<i class="icon bp-arrow-right"></i>
|
||||||
|
</a>
|
||||||
|
<a ng-if="!service.sref" ng-click="open('{{service.href}}')" id="home_{{service.name}}" title="{{service.title || service.name}}" class="track_link_click_out item item-sub item-icon-left item-big-icon-left item-icon-right next-step">
|
||||||
<i class="icon big-icon-svg theme-circle theme-circle-services">
|
<i class="icon big-icon-svg theme-circle theme-circle-services">
|
||||||
<div class="bg {{service.icon}}"></div>
|
<div class="bg {{service.icon}}"></div>
|
||||||
</i>
|
</i>
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@
|
||||||
<a ng-show="walletNotRegistered" ng-click="recreate()" translate>Tap to recreate</a>
|
<a ng-show="walletNotRegistered" ng-click="recreate()" translate>Tap to recreate</a>
|
||||||
<a ng-show="updateStatusError" ng-click="updateAll(true)" translate>Tap to retry</a>
|
<a ng-show="updateStatusError" ng-click="updateAll(true)" translate>Tap to retry</a>
|
||||||
</div>
|
</div>
|
||||||
<span ng-click="onRefresh()" class="right" ng-show="(!updatingStatus && !updatingTxHistory)">↻</span>
|
<span ng-click="onRefresh()" class="right" ng-show="(!updatingStatus && !vm.updatingTxHistory && !vm.gettingInitialHistory)">↻</span>
|
||||||
<ion-spinner class="spinner-dark recent right loading-wallet" icon="crescent" ng-show="(updatingStatus || updatingTxHistory) &&
|
<ion-spinner class="spinner-dark recent right loading-wallet" icon="crescent" ng-show="(updatingStatus || vm.updatingTxHistory || vm.gettingInitialHistory) &&
|
||||||
!walletNotRegistered && !updateStatusError && !updateTxHistoryError"></ion-spinner>
|
!walletNotRegistered && !updateStatusError && !vm.updateTxHistoryFailed"></ion-spinner>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span ng-show="wallet.status.wallet.singleAddress" class="size-12"><span translate>Auditable</span></span>
|
<span ng-show="wallet.status.wallet.singleAddress" class="size-12"><span translate>Auditable</span></span>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<ion-view hide-tabs>
|
<ion-view hide-tabs>
|
||||||
<ion-nav-bar class="bar-royal">
|
<ion-nav-bar class="bar-royal">
|
||||||
<ion-nav-title>{{'Sweep paper wallet' | translate}}</ion-nav-title>
|
<ion-nav-title>{{'Sweep Paper Wallet' | translate}}</ion-nav-title>
|
||||||
<ion-nav-back-button>
|
<ion-nav-back-button>
|
||||||
</ion-nav-back-button>
|
</ion-nav-back-button>
|
||||||
</ion-nav-bar>
|
</ion-nav-bar>
|
||||||
|
|
@ -45,19 +45,19 @@
|
||||||
</div>
|
</div>
|
||||||
<div ng-class="ng-hide" ng-show="noMatchingBchWallet">
|
<div ng-class="ng-hide" ng-show="noMatchingBchWallet">
|
||||||
<div class="text-center size-12 text-gray">
|
<div class="text-center size-12 text-gray">
|
||||||
<span>No Bitcoin Cash wallet to transfer funds to found.</span>
|
<span translate>No Bitcoin Cash wallet to transfer funds to found.</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div ng-class="ng-hide" ng-show="!bchBalance && readyToShow">
|
<div ng-class="ng-hide" ng-show="!bchBalance && readyToShow">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h4 class="text-bold" translate>No Bitcoin Cash found</h4>
|
<h4 class="text-bold" translate>No Bitcoin Cash found.</h4>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div ng-class="ng-hide" ng-show="btcBalance">
|
<div ng-class="ng-hide" ng-show="btcBalance">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col text-center">
|
<div class="col text-center">
|
||||||
<h4 class="text-bold" translate>Bitcoin found:</h4>
|
<h4 class="text-bold" translate>Bitcoin Core found:</h4>
|
||||||
<div class="size-24">
|
<div class="size-24">
|
||||||
<span>{{btcBalanceText}}</span>
|
<span>{{btcBalanceText}}</span>
|
||||||
<div class="size-14 amount-alternative">
|
<div class="size-14 amount-alternative">
|
||||||
|
|
@ -95,13 +95,13 @@
|
||||||
</div>
|
</div>
|
||||||
<div ng-class="ng-hide" ng-show="noMatchingBtcWallet">
|
<div ng-class="ng-hide" ng-show="noMatchingBtcWallet">
|
||||||
<div class="text-center size-12 text-gray">
|
<div class="text-center size-12 text-gray">
|
||||||
<span>No Bitcoin wallet to transfer funds to found.</span>
|
<span translate>No Bitcoin Core wallet to transfer funds to found.</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div ng-class="ng-hide" ng-show="!btcBalance && readyToShow">
|
<div ng-class="ng-hide" ng-show="!btcBalance && readyToShow">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h4 class="text-bold" translate>No Bitcoin found</h4>
|
<h4 class="text-bold" translate>No Bitcoin Core found.</h4>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<slide-to-accept-success
|
<slide-to-accept-success
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,11 @@
|
||||||
<img src="img/icon-update.svg" class="bg"/>
|
<img src="img/icon-update.svg" class="bg"/>
|
||||||
</i>
|
</i>
|
||||||
|
|
||||||
<div class="item title">{{updateText}}</div>
|
<div class="item title">{{newReleaseText}}</div>
|
||||||
|
<div class="item release-notes" ng-if="newReleaseNotes"><span ng-bind-html="newReleaseNotes"></span></div>
|
||||||
|
|
||||||
<div class="button" ng-click="openExternalLink()">
|
|
||||||
|
<div class="button" ng-click="showUpdatePopup()">
|
||||||
<span translate>Download</span>
|
<span translate>Download</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,13 @@
|
||||||
</i>
|
</i>
|
||||||
<h2>{{fromWallet.name}}</h2>
|
<h2>{{fromWallet.name}}</h2>
|
||||||
<wallet-balance
|
<wallet-balance
|
||||||
display-as-fiat="{{displayBalanceAsFiat}}"
|
display-as-fiat="{{displayBalanceAsFiat}}"
|
||||||
|
wallet-coin="{{fromWallet.coin}}"
|
||||||
wallet-status="{{fromWallet.status}}"
|
wallet-status="{{fromWallet.status}}"
|
||||||
wallet-cached-balance="{{fromWallet.cachedBalance}}"
|
wallet-cached-balance="{{fromWallet.cachedBalance}}"
|
||||||
wallet-cached-balance-updated-on="{{fromWallet.cachedBalanceUpdatedOn}}"
|
wallet-cached-balance-updated-on="{{fromWallet.cachedBalanceUpdatedOn}}"
|
||||||
wallet-cached-status="{{fromWallet.cachedStatus}}"
|
wallet-cached-status="{{fromWallet.cachedStatus}}"
|
||||||
total-balance-sat="{{fromWallet.status.totalBalanceSat}}"></wallet-balance>
|
total-balance-sat="{{fromWallet.status.totalBalanceSat}}"></wallet-balance>
|
||||||
<!--<p ng-show="vm.origin.balanceAmount">{{vm.origin.balanceAmount}} {{vm.origin.balanceCurrency}}</p>-->
|
|
||||||
<!--<formatted-amount value="{{fromWallet.status.totalBalanceStr ? fromWallet.status.totalBalanceStr : ( fromWallet.cachedBalance ? fromWallet.cachedBalance + (fromWallet.cachedBalanceUpdatedOn ? ' · ' + ( fromWallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }}"></formatted-amount>-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -16,79 +16,74 @@
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="bp-content" ng-class="{'status-bar': isCordova}">
|
<div class="bp-content" ng-class="{'status-bar': isCordova, 'collapse': scrollPosition > 50}">
|
||||||
|
|
||||||
<div class="amount-wrapper" ng-show="wallet && wallet.isComplete() && amountIsCollapsible" ng-class="{'wallet-background-color-default': !wallet.color}" ng-style="{'background-color':wallet.color}">
|
<div class="amount-wrapper" ng-show="wallet && wallet.isComplete()" ng-class="{'wallet-background-color-default': !wallet.color}" ng-style="{'background-color':wallet.color}">
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ng-style="{'background-color':wallet.color, 'height': amountHeight}"
|
ng-style="{'background-color':wallet.color}"
|
||||||
class="amount"
|
class="amount collapsible"
|
||||||
ng-class="{collapsible: amountIsCollapsible, 'wallet-background-color-default': !wallet.color, 'no-alternative': wallet.network != 'livenet'}"
|
ng-class="{'wallet-background-color-default': !wallet.color, 'no-alternative': wallet.network != 'livenet'}"
|
||||||
>
|
>
|
||||||
|
|
||||||
<div class="amount__error" ng-style="{opacity: altAmountOpacity}" ng-show="updateStatusError">
|
<div class="amount__error" ng-show="updateStatusError">
|
||||||
<span>{{updateStatusError}}</span>
|
<span>{{updateStatusError}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="amount__error" ng-style="{opacity: altAmountOpacity}" ng-show="walletNotRegistered">
|
<div class="amount__error" ng-show="walletNotRegistered">
|
||||||
<span translate>This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.</span>
|
<span translate>This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ng-show="selectedPriceDisplay=='fiat' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
ng-if="selectedPriceDisplay=='fiat' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
class="amount__balance amount__scale">
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
|
||||||
<strong class="size-36" ng-show="status.totalBalanceAlternative">
|
<strong class="size-36" ng-show="status.totalBalanceAlternative">
|
||||||
<formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
<formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
||||||
</strong>
|
</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-14 amount-alternative"
|
||||||
ng-if="status.totalBalanceStr && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceStr && wallet.network == 'livenet'">
|
||||||
ng-style="{opacity: altAmountOpacity}">
|
|
||||||
<formatted-amount value="{{status.totalBalanceStr}}" size-equal="true"></formatted-amount>
|
<formatted-amount value="{{status.totalBalanceStr}}" size-equal="true"></formatted-amount>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ng-show="selectedPriceDisplay=='crypto' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
|
||||||
on-hold="hideToggle()"
|
on-hold="hideToggle()"
|
||||||
ng-style="{'transform': amountScale}"
|
ng-if="status.totalBalanceStr && selectedPriceDisplay=='crypto' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
||||||
ng-if="status.totalBalanceStr"
|
class="amount__balance amount__scale">
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
|
||||||
<strong class="size-36">
|
<strong class="size-36">
|
||||||
<formatted-amount value="{{status.totalBalanceStr}}"></formatted-amount>
|
<formatted-amount value="{{status.totalBalanceStr}}"></formatted-amount>
|
||||||
</strong>
|
</strong>
|
||||||
<div
|
<div
|
||||||
class="size-14 amount-alternative"
|
class="size-14 amount-alternative"
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'">
|
||||||
ng-style="{opacity: altAmountOpacity}">
|
|
||||||
<formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
<formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-style="{'transform': amountScale}"
|
<div
|
||||||
class="amount__balance"
|
class="amount__balance amount__scale"
|
||||||
ng-show="!updateStatusError && wallet.balanceHidden && !wallet.scanning"
|
ng-if="!updateStatusError && wallet.balanceHidden && !wallet.scanning"
|
||||||
on-hold="hideToggle()">
|
on-hold="hideToggle()">
|
||||||
<strong class="size-24" translate>[Balance Hidden]</strong>
|
<strong class="size-24" translate>[Balance Hidden]</strong>
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-14 amount-alternative" translate>
|
<div class="size-14 amount-alternative" translate>
|
||||||
Tap and hold to show
|
Tap and hold to show
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div ng-style="{'transform': amountScale}"
|
<div
|
||||||
class="amount__balance"
|
class="amount__balance amount__scale"
|
||||||
ng-show="!updateStatusError && wallet.scanning">
|
ng-if="!updateStatusError && wallet.scanning">
|
||||||
<strong class="size-24" translate>[Scanning Funds]</strong>
|
<strong class="size-24" translate>[Scanning Funds]</strong>
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-14 amount-alternative" translate>
|
<div class="size-14 amount-alternative" translate>
|
||||||
Please wait
|
Please wait
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div ng-if="!wallet.balanceHidden && !wallet.scanning && showBalanceButton" ng-style="{'opacity': altAmountOpacity, 'transform': amountScale}">
|
<div ng-if="!wallet.balanceHidden && !wallet.scanning && showBalanceButton" class="amount__scale">
|
||||||
<button class="button button-standard button-primary amount__button-balance size-14" ng-click="openBalanceModal()">
|
<button class="button button-standard button-primary amount__button-balance size-14" ng-click="openBalanceModal()">
|
||||||
<i class="icon ion-ios-checkmark-outline"></i>
|
<i class="icon ion-ios-checkmark-outline"></i>
|
||||||
<strong>
|
<strong>
|
||||||
|
|
@ -101,7 +96,7 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="send-receive-buttons row" ng-if="(status.availableBalanceSat || status.availableBalanceSat === 0) && (buttonsOpacity > 0 || isAndroid)" ng-style="{opacity: buttonsOpacity}">
|
<div class="send-receive-buttons row" ng-if="(status.availableBalanceSat || status.availableBalanceSat === 0)">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="button button-outline button-white-outline" ng-click="goToReceive()">
|
<div class="button button-outline button-white-outline" ng-click="goToReceive()">
|
||||||
<span translate>Receive</span>
|
<span translate>Receive</span>
|
||||||
|
|
@ -118,136 +113,18 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
<div class="wallet-details-wallet-info">
|
||||||
<span ng-include="'views/includes/walletInfo.html'"></span>
|
<span ng-include="'views/includes/walletInfo.html'"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ion-content ng-style="{'margin-top': contentMargin}" ng-class="{collapsible: amountIsCollapsible}">
|
<ion-content class="amount__balance">
|
||||||
<ion-refresher
|
<ion-refresher
|
||||||
pulling-icon="ion-ios-refresh"
|
pulling-icon="ion-ios-refresh"
|
||||||
spinner="ios-small"
|
spinner="ios-small"
|
||||||
on-refresh="onRefresh()">
|
on-refresh="onRefresh()">
|
||||||
</ion-refresher>
|
</ion-refresher>
|
||||||
|
|
||||||
<!-- Start Balance view duplicate (for Android compatibility) -->
|
|
||||||
<div class="amount-wrapper" ng-show="wallet && wallet.isComplete() && !amountIsCollapsible" ng-class="{'wallet-background-color-default': !wallet.color}" ng-style="{'background-color':wallet.color}">
|
|
||||||
|
|
||||||
<div
|
|
||||||
ng-style="{'background-color':wallet.color, 'height': amountHeight}"
|
|
||||||
class="amount"
|
|
||||||
ng-class="{collapsible: amountIsCollapsible, 'wallet-background-color-default': !wallet.color, 'no-alternative': wallet.network != 'livenet'}"
|
|
||||||
>
|
|
||||||
|
|
||||||
<div class="amount__error" ng-style="{opacity: altAmountOpacity}" ng-show="updateStatusError">
|
|
||||||
<span>{{updateStatusError}}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="amount__error" ng-style="{opacity: altAmountOpacity}" ng-show="walletNotRegistered">
|
|
||||||
<span translate>This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
ng-click='updateAll(true)'
|
|
||||||
ng-show="selectedPriceDisplay=='crypto' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
|
||||||
on-hold="hideToggle()"
|
|
||||||
ng-style="{'transform': amountScale}"
|
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
|
||||||
<strong ng-if="status.totalBalanceStr" class="size-36"><formatted-amount value="{{status.totalBalanceStr}}"></formatted-amount></strong>
|
|
||||||
<div
|
|
||||||
class="size-14 amount-alternative"
|
|
||||||
ng-if="status.totalBalanceAlternative && wallet.network == 'livenet'"
|
|
||||||
ng-style="{opacity: altAmountOpacity}">
|
|
||||||
<formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
ng-click='updateAll(true)'
|
|
||||||
ng-show="selectedPriceDisplay=='fiat' && !updateStatusError && !wallet.balanceHidden && !wallet.scanning"
|
|
||||||
on-hold="hideToggle()"
|
|
||||||
ng-style="{'transform': amountScale}"
|
|
||||||
ng-class="{amount__balance: amountIsCollapsible}">
|
|
||||||
<strong class="size-36"><formatted-amount value="{{status.totalBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount></strong>
|
|
||||||
<div
|
|
||||||
class="size-14 amount-alternative"
|
|
||||||
ng-if="status.totalBalanceStr && wallet.network == 'livenet'"
|
|
||||||
ng-style="{opacity: altAmountOpacity}">
|
|
||||||
<formatted-amount value="{{status.totalBalanceStr}}"></formatted-amount>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div ng-style="{'transform': amountScale}"
|
|
||||||
class="amount__balance"
|
|
||||||
ng-show="!updateStatusError && wallet.balanceHidden && !wallet.scanning"
|
|
||||||
on-hold="hideToggle()">
|
|
||||||
<strong class="size-24" translate>[Balance Hidden]</strong>
|
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-16 amount-alternative" translate>
|
|
||||||
Tap and hold to show
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div ng-style="{'transform': amountScale}"
|
|
||||||
class="amount__balance"
|
|
||||||
ng-show="!updateStatusError && wallet.scanning">
|
|
||||||
<strong class="size-24" translate>[Scanning Funds]</strong>
|
|
||||||
<div ng-style="{opacity: altAmountOpacity}" class="size-16 amount-alternative" translate>
|
|
||||||
Please wait
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div ng-if="selectedPriceDisplay=='crypto' && !wallet.balanceHidden && !wallet.scanning && showBalanceButton" ng-style="{'opacity': altAmountOpacity, 'transform': amountScale}">
|
|
||||||
<button class="button button-standard button-primary amount__button-balance size-14" ng-click="openBalanceModal()">
|
|
||||||
<i class="icon ion-ios-checkmark-outline"></i>
|
|
||||||
<strong>
|
|
||||||
{{status.spendableBalanceStr}}
|
|
||||||
</strong>
|
|
||||||
|
|
||||||
<span>
|
|
||||||
<formatted-amount value="{{status.spendableBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div ng-if="selectedPriceDisplay=='fiat' && !wallet.balanceHidden && !wallet.scanning && showBalanceButton" ng-style="{'opacity': altAmountOpacity, 'transform': amountScale}">
|
|
||||||
<button class="button button-standard button-primary amount__button-balance size-14" ng-click="openBalanceModal()">
|
|
||||||
<i class="icon ion-ios-checkmark-outline"></i>
|
|
||||||
<strong>
|
|
||||||
<formatted-amount value="{{status.spendableBalanceAlternative}}" currency="{{status.alternativeIsoCode}}"></formatted-amount>
|
|
||||||
</strong>
|
|
||||||
|
|
||||||
<span>
|
|
||||||
{{status.spendableBalanceStr}}
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="send-receive-buttons row" ng-if="(status.availableBalanceSat || status.availableBalanceSat === 0) && (buttonsOpacity > 0 || isAndroid)" ng-style="{opacity: buttonsOpacity}">
|
|
||||||
<div class="col">
|
|
||||||
<div class="button button-outline button-white-outline" ng-click="goToReceive()">
|
|
||||||
<span translate>Receive</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<div class="button button-outline button-white-outline" ng-if="!status.availableBalanceSat" ng-click="goToBuy()">
|
|
||||||
<span translate>Buy Bitcoin</span>
|
|
||||||
</div>
|
|
||||||
<div class="button button-outline button-white-outline" ng-if="status.availableBalanceSat>0" ng-click="goToSend()">
|
|
||||||
<span translate>Send</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="wallet-details-wallet-info" ng-style="{opacity: altAmountOpacity}">
|
|
||||||
<span ng-include="'views/includes/walletInfo.html'"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- End Balance view duplicate (for Android compatibility) -->
|
|
||||||
|
|
||||||
|
|
||||||
<a class="wallet-not-backed-up-warning" ng-if="wallet.needsBackup" ui-sref="tabs.wallet.backupWarning({from: 'tabs.wallet'})" translate>
|
<a class="wallet-not-backed-up-warning" ng-if="wallet.needsBackup" ui-sref="tabs.wallet.backupWarning({from: 'tabs.wallet'})" translate>
|
||||||
Wallet not backed up
|
Wallet not backed up
|
||||||
</a>
|
</a>
|
||||||
|
|
@ -284,29 +161,29 @@
|
||||||
<!-- Transactions -->
|
<!-- Transactions -->
|
||||||
|
|
||||||
<div class="wallet-details__no-transaction"
|
<div class="wallet-details__no-transaction"
|
||||||
ng-show="!txHistory[0] && !updatingTxHistory && !updateTxHistoryError && !updateStatusError" translate>
|
ng-show="!txHistory[0] && !vm.gettingInitialHistory && !vm.updateTxHistoryFailed && !updateStatusError" translate>
|
||||||
No transactions yet
|
No transactions yet
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="wallet-details__no-update-history"
|
<div class="wallet-details__no-update-history"
|
||||||
ng-show="!txHistory[0] && !updatingTxHistory && updateTxHistoryError" translate>
|
ng-show="!txHistory[0] && !vm.gettingInitialHistory && vm.updateTxHistoryFailed" translate>
|
||||||
Could not update transaction history
|
Could not update transaction history
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div ng-show="updatingTxHistory && updatingTxHistoryProgress>5" class="wallet-details__updating-history">
|
<div ng-show="vm.gettingInitialHistory && updatingTxHistoryProgress>5" class="wallet-details__updating-history">
|
||||||
<span translate>Updating transaction history. Please stand by.</span><br>
|
<span translate>Updating transaction history. Please stand by.</span><br>
|
||||||
<span translate>{{updatingTxHistoryProgress}} transactions downloaded</span>
|
<span translate>{{updatingTxHistoryProgress}} transactions downloaded</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wallet-details__list" ng-show="txHistory[0] && !updatingTxHistory">
|
<div ng-style="{'padding-bottom': txHistoryPaddingBottom}" class="wallet-details__list" ng-show="txHistory[0] && !updatingTxHistory">
|
||||||
<div ng-repeat="btx in txHistory track by $index" ng-click="openTxModal(btx)">
|
<div ng-repeat="btx in txHistory track by $index" ng-click="openTxModal(btx)">
|
||||||
<span ng-include="'views/includes/walletHistory.html'"></span>
|
<span ng-include="'views/includes/walletHistory.html'"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ion-infinite-scroll
|
<ion-infinite-scroll
|
||||||
ng-if="txHistory[0] && !updatingTxHistory && txHistoryShowMore"
|
ng-if="txHistory[0] && vm.allowInfiniteScroll"
|
||||||
on-infinite="showMore()"
|
on-infinite="showMore()"
|
||||||
distance="1%">
|
distance="1%">
|
||||||
</ion-infinite-scroll>
|
</ion-infinite-scroll>
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
<div class="header--request__amount-alt" ng-show="requestAmountSecondary" translate>{{requestAmountSecondary}} {{requestCurrencySecondary}}</div>
|
<div class="header--request__amount-alt" ng-show="requestAmountSecondary" translate>{{requestAmountSecondary}} {{requestCurrencySecondary}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="wallets-header">
|
<div class="wallets-header">
|
||||||
<div class="title">
|
<div class="title" ng-if="walletsBch.length > 0 || walletsBtc.length > 0 || walletsInsufficientFunds.length > 0">
|
||||||
{{headerTitle}}
|
{{headerTitle}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||