Compare commits

...

997 commits

Author SHA1 Message Date
A R Hansen
8e73e4c16d Merge branch 'develop' 2018-10-12 12:50:54 +02:00
A R Hansen
06f1f4df91 - ll - 2018-10-12 12:48:15 +02:00
A R Hansen
70f520ea43 adding instructions 2018-10-12 12:46:09 +02:00
A R Hansen
f1d2b00b2b set up my own bitcore server and changed the url. for some reason Bitcoin.com's server won't accept 0 fee txs. 2018-10-12 11:53:16 +02:00
A R Hansen
4e524a7500 Not needed. 2018-10-08 02:16:43 +02:00
A R Hansen
c0a14fe11c Merge ZeroFeeTxs 2018-10-08 02:01:15 +02:00
A R Hansen
d47393f160 .. 2018-10-08 02:00:36 +02:00
A R Hansen
898b7d03fe 0 fee transaction feature added. 2018-10-08 01:55:55 +02:00
Jean-Baptiste Dominguez
49a6711970
Merge branch 'wallet/prod' into master 2018-09-22 10:59:24 +02:00
Brendon Duncan
d72a71d920 RC version. 2018-09-21 17:21:59 -07:00
Brendon Duncan
4d623d51d7 Merged sprint 21. 2018-09-21 17:16:18 -07:00
Brendon Duncan
ff40317d87 Merged fix for wallet transaction history. 2018-09-21 16:45:46 -07:00
Brendon Duncan
2e1cc9fa87 Showing cached history first when entering Wallet Details screen. 2018-09-21 16:43:27 -07:00
Brendon Duncan
cecad4a072 Merged 575. 2018-09-21 14:58:39 -07:00
Brendon Duncan
61c91d518a Merge branch 'wallet/sprint/21'. 2018-09-21 14:50:47 -07:00
Brendon Duncan
a17c3518c3 Manual merge from Sprint 22 for 575. 2018-09-21 14:38:28 -07:00
Brendon Duncan
6554b385cb
Merge pull request #345 from Bitcoin-com/wallet/task/591
591 - Wallet balance directive fails to get fiat balance sometimes
2018-09-21 12:53:46 -07:00
Brendon Duncan
c0912c5f17 IIFE for reviewController to make merging easier. 2018-09-21 12:31:55 -07:00
Brendon Duncan
e7eac1ee16
Merge pull request #335 from Bitcoin-com/wallet/task/586
Bug - 586 - Reconnect WebSocket when connection is failing or lost.
2018-09-21 11:35:27 -07:00
Brendon Duncan
46413fa6aa
Merge pull request #346 from Bitcoin-com/wallet/task/593
Bug - 593 - Update confirmations on cached transactions
2018-09-21 11:29:30 -07:00
Brendon Duncan
fb2802f392
Merge pull request #347 from Bitcoin-com/wallet/task/546
546 - Fix modal & shapeshift
2018-09-21 11:26:08 -07:00
Brendon Duncan
ea51e035ab Fixed updating of confirmations of cached transactions. Cache now properly cleared on first fetch from Wallet Details screen. 2018-09-21 03:56:51 -07:00
Brendon Duncan
0c8d145f73 Check validity of cachedStatus. 2018-09-21 02:54:06 -07:00
Jean-Baptiste Dominguez
977d03429d
Merge pull request #343 from Bitcoin-com/wallet/task/590
590 - The Personal Note field is not cleared between transactions.
2018-09-21 11:47:28 +02:00
Jean-Baptiste Dominguez
a8e5c212f0 Fix : Check if the status could be set before checking the balance. 2018-09-21 11:41:20 +02:00
Jean-Baptiste Dominguez
4250a98718 walletStatus worst case, IIFE for both controllers. 2018-09-21 11:31:27 +02:00
Brendon Duncan
a3614566e3 Reconnecting socket based on CloseEvent.code. 2018-09-21 02:27:34 -07:00
Jean-Baptiste Dominguez
5cb3d7521d Fix modal 2018-09-21 10:23:02 +02:00
Sebastiaan Pasma
3cad7d7ad8
Update confirmations on cached transactions 2018-09-20 15:58:42 +02:00
Brendon Duncan
4d6aeb4f91 Renamed directive and replaced old variable references with new ones. 2018-09-18 15:26:30 -07:00
Sebastiaan Pasma
78e4942fd6
Merge pull request #339 from Bitcoin-com/wallet/task/589
589 - Fix mobile build scripts
2018-09-18 13:51:54 +02:00
Brendon Duncan
7b6efaa1db Clear memo before entering Review screen. 2018-09-17 21:26:21 -07:00
Brendon Duncan
ebc32a2d85 Added 'default' to mobile debug build configs. 2018-09-16 21:04:41 -07:00
Brendon Duncan
e02368ea3c Incremented version for release candidate. 2018-09-15 18:05:39 +12:00
Brendon Duncan
92c1b4b346 Merged translations from sprint. 2018-09-15 18:02:00 +12:00
Brendon Duncan
8bf31f97d8 Updated translations from Crowdin. 2018-09-15 18:00:34 +12:00
Brendon Duncan
f3902ba3f0 Merged sprint to get fix for Wallet Details transaction list. 2018-09-15 17:32:55 +12:00
Brendon Duncan
6aa7ee2bbb
Merge pull request #338 from Bitcoin-com/wallet/task/588
588 - Transaction list in Wallet Details disappearing and reappearing
2018-09-15 17:29:56 +12:00
Brendon Duncan
ac82b51848 Takes into account size of current transaction list when determining if overlap in transactions is enough to assume all have been retrieved. 2018-09-15 14:45:39 +12:00
Sebastiaan Pasma
e6d8ddb360
update wallets in the promise callback 2018-09-13 09:54:53 +02:00
Sebastiaan Pasma
eb3067d369
Use cachedStatus when available and a fix for the review controller 2018-09-13 09:47:45 +02:00
Sebastiaan Pasma
908dcbf968
Add the received wallet status to the wallet API object 2018-09-12 16:50:26 +02:00
Sebastiaan Pasma
6692812d55
Websocket reconnect (and close old connection on leave) 2018-09-12 15:09:21 +02:00
Brendon Duncan
9438960e24 Hotfix version. 2018-09-12 18:39:56 +12:00
Brendon Duncan
d55fc70e7d Remove Games link. 2018-09-12 18:13:50 +12:00
Sebastiaan Pasma
ad4aa76902
Empty origin wallet screen bug 2018-09-11 14:55:22 +02:00
Brendon Duncan
c1f6e56b56 Increment version. 2018-09-11 15:37:47 +12:00
Brendon Duncan
7d29490b0f Merged sprint. 2018-09-11 15:33:26 +12:00
Sebastiaan Pasma
a54b30f6ae
Merge pull request #334 from Bitcoin-com/wallet/task/583
583 - Remove Games Link from Google Play app
2018-09-10 10:45:56 +02:00
Brendon Duncan
319a5c86ec Merge language fix. 2018-09-10 20:28:18 +12:00
Brendon Duncan
8bc73353d5 Run command for Android emulator. 2018-09-10 20:26:33 +12:00
Brendon Duncan
101e33ec36 Remove Games link on Android. 2018-09-10 20:26:13 +12:00
Jean-Baptiste Dominguez
51c35101a6 appConfig beta release 2018-09-07 17:08:39 +09:00
Jean-Baptiste Dominguez
3d3fdd7425 Fix languages 2018-09-07 15:31:54 +09:00
Jean-Baptiste Dominguez
d361956290
Merge pull request #331 from Bitcoin-com/wallet/sprint/21
Wallet/sprint/21
2018-09-07 01:43:15 +09:00
Jean-Baptiste Dominguez
46b5317f5e
Merge pull request #307 from Bitcoin-com/wallet/task/518
518 - Add true pagination to the Wallet Detail screens
2018-09-07 01:41:39 +09:00
Jean-Baptiste Dominguez
230b6e2228 Merge 2018-09-07 01:41:13 +09:00
Jean-Baptiste Dominguez
81852836dd Fix : callback the newHistory 2018-09-07 01:18:54 +09:00
Jean-Baptiste Dominguez
9c0b54a7ce
Merge pull request #326 from Bitcoin-com/wallet/task/562
Bug - 562 - No notification when a new release version is available (Mac OSX github)
2018-09-06 22:12:45 +09:00
Jean-Baptiste Dominguez
47e1d0bdc7
Merge pull request #325 from Bitcoin-com/wallet/task/576
Bug - 576 - Android KitKat (4.4) interface fixes
2018-09-06 21:34:36 +09:00
Jean-Baptiste Dominguez
5386c5f7a6
Merge pull request #328 from Bitcoin-com/wallet/task/572
572 - Adhere to Shapeshift max amounts.
2018-09-06 20:30:43 +09:00
Jean-Baptiste Dominguez
6a8f8ca33b Fix to send the amount if shapeshift case 2018-09-06 20:29:50 +09:00
Sebastiaan Pasma
828cb927dc
refactor latestReleaseService to new format 2018-09-06 13:16:32 +02:00
Jean-Baptiste Dominguez
176f0c3141 Fix to provide an amount (canSendMax was never set to false when shapeshift) 2018-09-06 20:16:25 +09:00
Sebastiaan Pasma
c14820ea34
Shim for Array.includes (fixing receive notifications) + Android KitKat fixes (effect on slide + received payment notification) 2018-09-06 13:04:19 +02:00
Jean-Baptiste Dominguez
57ce93ccb8 fix parenthesis 2018-09-06 18:28:27 +09:00
Jean-Baptiste Dominguez
b6f63706f3 Resolution conflicts 2018-09-06 18:21:04 +09:00
Brendon Duncan
b0fba31040 Fix fee display on Android 4.4 KitKat. 2018-09-06 20:18:31 +12:00
Jean-Baptiste Dominguez
b0178c0673
Merge pull request #327 from Bitcoin-com/wallet/task/567
Improvement - 567 - Stuttering animation when scrolling transaction history.
2018-09-06 17:16:53 +09:00
Jean-Baptiste Dominguez
b2e22647e2
Merge pull request #293 from Bitcoin-com/wallet/task/555
555 - Include version number in Android apk filename.
2018-09-06 17:16:27 +09:00
Jean-Baptiste Dominguez
688f2b97bc
Merge pull request #324 from Bitcoin-com/wallet/task/546
546 - revamp shapeshift service
2018-09-06 17:13:05 +09:00
Brendon Duncan
c79ca6d1af More specific Shapeshift error handling. 2018-09-06 18:34:59 +12:00
Jean-Baptiste Dominguez
71e530f535 Unify the translation service 2018-09-06 15:31:22 +09:00
Jean-Baptiste Dominguez
a397e83cf0 error case without .message 2018-09-06 15:24:16 +09:00
Jean-Baptiste Dominguez
1905be6f14
Merge branch 'wallet/sprint/21' into wallet/task/555 2018-09-06 15:19:34 +09:00
Jean-Baptiste Dominguez
98e6e8ac75 Recommendation #brendon :) 2018-09-06 15:17:37 +09:00
Brendon Duncan
0d8812509d Updated readme. 2018-09-06 15:45:20 +12:00
Brendon Duncan
3de34dbf15 Renaming to follow new convention. 2018-09-06 11:34:00 +12:00
Brendon Duncan
394317bc46 Better default error message for Shapeshift error. 2018-09-06 11:27:48 +12:00
Sebastiaan Pasma
f52b2e7f09
Better fix for KitKat 4.4 2018-09-05 16:44:33 +02:00
Sebastiaan Pasma
525afac92e
scss var name change 2018-09-05 16:36:53 +02:00
Sebastiaan Pasma
22e1c397d0
Removed duplicate android header + refactored animation to use CSS animations instead of javascript calculated animations 2018-09-05 16:19:31 +02:00
Sebastiaan Pasma
74a9fe9691
Merge branch 'wallet/sprint/21' into wallet/task/567 2018-09-05 14:11:51 +02:00
Sebastiaan Pasma
70663492eb
Merge branch 'wallet/sprint/21' into wallet/task/562
# Conflicts:
#	src/js/controllers/tab-home.controller.js
2018-09-05 14:07:23 +02:00
Sebastiaan Pasma
477a9b6995
Android KitKat (4.4) fixes 2018-09-05 14:03:01 +02:00
Jean-Baptiste Dominguez
2d6a1528c1 handle errors properly 2018-09-05 17:23:09 +09:00
Jean-Baptiste Dominguez
3b6bb1fcdd ionicModal using for all devices 2018-09-05 16:10:21 +09:00
Jean-Baptiste Dominguez
2a607d245d using ionicModal for all devices 2018-09-05 16:10:05 +09:00
Jean-Baptiste Dominguez
fa8ce4779f async series with shapeshift & fee calculation 2018-09-05 15:32:47 +09:00
Brendon Duncan
d01baa6060 Better handling of Shapeshift error. 2018-09-05 18:16:01 +12:00
Brendon Duncan
ce02025991 Merge for building pkg. 2018-09-05 18:03:49 +12:00
Brendon Duncan
d2715016b5 Merge for building pkg. 2018-09-05 18:00:45 +12:00
Jean-Baptiste Dominguez
2c398bbe03 Fix amount check 2018-09-05 14:51:06 +09:00
Jean-Baptiste Dominguez
9128d3ebe2 Migrate to our new standard for services 2018-09-05 14:43:16 +09:00
Jean-Baptiste Dominguez
887270bfa9 clean ";" 2018-09-05 14:42:27 +09:00
Jean-Baptiste Dominguez
f7cde7a071 clean up, migrate to no-fix amount 2018-09-05 12:45:20 +09:00
Brendon Duncan
3afbdf73d3
Merge pull request #323 from Bitcoin-com/wallet/hotfix/578
578 - Shapeshift item on home tab now links to the Shapeshift website.
2018-09-05 15:30:09 +12:00
Brendon Duncan
00e4f8ac39 Hotfix version. 2018-09-05 15:28:10 +12:00
Jean-Baptiste Dominguez
5e034e7b8b clean up 2018-09-05 11:37:29 +09:00
Jean-Baptiste Dominguez
c553b51817 clean up 2018-09-05 11:02:10 +09:00
Jean-Baptiste Dominguez
c40eabf807 Clean shapeshift service and add the correct callback 2018-09-05 10:59:09 +09:00
Jean-Baptiste Dominguez
9ff9e2ea91 tab missing 2018-09-05 10:30:06 +09:00
Jean-Baptiste Dominguez
5c5558fbd4 remove final 2018-09-05 10:28:01 +09:00
Brendon Duncan
8c62bc445a Shapeshift item on home tab now goes to the Shapeshift website. 2018-09-05 12:37:39 +12:00
Brendon Duncan
ba2fa1f26e Fixed start:ios and put Grunt tasks in alphabetical order to make it easier to find definitions. 2018-09-05 10:33:47 +12:00
Brendon Duncan
8dedc04fe8 Edited obsolete comment. 2018-09-05 10:03:00 +12:00
Brendon Duncan
ea23b26795 Removed duplicate logging for Android, and created start:android-log. 2018-09-05 09:56:19 +12:00
Brendon Duncan
2121655249 Grouping scripts in alphabetical order so it is easier to find things, and know what is there. 2018-09-05 09:48:42 +12:00
Sebastiaan Pasma
001cd82afb
getMarketData can return an error 2018-09-04 17:52:53 +02:00
Sebastiaan Pasma
793bfee6a2
Changed wallet details transition behaviour 2018-09-04 16:36:05 +02:00
Brendon Duncan
6c8a1cfd5a Bugfix for using cached status in Enter Amount screen. 2018-09-04 20:48:16 +12:00
Brendon Duncan
3ab535a36b Improved handling of available funds below min amount. 2018-09-04 19:47:50 +12:00
Jean-Baptiste Dominguez
8b505141d7 renaming, clean up 2018-09-04 16:45:52 +09:00
Jean-Baptiste Dominguez
d934a9241a Organize the package.json and grunt file. Some optimizations and renaming. 2018-09-04 15:54:24 +09:00
Jean-Baptiste Dominguez
ce3fcacac3
Merge pull request #308 from Bitcoin-com/wallet/task/490
Bug - 490 - Korean Won isn't automatically selected when phone is in Korean (fiat currency)
2018-09-04 15:27:32 +09:00
Jean-Baptiste Dominguez
4c14bdcce0
Merge pull request #315 from Bitcoin-com/wallet/task/500
500 - detect addresses such as "bitcoin-cash:" and "bitcoincash://"
2018-09-04 14:39:12 +09:00
Jean-Baptiste Dominguez
e06613eaee
Merge pull request #322 from Bitcoin-com/wallet/task/546
Wallet/task/546
2018-09-04 14:37:51 +09:00
Jean-Baptiste Dominguez
2cec6a476b
Merge pull request #294 from Bitcoin-com/wallet/task/556
Improvement - 556 - Make "Share the Wallet App" translatable
2018-09-04 14:33:15 +09:00
Jean-Baptiste Dominguez
b766f2723c
Merge pull request #290 from Bitcoin-com/wallet/task/501
501 - Fix text when sweeping paper wallet
2018-09-04 14:31:40 +09:00
Jean-Baptiste Dominguez
911247e463
Merge branch 'wallet/sprint/21' into wallet/task/501 2018-09-04 14:31:22 +09:00
Jean-Baptiste Dominguez
8b38cb2d21
Merge pull request #305 from Bitcoin-com/wallet/task/335
Wallet/task/335
2018-09-04 14:17:50 +09:00
Jean-Baptiste Dominguez
57efbc3c63
Merge pull request #319 from Bitcoin-com/wallet/task/566
Bug - 566 - Fees hidden on iPhone X
2018-09-04 14:14:41 +09:00
Jean-Baptiste Dominguez
7353e0ff06
Merge pull request #320 from Bitcoin-com/wallet/task/492
492 - Fix typo in English original source
2018-09-04 14:08:42 +09:00
Jean-Baptiste Dominguez
7b1597e229
Merge pull request #321 from Bitcoin-com/wallet/task/568
Bug - 568 - Wrong display of multi-line texts in buttons
2018-09-04 14:08:24 +09:00
Jean-Baptiste Dominguez
38037f34fe
Merge pull request #292 from Bitcoin-com/wallet/task/554
554 - All Images for iOS App Icon
2018-09-04 14:03:19 +09:00
Jean-Baptiste Dominguez
1453a74302
Merge pull request #313 from Bitcoin-com/wallet/task/546
546 Enhancement "send flow" architecture
2018-09-04 13:55:41 +09:00
Jean-Baptiste Dominguez
2a017bc999 Remove duplicate data. 2018-09-04 13:37:31 +09:00
Jean-Baptiste Dominguez
05d73e3e14 init missing variables 2018-09-04 13:34:08 +09:00
Jean-Baptiste Dominguez
547b216edd migrate copayApp to bitcoincom. Clean up 2018-09-04 13:32:36 +09:00
Jean-Baptiste Dominguez
cf1dc66b59 renaming files 2018-09-04 11:56:13 +09:00
Jean-Baptiste Dominguez
23659b0cd4 Rename files reviewed 2018-09-04 11:35:01 +09:00
Jean-Baptiste Dominguez
8322453edf clean send flow state when transaction sent 2018-09-04 11:24:25 +09:00
Jean-Baptiste Dominguez
c715fdcb41 Rename incomingData to incomingDataService 2018-09-04 11:24:07 +09:00
Brendon Duncan
4315d16f73 The Enter Amount screen now correctly sets the amount when sendMax() is called when available funds exceed the max limit. 2018-09-04 12:52:54 +12:00
Brendon Duncan
4dc3e7c2e8 Enter Amount displaying ongoing progress indicator when contacting Shapeshift. Send max button now displays max limit amount when available funds are above the Shapeshift limit. 2018-09-04 12:21:57 +12:00
Brendon Duncan
b2178c84e3 When available funds are higher than Shapeshift max limit, the send max button changes to send max limit. 2018-09-04 11:02:52 +12:00
Brendon Duncan
52f18c3c9b Got the Enter Amount screen unit tests running. 2018-09-04 09:13:09 +12:00
Sebastiaan Pasma
383d811067
Multi-line buttons fix 2018-09-03 14:44:09 +02:00
Sebastiaan Pasma
274d221af0
Links changed, app store added and some logic added 2018-09-03 13:45:40 +02:00
Sebastiaan Pasma
b1bf269ca2
Review transaction screen: iPhone X fee summary display fix 2018-09-03 11:54:15 +02:00
Brendon Duncan
b7dda8b6ca Currency in send max button now updates with currency change. 2018-09-03 20:17:46 +12:00
Brendon Duncan
8908b5ef80 Send max button behaviour is now conditional based on min and max limits. 2018-09-03 20:12:20 +12:00
Brendon Duncan
1c2c381317 Can now scan good data after scanning bad data. 2018-09-03 16:56:30 +12:00
Jean-Baptiste Dominguez
6f28f6ba2b redir cb 2018-09-03 13:31:58 +09:00
Brendon Duncan
afa9fad9d2 Now parses wallet import data. 2018-09-03 14:12:12 +12:00
Jean-Baptiste Dominguez
e8b3476ea1
Merge pull request #318 from Bitcoin-com/wallet/task/500
Update bitcoin-uri-service.js
2018-09-03 10:37:25 +09:00
Brendon Duncan
f84b1e4f35 Changed name to amountInSatoshis. 2018-09-03 13:02:28 +12:00
Brendon Duncan
48b8bbf90a Added amountSatoshis. 2018-09-03 12:53:12 +12:00
Jean-Baptiste Dominguez
b4d42215d3 add copay invitation in incomingData 2018-09-03 09:08:12 +09:00
Jean-Baptiste Dominguez
6e52aaca2d 1st cleaning for incomingData 2018-09-03 08:28:22 +09:00
Jean-Baptiste Dominguez
1708eeef82 Fix address format 2018-08-31 18:48:16 +09:00
Jean-Baptiste Dominguez
ddd867092c Refactor incomingData 2018-08-31 18:37:04 +09:00
Jean-Baptiste Dominguez
fa15b26792
Update bitcoin-uri.service.js
Add the conversion to satoshi however a currency can be precised, in that case, the satoshi conversion should be not operated.
2018-08-31 18:36:40 +09:00
Jean-Baptiste Dominguez
2b8c2d1c61
Merge pull request #316 from Bitcoin-com/wallet/task/500
Changed testnet to isTestnet.
2018-08-31 16:45:40 +09:00
Jean-Baptiste Dominguez
7fa2ab7ff4 Merge 2018-08-31 16:11:58 +09:00
Jean-Baptiste Dominguez
dd59169d5f adapt for the request specific amount. Clean comments and code, and more. 2018-08-31 16:09:31 +09:00
Brendon Duncan
ef23746de6 Changed testnet to isTestnet. 2018-08-31 17:14:58 +12:00
Sebastiaan Pasma
d65e4401dd
Update popup 2018-08-30 14:10:46 +02:00
Brendon Duncan
c4d9b94a86 Merged latest changes for detecting addresses. 2018-08-30 20:49:03 +12:00
Brendon Duncan
421c4ca26a Bugfix for displaying error message. 2018-08-30 20:46:58 +12:00
Brendon Duncan
6a68d73e3a Now handles spaces after address prefix. 2018-08-30 20:20:51 +12:00
Brendon Duncan
918451f3da Scanning or pasting ordinary URL gives the option to open it in a browser. 2018-08-30 19:56:18 +12:00
Jean-Baptiste Dominguez
2c0432e292 3rd step enhancement send flow 2018-08-30 16:03:51 +09:00
Brendon Duncan
98f317dea7 Merged more permissive Bitcoin Cash URIs. 2018-08-30 18:16:26 +12:00
Jean-Baptiste Dominguez
480cfe43ca
Merge pull request #312 from Bitcoin-com/wallet/task/500
Upgrade the bitcoin uri service and its integration
2018-08-30 14:41:38 +09:00
Brendon Duncan
986f85e7aa The send tab paste button now recognises a wider variety of Bitcoin Cash prefixes. 2018-08-30 17:18:26 +12:00
Brendon Duncan
9877e13390 Corrected the addres for display in the Review screen cashAddr. 2018-08-30 16:34:21 +12:00
Brendon Duncan
5ad9c7bf49 "Testnet not supported" message when pasting. 2018-08-30 15:55:29 +12:00
Brendon Duncan
5747cbfb66 "Testnet not supported" message when scanning a testnet address. 2018-08-30 15:49:59 +12:00
Brendon Duncan
e6fba98af9 Not using data if it is for the testnet. 2018-08-30 09:04:01 +12:00
Jean-Baptiste Dominguez
162fd685e5 second step enhancement 2018-08-29 17:28:07 +09:00
Jean-Baptiste Dominguez
d864b35513 First enhancement in the send flow architecture 2018-08-29 15:38:23 +09:00
Brendon Duncan
529bdf3386 Alert and resume scanning if data is not recognised. 2018-08-29 18:28:37 +12:00
Brendon Duncan
6d48572f28 Handling all cash URI addresses formats at the same time. 2018-08-29 18:27:58 +12:00
Brendon Duncan
471a9ba4ae Treating BitPay address like cashAddr. 2018-08-29 17:39:04 +12:00
Jean-Baptiste Dominguez
b35ee316a8
Merge pull request #310 from Bitcoin-com/wallet/task/500
Upgrade bitcoin-uri.service.js
2018-08-29 14:27:23 +09:00
Brendon Duncan
8a1e3f2297 Bitcoin Cash URI in incoming data now more permissive with the prefix. 2018-08-29 15:55:49 +12:00
Brendon Duncan
89f4328f8e BIP70 in IncomingDataService uses new BitcoinUriService. 2018-08-29 15:42:43 +12:00
Brendon Duncan
5738bab13e Updated comments. 2018-08-29 15:41:13 +12:00
Brendon Duncan
fcfb039673 parse() now only returns the address in the format that was present in the data, to make it easier to find out about the data. 2018-08-29 15:21:43 +12:00
Brendon Duncan
3a3a525133 Bugfix for displaying payment amount. 2018-08-29 11:38:20 +12:00
Brendon Duncan
e6d438abf9 Test for a bare URL being invalid. 2018-08-29 11:18:09 +12:00
Brendon Duncan
32aa02a8c2 Fails gracefully when not passed a string. 2018-08-29 10:15:03 +12:00
Brendon Duncan
d30a076f4b Changed argument name to data, because it may not be a URI. 2018-08-29 10:05:23 +12:00
Brendon Duncan
217b02504a Added tests for single slash. Removed some unused code. 2018-08-29 10:04:02 +12:00
Brendon Duncan
3b74ab7d8c Tolerating extra dash and slashes. 2018-08-29 09:59:47 +12:00
Brendon Duncan
9bed4239da Grouped the output. 2018-08-29 09:54:04 +12:00
Brendon Duncan
6c85cffb20 Now handles encrypted private key. 2018-08-29 09:11:14 +12:00
Brendon Duncan
b95798d271 Tests for private keys on testnet. 2018-08-29 08:49:18 +12:00
Brendon Duncan
a9f2794d11 Testing uncompressed private keys on mainnet. 2018-08-28 20:56:10 +12:00
Brendon Duncan
61a29cf7ea Copay invitation and wifPrivateKey. 2018-08-28 18:42:03 +12:00
Brendon Duncan
c2cca3c080 Bitcoin cash uppercase. 2018-08-28 17:18:05 +12:00
Brendon Duncan
e8005c9ea6 Legacy addresses with bitcoincash: prefix. 2018-08-28 17:10:15 +12:00
Brendon Duncan
4d525c85d7 CashAddr on testnet and Bitpay format on mainnet. 2018-08-28 17:00:52 +12:00
Jean-Baptiste Dominguez
1d1fde21ea
Merge pull request #309 from Bitcoin-com/wallet/task/500
Get the interface for the sendFlowService
2018-08-28 11:22:39 +09:00
Brendon Duncan
a4ab20abba Tests for BIP72. 2018-08-28 14:17:43 +12:00
Jean-Baptiste Dominguez
4564040459 fixes for pkg mas 2018-08-28 10:50:53 +09:00
Sebastiaan Pasma
3cab114618
template.pot change 2018-08-27 14:09:06 +02:00
Sebastiaan Pasma
2c2c21bcdf
Update notifications now able to parse "rc"'s and also show release notes from GitHub. 2018-08-27 14:06:10 +02:00
Sebastiaan Pasma
8217351141
possible fix for selecting the right currency on new wallets 2018-08-27 10:59:14 +02:00
Brendon Duncan
1be9ce39c1 Starting to work on more comprehensive handling of cashAddr format. Basic handling of cashAddr on testnet. 2018-08-27 20:46:11 +12:00
Brendon Duncan
43592a1689
Fix package.json. 2018-08-27 18:04:55 +12:00
Jean-Baptiste Dominguez
d0bd3e1f61
Merge pull request #306 from Bitcoin-com/wallet/sprint/21
Wallet/sprint/21
2018-08-27 13:22:53 +09:00
Jean-Baptiste Dominguez
1c450418b8
Merge pull request #301 from Bitcoin-com/wallet/prod
5.0
2018-08-27 12:59:17 +09:00
Jean-Baptiste Dominguez
7718724958 pkg building script 2018-08-27 12:00:02 +09:00
Jean-Baptiste Dominguez
9a44a4b33b
Merge pull request #304 from Bitcoin-com/wallet/sprint/21
Wallet/sprint/21
2018-08-26 22:20:25 +09:00
Jean-Baptiste Dominguez
4deeb80a14
Merge pull request #303 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-26 22:16:46 +09:00
Jean-Baptiste Dominguez
0a4054707f
Merge pull request #302 from Bitcoin-com/wallet/prod
Wallet/prod
2018-08-26 22:07:20 +09:00
Jean-Baptiste Dominguez
1fa87fc9a0
Merge pull request #299 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-23 16:33:00 +09:00
Jean-Baptiste Dominguez
07ff264619
Merge pull request #297 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-23 14:40:54 +09:00
Jean-Baptiste Dominguez
dd4fcc9ed1
Update appConfig.json 2018-08-23 14:40:18 +09:00
Jean-Baptiste Dominguez
7e0998c919
Merge pull request #296 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-23 14:39:47 +09:00
Jean-Baptiste Dominguez
a2009a2f06
Merge pull request #295 from Bitcoin-com/wallet/task/503
Tweak strings to match translations.
2018-08-23 14:39:23 +09:00
Brendon Duncan
39bcb9daae Tweak strings to match translations. 2018-08-23 16:21:15 +12:00
Brendon Duncan
b9943c403f Testing addresses with Bitcore wallet client. 2018-08-23 14:37:02 +12:00
Brendon Duncan
1da9a79296 Parsing BTC testnet address. 2018-08-23 14:27:03 +12:00
Brendon Duncan
93d061c96a Returning addresses from cashAddr with bitcoincash: prefix. 2018-08-23 12:55:58 +12:00
Brendon Duncan
ab0b8b19b0 Returning legacy address for cashAddr. 2018-08-23 12:47:47 +12:00
Brendon Duncan
70f76baad0 bitcoinUriService passing first test. 2018-08-23 10:48:49 +12:00
Brendon Duncan
f16ef22436 amountController tests no longer fail. 2018-08-23 10:32:47 +12:00
Sebastiaan Pasma
ed998e9036
Make "Share the Wallet App" translatable 2018-08-22 16:27:30 +02:00
Sebastiaan Pasma
4cf268682b
removed comments 2018-08-22 16:21:57 +02:00
Brendon Duncan
feca8b5807 Checking every time we get earlier data, if all transactions have been fetched. 2018-08-22 20:01:30 +12:00
Brendon Duncan
e6beb6fed1 Displaying more cached data while waiting for first tx history fetch. 2018-08-22 19:51:10 +12:00
Brendon Duncan
745737ef73 Adding missing parameter. 2018-08-22 19:39:32 +12:00
Brendon Duncan
95de043d3d Merged. 2018-08-22 19:32:53 +12:00
Brendon Duncan
ad6a1fbe8d Adding latest transactions. 2018-08-22 19:28:24 +12:00
Brendon Duncan
ecb3b2391d Grunt task for signing. 2018-08-22 18:17:33 +12:00
Brendon Duncan
14f77cf03f Using generic *PACKAGENAME* in template. 2018-08-22 12:07:20 +12:00
Brendon Duncan
e5560bf63a Images with config file changes. 2018-08-22 11:48:19 +12:00
Sebastiaan Pasma
d5f01e9713
stop fetching the wallet history when everything is fetched 2018-08-21 21:36:55 +02:00
Jean-Baptiste Dominguez
66e643f903
Merge pull request #291 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-21 12:46:38 +09:00
Jean-Baptiste Dominguez
feb41adc58 Upgrade the version 2018-08-21 10:44:38 +07:00
Jean-Baptiste Dominguez
ef6b52c6e9 translation 2018-08-21 10:42:12 +07:00
Brendon Duncan
78f0ff28cd Getting earlier transactions with pagination. 2018-08-21 12:43:03 +12:00
Brendon Duncan
0bd94601ae Controlling when infinite scroll is available. 2018-08-21 09:17:56 +12:00
Brendon Duncan
72cb94d212 Using infinite scroll on cached data. 2018-08-21 08:58:19 +12:00
Brendon Duncan
ba98fbe187 Merge sprint/21. 2018-08-20 17:23:01 +12:00
Brendon Duncan
03fa87adbc Displaying transactions from cache when first entering wallet details. 2018-08-20 17:21:30 +12:00
Brendon Duncan
bbe2fb20c4 Updated package.json attempt 4. 2018-08-20 12:02:11 +12:00
Brendon Duncan
2a5a21f7d7 Updated package.json for real. 2018-08-20 11:48:48 +12:00
Brendon Duncan
09871c9eba Updated package.json. 2018-08-20 11:46:34 +12:00
Brendon Duncan
bb92f5ec1b Merged updated sprint/21. 2018-08-20 11:31:49 +12:00
Jean-Baptiste Dominguez
b0f9cb43d6
Merge pull request #289 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-18 02:03:55 +09:00
Jean-Baptiste Dominguez
d06e9f7088
Update package-template.json 2018-08-18 02:03:23 +09:00
Jean-Baptiste Dominguez
f4346fd921
Update bower.json 2018-08-18 02:02:50 +09:00
Jean-Baptiste Dominguez
1fcab222c5
Merge pull request #288 from Bitcoin-com/wallet/sprint/20
Update package.json
2018-08-18 01:29:46 +09:00
Jean-Baptiste Dominguez
154e495846
Update package.json 2018-08-18 01:29:04 +09:00
Jean-Baptiste Dominguez
8f356f8d75
Merge pull request #287 from Bitcoin-com/wallet/sprint/20
ionic resolution
2018-08-18 01:18:34 +09:00
Jean-Baptiste Dominguez
6dcc221ee1 ionic resolution 2018-08-18 01:17:04 +09:00
Jean-Baptiste Dominguez
1e2cfd3ae4
Merge pull request #286 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-18 00:53:18 +09:00
Jean-Baptiste Dominguez
3cef258912 Merge branch 'wallet/sprint/20' of https://github.com/Bitcoin-com/Wallet into wallet/sprint/20 2018-08-18 00:51:24 +09:00
Jean-Baptiste Dominguez
a67f9acbc6 Resolution package 2018-08-18 00:51:08 +09:00
Brendon Duncan
9ee9e8fbed Merged quick fix for asn1. 2018-08-17 16:58:10 +12:00
Brendon Duncan
26891f6e47 Cleaned up log message. 2018-08-17 16:54:04 +12:00
Brendon Duncan
b3e34483b6 Show my address button. 2018-08-17 11:59:27 +12:00
Brendon Duncan
aa75ba18d6 Removed old content. 2018-08-17 11:45:43 +12:00
Jean-Baptiste Dominguez
eee1a69d84
Update package.json 2018-08-16 17:54:51 +09:00
Jean-Baptiste Dominguez
e8f7126c89 package.json 2018-08-16 17:52:23 +09:00
Jean-Baptiste Dominguez
e6ae1c0520 Add the command in package.json 2018-08-16 17:51:59 +09:00
Jean-Baptiste Dominguez
56be096207 quick fix for asn1 2018-08-16 17:51:20 +09:00
Jean-Baptiste Dominguez
acee3024a9 Quick fix for asn1 2018-08-16 17:51:08 +09:00
Brendon Duncan
33d780f2e5 The spinner in wallet details now spins when the infinite scroll spinner spins. 2018-08-16 15:44:59 +12:00
Brendon Duncan
93b6c3f1be Spinner same size as refresh button. 2018-08-16 15:00:51 +12:00
Sebastiaan Pasma
0ae6f043ed
loading new txs using pagination 2018-08-15 17:23:00 +02:00
Jean-Baptiste Dominguez
c27bfcb800
Merge pull request #282 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-15 17:27:52 +09:00
Brendon Duncan
c280adbb06 Merged view for transaction sharing fix. 2018-08-15 12:33:10 +12:00
Brendon Duncan
8dd573624d View change for previous fix. 2018-08-15 12:31:03 +12:00
Sebastiaan Pasma
99d8de02da
Show pasted address instead of always cashaddr format on bch 2018-08-14 15:53:18 +02:00
Sebastiaan Pasma
448679d1a6
receive tab not showing fiat amount on receiving amount ("payment received" screen) 2018-08-14 14:05:22 +02:00
Jean-Baptiste Dominguez
8f2ce2ce12
Merge pull request #281 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-14 18:20:13 +09:00
Sebastiaan Pasma
abe71a8077
typo in template.pot 2018-08-14 10:27:27 +02:00
Jean-Baptiste Dominguez
f834f6783f
Merge pull request #280 from Bitcoin-com/wallet/task/541
Fix for building android release
2018-08-14 17:15:07 +09:00
Jean-Baptiste Dominguez
5a5d31d45d Fix for building android release 2018-08-14 17:13:44 +09:00
Jean-Baptiste Dominguez
a34520c2a9
Merge pull request #279 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-14 16:49:22 +09:00
Jean-Baptiste Dominguez
f18546b8d6
Update appConfig.json 2018-08-14 16:48:55 +09:00
Jean-Baptiste Dominguez
7541f65361
Merge pull request #278 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-14 16:41:53 +09:00
Jean-Baptiste Dominguez
4c93b26e54
Merge pull request #277 from Bitcoin-com/wallet/prod
Wallet/prod
2018-08-14 16:41:23 +09:00
Brendon Duncan
197ee9eeeb Fix for the Custom Amount screen now following the price display setting. 2018-08-14 17:24:17 +12:00
Brendon Duncan
05e204dec8 Changed the review controller to allow the transaction to be shared, once successful. 2018-08-14 16:58:13 +12:00
Brendon Duncan
9b5f4b3516 Merged latest changes.
# Conflicts:
#	src/js/controllers/review.controller.js
#	www/views/review.html
2018-08-14 16:15:05 +12:00
Brendon Duncan
cf6658c83a Removed $apply() inside $watch. 2018-08-14 14:48:07 +12:00
Brendon Duncan
058fc617bb Merged text changes. 2018-08-14 14:43:42 +12:00
Jean-Baptiste Dominguez
580912748a
Merge pull request #276 from Bitcoin-com/wallet/task/514
Upgrade text
2018-08-14 11:41:37 +09:00
Jean-Baptiste Dominguez
24033f4615
Merge branch 'wallet/sprint/20' into wallet/task/514 2018-08-14 11:41:31 +09:00
Jean-Baptiste Dominguez
947c2d324f Upgrade text 2018-08-14 11:38:24 +09:00
Brendon Duncan
4e2c06f69d Changed "Bitcoin" to "Bitcoin Core" on the Sweep Paper Wallet screen and made other strings translatable. 2018-08-14 12:24:10 +12:00
Sebastiaan Pasma
587971724e
template.pot change 2018-08-13 16:52:00 +02:00
Sebastiaan Pasma
5123ba9007
template.pot fix 2018-08-13 15:33:48 +02:00
Sebastiaan Pasma
f6a99f7f47
Merge branch 'wallet/sprint/20' into wallet/dev 2018-08-13 15:31:01 +02:00
Sebastiaan Pasma
14406f6bc4
template.pot fix 2018-08-13 15:28:22 +02:00
Sebastiaan Pasma
4591d4992e
Merge remote-tracking branch 'origin/wallet/dev' into wallet/prod 2018-08-13 14:34:33 +02:00
Sebastiaan Pasma
d2a1461a26
Merge remote-tracking branch 'origin/wallet/dev' into wallet/dev 2018-08-13 14:13:55 +02:00
Sebastiaan Pasma
f51542874b
small fix: minus before alternative currency 2018-08-13 14:12:36 +02:00
Sebastiaan Pasma
1dad3ab3fd
Many translation fixes. Missing translations in template.pot and added some in views 2018-08-13 13:48:41 +02:00
Jean-Baptiste Dominguez
a648b69297
Merge pull request #275 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-13 16:15:38 +09:00
Jean-Baptiste Dominguez
1c38298bbf
Merge pull request #274 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-13 16:15:03 +09:00
Jean-Baptiste Dominguez
a1abf54b4a
Merge pull request #273 from Bitcoin-com/wallet/task/428
Wallet/task/428
2018-08-13 16:14:32 +09:00
Jean-Baptiste Dominguez
30230304b6 Fix height header 2018-08-13 16:13:29 +09:00
Jean-Baptiste Dominguez
f93797efc0
Merge pull request #272 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-13 16:10:29 +09:00
Jean-Baptiste Dominguez
1d62da34d7
Merge pull request #271 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-13 15:37:50 +09:00
Jean-Baptiste Dominguez
15b161d55d
Merge pull request #269 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-13 15:36:06 +09:00
Jean-Baptiste Dominguez
9c999d0cd6
Update appConfig.json 2018-08-13 15:35:26 +09:00
Jean-Baptiste Dominguez
b25879b251
Merge pull request #268 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-13 15:33:24 +09:00
Jean-Baptiste Dominguez
e27aa9a612
Merge pull request #267 from Bitcoin-com/wallet/task/427
Custom amount crypto decimal
2018-08-13 14:45:18 +09:00
Jean-Baptiste Dominguez
c54cb55c51 Custom amount crypto decimal 2018-08-13 14:44:07 +09:00
Jean-Baptiste Dominguez
08ff6f2a6c
Merge pull request #266 from Bitcoin-com/wallet/task/427
Manage the currency state
2018-08-13 14:14:34 +09:00
Jean-Baptiste Dominguez
52e1b5e811 Manage the currency state 2018-08-13 14:13:49 +09:00
Brendon Duncan
b7d2c3e05c Merged fixes to Wallet Details. 2018-08-13 17:00:32 +12:00
Brendon Duncan
0b71daf04d Removed previous fix as it is superceded by a better one. 2018-08-13 16:51:38 +12:00
Brendon Duncan
6de4f2ecda Enlarged Wallet Details header to fit Receive and Send buttons without covering the unlocked balance. 2018-08-13 16:45:46 +12:00
Jean-Baptiste Dominguez
803653135f
Merge pull request #265 from Bitcoin-com/wallet/task/427
Fix formatted amount.
2018-08-13 13:37:28 +09:00
Jean-Baptiste Dominguez
430f4644eb Fix formatted amount. 2018-08-13 13:32:20 +09:00
Brendon Duncan
5da475f1ee Merged sprint/20. 2018-08-13 15:55:57 +12:00
Brendon Duncan
a29a41b647 Removed console.log(). 2018-08-13 15:48:20 +12:00
Brendon Duncan
098d454b8b Fixed formatting of numbers in the thousands. 2018-08-13 15:43:20 +12:00
Brendon Duncan
9d918a694c Merged fixes.
# Conflicts:
#	src/js/controllers/walletSelectorController.js
2018-08-13 14:36:59 +12:00
Brendon Duncan
80c9d682b5 Fix in formatted-amount of display of subcent fees in transactions details page. 2018-08-13 11:23:15 +12:00
Brendon Duncan
84fd483f19 Fix for removing dark portion of Review Transaction screen below personal note. 2018-08-13 10:47:00 +12:00
Brendon Duncan
5445ddbecd Fix for wallet selection header when in Shapeshift flow. Also fixed a coin already present bug that occurred in subsequent Shapeshift flows. 2018-08-13 10:00:39 +12:00
Sebastiaan Pasma
4dd1c6f40b
Merge remote-tracking branch 'origin/wallet/task/537' into wallet/sprint/20 2018-08-10 15:11:10 +02:00
Sebastiaan Pasma
d28ba24e1c
receive specific amount fix to use sendFlowService 2018-08-10 15:10:44 +02:00
Sebastiaan Pasma
f86ab3faec
revert code cleanup 2018-08-10 12:42:28 +02:00
Sebastiaan Pasma
f69b72b24f
Merge remote-tracking branch 'origin/wallet/sprint/20' into wallet/sprint/20 2018-08-10 12:12:45 +02:00
Sebastiaan Pasma
0339d6e85e
Merge remote-tracking branch 'origin/wallet/task/537' into wallet/sprint/20 2018-08-10 12:12:37 +02:00
Sebastiaan Pasma
335ef9defd
Merge remote-tracking branch 'origin/wallet/task/537' into wallet/task/537 2018-08-10 12:12:20 +02:00
Jean-Baptiste Dominguez
3cf577fcfb
Merge pull request #263 from Bitcoin-com/wallet/task/537
Cleaning code
2018-08-10 19:11:22 +09:00
Sebastiaan Pasma
e4c5da0d44
thirdParty fix 2018-08-10 12:07:24 +02:00
Jean-Baptiste Dominguez
949cbc7697 Cleaning code 2018-08-10 19:04:53 +09:00
Jean-Baptiste Dominguez
4cba8e1298
Merge pull request #262 from Bitcoin-com/wallet/task/537
Wallet/task/537
2018-08-10 18:44:51 +09:00
Jean-Baptiste Dominguez
daf9bb5356 Notify to reload home tab 2018-08-10 18:43:28 +09:00
Jean-Baptiste Dominguez
5185c6ee3c Fix amount 2018-08-10 18:41:47 +09:00
Jean-Baptiste Dominguez
81126a9d04 Merge branch 'wallet/task/537' of https://github.com/Bitcoin-com/Wallet into wallet/task/537 2018-08-10 17:47:32 +09:00
Jean-Baptiste Dominguez
3365a61d62 invalidate cache 2018-08-10 17:47:21 +09:00
Sebastiaan Pasma
dd75f581e7
move stateParams and fromWallet outside of the clipboar function 2018-08-10 10:47:16 +02:00
Jean-Baptiste Dominguez
b292f57b02
Merge pull request #261 from Bitcoin-com/wallet/task/537
Wallet/task/537
2018-08-10 17:21:13 +09:00
Jean-Baptiste Dominguez
9e28c4ec45 Fix bug send max with thirdparty (Shapeshift) 2018-08-10 17:20:04 +09:00
Jean-Baptiste Dominguez
3d3aa25d5b Merge branch 'wallet/task/537' of https://github.com/Bitcoin-com/Wallet into wallet/task/537 2018-08-10 17:13:29 +09:00
Brendon Duncan
9e11835000 Equal sized digits on Wallet Details alternative balance. 2018-08-10 19:45:43 +12:00
Brendon Duncan
c2bcae3537 Merged fixes for iPhone 5 / SE.
# Conflicts:
#	www/views/amount.html
2018-08-10 19:16:04 +12:00
Brendon Duncan
d88d3365ad Fix for long amounts on iPhone 5 / SE. Fix for buttons below amounts on iPhone 5 / SE. 2018-08-10 19:09:55 +12:00
Brendon Duncan
38d2c6a3c6 Merge fix for wallet-balance for non-stringifyable wallet. 2018-08-10 17:16:50 +12:00
Brendon Duncan
812ed5f1cd wallet-balance workaround for wallet not being stringify-able, and hence not being interpolatable, and hence not being able to pass it to the directive. 2018-08-10 17:13:24 +12:00
Jean-Baptiste Dominguez
ee84235d3a Top bar message 2018-08-10 14:05:46 +09:00
Brendon Duncan
38b2d84f2e Merged error handling for wallet-balance. 2018-08-10 16:23:39 +12:00
Brendon Duncan
e6105ef552 Merge. 2018-08-10 16:20:53 +12:00
Brendon Duncan
3ff0f50a7b Added quotes. 2018-08-10 16:20:26 +12:00
Brendon Duncan
8d404f1908 Handle null wallet. 2018-08-10 16:19:24 +12:00
Brendon Duncan
14724ea6f6 Merged formatting of some amounts. 2018-08-10 14:30:53 +12:00
Brendon Duncan
4dd334087b Removed formatted amount from the entry of the Amount screen as it was causing a bug. 2018-08-10 14:24:41 +12:00
Jean-Baptiste Dominguez
e0c4155ef1
Merge pull request #260 from Bitcoin-com/wallet/task/537
Add tracking shapeshift
2018-08-10 11:22:46 +09:00
Jean-Baptiste Dominguez
0410ad1491 Add tracking shapeshift 2018-08-10 11:21:29 +09:00
Brendon Duncan
18c8f4cf07 formatted-amount for transaction proposals and wallet activity. 2018-08-10 14:17:42 +12:00
Jean-Baptiste Dominguez
40676d8032
Merge pull request #259 from Bitcoin-com/wallet/task/537
Handle error in the review screen
2018-08-10 11:13:19 +09:00
Jean-Baptiste Dominguez
4c9ff1b28b Handle error in the review screen 2018-08-10 11:11:53 +09:00
Jean-Baptiste Dominguez
a34bd614fa
Merge pull request #258 from Bitcoin-com/wallet/task/427
crypto decimal
2018-08-10 10:57:20 +09:00
Brendon Duncan
cb9feb99ce Merge wallet-balance that includes formatted-amount 2018-08-10 13:56:48 +12:00
Jean-Baptiste Dominguez
b70bd804dc crypto decimal 2018-08-10 10:56:01 +09:00
Brendon Duncan
82c0746ff8 wallet-balance directive uses formatted-amount. 2018-08-10 13:48:59 +12:00
Jean-Baptiste Dominguez
1f07e8ec57
Merge pull request #257 from Bitcoin-com/wallet/task/427
Wallet/task/427
2018-08-10 10:44:49 +09:00
Jean-Baptiste Dominguez
82ede65363 New decimal on the review screen 2018-08-10 10:43:54 +09:00
Jean-Baptiste Dominguez
39e515d3c5
Merge pull request #256 from Bitcoin-com/wallet/sprint/20
Wallet/sprint/20
2018-08-10 10:39:42 +09:00
Jean-Baptiste Dominguez
bd32a7c08a
Merge pull request #255 from Bitcoin-com/wallet/task/537
Wallet/task/537
2018-08-10 10:26:14 +09:00
Brendon Duncan
d7285a72e4 wallet-balance directive retrieves alternative amount when needed. 2018-08-10 13:26:12 +12:00
Brendon Duncan
355ed27b87 wallet balance directive displaying fiat balance from wallet status. 2018-08-10 13:04:44 +12:00
Brendon Duncan
afb3a1d49f wallet-balance directive displaying basic crypto balance. 2018-08-10 12:46:00 +12:00
Brendon Duncan
678ad516ee Merge sprint/20. 2018-08-10 12:19:13 +12:00
Sebastiaan Pasma
577756fd44
button color + Time ago fix 2018-08-09 17:14:05 +02:00
Jean-Baptiste Dominguez
06a56cab4d
Merge pull request #254 from Bitcoin-com/wallet/task/427
Fix decimal
2018-08-09 23:30:23 +09:00
Jean-Baptiste Dominguez
bc9e1710c2
Merge branch 'wallet/sprint/20' into wallet/task/427 2018-08-09 23:30:12 +09:00
Jean-Baptiste Dominguez
2408753e91 Fix decimal 2018-08-09 23:28:59 +09:00
Sebastiaan Pasma
8b19f599b6
Merge remote-tracking branch 'origin/wallet/task/537' into wallet/sprint/20 2018-08-09 13:46:34 +02:00
Sebastiaan Pasma
ee0042b6e7
sendMax bugfix when returning to previous screen 2018-08-09 13:39:27 +02:00
Sebastiaan Pasma
25965f6268
shapeshift moved to default services and communities fix 2018-08-09 10:17:29 +02:00
Sebastiaan Pasma
420305cf01
shapeshift moved to default services and communities fix 2018-08-09 10:16:45 +02:00
Jean-Baptiste Dominguez
fb8d2efe12
Merge pull request #253 from Bitcoin-com/wallet/task/537
Wallet/task/537
2018-08-09 16:42:21 +09:00
Jean-Baptiste Dominguez
b46b01471a
Merge pull request #252 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-09 16:19:39 +09:00
Brendon Duncan
0ec0e5c945 Merged latest. 2018-08-09 18:59:46 +12:00
Brendon Duncan
ac8cdcf5be Android 4.4 fix for Amount screen, removal of  . 2018-08-09 18:59:03 +12:00
Brendon Duncan
de33fe5868 Refactored formattedAmount. 2018-08-09 18:58:21 +12:00
Jean-Baptiste Dominguez
c8d7e88f81
Merge branch 'wallet/sprint/20' into wallet/dev 2018-08-09 15:52:48 +09:00
Jean-Baptiste Dominguez
0c15a83782
Merge pull request #250 from Bitcoin-com/wallet/task/537
Wallet/task/537
2018-08-09 15:41:29 +09:00
Jean-Baptiste Dominguez
3bb446cdee
Merge branch 'wallet/sprint/20' into wallet/task/537 2018-08-09 15:41:17 +09:00
Jean-Baptiste Dominguez
4cf68076a0 remove comment on bitanalytics 2018-08-09 15:35:31 +09:00
Jean-Baptiste Dominguez
9076ad2098 add update wallet 2018-08-09 15:35:03 +09:00
Jean-Baptiste Dominguez
b742eadd4e clean and remove bug home 2018-08-09 15:13:29 +09:00
Jean-Baptiste Dominguez
9bdd44a483 Merge branch 'wallet/task/537' of https://github.com/Bitcoin-com/Wallet into wallet/task/537 2018-08-09 15:09:52 +09:00
Jean-Baptiste Dominguez
c68b1e77f6 clean controller and remove old firebase event 2018-08-09 15:09:43 +09:00
Brendon Duncan
cbf66a2176 Fix for formatting amounts on Android 4.4. 2018-08-09 17:54:20 +12:00
Jean-Baptiste Dominguez
a964b2d967 Merge branch 'wallet/task/537' of https://github.com/Bitcoin-com/Wallet into wallet/task/537 2018-08-09 13:15:29 +09:00
Jean-Baptiste Dominguez
77f6210076 Fix pop state on the send flow 2018-08-09 13:15:21 +09:00
Jean-Baptiste Dominguez
0ea97fc1c6 Fix state pop on the send flow 2018-08-09 13:14:44 +09:00
Brendon Duncan
7ce562ec64 Fix for Shapeshift now appearing again on Review Transaction screen. 2018-08-09 16:11:29 +12:00
Jean-Baptiste Dominguez
a490f0ce1f dead code 2018-08-09 13:06:52 +09:00
Jean-Baptiste Dominguez
647e126169 Fix style css for the from wallet & activate the from wallet in the send tab 2018-08-09 12:49:35 +09:00
Jean-Baptiste Dominguez
e183643298 Remove from the route the stateparams, adapt some controllers in the new sendflowservice 2018-08-09 12:35:39 +09:00
Brendon Duncan
188ddcba58 Review transation copying state at startup so it doesn't contaminate the sendFlowController. 2018-08-09 13:25:06 +12:00
Brendon Duncan
0410182d4f Incoming data working with sendFlowService. 2018-08-09 13:24:13 +12:00
Brendon Duncan
a2dff98c63 Back button on Review Transaction screen works with sendFlowService. 2018-08-09 13:12:44 +12:00
Brendon Duncan
b426209efb Fix for clearing current state only. 2018-08-09 13:06:50 +12:00
Brendon Duncan
bf9b467bfe Renamed sendFlowService functions to be more consistent. 2018-08-09 13:01:48 +12:00
Brendon Duncan
be0c18244e Review Transaction screen now displaying BCH addresses in cashaddr format. 2018-08-09 12:12:29 +12:00
Brendon Duncan
408d46e4d3 Hid the from wallet in the send screen for now, because it requires other layout changes to fit everything in, especially on small screens. 2018-08-09 11:43:20 +12:00
Brendon Duncan
1d025cbf35 Fixes for Android 4.4 2018-08-09 11:42:25 +12:00
Brendon Duncan
be2bc4cddb Showing From wallet in send tab. 2018-08-09 11:13:12 +12:00
Brendon Duncan
dff0d51ef3 Refactored sendFlowService and cleared its state before entering the send tab. 2018-08-09 11:10:26 +12:00
Brendon Duncan
e7ce86fb99 Merged fix for undefined currency. 2018-08-09 10:47:54 +12:00
Brendon Duncan
58d99231ae Handle undefined currency. 2018-08-09 10:46:07 +12:00
Brendon Duncan
eb500c0549 Updated decimal formatting. 2018-08-09 10:42:58 +12:00
Brendon Duncan
cb398a0f50 Merged cleanup for formated amount.
# Conflicts:
#	src/js/directives/formattedAmount.js
2018-08-09 07:58:24 +12:00
Brendon Duncan
1c3b113222 Removed unused config service. 2018-08-09 07:49:13 +12:00
Brendon Duncan
d81f194f87 Fix for when an amount changes from having a separate currency value, to the currency being one string with the amount. 2018-08-09 07:35:47 +12:00
Sebastiaan Pasma
02e8e0fbf0
clear send flow on home and wallet details 2018-08-08 17:29:28 +02:00
Sebastiaan Pasma
2206102715
sendflow service integrated into flow 2018-08-08 17:27:15 +02:00
Sebastiaan Pasma
f7ecdb2f2f
sendflow service integrated into flow 2018-08-08 17:10:47 +02:00
Sebastiaan Pasma
8229d51fdd
sendflow service 2018-08-08 16:35:49 +02:00
Jean-Baptiste Dominguez
73b18b16b6
Merge pull request #249 from Bitcoin-com/wallet/task/514
Wallet/task/514
2018-08-08 22:34:44 +09:00
Jean-Baptiste Dominguez
04f77c1daa Merge branch 'wallet/task/514' of https://github.com/Bitcoin-com/Wallet into wallet/task/514 2018-08-08 22:32:31 +09:00
Jean-Baptiste Dominguez
51921a1a1d Fix shapeshift flow go back available 2018-08-08 22:32:18 +09:00
Sebastiaan Pasma
753d2aea69
remove bottom menu on wallet selector + remove swipe back feature on review screen 2018-08-08 15:31:36 +02:00
Brendon Duncan
69e8c62f5c Fix for when an amount changes from having a separate currency value, to the currency being one string with the amount. 2018-08-08 22:00:07 +12:00
Brendon Duncan
b8de811fbe Merged fancy decimals.
# Conflicts:
#	www/views/walletDetails.html
2018-08-08 20:42:49 +12:00
Brendon Duncan
7e9cfa77c4 Now correctly derives currency from value. 2018-08-08 20:25:17 +12:00
Jean-Baptiste Dominguez
da964e5a9b
Merge pull request #248 from Bitcoin-com/wallet/task/514
Wallet/task/514
2018-08-08 17:17:51 +09:00
Jean-Baptiste Dominguez
b4e36e93cb Fix double loading in the review screen for shapeshift 2018-08-08 17:11:16 +09:00
Jean-Baptiste Dominguez
60028c44bb remove the header for shapeshift in the amount view 2018-08-08 16:59:00 +09:00
Jean-Baptiste Dominguez
5ee9d4d284
Merge pull request #247 from Bitcoin-com/wallet/task/514
height space in the bottom (wallet selection & review)
2018-08-08 16:25:31 +09:00
Jean-Baptiste Dominguez
644b3e6113 height space in the bottom (wallet selection & review) 2018-08-08 16:24:47 +09:00
Jean-Baptiste Dominguez
14c87892bc
Merge pull request #246 from Bitcoin-com/wallet/task/514
Wallet/task/514
2018-08-08 16:10:58 +09:00
Jean-Baptiste Dominguez
158c571ce1
Merge branch 'wallet/sprint/20' into wallet/task/514 2018-08-08 16:10:51 +09:00
Jean-Baptiste Dominguez
ab13478f79 Add shapeshift service item 2018-08-08 16:03:34 +09:00
Brendon Duncan
ae6dcea81a Fix for getting Shapeshift working. 2018-08-08 18:58:26 +12:00
Brendon Duncan
3d9b24575b In Review Transaction screen, the note is now visible above the fees. 2018-08-08 18:57:55 +12:00
Jean-Baptiste Dominguez
6981a5af9f show only when it is ready 2018-08-08 15:52:20 +09:00
Brendon Duncan
a5862bd6c4 Merge. 2018-08-08 18:23:46 +12:00
Brendon Duncan
fcb4d4b004 Text is now visible on Send and Receive buttons in Wallet Details screen when activated. 2018-08-08 18:22:43 +12:00
Jean-Baptiste Dominguez
198bb88140
Merge pull request #244 from Bitcoin-com/wallet/sprint/20
sprint 20
2018-08-08 14:09:34 +09:00
Brendon Duncan
86a9e9fe92 Merge for alignment and size of Receive and Send buttons. 2018-08-08 16:34:14 +12:00
Brendon Duncan
939263c385 Alignment and size of Receive and Send buttons on the Home tab matches the Wallet Details tab: equal spacing. 2018-08-08 16:30:57 +12:00
Brendon Duncan
5d3e11b7bb Fixed alignment of buttons in Wallet Details on wide screens.. 2018-08-08 16:10:58 +12:00
Brendon Duncan
da88ddbd40 ShapeshiftService fix for app startup. 2018-08-08 15:36:18 +12:00
Jean-Baptiste Dominguez
a1250be73d
Merge pull request #243 from Bitcoin-com/wallet/task/514
Wallet/task/514
2018-08-08 11:23:48 +09:00
Jean-Baptiste Dominguez
037c00ec9e
Merge branch 'wallet/sprint/20' into wallet/task/514 2018-08-08 11:23:35 +09:00
Jean-Baptiste Dominguez
1c71e961b9
Merge pull request #232 from Bitcoin-com/wallet/task/423
Small improvement - 423 - Only change button color if it contains an address, not on all content
2018-08-08 10:57:10 +09:00
Jean-Baptiste Dominguez
5048bc135b
Merge pull request #224 from Bitcoin-com/wallet/task/441
441 - Translatable strings for the "Home" tab
2018-08-08 10:56:35 +09:00
Jean-Baptiste Dominguez
7f0946b390
Merge branch 'wallet/sprint/20' into wallet/task/441 2018-08-08 10:56:26 +09:00
Jean-Baptiste Dominguez
06ffa4c233
Merge pull request #226 from Bitcoin-com/wallet/task/442
442 - Missing "Price Display" translation
2018-08-08 10:54:21 +09:00
Jean-Baptiste Dominguez
b4bf0c314f
Merge pull request #230 from Bitcoin-com/wallet/task/508
508 - Fix the QRCode scan.
2018-08-08 10:54:09 +09:00
Jean-Baptiste Dominguez
ecad91d328
Merge pull request #237 from Bitcoin-com/wallet/task/439
439 - Enter Amount screen modifications
2018-08-08 10:53:59 +09:00
Jean-Baptiste Dominguez
f20f5ae648
Merge pull request #236 from Bitcoin-com/wallet/task/428
Improvement - 428 - Send/Receive buttons
2018-08-08 10:53:48 +09:00
Jean-Baptiste Dominguez
75843c68ff
Merge pull request #231 from Bitcoin-com/wallet/task/505
505 - BitAnalytics 0.2.1 with GA
2018-08-08 10:53:01 +09:00
Jean-Baptiste Dominguez
699d1dddf2
Merge pull request #220 from Bitcoin-com/wallet/task/426
Improvement - 426 - New Payment Sent screen
2018-08-08 10:51:51 +09:00
Jean-Baptiste Dominguez
8ac6094c22
Merge pull request #227 from Bitcoin-com/wallet/task/414
Improvement - 414 - "Custom amount" QR screen to include the price in big letters
2018-08-08 10:51:39 +09:00
Jean-Baptiste Dominguez
e52fb462dd
Merge pull request #228 from Bitcoin-com/wallet/task/484
484 - Android: Remove permission for Microphone use
2018-08-08 10:51:01 +09:00
Brendon Duncan
43adcc3806 More selective display of balances Wallet Details screen when fiat balance isn't available. 2018-08-08 13:38:43 +12:00
Brendon Duncan
820c1a3933 Wallet details does not display any balance text if it does not have balance yet. 2018-08-08 13:31:02 +12:00
Brendon Duncan
12aa9a3b18 formatted-amount displays "-.--" when it does not have a value. 2018-08-08 13:28:44 +12:00
Brendon Duncan
29a5a37c02 Formatter displays blank amount when value is NaN. 2018-08-08 12:24:13 +12:00
Sebastiaan Pasma
b1a1f24d93
New format also on walletSelector component and receive tab (including payment received) 2018-08-07 16:21:51 +02:00
Sebastiaan Pasma
9f418583ab
formatted amount controller update + css + renames + included in views 2018-08-07 16:11:47 +02:00
Jean-Baptiste Dominguez
e127b81e7c
Merge pull request #242 from Bitcoin-com/wallet/prod
Wallet/prod
2018-08-07 23:01:10 +09:00
Jean-Baptiste Dominguez
ab8f856e2b
Merge branch 'master' into wallet/prod 2018-08-07 23:01:00 +09:00
Sebastiaan Pasma
01a7024b52
Merge remote-tracking branch 'origin/wallet/task/514' into wallet/task/427 2018-08-07 15:06:54 +02:00
Jean-Baptiste Dominguez
07ac4e7738 Show memo for shapeshift 2018-08-07 20:50:56 +09:00
Jean-Baptiste Dominguez
af90c53e50 Add memo expended 2018-08-07 20:14:48 +09:00
Jean-Baptiste Dominguez
9420b63728 Fix shapeshift, remove the cancelTx. Remove the timer with the getStatus 2018-08-07 20:11:21 +09:00
Jean-Baptiste Dominguez
a295c03b2e Merge branch 'wallet/task/514' of https://github.com/Bitcoin-com/Wallet into wallet/task/514 2018-08-07 17:37:32 +09:00
Jean-Baptiste Dominguez
485039223f egifter template 2018-08-07 17:37:23 +09:00
Sebastiaan Pasma
52ca7bafd7
Merge remote-tracking branch 'origin/wallet/task/514' into wallet/task/514 2018-08-07 09:54:43 +02:00
Sebastiaan Pasma
83b1977a6f
Shapeshift controller useless functions removed 2018-08-07 09:47:37 +02:00
Jean-Baptiste Dominguez
37614f0811 Change to svg for egifter 2018-08-07 16:45:58 +09:00
Jean-Baptiste Dominguez
1aa31b6935 egifter template, waiting the logo in svg. 2018-08-07 16:36:33 +09:00
Jean-Baptiste Dominguez
d26a96500b eGifter incomingData 2018-08-07 15:30:28 +09:00
Jean-Baptiste Dominguez
e6389567e0 Merge branch 'wallet/task/514' of https://github.com/Bitcoin-com/Wallet into wallet/task/514 2018-08-07 15:02:43 +09:00
Jean-Baptiste Dominguez
91487cf74c shapeshift add the toAddress in the tx. Sending works. 2018-08-07 15:02:29 +09:00
Brendon Duncan
9b4b3996ae Merge. Also invoice name from third party data. 2018-08-07 17:58:35 +12:00
Brendon Duncan
59d1704673 Fix for display of fee when not for a BIP70 invoice. 2018-08-07 17:34:28 +12:00
Jean-Baptiste Dominguez
886204d8b0 incomingData time for bch 2018-08-07 14:34:02 +09:00
Jean-Baptiste Dominguez
a9711c2575 Fix incomingData, expires different depending on btc or bch (bitpay...) 2018-08-07 14:02:53 +09:00
Jean-Baptiste Dominguez
37402e45af Merge branch 'wallet/task/514' of https://github.com/Bitcoin-com/Wallet into wallet/task/514 2018-08-07 13:57:06 +09:00
Jean-Baptiste Dominguez
c800e8efe5 incomingData, bip70 & bitpay 2018-08-07 13:56:56 +09:00
Brendon Duncan
db7eee984b Error handling for Shapeshift, and UI for destination wallet. 2018-08-07 14:48:43 +12:00
Brendon Duncan
6c46ec2bca Fix for some changes which broke Shapeshift flow. 2018-08-07 14:23:53 +12:00
Brendon Duncan
6dfbbb15d4 Added showSendMaxWarning(). 2018-08-07 12:16:59 +12:00
Brendon Duncan
38852d32d4 Sending BIP70 payments. 2018-08-07 11:59:36 +12:00
Brendon Duncan
7d1fff424a Streamlined display of memo. 2018-08-07 11:34:35 +12:00
Brendon Duncan
09f627ea51 Suggested by merchant. 2018-08-07 11:27:05 +12:00
Brendon Duncan
e29f97eddf Payment request expiration. 2018-08-07 11:07:19 +12:00
Brendon Duncan
d183077a20 Countdown timer for BIP70 invoices. 2018-08-07 09:39:48 +12:00
Sebastiaan Pasma
5b6f48e6a2
Check min max on shapeshift flow 2018-08-06 18:11:37 +02:00
Sebastiaan Pasma
caafec4625
shapeshift controller 2018-08-06 18:06:10 +02:00
Jean-Baptiste Dominguez
470868ade9 Review screen, cleaning in the same time 2018-08-06 23:19:46 +09:00
Jean-Baptiste Dominguez
3652419b0d Fix double id 2018-08-06 22:21:40 +09:00
Jean-Baptiste Dominguez
bb3b00ae8d Fix incomingData toAddress, mistake 2018-08-06 22:20:51 +09:00
Jean-Baptiste Dominguez
59b9167ff0 Merge 2018-08-06 22:17:15 +09:00
Jean-Baptiste Dominguez
cc213956d0 header bitpay on the wallet selector, incoming data fix, clean a bit 2018-08-06 22:12:33 +09:00
Brendon Duncan
9273fb6407 Merge. 2018-08-06 21:46:09 +12:00
Brendon Duncan
cea77e910f One step closer to getting send max working. 2018-08-06 21:46:03 +12:00
Sebastiaan Pasma
ec354bd340
header css 2018-08-06 11:25:29 +02:00
Brendon Duncan
731cfebc8a Fixed destination coin for Shapeshift. 2018-08-06 20:39:59 +12:00
Brendon Duncan
f1f8f6e0f5 Tidied up third party data from BIP70 Payment Protocol. 2018-08-06 20:31:06 +12:00
Brendon Duncan
b0e46f18a1 The Origin screen can now display payment requests properly. 2018-08-06 16:45:00 +12:00
Brendon Duncan
4203a449d9 Displaying requested amount in origin screen. 2018-08-06 13:39:03 +12:00
Brendon Duncan
fb4bc1563c Starting to integrate BIP70 payment protocol into new send flow. 2018-08-06 12:04:14 +12:00
Sebastiaan Pasma
d7fabc3642
header + default colors 2018-08-03 14:28:56 +02:00
Sebastiaan Pasma
cebe9507f1
Make the "to"-address field work in new style + BTC transactions fix 2018-08-03 13:13:29 +02:00
Brendon Duncan
8148ad66b4 Payments to contacts now work. 2018-08-03 20:11:14 +12:00
Brendon Duncan
2f62092fd8 Payment sent message is displayed. 2018-08-03 19:59:25 +12:00
Sam Cheng Hung
671b46da41 Changes address component name to address-frame 2018-08-03 15:33:25 +08:00
Brendon Duncan
5973b30551 Sends wallet to wallet transaction with sound. 2018-08-03 19:14:33 +12:00
Brendon Duncan
3ca95d6d40 Wallet to wallet transaction sent successfully. The UI for it is still incomplete. 2018-08-03 17:56:46 +12:00
Sam Cheng Hung
f96610a66b Removes border and background from Paste Address button for send tab page 2018-08-03 13:35:05 +08:00
Brendon Duncan
e649da69ef In WalletService, createAddress now terminated properly, preventing double callback. 2018-08-03 17:11:47 +12:00
Jean-Baptiste Dominguez
114cb5e1e9
Merge pull request #241 from Bitcoin-com/wallet/dev
Wallet/dev
2018-08-03 10:38:32 +09:00
Jean-Baptiste Dominguez
9e5bd663a7
Update appConfig.json 2018-08-03 10:37:49 +09:00
Jean-Baptiste Dominguez
a8b0d245c1
Merge pull request #240 from Bitcoin-com/wallet/sprint/19
Wallet/sprint/19
2018-08-03 10:37:10 +09:00
Jean-Baptiste Dominguez
96a9ab9c6e
Merge pull request #238 from Bitcoin-com/wallet/task/416
Fix - 416 - buttom button border-radius fix
2018-08-03 10:36:11 +09:00
Jean-Baptiste Dominguez
d03bc4cb23
Merge pull request #239 from Bitcoin-com/wallet/task/510
Wallet/task/510
2018-08-03 10:35:46 +09:00
Brendon Duncan
6626663a31 Displays error when transaction amount too low. Reinstated warning colour for transactions with high fees. 2018-08-03 10:41:21 +12:00
Brendon Duncan
f758668395 Title on wallet-to-wallet destination screen. 2018-08-03 08:48:24 +12:00
Sebastiaan Pasma
eef84b25f8
update to txp creation. merged and refactored many features from confirm.js 2018-08-02 18:30:35 +02:00
Jean-Baptiste Dominguez
9c8ec7d3a2 Fix tx history 2018-08-03 01:17:01 +09:00
Jean-Baptiste Dominguez
66c9cefb0c Fix the tx history 2018-08-03 01:15:54 +09:00
Sebastiaan Pasma
f49e8725e8
Translations additions + some (s)css + review transaction changes 2018-08-02 16:05:12 +02:00
Sebastiaan Pasma
aacc80ea21
shapeshift flow 2018-08-02 15:42:35 +02:00
Sebastiaan Pasma
01dd774fae
thirdParty updates + shapeshift screens + merged with review transaction 2018-08-02 15:15:23 +02:00
Sebastiaan Pasma
391201471d
Merge remote-tracking branch 'origin/wallet/task/440' into wallet/task/514
# Conflicts:
#	i18n/po/template.pot
#	src/js/controllers/amount.js
#	www/css/main.css
2018-08-02 15:12:40 +02:00
Brendon Duncan
85a74bbd0e UI for crypto fee warning. 2018-08-02 21:11:28 +12:00
Brendon Duncan
e21592dec8 UI for crypto fee. 2018-08-02 20:43:18 +12:00
Brendon Duncan
4a1fd498f5 UI for sending to address. 2018-08-02 20:05:52 +12:00
Brendon Duncan
aeb6efcdd0 UI for sending to contact. 2018-08-02 19:51:50 +12:00
Brendon Duncan
e525b2e8ad UI for destination as wallet. 2018-08-02 18:14:54 +12:00
Brendon Duncan
1590a295da Bugfix for ShapeShift warnings. 2018-08-02 17:10:58 +12:00
Brendon Duncan
dc41aa6044 Warning messages for ShapeShift amounts. 2018-08-02 16:40:00 +12:00
Brendon Duncan
927c1e9478 Request Specifc Amount integrated into new send flow. 2018-08-02 15:44:59 +12:00
Brendon Duncan
ff643bf479 Starting on destination UI. 2018-08-02 11:48:41 +12:00
Brendon Duncan
438ab94404 Strings for translation. 2018-08-02 10:20:03 +12:00
Brendon Duncan
e58c3bf438 From wallet currency colour. 2018-08-02 10:07:25 +12:00
Brendon Duncan
0caa3fb92a From wallet details. 2018-08-02 09:48:12 +12:00
Sebastiaan Pasma
31d33ba656
Shape shift track 2018-08-01 11:53:58 +02:00
Sebastiaan Pasma
5372ba3dac
Merge remote-tracking branch 'origin/wallet/task/439' into wallet/task/514
# Conflicts:
#	src/js/controllers/amount.js
2018-08-01 11:16:59 +02:00
Sam Cheng Hung
18e00e5fca Renames amount directive to formatted-amount, fixes formatting for crypto 2018-08-01 16:59:13 +08:00
Brendon Duncan
38c3f2fb70 Displaying the amount. 2018-08-01 17:17:34 +12:00
Brendon Duncan
65ac476aaa Updated amount directive. 2018-08-01 14:29:37 +12:00
Brendon Duncan
d6176e0f3e Getting crypto value. 2018-08-01 14:28:26 +12:00
Brendon Duncan
52f1e93e5b Header text. 2018-08-01 11:36:25 +12:00
Brendon Duncan
f3a350f664 Redirecting to new Review screen when sending max. 2018-08-01 11:33:24 +12:00
Sebastiaan Pasma
a952edfe69
border-radius fix 2018-07-31 17:40:58 +02:00
Sebastiaan Pasma
42d77903e1
Third Party Service integration (Shapeshift) (CSS + translations + wallet selector + routes) 2018-07-31 17:21:56 +02:00
Sebastiaan Pasma
281b969fc3
Shapeshift refactor / Empty case / CSS 2018-07-31 15:03:20 +02:00
Brendon Duncan
0cba978d65 Replaced old amount screen. 2018-07-31 20:25:21 +12:00
Sam Cheng Hung
1895e0dbeb Adds watcher for changes to value or currency scope variables 2018-07-31 16:23:45 +08:00
Brendon Duncan
02f7bcc281 Not using amount directive. Removed safety area below All Available Funds button. 2018-07-31 20:18:27 +12:00
Brendon Duncan
97aa7c415e Merged fix for amount directive. 2018-07-31 19:51:19 +12:00
Sam Cheng Hung
8dc1e06048 Removes dummy values on home tab 2018-07-31 15:46:12 +08:00
Sam Cheng Hung
5a0c1417d4 Prevents reassignment of bound attribute size-equal 2018-07-31 15:44:59 +08:00
Brendon Duncan
778cbfbab0 Should have been part of merge for amount directive. 2018-07-31 19:16:11 +12:00
Brendon Duncan
2353109adf Bugfix for font for insufficient funds warning. 2018-07-31 17:59:26 +12:00
Brendon Duncan
2987d17e11 Merged amount directive. 2018-07-31 13:28:16 +12:00
Brendon Duncan
71a31ce399 Available funds now accurately reflects the primary currency choice. 2018-07-31 13:25:56 +12:00
Brendon Duncan
0fdd478ae4 Fixed up bold fonts. 2018-07-31 12:47:03 +12:00
Sebastiaan Pasma
9b27cb50e2
Merge remote-tracking branch 'origin/wallet/task/466' into wallet/task/454 2018-07-30 22:17:56 +02:00
Sebastiaan Pasma
ed291b1ac5
removed currencySymbolService and it's references 2018-07-30 15:25:52 +02:00
Sebastiaan Pasma
734153ec5b
more fixes on the send/receive on Android & iOS / removed some unused code 2018-07-30 15:17:15 +02:00
Sam Cheng Hung
3a89b4e2eb Merge branch 'wallet/task/427' into wallet/task/440 2018-07-30 17:47:25 +08:00
Sam Cheng Hung
e0ef42b09a Removes dummy text 2018-07-30 17:47:05 +08:00
Sam Cheng Hung
51bd970121 Merges amount directive 2018-07-30 17:46:00 +08:00
Sam Cheng Hung
1eac545751 Merge branch 'wallet/task/427' into wallet/task/440 2018-07-30 17:45:46 +08:00
Sam Cheng Hung
da536a3f5b Fixes default value of size-equal 2018-07-30 17:45:26 +08:00
Sam Cheng Hung
343fde08f3 Merges amount directive 2018-07-30 17:35:15 +08:00
Sam Cheng Hung
5c4890fac4 Removes amount directive template 2018-07-30 17:34:20 +08:00
Sam Cheng Hung
f4b0b46067 Adds size-equal and capitalizes currency text 2018-07-30 17:33:38 +08:00
Sam Cheng Hung
7fb2792a1a Adds size-equal class to amount directive 2018-07-30 16:56:27 +08:00
Sam Cheng Hung
e1d65bc557 Adds amount directive 2018-07-30 16:49:57 +08:00
Sam Cheng Hung
2b96293c80 Move amount directive to a separate branch 2018-07-30 16:40:16 +08:00
Sebastiaan Pasma
3732d21728
send/receive iPhoneX fixes 2018-07-30 09:37:14 +02:00
Brendon Duncan
7669ab2479 Transitioning from the Shapeshift screen. 2018-07-30 19:28:30 +12:00
Brendon Duncan
f0ccee8a0a Refining the display of available funds. 2018-07-30 18:28:27 +12:00
Brendon Duncan
d5666c9d29 Ported changes from 459. 2018-07-28 20:24:29 -07:00
Brendon Duncan
b5a2e890a5 Merge wallet/task/459 into wallet/task/439. 2018-07-28 19:30:36 -07:00
Brendon Duncan
9781f90f2b Warning colour for insufficient funds. 2018-07-28 19:20:12 -07:00
Brendon Duncan
72a5b3cabd Primary ("Next") button. 2018-07-28 17:18:52 -07:00
Brendon Duncan
0ba1ea1f42 Use All Available Funds button. 2018-07-28 15:36:23 -07:00
Brendon Duncan
81e9f527ff Route for send amount. 2018-07-28 13:04:04 -07:00
Sam Cheng Hung
2b32fe9bdc Changes amount directive scope values to bind to parent scope property 2018-07-27 17:04:53 +08:00
Sam Cheng Hung
47de79cc64 Adds support for 0, 2, 3 and 8 decimal places and locale commas and decimals 2018-07-27 17:03:09 +08:00
Jean-Baptiste Dominguez
61343af1cc
Merge pull request #234 from Bitcoin-com/wallet/dev
Release 4.13-rc2
2018-07-27 17:47:12 +09:00
Jean-Baptiste Dominguez
d122048a7b Increment version 2018-07-27 17:46:19 +09:00
Jean-Baptiste Dominguez
e344fd567b Add translations and remove googletagmanager 2018-07-27 17:45:12 +09:00
Sam Cheng Hung
69b2fac8e5 Updates amount font size 2018-07-27 12:29:34 +08:00
Jean-Baptiste Dominguez
77c6df8cd1
Merge pull request #233 from Bitcoin-com/wallet/sprint/19
Wallet/sprint/19
2018-07-27 11:23:03 +09:00
Jean-Baptiste Dominguez
e29dfa0f12
Merge pull request #229 from Bitcoin-com/wallet/task/416
Bug - 416 - OSX paste-bugfix
2018-07-27 11:21:36 +09:00
Brendon Duncan
f65b632273 Available funds appearance in normal case. 2018-07-26 13:22:03 -07:00
Brendon Duncan
8fd0b76a44 Change Currency button appearance. 2018-07-26 13:09:16 -07:00
Sebastiaan Pasma
b2ed16bf21
mobile support for send/receive buttons and some refactors to fix the navigation flow. 2018-07-26 19:38:29 +02:00
Sebastiaan Pasma
d87c2e65f7
Wallet buttons max width + Receive in viewing wallet. 2018-07-26 15:04:42 +02:00
Sam Cheng Hung
2492a405a1 Adds fee-summary bar, adds amount directive, adds support for fee-summary overlapping with content on scrollable small screens 2018-07-26 14:29:53 +08:00
Brendon Duncan
507fb21862 Available funds. 2018-07-25 18:46:42 -07:00
Brendon Duncan
91daae9f7a Improved amount card layout. Darker background under card. 2018-07-25 18:19:21 -07:00
Brendon Duncan
e539f0e713 Space around amount, and added "Not Enough Funds" warning. 2018-07-25 17:32:07 -07:00
Brendon Duncan
decd0a123e Buttons on keypad have correct colour in new Enter Amount screen. 2018-07-25 16:43:45 -07:00
Sebastiaan Pasma
aff0dd3183
fixes for other cases, address to address + contacts + thirdParty stub 2018-07-25 17:25:38 +02:00
Sebastiaan Pasma
79d6b4d7ad
confirm screen: display address + back button logic in origin/destination screens 2018-07-25 16:05:07 +02:00
Sebastiaan Pasma
75edb62799
removed capitalized-class 2018-07-25 15:24:44 +02:00
Sebastiaan Pasma
d51ab2bf79
only change button color if it contains an address 2018-07-25 15:11:14 +02:00
Sebastiaan Pasma
b88329fbb3
removed unused vars + changes for wallet to wallet transfer 2018-07-25 15:07:15 +02:00
Sebastiaan Pasma
4093e2ba71
refactored the sendFlowController 2018-07-25 11:26:33 +02:00
Jean-Baptiste Dominguez
029ac7dd39 Fix the QRCode scan. 2018-07-25 16:26:06 +09:00
Jean-Baptiste Dominguez
bba85794ac BitAnalytics 0.2.1 with GA 2018-07-25 16:17:42 +09:00
Brendon Duncan
91dac0f54c Refactored Enter Amount controller to follow latest Angular 1 guidelines. 2018-07-24 12:37:51 -07:00
Sebastiaan Pasma
fd4adbfb57
wallet to wallet case worked out. Also fixed routes and some css 2018-07-24 14:24:22 +02:00
Sam Cheng Hung
4b18e4b1c3 Adds expand-content component, update various UI measurements 2018-07-24 15:27:21 +08:00
Sebastiaan Pasma
84ef395100
qr code added to request payment (and also working on smaller qrs, for iPhone 5/SE) 2018-07-24 07:36:03 +02:00
Brendon Duncan
7dd1d4048b Correction of typo in last commit. 2018-07-23 12:18:06 -07:00
Brendon Duncan
ac91282c13 Indicative change for view. 2018-07-23 12:02:04 -07:00
Sebastiaan Pasma
3604ee3c3c
routes, renames and flow 2018-07-23 16:58:32 +02:00
Sebastiaan Pasma
7aecd2306f
comments & show wallets 2018-07-23 14:48:25 +02:00
Sebastiaan Pasma
893dbe5c6f
"has no funds" case 2018-07-23 14:20:46 +02:00
Sebastiaan Pasma
1153830d05
custom amount screen 2018-07-20 10:41:09 +02:00
Sebastiaan Pasma
713bbf71ca
currency format service + remove bottom amount in request amount screen 2018-07-20 10:06:59 +02:00
Sam Cheng Hung
6efd338f87 Adds action-minor component 2018-07-20 15:56:39 +08:00
Brendon Duncan
da853bcbf6 Placeholders for buttons. 2018-07-20 18:15:25 +12:00
Sebastiaan Pasma
1d5e116fa9
spacing 2018-07-19 17:13:19 +02:00
Sebastiaan Pasma
66f8ac5a5a
Merge remote-tracking branch 'origin/wallet/task/416' into wallet/task/416 2018-07-19 17:11:43 +02:00
Sebastiaan Pasma
cb82aa7253
OSX clipboard bugfix 2018-07-19 17:11:24 +02:00
Sebastiaan Pasma
3952df6343
forked the cordova media plugin to remove unused permissions 2018-07-19 17:07:30 +02:00
Sebastiaan Pasma
c3cded5cb0
wallet to wallet (sub)title 2018-07-19 15:50:09 +02:00
Sebastiaan Pasma
a0b4f10ca9
reverted IDE spacings 2018-07-19 15:43:32 +02:00
Sebastiaan Pasma
00ca5cded6
uppercase pipes 2018-07-19 15:41:06 +02:00
Sebastiaan Pasma
95faffa769
remove bold font style 2018-07-19 15:30:29 +02:00
Sebastiaan Pasma
8ddfffd56b
amount on custom amount screen 2018-07-19 15:21:27 +02:00
Sam Cheng Hung
22e93b823c Adds address component 2018-07-19 20:21:58 +08:00
Sebastiaan Pasma
442f6ba4df
currency symbol 2018-07-19 13:20:38 +02:00
Sebastiaan Pasma
700d2c8a23
currency symbol 2018-07-19 13:19:56 +02:00
Sebastiaan Pasma
b1befb1e73
wallet Details buttons 2018-07-19 13:10:25 +02:00
Sam Cheng Hung
a2f6277e7e Added content-frame, item and ion-content components, added dummy wallet interfaces 2018-07-19 17:41:02 +08:00
Sebastiaan Pasma
54478a4848
translation + faster transition 2018-07-19 10:23:10 +02:00
Sebastiaan Pasma
4f4bee27f1
Options also translatable 2018-07-19 09:59:56 +02:00
Brendon Duncan
0a96ae0dbe Added $scope.isRequestingSpecifcAmount. 2018-07-19 17:06:53 +12:00
Brendon Duncan
0076ff26e6 Currency of available funds changes when the currency of the amount is changed. 2018-07-19 16:24:24 +12:00
Brendon Duncan
19bec8a09a Fixed update of available funds text. 2018-07-19 15:34:53 +12:00
Brendon Duncan
d2d1511e61 Added some additional validation checks on wallet status. 2018-07-19 13:03:29 +12:00
Brendon Duncan
9e7566b171 Removing log statements. 2018-07-19 12:58:17 +12:00
Brendon Duncan
61f1603bbf Added $scope.availableFunds. 2018-07-19 12:52:37 +12:00
Brendon Duncan
3cedfa5146 Added $scope.fundsAreInsufficient for triggering UI. 2018-07-19 12:19:08 +12:00
Sebastiaan Pasma
047171f38e
wallet selection stub 2018-07-18 16:48:57 +02:00
Sebastiaan Pasma
46906352e5
remove "add wallet" buttons 2018-07-18 16:47:15 +02:00
Sebastiaan Pasma
450b80b03f
send/receive buttons on walletDetails + currencySymbolService 2018-07-18 16:30:54 +02:00
Sebastiaan Pasma
b8bab036e6
wallet to wallet transfer views + css 2018-07-18 11:54:41 +02:00
Sebastiaan Pasma
8c124fba19
price display translation 2018-07-18 11:29:03 +02:00
Sam Cheng Hung
155ea281d8 Adds header component 2018-07-18 17:24:13 +08:00
Sam Cheng Hung
8a0575d238 Add empty view and controller for review transaction route 2018-07-18 16:41:52 +08:00
Brendon Duncan
3df2836081 Successful test with amountController, using beforeEnter. 2018-07-18 20:26:20 +12:00
Sebastiaan Pasma
8725adb959
sent-successful svg 2018-07-18 09:02:52 +02:00
Brendon Duncan
0db57f997a First successful test, instantiating an amountController. 2018-07-18 18:24:49 +12:00
Brendon Duncan
cc907251f7 Removing unused services, and making string translatable. 2018-07-18 17:20:59 +12:00
Brendon Duncan
afd560187e Merged translations.
# Conflicts:
#	i18n/po/template.pot
2018-07-18 11:01:31 +12:00
Brendon Duncan
19327f84f0 Merged wallet/sprint/20 into wallet/task/477. 2018-07-18 10:51:34 +12:00
Brendon Duncan
ef121f52fa Merged wallet/sprint20 into wallet/task/475.
# Conflicts:
#	src/js/services/bitcoincomService.js
2018-07-18 10:47:43 +12:00
Sebastiaan Pasma
a5a999958c
send/receive buttons on home page 2018-07-17 15:15:37 +02:00
Sebastiaan Pasma
6463d5df34
Merge branch 'wallet/sprint/20' into wallet/task/426 2018-07-17 13:41:09 +02:00
Sebastiaan Pasma
fb275d4b08
Merge branch 'wallet/sprint/19' into wallet/sprint/20 2018-07-17 13:39:58 +02:00
Sebastiaan Pasma
f7ca55906f
Merge remote-tracking branch 'origin/wallet/prod' into wallet/prod 2018-07-17 12:26:36 +02:00
Sebastiaan Pasma
8a1ae1ab9c
Merge remote-tracking branch 'origin/wallet/sprint/19' into wallet/dev 2018-07-17 12:22:08 +02:00
Sebastiaan Pasma
4aca23194d
Merge remote-tracking branch 'origin/wallet/task/401' into wallet/sprint/19 2018-07-17 12:18:46 +02:00
Jean-Baptiste Dominguez
76ed93a7dc
Merge pull request #223 from Bitcoin-com/wallet/dev
Wallet/dev Hotfix
2018-07-17 18:46:46 +09:00
Jean-Baptiste Dominguez
e70227c98a
Merge pull request #222 from Bitcoin-com/wallet/sprint/19
Wallet/sprint/19
2018-07-17 18:41:57 +09:00
Jean-Baptiste Dominguez
882d4f1e82
Merge pull request #221 from Bitcoin-com/wallet/task/416
Wallet/task/416 Hotfix
2018-07-17 18:40:11 +09:00
Jean-Baptiste Dominguez
36152edaae Merge branch 'wallet/task/416' of https://github.com/Bitcoin-com/Wallet into wallet/task/416 2018-07-17 18:38:06 +09:00
Jean-Baptiste Dominguez
e18e446eef => Unsupported uglify 2018-07-17 18:37:46 +09:00
Jean-Baptiste Dominguez
0166dfd501
Merge pull request #219 from Bitcoin-com/wallet/dev
Wallet/dev
2018-07-17 17:52:43 +09:00
Jean-Baptiste Dominguez
9b630547a2
Incremente version 2018-07-17 17:28:15 +09:00
Jean-Baptiste Dominguez
8338f3feb3
Merge pull request #218 from Bitcoin-com/wallet/sprint/19
Wallet/sprint/19
2018-07-17 17:26:34 +09:00
Brendon Duncan
4cbaef5af6
Merge pull request #217 from Bitcoin-com/wallet/task/416
Improvement - 416 - New Send Tab screen
2018-07-17 19:13:13 +12:00
Brendon Duncan
90fbf801d3 Removed unnecessary logic. 2018-07-17 19:10:33 +12:00
Jean-Baptiste Dominguez
255e3b85bb Fix wallet from 2018-07-17 16:01:37 +09:00
Jean-Baptiste Dominguez
b181854ca4 416 - ionicLoading 2018-07-17 14:40:43 +09:00
Jean-Baptiste Dominguez
6e8ec0b295 Add a loading popup 2018-07-17 14:20:45 +09:00
Jean-Baptiste Dominguez
8a7aeefc1c Fix multiple selections 2018-07-17 14:20:06 +09:00
Jean-Baptiste Dominguez
7459fcffd2 416 - Fix : Show the menu only if we are on the scan tab. 2018-07-17 13:43:47 +09:00
Jean-Baptiste Dominguez
7fa1cd1668 Fix contacts 2018-07-17 11:02:25 +09:00
Brendon Duncan
30b847322a Added wallet ready message to template. 2018-07-17 12:33:52 +12:00
Brendon Duncan
ee09085343 Services get the new translations. 2018-07-17 11:17:20 +12:00
Brendon Duncan
63d0ed39ad Made strings in Home tab translatable for "Explore Bitcoin.com", "Services", and "Community". 2018-07-17 11:00:33 +12:00
Brendon Duncan
9a0cfdbcfd
Merge pull request #215 from Bitcoin-com/wallet/task/474
474 - Link updated for Analytics
2018-07-17 10:36:46 +12:00
Sebastiaan Pasma
1871992303
Use native navigator clipboard over element data clipboard function 2018-07-16 17:42:15 +02:00
Sebastiaan Pasma
236a93d69d
share transaction after sending on mobile + share explorer url on desktop. 2018-07-16 17:21:15 +02:00
Jean-Baptiste Dominguez
a4f0f88766 Fix addressbookAdd 2018-07-16 15:52:33 +09:00
Brendon Duncan
85e910dc46 Make the Cash Games link work again. 2018-07-16 17:55:21 +12:00
Jean-Baptiste Dominguez
ea3cee4ebf 474 - Fix link 2018-07-16 14:40:02 +09:00
Jean-Baptiste Dominguez
8442248e96
Merge branch 'wallet/sprint/19' into wallet/task/416 2018-07-16 14:25:03 +09:00
Jean-Baptiste Dominguez
415b79c12e 474 - Fix os in the link 2018-07-16 14:20:40 +09:00
Brendon Duncan
7dea47eb42
Merge pull request #214 from Bitcoin-com/wallet/task/458
Wallet/task/458
2018-07-16 13:53:20 +12:00
Brendon Duncan
b46b719498 BitAnalytics with Firebase parameter name fix. 2018-07-16 12:40:17 +12:00
Brendon Duncan
ad64758883
Merge pull request #216 from Bitcoin-com/wallet/task/461
Improvement - 461 - Remove automatic address copying when opening Receive tab
2018-07-16 09:11:43 +12:00
Sebastiaan Pasma
00b4ee5849
wallet empty/no wallet fixes 2018-07-13 14:54:26 +02:00
Sebastiaan Pasma
d801e287fd
Only copy address to clipboard after click "generate new address" 2018-07-13 14:23:09 +02:00
Sebastiaan Pasma
358ae5842c
Clipboard empty message + translations 2018-07-13 14:16:15 +02:00
Sebastiaan Pasma
501e8ce738
Only show "from"-wallets with balance 2018-07-13 14:02:48 +02:00
Sebastiaan Pasma
c515a080e5
translations + fixed the tags for those 2018-07-13 13:01:30 +02:00
Sebastiaan Pasma
ca7cd44810
iPhone SE styles 2018-07-13 12:46:06 +02:00
Sebastiaan Pasma
02e22517cb
scrollable contacts fix 2018-07-13 11:44:24 +02:00
Brendon Duncan
04b5a5103e Fixed up last merge by removing feedbackService parameter. 2018-07-13 21:36:35 +12:00
Brendon Duncan
0bb4de9bd1 Merge sprint 19.
# Conflicts:
#	src/js/controllers/tab-home.js
2018-07-13 21:19:28 +12:00
Brendon Duncan
aed9657714 Removed extraneous .com in email subject line. 2018-07-13 21:02:57 +12:00
Jean-Baptiste Dominguez
63c64bce0e 474 - Link changed 2018-07-13 17:53:18 +09:00
Jean-Baptiste Dominguez
1150e843d7 474 - Link updated 2018-07-13 17:50:21 +09:00
Jean-Baptiste Dominguez
8abaf184aa 458 - Add Statistic 2018-07-13 17:19:31 +09:00
Jean-Baptiste Dominguez
4e1ddfe883 Integration BitAnalytics 2018-07-13 16:15:04 +09:00
Brendon Duncan
658c58c59f In Send screen, contacts positioned below buttons. 2018-07-13 17:50:50 +12:00
Brendon Duncan
2121155dd0 When pasting from clipboard using the button on send screen, the text now appears the first time. 2018-07-13 17:18:41 +12:00
Brendon Duncan
eff8442f69 "Show my address" button can now be clicked. 2018-07-13 15:36:34 +12:00
Brendon Duncan
e299422843 Shows "Empty case" send screen after sending all funds from wallets. 2018-07-13 15:03:57 +12:00
Sebastiaan Pasma
a3ef304e09
wallet to wallet back-button 2018-07-12 17:40:31 +02:00
Sebastiaan Pasma
554d40d08f
config variable 2018-07-12 15:25:42 +02:00
Sebastiaan Pasma
2e6ae9770e
Wallet to wallet flow 2018-07-12 15:25:11 +02:00
Sebastiaan Pasma
d8785f7928
remove hide titles 2018-07-11 17:34:32 +02:00
Sebastiaan Pasma
be32f53668
Wallet 2 wallet transfer 2018-07-11 17:31:58 +02:00
Sebastiaan Pasma
41a2a3c971
scrollable contact view + better quality contact icons 2018-07-11 14:36:22 +02:00
Sebastiaan Pasma
7cc806b00c
Filter contacts on "starting with" instead of "contains" and some refactors 2018-07-10 15:11:17 +02:00
Sebastiaan Pasma
c6571c98ff
Merge branch 'wallet/task/423' into wallet/task/416 2018-07-10 14:32:24 +02:00
Sebastiaan Pasma
e6da12c17e
tab-send 2018-07-10 14:27:51 +02:00
Sebastiaan Pasma
5070a0042c small refactor 2018-07-10 11:15:17 +02:00
Sebastiaan Pasma
39cb416c30 changed route and tab 2018-07-10 11:12:43 +02:00
Sebastiaan Pasma
af6ddce7fe renamed tab-send files 2018-07-10 11:11:11 +02:00
Sebastiaan Pasma
94e6dd7dac clipboard features 2018-07-10 11:08:03 +02:00
Sebastiaan Pasma
9a9ddbc413 Merge branch 'wallet/task/420' into wallet/task/416 2018-07-10 10:27:44 +02:00
Sebastiaan Pasma
658a91e9cc round gravatar 2018-07-10 09:54:49 +02:00
Jean-Baptiste Dominguez
a2bd6fc319 Init BitAnalytics 2018-07-10 16:39:30 +09:00
Sebastiaan Pasma
1ee95cf262 new send-tab 2018-07-09 18:22:11 +02:00
Jean-Baptiste Dominguez
bc326e84fd
Merge pull request #211 from Bitcoin-com/wallet/dev
Wallet/dev
2018-07-04 23:47:17 +09:00
Jean-Baptiste Dominguez
f4b4aaae27
Update appConfig.json 2018-07-04 23:46:23 +09:00
Jean-Baptiste Dominguez
1ef026181c
Merge pull request #210 from Bitcoin-com/wallet/sprint/18
Wallet/sprint/18
2018-07-04 23:40:52 +09:00
Sebastiaan Pasma
f60fbf3e3d
Merge pull request #209 from Bitcoin-com/wallet/task/436
Update a text
2018-07-04 16:39:50 +02:00
Jean-Baptiste Dominguez
aa9a457568 Update a text 2018-07-04 23:38:18 +09:00
Jean-Baptiste Dominguez
c2ebbbc4f3
Merge pull request #208 from Bitcoin-com/wallet/sprint/18
Wallet/sprint/18
2018-07-04 23:31:15 +09:00
Jean-Baptiste Dominguez
39232ce739 Update the translation 2018-07-04 18:28:41 +09:00
Sebastiaan Pasma
c033f39628
Merge pull request #207 from Bitcoin-com/wallet/task/412
Wallet/task/412
2018-07-04 11:27:25 +02:00
Jean-Baptiste Dominguez
cb08b2c612
Merge pull request #206 from Bitcoin-com/wallet/task/436
Update tab-home (remove a comment)
2018-07-04 18:10:09 +09:00
Sebastiaan Pasma
be39986e24 catch error fix 2018-07-04 11:07:33 +02:00
Sebastiaan Pasma
de32460fd7 bannerService fixes + some space for the loader 2018-07-04 11:05:31 +02:00
Jean-Baptiste Dominguez
bbe78ea4ca Updates 2018-07-04 17:17:39 +09:00
Jean-Baptiste Dominguez
4d3a63de51
Update tab-home (remove a comment) 2018-07-04 13:01:02 +09:00
Brendon Duncan
0b2a793f57
Merge pull request #205 from Bitcoin-com/wallet/task/381
Improvement - 381 - QR codes with BCH/BTC overlay. Scrolling fix.
2018-07-04 09:46:30 +12:00
Sebastiaan Pasma
6fcc08617e renaming qr overlay classes 2018-07-03 12:06:44 +02:00
Sebastiaan Pasma
4fb847b603 fix on qr-icon 2018-07-03 11:58:29 +02:00
Sebastiaan Pasma
1d5010de41 home view changes for bannerService 2018-07-03 11:38:22 +02:00
Sebastiaan Pasma
b10b6c54e9 bannerService 2018-07-03 11:37:20 +02:00
Jean-Baptiste Dominguez
6d4e203c09
Merge pull request #204 from Bitcoin-com/wallet/dev
Wallet/dev
2018-07-03 12:39:49 +09:00
Jean-Baptiste Dominguez
7c7ad63f7e
Update the release version : 4.12-rc2 2018-07-03 12:34:57 +09:00
Jean-Baptiste Dominguez
4a00e3594d
Merge pull request #203 from Bitcoin-com/wallet/sprint/18
Wallet/sprint/18
2018-07-03 12:28:25 +09:00
Jean-Baptiste Dominguez
a81f6214a8
Merge pull request #193 from Bitcoin-com/wallet/task/399
Bug - 399 - Send-sound on a transaction is played even if the iPhone mute-switch is on
2018-07-03 12:26:32 +09:00
Jean-Baptiste Dominguez
1d9efcca06
Merge branch 'wallet/sprint/18' into wallet/task/399 2018-07-03 12:17:56 +09:00
Jean-Baptiste Dominguez
da0ffde179 Brackets missing 2018-07-03 12:15:42 +09:00
Brendon Duncan
8c265e1b03
Merge pull request #202 from Bitcoin-com/wallet/task/419
Fix Android 4.4 (ArrayBuffer) by a shim
2018-07-03 14:37:54 +12:00
Jean-Baptiste Dominguez
0daf6d60d5
Merge pull request #184 from Bitcoin-com/wallet/task/392
Improvement 392 - Show debug messages in Chrome console
2018-07-03 11:34:09 +09:00
Jean-Baptiste Dominguez
d6222623e1
Merge pull request #198 from Bitcoin-com/wallet/task/409
Bug - 409 - "Generate new address" copies "bitcoincash:null" to the clipboard instead of a new address
2018-07-03 11:26:54 +09:00
Jean-Baptiste Dominguez
c5cabcd5bb Fix Android 4.4 (ArrayBuffer) by a shim 2018-07-03 11:23:43 +09:00
Jean-Baptiste Dominguez
14e25ad1b9
Merge pull request #176 from Bitcoin-com/wallet/task/363
Improvement 363 - Use "Alternative Currency" as primary display currency (Part 2)
2018-07-02 17:37:24 +09:00
Sebastiaan Pasma
6b20a01e25 remove protocolHandler, only apply on bitcoincash: + support legacy&bitpay address types 2018-07-02 10:34:32 +02:00
Brendon Duncan
8bc7bda6c7
Merge pull request #200 from Bitcoin-com/wallet/task/419
Wallet/task/419 in sprint 18
2018-07-02 18:57:23 +12:00
Jean-Baptiste Dominguez
bc641f1cec
Merge pull request #201 from Bitcoin-com/wallet/task/419
Wallet/task/419 in 363 for testing (fix the issue)
2018-07-02 15:21:33 +09:00
Jean-Baptiste Dominguez
aae69b65d4 Merge brendon 2018-07-02 15:06:33 +09:00
Brendon Duncan
2422efdb46 Bugfix for last commit. 2018-07-02 18:02:32 +12:00
Brendon Duncan
867063fc8f Handle first launch. 2018-07-02 17:57:51 +12:00
Jean-Baptiste Dominguez
eaaafbba6f Mistake case where there is not profile 2018-07-02 14:34:33 +09:00
Jean-Baptiste Dominguez
9224d40a65 Remove secure storage feature, postpone 2018-07-02 14:06:36 +09:00
Brendon Duncan
ccf2dd4586 Changes as requested by PR. 2018-07-02 11:20:34 +12:00
Sebastiaan Pasma
c63bc06c76 try catch on copy-to-clipboard 2018-07-01 23:35:06 +02:00
Sebastiaan Pasma
40d0e5b896 added protocol and use the new cashaddr instead of legacy 2018-06-29 15:24:11 +02:00
Sebastiaan Pasma
f89499047a Update sound to play on the screens they suppose to play only 2018-06-29 15:11:34 +02:00
Sebastiaan Pasma
62789cfa1c
Merge pull request #194 from Bitcoin-com/wallet/task/340
Bug - 340 - Scan screen - Denying and then allowing camera permissions cause screen to block
2018-06-29 13:50:20 +02:00
Sebastiaan Pasma
243f35c25d copy to clipboard 2018-06-28 14:16:33 +02:00
Sebastiaan Pasma
8006af279b clipboard service 2018-06-28 10:52:06 +02:00
Sebastiaan Pasma
71267a00c0 Generate new address outside copy-to-clipboard element 2018-06-27 17:11:23 +02:00
Sebastiaan Pasma
9396c7c97f Removed all references to the rating card & feedback 2018-06-27 16:43:09 +02:00
Sebastiaan Pasma
ecbab6a5b5 Fix double permission screen on Android 2018-06-26 13:01:24 +02:00
Sebastiaan Pasma
8bc76d2e21 Fix for camera permission bug after reactivating camera permission 2018-06-25 19:51:25 +02:00
Sebastiaan Pasma
e8f2f2d188 removed the route of the feedback form 2018-06-25 17:15:06 +02:00
Sebastiaan Pasma
5696a68029 Send mail instead of the Send Feedback screen. 2018-06-25 17:13:56 +02:00
Sebastiaan Pasma
06ab1d1062 - remove native audio plugin references
- soundService for playing sounds
- file naming changed on sound files
- Bug where sounds were playing when mute switch on iPhone was on
- added cordova media plugin (with support for a fix the found mute-switch bug)
- play all sounds to use the new soundService
2018-06-25 11:07:13 +02:00
Jean-Baptiste Dominguez
616a3f86c2
Merge pull request #192 from Bitcoin-com/wallet/task/335
Wallet/task/335
2018-06-25 16:29:54 +09:00
Jean-Baptiste Dominguez
53c95b0413
Merge branch 'wallet/sprint/18' into wallet/task/335 2018-06-25 16:05:17 +09:00
Jean-Baptiste Dominguez
e31ec2af3f 335 - Improvement - Update script commands 2018-06-25 12:56:18 +09:00
Jean-Baptiste Dominguez
8bb4563279 335 - Improvement - useless import grunt curl 2018-06-25 10:15:59 +09:00
Brendon Duncan
d8f154eb37
Merge pull request #189 from Bitcoin-com/wallet/task/371
Improvement 371 - Added Catalan and Russian translations, updated other languages.
2018-06-23 18:44:15 +12:00
Brendon Duncan
b6cf31dee1
Merge pull request #187 from Bitcoin-com/wallet/task/381
Improvement - 381 - QR codes with BCH/BTC overlay
2018-06-23 18:37:02 +12:00
Sebastiaan Pasma
5f2a60968b Renamed overlay images as they're not icons 2018-06-22 10:04:25 +02:00
Brendon Duncan
cabbe098f8
Merge pull request #175 from Bitcoin-com/wallet/task/378
Improvement - 378 - Dismiss "Received payment" screen
2018-06-22 18:08:58 +12:00
Brendon Duncan
f678c78839
Merge pull request #174 from Bitcoin-com/wallet/task/202
Improvement - 202 - Enable sound by default
2018-06-22 18:03:31 +12:00
Brendon Duncan
7b2467a793 Added Catalan and Russian translations. 2018-06-22 16:16:26 +12:00
Jean-Baptiste Dominguez
ce580fcff1 335 - improvement - Change a hard link for a relative link 2018-06-22 11:39:16 +09:00
Jean-Baptiste Dominguez
89ad8f46b4
Merge pull request #188 from Bitcoin-com/wallet/sprint/17
Upgrade the branch 335 from Wallet/sprint/17
2018-06-21 09:01:08 +02:00
Jean-Baptiste Dominguez
32ab2e2833 335 - Improvement - card edit in comment 2018-06-21 15:57:27 +09:00
Jean-Baptiste Dominguez
da54c4bd97 Merge branch 'wallet/task/335' of https://github.com/Bitcoin-com/Wallet into wallet/task/335 2018-06-21 15:56:55 +09:00
Jean-Baptiste Dominguez
0a419ac7c5 335 - Improvement - replace signature files 2018-06-21 15:56:45 +09:00
Jean-Baptiste Dominguez
58d4e9aa7f Merge branch 'wallet/task/335' of https://github.com/Bitcoin-com/Wallet into wallet/task/335 2018-06-21 10:18:30 +09:00
Jean-Baptiste Dominguez
a3a9c349c7 335 - Improvement - Move script's files. 2018-06-21 10:18:17 +09:00
Sebastiaan Pasma
bbf3700769 Always set showingPaymentReceived to false when entering tab 2018-06-20 14:24:37 +02:00
Sebastiaan Pasma
94dade8463 changed qr icons to include white border 2018-06-20 14:09:43 +02:00
Sebastiaan Pasma
1d383e800b
Merge pull request #186 from Bitcoin-com/wallet/task/384
Improvement 384 - New Wallet headers design
2018-06-20 13:50:51 +02:00
Brendon Duncan
4811a48759 More consistent spacing in wallet selector. 2018-06-20 20:22:54 +12:00
Brendon Duncan
4712b672ed More consistent spacing on home tab. 2018-06-20 20:20:48 +12:00
Brendon Duncan
ea07c70f72
Merge pull request #180 from Bitcoin-com/wallet/task/383
Bug - 383 - Disappearing keyboard due to the keyboard
2018-06-20 14:06:14 +12:00
Brendon Duncan
5af32e98d6
Merge pull request #183 from Bitcoin-com/wallet/task/376
Improvement - 376 - More Adjustments for iPhone X
2018-06-20 14:05:20 +12:00
Jean-Baptiste Dominguez
aed4e964cb Improvement 335 - Move files 2018-06-19 18:46:56 +02:00
Jean-Baptiste Dominguez
b627e14587 final:desktop 2018-06-19 18:29:04 +02:00
Jean-Baptiste Dominguez
1a28ae6c2b Improvement 335 - Automation desktop building by grunt 2018-06-19 18:25:05 +02:00
Sebastiaan Pasma
ced143b86f
Merge pull request #181 from Bitcoin-com/wallet/task/384
Improvement 384 - New Wallet headers design
2018-06-19 16:32:11 +02:00
Sebastiaan Pasma
f2cad11153
Merge pull request #185 from Bitcoin-com/wallet/task/393
Improvement 393 - Open in Chrome when serving Wallet during development
2018-06-19 15:55:56 +02:00
Sebastiaan Pasma
fd312be7c7 QR-code icons + class update + sass update 2018-06-19 15:23:59 +02:00
Brendon Duncan
06adfc5f44
Merge pull request #178 from Bitcoin-com/wallet/task/379
Improvement - 379 - Coin sounds on "Payment received" screen
2018-06-19 21:52:39 +12:00
Brendon Duncan
05d65c9dbd Feature: Added start:chrome script. 2018-06-19 13:16:58 +12:00
Brendon Duncan
032cd5b174 Removed erroneous closing tag. 2018-06-19 06:33:06 +12:00
Brendon Duncan
09dc418f5e Remove log statements. 2018-06-19 06:23:21 +12:00
Brendon Duncan
c26c7ab8c3 Decorator for displaying debug messages as info. 2018-06-19 06:19:51 +12:00
Sebastiaan Pasma
0687da0e27 iPhone X fix for payment sent modal 2018-06-18 17:02:27 +02:00
Sebastiaan Pasma
51cfa75ffc Use the whenAvailable which is called onBeforeEnter so that changed configuration is also reloaded onEnter 2018-06-18 12:44:31 +02:00
Brendon Duncan
8231f85c67 Subtitles for coins on wallet selector in Receive screen. 2018-06-17 18:08:44 +12:00
Brendon Duncan
585775e88b Subtitles for coins on home screen. 2018-06-17 17:56:50 +12:00
Sebastiaan Pasma
e97843c9df Possible fix for hiding menu in some cases (keyboard-related) 2018-06-15 11:16:44 +02:00
Brendon Duncan
86be126e95 Adjust spacing on amount in confirm screen, to match original. 2018-06-15 15:43:37 +12:00
Brendon Duncan
901d202f85 Bugfix for when alternative string is not available in Network Fees alert. 2018-06-15 10:24:00 +12:00
Brendon Duncan
a9a05da07d Fee on confirm screen now shown primarily in fiat. 2018-06-15 10:19:46 +12:00
Brendon Duncan
fffbda2458 Matched amount formatting on Confirm screen, to previous formatting. 2018-06-15 10:14:21 +12:00
Brendon Duncan
e416deec44 Amount shown confirm screen is now primarily fiat. 2018-06-15 10:06:38 +12:00
Brendon Duncan
1e73eae4d2 Bugfix for undefined wallet status on send tab. 2018-06-15 10:04:15 +12:00
Brendon Duncan
143b39970b Removed some commented out code. 2018-06-14 22:18:17 +12:00
Brendon Duncan
a186e4d04f Display fiat on Network Fees popup. Display subcent amounts as '< 0.01'. 2018-06-14 22:16:25 +12:00
Sebastiaan Pasma
ec46b50262 Remove payment received screen after changing tabs 2018-06-13 18:34:32 +02:00
Sebastiaan Pasma
59bb7ee65f Enable sound by default 2018-06-13 16:33:06 +02:00
Sebastiaan Pasma
74f3e19545 ogg-file for Desktop as NWjs doesn't accept mp3 2018-06-13 16:29:01 +02:00
Sebastiaan Pasma
c0e691ec27 Received sound file + code to play when receiving 2018-06-13 16:27:37 +02:00
Sebastiaan Pasma
0d4cd77d4d config.xml to add native audio 2018-06-13 16:25:43 +02:00
Brendon Duncan
a6d2799510 Display fiat on Payment Received screen, according to preferences. 2018-06-13 15:56:39 +12:00
Sam Cheng Hung
099db37cb6 Merge branch 'wallet/dev' into wallet/prod 2018-06-12 13:11:23 +05:30
Sam Cheng Hung
4fb375187b Increment Android version 2018-06-12 13:11:04 +05:30
Sam Cheng Hung
27be28ba3e Merge branch 'wallet/dev' into wallet/prod 2018-06-12 11:36:50 +05:30
Sam Cheng Hung
f06f65a107 Merge branch 'wallet/sprint/17' into wallet/dev 2018-06-12 11:35:40 +05:30
Sam Cheng Hung
494b0d9429 Merge branch 'wallet/dev' into wallet/prod 2018-06-12 10:51:01 +05:30
Sam Cheng Hung
1d9bf3d7c5 Increment version 2018-06-12 10:49:55 +05:30
Sam Cheng Hung
9c26d1bec6
Merge pull request #172 from Bitcoin-com/wallet/hotfix/372
Wallet/hotfix/372
2018-06-12 10:44:30 +05:30
Sebastiaan Pasma
d22f489794
Merge pull request #160 from Bitcoin-com/wallet/task/354
iPhone X software home bar fixes
2018-06-11 18:05:11 +02:00
Sebastiaan Pasma
5da9f7c835
Merge pull request #165 from Bitcoin-com/wallet/task/369
Secure Storage on mobile devices
2018-06-11 14:14:10 +02:00
Sebastiaan Pasma
244144b7dd
Merge pull request #168 from Bitcoin-com/wallet/task/361
wallet/task/361: Changes icon design and color scheme for default wallet colors
2018-06-11 10:31:59 +02:00
Brendon Duncan
7209800b3c Tests for storing profile on mobile. 2018-06-11 14:21:15 +12:00
Brendon Duncan
149b956b7c Storing profile on desktop without using secure storage. 2018-06-11 14:09:39 +12:00
Brendon Duncan
c9c27e838c Corrected the name on some things. 2018-06-11 12:39:25 +12:00
Brendon Duncan
435c2cacd4 Desktop using local storage only. 2018-06-11 12:23:39 +12:00
Sam Cheng Hung
078f5bd61d Update: Changes shadow specification for wallet icons 2018-06-08 12:20:37 +05:30
Sam Cheng Hung
12990d7f71 Update: Changes icon design and color scheme for default wallet colors 2018-06-08 12:06:12 +05:30
Brendon Duncan
18581e9608 Test for secureStorageService on mobile and browser. 2018-06-08 16:24:15 +12:00
Brendon Duncan
f4642b1953 All tests for secure storage service on desktop. 2018-06-08 16:19:50 +12:00
Brendon Duncan
da9559433f First test for the secureStorageService. 2018-06-08 15:06:56 +12:00
Brendon Duncan
522a7cd3cf Migration tests for desktop. 2018-06-08 14:49:01 +12:00
Brendon Duncan
a09069463a Checking key names in tests. 2018-06-08 14:31:35 +12:00
Brendon Duncan
3aa9e70e64 All tests for profile migration. 2018-06-08 14:07:46 +12:00
Brendon Duncan
e52242bb1b Testing profile merge. 2018-06-08 13:38:02 +12:00
Brendon Duncan
02460bd3c5 Uses the current app version when needed, when checking the appVersion of a profile. 2018-06-08 08:23:28 +12:00
Brendon Duncan
0003604017 Better use of mocks. 2018-06-08 08:12:24 +12:00
Brendon Duncan
accfea64b0 Test for getting from old storage. 2018-06-07 21:47:49 +12:00
Brendon Duncan
84f9035159 One test passing on storageService. 2018-06-07 20:56:24 +12:00
Brendon Duncan
6eef985180 Merge from wallet/task/351. 2018-06-07 18:30:32 +12:00
Jean-Baptiste Dominguez
f9f8522119 Increment version 2018-06-06 17:56:50 +09:00
Jean-Baptiste Dominguez
d1b47bf020
Merge pull request #166 from Bitcoin-com/wallet/hotfix/372
Wallet/hotfix/372
2018-06-06 17:51:18 +09:00
Brendon Duncan
35da3a5151 One test. 2018-06-06 19:53:57 +12:00
Jean-Baptiste Dominguez
9b307558fe
Merge pull request #164 from Bitcoin-com/wallet/task/367
Migrate bitcoincashjs to bitcoincashjs-fork.
2018-06-06 15:44:55 +09:00
Jean-Baptiste Dominguez
2e8f277816
Merge pull request #163 from Bitcoin-com/wallet/task/368
Wallet/task/368
2018-06-06 15:43:10 +09:00
Sebastiaan Pasma
6c6d90ebfe Cleaner way without redundant code 2018-06-05 11:15:33 +02:00
Brendon Duncan
16b5054ea2 Now including app version is profile. 2018-06-05 11:34:14 +12:00
Sebastiaan Pasma
1e1f5deb2a iOS 9.3 fix 2018-06-04 21:37:36 +02:00
Sebastiaan Pasma
ddbc969de2 Merge remote-tracking branch 'origin/wallet/sprint/17' into wallet/sprint/17 2018-06-04 21:04:02 +02:00
Brendon Duncan
cc45e91680 Covered all the migration cases. 2018-06-04 20:23:01 +12:00
Jean-Baptiste Dominguez
efd5ecac58
Merge pull request #161 from Bitcoin-com/wallet/sprint/17
Update 354
2018-06-04 14:40:31 +09:00
Jean-Baptiste Dominguez
437bd77ba4
Merge pull request #153 from Bitcoin-com/wallet/task/358
Improvement - 358 - Workflow camera permission
2018-06-04 14:30:52 +09:00
Brendon Duncan
afe433d909 Starting to migrate profile storage. 2018-06-04 15:31:51 +12:00
Brendon Duncan
adf7115c9c Merging profiles. 2018-06-04 14:38:15 +12:00
Brendon Duncan
3aa9bef803 The localStorageService now returns errors when they happen. 2018-06-04 14:37:54 +12:00
Brendon Duncan
4109d4743f Loading profiles from all sources, in preparation for merge. 2018-06-04 09:47:02 +12:00
Jean-Baptiste Dominguez
a1c09fe010 Migrate bitcoincashjs to bitcoincashjs-fork. 2018-06-01 17:42:29 +09:00
Brendon Duncan
4ba821e983
Merge pull request #158 from Bitcoin-com/wallet/task/365
Wallet/task/365. JB indicated the code review will be performed when we merge the main 351 branch.
2018-06-01 18:04:32 +12:00
Brendon Duncan
90d2e13456 Merge commit 'cc2f5f6a14' into wallet/task/365
# Conflicts:
#	app-template/config-template.xml
#	src/js/services/storageService.js
2018-06-01 15:33:09 +12:00
Brendon Duncan
8d94a244bc Removed some debug messages. 2018-06-01 15:25:08 +12:00
Brendon Duncan
c5121afd7c Placeholder desktopSecureStorageService. 2018-06-01 15:04:52 +12:00
Brendon Duncan
f483fd81d8 Removed deleteProfile() as it is not used. 2018-06-01 11:53:04 +12:00
Brendon Duncan
17685dd810 Fixed some issues after the refactor. 2018-06-01 10:42:38 +12:00
Brendon Duncan
aaad6a1b4a Refactored to have the mobile and desktop secure storage contained with a more generic secure storage service. 2018-06-01 10:19:26 +12:00
Brendon Duncan
fdc9a8c37b Tidy up. 2018-06-01 09:31:14 +12:00
Sebastiaan Pasma
b20f670953 iPhone X fixes 2018-05-31 15:36:17 +02:00
Brendon Duncan
4e6eb3295d Now works on Android too. 2018-05-31 18:08:04 +12:00
Brendon Duncan
90d321033b Working pretty roughly on iOS with cordova-plugin-secure-storage. 2018-05-31 17:53:58 +12:00
Jean-Baptiste Dominguez
385e26dc3c
Merge pull request #154 from Bitcoin-com/wallet/prod
Wallet/prod
2018-05-30 14:16:33 +09:00
Brendon Duncan
cc2f5f6a14 Rudimentarily working with getting and setting the profile in the Keychain on iOS. 2018-05-30 16:28:32 +12:00
Jean-Baptiste Dominguez
dae994007e Improvement - 335 - Automation build macos 2018-05-29 18:18:14 +09:00
Jean-Baptiste Dominguez
13cc248c1d Improvement - 335 - update macos script 2018-05-29 10:23:27 +09:00
Jean-Baptiste Dominguez
b24319128f Improvement - 335 - Automation 2018-05-29 10:21:39 +09:00
Sebastiaan Pasma
edc398015a
Merge branch 'wallet/sprint/17' into wallet/task/358 2018-05-28 13:55:31 +02:00
Sebastiaan Pasma
4c4c213786 Merge remote-tracking branch 'origin/wallet/sprint/17' into wallet/sprint/17
# Conflicts:
#	src/js/controllers/tab-scan.js
2018-05-28 13:48:26 +02:00
Sebastiaan Pasma
a0b0f1a30b Check if permission has been granted, if so, activate the camera 2018-05-28 10:52:31 +02:00
Jean-Baptiste Dominguez
fff89cfe62
Merge pull request #152 from Bitcoin-com/wallet/sprint/17
Update my task branch
2018-05-28 15:09:37 +09:00
Jean-Baptiste Dominguez
a48eb19a02
Merge pull request #149 from Bitcoin-com/wallet/dev
Merge wallet/dev for the rc-1
2018-05-25 19:02:55 +09:00
Jean-Baptiste Dominguez
63c76fe13e Update version and show rc-beta 2018-05-25 18:15:02 +09:00
Jean-Baptiste Dominguez
e9e3ee7ddc
Merge pull request #147 from Bitcoin-com/wallet/sprint/16
Wallet/sprint/16
2018-05-25 14:13:56 +09:00
Sam Cheng Hung
7588307f77
Merge pull request #146 from Bitcoin-com/wallet/task/356
Fix - 356 - Remove vibration
2018-05-25 11:37:43 +08:00
Jean-Baptiste Dominguez
2e7d1c2cc8 Fix - 356 - Remove vibration 2018-05-25 12:14:49 +09:00
Jean-Baptiste Dominguez
ae38e6efbf
Merge pull request #144 from Bitcoin-com/wallet/task/357
Wallet/task/357
2018-05-25 11:55:36 +09:00
Jean-Baptiste Dominguez
706ba298fb
Merge pull request #145 from Bitcoin-com/wallet/task/319
Wallet/task/319
2018-05-25 11:50:30 +09:00
Jean-Baptiste Dominguez
16550d3b9a
Remove parenthesis 2018-05-25 11:50:00 +09:00
Jean-Baptiste Dominguez
a1e321a764
Remove parenthesis 2018-05-25 11:49:34 +09:00
Jean-Baptiste Dominguez
9f1223fd94
Remove console.log 2018-05-25 11:40:57 +09:00
Brendon Duncan
576bb2098a Moved the fix for reading the QR code higher up the call stack, so it would only be used when needed. 2018-05-24 18:56:05 -07:00
Brendon Duncan
6ec9a3af68 Fix for reading QR code. 2018-05-24 18:43:14 -07:00
Brendon Duncan
e7e578f20c Manually reversing 2 commits. 2018-05-24 18:36:20 -07:00
Brendon Duncan
c3347931ef The wallet list in the Confirm screen nows displays balances according to the Price Display setting. 2018-05-24 15:54:47 -07:00
Brendon Duncan
e0511ccb53 Dislaying fiat amounts in Send tab, according to Price Display setting. 2018-05-24 15:29:59 -07:00
Brendon Duncan
05a8952f87 Displaying fiat amounts in wallet selector in Receive tab. 2018-05-24 14:36:51 -07:00
Brendon Duncan
e5734cf083 Wallet balance display on the Receive tab now adheres to the Price Display setting. 2018-05-24 11:54:58 -07:00
Jean-Baptiste Dominguez
e6da8056da
Merge pull request #141 from Bitcoin-com/wallet/task/347
Adds faucet link
2018-05-24 21:39:02 +09:00
Sam Cheng Hung
170a7f9c6e
Merge pull request #142 from Bitcoin-com/wallet/task/346
Fix - 346 - Move the card bitcoin store
2018-05-24 16:38:45 +08:00
Sam Cheng Hung
73944ea126 Moves faucet link to the bottom, update buy.bitcoin.com icon style 2018-05-24 16:35:37 +08:00
Jean-Baptiste Dominguez
6f4302e0f7 Fix - 346 - Move the card bitcoin store 2018-05-24 17:33:03 +09:00
Sam Cheng Hung
e03aab0962 Adds faucet link 2018-05-24 14:57:34 +08:00
Jean-Baptiste Dominguez
9b3520aa37 Merge branch 'wallet/task/335' of https://github.com/Bitcoin-com/Wallet into wallet/task/335 2018-05-24 15:33:28 +09:00
Jean-Baptiste Dominguez
db44589d8b Fix - 355 - Consistency with the app name + Gruntfile PList MacOS app 2018-05-24 15:33:09 +09:00
Jean-Baptiste Dominguez
e6683a2eed
Merge pull request #140 from Bitcoin-com/wallet/sprint/16
Get last updates
2018-05-24 15:30:37 +09:00
Jean-Baptiste Dominguez
f87c43de20
Merge pull request #139 from Bitcoin-com/wallet/task/355
Improvement - 355 - Use External Link Service
2018-05-24 14:41:32 +09:00
Jean-Baptiste Dominguez
8f5f01eea1
Merge pull request #137 from Bitcoin-com/wallet/task/346
Store banner on Home tab
2018-05-24 12:10:12 +09:00
Brendon Duncan
429e9c8446 In Recent Transactions it displays the crypto amount if the fiat display setting is selected but the fiat amount is not ready yet. 2018-05-23 18:04:42 -07:00
Sebastiaan Pasma
7643ea02cb Use External Link Service 2018-05-23 11:35:19 +02:00
Sebastiaan Pasma
af5a843e8a Use externalLinkService 2018-05-23 11:16:10 +02:00
Jean-Baptiste Dominguez
a0462a1e1e
Merge pull request #136 from davidshares/master
Fixing two links
2018-05-23 14:54:20 +09:00
Sam Cheng Hung
c83a9be4d8
Merge pull request #132 from Bitcoin-com/wallet/task/349
Improvement - 349 - Change text
2018-05-23 13:47:08 +08:00
Jean-Baptiste Dominguez
2906179632
Merge pull request #138 from Bitcoin-com/wallet/task/347
Updated Explore, Services and Community icon styles
2018-05-23 14:41:58 +09:00
Jean-Baptiste Dominguez
4319bfa82a
Merge pull request #134 from Bitcoin-com/wallet/task/348
Bug - 348 - Tapping ↻ on the "Wallet Service URL" screen will change it to a wrong URL.
2018-05-23 12:49:57 +09:00
Sam Cheng Hung
dfbbb3203d Updated Explore, Services and Community icon styles 2018-05-23 10:44:03 +08:00
Brendon Duncan
e4d5100753 Initial change for displaying fiat in "Recent Transactions". Does not yet display loading UI. 2018-05-22 19:29:57 -07:00
Sebastiaan Pasma
082686def6 346 - Bitcoin.com Store banner on Home tab 2018-05-22 17:43:12 +02:00
David Shares
0dc41bd5a5
Fixing link 2018-05-22 11:16:37 -04:00
David Shares
fa17d64391
Fixing link 2018-05-22 11:14:44 -04:00
Jean-Baptiste Dominguez
faa4038f9d
Merge pull request #126 from Bitcoin-com/wallet/task/332
Wallet/task/332
2018-05-22 18:30:52 +09:00
Jean-Baptiste Dominguez
8930f9a53a Fix - 332 - Fix the both script. 2018-05-22 17:23:03 +09:00
Sebastiaan Pasma
6eaf243e6e Also fixed for aliases 'prod' and 'production' 2018-05-22 09:54:56 +02:00
Sebastiaan Pasma
4e83d09f47 Bug - 348 - Tapping ↻ on the "Wallet Service URL" screen will change it to a wrong URL. 2018-05-22 09:43:39 +02:00
Jean-Baptiste Dominguez
953a465606
Merge pull request #131 from Bitcoin-com/wallet/task/324
Wallet/task/324
2018-05-22 12:16:41 +09:00
Sam Cheng Hung
68a6e04224
Merge pull request #130 from Bitcoin-com/wallet/task/339
Improvement - 339 - "Payment received" screen is skipped after first transaction
2018-05-22 10:40:04 +08:00
Jean-Baptiste Dominguez
c5ae87e898 Fix - 339 - receive is executed by an event out of angular, apply. 2018-05-22 11:27:10 +09:00
Brendon Duncan
789e557c4e Whitespace only change: Corrected the tab size to 2 spaces in tab-home.html. 2018-05-21 11:31:01 -07:00
Brendon Duncan
441ab13006 Fixed up position of close 'x' on narrow screens like iPhone SE. 2018-05-21 11:27:05 -07:00
Brendon Duncan
7cc73405c4 Merge commit '9a3e0fdb06' into wallet/task/324 2018-05-21 09:22:56 -07:00
Sebastiaan Pasma
56a59093ee Improvement - 339 - "Payment received" screen is skipped after first transaction 2018-05-21 17:37:21 +02:00
Sebastiaan Pasma
9a3e0fdb06
Merge pull request #129 from Bitcoin-com/wallet/task/337
Fix - 337 - Fix error for browser version
2018-05-21 16:08:38 +02:00
Jean-Baptiste Dominguez
a2e1bd3a1e Fix - 337 - Fix error for browser version 2018-05-21 23:01:29 +09:00
Jean-Baptiste Dominguez
90af002a5f Improvement - 349 - Change text 2018-05-21 18:51:22 +09:00
Jean-Baptiste Dominguez
2be15e98b6
Merge pull request #122 from Bitcoin-com/wallet/task/337
Improvement - 337 - Small fix: change color of the Android status bar
2018-05-21 16:28:50 +09:00
Jean-Baptiste Dominguez
630dadda48 Fix - 337 - Consistent StatusBar 2018-05-21 16:24:25 +09:00
Jean-Baptiste Dominguez
ad1431dd68
Merge pull request #128 from Bitcoin-com/wallet/task/345
Update: Adds resolution strategy for android support library version …
2018-05-21 15:20:04 +09:00
Sam Cheng Hung
2e92a74ace Fix tabs 2018-05-21 12:56:33 +08:00
Sam Cheng Hung
d8950ead73 Update: Adds resolution strategy for android support library version number 2018-05-21 12:52:44 +08:00
Sam Cheng Hung
1c2ced2366
Merge pull request #127 from Bitcoin-com/wallet/task/344
Fix - 344 - Add comma like first character
2018-05-21 11:45:52 +08:00
Jean-Baptiste Dominguez
90ef40d523 Fix - 344 - Add comma like first character 2018-05-21 12:31:59 +09:00
Brendon Duncan
d63b76d3c0 Title at the top of the card, on the same line as the cross icon for closing. 2018-05-18 21:00:46 +12:00
Jean-Baptiste Dominguez
ff709da290
Merge pull request #121 from Bitcoin-com/wallet/task/322
Improvement - 322 - "Search transactions" empty results case
2018-05-18 15:25:27 +09:00
Jean-Baptiste Dominguez
397b782017
Merge branch 'wallet/sprint/16' into wallet/task/322 2018-05-18 15:25:15 +09:00
Jean-Baptiste Dominguez
09566af448 Fix - 322 - Fix >= -> === 2018-05-18 14:21:38 +09:00
Jean-Baptiste Dominguez
cba937eebc Fix - 322 - *lengh* -> *length* 2018-05-18 11:50:58 +09:00
Brendon Duncan
38a4531d60 The deletion of untranslated .po files now works again. Removing zh-HK regardless as we already have zh-CN and the app uses 2-character locales. Also, zh-HK did not contain any translations. 2018-05-18 13:04:50 +12:00
Jean-Baptiste Dominguez
323c3c2219
Merge pull request #120 from Bitcoin-com/wallet/task/321
Improvement - 321 - "Search transactions" doesn't work with BCH prefix
2018-05-17 22:52:58 +09:00
Jean-Baptiste Dominguez
01b1c6753f Fix - 321 - Keep only the fetching in the outputs 2018-05-17 20:16:41 +09:00
Jean-Baptiste Dominguez
f7e090cd20 Fix - 321 - Forgot a condition to check the translation 2018-05-17 19:37:18 +09:00
Jean-Baptiste Dominguez
cdb9b54b58 Fix - 321 - Add the three addresses (legacy+bitpay+bch) in the searchable string 2018-05-17 19:30:06 +09:00
Jean-Baptiste Dominguez
ce7d9ba234
Merge pull request #123 from Bitcoin-com/wallet/task/338
Improvement - 338 - Allow users to copy the amounts in the Send-screen
2018-05-17 17:24:34 +09:00
Jean-Baptiste Dominguez
8278ed62c9 Fix - 335 - new app.icns orange 2018-05-17 16:34:30 +09:00
Brendon Duncan
57ac43c7fd Clean up. 2018-05-17 18:47:11 +12:00
Brendon Duncan
b6e767b5f4 crowdin_download.js now works for the strings. It no longer attempts to do anything with the app store description or update info, since they are not in crowdin. 2018-05-17 18:32:45 +12:00
Sebastiaan Pasma
aa8668b82e Improvement - 338 - Allow users to copy the amounts in the Send-screen 2018-05-16 15:24:25 +02:00
Sebastiaan Pasma
cc94e1c630 Change back color when moving back from wallet detail view to home screen. 2018-05-16 14:22:37 +02:00
Sebastiaan Pasma
f03560312b A little more compact 2018-05-16 14:09:35 +02:00
Sebastiaan Pasma
38d86f6524 Improvement - 337 - Small fix for Android Status Bar Color 2018-05-16 14:07:01 +02:00
Sebastiaan Pasma
31f50ad0cb Fixes for CashAddr, includes validation of address, adds cashaddr to search string next to legacy address 2018-05-16 13:50:25 +02:00
Sebastiaan Pasma
a915570df3 Improvement - 322 - "Search transactions" empty results case 2018-05-16 12:11:41 +02:00
Jean-Baptiste Dominguez
a9fe060587
Merge pull request #28 from MetaiR/patch-1
Update README.md
Thanks.
2018-05-16 15:09:36 +09:00
Sam Cheng Hung
12f021979f
Merge pull request #115 from Bitcoin-com/wallet/task/324
Improvement - 324 - Remove "Bitcoin Core Wallet" toggle entirely.
2018-05-16 13:57:05 +08:00
Jean-Baptiste Dominguez
ef53a19e00
Merge pull request #118 from Bitcoin-com/wallet/task/205
Improvement - 205 - Desktop clients should open websites in a browser…
2018-05-16 14:43:45 +09:00
Sam Cheng Hung
25a0582bc2
Merge pull request #119 from Bitcoin-com/wallet/task/320
Improvement - 320 - Remove red notification bubble from "Recent Transactions" module
2018-05-16 13:12:15 +08:00
Brendon Duncan
a2c5d71a83 Changed Copay reference in crowdin script to Bitcoin.com Wallet. 2018-05-16 17:11:42 +12:00
Brendon Duncan
d909125fb8 Removed email address of last translator for privacy, as that is what the old script does. 2018-05-16 17:10:28 +12:00
Brendon Duncan
1d9c4cc8b0 Truncated the language codes of the new files, to be consistent with what else is done in the application, so that they are picked up and displayed. 2018-05-16 16:59:00 +12:00
Brendon Duncan
bca8eab2d4 The translation community link now goes to the Bitcoin.com Wallet's page rather than Copay. 2018-05-16 16:44:15 +12:00
Brendon Duncan
f4f1c96abc Added Czech and Persian translations, and added them to available languages. The available languages list is now more like alphabetical order. 2018-05-16 16:40:24 +12:00
Brendon Duncan
1469ba4768 Updated Crowdin identifier to "bitcoincom-wallet" for Crowndin scripts. 2018-05-16 16:38:33 +12:00
Sebastiaan Pasma
17ad7e8e74 Improvement - 322 - "Search transactions" empty results case 2018-05-15 15:07:31 +02:00
Sebastiaan Pasma
b65da992c7 Improvement - 321 - "Search transactions" doesn't work with BCH prefix 2018-05-15 09:58:05 +02:00
Brendon Duncan
6caa7c74b5 Improvement - 324 - Remove "Bitcoin Core Wallet" toggle entirely. 2018-05-15 17:07:50 +12:00
Sebastiaan Pasma
814e818380 Improvement - 320 - Remove red notification bubble from "Recent Transactions" module 2018-05-14 16:01:09 +02:00
Sebastiaan Pasma
8324b18b81 Improvement - 205 - Desktop clients should open websites in a browser, not an app webview. (OSX/Win/Linux) 2018-05-14 13:12:41 +02:00
Jean-Baptiste Dominguez
58ab183078 remove branch master-wallet 2018-05-14 13:55:58 +09:00
Seyed Ali Roshan
5f292b79a4
Update README.md 2017-12-10 18:43:03 +03:30
260 changed files with 49102 additions and 10263 deletions

14
.vscode/launch.json vendored Normal file
View 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"
}
]
}

View file

@ -11,8 +11,29 @@ module.exports = function(grunt) {
appConfig: {
command: 'node ./util/buildAppConfig.js'
},
externalServices: {
command: 'node ./util/buildExternalServices.js'
android_studio: {
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: {
command: 'rm -Rf bower_components node_modules'
@ -20,14 +41,41 @@ module.exports = function(grunt) {
cordovaclean: {
command: 'make -C cordova clean'
},
macos: {
command: 'sh webkitbuilds/build-macos.sh sign'
},
coveralls: {
command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js'
},
chrome: {
command: 'make -C chrome-app '
create_dmg_dist: {
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: {
command: 'make -C cordova wp-init',
@ -35,40 +83,9 @@ module.exports = function(grunt) {
wpcopy: {
command: 'make -C cordova wp-copy',
},
iosdebug: {
command: 'npm run build:ios',
},
ios: {
command: 'npm run build:ios-release',
},
xcode: {
command: 'npm run open:ios',
},
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/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/<%= pkg.title %>-linux.zip ; gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>.exe.sig --detach-sig webkitbuilds/<%= pkg.title %>.exe'
},
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'
},
command: 'open platforms/ios/*.xcodeproj',
}
},
watch: {
options: {
@ -124,6 +141,7 @@ module.exports = function(grunt) {
},
angular: {
src: [
'src/shim/shim.js',
'bower_components/qrcode-generator/js/qrcode.js',
'bower_components/qrcode-generator/js/qrcode_UTF8.js',
'bower_components/moment/min/moment-with-locales.js',
@ -148,15 +166,33 @@ module.exports = function(grunt) {
],
dest: 'www/lib/bitcoin-cash-js.js'
},
bitanalytics: {
src: [
'bitanalytics/bitanalytics.js'
],
dest: 'www/lib/bitanalytics.js'
},
js: {
src: [
'src/js/app.js',
'src/js/routes.js',
'src/js/decorators/*.js',
'src/js/directives/*.js',
'!src/js/directives/*.spec.js',
'src/js/filters/*.js',
'!src/js/filters/*.spec.js',
'src/js/models/*.js',
'!src/js/models/*.spec.js',
'src/js/services/*.js',
'!src/js/services/*.spec.js',
'src/js/controllers/**/*.js',
'!src/js/controllers/**/*.spec.js',
'src/js/translations.js',
'src/js/appConfig.js',
'src/js/externalServices.js',
@ -177,7 +213,8 @@ module.exports = function(grunt) {
files: {
'www/js/app.js': ['www/js/app.js'],
'www/lib/angular-components.js': ['www/lib/angular-components.js'],
'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js']
'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js'],
'www/lib/bitanalytics.js': ['www/lib/bitanalytics.js']
}
}
},
@ -200,7 +237,7 @@ module.exports = function(grunt) {
module: 'copayApp'
},
files: {
'src/js/translations.js': ['i18n/po/*.po']
'src/js/translations.js': ['i18n/po/**/*.po']
}
},
},
@ -222,38 +259,78 @@ module.exports = function(grunt) {
expand: true,
cwd: 'webkitbuilds/',
src: ['.desktop', '../www/img/app/favicon.ico', '../resources/<%= pkg.name %>/linux/512x512.png'],
dest: 'webkitbuilds/<%= pkg.title %>/linux64/',
dest: 'webkitbuilds/others/<%= pkg.title %>/linux64/',
flatten: true,
filter: 'isFile'
}],
}
},
nwjs: {
options: {
appName: '<%= pkg.title %>',
platforms: ['win64', 'osx64', 'linux64'],
buildDir: './webkitbuilds',
version: '0.19.5',
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
others: {
options: {
appName: '<%= pkg.nameCaseNoSpace %>',
platforms: ['win64', 'linux64'],
buildDir: './webkitbuilds/others',
version: '0.19.5',
exeIco: './www/img/app/logo.ico'
},
src: ['./package.json', './www/**/*']
},
dmg: {
options: {
appName: '<%= pkg.nameCaseNoSpace %>',
platforms: ['osx64'],
buildDir: './webkitbuilds/dmg',
version: '0.19.5',
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleDisplayName': '<%= pkg.title %>',
'CFBundleShortVersionString': '<%= pkg.version %>',
'CFBundleVersion': '<%= pkg.androidVersion %>',
'LSApplicationCategoryType': 'public.app-category.finance',
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
},
src: ['./package.json', './www/**/*']
},
pkg: {
options: {
appName: '<%= pkg.title %>',
platforms: ['osx64'],
buildDir: './webkitbuilds/pkg',
version: '0.19.4',
macIcns: './resources/<%= pkg.name %>/mac/pkg/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleIdentifier': 'com.bitcoin.mwallet.mac',
'CFBundleDisplayName': '<%= pkg.title %>',
'CFBundleShortVersionString': '<%= pkg.version %>',
'CFBundleVersion': '<%= pkg.androidVersion %>',
'LSApplicationCategoryType': 'public.app-category.finance',
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
},
src: ['./package.json', './www/**/*']
},
src: ['./package.json', './www/**/*']
},
compress: {
linux: {
options: {
archive: './webkitbuilds/<%= pkg.title %>-linux.zip'
archive: './webkitbuilds/others/<%= pkg.title %>-linux.zip'
},
expand: true,
cwd: './webkitbuilds/<%= pkg.title %>/linux64/',
cwd: './webkitbuilds/others/<%= pkg.title %>/linux64/',
src: ['**/*'],
dest: '<%= pkg.title %>-linux/'
}
@ -272,20 +349,53 @@ module.exports = function(grunt) {
grunt.registerTask('default', ['nggettext_compile', 'exec:appConfig', 'exec:externalServices', 'browserify', 'sass', 'concat', 'copy:ionic_fonts', 'copy:ionic_js']);
grunt.registerTask('prod', ['default', 'uglify']);
grunt.registerTask('translate', ['nggettext_extract']);
grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']);
grunt.registerTask('osx', ['prod', 'nwjs', 'exec:macos', 'exec:osxsign']);
grunt.registerTask('osx-debug', ['default', 'nwjs']);
grunt.registerTask('chrome', ['default','exec:chrome']);
grunt.registerTask('wp', ['prod', 'exec:wp']);
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
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('android-debug', ['exec:androiddebug', 'exec:androidrun']);
grunt.registerTask('android', ['exec:android']);
grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']);
grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']);
// Build all
grunt.registerTask('build-app-release', ['build-mobile-release', 'build-desktop-release']);
/**
* 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
grunt.registerTask('build-desktop', ['build-desktop-others', 'build-desktop-osx-dmg', 'build-desktop-osx-pkg']);
// Build desktop win64 & linux64
grunt.registerTask('build-desktop-others', ['prod', 'nwjs:others', 'copy:linux', 'exec:create_others_dist']);
// Build desktop osx pkg
grunt.registerTask('build-desktop-osx-pkg', ['prod', 'exec:get_nwjs_for_pkg', 'nwjs:pkg', 'exec:create_pkg_dist']);
// Build desktop osx dmg
grunt.registerTask('build-desktop-osx-dmg', ['prod', 'nwjs:dmg', 'exec:create_dmg_dist']);
// Sign desktop
grunt.registerTask('sign-desktop', ['exec:sign_desktop_dist']);
// Release desktop
grunt.registerTask('build-desktop-release', ['build-desktop', 'sign-desktop']);
};

View file

@ -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 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.
@ -105,7 +126,7 @@ The desktop version of the Bitcoin.com wallet currently uses NW.js, an app runti
When NW.js is installed, run the `start:desktop` npm package script.
```sh
npm run apply:bitcoin.com
npm run apply:bitcoincom
npm run start:desktop
```
@ -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.
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
```sh
npm run clean-all
npm run apply:bitcoincom
npm run final:android
npm run build:android-release
```
### iOS
@ -128,7 +149,7 @@ npm run final:android
```sh
npm run clean-all
npm run apply:bitcoincom
npm run final:ios
npm run build:ios-release
```
### Desktop (Linux, macOS, and Windows)
@ -136,7 +157,7 @@ npm run final:ios
```sh
npm run clean-all
npm run apply:bitcoincom
npm run final:desktop
npm run build:desktop-release
```
## About The Bitcoin.com Wallet

View file

@ -11,7 +11,10 @@ var templates = {
'ionic.config.json': '/',
'.desktop': 'webkitbuilds/',
'setup-win.iss': 'webkitbuilds/',
'build-macos.sh': 'webkitbuilds/',
'create-dmg-dist.sh': 'webkitbuilds/',
'create-others-dist.sh': 'webkitbuilds/',
'create-pkg-dist.sh': 'webkitbuilds/',
'sign-desktop-dist.sh': 'webkitbuilds/',
'manifest.json': 'chrome-app/',
// 'bower.json': '/',
};

View file

@ -2,7 +2,7 @@
"packageName": "bitcoin.com",
"packageDescription": "Bitcoin.com Wallet",
"packageNameId": "com.bitcoin.mwallet",
"userVisibleName": "Bitcoin.com",
"userVisibleName": "Bitcoin.com Wallet",
"purposeLine": "Bitcoin.com Wallet",
"bundleName": "bitcoincom",
"appUri": "bitcoincom",
@ -18,14 +18,15 @@
"appDescription": "Bitcoin.com Wallet",
"winAppName": "BitcoinWallet",
"WindowsStoreIdentityName": "18C7659D.Bitcoin.com-SecureBitcoinWallet",
"WindowsStoreDisplayName": "Bitcoin.com - Secure Bitcoin Wallet",
"WindowsStoreDisplayName": "Bitcoin.com Wallet",
"wpPublisherId": "{31cdd08b-457c-413d-b440-f6665eec847d}",
"wpProductId": "{5381aa50-9069-11e4-84cc-293caf9cbdc8}",
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
"pushSenderId": "1036948132229",
"description": "A Secure Bitcoin Wallet",
"version": "4.10.1",
"androidVersion": "410100",
"version": "5.1.3",
"fullVersion": "5.1-rc2",
"androidVersion": "501003",
"_extraCSS": "",
"_enabledExtensions": {
"coinbase": false,

View file

@ -268,5 +268,33 @@ div.onboarding-topic {
display: block;
float: left;
max-height: 100%;
max-width: 100%;
max-width: 100%;
}
.bitpay-banner {
background: #1A3A8B;
padding: 10px;
box-shadow: 0px 5px 10px 0px #cccccc;
height: 5em;
}
.bitpay-logo {
display: block;
max-height: 100%;
width: 100%;
height: 4em;
}
.egifter-banner {
background: #1A3A8B;
padding: 10px;
box-shadow: 0px 5px 10px 0px #cccccc;
height: 5em;
text-align: center;
}
.egifter-logo {
max-height: 100%;
max-width: 100%;
height: 4em;
}

View file

@ -72,6 +72,9 @@
<plugin name="cordova-plugin-queries-schemes" spec="~0.1.5" />
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase.git" />
<plugin name="cordova-plugin-wkwebview-inputfocusfix" spec="https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix.git" />
<plugin name="cordova-plugin-media-fork" spec="~5.0.3">
<variable name="KEEP_AVAUDIOSESSION_ALWAYS_ACTIVE" value="NO" />
</plugin>
<!-- Supported Platforms -->
<engine name="ios" spec="~4.5.3" />
<engine name="android" spec="~6.3.0" />
@ -82,6 +85,12 @@
<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 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.png" width="60" height="60" />
<icon src="resources/*PACKAGENAME*/ios/icon/icon-60@2x.png" width="120" height="120" />
@ -99,6 +108,7 @@
<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@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@2x~iphone.png" width="640" height="960"/>

View file

@ -1,11 +1,5 @@
#!/bin/bash
SHOULD_SIGN=$1
if [ "$SHOULD_SIGN" ]
then
echo "Will sign the APP"
fi
# by Andy Maloney
# http://asmaloney.com/2013/07/howto/packaging-a-mac-os-x-application-using-a-dmg/
@ -16,21 +10,25 @@ if [ -d "$dir" ]; then
fi
# set up your app name, architecture, and background image file name
APP_NAME="*USERVISIBLENAME*"
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
rm dmg-background.tiff
ln -s ../resources/*PACKAGENAME*/mac/dmg-background.tiff dmg-background.tiff
ln -s ../resources/bitcoin.com/mac/dmg-background.tiff dmg-background.tiff
rm volume-icon.icns
ln -s ../resources/*PACKAGENAME*/mac/volume-icon.icns volume-icon.icns
ln -s ../resources/bitcoin.com/mac/volume-icon.icns volume-icon.icns
DMG_VOLUME_ICON="volume-icon.icns"
DMG_BACKGROUND_IMG="dmg-background.tiff"
PATH_NAME="${APP_NAME}/osx64/"
PATH_NAME="dmg/${APP_NAME}/osx64/"
# you should not need to change these
APP_EXE="${PATH_NAME}${APP_NAME}.app/Contents/MacOS/nwjs"
VOL_NAME="${APP_NAME}"
DMG_TMP="${VOL_NAME}-temp.dmg"
DMG_FINAL="${VOL_NAME}.dmg"
DMG_TMP="dmg/${VOL_NAME}-temp.dmg"
DMG_FINAL="dmg/${VOL_NAME}.dmg"
STAGING_DIR="tmp"
# Check the background image DPI and convert it if it isn't 72x72
@ -66,25 +64,6 @@ SIZE=250
if [ $? -ne 0 ]; then
echo "Error: Cannot compute size of staging dir"
exit
fi
# Sign Code (MATIAS)
if [ $SHOULD_SIGN ]
then
echo "Signing ${APP_NAME} DMG"
export IDENTITY="3rd Party Mac Developer Application: BitPay, Inc. (884JRH5R93)"
# not need for 'out of app store' distribution (?)
# export PARENT_PLIST=parent.plist
# export CHILD_PLIST=child.plist
export APP_PATH=${STAGING_DIR}/${APP_NAME}.app
codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Helper.app" && echo "Sign 1"
codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Framework.framework/Resources/app_mode_loader.app" && echo "Sign 2"
codesign --deep -s "${IDENTITY}" $APP_PATH && echo "Sign 3"
echo "Signing Done"
fi
# create the temp DMG file
@ -175,6 +154,14 @@ hdiutil detach "${DEVICE}"
echo "Creating compressed image"
hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
export DIST_PATH="dist"
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
cp -vR "${DMG_FINAL}" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
# clean up
rm -rf "${DMG_TMP}"
rm -rf "${STAGING_DIR}"

View file

@ -0,0 +1,54 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
# set up your app name, architecture, and background image file name
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
export APP_LINUX_PATH="others/${APP_NAME}/linux64"
export APP_WIN_PATH="others/${APP_NAME}/win64"
export DIST_PATH="dist"
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
##
# LINUX
echo "Building Linux..."
# Building package
cp -R $APP_LINUX_PATH bitcoin-com-wallet
tar -cvzf "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" bitcoin-com-wallet
# Clean
rm -R bitcoin-com-wallet
echo "Linux Done."
##
# WINDOWS
echo "Building Windows..."
# Building package
cp -R $APP_WIN_PATH bitcoin-com-wallet
zip -r "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" bitcoin-com-wallet
# Clean
rm -R bitcoin-com-wallet
echo "Windows Done."
echo "Done."
exit

View file

@ -0,0 +1,52 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
# set up your app name, architecture, and background image file name
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
rm entitlements-child.plist
ln -s ../resources/bitcoin.com/mac/pkg/entitlements-child.plist entitlements-child.plist
rm entitlements-parent.plist
ln -s ../resources/bitcoin.com/mac/pkg/entitlements-parent.plist entitlements-parent.plist
rm build.cfg
ln -s ../resources/bitcoin.com/mac/pkg/build.cfg build.cfg
rm build_mas.py
ln -s ../resources/bitcoin.com/mac/pkg/build_mas.py build_mas.py
echo "Signing ${APP_FULLNAME}"
export CURRENT_PATH=`pwd`
export APP_PATH="pkg/${APP_FULLNAME}/osx64/${APP_FULLNAME}"
export TMP_PATH="tmp"
export DIST_PATH="dist"
rm -rf $TMP_PATH
mkdir $TMP_PATH
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
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 "Done."
exit

View file

@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="css/chartist.css">
<link rel="stylesheet" type="text/css" href="css/bitcoin.com.css">
<link rel="stylesheet" type="text/css" href="css/icomoon.css">
<title>*USERVISIBLENAME* - *PURPOSELINE*</title>
<title>*USERVISIBLENAME*</title>
<link rel="shortcut icon" href="img/app/favicon.ico">
</head>
<body>
@ -31,6 +31,7 @@
<script src="lib/ionic.bundle.min.js"></script>
<script src="lib/angular-components.js"></script>
<script src="lib/bitcoin-cash-js.js"></script>
<script src="lib/bitanalytics.js"></script>
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script src="js/moment.min.js"></script>

View file

@ -3,6 +3,8 @@
"description": "*DESCRIPTION*",
"author": "BitPay",
"version": "*VERSION*",
"androidVersion": "*ANDROIDVERSION*",
"fullVersion": "*FULLVERSION*",
"keywords": [
"bitcoin",
"wallet",
@ -13,8 +15,9 @@
],
"main": "www/index.html",
"title": "*USERVISIBLENAME*",
"nameCaseNoSpace": "*NAMECASENOSPACE*",
"window": {
"title": "*USERVISIBLENAME* - *PURPOSELINE*",
"title": "*USERVISIBLENAME*",
"icon": "www/img/app/icon.png",
"toolbar": false,
"show": true,
@ -68,6 +71,8 @@
"grunt-angular-gettext": "^2.2.3",
"grunt-browserify": "^5.0.0",
"grunt-cli": "^1.2.0",
"grunt-curl": "^2.4.1",
"grunt-zip": "^0.17.1",
"grunt-contrib-compress": "^1.3.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-copy": "^1.0.0",
@ -79,52 +84,68 @@
"load-grunt-tasks": "^3.5.0",
"shelljs": "^0.3.0",
"android-versions": "^1.2.1",
"bitcoincashjs": "^0.1.7"
"bitcoincashjs-fork": "^1.0.3"
},
"scripts": {
"postinstall": "bower install",
"start": "npm run build:www && ionic serve --nolivereload --nogulp -s --address 0.0.0.0",
"start:ios": "npm run build:www && npm run build:ios && npm run open:ios",
"start:android": "npm run build:www && npm run build:android && npm run run:android",
"start:windows": "npm run build:www && npm run build:windows",
"start:desktop": "npm start",
"watch": "grunt watch",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare && cd ../ && ./fix-asn1.sh",
"build:app-release": "grunt build-app-release",
"build:mobile-release": "grunt build-mobile-release",
"build:desktop-release": "grunt build-desktop-release",
"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-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": "grunt desktop",
"build:osx": "grunt osx",
"open:ios": "open platforms/ios/*.xcodeproj",
"open:android": "open -a open -a /Applications/Android\\ Studio.app platforms/android",
"final:www": "npm run build:www-release",
"final:ios": "npm run final:www && npm run build:ios-release && npm run open:ios",
"final:android": "npm run final:www && npm run build:android-release && npm run sign:android && npm run run:android-release",
"final:windows": "npm run final:www && npm run build:windows-release",
"final:desktop": "npm run build:desktop && npm run build:osx",
"run:android": "cordova run android --device",
"run:android-release": "cordova run android --device --release",
"log:android": "adb logcat | grep chromium",
"sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../bitcoin-com-release-key.jks -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk bitcoin-com && $ANDROID_HOME/build-tools/27.0.1/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk",
"apply:copay": "npm i fs-extra && cd app-template && node apply.js copay && npm i && cordova prepare",
"apply:bitpay": "npm i fs-extra && cd app-template && node apply.js bitpay && npm i && cordova prepare",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare",
"test": "echo \"no package tests configured\"",
"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",
"clean-all": "git clean -dfx"
"watch": "grunt watch"
},
"devDependencies": {
"cordova": "^6.3.1",
"grunt": "^1.0.1",
"ionic": "^3.6.0",
"jasmine-core": "^3.1.0",
"karma": "^2.0.2",
"karma-chrome-launcher": "^2.2.0",
"karma-jasmine": "^1.1.2",
"trash-cli": "^1.4.0",
"lodash": "^4.17.4",
"pre-commit": "^1.1.3"
},
"pre-commit": "unstage-package"
}
}

View file

@ -0,0 +1,40 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
APP_PACKAGE=$1
APP_VERSION=$2
export DIST_PATH="dist"
##
# INIT GPG (YOU NEED THE PRIVATE KEY CONNECTED TO YOUR DESKTOP)
# gpg --card-edit
##
# LINUX
# Sig tar.gz
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz"
##
# WINDOWS
# Sig zip
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip"
##
# OSX
# Sig dmg
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
# Sig pkg
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"

7063
bitanalytics/bitanalytics.js Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
var bitcoinCashJsModule = angular.module('bitcoinCashJsModule', []);
var bchjs = require('../node_modules/bitcoincashjs');
var bchjs = require('../node_modules/bitcoincashjs-fork');
bitcoinCashJsModule.constant('MODULE_VERSION', '1.0.0');

View file

@ -24,6 +24,6 @@
},
"resolutions": {
"angular": "1.5.3",
"ionic": "1b7414faba"
"ionic": "eefba1331b"
}
}

11
fix-asn1.sh Executable file
View file

@ -0,0 +1,11 @@
#!/bin/bash
firstLine=`awk 'NR < 2 {print}' node_modules/asn1.js-rfc5280/index.js`
if [ "$firstLine" = "try {" ]; then
echo "var asn1 = require('asn1.js');" > node_modules/asn1.js-rfc5280/index.new.js
awk 'NR > 6 {print}' node_modules/asn1.js-rfc5280/index.js >> node_modules/asn1.js-rfc5280/index.new.js
rm node_modules/asn1.js-rfc5280/index.js
mv node_modules/asn1.js-rfc5280/index.new.js node_modules/asn1.js-rfc5280/index.js
echo "node_modules/asn1.js-rfc5280/index.js fixed"
fi

View file

@ -2,6 +2,8 @@
'use strict';
const blankOrEmptyTranslationRegex = /^\s*"\s*"$/
if (process.argv[2]) {
var no_build = (process.argv[2].toLowerCase() == '--nobuild')
if (no_build == false) {
@ -22,19 +24,7 @@ var path = require('path');
var https = require('https');
var AdmZip = require('adm-zip');
var crowdin_identifier = 'copay'
var local_file_name2 = path.join(__dirname, 'docs/appstore_en.txt')
var local_file_name3 = path.join(__dirname, 'docs/updateinfo_en.txt')
try {
fs.statSync(local_file_name2);
fs.statSync(local_file_name3);
}
catch (e) {
console.log('\n### ABORTING ### One of the following files does not exist:\n' + local_file_name2 + '\n' + local_file_name3);
process.exit(1);
}
var crowdin_identifier = 'bitcoincom-wallet'
try {
// obtain the crowdin api key
@ -60,105 +50,22 @@ if (no_build == false) { // Reminder: Any changes to the script below must also
'1. No changes since last translation build, or\n' +
'2. API limit of once per 30 minutes has not been waited.\n\n' +
'Since we can not guarantee that translations have been built properly, this script will end here.\n' +
'Log in to Copay\'s Crowdin Settings and click the "Build Project" button to assure it is built recently, and then run this ' +
'Log in to Bitcoin.com Wallet\'s Crowdin Settings and click the "Build Project" button to assure it is built recently, and then run this ' +
'script again with the --nobuild arg to download translations without checking if built.');
process.exit(1);
};
// Download most recent translations for all languages.
https.get('https://crowdin.com/download/project/' + crowdin_identifier + '.zip', function(res) {
var data = [], dataLen = 0;
res.on('data', function(chunk) {
data.push(chunk);
dataLen += chunk.length;
}).on('end', function() {
var buf = new Buffer(dataLen);
for (var i=0, len = data.length, pos = 0; i < len; i++) {
data[i].copy(buf, pos);
pos += data[i].length;
};
var zip = new AdmZip(buf);
zip.extractAllTo('./', true);
console.log('Done extracting ZIP file.');
var files = fs.readdirSync('./docs');
for (var i in files) {
debugger;
if (files[i].slice(0,9) == 'appstore_' && files[i].slice(-4) == '.txt' && files[i] != 'appstore_en.txt') {
var english_file = fs.readFileSync(local_file_name2, 'utf8');
var compare_file = fs.readFileSync(path.join(__dirname, 'docs/' + files[i]), 'utf8')
english_file = english_file.replace(/\r\n/g, '\n');
compare_file = compare_file.replace(/\r\n/g, '\n');
if (compare_file == english_file) {
fs.unlinkSync(path.join(__dirname, 'docs/' + files[i]));
};
};
if (files[i].slice(0,11) == 'updateinfo_' && files[i].slice(-4) == '.txt' && files[i] != 'updateinfo_en.txt') {
var english_file = fs.readFileSync(local_file_name3, 'utf8');
var compare_file = fs.readFileSync(path.join(__dirname, 'docs/' + files[i]), 'utf8')
english_file = english_file.replace(/\r\n/g, '\n');
compare_file = compare_file.replace(/\r\n/g, '\n');
if (compare_file == english_file) {
fs.unlinkSync(path.join(__dirname, 'docs/' + files[i]));
};
};
};
console.log('Cleaned out completely untranslated appstore docs.');
var files = fs.readdirSync('./po');
for (var i in files) {
if (files[i] != 'template.pot') {
var po_file = fs.readFileSync(path.join(__dirname, 'po/' + files[i]), 'utf8');
var po_array = po_file.split('\n');
for (var j in po_array) {
if (po_array[j].slice(0,5) == 'msgid') {
var source_text = po_array[j].slice(5);
} else if (po_array[j].slice(0,6) == 'msgstr') {
var translate_text = po_array[j].slice(6);
// if a line is not == English, it means there is translation. Keep this file.
if (source_text != translate_text) {
// erase email addresses of last translator for privacy
po_file = po_file.replace(/ <.+@.+\..+>/, '')
fs.writeFileSync(path.join(__dirname, 'po/' + files[i]), po_file);
// split the file into 3 parts, before locale, locale, and after locale.
var lang_pos = po_file.search('"Language: ') + 11;
var po_start = po_file.slice(0,lang_pos);
var po_locale = po_file.slice(lang_pos,lang_pos + 5);
var po_end = po_file.slice(lang_pos + 5);
// check for underscore, if it's there, only take the first 2 letters and reconstruct the po file.
if (po_locale.search('_') > 0) {
fs.writeFileSync(path.join(__dirname, 'po/' + files[i]), po_start + po_locale.slice(0,2) + po_end);
po_start = '';
po_locale = '';
po_end = '';
};
break;
};
};
if (j == po_array.length - 1) { // All strings are exactly identical to English. Delete po file.
fs.unlinkSync(path.join(__dirname, 'po/' + files[i]));
};
};
};
};
console.log('Cleaned out completely untranslated po files.');
});
});
downloadAllTranslationsAfterLastBuild();
});
}).on('error', function(e) {
console.log('Export Got error: ' + e.message);
});
} else { // Reminder: Any changes to the script below must also be made to the above and vice versa.
downloadAllTranslationsAfterLastBuild();
};
function downloadAllTranslationsAfterLastBuild () {
// Download most recent translations for all languages.
https.get('https://api.crowdin.com/api/project/' + crowdin_identifier + '/download/all.zip?key=' + crowdin_api_key, function(res) {
var data = [], dataLen = 0;
@ -172,77 +79,85 @@ if (no_build == false) { // Reminder: Any changes to the script below must also
data[i].copy(buf, pos);
pos += data[i].length;
};
var zip = new AdmZip(buf);
zip.extractAllTo('./', true);
console.log('Done extracting ZIP file.');
var files = fs.readdirSync('./docs');
for (var i in files) {
if (files[i].slice(0,9) == 'appstore_' && files[i].slice(-4) == '.txt' && files[i] != 'appstore_en.txt') {
var english_file = fs.readFileSync(local_file_name2, 'utf8');
var compare_file = fs.readFileSync(path.join(__dirname, 'docs/' + files[i]), 'utf8')
english_file = english_file.replace(/\r\n/g, '\n');
compare_file = compare_file.replace(/\r\n/g, '\n');
if (compare_file == english_file) {
fs.unlinkSync(path.join(__dirname, 'docs/' + files[i]));
};
};
if (files[i].slice(0,11) == 'updateinfo_' && files[i].slice(-4) == '.txt' && files[i] != 'updateinfo_en.txt') {
var english_file = fs.readFileSync(local_file_name3, 'utf8');
var compare_file = fs.readFileSync(path.join(__dirname, 'docs/' + files[i]), 'utf8')
english_file = english_file.replace(/\r\n/g, '\n');
compare_file = compare_file.replace(/\r\n/g, '\n');
if (compare_file == english_file) {
fs.unlinkSync(path.join(__dirname, 'docs/' + files[i]));
};
};
};
console.log('Cleaned out completely untranslated appstore docs.');
var files = fs.readdirSync('./po');
for (var i in files) {
if (files[i] != 'template.pot') {
var po_file = fs.readFileSync(path.join(__dirname, 'po/' + files[i]), 'utf8');
var po_array = po_file.split('\n');
for (var j in po_array) {
if (po_array[j].slice(0,5) == 'msgid') {
var source_text = po_array[j].slice(5);
} else if (po_array[j].slice(0,6) == 'msgstr') {
var translate_text = po_array[j].slice(6);
// if a line is not == English, it means there is translation. Keep this file.
if (source_text != translate_text) {
// erase email addresses of last translator for privacy
po_file = po_file.replace(/ <.+@.+\..+>/, '')
fs.writeFileSync(path.join(__dirname, 'po/' + files[i]), po_file);
// split the file into 3 parts, before locale, locale, and after locale.
var lang_pos = po_file.search('"Language: ') + 11;
var po_start = po_file.slice(0,lang_pos);
var po_locale = po_file.slice(lang_pos,lang_pos + 5);
var po_end = po_file.slice(lang_pos + 5);
// check for underscore, if it's there, only take the first 2 letters and reconstruct the po file.
if (po_locale.search('_') > 0) {
fs.writeFileSync(path.join(__dirname, 'po/' + files[i]), po_start + po_locale.slice(0,2) + po_end);
po_start = '';
po_locale = '';
po_end = '';
};
break;
};
};
if (j == po_array.length - 1) { // All strings are exactly identical to English. Delete po file.
fs.unlinkSync(path.join(__dirname, 'po/' + files[i]));
};
};
};
};
console.log('Cleaned out completely untranslated po files.');
updateLocalFilesFromDownloadedZipBuffer(buf);
});
});
};
}
function updateLocalFilesFromDownloadedZipBuffer(buf) {
var zip = new AdmZip(buf);
const extractionPath = path.join(__dirname, 'po')
zip.extractAllTo(extractionPath, true);
console.log('Done extracting ZIP file.');
let untranslatedPoFileDeletedCount = 0;
var files = fs.readdirSync(extractionPath);
for (var i in files) {
const name = files[i];
if (name == 'template.pot') {
continue;
}
const fullPath = path.join(extractionPath, name);
const status = fs.statSync(fullPath);
if (!status.isDirectory()) {
console.log(`Not a directory. Don't know what to do with "%{name}", skipping.`);
continue;
}
const filePath = path.join(fullPath, `template-${name}.po`);
if (name === "zh-HK") {
console.log("Deleting zh-HK, because we also have zh-CN and the app uses 2-character locales. Also zh-HK was untranslated at time of writing.");
fs.unlinkSync(filePath);
continue
}
var po_file = fs.readFileSync(filePath, 'utf8');
var po_array = po_file.split('\n');
const linesCount = po_array.length;
for (let j = 0; j < linesCount; j++) {
if (po_array[j].slice(0,5) === 'msgid') {
var source_text = po_array[j].slice(5);
} else if (po_array[j].slice(0,6) === 'msgstr') {
var translate_text = po_array[j].slice(6);
// If a line is not == English, it means there is at least one translation. Keep this entire file.
if ((!blankOrEmptyTranslationRegex.test(translate_text)) &&
source_text !== translate_text) {
console.log(`Keeping ${name}`);
// erase email addresses of last translator for privacy
po_file = po_file.replace(/ <.+@.+\..+>/, '')
fs.writeFileSync(filePath, po_file);
// split the file into 3 parts, before locale, locale, and after locale.
var lang_pos = po_file.search('"Language: ') + 11;
var po_start = po_file.slice(0,lang_pos);
var po_locale = po_file.slice(lang_pos,lang_pos + 5);
var po_end = po_file.slice(lang_pos + 5);
// check for underscore, if it's there, only take the first 2 letters and reconstruct the po file.
// TODO: Fix how this is done, because it won't work properly for
// Chinese, Traditional and Chinese, Simplified, they will clash.
if (po_locale.search('_') > 0) {
fs.writeFileSync(filePath, po_start + po_locale.slice(0,2) + po_end);
po_start = '';
po_locale = '';
po_end = '';
};
break;
};
};
if (j === (linesCount - 1)) { // All strings are exactly identical to English. Delete po file.
fs.unlinkSync(filePath);
console.log(`Deleted ${name}`)
untranslatedPoFileDeletedCount++;
};
};
};
console.log(`Completely untranslated po files cleaned out: ${untranslatedPoFileDeletedCount} (Not including zh-HK)`);
}

View file

@ -7,7 +7,7 @@ var path = require('path');
var https = require('https');
var bhttp = require('bhttp');
var crowdin_identifier = 'copay'
var crowdin_identifier = 'bitcoincom-wallet'
var local_file_name1 = path.join(__dirname, 'po/template.pot')
@ -45,9 +45,7 @@ var crowdin_api_key = fs.readFileSync(path.join(__dirname, 'crowdin_api_key.txt'
if (crowdin_api_key != '') {
var payload = {
'files[template.pot]': local_file1,
'files[appstore/appstore_en.txt]': local_file2,
'files[appstore/updateinfo_en.txt]': local_file3
'files[template.pot]': local_file1
};
bhttp.post('https://api.crowdin.com/api/project/' + crowdin_identifier + '/update-file?key=' + crowdin_api_key, payload, {}, function(err, response) {

View file

@ -1,23 +1,23 @@
Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay.
Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others:
To save for vacations or joint purchases with friends
To track family spending and allowances
To manage business, club, or organization funds and expenses
We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility:
Multiple wallet creation and management in-app
Intuitive multisignature security for personal or shared wallets
Easy spending proposal flow for shared wallets and group payments
Hierarchical deterministic (HD) address generation and wallet backups
Device-based security: all private keys are stored locally, not in the cloud
Support for Bitcoin testnet wallets
Synchronous access across all major mobile and desktop platforms
Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments
Support for 150+ currency pricing options and unit denomination in BTC or bits
Email notifications for payments and transfers
Customizable wallet naming and background colors
9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU)
Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay).
Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay.
Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others:
To save for vacations or joint purchases with friends
To track family spending and allowances
To manage business, club, or organization funds and expenses
We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility:
Multiple wallet creation and management in-app
Intuitive multisignature security for personal or shared wallets
Easy spending proposal flow for shared wallets and group payments
Hierarchical deterministic (HD) address generation and wallet backups
Device-based security: all private keys are stored locally, not in the cloud
Support for Bitcoin testnet wallets
Synchronous access across all major mobile and desktop platforms
Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments
Support for 150+ currency pricing options and unit denomination in BTC or bits
Email notifications for payments and transfers
Customizable wallet naming and background colors
9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU)
Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay).

View file

@ -1 +1 @@

3943
i18n/po/ca/template-ca.po Normal file

File diff suppressed because it is too large Load diff

3943
i18n/po/cs/template-cs.po Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Spanish\n"
"Language: es\n"
"PO-Revision-Date: 2017-10-10 08:58-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -64,7 +64,7 @@ msgstr "Acerca de"
#: src/js/controllers/modals/txpDetails.js:62
#: src/js/controllers/tx-details.js:79
msgid "Accepted"
msgstr "Aceptado"
msgstr "Aceptada"
#: www/views/preferencesInformation.html:72
msgid "Account"
@ -77,6 +77,30 @@ msgstr "Cuenta"
msgid "Account Number"
msgstr "Número de cuenta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transacciones instantáneas con comisiones bajas"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "Sin fondos suficientes"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "Cambiar moneda"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "Fondos disponibles"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "Usar todos los fondos"
#: www/views/amount.html:99
msgid "Next"
msgstr "Siguiente"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Cuentas"
@ -202,6 +226,20 @@ msgstr "¡Casi listo! Vamos a revisar."
msgid "Alternative Currency"
msgstr "Moneda Alternativa"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "Muestra de precio"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "Fiat"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "Criptomoneda"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Amazon.com no está disponible en este momento. Inténtalo de nuevo más tarde."
@ -359,12 +397,12 @@ msgstr "Dirección Bitcoin"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr "Saldos Bitcoin Cash (BCH)"
msgstr "Saldo Bitcoin Cash (BCH)"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr "Soportar Bitcoin Cash"
msgstr "Soporte Bitcoin Cash"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
@ -380,7 +418,7 @@ msgstr "Política de Comisión de la Red Bitcoin"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr "Billeteras Bitcoin"
msgstr "Criptobilleteras Bitcoin Core"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprar &amp; Vender Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Comprar Bitcoin"
@ -481,7 +520,7 @@ msgid "Cannot Create Wallet"
msgstr "No se pudo crear la billetera"
#: 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"
#: www/views/includes/bitpayCardsCard.html:2
@ -551,7 +590,7 @@ msgstr "Color"
#: www/views/preferencesAbout.html:21
msgid "Commit hash"
msgstr "Commit hash"
msgstr "Hash de commit"
#: www/views/preferences.html:49
msgid "Complete the backup process to use this option"
@ -615,10 +654,14 @@ msgstr "Conectando a Glidera..."
msgid "Connection reset by peer"
msgstr "Conexión re establecida"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contactos"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Direcciones frecuentes guardadas"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuar"
@ -649,10 +692,11 @@ msgstr "Copayer unido"
#: www/views/preferencesInformation.html:94
msgid "Copayer {{$index}}"
msgstr "Copayer {{$index}}"
msgstr "Co-pagador {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
@ -819,7 +863,7 @@ msgstr "Crear billetera compartida"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Crear billetera"
@ -973,7 +1017,7 @@ msgstr "Se ha alcanzado el límite de direcciones vacías. No se pueden generar
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr "Habilita la creación y operación de billetera Bitcoin Cash dentro de la aplicación."
msgstr "Habilita la creación de billeteras de Bitcoin Cash y operaciones dentro de la app."
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -987,6 +1031,10 @@ msgstr "Activar notificaciones de correo electrónico"
msgid "Enable push notifications"
msgstr "Activar notificaciones push"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Habilitar sonido"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "Activar la cámara empezar."
@ -1268,6 +1316,7 @@ msgstr "Para propósitos de auditoría"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "Desde"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "Recibir noticias y actualizaciones de BitPay"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "Comenzar"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "Empezar"
@ -1578,7 +1623,7 @@ msgstr "Dirección de red incorrecta"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "Fondos insuficientes"
msgstr "Insuficiencia de fondos confirmado"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1996,7 +2041,7 @@ msgstr "Es el momento perfecto para mirar a tu alrededor. ¿ventanas? ¿cámaras
#: src/js/services/popupService.js:72
#: www/views/modals/chooseFeeLevel.html:6
msgid "OK"
msgstr "OK"
msgstr "Ok"
#: www/views/modals/tx-status.html:12
#: www/views/modals/tx-status.html:24
@ -2045,7 +2090,7 @@ msgstr "Abrir Proyecto en GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Abrir Insight"
msgstr "Abra Explorador"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2155,6 +2200,10 @@ msgstr "Pago Rechazado"
msgid "Payment Sent"
msgstr "Pago Enviado"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "Comparte esta transacción"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "Pago aceptado, pero aún no fue enviado"
@ -2172,8 +2221,8 @@ msgid "Payment details"
msgstr "Detalles del pago"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgstr "Solicitud de pago"
msgid "Payment Request"
msgstr "Solicitar pago"
#: www/views/mercadoLibreCards.html:22
#: www/views/modals/mercadolibre-card-details.html:39
@ -2232,7 +2281,7 @@ msgstr "Por favor, selecciona el archivo de copia de seguridad"
#: www/views/bitpayCard.html:81
msgid "Pre-Auth Holds"
msgstr "Pre-Auth Holds"
msgstr "Retención Pre-Auth"
#: www/views/tab-settings.html:40
msgid "Preferences"
@ -2503,7 +2552,7 @@ msgstr "Por favor ingrese su huella digital"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr "Explora tus billeteras para Bitcoin Cash"
msgstr "Escanea tus billeteras para Bitcoin Cash"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2525,6 +2574,14 @@ msgstr "Buscar transacciones"
msgid "Search or enter bitcoin address"
msgstr "Buscar o introducir dirección bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Portapapeles"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Portapapeles vacío"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Buscar transacciones"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "Enviar por correo electrónico"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Enviar desde"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Enviar a"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Pegar portapapeles"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Pegar dirección"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "Transferir entre billeteras"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Escanear código QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "¡Envía Bitcoin más rápido!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Guardar las direcciones que usas frecuentemente y envía Bitcoin en un click"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Añade tu primer contacto"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Tu billetera Bitcoin está vacía"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Para empezar, compra Bitcoin Cash (BCH) o Bitcoin Core (BTC), o comparte tu dirección."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Puedes recibir bitcoin desde cualquier billetera o servicio."
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Comprar Bitcoin ahora"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Ver mi dirección"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Enviar la máxima cantidad"
@ -2802,16 +2918,21 @@ msgstr "Súper Económico"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr "Soportar Bitcoin Cash"
msgstr "Apoya a Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
msgstr "Importar"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
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
msgid "Sweeping Wallet..."
@ -2979,6 +3100,14 @@ msgstr "Esta aplicación almacena tus bitcoins con seguridad avanzada."
msgid "This bitcoin payment request has expired."
msgstr "Esta solicitud de pago ha caducado."
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "El pago expira en:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "El pago ha expirado"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3020,10 +3149,6 @@ msgstr "Para"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "Para empezar, compra bitcoin o comparte tu dirección. Puedes recibir bitcoin desde cualquier billetera o servicio."
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "Para {{reason}} primero debes agregar tu cuenta de BitPay - {{email}}"
@ -3036,6 +3161,26 @@ msgstr "Recarda en progreso..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "Recargar {{amountStr}} a la tarjeta de débito ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "Empezar ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "Intercambia tus BTC a BCH en minutos."
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "Para iniciar el cambio necesitas añadir fondos a tu billetera."
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "El proceso es rápido y recibirás la cantidad intercambiada en tu cartera."
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "Este servicio es proporcionado por el tercero ShapeShift, quien cobrará una pequeña tarifa por el servicio. La tarifa se mostrará antes de empezar la transacción."
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3192,7 +3337,7 @@ msgstr "Ver Términos de Uso"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Ver Transacción en Insight"
msgstr "Ver transacción en Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3303,7 +3448,7 @@ msgstr "La frase de recuperación no es válida"
#: www/views/preferencesAdvanced.html:25
#: www/views/tab-import-phrase.html:73
msgid "Wallet Service URL"
msgstr "Wallet Service URL"
msgstr "URL de Servicio de Billetera"
#: www/views/preferences.html:4
msgid "Wallet Settings"
@ -3627,3 +3772,172 @@ msgstr "{{updatingTxHistoryProgress}} transacciones descargadas"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-de-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift - Cambia BTC a BCH"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Comunidad"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit de Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter de Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explora Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Juegos de Bitcoin Cash"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "Comparte esta app"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Noticias"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Minería en la nube"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Herramientas"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Gráfica de precios Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash gratis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "¡Tus billeteras Bitcoin están listas!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "La dirección no contiene información sobre la criptomoneda. Por favor asegúrese de estar enviando la criptomoneda correcta."
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "Revisar transacción"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "Estás enviando"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "Estás cambiando"
#: www/views/review.html:36
msgid "To:"
msgstr "Para:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "Añadir nota personal"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "Sugerido por el comerciante:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "Introduce el texto aquí"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "Nota personal:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "Menos de 1 centavo"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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"

3943
i18n/po/fa/template-fa.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: French\n"
"Language: fr\n"
"PO-Revision-Date: 2017-10-10 08:58-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,30 @@ msgstr "Compte"
msgid "Account Number"
msgstr "Numéro de compte"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Instant transactions with low fees"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "Fonds insuffisants"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "Changer de devise"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "Fonds disponibles"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "Utiliser tous les fonds disponibles"
#: www/views/amount.html:99
msgid "Next"
msgstr "Suivant"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Comptes"
@ -202,6 +226,20 @@ msgstr "C'est presque terminé ! Vérifions."
msgid "Alternative Currency"
msgstr "Devise alternative"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "Affichage des prix"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "Fiat"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "Cryptocurrency"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Amazon.com nest pas disponible pour le moment. Veuillez réessayer plus tard."
@ -350,7 +388,7 @@ msgstr "Noubliez pas de conserver votre phrase de récupération dans un endr
#: www/views/preferencesBitpayServices.html:9
msgid "BitPay Visa&reg; Cards"
msgstr "BitPay Visa&reg; Cards"
msgstr "BitPay Visa® cartes"
#: www/views/addressbook.add.html:38
#: www/views/includes/incomingDataMenu.html:29
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Acheter &amp; vendre des bitcoins"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Acheter des bitcoins"
@ -481,8 +520,8 @@ msgid "Cannot Create Wallet"
msgstr "Impossible de créer le portefeuille"
#: src/js/services/profileService.js:442
msgid "Cannot join the same wallet more that once"
msgstr "Impossible de rejoindre le même portefeuille plus d'une fois"
msgid "Cannot join the same wallet more than once"
msgstr "Impossible de joindre le même portefeuille plus d'une fois"
#: www/views/includes/bitpayCardsCard.html:2
msgid "Cards"
@ -615,10 +654,14 @@ msgstr "Connexion à Glidera..."
msgid "Connection reset by peer"
msgstr "Connexion réinitialisée par un pair"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contacts"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Adresses fréquemment utilisées enregistrées"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuer"
@ -649,10 +692,11 @@ msgstr "Un Copayer à rejoint"
#: www/views/preferencesInformation.html:94
msgid "Copayer {{$index}}"
msgstr "Copayer {{$index}}"
msgstr "Copayeur {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "Copié(e) dans le presse-papier"
@ -687,7 +731,7 @@ msgstr "Impossible daccéder au portefeuille"
#: src/js/controllers/confirm.js:210
msgid "Could not add message to imported wallet without shared encrypting key"
msgstr "Could not add message to imported wallet without shared encrypting key"
msgstr "Ne peut pas ajouter de message au portefeuille importé sans clé de chiffrement partagée"
#: src/js/controllers/modals/txpDetails.js:199
msgid "Could not broadcast payment"
@ -819,7 +863,7 @@ msgstr "Créer un portefeuille partagé"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Créer un portefeuille bitcoin"
@ -987,6 +1031,10 @@ msgstr "Activer les notifications e-mail"
msgid "Enable push notifications"
msgstr "Autoriser les notifications"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Malayu"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "Autorisez la caméra pour commencer."
@ -1268,6 +1316,7 @@ msgstr "À des fins de vérification"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "De"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "Obtenir les actualités et mises à jour de BitPay"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "Commencer"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "Commencez"
@ -1548,7 +1593,7 @@ msgstr "Afin de vérifier la sauvegarde de votre portefeuille, veuillez saisir v
#: www/views/mercadoLibreCards.html:24
#: www/views/modals/mercadolibre-card-details.html:29
msgid "Inactive"
msgstr "Inactive"
msgstr "Inactif"
#: www/views/includes/walletItem.html:9
#: www/views/includes/walletList.html:6
@ -1578,7 +1623,7 @@ msgstr "Adresse réseau invalide"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "Fonds insuffisants"
msgstr "Fonds confirmé insuffisant"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1952,7 +1997,7 @@ msgstr "Pas maintenant"
#: www/views/includes/output.html:15
msgid "Note"
msgstr "Note"
msgstr "Commentaire"
#: www/views/backup.html:19
msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase."
@ -2045,7 +2090,7 @@ msgstr "Ouvrir le projet GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Ouvrir Insight"
msgstr "Ouvrir l'explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2155,6 +2200,10 @@ msgstr "Paiement rejeté"
msgid "Payment Sent"
msgstr "Paiement envoyé"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "Partager cette transaction"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "Paiement accepté, mais pas encore diffusé"
@ -2172,7 +2221,7 @@ msgid "Payment details"
msgstr "Détails du paiement"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgid "Payment Request"
msgstr "Demande de paiement"
#: www/views/mercadoLibreCards.html:22
@ -2525,6 +2574,14 @@ msgstr "Rechercher des transactions"
msgid "Search or enter bitcoin address"
msgstr "Recherchez ou saisissez une adresse bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Presse-papiers"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Votre presse-papiers est vide"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Rechercher des transactions"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "Envoyer par e-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Envoyer à partir de"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Envoyer à"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Coller le contenu du presse-papiers"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Coller l'adresse"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "Transfert entre les portefeuilles"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Numérisez le code QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envoyez des Bitcoin plus vite !"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Enregistrez les adresses fréquemment utilisées et envoyez-leurs des Bitcoins en un seul geste"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Ajoutez votre premier contact"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Votre portefeuille Bitcoin est vide"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Pour commencer, achetez des Bitcoins Cash (BCH) ou des Bitcoins Core (BTC), ou partagez votre adresse."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Vous pouvez recevoir des Bitcoins de n'importe quel portefeuille ou service."
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Acheter des Bitcoins maintenant"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Afficher mon adresse"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Envoyer le montant maximal"
@ -2809,9 +2925,14 @@ msgid "Sweep"
msgstr "Balayer"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
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
msgid "Sweeping Wallet..."
@ -2979,6 +3100,14 @@ msgstr "Cette appli conserve vos bitcoins avec une sécurité de pointe."
msgid "This bitcoin payment request has expired."
msgstr "Cette demande de paiement bitcoin a expiré."
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "Expiration du paiement:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "La demande de paiement a expiré"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3020,10 +3149,6 @@ msgstr "À"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "Pour commencer, achetez des bitcoins ou partagez votre adresse. Vous pouvez recevoir des bitcoins de n'importe quel portefeuille ou service."
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "Pour {{reason}} vous devez d'abord ajouter votre compte BitPay - {{email}}"
@ -3036,6 +3161,26 @@ msgstr "Rechargement en cours..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "Rechargement de {{amountStr}} vers la carte de débit ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "Démarrer ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "Changez vos BTC en BCH en quelques minutes."
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "Pour démarrer, vous devez ajouter des fonds à votre portefeuille."
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "Le processus est rapide et vous recevrez le montant changé dans votre portefeuille."
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "Ce service est fourni par le tiers ShapeShift, qui facturera une somme modique pour le service. Le montant sera affiché avant de démarrer la transaction."
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3192,7 +3337,7 @@ msgstr "Voir les conditions d'utilisation"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Voir la transaction sur Insight"
msgstr "Voir la transaction sur Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3303,7 +3448,7 @@ msgstr "La phrase de récupération du portefeuille est invalide"
#: www/views/preferencesAdvanced.html:25
#: www/views/tab-import-phrase.html:73
msgid "Wallet Service URL"
msgstr "Wallet Service URL"
msgstr "URL de service"
#: www/views/preferences.html:4
msgid "Wallet Settings"
@ -3627,3 +3772,172 @@ msgstr "{{updatingTxHistoryProgress}} transactions téléchargées"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-sur-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Communauté"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explorez Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Jeux Bitcoin Cash"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "Partager lapplication Wallet"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Nouvelles"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Coopératives de mineurs"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Outils"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Graphiques du prix du Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash Gratuit"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Vos portefeuilles bitcoin sont prêts !"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "L'adresse ne contient pas dinformations de devise, assurez-vous que vous envoyez la bonne devise."
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "Vérifier la transaction"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "Vous envoyez"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "Vous changez"
#: www/views/review.html:36
msgid "To:"
msgstr "À :"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "Ajouter une note personnelle"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "Suggéré par le marchand :"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "Entrez le texte ici"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "Note personnelle :"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "Moins de 1 centime"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
msgstr "Cette facture naccepte 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 nest 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 nest 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"

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Italian\n"
"Language: it\n"
"PO-Revision-Date: 2017-10-09 10:33-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,30 @@ msgstr "Conto"
msgid "Account Number"
msgstr "Numero del Conto"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transazioni istantanee con commissioni basse"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "Fondi insufficienti"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "Cambia valuta"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "Fondi disponibili"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "Usa tutti i fondi disponibili"
#: www/views/amount.html:99
msgid "Next"
msgstr "Avanti"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Account"
@ -202,6 +226,20 @@ msgstr "Quasi finito! Ripassiamo."
msgid "Alternative Currency"
msgstr "Valuta alternativa"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "Visualizzazione prezzi"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "Fiat"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "Criptovaluta"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Ia tabella dei guadagni di Amazon.com non è disponibile al momento. Per favore riprova piu tardi."
@ -359,17 +397,17 @@ msgstr "Indirizzo Bitcoin"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr "Saldi di Bitcoin Cash (BCH)"
msgstr "Saldi Bitcoin Cash (BCH)"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr "Supporto Bitcoin Cash"
msgstr "Supporto di Bitcoin Cash"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
msgid "Bitcoin Cash Wallets"
msgstr ""
msgstr "Portafogli Bitcoin Cash"
#: www/views/modals/chooseFeeLevel.html:4
#: www/views/preferencesFee.html:4
@ -380,7 +418,7 @@ msgstr "Criterio delle Commissioni del Bitcoin Network"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Portafogli Bitcoin Core"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprare &amp; Vendere Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Acquista Bitcoin"
@ -481,7 +520,7 @@ msgid "Cannot Create Wallet"
msgstr "Impossibile creare portafoglio"
#: 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"
#: www/views/includes/bitpayCardsCard.html:2
@ -615,10 +654,14 @@ msgstr "Connessione a Glidera..."
msgid "Connection reset by peer"
msgstr "Connessione ripristinata dall'utente"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contatti"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Indirizzi più utilizzati salvati"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continua"
@ -649,10 +692,11 @@ msgstr "Copayer iscritto"
#: www/views/preferencesInformation.html:94
msgid "Copayer {{$index}}"
msgstr "Copayer {{$index}}"
msgstr "Pagatore {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "Copiato negli appunti"
@ -819,7 +863,7 @@ msgstr "Creare portafoglio condiviso"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Creare portafoglio bitcoin"
@ -936,7 +980,7 @@ msgstr "Non vedi la tua lingua su Crowdin? Contatta il proprietario su Crowdin!
#: www/views/tab-export-file.html:59
#: www/views/tab-home.html:22
msgid "Download"
msgstr "Download"
msgstr "Scarica"
#: www/views/cashScan.html:37
msgid "Duplicate for BCH"
@ -973,7 +1017,7 @@ msgstr "Raggiunto il limite degli indirizzi vuoti. Non possono essere generati n
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr "Attivare la creazione del portafoglio funzionalità Bitcoin Cash e all'interno dell'App."
msgstr "Attivare la creazione di portafoglio Bitcoin Cash."
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -987,6 +1031,10 @@ msgstr "Attiva Notifiche Email"
msgid "Enable push notifications"
msgstr "Abilitare le notifiche push"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Attivare l'audio"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "Abilita la fotocamera per iniziare."
@ -1268,6 +1316,7 @@ msgstr "Per finalità di controllo"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "Da"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "Ricevi notizie e aggiornamenti da BitPay"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "Per iniziare"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "Inizia"
@ -1347,7 +1392,7 @@ msgstr "Ottenendo i livelli di commissione..."
#: www/views/buyAmazon.html:43
#: www/views/buyMercadoLibre.html:42
msgid "Gift Card"
msgstr ""
msgstr "Carta Regalo"
#: www/views/modals/mercadolibre-card-details.html:30
#: www/views/modals/mercadolibre-card-details.html:35
@ -1578,7 +1623,7 @@ msgstr "Indirizzo di rete non corretto"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "Fondi insufficienti"
msgstr "Insufficienti fondi confermati"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1588,7 +1633,7 @@ msgstr "Fondi insufficienti per la commissione"
#: www/views/tab-settings.html:123
msgid "Integrations"
msgstr ""
msgstr "Integrazioni"
#: www/views/includes/walletHistory.html:49
msgid "Invalid"
@ -2045,7 +2090,7 @@ msgstr "Aprire il progetto GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Aprire Insight"
msgstr "Aprire Explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2155,6 +2200,10 @@ msgstr "Pagamento Rifiutato"
msgid "Payment Sent"
msgstr "Pagamento Inviato"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "Condividi questa transazione"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "Pagamento accettato, ma non ancora inviata alla rete"
@ -2172,7 +2221,7 @@ msgid "Payment details"
msgstr "Dettagli pagamento"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgid "Payment Request"
msgstr "Richiesta di pagamento"
#: www/views/mercadoLibreCards.html:22
@ -2503,7 +2552,7 @@ msgstr "Per cortesia procedere alla scansione dell'impronta digitale"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr "Cercare nei tuoi portafogli per Bitcoin Cash"
msgstr "Scansiona il tuo portafogli Bitcoin Cash"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2525,6 +2574,14 @@ msgstr "Cerca Transazioni"
msgid "Search or enter bitcoin address"
msgstr "Cerca o inserisci indirizzo bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Appunti"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Gli appunti sono vuoti"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Ricerca transazioni"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "Invia via email"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Inviata Da"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Invia a"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Incolla appunti"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Incolla indirizzo"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "Trasferisci tra portafogli"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Scansiona codice QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Invia Bitcoin più velocemente!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Salva gli indirizzi più utilizzati e invia Bitcoin con un solo tocco"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Aggiungi il tuo primo contatto"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Il tuo portafoglio Bitcoin è vuoto"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Per iniziare, acquista Bitcoin Cash (BCH) o Bitcoin Core (BTC), oppure condividi il tuo indirizzo."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Puoi ricevere Bitcoin da qualsiasi portafoglio o servizio."
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Acquista subito Bitcoin"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Visualizza il mio indirizzo"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Inviare l'importo massimo"
@ -2802,17 +2918,22 @@ msgstr "Super Economica"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr "Supporto Bitcoin Cash"
msgstr "Supporta Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
msgstr "Spazzola"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
msgid "Sweep paper wallet"
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
msgid "Sweeping Wallet..."
msgstr "Spazzolamento Portafoglio..."
@ -2979,6 +3100,14 @@ msgstr "Questa app memorizza i tuoi bitcoin con sicurezza all'avanguardia."
msgid "This bitcoin payment request has expired."
msgstr "Questa richiesta di pagamento in bitcoin è scaduta."
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "Scadenza del pagamento:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "La richiesta di pagamento è scaduta"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3020,10 +3149,6 @@ msgstr "A"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "Per iniziare, acquista bitcoin o condividi il tuo indirizzo. È possibile ricevere bitcoin da qualsiasi servizio o portafoglio."
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "Per {{reason}} è necessario innanzitutto aggiungere il tuo account BitPay - {{email}}"
@ -3036,6 +3161,26 @@ msgstr "Ricarica in corso..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "Ricaricare di {{amountStr}} sulla carta di debito ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "Avvia ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "Cambia i tuoi BTC in BCH in pochi minuti."
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "Per avviare il processo devi aggiungere fondi al tuo portafoglio."
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "Il processo è veloce e riceverai l'importo cambiato nel tuo portafoglio."
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "Questo servizio è fornito dalla terza parte ShapeShift, che addebiterà una piccola commissione per lo stesso. La commissione sarà mostrata prima di iniziare la transazione."
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3192,7 +3337,7 @@ msgstr "Visualizza i termini di servizio"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Visualizzazione della transazione su Insight"
msgstr "Visualizza transazione a Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3627,3 +3772,172 @@ msgstr "{{updatingTxHistoryProgress}} transazioni scaricate"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-di-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Community"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash su Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com su Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Esplora Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Giochi Bitcoin Cash"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "Condividere l'app Portafoglio"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "News"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Mining Pool"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Strumenti"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Tabella prezzi Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash gratis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "I tuoi portafogli Bitcoin sono pronti!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "L'indirizzo non contiene informazioni sulla valuta. Verifica di inviare la valuta corretta."
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "Rivedi transazione"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "Stai inviando"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "Stai spostando"
#: www/views/review.html:36
msgid "To:"
msgstr "A:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "Aggiungi nota personale"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "Suggerito dal commerciante:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "Inserisci il testo qui"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "Nota personale:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "Meno di 1 centesimo"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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"

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"PO-Revision-Date: 2017-10-09 10:33-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,30 @@ msgstr "ポケット"
msgid "Account Number"
msgstr "ポケット番号"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "僅かな手数料で即時決済"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "残高不足"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "通貨を変更"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "利用可能な残高"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "利用可能な資金をすべて使用"
#: www/views/amount.html:99
msgid "Next"
msgstr "次"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "アカウント一覧"
@ -202,6 +226,20 @@ msgstr "ほぼ完了!確認してみましょう。"
msgid "Alternative Currency"
msgstr "表示通貨"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "価格表示"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "法定通貨"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "仮想通貨"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Amazon.com は現在ご利用できません、また後でお試しください"
@ -402,7 +440,7 @@ msgstr "ビットコインは世界で<br>最も安全な仮想通貨。"
#: www/views/preferencesFee.html:11
msgid "Bitcoin transactions include a fee collected by miners on the network."
msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる達に送る手数料が含まれます。"
msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる達に送る手数料が含まれます。"
#: www/views/buyAmazon.html:108
msgid "Bought {{amountUnitStr}}"
@ -435,6 +473,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "ビットコインの購入&amp;売却"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "ビットコインを購入"
@ -483,8 +522,8 @@ msgid "Cannot Create Wallet"
msgstr "ウォレットを作成できません。"
#: src/js/services/profileService.js:442
msgid "Cannot join the same wallet more that once"
msgstr "同じ端末で同じウォレットに複数回参加することできません。"
msgid "Cannot join the same wallet more than once"
msgstr "同じ端末で同じウォレットに複数回参加することできません。"
#: www/views/includes/bitpayCardsCard.html:2
msgid "Cards"
@ -617,10 +656,14 @@ msgstr "Glidera に接続中…"
msgid "Connection reset by peer"
msgstr "接続がピアによってリセットされました"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "連絡先"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "よく使う保存済みのアドレス"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "続ける"
@ -631,7 +674,7 @@ msgstr "翻訳に協力"
#: src/js/controllers/confirm.js:130
msgid "Copay only supports Bitcoin Cash using new version numbers addresses"
msgstr "Copay のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。"
msgstr "のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。"
#: src/js/services/bwcError.js:62
msgid "Copayer already in this wallet"
@ -655,6 +698,7 @@ msgstr "ウォレット参加者 {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "クリップボードにコピーしました"
@ -821,7 +865,7 @@ msgstr "共有ウォレットを作成"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "ビットコインウォレット作成"
@ -989,6 +1033,10 @@ msgstr "メール通知を有効化"
msgid "Enable push notifications"
msgstr "プッシュ通知を有効化"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "サウンドを有効にする"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "始めるためにカメラを有効にして下さい。"
@ -1270,6 +1318,7 @@ msgstr "監査用機能"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "送信者"
@ -1330,17 +1379,13 @@ msgid "Get news and updates from BitPay"
msgstr "BitPay からのニュースや更新情報を受け取ります。"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "始めよう"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "始めよう"
#: www/views/addressbook.html:20
msgid "Get started by adding your first one."
msgstr "初めての連絡先を追加しましょう。"
msgstr "連絡先を追加しましょう。"
#: src/js/services/onGoingProcess.js:23
msgid "Getting fee levels..."
@ -1349,7 +1394,7 @@ msgstr "手数料レベルを取得しています…"
#: www/views/buyAmazon.html:43
#: www/views/buyMercadoLibre.html:42
msgid "Gift Card"
msgstr ""
msgstr "ギフト カード"
#: www/views/modals/mercadolibre-card-details.html:30
#: www/views/modals/mercadolibre-card-details.html:35
@ -1580,7 +1625,7 @@ msgstr "サーバーのアドレスが不正です"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "残高不足"
msgstr "承認済み残高不足"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1865,7 +1910,7 @@ msgstr "バックアップは非常に重要です!"
#: www/views/addressbook.html:19
msgid "No contacts yet"
msgstr "連絡先が無い"
msgstr "連絡先はありません"
#: www/views/preferencesLogs.html:16
msgid "No entries for this log level"
@ -2047,7 +2092,7 @@ msgstr "GitHub のプロジェクトを開く"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Insightを開く"
msgstr "ブロック・エクスプローラを開く"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2157,6 +2202,10 @@ msgstr "送金が却下されました"
msgid "Payment Sent"
msgstr "送金が完了しました"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "このトランザクションを共有"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "取引が承認されましたが、まだ送信していません。"
@ -2174,8 +2223,8 @@ msgid "Payment details"
msgstr "支払いの詳細"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgstr "支払い請求"
msgid "Payment Request"
msgstr "支払いを要求する"
#: www/views/mercadoLibreCards.html:22
#: www/views/modals/mercadolibre-card-details.html:39
@ -2221,7 +2270,7 @@ msgstr "正しい順序で各単語をタップしてください。"
#: src/js/services/bwcError.js:101
msgid "Please upgrade Copay to perform this action"
msgstr "この操作を実行するにはCopayを最新バージョンに更新してください"
msgstr "この操作を実行するにはを最新バージョンに更新してください"
#: www/views/walletDetails.html:142
#: www/views/walletDetails.html:62
@ -2527,6 +2576,14 @@ msgstr "取引を検索"
msgid "Search or enter bitcoin address"
msgstr "連絡先検索かビットコインアドレスを指定"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "クリップボード"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "クリップボードは空です"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "取引を検索"
@ -2585,9 +2642,68 @@ msgid "Send by email"
msgstr "メールで送信"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "ここから送金"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "送金先:"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "クリップボードからペースト"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "アドレスをペースト"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "ウォレット間送金"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "QRコードを読み取る"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "ビットコイン送金をより高速に!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "よく使うアドレスを保存すればワンタップでビットコインを送金できます"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "最初の連絡先を追加"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "ビットコインウォレットが空です"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "始めるには、Bitcoin Cash (BCH) または Bitcoin Core (BTC) を購入するか、あなたのアドレスを共有してください。"
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "どのウォレットやサービスからでもビットコインを受け取ることができます。"
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "はじめに、ビットコインウォレットを作成し、ビットコインを入手する必要があります。"
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "今すぐビットコインを購入"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "自分のアドレスを表示"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "全残高を送金"
@ -2813,10 +2929,15 @@ msgid "Sweep"
msgstr "全残高インポート"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
msgid "Sweep paper wallet"
msgstr "ペーパーウォレットの全残高インポート"
#: www/views/paperWallet.html:3
msgctxt "Page title"
msgid "Sweep Paper Wallet"
msgstr "ペーパーウォレットの全残高インポート"
#: src/js/services/onGoingProcess.js:33
msgid "Sweeping Wallet..."
msgstr "ビットコイン回収中…"
@ -2985,6 +3106,14 @@ msgstr "このアプリは、最先端のセキュリティであなたのビッ
msgid "This bitcoin payment request has expired."
msgstr "ビットコインペイメントの請求期限が切れています。"
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "支払い請求の有効期限:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "支払い要求の期限が切れています"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3026,10 +3155,6 @@ msgstr "宛先"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "はじめるには、ビットコインを購入したり、アドレスを他の人に共有したりしましょう。どのビットコインウォレットやサービスから受け取れます。"
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "はじめに、ビットコインウォレットを作成し、ビットコインを入手する必要があります。"
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "{{reason}}その前にBitPayアカウントを追加する必要があります - {{email}}"
@ -3042,6 +3167,26 @@ msgstr "残高補充処理中..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "デビットカード ({{cardLastNumber}}) に {{amountStr}} の入金を行う"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "ShapeShiftを開始"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "数分でBTCをBCHに変換できます。"
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "処理を開始するには、資金をウォレットに追加する必要があります。"
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "処理は高速で、交換した金額がウォレットに届きます。"
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "このサービスは、少額のサービス手数料を請求する第三者組織である ShapeShift によって提供されています。手数料は取引を開始する前に表示されます。"
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3198,7 +3343,7 @@ msgstr "サービス利用規約を表示"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Insightにて取引を表示"
msgstr "explorer.bitcoin.comで取引詳細を表示する"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3442,7 +3587,7 @@ msgstr "送金発生時のメール通知はどのメールアドレスで受け
#: www/views/addresses.html:19
msgid "Why?"
msgstr "なぜ?"
msgstr "なぜですか"
#: www/views/feedback/rateApp.html:10
msgid "Would you be willing to rate {{appName}} in the app store?"
@ -3632,4 +3777,173 @@ msgstr "{{updatingTxHistoryProgress}} 個の取引ダウンロード済み"
#: www/views/copayers.html:46
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}} の{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "コミュニティ"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Bitcoin.com を参照"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash ゲーム"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "ウォレットアプリを共有"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "ニュース"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "マイニングプール"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "ツール"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "ビットコインの価格チャート"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "無料 Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "ビットコインウォレットが完成しました!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "アドレスに通貨情報が含まれていません。正しい通貨を送金していることを確認してください。"
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "トランザクションの確認"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "送金中: "
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "取引中: "
#: www/views/review.html:36
msgid "To:"
msgstr "宛先:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "個人用メモを追加"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "お店からのおすすめ:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "ここにテキストを入力してください"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "個人用メモ:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "1セント以下"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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 から無効な応答がありました"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Polish\n"
"Language: pl\n"
"PO-Revision-Date: 2017-10-09 10:33-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -41,7 +41,7 @@ msgstr "5-gwiazdkowa ocena pozwoli na wzrost popularności {{appName}}, a więks
#: www/views/mercadoLibre.html:18
#: www/views/mercadoLibre.html:40
msgid "<b>Only</b> redeemable on Mercado Livre (Brazil)"
msgstr ""
msgstr "98804213800207"
#: src/js/controllers/feedback/send.js:27
#: www/views/feedback/complete.html:21
@ -77,6 +77,30 @@ msgstr "Konto"
msgid "Account Number"
msgstr "Numer konta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Natychmiastowe transakcje z niskimi prowizjami"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "Niewystarczające środki"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "Zmień walutę"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "Dostępne środki"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "Użyj wszystkich dostępnych środków"
#: www/views/amount.html:99
msgid "Next"
msgstr "Dalej"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Konta"
@ -202,6 +226,20 @@ msgstr "Prawie gotowe! Dokonajmy przeglądu."
msgid "Alternative Currency"
msgstr "Alternatywna waluta"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "Wyświetlanie ceny"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "Fiat"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "Kryptowaluta"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Amazon.com jest aktualnie niedostępny. Spróbuj później."
@ -234,7 +272,7 @@ msgstr "Każdy, kto ma Twoją kluczową frazę może uzyskać dostęp lub wydać
#: www/views/addresses.html:94
msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)"
msgstr ""
msgstr "Szacunkowe opłaty sieci Bitcoin do przeniesienia salda portfela (normalny priorytet)"
#: www/views/backupWarning.html:10
msgid "Are you being watched?"
@ -303,7 +341,7 @@ msgstr "BIP32 ścieżka dla adresu derywacji"
#: www/views/cashScan.html:25
msgid "BTC wallets"
msgstr ""
msgstr "Portfele BTC"
#: www/views/preferences.html:34
msgid "Backup"
@ -359,17 +397,17 @@ msgstr "Adres bitcoin"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr ""
msgstr "Salda Bitcoin Cash (BCH)"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr ""
msgstr "Wsparcie Bitcoin Cash"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
msgid "Bitcoin Cash Wallets"
msgstr ""
msgstr "Płatność Bitcoin Cash"
#: www/views/modals/chooseFeeLevel.html:4
#: www/views/preferencesFee.html:4
@ -380,11 +418,11 @@ msgstr "Polityka prowizji sieci bitcoin"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Portfele Bitcoin Core"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
msgstr ""
msgstr "Płatność Bitcoin Cash"
#: www/views/onboarding/tour.html:31
msgid "Bitcoin is a currency."
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Kup &amp; sprzedaj bitcoiny"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Kup bitcoiny"
@ -481,7 +520,7 @@ msgid "Cannot Create Wallet"
msgstr "Nie można utworzyć portfela"
#: 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"
#: www/views/includes/bitpayCardsCard.html:2
@ -615,10 +654,14 @@ msgstr "Łączenie z Gildera..."
msgid "Connection reset by peer"
msgstr "Połączenie zostało zresetowane"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Kontakty"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Zapisane często używane adresy"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Dalej"
@ -629,7 +672,7 @@ msgstr "Wkład do tłumaczenia"
#: src/js/controllers/confirm.js:130
msgid "Copay only supports Bitcoin Cash using new version numbers addresses"
msgstr ""
msgstr "Copay obsługuje tylko Bitcoin gotówki za pomocą nowej wersji numery adresy"
#: src/js/services/bwcError.js:62
msgid "Copayer already in this wallet"
@ -653,6 +696,7 @@ msgstr "Współwłaściciele {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "Skopiowano do schowka"
@ -819,7 +863,7 @@ msgstr "Utwórz współdzielony portfel"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Utwórz portfel bitcoin"
@ -940,7 +984,7 @@ msgstr "Pobierz"
#: www/views/cashScan.html:37
msgid "Duplicate for BCH"
msgstr ""
msgstr "Duplikat dla BCH"
#: src/js/services/onGoingProcess.js:49
msgid "Duplicating wallet..."
@ -973,7 +1017,7 @@ msgstr "Puste adresy osiągnęły limit. Nowe adresy nie mogą być generowane."
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr ""
msgstr "Włącz tworzenie i obsługę portfela Bitcoin Cash w aplikacji."
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -987,13 +1031,17 @@ msgstr "Włącz powiadomienia e-mail"
msgid "Enable push notifications"
msgstr "Włącz powiadomienia"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Włącz dźwięk"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "Włącz kamerę aby rozpocząć."
#: www/views/tab-settings.html:49
msgid "Enabled"
msgstr "Włączone"
msgstr "Włączono"
#: src/js/services/walletService.js:1047
#: src/js/services/walletService.js:1062
@ -1268,6 +1316,7 @@ msgstr "Do celów audytu"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "Z"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "Otrzymywanie wiadomości i aktualizacji z BitPay"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "Pierwsze kroki"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "Zacznij"
@ -1347,7 +1392,7 @@ msgstr "Uzyskiwanie informacji o prowizji..."
#: www/views/buyAmazon.html:43
#: www/views/buyMercadoLibre.html:42
msgid "Gift Card"
msgstr ""
msgstr "Karta podarunkowa"
#: www/views/modals/mercadolibre-card-details.html:30
#: www/views/modals/mercadolibre-card-details.html:35
@ -1406,7 +1451,7 @@ msgstr "Portfel sprzętowy"
#: src/js/controllers/create.js:180
#: src/js/controllers/join.js:145
msgid "Hardware wallets are not yet supported with Bitcoin Cash"
msgstr ""
msgstr "Portfele sprzętowe nie są jeszcze obsługiwane z Bitcoin gotówki"
#: www/views/tab-settings.html:20
msgid "Help & Support"
@ -1578,7 +1623,7 @@ msgstr "Nieprawidłowy adres"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "Nie ma wystarczającej ilości środków"
msgstr "Niewystarczające potwierdzone środki"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1588,7 +1633,7 @@ msgstr "Niewystarczające środki na prowizję"
#: www/views/tab-settings.html:123
msgid "Integrations"
msgstr ""
msgstr "Integracje"
#: www/views/includes/walletHistory.html:49
msgid "Invalid"
@ -1737,7 +1782,7 @@ msgstr "Wyloguj się"
#: www/views/addresses.html:87
msgid "Low amount inputs"
msgstr ""
msgstr "Niska kwota"
#: www/views/includes/walletHistory.html:27
msgid "Low fees"
@ -1769,11 +1814,11 @@ msgstr "Notatka"
#: www/views/mercadoLibre.html:6
msgid "Mercado Livre Brazil Gift Cards"
msgstr ""
msgstr "Karty podarunkowe Mercado Livre Brazil"
#: src/js/controllers/buyMercadoLibre.js:98
msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later."
msgstr ""
msgstr "Karta podarunkowa MercadoLibre nie jest obecnie dostępna. Spróbuj później."
#: www/views/modals/txp-details.html:131
msgid "Merchant Message"
@ -1783,7 +1828,7 @@ msgstr "Wiadomość handlowa"
#: www/views/buyMercadoLibre.html:54
#: www/views/topup.html:63
msgid "Miner Fee"
msgstr ""
msgstr "Opłata dla górnika"
#: src/js/services/bwcError.js:134
msgid "Missing parameter"
@ -1826,7 +1871,7 @@ msgstr "Nazwa"
#: www/views/buyMercadoLibre.html:48
#: www/views/topup.html:56
msgid "Network Cost"
msgstr ""
msgstr "Koszty sieci"
#: src/js/services/bwcError.js:47
msgid "Network error"
@ -1888,7 +1933,7 @@ msgstr "Brak wcześniejszych transakcji"
#: src/js/controllers/buyAmazon.js:44
#: src/js/controllers/topup.js:47
msgid "No signing proposal: No private key"
msgstr ""
msgstr "Nie podpisywania wniosku: nie ma klucza prywatnego"
#: www/views/walletDetails.html:204
msgid "No transactions yet"
@ -1915,15 +1960,15 @@ msgstr "Brak portfeli do otrzymania środków"
#: www/views/cashScan.html:15
msgid "No wallets eligible for Bitcoin Cash support"
msgstr ""
msgstr "Brak portfeli wspierających Bitcoin Cash"
#: src/js/controllers/cashScan.js:58
msgid "Non BIP44 wallet"
msgstr ""
msgstr "Nie BIP44 portfel"
#: www/views/cashScan.html:46
msgid "Non eligible BTC wallets"
msgstr ""
msgstr "Niewspierane portfele BTC"
#: src/js/services/feeService.js:12
msgid "Normal"
@ -1956,7 +2001,7 @@ msgstr "Notatka"
#: www/views/backup.html:19
msgid "Note: if this BCH wallet was duplicated from a BTC wallet, they share the same recovery phrase."
msgstr ""
msgstr "Uwaga: Jeśli ten portfel BCH został zduplikowany z portfela BTC, będą one współdzielić ten sam zwrot odzyskiwania."
#: www/views/modals/wallets.html:25
msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin"
@ -2045,7 +2090,7 @@ msgstr "Otwórz projekt GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Otwórz Insight"
msgstr "Otwórz Explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2065,7 +2110,7 @@ msgstr "Otworzyć bitcoincash.org?"
#: src/js/controllers/cashScan.js:18
msgid "Open the recovery tool."
msgstr ""
msgstr "Otwórz narzędzie do odzyskiwania."
#: www/views/tab-receive.html:27
msgid "Open wallet"
@ -2155,6 +2200,10 @@ msgstr "Wypłata odrzucona"
msgid "Payment Sent"
msgstr "Płatność wysłana"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "Udostępnij tę transakcję"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "Wypłata zaakceptowana, ale jeszcze nie nadana"
@ -2165,14 +2214,14 @@ msgstr "Wypłata zaakceptowana. Będzie nadana przez Glidera. W przypadku wystą
#: src/js/services/incomingData.js:152
msgid "Payment address was translated to new Bitcoin Cash address format:"
msgstr ""
msgstr "Adres płatności został przetłumaczony na nowy format adresów Bitcoin Cash:"
#: www/views/modals/txp-details.html:107
msgid "Payment details"
msgstr "Szczegóły wypłaty"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgid "Payment Request"
msgstr "Wniosek o płatność"
#: www/views/mercadoLibreCards.html:22
@ -2232,7 +2281,7 @@ msgstr "Proszę wybrać plik kopii zapasowej"
#: www/views/bitpayCard.html:81
msgid "Pre-Auth Holds"
msgstr ""
msgstr "Wstrzymanie przedautoryzacyjne"
#: www/views/tab-settings.html:40
msgid "Preferences"
@ -2336,7 +2385,7 @@ msgstr "Więcej informacji w naszej Wiki"
#: src/js/controllers/cashScan.js:61
msgid "Read only wallet"
msgstr ""
msgstr "Portfel tylko do odczytu"
#: www/views/tab-receive.html:3
#: www/views/tabs.html:7
@ -2345,7 +2394,7 @@ msgstr "Otrzymaj"
#: www/views/customAmount.html:44
msgid "Receive in"
msgstr ""
msgstr "Otrzymaj w"
#: www/views/includes/walletHistory.html:24
#: www/views/tx-details.html:18
@ -2503,7 +2552,7 @@ msgstr "Proszę zeskanować linie papilarne"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr ""
msgstr "Skanuj portfele w poszukiwaniu Bitcoin Cash"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2525,6 +2574,14 @@ msgstr "Szukaj transakcji"
msgid "Search or enter bitcoin address"
msgstr "Wyszukaj lub wpisz adres bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Schowek"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Schowek jest pusty"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Szukaj transakcji"
@ -2539,7 +2596,7 @@ msgstr "Bezpieczeństwo"
#: www/views/modals/mercadolibre-card-details.html:64
msgid "See invoice"
msgstr ""
msgstr "Zobacz fakturę"
#: www/views/tab-import-file.html:7
msgid "Select a backup file"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "Wyślij przez e-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Wyślij z"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Wyślij do"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Wklej ze schowka"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Wklej adres"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "Transfer między portfelami"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Zeskanuj kod QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Przesyłaj Bitcoiny szybciej!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Zapisz często używane adresy i wyślij im Bitcoin za pomocą jednego dotknięcia"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Dodaj swój pierwszy kontakt"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Twój portfel jest pusty"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Aby zacząć, kup Bitcoin Cash (BCH) lub Bitcoin Core (BTC), albo udostępnij swój adres."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Bitcoiny można odbierać z dowolnego portfela lub usługi."
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Kup Bitcoin teraz"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Pokaż mój adres"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Wyślij całą kwotę"
@ -2739,7 +2855,7 @@ msgstr "Pomiń"
#: src/js/controllers/confirm.js:371
#: src/js/controllers/modals/txpDetails.js:47
msgid "Slide to accept"
msgstr ""
msgstr "Przesuń, aby zaakceptować"
#: www/views/buyAmazon.html:96
msgid "Slide to buy"
@ -2747,16 +2863,16 @@ msgstr "Przesuń, aby kupić"
#: src/js/controllers/confirm.js:365
msgid "Slide to pay"
msgstr ""
msgstr "Przesuń, aby zapłacić"
#: src/js/controllers/confirm.js:377
#: src/js/controllers/modals/txpDetails.js:40
msgid "Slide to send"
msgstr ""
msgstr "Przesuń, aby wysłać"
#: www/views/cashScan.html:56
msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the"
msgstr ""
msgstr "Niektóre z twoich portfeli nie kwalifikują się do wsparcia Bitcoin Cash. Dostęp do środków BCH z tych portfeli można spróbować uzyskać, korzystając z"
#: src/js/controllers/create.js:88
#: src/js/controllers/join.js:71
@ -2777,7 +2893,7 @@ msgstr "Wymagane hasło wypłat"
#: www/views/walletDetails.html:173
msgid "Spending this balance will need significant Bitcoin network fees"
msgstr ""
msgstr "Wydanie tego salda będzie wymagało znacznych opłat sieciowych Bitcoin"
#: www/views/tab-send.html:28
msgid "Start sending bitcoin"
@ -2790,7 +2906,7 @@ msgstr "Blokada uruchamiania"
#: www/views/mercadoLibreCards.html:21
#: www/views/modals/mercadolibre-card-details.html:42
msgid "Still pending"
msgstr ""
msgstr "Jeszcze w toku"
#: www/views/topup.html:101
msgid "Success"
@ -2802,17 +2918,22 @@ msgstr "Super Ekonomiczna"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr ""
msgstr "Wsparcie Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
msgstr "Opróżnij"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
msgid "Sweep paper wallet"
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
msgid "Sweeping Wallet..."
msgstr "Sczytywanie portfela..."
@ -2832,7 +2953,7 @@ msgstr "Dotknij i przytrzymaj, aby pokazać"
#: www/views/includes/walletInfo.html:3
msgid "Tap to recreate"
msgstr ""
msgstr "Dotknij, aby odświeżyć"
#: www/views/includes/walletInfo.html:4
msgid "Tap to retry"
@ -2979,6 +3100,14 @@ msgstr "Ta aplikacja przechowuje Twoje bitcoiny z zaawansowanymi zabezpieczeniam
msgid "This bitcoin payment request has expired."
msgstr "Ten wniosek płatności wygasł."
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "Płatność wygasa:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "Wniosek o płatność wygasł"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -2991,7 +3120,7 @@ msgstr "Ta kluczowa fraza został utworzona przy użyciu hasła. Aby odzyskać p
#: www/views/tx-details.html:91
msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself."
msgstr ""
msgstr "Ta kwota transakcji jest zbyt mała w porównaniu z obecnymi opłatami sieci Bitcoin. Wydanie tych środków będzie wymagało opłaty sieciowej Bitcoin, która jest porównywalna do kosztów samych funduszy."
#: www/views/tx-details.html:87
msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender"
@ -3020,21 +3149,37 @@ msgstr "Do"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "Aby zacząć, kup bitcoiny lub udostępnij swój adres. Możesz otrzymać bitcoiny z dowolnego portfela lub usługi."
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr ""
msgstr "Aby móc wykonać czynność {{reason}}, musisz przedtem dodać swoje konto BitPay {{email}}"
#: src/js/services/onGoingProcess.js:48
msgid "Top up in progress..."
msgstr ""
msgstr "Doładowanie w trakcie..."
#: src/js/controllers/topup.js:206
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr ""
msgstr "Doładuj o {{amountStr}} kartę debetową ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "Rozpocznij ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "Wymień BTC na BCH w ciągu paru chwil."
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "Aby zacząć, dodaj środki do portfela."
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "Proces jest szybki, a użytkownik otrzyma wymienione środki do portfela."
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "Ta usługa jest świadczona przez podmiot zewnętrzny ShapeShift, który naliczy za nią niewielką opłatę. Będzie ona widoczna przed rozpoczęciem transakcji."
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
@ -3053,7 +3198,7 @@ msgstr "Liczba współwłaścicieli portfela"
#: www/views/addresses.html:81
msgid "Total wallet inputs"
msgstr ""
msgstr "Dane wejściowe portfela łącznie"
#: src/js/services/fingerprintService.js:63
#: src/js/services/fingerprintService.js:68
@ -3081,7 +3226,7 @@ msgstr "Transakcja została już wysłana"
#: src/js/controllers/buyMercadoLibre.js:301
#: src/js/controllers/topup.js:281
msgid "Transaction has not been created"
msgstr ""
msgstr "Transakcja nie została utworzona"
#: www/views/topup.html:104
msgid "Transaction initiated"
@ -3192,7 +3337,7 @@ msgstr "Zobacz zasady użytkowania"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Zobacz transakcje na Insight"
msgstr "Zobacz transakcję na Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3204,7 +3349,7 @@ msgstr "Zobacz na blockchainie"
#: www/views/mercadoLibre.html:26
msgid "Visit mercadolivre.com.br &rarr;"
msgstr ""
msgstr "Odwiedź mercadolivre.com.br &rarr;"
#: www/views/walletDetails.html:182
msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet."
@ -3266,7 +3411,7 @@ msgstr "Informacje o portfelu"
#: www/views/addresses.html:76
msgid "Wallet Inputs"
msgstr ""
msgstr "Dane wejściowe portfela"
#: www/views/join.html:26
msgid "Wallet Invitation"
@ -3320,7 +3465,7 @@ msgstr "Portfel już istnieje"
#: src/js/services/profileService.js:516
msgid "Wallet already in {{appName}}"
msgstr ""
msgstr "Portfel już w aplikacji {{appName}}"
#: www/views/includes/walletActivity.html:6
msgid "Wallet created"
@ -3371,7 +3516,7 @@ msgstr "Portfel nie jest zarejestrowany w Wallet Service. Odtwórz go używając
#: www/views/backup.html:12
msgid "Wallet recovery phrase not available"
msgstr ""
msgstr "Fraza odzyskiwania portfela nie jest dostępna"
#: src/js/services/bwcError.js:50
msgid "Wallet service not found"
@ -3500,7 +3645,7 @@ msgstr "Nie należy ustawiać opłatę wyższą niż {{maxFeeRecommended}} satos
#: www/views/modals/bitpay-card-confirmation.html:5
msgid "You will need to log back for fill in your BitPay Card."
msgstr ""
msgstr "Musisz zalogować się ponownie, aby wypełnić swoją kartę BitPay."
#: www/views/preferencesNotifications.html:34
msgid "You'll receive email notifications about payments sent and received from your wallets."
@ -3513,7 +3658,7 @@ msgstr "Twoja karta BitPay jest gotowa. Zasil kartę, aby zacząć ją używać
#: www/views/mercadoLibre.html:57
#: www/views/mercadoLibreCards.html:6
msgid "Your Gift Cards"
msgstr ""
msgstr "Twoje karty podarunkowe"
#: www/views/includes/confirmBackupPopup.html:6
msgid "Your bitcoin wallet is backed up!"
@ -3572,7 +3717,7 @@ msgstr "[Balans ukryty]"
#: www/views/walletDetails.html:141
#: www/views/walletDetails.html:61
msgid "[Scanning Funds]"
msgstr ""
msgstr "[Skanowanie środków]"
#: src/js/controllers/bitpayCardIntro.js:11
msgid "add your BitPay Visa card(s)"
@ -3596,7 +3741,7 @@ msgstr "Przygotowywanie..."
#: www/views/cashScan.html:57
msgid "recovery tool."
msgstr ""
msgstr "narzędzie do odzyskiwania."
#: src/js/controllers/buyAmazon.js:239
msgid "{{amountStr}} for Amazon.com Gift Card"
@ -3604,7 +3749,7 @@ msgstr "{{amountStr}} dla karty upominkowej Amazon.com"
#: src/js/controllers/buyMercadoLibre.js:237
msgid "{{amountStr}} for Mercado Livre Brazil Gift Card"
msgstr ""
msgstr "{{amountStr}} na karcie podarunkowej Mercado Livre Brazil"
#: www/views/preferencesBwsUrl.html:21
msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)."
@ -3616,7 +3761,7 @@ msgstr "{{fee}} zostanie potrącone jako prowizja sieci bitcoin."
#: www/views/confirm.html:85
msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount"
msgstr ""
msgstr "{{tx.txp[wallet.id].feeRatePerStr}} wysyłanej kwoty"
#: www/views/walletDetails.html:218
msgid "{{updatingTxHistoryProgress}} transactions downloaded"
@ -3627,3 +3772,172 @@ msgstr "{{updatingTxHistoryProgress}} transakcje pobrane"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-z-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Społeczność"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Poznaj Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Gry Bitcoin Cash"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "Udostępnij aplikację Portfel"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Aktualności"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Pula kopalni"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Narzędzia"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Wykresy kursu Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Darmowa Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Twoje portfele Bitcoin są gotowe!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "Adres nie zawiera informacji o walucie; upewnij się, że przesyłasz odpowiednią walutę."
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "Potwierdzenie transakcji"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "Przesyłasz"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "Przelewasz"
#: www/views/review.html:36
msgid "To:"
msgstr "Do:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "Dodaj notatkę osobistą"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "Sugestia handlowca:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "Wprowadź tekst tutaj"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "Notatka osobista:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "Mniej niż 1 cent"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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"

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
"PO-Revision-Date: 2017-10-10 08:58-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,30 @@ msgstr "Conta"
msgid "Account Number"
msgstr "Número de conta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transações instantâneas com taxas baixas"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "Fundos insuficientes"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "Alterar moeda"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "Fundos disponíveis"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "Usar todos os fundos disponíveis"
#: www/views/amount.html:99
msgid "Next"
msgstr "Próximo"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Contas"
@ -202,6 +226,20 @@ msgstr "Quase pronto! Vamos rever."
msgid "Alternative Currency"
msgstr "Moeda Alternativa"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "Exibição de preço"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "Fiat"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "Criptomoeda"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "Amazon.com não está disponível neste momento. Por favor, tente mais tarde."
@ -307,7 +345,7 @@ msgstr "Carteiras BTC"
#: www/views/preferences.html:34
msgid "Backup"
msgstr "Backup"
msgstr "Backup de"
#: www/views/includes/backupNeededPopup.html:7
msgid "Backup Needed"
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprar &amp; Vender Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Comprar Bitcoin"
@ -481,8 +520,8 @@ msgid "Cannot Create Wallet"
msgstr "Não é possível criar a carteira"
#: src/js/services/profileService.js:442
msgid "Cannot join the same wallet more that once"
msgstr "Não pode juntar-se a mesma carteira mais que uma vez"
msgid "Cannot join the same wallet more than once"
msgstr "Não pode juntar-se à mesma carteira mais que uma vez"
#: www/views/includes/bitpayCardsCard.html:2
msgid "Cards"
@ -615,10 +654,14 @@ msgstr "A conectar ao Glidera..."
msgid "Connection reset by peer"
msgstr "Ligação redefinida pelo mesmo nível"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contactos"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Salvou os endereços usados com frequência"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuar"
@ -653,6 +696,7 @@ msgstr "Copayer {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "Copiado para a área de transferência"
@ -819,7 +863,7 @@ msgstr "Criar carteira partilhada"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Criar carteira bitcoin"
@ -936,7 +980,7 @@ msgstr "Não vê o seu idioma no Crowdin? Contacte o Dono no Crowdin! Nós adora
#: www/views/tab-export-file.html:59
#: www/views/tab-home.html:22
msgid "Download"
msgstr "Download"
msgstr "Baixar"
#: www/views/cashScan.html:37
msgid "Duplicate for BCH"
@ -987,6 +1031,10 @@ msgstr "Ativar notificações por email"
msgid "Enable push notifications"
msgstr "Ativar notificações push"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Ativar som"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "Ative a câmera para começar."
@ -1268,6 +1316,7 @@ msgstr "Para fins de auditoria"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "De"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "Receba notícias e atualizações da BitPay"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "Começar"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "Começar"
@ -1578,7 +1623,7 @@ msgstr "Endereço de rede incorreto"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "Fundos insuficientes"
msgstr "Insuficiência de fundos confirmada"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1996,7 +2041,7 @@ msgstr "Agora é a hora perfeita para olhar em volta. Próximo de janelas? Câme
#: src/js/services/popupService.js:72
#: www/views/modals/chooseFeeLevel.html:6
msgid "OK"
msgstr "OK"
msgstr "Okey"
#: www/views/modals/tx-status.html:12
#: www/views/modals/tx-status.html:24
@ -2015,7 +2060,7 @@ msgstr "Oh não!"
#: src/js/controllers/buyMercadoLibre.js:306
msgid "Ok"
msgstr "Ok"
msgstr "Okey"
#: www/views/tab-home.html:39
msgid "On this screen you can see all your wallets, accounts, and assets."
@ -2045,7 +2090,7 @@ msgstr "Abrir Projeto no GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "Abrir Insight"
msgstr "Abrir o Explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2155,6 +2200,10 @@ msgstr "Pagamento Rejeitado"
msgid "Payment Sent"
msgstr "Pagamento Enviado"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "Compartilhar esta transação"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "Pagamento aceito, mas ainda não publicado"
@ -2172,8 +2221,8 @@ msgid "Payment details"
msgstr "Detalhes do pagamento"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgstr "Pedido de pagamento"
msgid "Payment Request"
msgstr "Solicitação de pagamento"
#: www/views/mercadoLibreCards.html:22
#: www/views/modals/mercadolibre-card-details.html:39
@ -2525,6 +2574,14 @@ msgstr "Procurar transações"
msgid "Search or enter bitcoin address"
msgstr "Procure ou digite o endereço bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Área de transferência"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "A sua área de transferência está vazia"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Procurar transações"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "Enviar por E-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Enviar De"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Enviar para"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Colar na área de trabalho"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Colar endereço"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "Transferência entre carteiras"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Digitalizar o código QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envie Bitcoin mais rápido!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Salvar endereços usados com frequência e enviar Bitcoin com apenas um toque"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Adicionar o seu primeiro contato"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Sua carteira de Bitcoin está vazia"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Para começar, compre Bitcoin Cash (BCH) ou Bitcoin Core (BTC) ou compartilhe o seu endereço."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Você pode receber bitcoin de qualquer carteira ou serviço."
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Comprar Bitcoin agora"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Mostrar meu endereço"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Quantidade Máxima de envio"
@ -2809,10 +2925,15 @@ msgid "Sweep"
msgstr "Limpar"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
msgid "Sweep paper wallet"
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
msgid "Sweeping Wallet..."
msgstr "Carteira de varredura..."
@ -2979,6 +3100,14 @@ msgstr "Este aplicativo armazena seu bitcoin com segurança de ponta."
msgid "This bitcoin payment request has expired."
msgstr "Este bitcoin pagamento pedido expirou."
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "Pagamento expira em:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "Pedido de pagamento expirou"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3020,10 +3149,6 @@ msgstr "Para"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "Para começar, compre bitcoins ou compartilhe seu endereço. Você pode receber bitcoins de qualquer carteira ou serviço."
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "Para {{reason}} você deve primeiro adicionar sua conta BitPay - {{email}}"
@ -3036,6 +3161,26 @@ msgstr "Recarga em andamento..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "Recarga de {{amountStr}} para cartão de débito ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "Iniciar ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "Troque seu BTC para BCH em minutos."
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "Para iniciar o processo, você precisa adicionar fundos à sua carteira."
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "O processo é rápido e você receberá a quantia convertida na sua carteira."
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "Este serviço é fornecido pela terceira ShapeShift, que cobrará uma pequena taxa pelo serviço. A taxa será exibida antes de você iniciar a transação."
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3122,7 +3267,7 @@ msgstr "Digite a frase de recuperação (normalmente 12 palavras)"
#: src/js/controllers/backup.js:75
msgid "Uh oh..."
msgstr "Uh oh..."
msgstr "Ah Ah..."
#: www/views/tx-details.html:100
msgid "Unconfirmed"
@ -3192,7 +3337,7 @@ msgstr "Ver os Termos de Serviço"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "Exibir Transação no Insight"
msgstr "Ver transação no Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3627,3 +3772,172 @@ msgstr "Transações de {{updatingTxHistoryProgress}} transferidas"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-de-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Comunidade"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explore Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Jogos Bitcoin Cash"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "Compartilhar o app de carteira"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Notícias"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Pool de mineração"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Ferramentas"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Gráficos de preço do Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash grátis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "As suas carteiras de Bitcoin estão prontas!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "O endereço não contém informações de moeda. Certifique-se de que está enviando a moeda correta."
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "Revisar transação"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "Você está enviando"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "Você está trocando"
#: www/views/review.html:36
msgid "To:"
msgstr "Para:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "Adicionar nota pessoal"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "Sugerido pelo comerciante:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "Insira o texto aqui"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "Nota pessoal:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "Menos de 1 centavo"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

3946
i18n/po/vi/template-vi.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,16 +2,16 @@ msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Project-Id-Version: copay\n"
"Project-Id-Version: bitcoincom-wallet\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: copay\n"
"X-Crowdin-Project: bitcoincom-wallet\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: template.pot\n"
"Last-Translator: cmgustavo83\n"
"Last-Translator: emilold\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
"PO-Revision-Date: 2017-10-09 10:33-0400\n"
"PO-Revision-Date: 2018-09-15 05:56\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -41,7 +41,7 @@ msgstr "5 星评级帮助我们进入更多的人手, {{appName}} 和更多的
#: www/views/mercadoLibre.html:18
#: www/views/mercadoLibre.html:40
msgid "<b>Only</b> redeemable on Mercado Livre (Brazil)"
msgstr "<b>Only</b>可在悔尔卡多里弗(巴西) 兌換"
msgstr "<b>只</b>可以在 Mercado Livre巴西兑换"
#: src/js/controllers/feedback/send.js:27
#: www/views/feedback/complete.html:21
@ -77,6 +77,30 @@ msgstr "帐户"
msgid "Account Number"
msgstr "帐号"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "以较低费用进行即时交易"
#: www/views/walletSelector.html:49
msgid "Insufficient funds"
msgstr "资金不足"
#: www/views/amount.html:42
msgid "Change Currency"
msgstr "更改货币"
#: www/views/amount.html:49
msgid "Available Funds"
msgstr "可用资金"
#: www/views/amount.html:59
msgid "Use All Available Funds"
msgstr "使用所有可用资金"
#: www/views/amount.html:99
msgid "Next"
msgstr "下一步"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "帐户"
@ -202,6 +226,20 @@ msgstr "差不多完成了 !让我们回顾一下。"
msgid "Alternative Currency"
msgstr "替代货币"
#: www/views/tab-settings.html:75
msgid "Price Display"
msgstr "价格显示"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:12
msgid "Fiat"
msgstr "法币"
#: src/js/controllers/tab-settings.js:19
#: www/views/preferencesPriceDisplay.html:15
msgid "Cryptocurrency"
msgstr "加密货币"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr "亚马逊服务器暂时无法访问,请稍候再试。"
@ -222,7 +260,7 @@ msgstr "量太大"
#: www/views/includes/walletHistory.html:31
msgid "Amount too low to spend"
msgstr "數額低於可消費額"
msgstr "数量太少,无法支付"
#: src/js/controllers/tab-home.js:147
msgid "An update to this app is available. For your security, please update to the latest version."
@ -234,7 +272,7 @@ msgstr "任何人只要持有你的备份短语,就可以访问或者花掉你
#: www/views/addresses.html:94
msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)"
msgstr "近似的比特币网络费用将钱包的余额转移 (与正常优先级)"
msgstr "转移钱包余额大约需要的比特币网络费用(正常优先级)"
#: www/views/backupWarning.html:10
msgid "Are you being watched?"
@ -242,7 +280,7 @@ msgstr "你正在被监视吗?"
#: src/js/controllers/preferencesExternal.js:15
msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin."
msgstr "有旁观者么?只要有人知道了你的恢复短语,他就能访问你的比特币,或者花费它。"
msgstr "请确认目前没有人在监视你的屏幕!因为只要有人知道了你的恢复短语,他就拥有你的比特币完全访问权限,甚至可以直接用于消费!"
#: src/js/controllers/copayers.js:56
msgid "Are you sure you want to cancel and delete this wallet?"
@ -303,7 +341,7 @@ msgstr "BIP32 路径的地址衍生"
#: www/views/cashScan.html:25
msgid "BTC wallets"
msgstr "比特幣錢包"
msgstr "比特币钱包"
#: www/views/preferences.html:34
msgid "Backup"
@ -315,7 +353,7 @@ msgstr "需要备份"
#: src/js/controllers/lockSetup.js:87
msgid "Backup all livenet wallets before using this function"
msgstr "请在使用此功能之前备份你的钱包。"
msgstr "请在使用此功能之前备份你所有的 livenet 钱包"
#: src/js/controllers/cashScan.js:64
#: www/views/includes/walletListSettings.html:12
@ -359,17 +397,17 @@ msgstr "比特币地址"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr "小比特幣(BCH) 結餘"
msgstr "Bitcoin Cash (BCH) 余额"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr "小比特幣支援"
msgstr "Bitcoin Cash 支持"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
msgid "Bitcoin Cash Wallets"
msgstr ""
msgstr "比特币现金钱包"
#: www/views/modals/chooseFeeLevel.html:4
#: www/views/preferencesFee.html:4
@ -380,11 +418,11 @@ msgstr "比特币网络手续费策略"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Bitcoin Core 钱包"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
msgstr "小比特幣支付"
msgstr "比特币现金支付"
#: www/views/onboarding/tour.html:31
msgid "Bitcoin is a currency."
@ -433,6 +471,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "购买或出售比特币"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "购买比特币"
@ -481,7 +520,7 @@ msgid "Cannot Create Wallet"
msgstr "不能创建钱包"
#: 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 "无法重复加入同一个钱包"
#: www/views/includes/bitpayCardsCard.html:2
@ -519,16 +558,16 @@ msgstr "清空缓存"
#: src/js/controllers/confirm.js:373
#: src/js/controllers/modals/txpDetails.js:49
msgid "Click to accept"
msgstr "在此點擊以接受"
msgstr "点击这里接受"
#: src/js/controllers/confirm.js:367
msgid "Click to pay"
msgstr "在此點擊以支付"
msgstr "点击这里支付"
#: src/js/controllers/confirm.js:379
#: src/js/controllers/modals/txpDetails.js:42
msgid "Click to send"
msgstr "點擊以寄出"
msgstr "点击这里发送"
#: www/views/customAmount.html:4
#: www/views/modals/mercadolibre-card-details.html:3
@ -543,7 +582,7 @@ msgstr "关闭"
#: www/views/includes/cash.html:2
#: www/views/preferencesInformation.html:17
msgid "Coin"
msgstr "電子幣种"
msgstr "种"
#: www/views/preferences.html:22
msgid "Color"
@ -615,10 +654,14 @@ msgstr "正在连接 Glidera..."
msgid "Connection reset by peer"
msgstr "连接被对方重置"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "联系人"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "保存的常用地址"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "继续"
@ -629,7 +672,7 @@ msgstr "参与翻译"
#: src/js/controllers/confirm.js:130
msgid "Copay only supports Bitcoin Cash using new version numbers addresses"
msgstr "本公司Copay只支持用新版本數字地址的小比特幣"
msgstr "Copay只支持新版本的比特币现金地址"
#: src/js/services/bwcError.js:62
msgid "Copayer already in this wallet"
@ -653,6 +696,7 @@ msgstr "Copayer {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: src/js/controllers/confirm.js:41
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr "已复制到剪贴板"
@ -709,7 +753,7 @@ msgstr "不能创建发票"
#: src/js/controllers/buyMercadoLibre.js:164
#: src/js/controllers/topup.js:142
msgid "Could not create transaction"
msgstr "无法创建交易记录"
msgstr "无法创建交易"
#: src/js/services/profileService.js:350
msgid "Could not create using the specified extended private key"
@ -733,7 +777,7 @@ msgstr "无法删除支付提议"
#: src/js/controllers/cashScan.js:117
msgid "Could not duplicate"
msgstr "法复制"
msgstr "法复制"
#: src/js/services/feeService.js:73
msgid "Could not get dynamic fee"
@ -819,7 +863,7 @@ msgstr "创建自己的免费钱包"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "创建比特币的钱包"
@ -918,7 +962,7 @@ msgstr "详情"
#: src/js/controllers/tab-settings.js:65
#: www/views/tab-settings.html:50
msgid "Disabled"
msgstr "已经禁用"
msgstr "禁用"
#: www/views/includes/backupNeededPopup.html:10
#: www/views/onboarding/backupRequest.html:12
@ -940,11 +984,11 @@ msgstr "下载"
#: www/views/cashScan.html:37
msgid "Duplicate for BCH"
msgstr "為小比特幣复制"
msgstr "复制 BCH"
#: src/js/services/onGoingProcess.js:49
msgid "Duplicating wallet..."
msgstr "复制錢包進行中"
msgstr "正在复制钱包……"
#: www/views/addresses.html:19
msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment."
@ -973,7 +1017,7 @@ msgstr "已达到空地址限制。无法生成新的地址。"
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr "能在本應用程序中創建和啟用小比特幣錢包"
msgstr "在应用内启用 Bitcoin Cash 创建和操作。"
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -987,13 +1031,17 @@ msgstr "启用电子邮件通知"
msgid "Enable push notifications"
msgstr "启用推式通知"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "启用声音"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
msgstr "使该摄像机开始。"
#: www/views/tab-settings.html:49
msgid "Enabled"
msgstr "巳啟用"
msgstr "已启用"
#: src/js/services/walletService.js:1047
#: src/js/services/walletService.js:1062
@ -1268,6 +1316,7 @@ msgstr "供审计目的"
#: www/views/modals/txp-details.html:74
#: www/views/topup.html:34
#: www/views/tx-details.html:52
#: www/views/review.html:22
msgid "From"
msgstr "来自"
@ -1293,7 +1342,7 @@ msgstr "找到资金"
#: www/views/topup.html:49
msgid "Funds to be added"
msgstr "要添加的资金"
msgstr "充值金额"
#: www/views/paperWallet.html:51
msgid "Funds transferred"
@ -1301,7 +1350,7 @@ msgstr "资金转移"
#: www/views/topup.html:103
msgid "Funds were added to debit card"
msgstr "資金已添加到借寄卡"
msgstr "提现到借记卡成功"
#: www/views/paperWallet.html:22
msgid "Funds will be transferred to"
@ -1328,10 +1377,6 @@ msgid "Get news and updates from BitPay"
msgstr "从 BitPay 获取新闻和更新"
#: www/views/onboarding/welcome.html:8
msgctxt "button"
msgid "Get started"
msgstr "入门"
#: www/views/bitpayCard.html:49
msgid "Get started"
msgstr "马上体验"
@ -1347,7 +1392,7 @@ msgstr "正在获取收费水平..."
#: www/views/buyAmazon.html:43
#: www/views/buyMercadoLibre.html:42
msgid "Gift Card"
msgstr ""
msgstr "礼品卡"
#: www/views/modals/mercadolibre-card-details.html:30
#: www/views/modals/mercadolibre-card-details.html:35
@ -1360,7 +1405,7 @@ msgstr "礼品卡过期"
#: www/views/buyAmazon.html:111
msgid "Gift card generated and ready to use."
msgstr "礼品卡生成并准备使用。"
msgstr "礼品卡已生成,可以使用了。"
#: src/js/controllers/bitpayCard.js:114
#: src/js/controllers/bitpayCard.js:124
@ -1375,7 +1420,7 @@ msgstr "礼品卡生成并准备使用。"
#: src/js/controllers/tx-details.js:193
#: src/js/controllers/tx-details.js:56
msgid "Go Back"
msgstr "返回 #"
msgstr "返回\t#"
#: src/js/controllers/confirm.js:131
#: src/js/controllers/onboarding/backupRequest.js:20
@ -1406,7 +1451,7 @@ msgstr "硬件钱包"
#: src/js/controllers/create.js:180
#: src/js/controllers/join.js:145
msgid "Hardware wallets are not yet supported with Bitcoin Cash"
msgstr "硬體錢包不支持小比特幣"
msgstr "比特币现金钱包暂时不支持硬件钱包"
#: www/views/tab-settings.html:20
msgid "Help & Support"
@ -1415,7 +1460,7 @@ msgstr "帮助与支持"
#: src/js/controllers/bitpayCard.js:112
#: src/js/controllers/tab-settings.js:51
msgid "Help and support information is available at the website."
msgstr "此網站提供幫助及支援資訊"
msgstr "已在网站上提供帮助和支持"
#: www/views/addresses.html:25
msgid "Hide"
@ -1498,7 +1543,7 @@ msgstr "我已经把它写下来"
#: www/views/preferences.html:45
msgid "If enabled, all sensitive information (private key and recovery phrase) and actions (spending and exporting) associated with this wallet will be protected."
msgstr "如果启用,将保护所有的敏感信息(私人密钥和恢复短语) 和与这个钱包关联的操作 (支出和出口)."
msgstr "如果启用,与此钱包相关的所有敏感信息(私钥、回复短语)和操作(消费、导出)都将受到保护。"
#: www/views/advancedSettings.html:23
msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab."
@ -1518,7 +1563,7 @@ msgstr "如果你有额外的反馈,请让我们知道通过点击设置选项
#: www/views/includes/screenshotWarningModal.html:8
msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen."
msgstr "如果你拿一张截图,您的备份可能会被其他应用程序。您可以安全备份与物理纸和一支钢笔。"
msgstr "如果您截一张屏幕截图,您的备份可能会被其他应用程序浏览。您可以用实体纸和笔来安全备份。"
#: www/views/tab-import-hardware.html:42
#: www/views/tab-import-phrase.html:80
@ -1548,7 +1593,7 @@ msgstr "为了验证您的钱包的备份,请键入您的密码。"
#: www/views/mercadoLibreCards.html:24
#: www/views/modals/mercadolibre-card-details.html:29
msgid "Inactive"
msgstr "处于非活动状态"
msgstr "禁用"
#: www/views/includes/walletItem.html:9
#: www/views/includes/walletList.html:6
@ -1578,7 +1623,7 @@ msgstr "网络地址不正确"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr "资金不足"
msgstr "确认的资金不足"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1588,7 +1633,7 @@ msgstr "费用的资金不足"
#: www/views/tab-settings.html:123
msgid "Integrations"
msgstr ""
msgstr "积分"
#: www/views/includes/walletHistory.html:49
msgid "Invalid"
@ -1688,7 +1733,7 @@ msgstr "上个月"
#: www/views/preferencesCash.html:18
#: www/views/tx-details.html:94
msgid "Learn more"
msgstr "更多資訊"
msgstr "了解更多"
#: www/views/backup.html:43
msgid "Let's verify your backup phrase."
@ -1709,7 +1754,7 @@ msgstr "锁定应用"
#: src/js/controllers/lockSetup.js:23
msgid "Lock by Fingerprint"
msgstr "通过指纹挂起应用。"
msgstr "通过指纹锁定"
#: src/js/controllers/lockSetup.js:14
msgid "Lock by PIN"
@ -1773,7 +1818,7 @@ msgstr "梅尔卡多里弗巴西礼品卡"
#: src/js/controllers/buyMercadoLibre.js:98
msgid "Mercadolibre Gift Card Service is not available at this moment. Please try back later."
msgstr "馬卡杜勒比禮品卡服務現時未能使用,請稍後再試"
msgstr "Mercadolibre 礼品卡服务暂时不可用,请稍后再试。"
#: www/views/modals/txp-details.html:131
msgid "Merchant Message"
@ -1783,7 +1828,7 @@ msgstr "商人的消息"
#: www/views/buyMercadoLibre.html:54
#: www/views/topup.html:63
msgid "Miner Fee"
msgstr "礦工費用"
msgstr "矿工费用"
#: src/js/services/bwcError.js:134
msgid "Missing parameter"
@ -1826,7 +1871,7 @@ msgstr "名称"
#: www/views/buyMercadoLibre.html:48
#: www/views/topup.html:56
msgid "Network Cost"
msgstr "網路支援成本"
msgstr "网络手续费"
#: src/js/services/bwcError.js:47
msgid "Network error"
@ -1855,7 +1900,7 @@ msgstr "没钱包"
#: src/js/controllers/buyAmazon.js:115
#: src/js/controllers/buyMercadoLibre.js:115
msgid "No access key defined"
msgstr "没有定义的访问键"
msgstr "授权密钥未定义"
#: www/views/onboarding/backupRequest.html:5
msgid "No backup, no bitcoin."
@ -2003,7 +2048,7 @@ msgstr "好的"
#: www/views/modals/tx-status.html:36
#: www/views/modals/tx-status.html:46
msgid "OKAY"
msgstr "OKAY"
msgstr "确定"
#: www/views/modals/terms.html:15
msgid "Official English Disclaimer"
@ -2045,7 +2090,7 @@ msgstr "打开 GitHub 项目"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr "开放的洞察力"
msgstr "打开浏览器"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2061,7 +2106,7 @@ msgstr "打开网站"
#: src/js/controllers/preferencesCash.js:32
msgid "Open bitcoincash.org?"
msgstr "打開小比特幣網址bitcoincash.org?"
msgstr "打开 bitcoincash.org"
#: src/js/controllers/cashScan.js:18
msgid "Open the recovery tool."
@ -2155,6 +2200,10 @@ msgstr "支付被拒绝"
msgid "Payment Sent"
msgstr "支付已发送"
#: www/views/includes/slideToAcceptSuccess.html:12
msgid "Share this transaction"
msgstr "分享此交易"
#: www/views/modals/txp-details.html:32
msgid "Payment accepted, but not yet broadcasted"
msgstr "支付已被接受,但尚未广播"
@ -2172,8 +2221,8 @@ msgid "Payment details"
msgstr "支付明细"
#: www/views/modals/paypro.html:6
msgid "Payment request"
msgstr "付请求"
msgid "Payment Request"
msgstr "付请求"
#: www/views/mercadoLibreCards.html:22
#: www/views/modals/mercadolibre-card-details.html:39
@ -2503,7 +2552,7 @@ msgstr "请扫描你的指纹"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr "掃描你的錢包以存取小比特幣"
msgstr "扫描您的 Bitcoin Cash 钱包"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2525,6 +2574,14 @@ msgstr "搜索交易"
msgid "Search or enter bitcoin address"
msgstr "搜索或输入比特币地址"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "剪贴板"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "您的剪贴板为空"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "搜索交易"
@ -2583,9 +2640,68 @@ msgid "Send by email"
msgstr "通过电邮发送"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "从发送"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "发送到"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "粘贴剪贴板"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "粘贴地址"
#: www/views/tab-send.html:27
msgid "Transfer between wallets"
msgstr "在钱包之间转账"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "扫描二维码"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "更快地发送比特币!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "保存常用地址,只需点击一下即可将比特币发送到这些地址"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "添加您的第一个联系人"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "您的比特币钱包为空"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "首先,购买 Bitcoin Cash (BCH) 或 Bitcoin Core (BTC),或者共享您的地址。"
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "您可以从任何钱包或服务接收比特币。"
#: www/views/tab-send.html:72
#: www/views/shapeshift.html:23
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。"
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "立即购买比特币"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "显示我的地址"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "发送最大数量"
@ -2802,16 +2918,21 @@ msgstr "超级经济"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr "支持小比特幣"
msgstr "支持 Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
msgstr "扫描"
#: www/views/includes/incomingDataMenu.html:89
#: www/views/paperWallet.html:3
msgctxt "List item"
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
msgid "Sweeping Wallet..."
@ -2852,7 +2973,7 @@ msgstr "使用条款"
#: www/views/tab-create-personal.html:118
#: www/views/tab-import-phrase.html:68
msgid "Testnet"
msgstr "Testnet"
msgstr "测试网"
#: www/views/includes/incomingDataMenu.html:61
msgid "Text"
@ -2979,6 +3100,14 @@ msgstr "此应用程序商店你比特币与尖端的安全。"
msgid "This bitcoin payment request has expired."
msgstr "这比特币付款请求已过期。"
#: www/views/review.html:55
msgid "Payment expires:"
msgstr "付款到期:"
#: www/views/review.html:56
msgid "Payment request has expired"
msgstr "付款请求已过期"
#: www/views/join.html:133
#: www/views/tab-create-personal.html:103
#: www/views/tab-create-shared.html:132
@ -3020,10 +3149,6 @@ msgstr "发送到"
msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service."
msgstr "若要开始,请买比特币或共享您的地址。你可以从任何钱包或服务接收比特币。"
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。"
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr "到 {{reason}},您必须首先添加您的 BitPay 帐户-{{email}}"
@ -3036,6 +3161,26 @@ msgstr "在进展充值..."
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr "充值 {{amountStr}},记入借方卡 ({{cardLastNumber}})"
#: www/views/shapeshift.html:30
msgid "Start ShapeShift"
msgstr "开始 ShapeShift"
#: www/views/shapeshift.html:30
msgid "Exchange your BTC to BCH in minutes."
msgstr "在数分钟内将您的 BTC 兑换为 BCH。"
#: www/views/shapeshift.html:30
msgid "To start the process you need to add funds to your wallet."
msgstr "要开始兑换,您需要先向钱包中充入资金。"
#: www/views/shapeshift.html:30
msgid "The process is fast and you will receive the exchanged amount in your wallet."
msgstr "兑换操作非常快,您将在自己的钱包中收到兑换后的金额。"
#: www/views/shapeshift.html:34
msgid "This service is provided by the third-party ShapeShift, who will charge a small fee for the service. The fee will be shown before you start the transaction."
msgstr "此服务由第三方 ShapeShift 提供,他们将收取少量服务费。所需费用将在您开始交易之前显示。"
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
#: www/views/modals/wallet-balance.html:23
@ -3192,7 +3337,7 @@ msgstr "查看服务条款"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr "查看交易记录的洞察"
msgstr "在 Explorer.Bitcoin.com 上查看交易"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3627,3 +3772,172 @@ msgstr "下载的 {{updatingTxHistoryProgress}} 交易"
#: www/views/includes/walletInfo.html:18
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "社区"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "探索 Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash 游戏"
#: www/views/includes/community.html:29
msgid "Share the Wallet App"
msgstr "分享钱包应用"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "新闻"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "矿池"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "工具"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "比特币价格图表"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "免费的 Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "您的比特币钱包已就绪!"
#: src/js/controllers/amount.js:49
msgid "Address does not contain currency information, please make sure you are sending the correct currency."
msgstr "地址未包含货币信息,请确保您发送的货币正确。"
#: www/views/review.html:4
msgid "Review Transaction"
msgstr "检查交易"
#: src/js/controllers/review.controller.js:36
msgid "You are sending"
msgstr "您将发送"
#: src/js/controllers/review.controller.js:66
msgid "You are shifting"
msgstr "您将兑换"
#: www/views/review.html:36
msgid "To:"
msgstr "到:"
#: www/views/review.html:53
msgid "Add personal note"
msgstr "添加个人注释"
#: www/views/review.html:87
msgid "Suggested by merchant:"
msgstr "商户建议:"
#: src/js/controllers/review.controller.js:37
msgid "Enter text here"
msgstr "在此处输入文本"
#: www/views/review.html:57
msgid "Personal note:"
msgstr "个人注释:"
#: www/views/review.html:69
msgid "Less than 1 cent"
msgstr "少于 1 美分"
#: src/js/services/incomingData.js:129
msgid "This invoice is no longer accepting payments"
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 的响应无效"

View file

@ -8,7 +8,7 @@
"postinstall": "npm run apply:copay && echo && echo \"Repo configured for standard Copay distribution. To switch to the BitPay distribution, run 'npm run apply:bitpay'.\" && echo",
"start": "echo && echo \"Choose a distribution by running 'npm run apply:copay' or 'npm run apply:bitpay'.\" && echo",
"apply:copay": "npm i fs-extra@0.30 && cd app-template && node apply.js copay && cd .. && npm i",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && 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",
"apply:bitpay": "npm i fs-extra@0.30 && cd app-template && node apply.js bitpay && cd .. && npm i",
"unstage-package": "git reset package.json",
"clean-all": "git clean -dfx"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

View file

@ -0,0 +1,32 @@
[Sign]
## [REQUIRED] Your Application Certificate Identity
ApplicationIdentity = 3rd Party Mac Developer Application: Saint Bitts LLC (299HJ3G3BP)
## [OPTIONAL] Parent entitlements file
ParentEntitlements = entitlements-parent.plist
## [OPTIONAL] Child entitlements file
ChildEntitlements = entitlements-child.plist
## [OPTIONAL] Sandbox. Default: Yes
Sandbox = Yes
[Package]
## [REQUIRED for --pkg] Your Installer Certificate Identity
InstallerIdentity = 3rd Party Mac Developer Installer: Saint Bitts LLC (299HJ3G3BP)
## [OPTIONAL for --pkg] Installation path
InstallPath = /Applications
[Info.plist]
## [OPTIONAL] Your app bundle identifier
CFBundleIdentifier = com.bitcoin.mwallet.mac
## [REQUIRED] Team ID obtained from Apple Developer -> Membership -> Team ID
NWTeamID = 299HJ3G3BP
## Properties of Info.plist will be overwritten in this section.
[Resources]
## [OPTIONAL] Your custom icon file
Icon = ../resources/bitcoin.com/mac/pkg/app.icns
## [OPTIONAL] Locales
## If Locales is not set, all current locales are preserved.
## If comma separated locale list (e.g. en,fr,zh_CN) is given, you should have
## additional [Locale locale_name] section for each locale containing localized strings.
## Locales not in the list will be removed.
Locales = en

View file

@ -0,0 +1,259 @@
#!/usr/bin/env python
import argparse
import ConfigParser
import shutil
import os
import fnmatch
import plistlib
import tempfile
from datetime import datetime
import sys
import io
bundleid = None
verbose = False
def info(msg):
global verbose
if verbose:
print '[INFO] %s' % msg
def error(msg):
print '[ERROR] %s' % msg
print '\nFailed.'
sys.exit(1)
def system(cmd):
info(cmd)
os.system(cmd)
def check_options(config, section, required_options, msg):
missed_options = []
for option in required_options:
if not config.has_option(section, option):
missed_options.append(option)
if len(missed_options) != 0:
error(msg % (section, ', '.join(missed_options)))
def glob(pathname, pattern, returnOnFound=False):
matches = []
for root, dirnames, filenames in os.walk(pathname):
for dirname in fnmatch.filter(dirnames, pattern):
if returnOnFound:
return os.path.join(root, dirname)
matches.append(os.path.join(root, dirname))
for filename in fnmatch.filter(filenames, pattern):
if returnOnFound:
return os.path.join(root, filename)
matches.append(os.path.join(root, filename))
return matches
def get_bundle_id(args):
global bundleid
if bundleid is None:
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
bundleid = plist['CFBundleIdentifier']
return bundleid
def get_from_info_plist(args, key, default=None):
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
if key in plist:
return plist[key]
else:
return default
def patch_info_plist_file(file, replaces):
plist = plistlib.readPlist(file)
for (key, val) in replaces:
plist[key] = val
plistlib.writePlist(plist, file)
def generate_infoplist_strings_file(file, items):
with io.open(file, 'w', encoding='utf-16') as fd:
for item in items:
fd.write(unicode('%s = "%s";\n' % item, 'utf-8'))
def read_config(args):
print '\nParsing config file %s' % args.config_file
if not os.path.isfile(args.config_file):
error('%s does not exist' % args.config_file)
config = ConfigParser.SafeConfigParser()
config.optionxform = str # set to str to prevent transforming into lower cases
config.read(args.config_file)
check_options(config, 'Sign', ['ApplicationIdentity'], 'Missed options in [%s]: %s')
if args.pkg:
check_options(config, 'Package', ['InstallerIdentity'], 'Missed options for --pkg in [%s]: %s')
return config
def copy_to_output(args):
print '\nCopying %s to %s' % (args.input, args.output)
shutil.rmtree(args.output, ignore_errors=True)
shutil.copytree(args.input, args.output, symlinks=True) # symblic links are required
def patch_info_plist(config, args):
print '\nPatching Info.plist files'
replaces = []
for (key, val) in config.items('Info.plist'):
replaces.append((key, val))
file = os.path.join(args.output, 'Contents/Info.plist')
info(file)
patch_info_plist_file(file, replaces)
info_plist_files = glob(os.path.join(args.output, 'Contents/Versions'), 'Info.plist')
for file in info_plist_files:
if 'nwjs Framework' in file:
tmp_replaces = [('CFBundleIdentifier', '%s.framework' % get_bundle_id(args))]
elif 'nwjs Helper' in file:
tmp_replaces = [('CFBundleIdentifier', '%s.helper' % get_bundle_id(args))]
else:
error('Cannot patch unknown Info.plist %s' % file)
info(file)
patch_info_plist_file(file, tmp_replaces)
def patch_locales(config, args):
print '\nPatching locales'
locales = config.get('Resources', 'Locales').split(',')
removed_locales = []
generated_locales = []
for infoplist_strings_file in glob(os.path.join(args.output, 'Contents/Resources'), 'InfoPlist.strings'):
locale_dir = os.path.dirname(infoplist_strings_file)
(locale, _) = os.path.splitext(os.path.basename(locale_dir))
if locale not in locales:
removed_locales.append(locale)
shutil.rmtree(locale_dir)
elif config.has_section('Locale %s' % locale):
generated_locales.append(locale)
generate_infoplist_strings_file(infoplist_strings_file, config.items('Locale %s' % locale))
else:
error('Missing [Locale %s] section' % locale)
if len(generated_locales) > 0:
info('Generated locales for %s' % ', '.join(generated_locales))
if len(removed_locales) > 0:
info('Removed locales for %s' % ', '.join(removed_locales))
removed_paks = []
for local_pak in glob(os.path.join(args.output, 'Contents/Versions'), 'locale.pak'):
locale_dir = os.path.dirname(local_pak)
(locale, _) = os.path.splitext(os.path.basename(locale_dir))
if locale != 'en' and locale not in locales:
removed_paks.append(locale)
shutil.rmtree(locale_dir)
if len(removed_paks) > 0:
info('Removed .pak files for %s' % ', '.join(removed_locales))
def patch_icon(config, args):
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
icon = os.path.join(os.path.dirname(args.config_file), config.get('Resources', 'Icon'))
dest_icon = os.path.join(args.output, 'Contents/Resources/%s' % plist['CFBundleIconFile'])
info('Copying icon from %s to %s' % (icon, dest_icon))
shutil.copy2(icon, dest_icon)
def codesign_app(config, args):
print '\nCodesigning'
bundleid = get_bundle_id(args)
identity = config.get('Sign', 'ApplicationIdentity')
sandbox = True
if config.has_option('Sign', 'Sandbox'):
sandbox = config.getboolean('Sign', 'Sandbox')
## sign child frameworks and helpers
(_, tmp_child_entitlements) = tempfile.mkstemp()
if config.has_option('Sign', 'ChildEntitlements'):
child = config.get('Sign', 'ChildEntitlements')
child_entitlements = plistlib.readPlist(child)
else:
child_entitlements = {
'com.apple.security.app-sandbox' : sandbox,
'com.apple.security.inherit' : True
}
plistlib.writePlist(child_entitlements, tmp_child_entitlements)
info('Child entitlements: %s' % tmp_child_entitlements)
libffmpeg = glob(os.path.join(args.output, 'Contents/Versions/55.0.2883.87/nwjs Framework.framework/Versions/A'), 'libffmpeg.dylib', returnOnFound=True)
system('codesign --deep --force --verbose --verify --sign "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, libffmpeg))
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
(_, tmp_parent_entitlements) = tempfile.mkstemp()
if config.has_option('Sign', 'ParentEntitlements'):
parent = config.get('Sign', 'ParentEntitlements')
parent_entitlements = plistlib.readPlist(parent)
else:
parent_entitlements = {}
teamid = get_from_info_plist(args, 'NWTeamID', default=None)
if teamid is None:
groupid = bundleid
else:
groupid = '%s.%s' % (teamid, bundleid)
parent_entitlements['com.apple.security.app-sandbox'] = sandbox
parent_entitlements['com.apple.security.application-groups'] = [groupid]
plistlib.writePlist(parent_entitlements, tmp_parent_entitlements)
info('Parent entitlements: %s' % tmp_parent_entitlements)
system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_parent_entitlements, args.output))
def productbuild(config, args):
print '\nRunning productbuild'
installer_identity = config.get('Package', 'InstallerIdentity')
if config.has_option('Package', 'InstallPath'):
install_path = config.get('Package', 'InstallPath')
else:
install_path = '/Applications'
system('productbuild --component "%s" "%s" --sign "%s" "%s"' % (args.output, install_path, installer_identity, args.pkg))
def main():
parser = argparse.ArgumentParser(description='Signing tool for NW.js app')
parser.add_argument('-C', '--config-file', default='build.cfg', help='config file. (default: build.cfg)')
parser.add_argument('-I', '--input', default='nwjs.app', help='path to input app. (default: nwjs.app)')
parser.add_argument('-O', '--output', default='nwjs_output.app', help='path to output app. (default: nwjs_output.app)')
parser.add_argument('-S', '--skip-patching', default=False, help='run codesign without patching the app. (default: False)', action='store_true')
parser.add_argument('-P', '--pkg', default=None, help='run productbuild to generate .pkg after codesign. (default: None)')
parser.add_argument('-V', '--verbose', default=False, help='display detailed information. (default: False)', action='store_true')
args = parser.parse_args()
global verbose
verbose = args.verbose
# read config file
config = read_config(args)
# make a copy
copy_to_output(args)
if not args.skip_patching:
# patch Info.plist
patch_info_plist(config, args)
# process resources & locales
if config.has_section('Resources'):
if config.has_option('Resources', 'Locales'):
patch_locales(config, args)
if config.has_option('Resources', 'Icon'):
patch_icon(config, args)
# codesign
codesign_app(config, args)
if args.pkg:
productbuild(config, args)
print '\nDone.'
if __name__ == "__main__":
main()

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>299HJ3G3BP.com.bitcoin.mwallet.mac</string>
</array>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict>
</plist>

View file

@ -1,20 +1,25 @@
ext {
ANDROID_SUPPORT_V4_VERSION = '26.1.0'
}
configurations.all {
resolutionStrategy {
force "com.google.android.gms:play-services-auth:11.8.0"
force "com.google.android.gms:play-services-identity:11.8.0"
force "com.google.android.gms:play-services-ads:11.8.0"
force "com.google.android.gms:play-services-base:11.8.0"
force "com.google.android.gms:play-services-gcm:11.8.0"
force "com.google.android.gms:play-services-analytics:11.8.0"
force "com.google.android.gms:play-services-location:11.8.0"
force "com.google.android.gms:play-services-basement:11.8.0"
force "com.google.android.gms:play-services-tagmanager:11.8.0"
force 'com.google.firebase:firebase-core:11.8.0'
force 'com.google.firebase:firebase-crash:11.8.0'
force 'com.google.firebase:firebase-auth:11.8.0'
force 'com.google.firebase:firebase-common:11.8.0'
force 'com.google.firebase:firebase-config:11.8.0'
force 'com.google.firebase:firebase-perf:11.8.0'
force 'com.google.firebase:firebase-messaging:11.8.0'
}
resolutionStrategy {
force "com.android.support:support-v4:26.1.0"
force "com.google.android.gms:play-services-auth:11.8.0"
force "com.google.android.gms:play-services-identity:11.8.0"
force "com.google.android.gms:play-services-ads:11.8.0"
force "com.google.android.gms:play-services-base:11.8.0"
force "com.google.android.gms:play-services-gcm:11.8.0"
force "com.google.android.gms:play-services-analytics:11.8.0"
force "com.google.android.gms:play-services-location:11.8.0"
force "com.google.android.gms:play-services-basement:11.8.0"
force "com.google.android.gms:play-services-tagmanager:11.8.0"
force 'com.google.firebase:firebase-core:11.8.0'
force 'com.google.firebase:firebase-crash:11.8.0'
force 'com.google.firebase:firebase-auth:11.8.0'
force 'com.google.firebase:firebase-common:11.8.0'
force 'com.google.firebase:firebase-config:11.8.0'
force 'com.google.firebase:firebase-perf:11.8.0'
force 'com.google.firebase:firebase-messaging:11.8.0'
}
}

View file

@ -19,7 +19,9 @@ var modules = [
'copayApp.controllers',
'copayApp.directives',
'copayApp.addons',
'bitcoincom.directives'
'bitcoincom.controllers',
'bitcoincom.directives',
'bitcoincom.services'
];
var copayApp = window.copayApp = angular.module('copayApp', modules);
@ -29,4 +31,6 @@ angular.module('copayApp.services', []);
angular.module('copayApp.controllers', []);
angular.module('copayApp.directives', []);
angular.module('copayApp.addons', []);
angular.module('bitcoincom.controllers', []);
angular.module('bitcoincom.directives', []);
angular.module('bitcoincom.services', []);

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService) {
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService, platformInfo) {
var config = configService.getSync();
var defaults = configService.getDefaults();
@ -21,6 +21,9 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
$timeout(function() {
var form = addressbookForm;
if (data && form) {
if (data.result) {
data = data.result;
}
data = data.replace(/^bitcoin(cash)?:/, '');
form.address.$setViewValue(data);
form.address.$isValid = true;
@ -35,6 +38,16 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
var translated = bitcoinCashJsService.readAddress(addressbook.address);
addressbook.address = translated.legacy;
}
var channel = "ga";
if (platformInfo.isCordova) {
channel = "firebase";
}
var log = new window.BitAnalytics.LogEvent("contact_created", [{
"coin": $scope.addressbookEntry.coin
}], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$timeout(function() {
addressbookService.add(addressbook, function(err, ab) {
if (err) {

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('addressbookViewController', function($scope, $state, $timeout, lodash, addressbookService, popupService, $ionicHistory, platformInfo, gettextCatalog, configService, bitcoinCashJsService) {
angular.module('copayApp.controllers').controller('addressbookViewController', function($scope, sendFlowService, $state, $timeout, lodash, addressbookService, popupService, $ionicHistory, platformInfo, gettextCatalog, configService, bitcoinCashJsService) {
var config = configService.getSync();
var defaults = configService.getDefaults();
@ -21,23 +21,14 @@ angular.module('copayApp.controllers').controller('addressbookViewController', f
});
$scope.sendTo = function() {
$ionicHistory.removeBackView();
$state.go('tabs.send');
$timeout(function() {
var to = '';
if ($scope.addressbookEntry.coin == 'bch') {
var a = 'bitcoincash:' + $scope.addressbookEntry.address;
to = bitcoinCashJsService.readAddress(a).legacy;
} else {
to = $scope.addressbookEntry.address;
}
$state.transitionTo('tabs.send.amount', {
toAddress: to,
toName: $scope.addressbookEntry.name,
toEmail: $scope.addressbookEntry.email,
coin: $scope.addressbookEntry.coin
});
}, 100);
var stateParams = {
data: $scope.addressbookEntry.address,
toName: $scope.addressbookEntry.name,
toEmail: $scope.addressbookEntry.email,
coin: $scope.addressbookEntry.coin
};
sendFlowService.start(stateParams);
};
$scope.remove = function(addressbookEntry) {

View file

@ -13,10 +13,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController',
$scope.hideNextSteps = {
value: config.hideNextSteps.enabled
};
$scope.displayBitcoinCoreEnabled = {
value: config.displayBitcoinCore.enabled
};
};
$scope.spendUnconfirmedChange = function() {
@ -52,17 +48,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController',
});
};
$scope.displayBitcoinCoreChange = function() {
var opts = {
displayBitcoinCore: {
enabled: $scope.displayBitcoinCoreEnabled.value
}
};
configService.set(opts, function(err) {
if (err) $log.debug(err);
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
updateConfig();

View file

@ -0,0 +1,774 @@
'use strict';
(function(){
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;
// Variables
vm.allowSend = false;
vm.altCurrencyList = [];
vm.alternativeAmount = '';
vm.alternativeUnit = '';
vm.amount = '0';
vm.availableFunds = '';
vm.canSendAllAvailableFunds = true;
vm.errorMessage = '';
// Use insufficient for logic, as when the amount is invalid, funds being
// either sufficent or insufficient doesn't make sense.
vm.fundsAreInsufficient = false;
vm.globalResult = '';
vm.isRequestingSpecificAmount = false;
vm.listComplete = false;
vm.lastUsedPopularList = [];
vm.maxAmount = 0;
vm.minAmount = 0;
vm.sendableFunds = '';
vm.showSendMaxButton = false;
vm.showSendLimitMaxButton = false;
vm.thirdParty = false;
vm.unit = '';
// Functions
vm.changeUnit = changeUnit;
vm.close = close;
vm.findCurrency = findCurrency;
vm.finish = finish;
vm.goBack = goBack;
vm.loadMore = loadMore;
vm.next = next;
vm.openPopup = openPopup;
vm.pushDigit = pushDigit;
vm.removeDigit = removeDigit;
vm.save = save;
vm.sendMax = sendMax;
$scope.$on('$ionicView.beforeEnter', onBeforeEnter);
$scope.$on('$ionicView.leave', onLeave);
var LENGTH_EXPRESSION_LIMIT = 19;
var LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT = 8;
var LENGTH_AFTER_COMMA_EXPRESSION_LIMIT = 8;
var altCurrencyModal = null;
var altUnitIndex = 0;
var availableUnits = [];
var canSendMax = true;
var fiatCode;
var isNW = platformInfo.isNW;
var isAndroid = platformInfo.isAndroid;
var isIos = platformInfo.isIOS;
var lastUsedAltCurrencyList = [];
var passthroughParams = {};
var satToUnit;
var transactionSendableAmount = {
crypto: '',
satoshis: null
};
var unitDecimals;
var unitIndex = 0;
var unitToSatoshi;
var useSendMax = false;
var walletSpendableAmount = {
crypto: '',
satoshis: null
};
function onLeave() {
angular.element($window).off('keydown');
}
function onBeforeEnter(event, data) {
if (data.direction == "back") {
sendFlowService.state.pop();
}
initCurrencies();
passthroughParams = sendFlowService.state.getClone();
console.log('amount onBeforeEnter after back sendflow ', passthroughParams);
vm.fromWalletId = passthroughParams.fromWalletId;
vm.toWalletId = passthroughParams.toWalletId;
vm.minAmount = parseFloat(passthroughParams.minAmount);
vm.maxAmount = parseFloat(passthroughParams.maxAmount);
vm.isRequestingSpecificAmount = !passthroughParams.fromWalletId;
vm.showSendMaxButton = !vm.isRequestingSpecificAmount;
var config = configService.getSync().wallet.settings;
unitToSatoshi = config.unitToSatoshi;
satToUnit = 1 / unitToSatoshi;
unitDecimals = config.unitDecimals;
setAvailableUnits();
updateUnitUI();
var reNr = /^[1234567890\.]$/;
var reOp = /^[\*\+\-\/]$/;
if (!isAndroid && !isIos) {
angular.element($window).on('keydown', function(e) {
if (!e.key) return;
if (e.which === 8) { // you can add others here inside brackets.
if (!altCurrencyModal) {
e.preventDefault();
vm.removeDigit();
}
}
if (e.key.match(reNr)) {
vm.pushDigit(e.key);
} else if (e.key.match(reOp)) {
pushOperator(e.key);
} else if (e.keyCode === 86) {
if (e.ctrlKey || e.metaKey) processClipboard();
} else if (e.keyCode === 13) vm.finish();
$timeout(function() {
$scope.$apply();
});
});
}
resetAmount();
processAmount();
$timeout(function() {
$ionicScrollDelegate.resize();
}, 10);
function setAvailableUnits() {
var defaults = configService.getDefaults();
var configCache = configService.getSync();
availableUnits = [];
var coinFromWallet = '';
if (passthroughParams.fromWalletId) {
var fromWallet = profileService.getWallet(passthroughParams.fromWalletId);
coinFromWallet = fromWallet.coin;
} else {
var toWallet = profileService.getWallet(passthroughParams.toWalletId);
coinFromWallet = toWallet.coin;
}
if (coinFromWallet === 'bch') {
availableUnits.push({
name: 'Bitcoin Cash',
id: 'bch',
shortName: (configCache.bitcoinCashAlias || defaults.bitcoinCashAlias).toUpperCase(),
});
};
if (coinFromWallet === 'btc') {
availableUnits.push({
name: 'Bitcoin',
id: 'btc',
shortName: (configCache.bitcoinAlias || defaults.bitcoinAlias).toUpperCase(),
});
}
unitIndex = 0;
// currency have preference
var fiatName;
if (passthroughParams.currency) {
fiatCode = passthroughParams.currency;
altUnitIndex = unitIndex
unitIndex = availableUnits.length;
} else {
fiatCode = config.alternativeIsoCode || 'USD';
fiatName = config.alternanativeName || fiatCode;
altUnitIndex = availableUnits.length;
}
availableUnits.push({
name: fiatName || fiatCode,
// TODO
id: fiatCode,
shortName: fiatCode,
isFiat: true,
});
unitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
altUnitIndex = 0;
if (passthroughParams.fromWalletId) {
var fromWallet = profileService.getWallet(passthroughParams.fromWalletId);
updateAvailableFundsFromWallet(fromWallet);
}
if (passthroughParams.thirdParty) {
vm.thirdParty = passthroughParams.thirdParty; // Parse stringified JSON-object
if (vm.thirdParty) {
initShapeshift();
}
}
}
}
function 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) {
vm.amount = value;
processAmount();
$timeout(function() {
$scope.$apply();
});
}
function processClipboard() {
if (!isNW) return;
var value = nodeWebkitService.readFromClipboard();
if (value && evaluate(value) > 0) paste(evaluate(value));
}
function sendMax() {
if (canSendMax) {
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() {
vm.unit = availableUnits[unitIndex].shortName;
vm.alternativeUnit = availableUnits[altUnitIndex].shortName;
processAmount();
$log.debug('Update unit coin @amount unit:' + vm.unit + " alternativeUnit:" + vm.alternativeUnit);
}
function changeUnit() {
vm.amount = '0';
if (!(availableUnits[unitIndex].isFiat && availableUnits.length > 2 && altUnitIndex == 0)) {
unitIndex++;
if (unitIndex >= availableUnits.length) unitIndex = 0;
}
if (availableUnits[unitIndex].isFiat) {
altUnitIndex = altUnitIndex == 0 && availableUnits.length > 2 ? 1 : 0;
} else {
altUnitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
}
updateAvailableFundsStringIfNeeded();
updateUnitUI();
}
function pushDigit(digit) {
if (vm.amount && digit != '.') {
var amountSplitByComma = vm.amount.split('.');
if (amountSplitByComma.length > 1 && amountSplitByComma[1].length >= LENGTH_AFTER_COMMA_EXPRESSION_LIMIT) return;
if (amountSplitByComma.length == 1 && amountSplitByComma[0].length >= LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT) return;
}
if (vm.amount && vm.amount.length >= LENGTH_EXPRESSION_LIMIT) return;
if (vm.amount.indexOf('.') > -1 && digit == '.') return;
if (vm.amount == '0' && digit == '0') return;
if (availableUnits[unitIndex].isFiat && vm.amount.indexOf('.') > -1 && vm.amount[vm.amount.indexOf('.') + 2]) return;
if (vm.amount == '0' && digit != '.') {
vm.amount = '';
}
if (vm.amount == '' && digit == '.') {
vm.amount = '0';
}
vm.amount = (vm.amount + digit).replace('..', '.');
processAmount();
}
function pushOperator(operator) {
if (!vm.amount || vm.amount.length == 0) return;
vm.amount = pushOperator(vm.amount);
function pushOperator(val) {
if (!isOperator(lodash.last(val))) {
return val + operator;
} else {
return val.slice(0, -1) + operator;
}
}
}
function isOperator(val) {
var regex = /[\/\-\+\x\*]/;
return regex.test(val);
}
function isExpression(val) {
var regex = /^\.?\d+(\.?\d+)?([\/\-\+\*x]\d?\.?\d+)+$/;
return regex.test(val);
}
function removeDigit() {
vm.amount = (vm.amount).toString().slice(0, -1);
processAmount();
}
function resetAmount() {
vm.amount = vm.alternativeAmount = vm.globalResult = '0';
vm.allowSend = false;
}
function openPopup() {
$ionicModal.fromTemplateUrl('views/modals/altCurrency.html', {
scope: $scope
}).then(function(modal) {
altCurrencyModal = modal;
altCurrencyModal.show();
});
}
function close() {
altCurrencyModal.remove();
altCurrencyModal = null;
}
function processAmount() {
var formatedValue = format(vm.amount);
var result = evaluate(formatedValue);
var amountInCrypto = 0;
if (lodash.isNumber(result)) {
vm.globalResult = isExpression(vm.amount) ? '= ' + processResult(result) : '';
if (availableUnits[unitIndex].isFiat) {
var a = fromFiat(result);
if (a) {
amountInCrypto = a;
var amountInSatoshis = a * unitToSatoshi;
vm.fundsAreInsufficient = !!passthroughParams.fromWalletId
&& walletSpendableAmount.satoshis !== null
&& walletSpendableAmount.satoshis < amountInSatoshis;
vm.alternativeAmount = txFormatService.formatAmount(amountInSatoshis, true);
vm.allowSend = lodash.isNumber(a)
&& a > 0
&& (!vm.minAmount || a >= vm.minAmount)
&& (!vm.maxAmount || a <= vm.maxAmount)
&& !vm.fundsAreInsufficient;
} else {
if (result) {
vm.alternativeAmount = 'N/A';
} else {
vm.alternativeAmount = null;
}
vm.fundsAreInsufficient = false;
vm.allowSend = false;
}
} else {
amountInCrypto = result;
vm.fundsAreInsufficient = passthroughParams.fromWalletId
&& walletSpendableAmount.satoshis !== null
&& walletSpendableAmount.satoshis < result * unitToSatoshi;
vm.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
vm.allowSend = lodash.isNumber(result)
&& result > 0
&& (!vm.minAmount || result >= vm.minAmount)
&& (!vm.maxAmount || result <= vm.maxAmount)
&& !vm.fundsAreInsufficient;
}
} else {
vm.fundsAreInsufficient = false;
}
if (vm.fundsAreInsufficient) {
vm.errorMessage = gettextCatalog.getString('Not enough available funds');
} else if (amountInCrypto && vm.thirdParty && vm.thirdParty.id === 'shapeshift') {
if (amountInCrypto < vm.minAmount) {
vm.errorMessage = gettextCatalog.getString('Amount is below minimum');
} else if (amountInCrypto > vm.maxAmount) {
vm.errorMessage = gettextCatalog.getString('Amount is above maximum');
} else {
vm.errorMessage = '';
}
} else {
vm.errorMessage = '';
}
}
function processResult(val) {
if (availableUnits[unitIndex].isFiat) return $filter('formatFiatAmount')(val);
else return txFormatService.formatAmount(val.toFixed(unitDecimals) * unitToSatoshi, true);
}
function fromFiat(val) {
return parseFloat((rateService.fromFiat(val, fiatCode, availableUnits[altUnitIndex].id) * satToUnit).toFixed(unitDecimals));
}
function toFiat(val) {
if (!rateService.getRate(fiatCode)) return;
return parseFloat((rateService.toFiat(val * unitToSatoshi, fiatCode, availableUnits[unitIndex].id)).toFixed(2));
}
function evaluate(val) {
var result;
try {
result = $scope.$eval(val);
} catch (e) {
return 0;
}
if (!lodash.isFinite(result)) return 0;
return result;
}
function format(val) {
if (!val) return;
var result = val.toString();
if (isOperator(lodash.last(val))) result = result.slice(0, -1);
return result.replace('x', '*');
}
function finish() {
var unit = availableUnits[unitIndex];
var uiAmount = evaluate(format(vm.amount));
var satoshis = 0;
if (unit.isFiat) {
satoshis = Math.floor(fromFiat(uiAmount) * unitToSatoshi);
} else {
satoshis = Math.floor(uiAmount * unitToSatoshi);
}
var confirmData = {
amount: (useSendMax && canSendMax) ? undefined : satoshis,
displayAddress: passthroughParams.displayAddress,
fromWalletId: passthroughParams.fromWalletId,
sendMax: useSendMax,
toAddress: passthroughParams.toAddress,
toWalletId: passthroughParams.toWalletId
};
if (vm.thirdParty) {
confirmData.thirdParty = vm.thirdParty;
}
if (!confirmData.fromWalletId) {
$state.transitionTo('tabs.paymentRequest.confirm', confirmData);
} else {
sendFlowService.goNext(confirmData);
useSendMax = false;
}
}
// Currency
var nextCurrencies = 10;
var completeAlternativeList = [];
var popularCurrencyList = [
{isoCode: 'USD', order: 0},
{isoCode: 'EUR', order: 1},
{isoCode: 'JPY', order: 2},
{isoCode: 'GBP', order: 3},
{isoCode: 'AUD', order: 4},
{isoCode: 'CAD', order: 5},
{isoCode: 'CHF', order: 6},
{isoCode: 'CNY', order: 7},
{isoCode: 'KRW', order: 8},
{isoCode: 'HKD', order: 9},
];
function initCurrencies() {
var unusedCurrencyList = [{
isoCode: 'LTL'
}, {
isoCode: 'BTC'
}, {
isoCode: 'BCC'
}, {
isoCode: 'BCH_BTC'
}, {
isoCode: 'BCH'
}];
rateService.whenAvailable(function() {
vm.listComplete = false;
var idx = lodash.indexBy(unusedCurrencyList, 'isoCode');
var idx2 = lodash.indexBy(lastUsedAltCurrencyList, 'isoCode');
var idx3 = lodash.indexBy(popularCurrencyList, 'isoCode');
var alternatives = rateService.listAlternatives(true);
lodash.each(alternatives, function(c) {
if (idx3[c.isoCode]) {
idx3[c.isoCode].name = c.name;
}
if (!idx[c.isoCode] && !idx2[c.isoCode] && !idx3[c.isoCode]) {
completeAlternativeList.push(c);
}
});
vm.altCurrencyList = completeAlternativeList.slice(0, 10);
vm.lastUsedPopularList = lodash.unique(lodash.union(lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
rateService.updateRates();
$timeout(function() {
$scope.$apply();
});
});
}
function loadMore() {
$timeout(function() {
vm.altCurrencyList = completeAlternativeList.slice(0, nextCurrencies);
nextCurrencies += 10;
vm.listComplete = vm.altCurrencyList.length >= completeAlternativeList.length;
$scope.$broadcast('scroll.infiniteScrollComplete');
}, 100);
}
function next() {
useSendMax = false;
vm.finish();
}
function findCurrency(search) {
if (!search) initCurrencies();
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union(lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
vm.altCurrencyList = lodash.filter(list, function(item) {
var val = item.name
var val2 = item.isoCode;
return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase());
});
$timeout(function() {
$scope.$apply();
});
}
function save(newAltCurrency) {
var opts = {
wallet: {
settings: {
alternativeName: newAltCurrency.name,
alternativeIsoCode: newAltCurrency.isoCode,
}
}
};
configService.set(opts, function(err) {
if (err) $log.warn(err);
walletService.updateRemotePreferences(profileService.getWallets());
var altUnitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
availableUnits[altUnitIndex].id = newAltCurrency.isoCode;
availableUnits[altUnitIndex].name = newAltCurrency.isoCode;
availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode;
fiatCode = newAltCurrency.isoCode;
updateAvailableFundsStringIfNeeded();
updateUnitUI();
close();
});
}
function updateAvailableFundsStringIfNeeded() {
if (passthroughParams.fromWalletId && walletSpendableAmount.satoshis !== null) {
vm.availableFunds = walletSpendableAmount.crypto;
if (availableUnits[unitIndex].isFiat) {
var coin = availableUnits[altUnitIndex].id;
txFormatService.formatAlternativeStr(coin, walletSpendableAmount.satoshis, function formatCallback(formatted){
if (formatted) {
$scope.$apply(function() {
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;
});
}
});
}
}
}
function setMaximumButtonFromWallet(wallet) {
console.log('sendmax setMaximumButtonFromWallet()');
var minSatoshis = vm.minAmount * unitToSatoshi;
var maxSatoshis = vm.maxAmount * unitToSatoshi;
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 {
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 {
console.log('sendmax Showing sendmax as all available because no limits.');
canSendMax = true;
vm.showSendMaxButton = true;
vm.showSendLimitMaxButton = false;
transactionSendableAmount.satoshis = walletSpendableAmount.satoshis;
}
if (vm.showSendMaxButton || vm.showSendLimitMaxButton) {
console.log('sendmax Setting max button text');
transactionSendableAmount.crypto = txFormatService.formatAmountStr(wallet.coin, transactionSendableAmount.satoshis);
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;
});
}
});
}
}
}
}
})();

View file

@ -1,628 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicModal, $ionicScrollDelegate, $ionicHistory, storageService, walletService, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, popupService, bwcError, payproService, profileService, bitcore, amazonService, nodeWebkitService) {
var _id;
var unitToSatoshi;
var satToUnit;
var unitDecimals;
var satToBtc;
var SMALL_FONT_SIZE_LIMIT = 10;
var LENGTH_EXPRESSION_LIMIT = 19;
var LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT = 8;
var LENGTH_AFTER_COMMA_EXPRESSION_LIMIT = 8;
var isNW = platformInfo.isNW;
var unitIndex = 0;
var altUnitIndex = 0;
var availableUnits = [];
var fiatCode;
var fixedUnit;
$scope.amountModel = { amount: 0 };
$scope.isChromeApp = platformInfo.isChromeApp;
$scope.isAndroid = platformInfo.isAndroid;
$scope.isIos = platformInfo.isIOS;
$scope.$on('$ionicView.leave', function() {
angular.element($window).off('keydown');
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
initCurrencies();
if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) {
$scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
$scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
$scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
$scope.fromWalletId = data.stateParams.fromWalletId;
}
if (data.stateParams.noPrefix) {
$scope.showWarningMessage = data.stateParams.noPrefix != 0;
if ($scope.showWarningMessage) {
var message = 'Address doesn\'t contain currency information, please make sure you are sending the correct currency.';
popupService.showAlert('', message, function() {}, 'Ok');
}
}
var config = configService.getSync().wallet.settings;
function setAvailableUnits() {
var defaults = configService.getDefaults();
var configCache = configService.getSync();
availableUnits = [];
var hasBCHWallets = profileService.getWallets({
coin: 'bch'
}).length;
if (hasBCHWallets) {
availableUnits.push({
name: 'Bitcoin Cash',
id: 'bch',
shortName: (configCache.bitcoinCashAlias || defaults.bitcoinCashAlias).toUpperCase(),
});
};
var hasBTCWallets = profileService.getWallets({
coin: 'btc'
}).length;
if (hasBTCWallets) {
availableUnits.push({
name: 'Bitcoin',
id: 'btc',
shortName: (configCache.bitcoinAlias || defaults.bitcoinAlias).toUpperCase(),
});
}
unitIndex = 0;
if (data.stateParams.coin) {
var coins = data.stateParams.coin.split(',');
var newAvailableUnits = [];
lodash.each(coins, function(c) {
var coin = lodash.find(availableUnits, {
id: c
});
if (!coin) {
$log.warn('Could not find desired coin:' + data.stateParams.coin)
} else {
newAvailableUnits.push(coin);
}
});
if (newAvailableUnits.length > 0) {
availableUnits = newAvailableUnits;
}
}
// currency have preference
var fiatName;
if (data.stateParams.currency) {
fiatCode = data.stateParams.currency;
altUnitIndex = unitIndex
unitIndex = availableUnits.length;
} else {
fiatCode = config.alternativeIsoCode || 'USD';
fiatName = config.alternanativeName || fiatCode;
altUnitIndex = availableUnits.length;
}
availableUnits.push({
name: fiatName || fiatCode,
// TODO
id: fiatCode,
shortName: fiatCode,
isFiat: true,
});
if (data.stateParams.fixedUnit) {
fixedUnit = true;
}
unitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
altUnitIndex = 0;
};
// Go to...
_id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID)
$scope.nextStep = data.stateParams.nextStep;
setAvailableUnits();
updateUnitUI();
$scope.hasMaxAmount = true;
if ($ionicHistory.backView().stateName == 'tabs.receive') {
$scope.hasMaxAmount = false;
}
$scope.showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard');
$scope.recipientType = data.stateParams.recipientType || null;
$scope.toAddress = data.stateParams.toAddress;
$scope.displayAddress = data.stateParams.displayAddress;
$scope.toName = data.stateParams.toName;
$scope.toEmail = data.stateParams.toEmail;
$scope.toColor = data.stateParams.toColor;
if (!$scope.nextStep && !data.stateParams.toAddress) {
$log.error('Bad params at amount')
throw ('bad params');
}
var reNr = /^[1234567890\.]$/;
var reOp = /^[\*\+\-\/]$/;
if (!$scope.isAndroid && !$scope.isIos) {
var disableKeys = angular.element($window).on('keydown', function(e) {
if (!e.key) return;
if (e.which === 8) { // you can add others here inside brackets.
if (!$scope.altCurrencyModal) {
e.preventDefault();
$scope.removeDigit();
}
}
if (e.key.match(reNr)) {
$scope.pushDigit(e.key);
} else if (e.key.match(reOp)) {
$scope.pushOperator(e.key);
} else if (e.keyCode === 86) {
if (e.ctrlKey || e.metaKey) processClipboard();
} else if (e.keyCode === 13) $scope.finish();
$timeout(function() {
$scope.$apply();
});
});
}
$scope.specificAmount = $scope.specificAlternativeAmount = '';
$scope.isCordova = platformInfo.isCordova;
unitToSatoshi = config.unitToSatoshi;
satToUnit = 1 / unitToSatoshi;
satToBtc = 1 / 100000000;
unitDecimals = config.unitDecimals;
$scope.resetAmount();
// in SAT ALWAYS
if ($stateParams.toAmount) {
$scope.amountModel.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals);
}
$scope.processAmount();
$timeout(function() {
$ionicScrollDelegate.resize();
}, 10);
});
$scope.goBack = function() {
if ($scope.shapeshiftOrderId) {
$state.go('tabs.send').then(function() {
$ionicHistory.clearHistory();
$state.go('tabs.home').then(function() {
$state.transitionTo('tabs.shapeshift');
});
});
} else {
$ionicHistory.goBack();
}
}
function paste(value) {
$scope.amountModel.amount = value;
$scope.processAmount();
$timeout(function() {
$scope.$apply();
});
};
function processClipboard() {
if (!isNW) return;
var value = nodeWebkitService.readFromClipboard();
if (value && evaluate(value) > 0) paste(evaluate(value));
};
$scope.sendMax = function() {
$scope.useSendMax = true;
$scope.finish();
};
$scope.toggleAlternative = function() {
if ($scope.amountModel.amount && isExpression($scope.amountModel.amount)) {
var amount = evaluate(format($scope.amountModel.amount));
$scope.globalResult = '= ' + processResult(amount);
}
};
function updateUnitUI() {
$scope.unit = availableUnits[unitIndex].shortName;
$scope.alternativeUnit = availableUnits[altUnitIndex].shortName;
$scope.processAmount();
$log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit);
};
$scope.changeUnit = function() {
$scope.amountModel.amount = '0';
if (fixedUnit) return;
if (!(availableUnits[unitIndex].isFiat && availableUnits.length > 2 && altUnitIndex == 0)) {
unitIndex++;
if (unitIndex >= availableUnits.length) unitIndex = 0;
}
if (availableUnits[unitIndex].isFiat) {
altUnitIndex = altUnitIndex == 0 && availableUnits.length > 2 ? 1 : 0;
} else {
altUnitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
}
updateUnitUI();
};
$scope.changeAlternativeUnit = function() {
// Do nothing is fiat is not main unit
if (!availableUnits[unitIndex].isFiat) return;
var nextCoin = lodash.findIndex(availableUnits, function(x) {
if (x.isFiat) return false;
if (x.id == availableUnits[altUnitIndex].id) return false;
return true;
});
if (nextCoin >= 0) {
altUnitIndex = nextCoin;
updateUnitUI();
}
};
function checkFontSize() {
if ($scope.amountModel.amount && $scope.amountModel.amount.length >= SMALL_FONT_SIZE_LIMIT) $scope.smallFont = true;
else $scope.smallFont = false;
};
$scope.pushDigit = function(digit) {
if ($scope.amountModel.amount && digit != '.') {
var amountSplitByComma = $scope.amountModel.amount.split('.');
if (amountSplitByComma.length > 1 && amountSplitByComma[1].length >= LENGTH_AFTER_COMMA_EXPRESSION_LIMIT) return;
if (amountSplitByComma.length == 1 && amountSplitByComma[0].length >= LENGTH_BEFORE_COMMA_EXPRESSION_LIMIT) return;
}
if ($scope.amountModel.amount && $scope.amountModel.amount.length >= LENGTH_EXPRESSION_LIMIT) return;
if (($scope.amountModel.amount.indexOf('.') > -1 || $scope.amountModel.amount == '') && digit == '.') return;
if ($scope.amountModel.amount == '0' && digit == '0') return;
if (availableUnits[unitIndex].isFiat && $scope.amountModel.amount.indexOf('.') > -1 && $scope.amountModel.amount[$scope.amountModel.amount.indexOf('.') + 2]) return;
if ($scope.amountModel.amount == '0' && digit != '.') { $scope.amountModel.amount = ''}
$scope.amountModel.amount = ($scope.amountModel.amount + digit).replace('..', '.');
checkFontSize();
$scope.processAmount();
navigator.vibrate(50);
};
$scope.pushOperator = function(operator) {
if (!$scope.amountModel.amount || $scope.amountModel.amount.length == 0) return;
$scope.amountModel.amount = _pushOperator($scope.amountModel.amount);
function _pushOperator(val) {
if (!isOperator(lodash.last(val))) {
return val + operator;
} else {
return val.slice(0, -1) + operator;
}
};
};
function isOperator(val) {
var regex = /[\/\-\+\x\*]/;
return regex.test(val);
};
function isExpression(val) {
var regex = /^\.?\d+(\.?\d+)?([\/\-\+\*x]\d?\.?\d+)+$/;
return regex.test(val);
};
$scope.removeDigit = function() {
$scope.amountModel.amount = ($scope.amountModel.amount).toString().slice(0, -1);
$scope.processAmount();
checkFontSize();
};
$scope.resetAmount = function() {
$scope.amountModel.amount = $scope.alternativeAmount = $scope.globalResult = '';
$scope.allowSend = false;
checkFontSize();
navigator.vibrate(50);
};
$scope.openPopup = function() {
$ionicModal.fromTemplateUrl('views/modals/altCurrency.html', {
scope: $scope
}).then(function(modal) {
$scope.altCurrencyModal = modal;
$scope.altCurrencyModal.show();
});
};
$scope.close = function() {
$scope.altCurrencyModal.remove();
$scope.altCurrencyModal = false;
};
$scope.processAmount = function() {
var formatedValue = format($scope.amountModel.amount);
var result = evaluate(formatedValue);
if (lodash.isNumber(result)) {
$scope.globalResult = isExpression($scope.amountModel.amount) ? '= ' + processResult(result) : '';
if (availableUnits[unitIndex].isFiat) {
var a = fromFiat(result);
if (a) {
$scope.alternativeAmount = txFormatService.formatAmount(a * unitToSatoshi, true);
$scope.allowSend = lodash.isNumber(a) && a > 0
&& (!$scope.shapeshiftOrderId
|| (a >= $scope.minShapeshiftAmount && a <= $scope.maxShapeshiftAmount));
} else {
if (result) {
$scope.alternativeAmount = 'N/A';
} else {
$scope.alternativeAmount = null;
}
$scope.allowSend = false;
}
} else {
$scope.alternativeAmount = $filter('formatFiatAmount')(toFiat(result));
$scope.allowSend = lodash.isNumber(result) && result > 0
&& (!$scope.shapeshiftOrderId
|| (result >= $scope.minShapeshiftAmount && result <= $scope.maxShapeshiftAmount));
}
}
};
function processResult(val) {
if (availableUnits[unitIndex].isFiat) return $filter('formatFiatAmount')(val);
else return txFormatService.formatAmount(val.toFixed(unitDecimals) * unitToSatoshi, true);
};
function fromFiat(val) {
return parseFloat((rateService.fromFiat(val, fiatCode, availableUnits[altUnitIndex].id) * satToUnit).toFixed(unitDecimals));
};
function toFiat(val) {
if (!rateService.getRate(fiatCode)) return;
return parseFloat((rateService.toFiat(val * unitToSatoshi, fiatCode, availableUnits[unitIndex].id)).toFixed(2));
};
function evaluate(val) {
var result;
try {
result = $scope.$eval(val);
} catch (e) {
return 0;
}
if (!lodash.isFinite(result)) return 0;
return result;
};
function format(val) {
if (!val) return;
var result = val.toString();
if (isOperator(lodash.last(val))) result = result.slice(0, -1);
return result.replace('x', '*');
};
$scope.finish = function() {
function finish() {
var unit = availableUnits[unitIndex];
var _amount = evaluate(format($scope.amountModel.amount));
var coin = unit.id;
if (unit.isFiat) {
coin = availableUnits[altUnitIndex].id;
}
if ($scope.nextStep) {
$state.transitionTo($scope.nextStep, {
id: _id,
amount: $scope.useSendMax ? null : _amount,
currency: unit.id.toUpperCase(),
coin: coin,
useSendMax: $scope.useSendMax
});
} else {
var amount = _amount;
if (unit.isFiat) {
amount = (fromFiat(amount) * unitToSatoshi).toFixed(0);
} else {
amount = (amount * unitToSatoshi).toFixed(0);
}
var confirmData = {
recipientType: $scope.recipientType,
toAmount: amount,
toAddress: $scope.toAddress,
displayAddress: $scope.displayAddress || $scope.toAddress,
toName: $scope.toName,
toEmail: $scope.toEmail,
toColor: $scope.toColor,
coin: coin,
useSendMax: $scope.useSendMax,
};
if ($scope.shapeshiftOrderId) {
var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/';
shapeshiftOrderUrl += $scope.shapeshiftOrderId;
confirmData.description = shapeshiftOrderUrl;
confirmData.fromWalletId = $scope.fromWalletId;
if (confirmData.useSendMax) {
var wallet = lodash.find(profileService.getWallets({ coin: coin }),
function(w) {
return w.id == $scope.fromWalletId;
});
var balance = parseFloat(wallet.cachedBalance.substring(0, wallet.cachedBalance.length-4));
if (balance < $scope.minShapeshiftAmount * 1.04) {
confirmData.useSendMax = false;
confirmData.toAmount = $scope.minShapeshiftAmount * unitToSatoshi;
} else if (balance > $scope.maxShapeshiftAmount) {
confirmData.useSendMax = false;
confirmData.toAmount = $scope.maxShapeshiftAmount * unitToSatoshi * 0.99;
}
}
}
$state.transitionTo('tabs.send.confirm', confirmData);
}
$scope.useSendMax = null;
}
if ($scope.showWarningMessage) {
var u = $scope.unit == 'BCH' || $scope.unit == 'BTC' ? $scope.unit : $scope.alternativeUnit;
var message = 'Are you sure you want to send ' + u.toUpperCase() + '?';
popupService.showConfirm(message, '', 'Yes', 'No', function(res) {
if (!res) {
$scope.useSendMax = null;
return;
};
finish();
});
} else {
finish();
}
};
// Currency
var next = 10;
var completeAlternativeList = [];
var popularCurrencyList = [
{isoCode: 'USD', order: 0},
{isoCode: 'EUR', order: 1},
{isoCode: 'JPY', order: 2},
{isoCode: 'GBP', order: 3},
{isoCode: 'AUD', order: 4},
{isoCode: 'CAD', order: 5},
{isoCode: 'CHF', order: 6},
{isoCode: 'CNY', order: 7},
{isoCode: 'KRW', order: 8},
{isoCode: 'HKD', order: 9},
]
function initCurrencies() {
var unusedCurrencyList = [{
isoCode: 'LTL'
}, {
isoCode: 'BTC'
}, {
isoCode: 'BCC'
}, {
isoCode: 'BCH_BTC'
}, {
isoCode: 'BCH'
}];
rateService.whenAvailable(function() {
$scope.listComplete = false;
var idx = lodash.indexBy(unusedCurrencyList, 'isoCode');
var idx2 = lodash.indexBy($scope.lastUsedAltCurrencyList, 'isoCode');
var idx3 = lodash.indexBy(popularCurrencyList, 'isoCode');
var alternatives = rateService.listAlternatives(true);
lodash.each(alternatives, function(c) {
if (idx3[c.isoCode]) {
idx3[c.isoCode].name = c.name;
}
if (!idx[c.isoCode] && !idx2[c.isoCode] && !idx3[c.isoCode]) {
completeAlternativeList.push(c);
}
});
$scope.altCurrencyList = completeAlternativeList.slice(0, 10);
$scope.lastUsedPopularList = lodash.unique(lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList), 'isoCode');
$timeout(function() {
$scope.$apply();
});
});
}
$scope.loadMore = function() {
$timeout(function() {
$scope.altCurrencyList = completeAlternativeList.slice(0, next);
next += 10;
$scope.listComplete = $scope.altCurrencyList.length >= completeAlternativeList.length;
$scope.$broadcast('scroll.infiniteScrollComplete');
}, 100);
};
$scope.findCurrency = function(search) {
if (!search) initCurrencies();
var list = lodash.unique(lodash.union(completeAlternativeList, lodash.union($scope.lastUsedAltCurrencyList, popularCurrencyList)), 'isoCode');
$scope.altCurrencyList = lodash.filter(list, function(item) {
var val = item.name
var val2 = item.isoCode;
return lodash.includes(val.toLowerCase(), search.toLowerCase()) || lodash.includes(val2.toLowerCase(), search.toLowerCase());
});
$timeout(function() {
$scope.$apply();
});
};
$scope.save = function(newAltCurrency) {
var opts = {
wallet: {
settings: {
alternativeName: newAltCurrency.name,
alternativeIsoCode: newAltCurrency.isoCode,
}
}
};
configService.set(opts, function(err) {
if (err) $log.warn(err);
walletService.updateRemotePreferences(profileService.getWallets());
var altUnitIndex = lodash.findIndex(availableUnits, {
isFiat: true
});
availableUnits[altUnitIndex].id = newAltCurrency.isoCode;
availableUnits[altUnitIndex].name = newAltCurrency.isoCode;
availableUnits[altUnitIndex].shortName = newAltCurrency.isoCode;
fiatCode = newAltCurrency.isoCode;
updateUnitUI();
$scope.close();
});
};
});

View file

@ -0,0 +1,604 @@
describe('amountController', function(){
var configCache,
configService,
gettextCatalog,
$controller,
$ionicHistory,
$rootScope,
ongoingProcess,
platformInfo,
popupService,
profileService,
rateService,
sendFlowService,
shapeshiftService,
txFormatService,
$scope,
$state,
$stateParams;
beforeEach(function(){
module('ngLodash');
module('copayApp.controllers');
configCache = {
wallet: {
settings: {
unitToSatoshi: 100000000
}
}
};
configService = jasmine.createSpyObj(['getDefaults','getSync']);
configService.getDefaults.and.returnValue({
bitcoinCashAlias: 'bch',
bitcoinAlias: 'btc'
});
configService.getSync.and.returnValue(configCache);
gettextCatalog = jasmine.createSpyObj(['getString']);
gettextCatalog.getString.and.callFake(function(str){ return str; });
$ionicHistory = jasmine.createSpyObj(['backView']);
ongoingProcess = jasmine.createSpyObj(['set']);
platformInfo = {
isChromeApp: false,
isAndroid: false,
isIos: true
};
popupService = jasmine.createSpyObj(['showAlert']);
profileService = jasmine.createSpyObj(['getWallet', 'getWallets']);
rateService = jasmine.createSpyObj(['fromFiat', 'listAlternatives', 'updateRates', 'whenAvailable']);
sendFlowService = jasmine.createSpyObj(['getStateClone', 'pushState']);
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 = {};
inject(function(_$controller_, _$rootScope_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
$rootScope = _$rootScope_;
});
});
it('receives fromWalletId and toAddress.', function() {
var backView = {
stateName: 'ignoreme'
};
$ionicHistory.backView.and.returnValue(backView);
var wallet = {
status: {
isValid: true,
spendableAmount: 123456
}
};
profileService.getWallet.and.returnValue(wallet);
profileService.getWallets.and.returnValue([{}]);
rateService.fromFiat.and.returnValue(12); // satoshis or coins?
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: {},
$stateParams: $stateParams,
txFormatService: txFormatService,
walletService: {}
});
var sendFlowState = {
fromWalletId: 'fd56c1e7-e3ac-4fd9-8afc-27b9c1b3718b',
toAddress: 'qrup46avn8t466xxwlzs4qelht7cnwvesv2e29wf7s'
};
sendFlowService.getStateClone.and.returnValue(sendFlowState);
$scope.$emit('$ionicView.beforeEnter', {});
//expect($scope.fromWalletId).toBe('fd56c1e7-e3ac-4fd9-8afc-27b9c1b3718b');
//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');
});
});
});

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('backupController',
function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, lodash, profileService, bwcService, walletService, ongoingProcess, popupService, gettextCatalog, $ionicModal, firebaseEventsService) {
function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, lodash, profileService, bwcService, walletService, ongoingProcess, popupService, gettextCatalog, $ionicModal) {
if ($state.current.name == 'onboarding.backup') {
$scope.onboarding = true;
@ -89,7 +89,8 @@ angular.module('copayApp.controllers').controller('backupController',
$scope.setFlow(2);
})
} else {
firebaseEventsService.logEvent('backed_up_wallet');
//firebaseEventsService.logEvent('backed_up_wallet');
openConfirmBackupModal();
}
};

View file

@ -1,7 +1,9 @@
'use strict';
angular.module('copayApp.controllers').controller('buyBitcoindotcomController',
function($scope, $timeout, $ionicModal, $log, $state, $ionicHistory, lodash, bitcoincomService, externalLinkService, popupService) {
function($scope, platformInfo, externalLinkService) {
$scope.os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
$scope.openExternalLink = function(url) {
externalLinkService.open(url);

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('communityController', function($scope, communityService, $ionicScrollDelegate, $timeout, platformInfo, configService) {
angular.module('copayApp.controllers').controller('communityController', function($scope, communityService, $ionicScrollDelegate, $timeout, platformInfo, configService, externalLinkService) {
$scope.hide = false;
@ -29,7 +29,7 @@ angular.module('copayApp.controllers').controller('communityController', functio
}
$scope.open = function(url) {
window.open(url, '_system');
externalLinkService.open(url, false);
}
});

View file

@ -1,25 +1,20 @@
'use strict';
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService) {
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $timeout, $ionicScrollDelegate, $ionicLoading, ionicToast, addressbookService, gettextCatalog, walletService, platformInfo, lodash, configService, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, feeService, bitcoinCashJsService, bwcError, txConfirmNotification, soundService, clipboardService) {
var countDown = null;
var FEE_TOO_HIGH_LIMIT_PER = 15;
var tx = {};
var lastTxId = "";
// Config Related values
var config = configService.getSync();
var walletConfig = config.wallet;
var unitToSatoshi = walletConfig.settings.unitToSatoshi;
var unitDecimals = walletConfig.settings.unitDecimals;
var satToUnit = 1 / unitToSatoshi;
var configFeeLevel = walletConfig.settings.feeLevel ? walletConfig.settings.feeLevel : 'normal';
// Platform info
var isChromeApp = platformInfo.isChromeApp;
var isCordova = platformInfo.isCordova;
var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
//custom fee flag
var usingCustomFee = false;
@ -31,6 +26,16 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}, 10);
}
$scope.shareTransaction = function() {
var explorerTxUrl = 'https://explorer.bitcoin.com/'+tx.coin+'/tx/'+lastTxId;
if (platformInfo.isCordova) {
var text = 'Take a look at this Bitcoin transaction here: '+explorerTxUrl;
window.plugins.socialsharing.share(text, null, null, null);
} else {
ionicToast.show(gettextCatalog.getString('Copied to clipboard'), 'bottom', false, 3000);
clipboardService.copyToClipboard(explorerTxUrl);
}
};
$scope.showWalletSelector = function() {
$scope.walletSelector = true;
@ -45,7 +50,6 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$ionicConfig.views.swipeBackEnabled(false);
});
function exitWithError(err) {
$log.info('Error setting wallet selector:' + err);
popupService.showAlert(gettextCatalog.getString(), bwcError.msg(err), function() {
@ -68,112 +72,108 @@ angular.module('copayApp.controllers').controller('confirmController', function(
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
var setWalletSelector = function(coin, network, minAmount, cb) {
function setWalletSelector(coin, network, minAmount, cb) {
// no min amount? (sendMax) => look for no empty wallets
minAmount = minAmount || 1;
// no min amount? (sendMax) => look for no empty wallets
minAmount = minAmount || 1;
$scope.wallets = profileService.getWallets({
onlyComplete: true,
network: network,
coin: coin
});
$scope.wallets = profileService.getWallets({
onlyComplete: true,
network: network,
coin: coin
if (tx.fromWalletId) {
$scope.wallets = lodash.filter($scope.wallets, function (w) {
return w.id == tx.fromWalletId;
});
if (tx.fromWalletId) {
$scope.wallets = lodash.filter($scope.wallets, function(w) {
return w.id == tx.fromWalletId;
});
}
if (!$scope.wallets || !$scope.wallets.length) {
setNoWallet(gettextCatalog.getString('No wallets available'), true);
return cb();
}
var filteredWallets = [];
var index = 0;
var walletsUpdated = 0;
lodash.each($scope.wallets, function(w) {
walletService.getStatus(w, {}, function(err, status) {
if (err || !status) {
$log.error(err);
} else {
walletsUpdated++;
w.status = status;
if (!status.availableBalanceSat)
$log.debug('No balance available in: ' + w.name);
if (status.availableBalanceSat > minAmount) {
filteredWallets.push(w);
}
}
if (++index == $scope.wallets.length) {
if (!walletsUpdated)
return cb('Could not update any wallet');
if (lodash.isEmpty(filteredWallets)) {
setNoWallet(gettextCatalog.getString('Insufficient confirmed funds'), true);
}
$scope.wallets = lodash.clone(filteredWallets);
return cb();
}
});
});
};
// Setup $scope
var B = data.stateParams.coin == 'bch' ? bitcoreCash : bitcore;
var networkName;
try {
networkName = (new B.Address(data.stateParams.toAddress)).network.name;
} catch(e) {
var message = gettextCatalog.getString('Invalid address');
var backText = gettextCatalog.getString('Go back');
var learnText = gettextCatalog.getString('Learn more');
popupService.showConfirm(null, message, backText, learnText, function(back) {
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$state.go('tabs.send').then(function() {
$ionicHistory.clearHistory();
if (!back) {
var url = 'https://support.bitpay.com/hc/en-us/articles/115004671663';
externalLinkService.open(url);
}
});
});
return;
}
if (!$scope.wallets || !$scope.wallets.length) {
setNoWallet(gettextCatalog.getString('No wallets available'), true);
return cb();
}
var filteredWallets = [];
var index = 0;
var walletsUpdated = 0;
lodash.each($scope.wallets, function (w) {
walletService.getStatus(w, {}, function (err, status) {
if (err || !status) {
$log.error(err);
} else {
walletsUpdated++;
w.status = status;
if (!status.availableBalanceSat)
$log.debug('No balance available in: ' + w.name);
if (status.availableBalanceSat > minAmount) {
filteredWallets.push(w);
}
}
if (++index == $scope.wallets.length) {
if (!walletsUpdated)
return cb('Could not update any wallet');
if (lodash.isEmpty(filteredWallets)) {
setNoWallet(gettextCatalog.getString('Insufficient confirmed funds'), true);
}
$scope.wallets = lodash.clone(filteredWallets);
return cb();
}
});
});
};
$scope.getContacts = function(addr) {
addressbookService.list(function(err, ab) {
if (err) $log.error(err);
$scope.hasContacts = lodash.isEmpty(ab) ? false : true;
if (!$scope.hasContacts) return cb();
var completeContacts = [];
lodash.each(ab, function(v, k) {
completeContacts.push({
name: lodash.isObject(v) ? v.name : v,
address: k,
email: lodash.isObject(v) ? v.email : null,
recipientType: 'contact',
coin: v.coin,
displayCoin: (v.coin == 'bch'
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase()
});
});
return cb();
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.fromWallet = profileService.getWallet(data.stateParams.fromWalletId); // Wallet to send from
// Grab stateParams
tx = {
toAmount: parseInt(data.stateParams.toAmount),
amount: parseInt(data.stateParams.amount),
sendMax: data.stateParams.useSendMax == 'true' ? true : false,
fromWalletId: data.stateParams.fromWalletId,
toAddress: data.stateParams.toAddress,
displayAddress: data.stateParams.displayAddress,
description: data.stateParams.description,
paypro: data.stateParams.paypro,
feeLevel: configFeeLevel,
spendUnconfirmed: walletConfig.spendUnconfirmed,
// Vanity tx info (not in the real tx)
recipientType: data.stateParams.recipientType || null,
toName: data.stateParams.toName,
toEmail: data.stateParams.toEmail,
toColor: data.stateParams.toColor,
network: networkName,
coin: data.stateParams.coin,
recipientType: $scope.recipientType || null,
toName: null,
toEmail: null,
toColor: null,
network: false,
coin: $scope.fromWallet.coin,
txp: {},
};
@ -182,18 +182,71 @@ angular.module('copayApp.controllers').controller('confirmController', function(
tx.feeRate = parseInt(data.stateParams.requiredFeeRate);
}
if (tx.coin && tx.coin == 'bch') {
if (tx.coin && tx.coin === 'bch') {
tx.feeLevel = 'normal';
}
var B = data.stateParams.coin === 'bch' ? bitcoreCash : bitcore;
var networkName;
$scope.recipientType = null;
try {
if (data.stateParams.toWalletId) { // There is a toWalletId, so we presume this is a wallet-to-wallet transfer
$scope.recipientType = 'wallet'; // set transaction type to wallet-to-wallet
$ionicLoading.show();
var toWallet = profileService.getWallet(data.stateParams.toWalletId);
tx.toColor = toWallet.color;
tx.toName = toWallet.name;
// We need an address to send to, so we ask the walletService to create a new address for the toWallet.
walletService.getAddress(toWallet, true, function (err, addr) {
$ionicLoading.hide();
tx.toAddress = addr;
networkName = (new B.Address(tx.toAddress)).network.name;
tx.network = networkName;
setupTx(tx);
});
} else { // This is a Wallet-to-address transfer
networkName = (new B.Address(tx.toAddress)).network.name;
tx.network = networkName;
setupTx(tx);
}
} catch (e) {
var message = gettextCatalog.getString('Invalid address');
popupService.showAlert(null, message, function () {
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$state.go('tabs.send').then(function () {
$ionicHistory.clearHistory();
});
});
return;
}
});
var setupTx = function(tx) {
if (tx.coin === 'bch') {
tx.displayAddress = bitcoinCashJsService.readAddress(tx.toAddress).cashaddr;
} else {
tx.displayAddress = entry.address;
}
addressbookService.get(tx.coin+tx.toAddress, function(err, addr) { // Check if the recipient is a contact
if (!err && addr) {
tx.toName = addr.name;
tx.toEmail = addr.email;
tx.recipientType = 'contact';
}
});
// Other Scope vars
$scope.isCordova = isCordova;
$scope.isWindowsPhoneApp = isWindowsPhoneApp;
$scope.showAddress = false;
$scope.walletSelectorTitle = gettextCatalog.getString('Send from');
setWalletSelector(tx.coin, tx.network, tx.toAmount, function(err) {
setWalletSelector(tx.coin, tx.network, tx.amount, function(err) {
if (err) {
return exitWithError('Could not update wallets');
}
@ -205,7 +258,9 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}
});
});
$scope.displayBalanceAsFiat = walletConfig.settings.priceDisplay === 'fiat';
};
function getSendMaxInfo(tx, wallet, cb) {
@ -229,7 +284,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
return setSendError(msg);
}
if (tx.toAmount > Number.MAX_SAFE_INTEGER) {
if (tx.amount > Number.MAX_SAFE_INTEGER) {
var msg = gettextCatalog.getString('Amount too big');
$log.warn(msg);
return setSendError(msg);
@ -239,7 +294,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
txp.outputs = [{
'toAddress': tx.toAddress,
'amount': tx.toAmount,
'amount': tx.amount,
'message': tx.description
}];
@ -278,14 +333,17 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.tx = tx;
function updateAmount() {
if (!tx.toAmount) return;
if (!tx.amount) return;
// Amount
tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.toAmount);
tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount);
tx.amountValueStr = tx.amountStr.split(' ')[0];
tx.amountUnitStr = tx.amountStr.split(' ')[1];
txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) {
txFormatService.formatAlternativeStr(wallet.coin, tx.amount, function(v) {
var parts = v.split(' ');
tx.alternativeAmountStr = v;
tx.alternativeAmountValueStr = parts[0];
tx.alternativeAmountUnitStr = (parts.length > 0) ? parts[1] : '';
});
}
@ -337,7 +395,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}
tx.sendMaxInfo = sendMaxInfo;
tx.toAmount = tx.sendMaxInfo.amount;
tx.amount = tx.sendMaxInfo.amount;
updateAmount();
ongoingProcess.set('calculatingFee', false);
$timeout(function() {
@ -388,7 +446,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
function useSelectedWallet() {
if (!$scope.useSendMax) {
showAmount(tx.toAmount);
showAmount(tx.amount);
}
$scope.onWalletSelect($scope.wallet);
@ -397,19 +455,19 @@ angular.module('copayApp.controllers').controller('confirmController', function(
function setButtonText(isMultisig, isPayPro) {
if (isPayPro) {
if (isCordova && !isWindowsPhoneApp) {
if (isCordova) {
$scope.buttonText = gettextCatalog.getString('Slide to pay');
} else {
$scope.buttonText = gettextCatalog.getString('Click to pay');
}
} else if (isMultisig) {
if (isCordova && !isWindowsPhoneApp) {
if (isCordova) {
$scope.buttonText = gettextCatalog.getString('Slide to accept');
} else {
$scope.buttonText = gettextCatalog.getString('Click to accept');
}
} else {
if (isCordova && !isWindowsPhoneApp) {
if (isCordova) {
$scope.buttonText = gettextCatalog.getString('Slide to send');
} else {
$scope.buttonText = gettextCatalog.getString('Click to send');
@ -417,13 +475,14 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}
};
$scope.toggleAddress = function() {
$scope.showAddress = !$scope.showAddress;
};
function showSendMaxWarning(wallet, sendMaxInfo) {
var feeAlternative = '',
msg = '';
function verifyExcludedUtxos() {
var warningMsg = [];
@ -441,15 +500,25 @@ angular.module('copayApp.controllers').controller('confirmController', function(
return warningMsg.join('\n');
};
var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee)
});
feeAlternative = txFormatService.formatAlternativeStr(wallet.coin, sendMaxInfo.fee);
if (feeAlternative) {
msg = gettextCatalog.getString("{{feeAlternative}} will be deducted for bitcoin networking fees ({{fee}}).", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee),
feeAlternative: feeAlternative
});
} else {
msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee)
});
}
var warningMsg = verifyExcludedUtxos();
if (!lodash.isEmpty(warningMsg))
msg += '\n' + warningMsg;
popupService.showAlert(null, msg, function() {});
popupService.showAlert(null, msg, function() {});
};
$scope.onWalletSelect = function(wallet) {
@ -596,6 +665,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
txConfirmNotification.subscribe(wallet, {
txid: txp.txid
});
lastTxId = txp.txid;
}
}, onSendStatusChange);
};
@ -622,11 +692,23 @@ angular.module('copayApp.controllers').controller('confirmController', function(
(processName == 'sendingTx' && !$scope.wallet.canSign() && !$scope.wallet.isPrivKeyExternal())
) && !isOn) {
$scope.sendStatus = 'success';
if (config.soundsEnabled && $scope.wallet.coin == 'bch') {
var audio = new Audio('misc/bch_sent.mp3');
audio.play();
if ($state.current.name === "tabs.send.confirm") { // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device.
soundService.play('misc/payment_sent.mp3');
}
firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin });
var channel = "ga";
if (platformInfo.isCordova) {
channel = "firebase";
}
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
"coin": $scope.wallet.coin,
"type": "outgoing",
"amount": $scope.amount,
"fees": $scope.fee
}], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$timeout(function() {
$scope.$digest();
}, 100);

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('createController',
function($scope, $rootScope, $timeout, $log, lodash, $state, $ionicScrollDelegate, $ionicHistory, profileService, configService, gettextCatalog, ledger, trezor, intelTEE, derivationPathHelper, ongoingProcess, walletService, storageService, popupService, appConfigService, pushNotificationsService, firebaseEventsService, $ionicNavBarDelegate) {
function($scope, $timeout, $log, lodash, $state, $ionicScrollDelegate, $ionicHistory, profileService, configService, gettextCatalog, ledger, trezor, intelTEE, derivationPathHelper, ongoingProcess, walletService, popupService, appConfigService, pushNotificationsService, $ionicNavBarDelegate) {
/* For compressed keys, m*73 + n*34 <= 496 */
var COPAYER_PAIR_LIMITS = {
@ -268,7 +268,7 @@ angular.module('copayApp.controllers').controller('createController',
}, 100);
}
else {
firebaseEventsService.logEvent('wallet_created', { coin: opts.coin });
//firebaseEventsService.logEvent('wallet_created', { coin: opts.coin });
$state.go('tabs.home');
}
}

View file

@ -17,7 +17,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func
}
$scope.$on("$ionicView.beforeEnter", function(event, data) {
var walletId = data.stateParams.id;
var walletId = data.stateParams.toWalletId;
if (!walletId) {
showErrorAndBack('Error', 'No wallet selected');
@ -53,17 +53,26 @@ angular.module('copayApp.controllers').controller('customAmountController', func
$scope.address = bchAddresses[$scope.bchAddressType];
}
$scope.coin = data.stateParams.coin;
$scope.coin = $scope.wallet.coin;
var satoshis = parseInt(data.stateParams.amount, 10);
var parsedAmount = txFormatService.parseAmount(
$scope.wallet.coin,
data.stateParams.amount,
data.stateParams.currency);
satoshis,
'sat');
// Amount in USD or BTC
var amount = parsedAmount.amount;
var currency = parsedAmount.currency;
$scope.amountUnitStr = parsedAmount.amountUnitStr;
configService.whenAvailable(function (config) {
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
$timeout(function () {
$scope.$apply();
});
});
if (currency != 'BTC' && currency != 'BCH') {
// Convert to BTC or BCH
var config = configService.getSync().wallet.settings;

View file

@ -1,53 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, $window, lodash, externalLinkService, configService, platformInfo, feedbackService, ongoingProcess, popupService, appConfigService) {
$scope.score = parseInt($stateParams.score);
$scope.appName = appConfigService.nameCase;
var isAndroid = platformInfo.isAndroid;
var isIOS = platformInfo.isIOS;
var config = configService.getSync();
$scope.skip = function() {
var dataSrc = {
"Email": lodash.values(config.emailFor)[0] || ' ',
"Feedback": ' ',
"Score": $stateParams.score,
"AppVersion": $window.version,
"Platform": ionic.Platform.platform(),
"DeviceVersion": ionic.Platform.version()
};
feedbackService.send(dataSrc, function(err) {
if (err) {
// try to send, but not essential, since the user didn't add a message
$log.warn('Could not send feedback.');
}
});
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: true
});
};
$scope.sendFeedback = function() {
$state.go('tabs.rate.send', {
score: $scope.score
});
};
$scope.goAppStore = function() {
var defaults = configService.getDefaults();
var url;
if (isAndroid)
url = defaults.rateApp.bitcoincom.android;
if (isIOS)
url = defaults.rateApp.bitcoincom.ios;
externalLinkService.open(url);
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: true,
rated: true
});
};
});

View file

@ -1,60 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('rateCardController', function($scope, $state, $timeout, $log, gettextCatalog, platformInfo, storageService, appConfigService) {
$scope.isCordova = platformInfo.isCordova;
$scope.score = 0;
$scope.appName = appConfigService.nameCase;
$scope.goFeedbackFlow = function() {
$scope.hideCard();
if ($scope.isCordova && $scope.score == 5) {
$state.go('tabs.rate.rateApp', {
score: $scope.score
});
} else {
$state.go('tabs.rate.send', {
score: $scope.score
});
}
};
$scope.setScore = function(score) {
$scope.score = score;
switch ($scope.score) {
case 1:
$scope.button_title = gettextCatalog.getString("I think this app is terrible.");
break;
case 2:
$scope.button_title = gettextCatalog.getString("I don't like it");
break;
case 3:
$scope.button_title = gettextCatalog.getString("Meh - it's alright");
break;
case 4:
$scope.button_title = gettextCatalog.getString("I like the app");
break;
case 5:
$scope.button_title = gettextCatalog.getString("This app is fantastic!");
break;
}
$timeout(function() {
$scope.$apply();
});
};
$scope.hideCard = function() {
$log.debug('Feedback card dismissed.')
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = JSON.parse(info);
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
$timeout(function() {
$scope.$apply();
}, 100);
});
});
}
});

View file

@ -1,102 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, $window, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess, platformInfo, appConfigService) {
$scope.sendFeedback = function(feedback, goHome) {
var config = configService.getSync();
var dataSrc = {
"Email": lodash.values(config.emailFor)[0] || ' ',
"Feedback": goHome ? ' ' : feedback,
"Score": $stateParams.score || ' ',
"AppVersion": $window.version,
"Platform": ionic.Platform.platform(),
"DeviceVersion": ionic.Platform.version()
};
if (!goHome) ongoingProcess.set('sendingFeedback', true);
feedbackService.send(dataSrc, function(err) {
if (goHome) return;
ongoingProcess.set('sendingFeedback', false);
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Feedback could not be submitted. Please try again later.'));
return;
}
if (!$stateParams.score) {
popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() {
$scope.feedback.value = '';
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
$ionicHistory.goBack();
}, gettextCatalog.getString('Finish'));
return;
}
$state.go('tabs.rate.complete', {
score: $stateParams.score
});
});
if (goHome) $state.go('tabs.home');
};
$scope.$on("$ionicView.beforeLeave", function(event, data) {
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function(event, data) {
if ($scope.score)
$ionicConfig.views.swipeBackEnabled(false);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isCordova = platformInfo.isCordova;
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
$scope.feedback = {};
switch ($scope.score) {
case 1:
$scope.reaction = "Ouch!";
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 2:
$scope.reaction = gettextCatalog.getString("Oh no!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 3:
$scope.reaction = "Hmm...";
$scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 4:
$scope.reaction = gettextCatalog.getString("Thanks!");
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you how could we improve your experience?");
break;
case 5:
$scope.reaction = gettextCatalog.getString("Thank you!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}.", {
appName: appConfigService.nameCase
}) + ' ' + gettextCatalog.getString("Is there anything we could do better?");
break;
default:
$scope.justFeedback = true;
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}. How could we improve your experience?", {
appName: appConfigService.nameCase
});
break;
}
});
$scope.$on("$ionicView.afterEnter", function() {
$scope.showForm = true;
});
$scope.goBack = function() {
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
$ionicHistory.goBack();
};
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('searchController', function($scope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) {
angular.module('copayApp.controllers').controller('searchController', function($scope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, externalLinkService, bitcoinCashJsService) {
var HISTORY_SHOW_LIMIT = 10;
var currentTxHistoryPage = 0;
@ -21,6 +21,8 @@ angular.module('copayApp.controllers').controller('searchController', function($
function filter(search) {
$scope.filteredTxHistory = [];
$scope.searchTermIsAddress = false;
$scope.searchTermIsTxId = false;
function computeSearchableString(tx) {
var addrbook = '';
@ -29,6 +31,19 @@ angular.module('copayApp.controllers').controller('searchController', function($
var message = tx.message ? tx.message : '';
var comment = tx.note ? tx.note.body : '';
var addressTo = tx.addressTo ? tx.addressTo : '';
if ($scope.wallet.coin === 'bch') {
/**
* For each address
* I translate the legacy address and add in the searchable string the 3 kind of addresses
*/
lodash.each(tx.outputs, function(output) {
var addr = bitcoinCashJsService.translateAddresses(output.address);
addressTo += addr.legacy + addr.bitpay + 'bitcoincash:' + addr.cashaddr
});
}
var txid = tx.txid ? tx.txid : '';
return ((tx.amountStr + message + addressTo + addrbook + searchableDate + comment + txid).toString()).toLowerCase();
}
@ -50,8 +65,19 @@ angular.module('copayApp.controllers').controller('searchController', function($
return lodash.includes(tx.searcheableString, search.toLowerCase());
});
if (search) {
if ((search.indexOf('bitcoincash:') === 0 || search[0] === 'C' || search[0] === 'H' || search[0] === 'p' || search[0] === 'q') && search.replace('bitcoincash:', '').length === 42) { // CashAddr
$scope.searchTermIsAddress = true;
} else if ((search[0] === "1" || search[0] === "3" || search.substring(0, 3) === "bc1") && search.length >= 26 && search.length <= 35) { // Legacy Addresses
$scope.searchTermIsAddress = true;
} else if (search.length === 64) {
$scope.searchTermIsTxId = true;
}
}
if ($scope.filteredTxHistory.length > HISTORY_SHOW_LIMIT) $scope.txHistoryShowMore = true;
else $scope.txHistoryShowMore = false;
return $scope.filteredTxHistory;
};
@ -77,4 +103,14 @@ angular.module('copayApp.controllers').controller('searchController', function($
$scope.txHistoryShowMore = $scope.filteredTxHistory.length > $scope.txHistorySearchResults.length;
};
$scope.searchOnBlockchain = function(searchTerm) {
var url = 'https://explorer.bitcoin.com/'+$scope.wallet.coin+'/search/' + searchTerm;
var optIn = true;
var title = null;
var message = gettextCatalog.getString('Search on Explorer.Bitcoin.com');
var okText = gettextCatalog.getString('Open Explorer');
var cancelText = gettextCatalog.getString('Go Back');
externalLinkService.open(url, optIn, title, message, okText, cancelText);
};
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('nextStepsController', function($scope, nextStepsService, $ionicScrollDelegate, $timeout, configService) {
angular.module('copayApp.controllers').controller('nextStepsController', function($scope, nextStepsService, $ionicScrollDelegate, $timeout, platformInfo, configService, externalLinkService) {
$scope.hide = false;
@ -22,6 +22,6 @@ angular.module('copayApp.controllers').controller('nextStepsController', functio
};
$scope.open = function(url) {
window.open(url, '_system');
externalLinkService.open(url, false)
}
});

View file

@ -1,6 +1,6 @@
'use strict';
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 = {
index: 0
@ -46,62 +46,90 @@ angular.module('copayApp.controllers').controller('tourController',
creatingWallet = true;
ongoingProcess.set('creatingWallet', true);
$timeout(function() {
profileService.createDefaultWallet(function(err, walletClients) {
if (err) {
$log.warn(err);
uxLanguage.init(function(lang) {
var rateCode = uxLanguage.getRateCode(lang);
console.log("When Available: rateService");
rateService.whenAvailable(function() {
var alternatives = rateService.listAlternatives(true);
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);
var newAltCurrency = lodash.find(alternatives, {
'isoCode': rateCode
});
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);
});
}
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);
};
});
})
}, 300);
};
});

View file

@ -59,7 +59,7 @@ angular.module('copayApp.controllers').controller('preferencesController',
};
$scope.openWikiSpendingPassword = function() {
var url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#what-the-spending-password-does';
var url = 'https://walletsupport.bitcoin.com/article/129/what-does-the-spending-password-do-';
var optIn = true;
var title = null;
var message = gettextCatalog.getString('Read more in our Wiki');

View file

@ -4,7 +4,7 @@ angular.module('copayApp.controllers').controller('preferencesAbout',
function($scope, $window, appConfigService, gettextCatalog, externalLinkService, $ionicNavBarDelegate) {
$scope.title = gettextCatalog.getString('About') + ' ' + appConfigService.nameCase;
$scope.version = $window.version;
$scope.version = $window.fullVersion;
$scope.commitHash = $window.commitHash;
$scope.openExternalLink = function() {

View file

@ -16,7 +16,7 @@ angular.module('copayApp.controllers').controller('preferencesBwsUrlController',
};
$scope.resetDefaultUrl = function() {
$scope.bwsurl.value = defaults.bws.url;
$scope.bwsurl.value = ($scope.wallet.coin === 'btc') ? defaults.bws.url : defaults.bwscash.url;
};
$scope.save = function() {
@ -25,15 +25,15 @@ angular.module('copayApp.controllers').controller('preferencesBwsUrlController',
switch ($scope.bwsurl.value) {
case 'prod':
case 'production':
bws = 'https://bws.bitcoin.com/bws/api'
bws = ($scope.wallet.coin === 'btc') ? defaults.bws.url : defaults.bwscash.url;
break;
case 'sta':
case 'staging':
bws = 'https://bws-staging.b-pay.net/bws/api'
bws = 'https://bws-staging.b-pay.net/bws/api';
break;
case 'loc':
case 'local':
bws = 'http://localhost:3232/bws/api'
bws = 'http://localhost:3232/bws/api';
break;
};
if (bws) {

View file

@ -6,7 +6,7 @@ angular.module('copayApp.controllers').controller('preferencesLanguageController
$scope.availableLanguages = uxLanguage.getLanguages();
$scope.openExternalLink = function() {
var url = 'https://crowdin.com/project/copay';
var url = 'https://crowdin.com/project/bitcoincom-wallet';
var optIn = true;
var title = gettextCatalog.getString('Open Translation Community');
var message = gettextCatalog.getString('You can make contributions by signing up on our Crowdin community translation website. Were looking forward to hearing from you!');

View file

@ -75,6 +75,15 @@ angular.module('copayApp.controllers').controller('preferencesNotificationsContr
};
emailService.updateEmail(opts);
var channel = "ga";
if (platformInfo.isCordova) {
channel = "firebase";
}
var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{
"toggle": $scope.emailNotifications.value
}], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
};
$scope.soundNotificationsChange = function() {

View file

@ -0,0 +1,974 @@
'use strict';
(function () {
angular
.module('copayApp.controllers')
.controller('reviewController', reviewController);
function reviewController(addressbookService, bitcoinCashJsService, bitcore, bitcoreCash, bwcError, clipboardService, configService, feeService, gettextCatalog, $interval, $ionicHistory, $ionicModal, ionicToast, lodash, $log, ongoingProcess, platformInfo, popupService, profileService, $scope, sendFlowService, shapeshiftService, soundService, $state, $timeout, txConfirmNotification, txFormatService, walletService) {
var vm = this;
vm.buttonText = '';
vm.destination = {
address: '',
balanceAmount: '',
balanceCurrency: '',
coin: '',
color: '',
currency: '',
currencyColor: '',
kind: '', // 'address', 'contact', 'wallet'
name: ''
};
vm.displayAddress = '';
vm.feeCrypto = '';
vm.feeFiat = '';
vm.fiatCurrency = '';
vm.feeIsHigh = false;
vm.feeLessThanACent = false;
vm.isCordova = platformInfo.isCordova;
vm.memo = '';
vm.notReadyMessage = '';
vm.origin = {
balanceAmount: '',
balanceCurrency: '',
currency: '',
currencyColor: '',
};
vm.originWallet = null;
vm.paymentExpired = false;
vm.personalNotePlaceholder = gettextCatalog.getString('Enter text here');
vm.primaryAmount = '';
vm.primaryCurrency = '';
vm.usingMerchantFee = false;
vm.readyToSend = false;
vm.remainingTimeStr = '';
vm.secondaryAmount = '';
vm.secondaryCurrency = '';
vm.sendingTitle = gettextCatalog.getString('You are sending');
vm.sendStatus = '';
vm.showAddress = true;
vm.thirdParty = false;
vm.wallet = null;
vm.memoExpanded = false;
// Functions
vm.goBack = goBack;
vm.onSuccessConfirm = onSuccessConfirm;
vm.onShareTransaction = onShareTransaction;
var sendFlowData;
var config = null;
var coin = '';
var countDown = null;
var defaults = {};
var usingCustomFee = false;
var usingMerchantFee = false;
var destinationWalletId = '';
var lastTxId = '';
var originWalletId = '';
var priceDisplayIsFiat = true;
var satoshis = null;
var toAddress = '';
var tx = {};
var txPayproData = null;
var unitFromSat = 0;
var FEE_TOO_HIGH_LIMIT_PERCENTAGE = 15;
$scope.$on("$ionicView.beforeEnter", onBeforeEnter);
function onBeforeEnter(event, data) {
console.log('review onBeforeEnter sendflow ', sendFlowService.state);
// Reset from last time
vm.memo = '';
defaults = configService.getDefaults();
sendFlowData = sendFlowService.state.getClone();
originWalletId = sendFlowData.fromWalletId;
if (typeof sendFlowData.amount === 'string') {
satoshis = parseInt(sendFlowData.amount, 10);
} else {
satoshis = sendFlowData.amount;
}
toAddress = sendFlowData.toAddress;
destinationWalletId = sendFlowData.toWalletId;
vm.displayAddress = sendFlowData.displayAddress;
vm.originWallet = profileService.getWallet(originWalletId);
vm.origin.currency = vm.originWallet.coin.toUpperCase();
coin = vm.originWallet.coin;
if (sendFlowData.thirdParty) {
vm.thirdParty = sendFlowData.thirdParty;
switch (vm.thirdParty.id) {
case 'shapeshift':
initShapeshift(function (err) {
if (err) {
// Error stop here
ongoingProcess.set('connectingShapeshift', false);
popupService.showAlert(gettextCatalog.getString('Shapeshift Error'), err.toString(), function () {
$ionicHistory.goBack();
});
} else {
_next(data);
}
});
break;
case 'bip70':
initBip70();
default:
_next(data);
break;
}
} else {
_next(data);
}
function _next() {
configService.get(function onConfig(err, configCache) {
if (err) {
$log.err('Error getting config.', err);
} else {
config = configCache;
priceDisplayIsFiat = config.wallet.settings.priceDisplay === 'fiat';
vm.origin.currencyColor = (vm.originWallet.coin === 'btc' ? defaults.bitcoinWalletColor : defaults.bitcoinCashWalletColor);
console.log("coin", vm.originWallet.coin, vm.origin.currencyColor, config.bitcoinWalletColor, vm.originWallet.coin === 'btc');
unitFromSat = 1 / config.wallet.settings.unitToSatoshi;
}
updateSendAmounts();
getOriginWalletBalance(vm.originWallet);
handleDestinationAsAddress(toAddress, coin);
handleDestinationAsWallet(sendFlowData.toWalletId);
createVanityTransaction(data);
});
}
}
vm.approve = function() {
if (!tx || !vm.originWallet) return;
if (vm.paymentExpired) {
popupService.showAlert(null, gettextCatalog.getString('This bitcoin payment request has expired.', function () {
$ionicHistory.goBack();
}));
vm.sendStatus = '';
$timeout(function() {
$scope.$apply();
});
return;
}
ongoingProcess.set('creatingTx', true, statusChangeHandler);
getTxp(lodash.clone(tx), vm.originWallet, false, function(err, txp) {
ongoingProcess.set('creatingTx', false, statusChangeHandler);
if (err) return;
// confirm txs for more that 20usd, if not spending/touchid is enabled
function confirmTx(cb) {
if (walletService.isEncrypted(vm.originWallet))
return cb();
var amountUsd = parseFloat(txFormatService.formatToUSD(vm.originWallet.coin, txp.amount));
return cb();
};
function publishAndSign() {
if (!vm.originWallet.canSign() && !vm.originWallet.isPrivKeyExternal()) {
$log.info('No signing proposal: No private key');
return walletService.onlyPublish(vm.originWallet, txp, function(err) {
if (err) setSendError(err);
}, statusChangeHandler);
}
walletService.publishAndSign(vm.originWallet, txp, function(err, txp) {
if (err) return setSendError(err);
if (config.confirmedTxsNotifications && config.confirmedTxsNotifications.enabled) {
txConfirmNotification.subscribe(vm.originWallet, {
txid: txp.txid
});
lastTxId = txp.txid;
}
}, statusChangeHandler);
};
confirmTx(function(nok) {
if (nok) {
vm.sendStatus = '';
$timeout(function() {
$scope.$apply();
});
return;
}
publishAndSign();
});
});
};
vm.chooseFeeLevel = function(tx, wallet) {
if (wallet.coin == 'bch') return;
if (usingMerchantFee) return;
var scope = $rootScope.$new(true);
scope.network = tx.network;
scope.feeLevel = tx.feeLevel;
scope.noSave = true;
scope.coin = vm.originWallet.coin;
if (usingCustomFee) {
scope.customFeePerKB = tx.feeRate;
scope.feePerSatByte = tx.feeRate / 1000;
}
$ionicModal.fromTemplateUrl('views/modals/chooseFeeLevel.html', {
scope: scope,
backdropClickToClose: false,
hardwareBackButtonClose: false
}).then(function(modal) {
scope.chooseFeeLevelModal = modal;
scope.openModal();
});
scope.openModal = function() {
scope.chooseFeeLevelModal.show();
};
scope.hideModal = function(newFeeLevel, customFeePerKB) {
scope.chooseFeeLevelModal.hide();
$log.debug('New fee level choosen:' + newFeeLevel + ' was:' + tx.feeLevel);
usingCustomFee = newFeeLevel == 'custom' ? true : false;
if (tx.feeLevel == newFeeLevel && !usingCustomFee) return;
tx.feeLevel = newFeeLevel;
if (usingCustomFee) tx.feeRate = parseInt(customFeePerKB);
updateTx(tx, vm.originWallet, {
clearCache: true,
dryRun: true
}, function() {});
};
};
function createVanityTransaction(data) {
console.log('createVanityTransaction()');
var configFeeLevel = config.wallet.settings.feeLevel ? config.wallet.settings.feeLevel : 'normal';
// Grab stateParams
tx = {
amount: parseInt(sendFlowData.amount),
sendMax: sendFlowData.sendMax,
fromWalletId: sendFlowData.fromWalletId,
toAddress: sendFlowData.toAddress,
paypro: txPayproData,
feeLevel: configFeeLevel,
spendUnconfirmed: config.wallet.spendUnconfirmed,
// Vanity tx info (not in the real tx)
recipientType: vm.destination.kind || null,
toName: vm.destination.name || null,
toEmail: vm.destination.email || null,
toColor: vm.destination.color || null,
network: false,
coin: vm.originWallet.coin,
txp: {},
};
if (data.stateParams.requiredFeeRate) {
vm.usingMerchantFee = true;
tx.feeRate = parseInt(data.stateParams.requiredFeeRate);
}
if (tx.coin && tx.coin === 'bch') {
tx.feeLevel = 'normal';
}
var B = tx.coin === 'bch' ? bitcoreCash : bitcore;
var networkName;
try {
if (vm.destination.kind === 'wallet') { // This is a wallet-to-wallet transfer
ongoingProcess.set('generatingNewAddress', true);
var toWallet = profileService.getWallet(destinationWalletId);
// We need an address to send to, so we ask the walletService to create a new address for the toWallet.
console.log('Getting address for wallet...');
walletService.getAddress(toWallet, true, function onWalletAddress(err, addr) {
console.log('getAddress cb called', err);
ongoingProcess.set('generatingNewAddress', false);
tx.toAddress = addr;
networkName = (new B.Address(tx.toAddress)).network.name;
tx.network = networkName;
console.log('calling setupTx() for wallet.');
setupTx(tx);
});
} else { // This is a Wallet-to-address transfer
networkName = (new B.Address(tx.toAddress)).network.name;
tx.network = networkName;
console.log('calling setupTx() for address.');
setupTx(tx);
}
} catch (e) {
console.error('Error setting up tx', e);
var message = gettextCatalog.getString('Invalid address');
popupService.showAlert(null, message, function () {
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$state.go('tabs.send').then(function () {
$ionicHistory.clearHistory();
});
});
return;
}
}
function getOriginWalletBalance(originWallet) {
var balanceText = getWalletBalanceDisplayText(vm.originWallet);
vm.origin.balanceAmount = balanceText.amount;
vm.origin.balanceCurrency = balanceText.currency;
}
function getSendMaxInfo(tx, wallet, cb) {
if (!tx.sendMax) return cb();
//ongoingProcess.set('retrievingInputs', true);
walletService.getSendMaxInfo(wallet, {
feePerKb: tx.feeRate,
excludeUnconfirmedUtxos: !tx.spendUnconfirmed,
returnInputs: true,
}, cb);
};
function getTxp(tx, wallet, dryRun, cb) {
// ToDo: use a credential's (or fc's) function for this
if (tx.description && !wallet.credentials.sharedEncryptingKey) {
var msg = gettextCatalog.getString('Could not add message to imported wallet without shared encrypting key');
$log.warn(msg);
return setSendError(msg);
}
if (tx.amount > Number.MAX_SAFE_INTEGER) {
var msg = gettextCatalog.getString('Amount too big');
$log.warn(msg);
return setSendError(msg);
}
var txp = {};
txp.outputs = [{
'toAddress': tx.toAddress,
'amount': tx.amount,
'message': vm.memo
}];
if (tx.sendMaxInfo) {
txp.inputs = tx.sendMaxInfo.inputs;
txp.fee = tx.sendMaxInfo.fee;
} else {
if (usingCustomFee || usingMerchantFee) {
txp.feePerKb = tx.feeRate;
} else txp.feeLevel = tx.feeLevel;
}
txp.message = vm.memo;
if (tx.paypro) {
txp.payProUrl = tx.paypro.url;
}
txp.excludeUnconfirmedUtxos = !tx.spendUnconfirmed;
txp.dryRun = dryRun;
walletService.createTx(wallet, txp, function(err, ctxp) {
if (err) {
setSendError(err);
return cb(err);
}
return cb(null, ctxp);
});
};
function getWalletBalanceDisplayText(wallet) {
var balanceCryptoAmount = '';
var balanceCryptoCurrencyCode = '';
var balanceFiatAmount = '';
var balanceFiatCurrency = '';
var displayAmount = '';
var displayCurrency = '';
var walletStatus = null;
if (wallet.status && wallet.status.isValid) {
walletStatus = wallet.status;
} else if (wallet.cachedStatus.isValid) {
walletStatus = wallet.cachedStatus;
}
if (walletStatus) {
var cryptoBalanceParts = walletStatus.spendableBalanceStr.split(' ');
balanceCryptoAmount = cryptoBalanceParts[0];
balanceCryptoCurrencyCode = cryptoBalanceParts.length > 1 ? cryptoBalanceParts[1] : '';
if (walletStatus.alternativeBalanceAvailable) {
balanceFiatAmount = walletStatus.spendableBalanceAlternative;
balanceFiatCurrency = walletStatus.alternativeIsoCode;
}
}
if (priceDisplayIsFiat) {
displayAmount = balanceFiatAmount ? balanceFiatAmount : balanceCryptoAmount;
displayCurrency = balanceFiatAmount ? balanceFiatCurrency : balanceCryptoCurrencyCode;
} else {
displayAmount = balanceCryptoAmount;
displayCurrency = balanceCryptoCurrencyCode;
}
return {
amount: displayAmount,
currency: displayCurrency
};
}
function goBack() {
sendFlowService.router.goBack();
}
function handleDestinationAsAddress(address, originCoin) {
if (!address) {
return;
}
// Check if the recipient is a contact
addressbookService.get(originCoin + address, function(err, contact) {
if (!err && contact) {
handleDestinationAsAddressOfContact(contact);
} else {
if (originCoin === 'bch') {
vm.destination.address = bitcoinCashJsService.readAddress(address).cashaddr;
} else {
vm.destination.address = address;
}
vm.destination.kind = 'address';
}
});
}
function handleDestinationAsAddressOfContact(contact) {
vm.destination.kind = 'contact';
vm.destination.name = contact.name;
vm.destination.email = contact.email;
vm.destination.color = contact.coin === 'btc' ? defaults.bitcoinWalletColor : defaults.bitcoinCashWalletColor;
vm.destination.currency = contact.coin.toUpperCase();
vm.destination.currencyColor = vm.destination.color;
}
function handleDestinationAsWallet(walletId) {
destinationWalletId = walletId;
if (!destinationWalletId) {
return;
}
var destinationWallet = profileService.getWallet(destinationWalletId);
vm.destination.coin = destinationWallet.coin;
vm.destination.color = destinationWallet.color;
vm.destination.currency = destinationWallet.coin.toUpperCase();
vm.destination.kind = 'wallet';
vm.destination.name = destinationWallet.name;
if (defaults) {
vm.destination.currencyColor = vm.destination.coin === 'btc' ? defaults.bitcoinWalletColor : defaults.bitcoinCashWalletColor;
}
var balanceText = getWalletBalanceDisplayText(destinationWallet);
vm.destination.balanceAmount = balanceText.amount;
vm.destination.balanceCurrency = balanceText.currency;
}
function initBip70() {
vm.sendingTitle = gettextCatalog.getString('You are paying');
vm.memo = vm.thirdParty.memo;
vm.memoExpanded = !!vm.memo;
vm.destination.name = vm.thirdParty.name;
txPayproData = {
caTrusted: vm.thirdParty.caTrusted,
domain: vm.thirdParty.domain,
expires: vm.thirdParty.expires,
toAddress: toAddress,
url: vm.thirdParty.url,
verified: vm.thirdParty.verified,
};
}
function initShapeshift(cb) {
vm.sendingTitle = gettextCatalog.getString('You are shifting');
if (!vm.thirdParty.data) {
vm.thirdParty.data = {};
}
var toWallet = profileService.getWallet(destinationWalletId);
vm.destination.name = toWallet.name;
vm.destination.color = toWallet.color;
vm.destination.currency = toWallet.coin.toUpperCase();
ongoingProcess.set('connectingShapeshift', true);
walletService.getAddress(vm.originWallet, false, function onReturnWalletAddress(err, returnAddr) {
if (err) {
return cb(err);
}
walletService.getAddress(toWallet, false, function onWithdrawalWalletAddress(err, withdrawalAddr) {
if (err) {
return cb(err);
}
// Need to use the correct service to do it.
var amount = parseFloat(satoshis / 100000000);
shapeshiftService.shiftIt(vm.originWallet.coin, toWallet.coin, withdrawalAddr, returnAddr, amount, function onShiftIt(err, shapeshiftData) {
if (err) {
return cb(err);
} else {
vm.destination.kind = 'shapeshift';
vm.destination.address = toAddress;
tx.toAddress = shapeshiftData.toAddress;
vm.memo = 'ShapeShift Order:\nhttps://www.shapeshift.io/#/status/' + shapeshiftData.orderId;
vm.memoExpanded = !!vm.memo;
ongoingProcess.set('connectingShapeshift', false);
cb();
}
});
});
});
}
function onShareTransaction() {
var explorerTxUrl = 'https://explorer.bitcoin.com/' + tx.coin + '/tx/' + lastTxId;
if (platformInfo.isCordova) {
var text = gettextCatalog.getString('Take a look at this Bitcoin Cash transaction here: ') + explorerTxUrl;
if (coin === 'btc') {
text = gettextCatalog.getString('Take a look at this Bitcoin transaction here: ') + explorerTxUrl;
}
window.plugins.socialsharing.share(text, null, null, null);
} else {
ionicToast.show(gettextCatalog.getString('Copied to clipboard'), 'bottom', false, 3000);
clipboardService.copyToClipboard(explorerTxUrl);
}
}
function startExpirationTimer(expirationTime) {
vm.paymentExpired = false;
setExpirationTime();
countDown = $interval(function() {
setExpirationTime();
}, 1000);
function setExpirationTime() {
console.log('setExpirationTime()');
var now = Math.floor(Date.now() / 1000);
if (now > expirationTime) {
setExpiredValues();
return;
}
var totalSecs = expirationTime - now;
var m = Math.floor(totalSecs / 60);
var s = totalSecs % 60;
vm.remainingTimeStr = m + ":" + ('0' + s).slice(-2);
};
function setExpiredValues() {
vm.paymentExpired = true;
vm.remainingTimeStr = gettextCatalog.getString('Expired');
vm.readyToSend = false;
if (countDown) $interval.cancel(countDown);
$timeout(function() {
$scope.$apply();
});
};
};
function updateSendAmounts() {
if (typeof satoshis !== 'number') {
return;
}
var cryptoAmount = '';
var cryptoCurrencyCode = '';
var amountStr = txFormatService.formatAmountStr(coin, satoshis);
if (amountStr) {
var amountParts = amountStr.split(' ');
cryptoAmount = amountParts[0];
cryptoCurrencyCode = amountParts.length > 1 ? amountParts[1] : '';
}
// Want to avoid flashing of amount strings so do all formatting after this has returned.
txFormatService.formatAlternativeStr(coin, satoshis, function(v) {
if (!v) {
vm.primaryAmount = cryptoAmount;
vm.primaryCurrency = cryptoCurrencyCode;
vm.secondaryAmount = '';
vm.secondaryCurrency = '';
return;
}
vm.secondaryAmount = vm.primaryAmount;
vm.secondaryCurrency = vm.primaryCurrency;
var fiatParts = v.split(' ');
var fiatAmount = fiatParts[0];
var fiatCurrency = fiatParts.length > 1 ? fiatParts[1] : '';
if (priceDisplayIsFiat) {
vm.primaryAmount = fiatAmount;
vm.primaryCurrency = fiatCurrency;
vm.secondaryAmount = cryptoAmount;
vm.secondaryCurrency = cryptoCurrencyCode;
} else {
vm.primaryAmount = cryptoAmount;
vm.primaryCurrency = cryptoCurrencyCode;
vm.secondaryAmount = fiatAmount;
vm.secondaryCurrency = fiatCurrency;
}
});
}
function onSuccessConfirm() {
vm.sendStatus = '';
$ionicHistory.nextViewOptions({
disableAnimate: true,
historyRoot: true
});
$state.go('tabs.send').then(function() {
$ionicHistory.clearHistory();
$state.transitionTo('tabs.home');
});
};
function setButtonText(isMultisig, isPayPro) {
if (isPayPro) {
if (vm.isCordova) {
vm.buttonText = gettextCatalog.getString('Slide to pay');
} else {
vm.buttonText = gettextCatalog.getString('Click to pay');
}
} else if (isMultisig) {
if (vm.isCordova) {
vm.buttonText = gettextCatalog.getString('Slide to accept');
} else {
vm.buttonText = gettextCatalog.getString('Click to accept');
}
} else {
if (vm.isCordova) {
vm.buttonText = gettextCatalog.getString('Slide to send');
} else {
vm.buttonText = gettextCatalog.getString('Click to send');
}
}
}
function setNotReady(msg, criticalError) {
vn.readyToSend = false;
vm.notReadyMessage = msg;
$scope.criticalError = criticalError;
$log.warn('Not ready to make the payment:' + msg);
$timeout(function() {
$scope.$apply();
});
};
function setSendError(msg) {
$scope.sendStatus = '';
vm.readyToSend = false;
$timeout(function() {
$scope.$apply();
});
popupService.showAlert(gettextCatalog.getString('Error at confirm'), bwcError.msg(msg), function () {
$ionicHistory.goBack();
});
};
function setupTx(tx) {
if (tx.coin === 'bch') {
tx.displayAddress = bitcoinCashJsService.readAddress(tx.toAddress).cashaddr;
} else {
tx.displayAddress = tx.toAddress;
}
addressbookService.get(tx.coin+tx.toAddress, function(err, addr) { // Check if the recipient is a contact
if (!err && addr) {
tx.toName = addr.name;
tx.toEmail = addr.email;
tx.recipientType = 'contact';
}
});
vm.showAddress = false;
setButtonText(vm.originWallet.credentials.m > 1, !!tx.paypro);
if (tx.paypro)
startExpirationTimer(tx.paypro.expires);
popupService.showConfirm(null, 'Do you want this transaction to be sent without a fee?', 'Yes', 'No', function(ok) {
if(ok){
tx.feeRate = 0;
// tx.feeLevel = 'free';
usingCustomFee = true;
}
updateTx(tx, vm.originWallet, {
dryRun: true
}, function(err) {
$timeout(function() {
$scope.$apply();
}, 10);
});
});
// setWalletSelector(tx.coin, tx.network, tx.amount, function(err) {
// if (err) {
// return exitWithError('Could not update wallets');
// }
//
// if (vm.wallets.length > 1) {
// vm.showWalletSelector();
// } else if (vm.wallets.length) {
// setWallet(vm.wallets[0], tx);
// }
// });
}
function showSendMaxWarning(wallet, sendMaxInfo) {
var feeAlternative = '',
msg = '';
function verifyExcludedUtxos() {
var warningMsg = [];
if (sendMaxInfo.utxosBelowFee > 0) {
warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", {
amountBelowFeeStr: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.amountBelowFee)
}));
}
if (sendMaxInfo.utxosAboveMaxSize > 0) {
warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded.", {
amountAboveMaxSizeStr: txFormatService.formatAmountStr(vm.originWallet.coin, sendMaxInfo.amountAboveMaxSize)
}));
}
return warningMsg.join('\n');
};
feeAlternative = txFormatService.formatAlternativeStr(vm.originWallet.coin, sendMaxInfo.fee);
if (feeAlternative) {
msg = gettextCatalog.getString("{{feeAlternative}} will be deducted for bitcoin networking fees ({{fee}}).", {
fee: txFormatService.formatAmountStr(vm.originWallet.coin, sendMaxInfo.fee),
feeAlternative: feeAlternative
});
} else {
msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", {
fee: txFormatService.formatAmountStr(vm.originWallet.coin, sendMaxInfo.fee)
});
}
var warningMsg = verifyExcludedUtxos();
if (!lodash.isEmpty(warningMsg))
msg += '\n' + warningMsg;
popupService.showAlert(null, msg, function() {});
//popupService.showConfirm(null, msg, null, null, function() {});
};
function statusChangeHandler(processName, showName, isOn) {
$log.debug('statusChangeHandler: ', processName, showName, isOn);
if (
(
processName === 'broadcastingTx' ||
((processName === 'signingTx') && vm.originWallet.m > 1) ||
(processName == 'sendingTx' && !vm.originWallet.canSign() && !vm.originWallet.isPrivKeyExternal())
) && !isOn) {
// Show the popup
vm.sendStatus = 'success';
// Clear the send flow service state
sendFlowService.state.clear();
if ($state.current.name === "tabs.send.review") { // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device.
soundService.play('misc/payment_sent.mp3');
}
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
// When displaying Fiat, if the formatting fails, the crypto will be the primary amount.
var amount = unitFromSat * satoshis;
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
"coin": vm.originWallet.coin,
"type": "outgoing",
"amount": amount,
"fees": vm.feeCrypto
}], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$timeout(function() {
$scope.$digest();
}, 100);
} else if (showName) {
vm.sendStatus = showName;
}
};
function updateTx(tx, wallet, opts, cb) {
ongoingProcess.set('calculatingFee', true);
if (opts.clearCache) {
tx.txp = {};
}
// $scope.tx = tx;
// function updateAmount() {
// if (!tx.amount) return;
//
// // Amount
// tx.amountStr = txFormatService.formatAmountStr(originWallet.coin, tx.amount);
// tx.amountValueStr = tx.amountStr.split(' ')[0];
// tx.amountUnitStr = tx.amountStr.split(' ')[1];
// txFormatService.formatAlternativeStr(wallet.coin, tx.amount, function(v) {
// var parts = v.split(' ');
// tx.alternativeAmountStr = v;
// tx.alternativeAmountValueStr = parts[0];
// tx.alternativeAmountUnitStr = (parts.length > 0) ? parts[1] : '';
// });
// }
//
// updateAmount();
// refresh();
var feeServiceLevel = usingMerchantFee && vm.originWallet.coin == 'btc' ? 'urgent' : tx.feeLevel;
feeService.getFeeRate(vm.originWallet.coin, tx.network, feeServiceLevel, function(err, feeRate) {
if (err) {
ongoingProcess.set('calculatingFee', false);
return cb(err);
}
var msg;
// if (tx.feeLevel == 'free'){
// tx.feeRate = 0;
// }
// else
if (usingCustomFee) {
msg = gettextCatalog.getString('Custom');
tx.feeLevelName = msg;
} else if (usingMerchantFee) {
$log.info('Using Merchant Fee:' + tx.feeRate + ' vs. Urgent level:' + feeRate);
msg = gettextCatalog.getString('Suggested by Merchant');
tx.feeLevelName = msg;
} else {
tx.feeLevelName = feeService.feeOpts[tx.feeLevel];
tx.feeRate = feeRate;
}
getSendMaxInfo(lodash.clone(tx), wallet, function(err, sendMaxInfo) {
if (err) {
ongoingProcess.set('calculatingFee', false);
var msg = gettextCatalog.getString('Error getting SendMax information');
return setSendError(msg);
}
if (sendMaxInfo) {
$log.debug('Send max info', sendMaxInfo);
if (tx.sendMax && sendMaxInfo.amount == 0) {
ongoingProcess.set('calculatingFee', false);
setNotReady(gettextCatalog.getString('Insufficient confirmed funds'));
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee'), function () {
$ionicHistory.goBack();
});
return cb('no_funds');
}
tx.sendMaxInfo = sendMaxInfo;
tx.amount = tx.sendMaxInfo.amount;
satoshis = tx.amount;
updateSendAmounts();
ongoingProcess.set('calculatingFee', false);
$timeout(function() {
showSendMaxWarning(wallet, sendMaxInfo);
}, 200);
}
// txp already generated for this wallet?
if (tx.txp[wallet.id]) {
ongoingProcess.set('calculatingFee', false);
vm.readyToSend = true;
updateSendAmounts();
$scope.$apply();
return cb();
}
console.log('calling getTxp() from getSendMaxInfo cb.');
getTxp(lodash.clone(tx), wallet, opts.dryRun, function(err, txp) {
ongoingProcess.set('calculatingFee', false);
if (err) {
if (err.message == 'Insufficient funds') {
setNotReady(gettextCatalog.getString('Insufficient funds'));
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee'));
return cb('no_funds');
} else
return cb(err);
}
txp.feeStr = txFormatService.formatAmountStr(wallet.coin, txp.fee);
txFormatService.formatAlternativeStr(wallet.coin, txp.fee, function(v) {
// txp.alternativeFeeStr = v;
// if (txp.alternativeFeeStr.substring(0, 4) == '0.00')
// txp.alternativeFeeStr = '< ' + txp.alternativeFeeStr;
vm.feeFiat = v;
vm.fiatCurrency = config.wallet.settings.alternativeIsoCode;
if (v.substring(0, 1) === "<") {
vm.feeLessThanACent = true;
}
console.log("fiat", vm.feeFiat);
});
var per = (txp.fee / (txp.amount + txp.fee) * 100);
var perString = per.toFixed(2);
txp.feeRatePerStr = (perString == '0.00' ? '< ' : '') + perString + '%';
txp.feeToHigh = per > FEE_TOO_HIGH_LIMIT_PERCENTAGE;
vm.feeCrypto = (unitFromSat * txp.fee).toFixed(8);
vm.feeIsHigh = txp.feeToHigh;
console.log("crypto", vm.feeCrypto);
tx.txp[wallet.id] = txp;
$log.debug('Confirm. TX Fully Updated for wallet:' + wallet.id, tx);
vm.readyToSend = true;
updateSendAmounts();
console.log('readyToSend:', vm.readyToSend);
$scope.$apply();
return cb();
});
});
});
}
}
})();

View file

@ -1,6 +1,6 @@
'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;
configService.whenAvailable(function(config) {
@ -20,4 +20,8 @@ angular.module('copayApp.controllers').controller('servicesController', function
}, 10);
};
$scope.open = function(url) {
externalLinkService.open(url, false);
}
});

View file

@ -1,67 +1,58 @@
'use strict';
angular.module('copayApp.controllers').controller('shapeshiftController', function($scope, $interval, profileService, walletService, popupService, lodash, $ionicNavBarDelegate) {
angular.module('copayApp.controllers').controller('shapeshiftController', function($scope, sendFlowService, $state, $timeout, $ionicHistory, profileService, walletService, popupService, lodash, $ionicNavBarDelegate) {
var walletsBtc = [];
var walletsBch = [];
function generateAddress(wallet, cb) {
if (!wallet) return;
walletService.getAddress(wallet, false, function(err, addr) {
if (err) {
popupService.showAlert(err);
}
return cb(addr);
});
}
function showToWallets() {
$scope.toWallets = $scope.fromWallet.coin == 'btc' ? walletsBch : walletsBtc;
$scope.onToWalletSelect($scope.toWallets[0]);
$scope.singleToWallet = $scope.toWallets.length == 1;
}
$scope.onFromWalletSelect = function(wallet) {
$scope.fromWallet = wallet;
showToWallets();
generateAddress(wallet, function(addr) {
$scope.fromWalletAddress = addr;
});
};
$scope.onToWalletSelect = function(wallet) {
$scope.toWallet = wallet;
generateAddress(wallet, function(addr) {
$scope.toWalletAddress = addr;
});
}
$scope.showMyAddress = showMyAddress;
$scope.$on("$ionicView.beforeEnter", function(event, data) {
walletsBtc = profileService.getWallets({coin: 'btc'});
walletsBch = profileService.getWallets({coin: 'bch'});
$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);
});
if ($scope.fromWallets.length == 0) return;
$scope.onFromWalletSelect($scope.fromWallets[0]);
$scope.onToWalletSelect($scope.toWallets[0]);
$scope.singleFromWallet = $scope.fromWallets.length == 1;
$scope.singleToWallet = $scope.toWallets.length == 1;
$scope.singleFromWallet = $scope.fromWallets.length === 1;
$scope.fromWalletSelectorTitle = 'From';
$scope.toWalletSelectorTitle = 'To';
$scope.showFromWallets = false;
$scope.showToWallets = false;
$scope.walletsWithFunds = profileService.getWallets({onlyComplete: true, hasFunds: true});
$scope.wallets = profileService.getWallets({onlyComplete: true});
$scope.hasWallets = !lodash.isEmpty($scope.wallets);
});
$scope.$on("$ionicView.enter", function(event, data) {
$ionicNavBarDelegate.showBar(true);
});
$scope.showFromWalletSelector = function() {
$scope.showFromWallets = true;
// This could probably be enhanced refactoring the routes abstract states
$scope.createWallet = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.add.create-personal');
});
};
$scope.buyBitcoin = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.buyandsell');
});
};
$scope.shapeshift = function() {
var stateParams = {
thirdParty: {
id: 'shapeshift'
}
};
sendFlowService.start(stateParams);
}
$scope.showToWalletSelector = function() {
$scope.showToWallets = true;
function showMyAddress() {
$state.go('tabs.home').then(function() {
$state.go('tabs.receive');
});
}
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
angular.module('copayApp.controllers').controller('shareAppController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
$scope.isCordova = platformInfo.isCordova;
$scope.title = gettextCatalog.getString("Share {{appName}}", {
appName: appConfigService.nameCase
@ -57,28 +57,8 @@ angular.module('copayApp.controllers').controller('completeController', function
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function() {
if (!$scope.fromSettings)
$ionicConfig.views.swipeBackEnabled(false);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
$scope.skipped = (data.stateParams && data.stateParams.skipped) ? true : false;
$scope.rated = (data.stateParams && data.stateParams.rated) ? true : false;
$scope.fromSettings = (data.stateParams && data.stateParams.fromSettings) ? true : false;
if (!$scope.fromSettings) {
$ionicNavBarDelegate.showBackButton(false);
} else {
$ionicNavBarDelegate.showBackButton(true);
}
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null;
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {});
});
$ionicNavBarDelegate.showBackButton(true);
if (!$scope.isCordova) return;
$scope.animate = true;
@ -133,13 +113,4 @@ angular.module('copayApp.controllers').controller('completeController', function
}
}, 100);
});
$scope.close = function() {
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
if ($scope.score == 5) $ionicHistory.goBack(-3);
else $ionicHistory.goBack(-2);
};
});

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('tabHomeController',
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, communityService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, sendFlowService, storageService, txpModalService, appConfigService, startupService, addressbookService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
var wallet;
var listeners = [];
var notifications = [];
@ -14,78 +14,53 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.isAndroid = platformInfo.isAndroid;
$scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
$scope.isNW = platformInfo.isNW;
$scope.showRateCard = {};
$scope.showServices = false;
$scope.bannerIsLoading = true;
$scope.bannerImageUrl = '';
$scope.bannerUrl = '';
$scope.$on("$ionicView.afterEnter", function() {
$scope.$on("$ionicView.beforeEnter", onBeforeEnter);
$scope.$on("$ionicView.enter", onEnter);
$scope.$on("$ionicView.afterEnter", onAfterEnter);
$scope.$on("$ionicView.leave", onLeave);
function onAfterEnter () {
startupService.ready();
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
bannerService.getBanner(function (banner) {
$scope.bannerImageUrl = banner.imageURL;
$scope.bannerUrl = banner.url;
$scope.bannerIsLoading = false;
});
};
function onBeforeEnter (event, data) {
if (!$scope.homeTip) {
storageService.getHomeTipAccepted(function(error, value) {
$scope.homeTip = (value == 'accepted') ? false : true;
});
}
if ($scope.isNW) {
latestReleaseService.checkLatestRelease(function(err, newRelease) {
if (err) {
$log.warn(err);
return;
}
if (newRelease) {
$scope.newRelease = true;
$scope.updateText = gettextCatalog.getString('There is a new version of {{appName}} available', {
appName: $scope.name
});
}
});
}
storageService.getFeedbackInfo(function(error, info) {
if ($scope.isWindowsPhoneApp) {
$scope.showRateCard.value = false;
latestReleaseService.checkLatestRelease(function(err, newReleaseData) {
if (err) {
$log.warn(err);
return;
}
if (!info) {
initFeedBackInfo();
} else {
var feedbackInfo = JSON.parse(info);
//Check if current version is greater than saved version
var currentVersion = $scope.version;
var savedVersion = feedbackInfo.version;
var isVersionUpdated = feedbackService.isVersionUpdated(currentVersion, savedVersion);
if (!isVersionUpdated) {
initFeedBackInfo();
return;
}
var now = moment().unix();
var timeExceeded = (now - feedbackInfo.time) >= 24 * 7 * 60 * 60;
$scope.showRateCard.value = timeExceeded && !feedbackInfo.sent;
$timeout(function() {
$scope.$apply();
if (newReleaseData) {
$scope.newRelease = true;
$scope.newReleaseText = gettextCatalog.getString('There is a new version of {{appName}} available', {
appName: $scope.name
});
$scope.newReleaseNotes = newReleaseData.releaseNotes;
}
});
}
function initFeedBackInfo() {
var feedbackInfo = {};
feedbackInfo.time = moment().unix();
feedbackInfo.version = $scope.version;
feedbackInfo.sent = false;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
});
};
});
$scope.$on("$ionicView.enter", function(event, data) {
function onEnter(event, data) {
$ionicNavBarDelegate.showBar(true);
updateAllWallets(function() {
profileService.initBitcoinCoreDisplay();
});
updateAllWallets();
addressbookService.list(function(err, ab) {
if (err) $log.error(err);
@ -126,37 +101,35 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.nextStepsItems = nextStepsService.get();
}
$scope.displayBitcoinCore = config.displayBitcoinCore.enabled;
$scope.showServices = true;
pushNotificationsService.init();
firebaseEventsService.init();
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
}, 10);
});
});
}
$scope.$on("$ionicView.leave", function(event, data) {
function onLeave (event, data) {
lodash.each(listeners, function(x) {
x();
});
});
}
$scope.createdWithinPastDay = function(time) {
return timeService.withinPastDay(time);
};
$scope.openExternalLink = function() {
var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest';
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.startFreshSend = function() {
sendFlowService.start();
}
$scope.showUpdatePopup = function() {
latestReleaseService.showUpdatePopup();
};
$scope.openBannerUrl = function() {
externalLinkService.open($scope.bannerUrl, false);
};
$scope.openNotificationModal = function(n) {
@ -233,6 +206,7 @@ angular.module('copayApp.controllers').controller('tabHomeController',
var j = 0;
lodash.each(wallets, function(wallet) {
walletService.invalidateCache(wallet); // Temporary solution, to have the good balance, when we ask to reload the wallets.
walletService.getStatus(wallet, {}, function(err, status) {
if (err) {
@ -252,6 +226,7 @@ angular.module('copayApp.controllers').controller('tabHomeController',
cb();
}
}
$scope.walletsWithFunds = profileService.getWallets({hasFunds: true});
});
});
};
@ -281,8 +256,6 @@ angular.module('copayApp.controllers').controller('tabHomeController',
var txIdList = [];
var notificationsBeforeCheck = notifications.length;
for (var i=0; i<notifications.length; i++) {
var txId = notifications[i].txid;
if (txIdList.includes(txId)) {
@ -293,15 +266,7 @@ angular.module('copayApp.controllers').controller('tabHomeController',
}
}
var notificationsAfterCheck = notifications.length;
var removedNotifications = notificationsBeforeCheck - notificationsAfterCheck;
if (notificationsBeforeCheck != notificationsAfterCheck) {
total = total - removedNotifications;
}
$scope.notifications = notifications;
$scope.notificationsN = total;
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
@ -326,9 +291,4 @@ angular.module('copayApp.controllers').controller('tabHomeController',
updateAllWallets();
};
$rootScope.$on('Local/SettingsUpdated', function(e, walletId) {
configService.whenAvailable(function(config) {
$scope.displayBitcoinCore = config.displayBitcoinCore.enabled;
});
});
});

View file

@ -1,7 +1,8 @@
'use strict';
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService) {
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, sendFlowService, txFormatService, soundService, clipboardService) {
var CLOSE_NORMAL = 1000;
var listeners = [];
$scope.bchAddressType = { type: 'cashaddr' };
var bchAddresses = {};
@ -10,17 +11,64 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
$scope.isCordova = platformInfo.isCordova;
$scope.isNW = platformInfo.isNW;
var currentAddressSocket = {};
var paymentSubscriptionObj = { op:"addr_sub" }
var currentAddressSocket = null;
var paymentSubscriptionObj = { op:'addr_sub' };
$scope.displayBalanceAsFiat = true;
$scope.$on('$ionicView.beforeLeave', onBeforeLeave);
$scope.requestSpecificAmount = function() {
$state.go('tabs.paymentRequest.amount', {
id: $scope.wallet.credentials.walletId,
coin: $scope.wallet.coin
sendFlowService.start({
toWalletId: $scope.wallet.credentials.walletId,
isRequestAmount: true
});
};
$scope.setAddress = function(newAddr) {
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.addr = null;
if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return;
$scope.generatingAddress = true;
@ -32,40 +80,23 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
popupService.showAlert(err);
}
//close existing socket
if (currentAddressSocket.close === 'function') {
currentAddressSocket.close();
}
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'];
if ($scope.wallet.coin === 'bch') {
bchAddresses = bitcoinCashJsService.translateAddresses(addr);
$scope.addr = bchAddresses[$scope.bchAddressType.type];
$scope.addrBchLegacy = bchAddresses['legacy'];
} else {
$scope.addr = addr;
// listen to btc address
currentAddressSocket = new WebSocket("wss://ws.blockchain.info/inv");
paymentSubscriptionObj.addr = $scope.addr
$scope.addr = addr;
}
// create subscription
var msg = JSON.stringify(paymentSubscriptionObj);
currentAddressSocket.onopen = function (event) {
//console.log("message sent: " + msg);
currentAddressSocket.send(msg);
}
connectSocket();
// listen for response
currentAddressSocket.onmessage = function (event) {
//console.log("message received:" + event.data);
receivedPayment(event.data);
if (copyAddress === true) {
try {
clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr);
} catch (error) {
$log.debug('Error copying to clipboard:');
$log.debug(error);
}
}
$timeout(function() {
@ -123,11 +154,38 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
for (var i = 0; i < data.x.out.length; i++) {
if (data.x.out[i].addr == watchAddress) {
$scope.paymentReceivedAmount = txFormatService.formatAmount(data.x.out[i].value, 'full');
$scope.paymentReceivedAlternativeAmount = ''; // For when a subsequent payment is received.
txFormatService.formatAlternativeStr($scope.wallet.coin, data.x.out[i].value, function(alternativeStr){
if (alternativeStr) {
$scope.$apply(function () {
$scope.paymentReceivedAlternativeAmount = alternativeStr;
});
}
});
}
}
$scope.paymentReceivedCoin = $scope.wallet.coin;
$scope.showingPaymentReceived = true
$scope.$apply();
var channel = "ga";
if (platformInfo.isCordova) {
channel = "firebase";
}
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
"coin": $scope.wallet.coin,
"type": "incoming"
}], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
if ($state.current.name === "tabs.receive") {
soundService.play('misc/payment_received.mp3');
}
// Notify new tx
$scope.$emit('bwsEvent', $scope.wallet.id);
$scope.$apply(function () {
$scope.showingPaymentReceived = true;
});
}
}
@ -193,16 +251,24 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
}
};
function onBeforeLeave() {
currentAddressSocket.close([CLOSE_NORMAL]);
}
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.wallets = profileService.getWallets();
$scope.singleWallet = $scope.wallets.length == 1;
if (!$scope.wallets[0]) return;
// select first wallet if no wallet selected previously
var selectedWallet = checkSelectedWallet($scope.wallet, $scope.wallets);
var selectedWallet = null;
if (data.stateParams.walletId) { // from walletDetails
selectedWallet = checkSelectedWallet(profileService.getWallet(data.stateParams.walletId), $scope.wallets);
} else {
// select first wallet if no wallet selected previously
selectedWallet = checkSelectedWallet($scope.wallet, $scope.wallets);
}
$scope.onWalletSelect(selectedWallet);
$scope.showShareButton = platformInfo.isCordova ? (platformInfo.isIOS ? 'iOS' : 'Android') : null;
listeners = [
@ -211,9 +277,14 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
if ($scope.wallet && walletId == $scope.wallet.id && type == 'NewIncomingTx') $scope.setAddress(true);
})
];
configService.whenAvailable(function(_config) {
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
});
});
$scope.$on("$ionicView.enter", function(event, data) {
$scope.showingPaymentReceived = false;
$ionicNavBarDelegate.showBar(true);
});
@ -248,6 +319,10 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
$scope.setAddress();
};
$scope.hidePaymentScreen = function() {
$scope.showingPaymentReceived = false;
};
$scope.showWalletSelector = function() {
if ($scope.singleWallet) return;
$scope.walletSelectorTitle = gettextCatalog.getString('Select a wallet');

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('tabScanController', function($scope, $log, $timeout, scannerService, incomingData, $state, $ionicHistory, $rootScope, $ionicNavBarDelegate) {
angular.module('copayApp.controllers').controller('tabScanController', function(gettextCatalog, popupService, $scope, $log, $timeout, scannerService, incomingDataService, $state, $ionicHistory, $rootScope, $ionicNavBarDelegate) {
var scannerStates = {
unauthorized: 'unauthorized',
@ -60,8 +60,14 @@ angular.module('copayApp.controllers').controller('tabScanController', function(
});
$scope.$on("$ionicView.afterEnter", function() {
// try initializing and refreshing status any time the view is entered
scannerService.gentleInitialize();
var capabilities = scannerService.getCapabilities();
if (capabilities.hasPermission) {
// try initializing and refreshing status any time the view is entered
if(!scannerService.isInitialized()) {
scannerService.gentleInitialize();
}
activate();
}
});
function activate(){
@ -102,7 +108,21 @@ angular.module('copayApp.controllers').controller('tabScanController', function(
function handleSuccessfulScan(contents){
$log.debug('Scan returned: "' + contents + '"');
scannerService.pausePreview();
incomingData.redir(contents);
// Sometimes (testing in Chrome, when reading QR Code) data is an object
// that has a string data.result.
contents = contents.result || contents;
incomingDataService.redir(contents, function onError(err) {
if (err) {
var title = gettextCatalog.getString('Scan Failed');
popupService.showAlert(title, err.message, function onAlertShown() {
// Enable another scan since we won't receive incomingDataMenu.menuHidden
activate();
});
} else {
scannerService.resumePreview();
}
});
}
$rootScope.$on('incomingDataMenu.menuHidden', function() {
@ -113,8 +133,11 @@ angular.module('copayApp.controllers').controller('tabScanController', function(
scannerService.openSettings();
};
$scope.reactivationCount = 0;
$scope.attemptToReactivate = function(){
scannerService.reinitialize();
scannerService.reinitialize(function(){
$scope.reactivationCount++;
});
};
$scope.toggleLight = function(){

View file

@ -0,0 +1,237 @@
'use strict';
angular.module('copayApp.controllers').controller('tabSendController', function(bitcoinUriService, $scope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, platformInfo, sendFlowService, gettextCatalog, configService, $ionicPopup, $ionicNavBarDelegate, clipboardService, incomingDataService) {
var clipboardHasAddress = false;
var clipboardHasContent = false;
var originalList;
$scope.displayBalanceAsFiat = true;
$scope.walletSelectorTitleForce = true;
$scope.addContact = function() {
$state.go('tabs.send.addressbook');
};
$scope.pasteClipboard = function() {
if ($scope.clipboardHasAddress || $scope.clipboardHasContent) {
clipboardService.readFromClipboard(function(text) {
$scope.$apply(function() {
$scope.formData.search = text;
$scope.findContact($scope.formData.search);
});
});
} else {
$ionicPopup.alert({
title: gettextCatalog.getString('Clipboard'),
template: gettextCatalog.getString('Your Clipboard is empty')
});
}
};
$scope.$on("$ionicView.enter", function(event, data) {
var stateParams = sendFlowService.state.getClone();
$scope.fromWallet = profileService.getWallet(stateParams.fromWalletId);
clipboardService.readFromClipboard(function(text) {
if (text.length > 200) {
text = text.substring(0, 200);
}
$scope.clipboardHasAddress = false;
$scope.clipboardHasContent = false;
var parsed = bitcoinUriService.parse(text);
console.log('parsed', parsed);
if (parsed.isValid && parsed.publicAddress && parsed.coin === 'bch' && !parsed.testnet) { // CashAddr
$scope.clipboardHasAddress = true;
} else if ((text[0] === "1" || text[0] === "3" || text.substring(0, 3) === "bc1") && text.length >= 26 && text.length <= 35) { // Legacy Addresses
$scope.clipboardHasAddress = true;
} else if (text.length > 1) {
$scope.clipboardHasContent = true;
}
});
$ionicNavBarDelegate.showBar(true);
if (!$scope.hasWallets) {
$scope.checkingBalance = false;
return;
}
updateHasFunds();
updateContactsList(function() {
updateList();
});
});
$scope.findContact = function(search) {
if (!search || search.length < 1) {
$scope.list = originalList;
$timeout(function() {
$scope.$apply();
});
return;
}
var params = sendFlowService.state.getClone();
params.data = search;
sendFlowService.start(params, function onError() {
var result = lodash.filter(originalList, function(item) {
var val = item.name;
return lodash.startsWith(val.toLowerCase(), search.toLowerCase());
});
$scope.list = result;
});
};
var hasWallets = function() {
$scope.walletsWithFunds = profileService.getWallets({
onlyComplete: true,
hasFunds: true
});
$scope.wallets = profileService.getWallets({
onlyComplete: true,
});
$scope.walletsBch = profileService.getWallets({
onlyComplete: true,
coin: 'bch'
});
$scope.walletsBtc = profileService.getWallets({
onlyComplete: true,
coin: 'btc'
});
$scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true;
};
var updateHasFunds = function() {
$scope.hasFunds = false;
var index = 0;
lodash.each($scope.wallets, function(w) {
walletService.getStatus(w, {}, function(err, status) {
++index;
if (err && !status) {
$log.error(err);
// error updating the wallet. Probably a network error, do not show
// the 'buy bitcoins' message.
$scope.hasFunds = true;
} else if (status.availableBalanceSat > 0) {
$scope.hasFunds = true;
}
if (index === $scope.wallets.length) {
$scope.checkingBalance = false;
$timeout(function() {
$scope.$apply();
});
}
});
});
};
var updateContactsList = function(cb) {
var config = configService.getSync();
var defaults = configService.getDefaults();
addressbookService.list(function(err, ab) {
if (err) $log.error(err);
$scope.hasContacts = lodash.isEmpty(ab) ? false : true;
if (!$scope.hasContacts) return cb();
var completeContacts = [];
lodash.each(ab, function(v, k) {
completeContacts.push({
name: lodash.isObject(v) ? v.name : v,
address: k,
email: lodash.isObject(v) ? v.email : null,
recipientType: 'contact',
coin: v.coin,
displayCoin: (v.coin == 'bch'
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase()
});
});
originalList = completeContacts;
return cb();
});
};
var updateList = function() {
$scope.list = lodash.clone(originalList);
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
}, 10);
};
$scope.searchInFocus = function() {
$scope.searchFocus = true;
};
$scope.searchBlurred = function() {
if ($scope.formData.search == null || $scope.formData.search.length === 0) {
$scope.searchFocus = false;
}
};
$scope.sendToContact = function (item) {
$timeout(function () {
var toAddress = item.address;
if (item.recipientType && item.recipientType === 'contact') {
if (toAddress.indexOf('bch') === 0 || toAddress.indexOf('btc') === 0) {
toAddress = toAddress.substring(3);
}
}
$log.debug('Got toAddress:' + toAddress + ' | ' + item.name);
var stateParams = sendFlowService.state.getClone();
stateParams.toAddress = toAddress;
stateParams.coin = item.coin;
sendFlowService.start(stateParams);
});
};
$scope.startWalletToWalletTransfer = function() {
console.log('startWalletToWalletTransfer()');
var params = sendFlowService.state.getClone();
params.isWalletTransfer = true;
sendFlowService.start(params);
}
// This could probably be enhanced refactoring the routes abstract states
$scope.createWallet = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.add.create-personal');
});
};
$scope.buyBitcoin = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.buyandsell');
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
console.log(data);
console.log('tab-send onBeforeEnter sendflow ', sendFlowService.state);
$scope.isIOS = platformInfo.isIOS && platformInfo.isCordova;
$scope.showWalletsBch = $scope.showWalletsBtc = $scope.showWallets = false;
$scope.checkingBalance = true;
$scope.formData = {
search: null
};
originalList = [];
hasWallets();
configService.whenAvailable(function(_config) {
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
});
if (data.direction == "back") {
sendFlowService.state.clear();
}
});
});

View file

@ -1,260 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate) {
var originalList;
var CONTACTS_SHOW_LIMIT;
var currentContactsPage;
$scope.isChromeApp = platformInfo.isChromeApp;
$scope.sectionDisplay = {
transferToWallet: false
};
var hasWallets = function() {
$scope.wallets = profileService.getWallets({
onlyComplete: true
});
$scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true;
};
// THIS is ONLY to show the 'buy bitcoins' message
// does not has any other function.
var updateHasFunds = function() {
if ($rootScope.everHasFunds) {
$scope.hasFunds = true;
return;
}
$scope.hasFunds = false;
var index = 0;
lodash.each($scope.wallets, function(w) {
walletService.getStatus(w, {}, function(err, status) {
++index;
if (err && !status) {
$log.error(err);
// error updating the wallet. Probably a network error, do not show
// the 'buy bitcoins' message.
$scope.hasFunds = true;
} else if (status.availableBalanceSat > 0) {
$scope.hasFunds = true;
$rootScope.everHasFunds = true;
}
if (index == $scope.wallets.length) {
$scope.checkingBalance = false;
$timeout(function() {
$scope.$apply();
});
}
});
});
};
var updateWalletsList = function() {
var config = configService.getSync();
var networkResult = lodash.countBy($scope.wallets, 'network');
$scope.showTransferCard = $scope.hasWallets && (networkResult.livenet > 1 || networkResult.testnet > 1);
if ($scope.showTransferCard) {
var walletsToTransfer = $scope.wallets;
if (!(networkResult.livenet > 1)) {
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
return item.network == 'testnet';
});
}
if (!(networkResult.testnet > 1)) {
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
return item.network == 'livenet';
});
}
var walletList = [];
lodash.each(walletsToTransfer, function(v) {
walletList.push({
color: v.color,
name: v.name,
recipientType: 'wallet',
coin: v.coin,
network: v.network,
balanceString: v.cachedBalance,
displayWallet: v.coin == 'btc' ? config.displayBitcoinCore.enabled : true,
getAddress: function(cb) {
walletService.getAddress(v, false, cb);
},
});
});
originalList = originalList.concat(walletList);
}
}
var updateContactsList = function(cb) {
var config = configService.getSync();
var defaults = configService.getDefaults();
addressbookService.list(function(err, ab) {
if (err) $log.error(err);
$scope.hasContacts = lodash.isEmpty(ab) ? false : true;
if (!$scope.hasContacts) return cb();
var completeContacts = [];
lodash.each(ab, function(v, k) {
completeContacts.push({
name: lodash.isObject(v) ? v.name : v,
address: k,
email: lodash.isObject(v) ? v.email : null,
recipientType: 'contact',
coin: v.coin,
displayCoin: (v.coin == 'bch'
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(),
getAddress: function(cb) {
return cb(null, k);
},
});
});
var contacts = completeContacts.slice(0, (currentContactsPage + 1) * CONTACTS_SHOW_LIMIT);
$scope.contactsShowMore = completeContacts.length > contacts.length;
originalList = originalList.concat(contacts);
return cb();
});
};
var updateList = function() {
$scope.list = lodash.clone(originalList);
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
}, 10);
};
$scope.openScanner = function() {
var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
if (!isWindowsPhoneApp) {
$state.go('tabs.scan');
return;
}
scannerService.useOldScanner(function(err, contents) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
}
incomingData.redir(contents);
});
};
$scope.showMore = function() {
currentContactsPage++;
updateWalletsList();
};
$scope.searchInFocus = function() {
$scope.searchFocus = true;
};
$scope.searchBlurred = function() {
if ($scope.formData.search == null || $scope.formData.search.length == 0) {
$scope.searchFocus = false;
}
};
$scope.findContact = function(search) {
if (incomingData.redir(search)) {
return;
}
if (!search || search.length < 2) {
$scope.list = originalList;
$timeout(function() {
$scope.$apply();
});
return;
}
var result = lodash.filter(originalList, function(item) {
var val = item.name;
return lodash.includes(val.toLowerCase(), search.toLowerCase());
});
$scope.list = result;
};
$scope.goToAmount = function(item) {
$timeout(function() {
item.getAddress(function(err, addr) {
if (err || !addr) {
//Error is already formated
return popupService.showAlert(err);
}
if (item.recipientType && item.recipientType == 'contact') {
if (addr.indexOf('bch') == 0 || addr.indexOf('btc') == 0) {
addr = addr.substring(3);
}
}
$log.debug('Got toAddress:' + addr + ' | ' + item.name);
return $state.transitionTo('tabs.send.amount', {
recipientType: item.recipientType,
displayAddress: item.coin == 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr,
toAddress: addr,
toName: item.name,
toEmail: item.email,
toColor: item.color,
coin: item.coin
});
});
});
};
// This could probably be enhanced refactoring the routes abstract states
$scope.createWallet = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.add.create-personal');
});
};
$scope.buyBitcoin = function() {
$state.go('tabs.home').then(function() {
$state.go('tabs.buyandsell');
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.checkingBalance = true;
$scope.formData = {
search: null
};
originalList = [];
CONTACTS_SHOW_LIMIT = 10;
currentContactsPage = 0;
hasWallets();
});
$scope.$on("$ionicView.enter", function(event, data) {
$ionicNavBarDelegate.showBar(true);
if (!$scope.hasWallets) {
$scope.checkingBalance = false;
return;
}
updateHasFunds();
updateWalletsList();
updateContactsList(function() {
updateList();
});
});
$scope.toggle = function(section) {
$scope.sectionDisplay[section] = !$scope.sectionDisplay[section];
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
}, 10);
};
});

View file

@ -16,7 +16,7 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
isoCode: config.wallet.settings.alternativeIsoCode
};
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay === 'crypto' ? gettextCatalog.getString('Cryptocurrency') : gettextCatalog.getString('Fiat');
// TODO move this to a generic service
bitpayAccountService.getAccounts(function(err, data) {
@ -45,6 +45,18 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
});
};
$scope.sendFeedback = function() {
var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet';
if (platformInfo.isNW) {
nw.Shell.openExternal(mailToLink);
} else if (platformInfo.isCordova) {
var mailWindow = window.open(mailToLink, '_system');
mailWindow.close(); // XX SP: bugfix for some browsers in cordova to change the view entirely
} else {
window.location.href = mailToLink;
}
};
$scope.openExternalLink = function() {
var appName = appConfigService.name;
var url = appName == 'copay' ? 'https://github.com/bitcoin-com/wallet/issues' : 'https://www.bitcoin.com/wallet-support';

View file

@ -1,11 +1,13 @@
'use strict';
angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingData, lodash, popupService, gettextCatalog, scannerService) {
angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingDataService, lodash, popupService, gettextCatalog, scannerService, sendFlowService) {
$scope.onScan = function(data) {
if (!incomingData.redir(data)) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Invalid data'));
}
incomingDataService.redir(data, function onError(err) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), err.message);
}
});
};
$scope.setScanFn = function(scanFn) {
@ -15,6 +17,10 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro
};
};
$scope.startFreshSend = function() {
sendFlowService.start();
};
$scope.importInit = function() {
$scope.fromOnboarding = $stateParams.fromOnboarding;
$timeout(function() {
@ -23,7 +29,6 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro
};
$scope.chooseScanner = function() {
var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
if (!isWindowsPhoneApp) {
@ -33,10 +38,14 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro
scannerService.useOldScanner(function(err, contents) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
popupService.showAlert(gettextCatalog.getString('Error'), err.message);
} else {
incomingDataService.redir(contents, function onError(err) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), err.message);
}
});
}
incomingData.redir(contents);
});
};

View file

@ -45,7 +45,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
});
$scope.readMore = function() {
var url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#amount-too-low-to-spend';
var url = 'https://walletsupport.bitcoin.com/article/101/transaction-fees';
var optIn = true;
var title = null;
var message = gettextCatalog.getString('Read more in our Wiki');
@ -201,7 +201,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio
$scope.viewOnBlockchain = function() {
var btx = $scope.btx;
var url = 'https://' + ($scope.getShortNetworkName() == 'test' ? 'test-' : '') + blockexplorerUrl + '/tx/' + btx.txid;
window.open(url, '_system');
externalLinkService.open(url, false);
};
$scope.getShortNetworkName = function() {

View file

@ -1,45 +1,65 @@
'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, storageService, $ionicScrollDelegate, $window, bwcError, gettextCatalog, timeService, feeService, appConfigService, rateService) {
var HISTORY_SHOW_LIMIT = 10;
var currentTxHistoryPage = 0;
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 DISPLAY_PAGE_SIZE = 15;
var currentTxHistoryDisplayPage = 0;
var completeTxHistory = []
var listeners = [];
$scope.txps = [];
$scope.completeTxHistory = [];
$scope.openTxpModal = txpModalService.open;
// For gradual migration for doing it properly
$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.isAndroid = platformInfo.isAndroid;
$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;
$scope.amountIsCollapsible = !$scope.isAndroid;
var channel = "ga";
if (platformInfo.isCordova) {
channel = "firebase";
}
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$scope.openExternalLink = function(url, target) {
externalLinkService.open(url, target);
};
var setPendingTxps = function(txps) {
/* Uncomment to test multiple outputs */
// var txp = {
// message: 'test multi-output',
// fee: 1000,
// createdOn: new Date() / 1000,
// outputs: [],
// wallet: $scope.wallet
// };
//
// function addOutput(n) {
// txp.outputs.push({
// amount: 600,
// toAddress: '2N8bhEwbKtMvR2jqMRcTCQqzHP6zXGToXcK',
// message: 'output #' + (Number(n) + 1)
// });
// };
// lodash.times(15, addOutput);
// txps.push(txp);
if (!txps) {
$scope.txps = [];
return;
@ -66,6 +86,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$scope.updatingStatus = true;
$scope.updateStatusError = null;
$scope.walletNotRegistered = false;
$scope.vm.fetchedAllTxHistory = false;
walletService.getStatus($scope.wallet, {
force: !!force,
@ -149,68 +170,97 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
if (err) return;
$timeout(function() {
walletService.startScan($scope.wallet, function() {
$scope.updateAll();
$scope.updateAll(true, true);
$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) {
var defaults = configService.getDefaults();
var configCache = configService.getSync();
lodash.each(txHistory, function(t) {
t.amountUnitStr = $scope.wallet.coin == 'btc'
lodash.each(txHistory, function onTx(tx) {
tx.amountUnitStr = $scope.wallet.coin == 'btc'
? (configCache.bitcoinAlias || defaults.bitcoinAlias)
: (configCache.bitcoinCashAlias || defaults.bitcoinCashAlias);
t.amountUnitStr = t.amountUnitStr.toUpperCase();
tx.amountUnitStr = tx.amountUnitStr.toUpperCase();
});
}
$scope.showHistory = function() {
if ($scope.completeTxHistory) {
$scope.txHistory = $scope.completeTxHistory.slice(0, (currentTxHistoryPage + 1) * HISTORY_SHOW_LIMIT);
$scope.txHistoryShowMore = $scope.completeTxHistory.length > $scope.txHistory.length;
function formatTxHistoryForDisplay(txHistory) {
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;
});
}
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) {
var date = new Date(txCreated * 1000);
@ -249,24 +299,35 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
return !tx.confirmations || tx.confirmations === 0;
};
// on-infinite="showMore()"
$scope.showMore = function() {
$timeout(function() {
currentTxHistoryPage++;
$scope.showHistory();
// Check if we have more than we are displaying
if (completeTxHistory.length > $scope.txHistory.length) {
currentTxHistoryDisplayPage++;
showHistory(false);
$scope.$broadcast('scroll.infiniteScrollComplete');
}, 100);
return;
}
if ($scope.vm.updatingTxHistory) {
return;
}
fetchAndShowTxHistory(false, false);
};
// on-refresh="onRefresh()"
$scope.onRefresh = function() {
$timeout(function() {
$scope.$broadcast('scroll.refreshComplete');
}, 300);
$scope.updateAll(true);
$scope.updateAll(true, false);
};
$scope.updateAll = function(force, cb)  {
updateStatus(force);
updateTxHistory(cb);
$scope.updateAll = function(forceStatusUpdate, flushTxCacheOnNew)  {
updateStatus(forceStatusUpdate);
//updateTxHistory(cb);
fetchAndShowTxHistory(true, flushTxCacheOnNew);
};
$scope.hideToggle = function() {
@ -276,97 +337,36 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
};
var prevPos;
$scope.txHistoryPaddingBottom = 0;
function getScrollPosition() {
var scrollPosition = $ionicScrollDelegate.getScrollPosition();
$timeout(function() {
getScrollPosition();
}, 200);
if (!scrollPosition) {
$window.requestAnimationFrame(function() {
getScrollPosition();
});
return;
}
var pos = scrollPosition.top;
if (pos > 0) {
$scope.txHistoryPaddingBottom = "200px";
}
if (pos === prevPos) {
$window.requestAnimationFrame(function() {
getScrollPosition();
});
return;
}
prevPos = pos;
refreshAmountSection(pos);
};
function refreshAmountSection(scrollPos) {
$scope.showBalanceButton = false;
if ($scope.status) {
$scope.showBalanceButton = ($scope.status.totalBalanceSat != $scope.status.spendableAmount);
}
if (!$scope.amountIsCollapsible) {
var t = ($scope.showBalanceButton ? 15 : 45);
$scope.amountScale = 'translateY(' + t + 'px)';
return;
}
scrollPos = scrollPos || 0;
var amountHeight = 210 - scrollPos;
if (amountHeight < 80) {
amountHeight = 80;
}
var contentMargin = amountHeight;
if (contentMargin > 210) {
contentMargin = 210;
}
var amountScale = (amountHeight / 210);
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.7) / 0.7) * top;
if (amountTop < -10) {
amountTop = -10;
}
if (amountTop > top) {
amountTop = top;
}
var t = amountTop;
$scope.altAmountOpacity = (amountHeight - 100) / 80;
$window.requestAnimationFrame(function() {
$scope.amountHeight = amountHeight + 'px';
$scope.contentMargin = contentMargin + 'px';
$scope.amountScale = 'scale3d(' + s + ',' + s + ',' + s + ') translateY(' + t + 'px)';
$scope.$digest();
getScrollPosition();
});
$scope.scrollPosition = pos;
}
var scrollWatcherInitialized;
$scope.$on("$ionicView.enter", function(event, data) {
if ($scope.isCordova && $scope.isAndroid) setAndroidStatusBarColor();
if (scrollWatcherInitialized || !$scope.amountIsCollapsible) {
return;
}
scrollWatcherInitialized = true;
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
configService.whenAvailable(function (config) {
$scope.selectedPriceDisplay = config.wallet.settings.priceDisplay;
@ -380,7 +380,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
if (!$scope.wallet) return;
$scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1;
$scope.updatingTxHistory = true;
$scope.vm.gettingInitialHistory = true;
addressbookService.list(function(err, ab) {
if (err) $log.error(err);
@ -390,28 +390,31 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
listeners = [
$rootScope.$on('bwsEvent', function(e, walletId) {
if (walletId == $scope.wallet.id && e.type != 'NewAddress')
$scope.updateAll();
$scope.updateAll(false, false);
}),
$rootScope.$on('Local/TxAction', function(e, walletId) {
if (walletId == $scope.wallet.id)
$scope.updateAll();
$scope.updateAll(false, false);
}),
];
});
var refreshInterval;
$scope.$on("$ionicView.afterEnter", function(event, data) {
$scope.updateAll();
refreshAmountSection();
$scope.$on("$ionicView.afterEnter", function onAfterEnter(event, data) {
updateTxHistoryFromCachedData();
$scope.updateAll(true, true);
// refreshAmountSection();
refreshInterval = $interval($scope.onRefresh, 10 * 1000);
$timeout(function() {
getScrollPosition();
}, 1000);
});
$scope.$on("$ionicView.afterLeave", function(event, data) {
$interval.cancel(refreshInterval);
if ($window.StatusBar) {
var statusBarColor = appConfigService.name == 'copay' ? '#192c3a' : '#1e3186';
$window.StatusBar.backgroundColorByHexString(statusBarColor);
$window.StatusBar.backgroundColorByHexString('#000000');
}
});
@ -463,4 +466,30 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
$scope.goToSend = function() {
sendFlowService.start({
fromWalletId: $scope.wallet.id
});
};
$scope.goToReceive = function() {
$state.go('tabs.home', {
walletId: $scope.wallet.id
}).then(function () {
$ionicHistory.clearHistory();
$state.go('tabs.receive', {
walletId: $scope.wallet.id
});
});
};
$scope.goToBuy = function() {
$state.go('tabs.home', {
walletId: $scope.wallet.id
}).then(function () {
$ionicHistory.clearHistory();
$state.go('tabs.buyandsell');
});
};
});

View file

@ -0,0 +1,204 @@
'use strict';
(function () {
angular
.module('copayApp.controllers')
.controller('walletSelectorController', walletSelectorController);
function walletSelectorController ($scope, $state, sendFlowService, configService, gettextCatalog, ongoingProcess, profileService, walletService, txFormatService) {
var fromWalletId = '';
var priceDisplayAsFiat = false;
var unitDecimals = 0;
var unitsFromSatoshis = 0;
$scope.$on("$ionicView.beforeEnter", onBeforeEnter);
$scope.$on("$ionicView.enter", onEnter);
function onBeforeEnter(event, data) {
if (data.direction == "back") {
sendFlowService.state.pop();
}
$scope.params = sendFlowService.state.getClone();
console.log('walletSelector onBeforeEnter after back sendflow', $scope.params);
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) {
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() {
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});
}
} 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) {
var params = sendFlowService.state.getClone();
if ($scope.type === 'origin') { // we're on the origin screen, set wallet to send from
params.fromWalletId = wallet.id;
} else { // we're on the destination screen, set wallet to send to
params.toWalletId = wallet.id;
}
sendFlowService.goNext(params);
};
$scope.goBack = function() {
sendFlowService.router.goBack();
}
}
})();

View file

@ -0,0 +1,15 @@
angular.module('copayApp')
.config(['$provide', '$logProvider', function($provide, $logProvider) {
// expose a provider to reach debugEnabled in $log
$provide.value('$logProvider', $logProvider);
}])
.decorator('$log', ['$logProvider', '$delegate', function($logProvider, $delegate) {
// override $log.debug to display in Chrome
$delegate.debug = function () {
if ($logProvider.debugEnabled()) {
$delegate.info.apply($delegate, arguments);
}
};
return $delegate;
}]);

View file

@ -1,38 +1,26 @@
'use strict';
angular.module('copayApp.directives')
.directive('copyToClipboard', function(platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) {
.directive('copyToClipboard', function(clipboardService, ionicToast, gettextCatalog) {
return {
restrict: 'A',
scope: {
copyToClipboard: '=copyToClipboard'
},
link: function(scope, elem, attrs, ctrl) {
var isCordova = platformInfo.isCordova;
var isChromeApp = platformInfo.isChromeApp;
var isNW = platformInfo.isNW;
elem.bind('mouseover', function() {
elem.css('cursor', 'pointer');
});
var msg = gettextCatalog.getString('Copied to clipboard');
elem.bind('click', function() {
var data = scope.copyToClipboard;
if (!data) return;
clipboardService.copyToClipboard(data);
if (isCordova) {
cordova.plugins.clipboard.copy(data);
} else if (isNW) {
nodeWebkitService.writeToClipboard(data);
} else if (clipboard.supported) {
clipboard.copyText(data);
} else {
// No supported
return;
}
scope.$apply(function() {
var msg = gettextCatalog.getString('Copied to clipboard');
scope.$apply(function () {
ionicToast.show(msg, 'bottom', false, 1000);
});
});
}
}

View file

@ -0,0 +1,198 @@
'use strict';
(function(){
/**
* @desc amount directive that can be used to display formatted financial values
* size-equal attribute is optional, defaults to false.
* @example fee = {
* value: 12.49382901,
* currency: 'BCH'
* }
* @example <formatted-amount value="fee.value" currency="fee.currency"></formatted-amount>
* @example <formatted-amount value="fee.value" currency="fee.currency" size-equal="true"></formatted-amount>
*/
angular
.module('bitcoincom.directives')
.directive('formattedAmount', function() {
return {
restrict: 'E',
scope: {
value: '@',
currency: '@',
sizeEqual: '@'
},
templateUrl: 'views/includes/formatted-amount.html',
controller: formattedAmountController
}
});
function formattedAmountController($scope, uxLanguage) {
$scope.vm = {};
var vm = $scope.vm;
vm.currency = '';
vm.value = '';
$scope.canShow = false
$scope.displaySizeEqual = !!$scope.sizeEqual;
var decimalPlaces = {
'0': ['BIF', 'CLP', 'DJF', 'GNF', 'ILS', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'VND', 'VUV', 'XAF', 'XOF', 'XPF'],
'3': ['BHD', 'IQD', 'JOD', 'KWD', 'OMR', 'TND'],
'8': ['BCH', 'BTC']
};
$scope.$watch('value', function onFormattedAmountWatch() {
formatNumbers();
});
function buildAmount(start, middle, end) {
$scope.start = start;
$scope.middle = middle;
$scope.end = end;
};
/**
* On Android 4.4, toLocaleString() only returns 3 fractional digits when 8 is specified.
*/
function ensureEnoughFractionDigits(localizedString, number, desiredFractionDigits) {
if (desiredFractionDigits === 0) {
// Assume it is OK
return localizedString;
}
var fractionalRe = /^-*(\d*\D)(\d+)$/;
var match = fractionalRe.exec(localizedString);
if (!match || match.length !== 3) {
// Don't know what's happening, just return what we have
return localizedString;
}
var decimals = match[2];
var decimalCount = decimals.length;
if (decimalCount >= desiredFractionDigits) {
// Everything is OK.
return localizedString;
}
if (typeof number !== 'number') {
number = parseFloat(number);
}
var fixed = number.toFixed(desiredFractionDigits);
var fixedMatch = fractionalRe.exec(fixed);
if (!fixedMatch || fixedMatch.length !== 3) {
// Don't know what's happening, just return what we have
return localizedString;
}
// Keeps locale decimal separator.
var enough = match[1] + fixedMatch[2];
return enough;
}
function formatNumbers() {
// Might get "< 0.01 USD" being passed in.
// During watch, may be changed from having a separate currency value,
// to both being in value. Don't want to use previous currency value.
// Try to extract currency from value..
if (!$scope.currency || $scope.currency.length === 0) {
var currencySplit = $scope.value.split(" ");
if (currencySplit.length >= 2) {
vm.currency = currencySplit[currencySplit.length - 1];
}
} else {
vm.currency = $scope.currency;
}
// Redo this when we have proper formatting for low fees
if ($scope.value.indexOf("<") === 0) {
buildAmount($scope.value, '', '');
vm.currency = '';
$scope.canShow = true;
return;
}
// Remove thousands separators for parseFloat()
$scope.value = $scope.value.replace(',', '');
var parsed = parseFloat($scope.value);
var valueFormatted = '';
var valueProcessing = '';
switch (getDecimalPlaces(vm.currency)) {
case '0':
if (isNaN(parsed)) {
buildAmount('-', '', '');
} else {
valueFormatted = localizeNumbers(Math.round(parsed), 0);
buildAmount(valueFormatted, '', '');
}
break;
case '3':
if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '---', '', '');
} else {
valueProcessing = parsed.toFixed(3);
valueFormatted = localizeNumbers(valueProcessing, 3);
buildAmount(valueFormatted, '', '');
}
break;
case '8':
if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '---', '', '');
} else if (parsed === 0) {
buildAmount('0', '', '');
} else {
valueFormatted = parsed.toFixed(8);
valueFormatted = localizeNumbers(valueFormatted, 8);
var start = valueFormatted.slice(0, -5);
var middle = valueFormatted.slice(-5, -2);
var end = valueFormatted.substr(valueFormatted.length - 2);
buildAmount(start, middle, end);
}
break;
default: // 2
if (isNaN(parsed)) {
buildAmount('-' + getDecimalSeparator() + '--', '', '');
} else {
valueProcessing = parseFloat(parsed.toFixed(2));
valueFormatted = localizeNumbers(valueProcessing, 2);
buildAmount(valueFormatted, '', '');
}
break;
}
$scope.canShow = true;
};
function getDecimalPlaces(currency) {
if (decimalPlaces['0'].indexOf(currency.toUpperCase()) > -1) return '0';
if (decimalPlaces['3'].indexOf(currency.toUpperCase()) > -1) return '3';
if (decimalPlaces['8'].indexOf(currency.toUpperCase()) > -1) return '8';
return '2';
};
function getDecimalSeparator() {
var testNum = 1.5;
var testString = testNum.toLocaleString(uxLanguage.getCurrentLanguage());
// Some environments let you set decimal separators that are more than one character
var separator = /^1(.+)5$/.exec(testString)[1]
return separator;
};
function localizeNumbers(x, minimumFractionDigits) {
var parsed = parseFloat(x);
var opts = {
minimumFractionDigits: minimumFractionDigits,
useGrouping: true
};
var lang = uxLanguage.getCurrentLanguage();
var localized = parsed.toLocaleString(lang, opts);
var corrected = ensureEnoughFractionDigits(localized, x, minimumFractionDigits);
return corrected;
};
}
})();

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.directives')
.directive('gravatar', function(md5) {
.directive('gravatar', function(md5, $http) {
return {
restrict: 'AE',
replace: true,
@ -9,13 +9,24 @@ angular.module('copayApp.directives')
name: '@',
height: '@',
width: '@',
email: '@'
email: '@',
url: '@'
},
link: function(scope, el, attr) {
if (typeof scope.email === "string") {
scope.emailHash = md5.createHash(scope.email.toLowerCase() || '');
var req = {
method: 'GET',
url: 'https://secure.gravatar.com/'+scope.emailHash+'.json',
};
scope.url = 'img/contact-placeholder.svg';
$http(req).then(function (response) {
scope.url = 'https://secure.gravatar.com/avatar/'+scope.emailHash+'.jpg?s='+scope.width+'&d=mm';
}, function (error) {
scope.url = 'img/contact-placeholder.svg';
});
}
},
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=mm">'
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="{{ url }}">'
};
});

View file

@ -1,23 +1,28 @@
'use strict';
angular.module('copayApp.directives')
.directive('incomingDataMenu', function($timeout, $rootScope, $state, externalLinkService) {
.directive('incomingDataMenu', function($timeout, $rootScope, $state, externalLinkService, sendFlowService, bitcoinCashJsService) {
return {
restrict: 'E',
templateUrl: 'views/includes/incomingDataMenu.html',
link: function(scope, element, attrs) {
$rootScope.$on('incomingDataMenu.showMenu', function(event, data) {
$timeout(function() {
scope.data = data.data;
scope.type = data.type;
scope.showMenu = true;
scope.https = false;
scope.data = data;
if (scope.type === 'url') {
if (scope.data.indexOf('https://') === 0) {
scope.https = true;
}
if (scope.data.parsed.privateKey) {
scope.type = "privateKey";
} else if (scope.data.parsed.url) {
scope.type = "url";
} else if (scope.data.parsed.publicAddress) {
scope.type = "bitcoinAddress";
var prefix = scope.data.parsed.isTestnet ? 'bchtest:' : 'bitcoincash:';
scope.data.toAddress = (prefix + scope.data.parsed.publicAddress.cashAddr) || scope.data.parsed.publicAddress.legacy || scope.data.parsed.publicAddress.bitpay;
} else {
scope.type = "text";
}
scope.showMenu = true;
});
});
scope.hide = function() {
@ -28,18 +33,9 @@ angular.module('copayApp.directives')
externalLinkService.open(url);
};
scope.sendPaymentToAddress = function(bitcoinAddress) {
var noPrefixInAddress = 0;
if (bitcoinAddress.toLowerCase().indexOf('bitcoin') < 0) {
noPrefixInAddress = 1;
}
scope.showMenu = false;
$state.go('tabs.send').then(function() {
$timeout(function() {
$state.transitionTo('tabs.send.amount', {
toAddress: bitcoinAddress,
noPrefix: noPrefixInAddress
});
}, 50);
sendFlowService.start({
data: bitcoinAddress
});
};
scope.addToAddressBook = function(bitcoinAddress) {

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function($interval, shapeshiftApiService, profileService, incomingData, ongoingProcess) {
angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function($interval, shapeshiftApiService, profileService, incomingDataService, ongoingProcess) {
return {
restrict: 'E',
transclude: true,
@ -111,7 +111,8 @@ angular.module('copayApp.directives').directive('shapeshiftCoinTrader', function
orderId: $scope.depositInfo.orderId
};
if (incomingData.redir(sendAddress, shapeshiftData)) {
// How to handle this
if (incomingDataService.redir(sendAddress, 'shapeshift', shapeshiftData)) {
ongoingProcess.set('connectingShapeshift', false);
return;
}

View file

@ -116,7 +116,8 @@ angular.module('copayApp.directives')
function getTransformStyle(translatePct) {
return {
'transform': 'translateX(' + translatePct + '%)'
'transform': 'translateX(' + translatePct + '%)',
'-webkit-transform': 'translateX(' + translatePct + '%)'
};
}

View file

@ -9,12 +9,12 @@ angular.module('copayApp.directives')
scope: {
isShown: '=slideSuccessShow',
onConfirm: '&slideSuccessOnConfirm',
hideOnConfirm: '=slideSuccessHideOnConfirm'
hideOnConfirm: '=slideSuccessHideOnConfirm',
onShare: '=slideSuccessOnShare',
},
link: function(scope, element, attrs) {
scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
scope.isCordova = platformInfo.isCordova;
scope.hasShareFunction = typeof scope.onShare === 'function';
var elm = element[0];
elm.style.display = 'none';
scope.$watch('isShown', function() {
@ -32,6 +32,9 @@ angular.module('copayApp.directives')
elm.style.display = 'none';
}
};
scope.onShareButtonClick = function() {
scope.onShare();
}
}
};
});

View file

@ -0,0 +1,131 @@
'use strict';
(function(){
angular
.module('bitcoincom.directives')
.directive('walletBalance', function() {
return {
restrict: 'E',
scope: {
displayAsFiat: '@',
totalBalanceSat: '@',
// The Wallet object is sometimes not stringify()-able, so not interpolatable,
// so can't be passed to a directive.
walletCoin: '@',
walletStatus: '@',
walletCachedBalance: '@',
walletCachedBalanceUpdatedOn: '@',
walletCachedStatus: '@'
},
templateUrl: 'views/includes/wallet-balance.html',
controller: walletBalanceController
}
});
function walletBalanceController($log, $scope, txFormatService) {
var cryptoBalanceHasBeenDisplayed = false;
formatBalance();
$scope.$watchGroup(['displayAsFiat', 'totalBalanceSat'], function onWalletBalanceWatch() {
formatBalance();
});
function displayCryptoBalance(walletStatus, walletCachedBalance, walletCachedBalanceUpdatedOn, walletCachedStatus) {
if (walletStatus && walletStatus.isValid && walletStatus.totalBalanceStr) {
setDisplay(walletStatus.totalBalanceStr, '');
cryptoBalanceHasBeenDisplayed = true;
return;
}
if (walletCachedBalance) {
setDisplay(walletCachedBalance, walletCachedBalanceUpdatedOn);
return;
}
if (walletCachedStatus && walletCachedStatus.isValid && walletCachedStatus.totalBalanceStr) {
setDisplay(walletCachedStatus.totalBalanceStr, '');
return;
}
setDisplay('', '');
}
function displayFiatBalance(walletStatus, walletCachedStatus, walletCoin) {
var displayAmount = '';
if (walletStatus && walletStatus.isValid && walletStatus.alternativeBalanceAvailable) {
displayAmount = walletStatus.totalBalanceAlternative + ' ' + walletStatus.alternativeIsoCode;
setDisplay(displayAmount, '');
return;
}
if (walletCachedStatus && walletCachedStatus.isValid && walletCachedStatus.alternativeBalanceAvailable) {
displayAmount = walletCachedStatus.totalBalanceAlternative + ' ' + walletCachedStatus.alternativeIsoCode;
setDisplay(displayAmount, '');
return;
}
getFiatBalance(walletStatus, walletCachedStatus, walletCoin);
}
function formatBalance() {
var displayAsFiat = $scope.displayAsFiat === 'true';
var walletStatusObj = null;
var walletCachedBalance = null;
var walletCachedBalanceUpdatedOn = null;
var walletCachedStatusObj = null;
try {
walletStatusObj = JSON.parse($scope.walletStatus);
} catch (e) {
$log.warn('Failed to parse walletStatus.', e);
}
try {
walletCachedStatusObj = JSON.parse($scope.walletCachedStatus);
} catch (e) {
$log.warn('Failed to parse walletCachedStatus.', e);
}
if (!displayAsFiat || displayAsFiat && !cryptoBalanceHasBeenDisplayed) {
displayCryptoBalance(walletStatusObj, walletCachedBalance, walletCachedBalanceUpdatedOn, walletCachedStatusObj);
}
if (displayAsFiat) {
displayFiatBalance(walletStatusObj, walletCachedStatusObj, $scope.walletCoin);
}
}
function getFiatBalance(walletStatus, walletCachedStatus, walletCoin) {
var totalBalanceSat = null;
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;
}
txFormatService.formatAlternativeStr(walletCoin, totalBalanceSat, function onFormatAlernativeStr(formatted) {
if (formatted) {
setDisplay(formatted, '');
} else {
$log.error('Failed to format fiat balance of wallet.');
}
});
}
function setDisplay(amount, cachedBalanceUpdatedOn) {
$scope.displayAmount = amount;
$scope.cachedBalanceUpdatedOn = cachedBalanceUpdatedOn;
}
}
})();

View file

@ -8,16 +8,21 @@ angular.module('copayApp.directives')
transclude: true,
scope: {
title: '=walletSelectorTitle',
forceTitle: '=walletSelectorForceTitle',
show: '=walletSelectorShow',
wallets: '=walletSelectorWallets',
selectedWallet: '=walletSelectorSelectedWallet',
onSelect: '=walletSelectorOnSelect',
alwaysDisplayBitcoinCore: '=walletSelectorAlwaysDisplayBitcoinCore'
onHide: '=walletSelectorOnHide',
displayBalanceAsFiat : '=walletSelectorDisplayBalanceAsFiat'
},
link: function(scope, element, attrs) {
scope.displayWallet = true;
console.log(scope, element, attrs);
scope.hide = function() {
scope.show = false;
if (typeof scope.onHide === "function") {
scope.onHide()
}
};
scope.selectWallet = function(wallet) {
$timeout(function() {
@ -28,19 +33,6 @@ angular.module('copayApp.directives')
scope.$watch('wallets', function(newValue, oldValue) {
scope.wallets = newValue;
});
scope.initDisplayBitcoinCoreConfig = function() {
configService.whenAvailable(function(config) {
scope.displayBitcoinCore = config.displayBitcoinCore.enabled;
scope.initWalletDisplay();
});
};
scope.initWalletDisplay = function() {
scope.displayWallet = scope.alwaysDisplayBitcoinCore ? true : scope.displayBitcoinCore;
};
scope.initDisplayBitcoinCoreConfig();
$rootScope.$on('Local/SettingsUpdated', function(e, walletId) {
scope.initDisplayBitcoinCoreConfig();
});
}
};
});

Some files were not shown because too many files have changed in this diff Show more