2014-03-19 09:17:18 -07:00
<!doctype html>
2014-05-14 07:27:18 -07:00
< html lang = "en" ng-csp >
2014-03-14 13:38:27 -07:00
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" >
< meta name = "viewport" content = "width=device-width" >
2014-03-28 11:08:14 -07:00
< title > Copay - Multisignature Wallet< / title >
2014-03-27 08:07:10 -07:00
< link rel = "stylesheet" href = "css/foundation.min.css" >
2014-03-28 12:39:58 -07:00
< link rel = "stylesheet" href = "css/foundation-icons.css" >
2014-05-14 07:27:18 -07:00
< link rel = "stylesheet" href = "lib/angular/angular-csp.css" >
2014-03-14 13:38:27 -07:00
< link rel = "stylesheet" href = "css/main.css" >
< / head >
2014-04-25 07:50:53 -07:00
< body ng-cloak class = "ng-cloak" >
2014-04-25 13:22:51 -07:00
< div id = "wrap" >
< div data-ng-init = "init()" data-ng-controller = "HeaderController" >
< div class = "header" >
< div class = "header-content" >
2014-05-01 05:42:31 -07:00
< div class = "large-3 medium-3 columns" >
2014-04-29 07:56:37 -07:00
< span class = "logo" > < / span >
2014-04-25 13:22:51 -07:00
< / div >
2014-04-29 10:24:26 -07:00
< div class = "large-9 medium-9 columns text-center p10t" ng-show = "$root.wallet" >
2014-05-01 08:01:15 -07:00
< div class = "large-4 medium-4 columns line-dashed-v" >
2014-04-29 15:31:59 -07:00
< a href = "#/addresses" class = "has-tip" tooltip-placement = "bottom" tooltip = "{{$root.wallet.id}}" >
2014-04-29 14:20:44 -07:00
< strong > < span > {{$root.getWalletDisplay()}}< / span > < / strong >
2014-04-29 10:24:26 -07:00
< / a >
2014-04-30 15:50:13 -07:00
< a class = "button radius small-icon" title = "Manual Refresh"
ng-disabled="$root.loading"
ng-click="refresh()">< i class = "fi-refresh" > < / i > < / a >
< a class = "button radius small-icon" title = "Signout"
ng-click="signout()">< i class = "fi-power" > < / i > < / a >
2014-04-29 10:24:26 -07:00
< / div >
< div class = "large-4 medium-4 columns line-dashed-v" >
2014-05-08 13:23:12 -07:00
Balance:
< span ng-if = "$root.loading" > ...< / span >
< span ng-if = "!$root.loading" > {{totalBalance || 0}}< / span >
< i class = "fi-bitcoin" > < / i > < br >
2014-04-29 07:56:37 -07:00
< / div >
2014-04-29 10:24:26 -07:00
< div class = "large-4 medium-4 columns" >
2014-05-08 13:23:12 -07:00
Available to Spend:
< span ng-if = "$root.loading" > ...< / span >
< span ng-if = "!$root.loading" > {{availableBalance || 0}}< / span >
< i class = "fi-bitcoin" > < / i >
2014-04-29 07:56:37 -07:00
< / div >
2014-05-12 08:00:25 -07:00
2014-04-24 12:35:52 -07:00
< / div >
2014-03-28 08:32:29 -07:00
< / div >
2014-04-25 13:22:51 -07:00
< nav class = "top-bar" data-topbar ng-show = "$root.wallet" >
< ul class = "title-area" >
< li class = "name" > < / li >
< li class = "toggle-topbar menu-icon" >
< a ng-click = "isCollapsed=!isCollapsed" > Menu< / a >
2014-04-15 10:02:45 -07:00
< / li >
2014-03-28 08:32:29 -07:00
< / ul >
2014-04-25 13:22:51 -07:00
< section class = "top-bar-section {{isCollapsed && 'hide_menu' || 'show_menu'}}" >
< ul >
2014-04-29 15:26:12 -07:00
< li data-ng-repeat = "item in menu" ui-route = "/{{item.link}}" class = "text-center" data-ng-class = "{active: isActive(item)}" >
2014-05-13 01:02:21 -07:00
< a href = "{{item.link}}" > < i class = "{{item.icon}}" > < / i > {{item.title}}
2014-05-13 07:27:31 -07:00
< span class = "label alert round" ng-if = "item.link=='#/transactions' && $root.pendingTxCount > 0" > {{$root.pendingTxCount}}< / span >
2014-05-13 00:03:09 -07:00
< / a >
2014-04-25 13:22:51 -07:00
< / li >
< / ul >
< / section >
< / nav >
2014-04-19 00:55:32 -07:00
< / div >
2014-04-09 07:05:25 -07:00
2014-04-25 13:22:51 -07:00
< div class = "row" ng-if = '$root.flashMessage.message' notification >
< div class = "small-8 large-centered columns" >
2014-04-30 10:59:20 -07:00
< div data-alert class = "alert-box radius {{$root.flashMessage.type}}" >
2014-04-25 13:22:51 -07:00
{{$root.flashMessage.message}}
< a ng-click = "clearFlashMessage()" class = "close" > × < / a >
< / div >
< / div >
< / div >
2014-04-23 09:44:20 -07:00
2014-04-25 13:22:51 -07:00
< div class = "row" >
2014-05-08 11:45:57 -07:00
< div ng-if = '$root.wallet && !$root.wallet.publicKeyRing.isComplete() && !loading' >
2014-05-09 09:44:05 -07:00
< div class = "alert-box secondary radius" data-alert >
< i class = "fi-info" > < / i >
Not all copayers have joined your wallet yet.
2014-05-09 08:29:00 -07:00
< span ng-show = "$root.wallet.publicKeyRing.totalCopayers - $root.wallet.publicKeyRing.registeredCopayers()>1" >
2014-05-09 09:44:05 -07:00
{{$root.wallet.publicKeyRing.totalCopayers - $root.wallet.publicKeyRing.registeredCopayers() }} people have
2014-05-09 08:29:00 -07:00
< / span >
< span ng-show = "$root.wallet.publicKeyRing.totalCopayers - $root.wallet.publicKeyRing.registeredCopayers()==1" >
2014-05-09 09:44:05 -07:00
One person has
2014-05-09 08:29:00 -07:00
< / span >
2014-05-09 09:44:05 -07:00
yet to join.
2014-05-08 11:45:57 -07:00
< / div >
2014-04-25 13:22:51 -07:00
2014-05-08 11:45:57 -07:00
< div class = "panel radius" >
< h3 class = "m15b" > Share this secret with your other copayers
< small > for them to join your wallet< / small >
< / h3 >
< div class = "row" >
2014-05-09 08:29:00 -07:00
< div class = "large-9 medium-12 small-12 columns line-dashed-v text-gray" >
< div class = "panel input" >
2014-05-08 11:45:57 -07:00
< p class = "text-gray" > {{$root.wallet.getSecret()}}< / p >
< / div >
< / div >
2014-05-09 08:29:00 -07:00
< div class = "large-3 columns hide-for-medium hide-for-small" ng-show = "$root.wallet" >
2014-05-08 11:45:57 -07:00
< h5 class = "m0" > {{$root.getWalletDisplay()}}< / h5 >
< p class = "text-gray" > {{$root.wallet.requiredCopayers}}-of-{{$root.wallet.totalCopayers}} wallet< / p >
< / div >
2014-04-25 13:22:51 -07:00
< / div >
2014-05-08 11:45:57 -07:00
< / div >
2014-04-25 13:22:51 -07:00
< / div >
2014-04-17 14:11:42 -07:00
< / div >
2014-04-17 09:43:34 -07:00
2014-04-25 13:22:51 -07:00
< / div >
2014-04-17 09:43:34 -07:00
2014-05-14 22:13:25 -07:00
< div notifications = "middle right" > < / div >
2014-05-07 12:08:24 -07:00
< div id = "main" class = "row" ng-class = "{'main-home': !$root.wallet}" >
2014-04-25 13:22:51 -07:00
< div class = "large-12 columns" ng-view > < / div >
< / div >
2014-04-09 07:05:25 -07:00
< / div >
2014-05-07 12:08:24 -07:00
< div id = "footer" data-ng-controller = "FooterController" ng-class = "{'footer-home': !$root.wallet}" >
2014-04-29 07:56:37 -07:00
< link rel = "stylesheet" ng-href = "{{theme}}" >
2014-05-07 12:08:24 -07:00
< div class = "row" ng-show = "!$root.wallet" >
< div class = "large-12 columns text-right" >
Copay
2014-05-14 17:02:01 -07:00
< small > v{{version}}< / small >
2014-05-07 12:08:24 -07:00
< / div >
< / div >
2014-05-13 10:55:26 -07:00
< div class = "row p10t" ng-show = "$root.wallet" >
< div class = "large-3 medium-3 small-3 columns" >
2014-05-01 08:01:15 -07:00
< div >
< strong > {{$root.getWalletDisplay()}}< / strong >
< / div >
< div class = "size-12 m10t" >
2014-04-29 15:12:14 -07:00
{{$root.wallet.requiredCopayers}}-of-{{$root.wallet.totalCopayers}} wallet
2014-05-01 08:01:15 -07:00
< / div >
< div class = "size-12 m10t" ng-if = "themes.length > 1" >
< a class = "size-12" ng-click = "change_theme(th)" ng-repeat = "th in themes" > {{th}} {{$last ? '' : '· '}}< / a >
< / div >
2014-04-29 15:12:14 -07:00
< / div >
2014-05-07 11:16:56 -07:00
< div class = "large-9 medium-9 small-9 columns" >
2014-05-13 10:55:26 -07:00
< a href = "#/addresses" > < / a >
< div class = "bottom-copay"
ng-repeat="c in $root.wallet.getRegisteredPeerIds()" class="has-tip" tooltip-placement="top" tooltip="{{c.nick}}">
2014-05-08 11:48:00 -07:00
< video ng-if = "$root.videoInfo[c.peerId]"
avatar peer="{{c}}"
2014-05-07 15:04:36 -07:00
autoplay
2014-05-08 12:31:08 -07:00
ng-class="($root.wallet.getOnlinePeerIDs().indexOf(c.peerId) != -1) ? 'online' : 'offline'"
2014-05-01 08:01:15 -07:00
ng-src="{{$root.getVideoURL(c.peerId)}}"
2014-05-08 11:48:00 -07:00
>< / video >
2014-05-07 15:04:36 -07:00
< img ng-if = "!$root.videoInfo[c.peerId]"
2014-05-08 11:48:00 -07:00
avatar peer="{{c}}"
2014-05-08 12:31:08 -07:00
ng-class="($root.wallet.getOnlinePeerIDs().indexOf(c.peerId) != -1) ? 'online' : 'offline'"
2014-05-01 08:01:15 -07:00
src="./img/satoshi.gif"
2014-05-08 11:48:00 -07:00
/>
2014-05-01 08:01:15 -07:00
< / div >
2014-04-29 15:12:14 -07:00
< / div >
2014-04-29 07:56:37 -07:00
< / div >
2014-03-26 05:18:42 -07:00
< / div >
2014-03-19 09:17:18 -07:00
<!-- Templates -->
< script type = "text/ng-template" id = "signin.html" >
2014-04-22 12:07:14 -07:00
< div class = "signin" ng-controller = "SigninController" >
2014-05-15 17:16:26 -07:00
< div data-alert class = "alert-box info radius" ng-show = "loading && !failure" >
2014-05-07 14:48:56 -07:00
< i class = "size-21 fi-bitcoin-circle icon-rotate spinner" > < / i >
2014-05-08 06:03:32 -07:00
Authenticating and Looking for peers...
2014-03-31 08:48:35 -07:00
< / div >
2014-05-15 17:16:26 -07:00
< div class = "alert-box error radius" ng-show = "failure" >
Oops, we had an error! Looks like you are already connected to this wallet,
please close all other Copay Wallets and < a ng-click = 'failure = false; loading = false' > Try again< / a > .
< / div >
2014-03-31 08:48:35 -07:00
< div ng-show = "!loading" >
2014-04-30 12:11:55 -07:00
< div class = "row" >
2014-05-06 10:39:16 -07:00
< div class = "large-6 medium-6 columns" >
2014-05-09 08:29:00 -07:00
< div class = "box-signin radius" >
2014-05-01 07:51:35 -07:00
< div ng-show = "wallets.length" >
< h3 > Open Wallet< / h3 >
2014-05-06 10:39:16 -07:00
< form name = "openForm" ng-submit = "open(openForm)" novalidate >
< select class = "form-control" ng-model = "selectedWalletId" ng-options = "w.id as w.show for w in wallets" required >
< / select >
2014-05-09 13:13:56 -07:00
< input type = "password" class = "form-control" placeholder = "Your password" name = "openPassword" ng-model = "openPassword" required >
2014-05-06 10:39:16 -07:00
< button type = "submit" class = "button secondary radius" ng-disabled = "openForm.$invalid || loading" loading = "Opening" > Open< / button >
< / form >
2014-05-01 07:51:35 -07:00
< / div >
< div ng-show = "!wallets.length" >
< h3 > Create a new wallet< / h3 >
2014-05-06 10:39:16 -07:00
< form name = "createForm" ng-submit = "create(createForm)" novalidate >
< input type = "text" class = "form-control" ng-model = "walletName" name = "walletName" placeholder = "Wallet name (optional)" >
2014-05-09 13:13:56 -07:00
< input type = "password" class = "form-control" placeholder = "Choose your password" name = "createPassword" ng-model = "createPassword" required >
2014-05-06 10:39:16 -07:00
< button type = "submit" class = "button secondary radius" ng-disabled = "createForm.$invalid || loading" loading = "Creating" > Create< / button >
< / form >
2014-05-01 07:51:35 -07:00
< / div >
2014-04-17 08:37:10 -07:00
< / div >
< / div >
2014-05-06 10:39:16 -07:00
< div class = "large-6 medium-6 columns" >
2014-05-09 08:29:00 -07:00
< div class = "box-signin radius" >
2014-05-06 10:39:16 -07:00
< h3 > Join a Wallet in Creation< / h3 >
< form name = "joinForm" ng-submit = "join(joinForm)" novalidate >
2014-05-14 14:24:24 -07:00
< input type = "text" class = "form-control" placeholder = "Paste wallet secret here" name = "connectionId" ng-model = "connectionId" wallet-secret required >
2014-05-09 13:13:56 -07:00
< input type = "password" class = "form-control" placeholder = "Choose your password" name = "joinPassword" ng-model = "joinPassword" required >
2014-05-06 10:39:16 -07:00
< input type = "text" class = "form-control" placeholder = "Your name (optional)" name = "nickname" ng-model = "nickname" >
< button type = "submit" class = "button primary radius" ng-disabled = "joinForm.$invalid || loading" loading = "Joining" > Join< / button >
< / form >
< / div >
< / div >
2014-04-21 09:04:47 -07:00
< / div >
< div class = "row" >
2014-04-30 12:11:55 -07:00
< div class = "large-12 columns text-center line-dashed" >
2014-05-13 10:19:37 -07:00
< a href = "#settings" > Settings< / a > ·
2014-04-30 12:11:55 -07:00
< span ng-show = "wallets.length" >
2014-05-06 10:46:26 -07:00
< a href = "#/setup" > Create a new wallet< / a > ·
2014-04-30 12:11:55 -07:00
< / span >
2014-05-05 12:47:47 -07:00
< a ng-href = "#import" > Import a backup< / a >
2014-03-31 14:05:35 -07:00
< / div >
2014-03-27 12:31:42 -07:00
< / div >
2014-04-30 12:11:55 -07:00
< / div > <!-- End !loading -->
2014-03-27 12:31:42 -07:00
< / div >
< / script >
2014-04-29 12:34:40 -07:00
2014-04-25 13:34:24 -07:00
< script type = "text/ng-template" id = "import.html" >
< div ng-controller = "ImportController" >
2014-05-07 14:48:56 -07:00
< div data-alert class = "alert-box info radius" ng-show = "loading" >
< i class = "size-21 fi-bitcoin-circle icon-rotate spinner" > < / i >
Importing wallet...
< / div >
2014-05-15 14:02:21 -07:00
< div ng-init = "choosefile=0; pastetext=0" ng-show = "!loading" >
< h3 > {{title}}< / h3 >
2014-05-05 09:16:56 -07:00
< form name = "importForm" ng-submit = "import(importForm)" novalidate >
2014-05-15 14:02:21 -07:00
< div class = "row" >
< div class = "large-6 large-centered medium-6 medium-centered columns" >
< fieldset >
< legend > Select which method want to use to restore< / legend >
< label for = "backupFile" ng-click = "choosefile=!choosefile" class = "m10b" > · Choose backup file from your computer < i class = "fi-laptop" > < / i > < / label >
< input type = "file" class = "form-control" placeholder = "Select a backup file" name = "backupFile" ng-model = "backupFile" ng-file-select ng-show = "choosefile" >
< label for = "backupText" ng-click = "pastetext=!pastetext" class = "m10b" > · Paste backup plain text code < i class = "fi-clipboard" > < / i > < / label >
< textarea class = "form-control" name = "backupText" ng-model = "backupText" rows = "5" ng-show = "pastetext" > < / textarea >
< / fieldset >
2014-05-05 09:16:56 -07:00
2014-05-15 14:02:21 -07:00
< div class = "large-8 medium-8 columns" >
< label for = "password" > Password < small > Required< / small > < / label >
< input type = "password" class = "form-control" placeholder = "Your wallet password" name = "password" ng-model = "password" required >
< / div >
< / div >
< / div >
< div class = "row" >
< div class = "large-12 columns line-dashed" >
< button type = "submit" class = "button primary radius right" ng-disabled = "importForm.$invalid" loading = "Importing" >
Import backup
< / button >
< a class = "button secondary radius" href = "#signin" > Go back< / a >
< / div >
< / div >
2014-05-05 09:16:56 -07:00
< / form >
2014-04-25 15:11:56 -07:00
< / div >
2014-04-25 13:34:24 -07:00
< / div >
< / script >
2014-04-16 13:07:14 -07:00
< script type = "text/ng-template" id = "setup.html" >
< div ng-controller = "SetupController" >
2014-04-30 10:59:20 -07:00
< div data-alert class = "alert-box info radius" ng-show = "loading" >
2014-05-07 14:48:56 -07:00
< i class = "size-21 fi-bitcoin-circle icon-rotate spinner" > < / i >
Creating wallet...
2014-04-16 13:07:14 -07:00
< / div >
< div ng-show = "!loading" >
2014-05-06 11:06:37 -07:00
< form name = "setupForm" ng-submit = "create(setupForm)" novalidate >
2014-04-16 13:07:14 -07:00
< div class = "row" >
2014-04-30 14:47:44 -07:00
< div class = "small-12 medium-8 medium-centered large-8 large-centered columns box-setup" >
2014-05-01 10:32:09 -07:00
< div class = "large-6 columns line-dashed-v" >
< h6 > Select total number of copayers< / h6 >
< select ng-model = "totalCopayers" ng-options = "totalCopayers as totalCopayers for totalCopayers in TCValues" >
< / select >
< / div >
< div class = "large-6 columns" >
2014-05-08 11:48:00 -07:00
< h6 > Select required signatures< / h6 >
2014-05-01 10:32:09 -07:00
< select ng-model = "requiredCopayers" ng-options = "requiredCopayers as requiredCopayers for requiredCopayers in RCValues" >
< / select >
< / div >
2014-04-16 13:07:14 -07:00
< / div >
2014-04-30 14:47:44 -07:00
< / div >
< div class = "row" >
< div class = "small-12 medium-6 medium-centered large-6 large-centered columns m30v" >
< div class = "box-setup-copayers" >
< div class = "box-setup-copayers-fix" >
< img class = "box-setup-copay" ng-repeat = "i in getNumber(totalCopayers) track by $index" src = "./img/satoshi.gif" alt = "Copayer {{$index+1}}-{{totalCopayers}}" ng-class = "{'box-setup-copay-required': ($index+1) <= requiredCopayers}" >
< / div >
< / div >
< / div >
2014-05-01 05:59:43 -07:00
< div class = "small-12 medium-6 medium-centered large-6 large-centered columns m30v" >
2014-05-09 13:13:56 -07:00
< h6 > Your Wallet Password (you don't need to share this) < small > Required< / small > < / h6 >
2014-05-01 10:21:20 -07:00
< input type = "password" class = "form-control" ng-model = "walletPassword" required >
2014-05-01 05:59:43 -07:00
< / div >
2014-04-30 14:47:44 -07:00
< div class = "small-12 medium-6 medium-centered large-6 large-centered columns m30v" >
2014-05-06 11:06:37 -07:00
< h6 > Wallet name < small > Optional< / small > < / h6 >
2014-05-01 10:21:20 -07:00
< input type = "text" class = "form-control" ng-model = "walletName" >
2014-04-24 12:35:52 -07:00
< / div >
2014-05-01 05:41:18 -07:00
< div class = "large-6 large-centered columns m30v" >
2014-05-06 11:06:37 -07:00
< h6 > Your name < small > Optional< / small > < / h6 >
2014-05-01 10:21:20 -07:00
< input type = "text" class = "form-control" ng-model = "myNickname" >
2014-05-01 05:41:18 -07:00
< / div >
2014-04-30 14:47:44 -07:00
< / div >
< div class = "row" >
< div class = "large-12 columns line-dashed" >
2014-05-06 11:06:37 -07:00
< button type = "submit" class = "button primary radius right" ng-disabled = "setupForm.$invalid || loading" >
2014-04-16 15:45:22 -07:00
Create {{requiredCopayers}}-of-{{totalCopayers}} wallet
< / button >
2014-04-30 14:47:44 -07:00
< a class = "button secondary radius" href = "#signin" > Go back< / a >
2014-04-17 08:37:10 -07:00
< / div >
< / div >
2014-05-06 11:06:37 -07:00
< / form >
2014-04-16 13:07:14 -07:00
< / div >
< / div >
< / script >
2014-05-13 10:55:26 -07:00
2014-04-20 16:21:54 -07:00
<!-- ADDRESS -->
< script type = "text/ng-template" id = "addresses.html" >
< div class = "addresses" data-ng-controller = "AddressesController" >
2014-04-17 10:49:54 -07:00
< div ng-show = '$root.wallet.publicKeyRing.isComplete()' >
2014-04-29 11:17:14 -07:00
< div class = "row" >
2014-05-07 11:16:56 -07:00
< div class = "large-9 medium-12 columns" ng-if = "addrInfos[0]" >
< div class = "large-8 medium-8 columns" >
2014-05-09 08:29:00 -07:00
< a class = "panel radius db" ng-repeat = "addrInfo in addrInfos"
2014-04-30 15:50:13 -07:00
ng-click="selectAddr(addrInfo.address.toString())">
< span > {{addrInfo.address.toString()}}< / span >
< span ng-if = "addrInfo.isChange" > (change)< / span >
< span class = "right" >
< span ng-if = "$root.loading" > ...< / span >
< span ng-if = "!$root.loading" > {{balanceByAddr[addrInfo.address.toString()] || 0}}< / span >
< i class = "fi-bitcoin" > < / i >
2014-04-30 08:25:33 -07:00
< / span >
< / a >
2014-04-29 11:17:14 -07:00
< / div >
2014-05-07 11:16:56 -07:00
< div class = "large-4 medium-4 columns line-dashed-v text-center" >
2014-04-29 11:17:14 -07:00
< qrcode size = "160" data = "{{selectedAddr}}" > < / qrcode >
2014-04-30 15:50:13 -07:00
< p class = "m10t" >
< strong >
< span ng-if = "$root.loading" > ...< / span >
< span ng-if = "!$root.loading" > {{balanceByAddr[selectedAddr] || 0}}< / span >
< i class = "fi-bitcoin" > < / i >
< / strong >
2014-04-30 08:25:33 -07:00
< / p >
2014-04-29 11:17:14 -07:00
< / div >
< / div >
2014-05-07 11:16:56 -07:00
< div class = "columns text-center m10t" ng-class = "{'large-3' : !!addrInfos[0]}" >
2014-04-29 11:17:14 -07:00
< p > Create a New < strong > Address < / strong > < / p >
2014-04-30 15:50:13 -07:00
< button class = "secondary radius expandi new-address" ng-click = "newAddr()"
ng-disabled="loading" loading="Creating"> Create < / button >
2014-04-29 11:17:14 -07:00
< / div >
< / div >
2014-04-17 10:49:54 -07:00
< / div >
2014-03-26 05:18:42 -07:00
< / div >
< / script >
2014-05-01 05:59:43 -07:00
2014-03-26 13:56:11 -07:00
<!-- TRANSACTIONS -->
2014-03-26 05:18:42 -07:00
< script type = "text/ng-template" id = "transactions.html" >
< div class = "transactions" data-ng-controller = "TransactionsController" >
2014-04-17 10:49:54 -07:00
< div class = "row" ng-show = '$root.wallet.publicKeyRing.isComplete()' >
2014-04-14 13:58:12 -07:00
< div class = "large-12 columns" >
2014-05-15 12:12:43 -07:00
< h4 > Transaction proposals < small > ({{txs.length}})< / small > < / h4 >
2014-04-30 10:59:20 -07:00
< div class = "panel radius pending" ng-repeat = "tx in txs | orderBy: 'createdTs':true" >
2014-04-20 15:08:04 -07:00
< div class = "txheader" >
2014-04-30 10:59:20 -07:00
< div class = "row m10" >
2014-04-20 15:08:04 -07:00
< div class = "large-8 columns" >
2014-04-29 12:34:40 -07:00
< div class = "row" ng-repeat = "out in tx.outs" >
< p class = "large-3 columns" > {{out.value}} < i class = "fi-bitcoin size-18" > < / i > < / p >
< i class = "large-1 columns fi-arrow-right size-24" > < / i >
< p class = "large-8 columns" > {{out.address}} < / p >
< / div >
2014-04-20 15:08:04 -07:00
< / div >
< div class = "large-4 columns text-right" >
2014-04-22 08:26:23 -07:00
< h6 > created at {{tx.createdTs | date:'medium'}} < / h6 >
2014-04-20 15:08:04 -07:00
< / div >
< / div >
2014-04-18 07:33:49 -07:00
< / div >
2014-04-20 15:08:04 -07:00
2014-04-29 12:34:40 -07:00
< div class = "tx-copayers" >
2014-04-30 14:46:52 -07:00
< div class = "box-copayers" ng-repeat = "(cId, actions) in tx.peerActions" >
2014-04-29 12:34:40 -07:00
< figure class = "left" >
2014-04-30 14:46:52 -07:00
< a href = "#/transactions" class = "has-tip" tooltip-popup-delay = '1000' tooltip = "{{cId === $root.wallet.getMyCopayerId() ? 'You' : $root.wallet.publicKeyRing.nicknameForCopayer(cId)}}" >
2014-05-15 12:12:43 -07:00
< img src = "./img/satoshi.gif" alt = "{{cId}}" width = "200" >
2014-04-29 15:43:38 -07:00
< / a >
2014-04-29 12:34:40 -07:00
< / figure >
< div class = "box-status" >
2014-04-29 15:43:38 -07:00
< span ng-repeat = "(action, ts) in actions" >
< a ng-if = "action == 'create'" href = "#/transactions" class = "has-tip" tooltip-popup-delay = '1000' tooltip = "Created at {{ts | date:'medium'}}" >
< i class = "fi-crown size-12 icon-status icon-active" > < / i >
< / a >
< a ng-if = "action == 'seen'" href = "#/transactions" class = "has-tip" tooltip-popup-delay = '1000' tooltip = "Seen at {{ts | date:'medium'}}" >
< i class = "fi-eye size-12 icon-status icon-active" > < / i >
< / a >
< a ng-if = "action == 'sign'" href = "#/transactions" class = "has-tip" tooltip-popup-delay = '1000' tooltip = "Signed at {{ts | date:'medium'}}" >
< i class = "fi-check size-12 icon-status icon-active-check" > < / i >
< / a >
< a ng-if = "action == 'rejected'" href = "#/transactions" class = "has-tip" tooltip-popup-delay = '1000' tooltip = "Rejected at {{ts | date:'medium'}}" >
2014-04-30 12:11:50 -07:00
< i class = "fi-x size-12 icon-status icon-active-x" > < / i >
2014-04-29 15:43:38 -07:00
< / a >
< / span >
2014-04-29 12:34:40 -07:00
< / div >
2014-04-30 14:46:52 -07:00
< div class = "text-center" style = "margin-right:16px; color:#999; font-size:12px" >
{{$root.wallet.publicKeyRing.nicknameForCopayer(cId)}}
< / div >
2014-04-30 10:59:20 -07:00
< / div >
2014-04-18 07:33:49 -07:00
< / div >
2014-04-20 15:08:04 -07:00
2014-04-30 10:59:20 -07:00
< div class = "row m15" >
< div class = "large-4 columns" ng-show = "!tx.sentTs" style = "padding-left: 5px;" >
< div ng-show = "!tx.signedByUs && !tx.rejectedByUs && !tx.finallyRejected && tx.missingSignatures" >
2014-05-13 00:03:09 -07:00
< button class = "secondary radius m10r" ng-click = "sign(tx.ntxid)" ng-disabled = "loading" >
2014-04-30 10:59:20 -07:00
< i class = "fi-check" > < / i > Sign
< / button >
2014-05-13 00:03:09 -07:00
< button class = "warning radius" ng-click = "reject(tx.ntxid)" ng-disabled = "loading" >
2014-04-30 10:59:20 -07:00
< i class = "fi-x" > < / i > Reject
< / button >
2014-04-20 15:08:04 -07:00
< / div >
2014-04-30 10:59:20 -07:00
< span ng-show = "!tx.missingSignatures && !tx.sentTs" >
< button class = "primary radius" ng-click = "send(tx.ntxid)" ng-disabled = "loading" loading = "Broadcasting" > < i class = ".fi-upload-cloud" > < / i >
Broadcast Transaction
< / button >
< / span >
< / div >
2014-04-30 12:11:50 -07:00
2014-04-30 10:59:20 -07:00
< div class = "large-8 columns text-right" >
2014-04-30 12:11:50 -07:00
< span ng-show = "tx.finallyRejected" class = "text-warning" >
2014-04-30 10:59:20 -07:00
Transaction finally rejected
< / span >
2014-05-16 08:12:11 -07:00
< div ng-show = "!tx.missingSignatures && tx.sentTs" >
< span >
Sent
< / span >
< p class = "text-gray small" >
{{tx.sentTs | date:'medium'}}.
ID:
2014-05-08 14:14:49 -07:00
< a href = "http://{{getShortNetworkName()}}.insight.is/tx/{{tx.sentTxid}}" target = "blank" >
{{tx.sentTxid}}
2014-04-30 10:59:20 -07:00
< / a >
< / p >
2014-05-16 08:12:11 -07:00
< / div >
2014-04-30 10:59:20 -07:00
< p class = "text-gray" ng-show = "!tx.finallyRejected && tx.missingSignatures==1" >
One signature missing
< / p >
< p class = "text-gray" ng-show = "!tx.finallyRejected && tx.missingSignatures>1" >
{{tx.missingSignatures}} signatures missing< / p >
< small class = "right text-gray" >
< strong > Fee: < / strong > < i class = "fi-bitcoin" > < / i > {{tx.fee}}
< strong > Proposal ID: < / strong > {{tx.ntxid}}
< / small >
2014-04-20 15:08:04 -07:00
< / div >
2014-04-18 07:33:49 -07:00
< / div >
2014-04-20 15:08:04 -07:00
< / div >
2014-04-08 10:16:38 -07:00
< / div >
2014-04-22 23:37:17 -07:00
< div class = "large-12 columns" ng-init = "getTransactions()" ng-show = "blockchain_txs[0].txid" >
2014-04-22 21:55:00 -07:00
< h3 > Last transactions< / h3 >
2014-04-22 23:37:17 -07:00
< div class = "btransactions" >
2014-04-30 12:11:50 -07:00
< div class = "panel radius" ng-repeat = "btx in blockchain_txs | orderBy: 'firstSeenTs':true" >
< div class = "m15" >
2014-04-22 21:55:00 -07:00
< div class = "row" >
< div class = "large-8 columns" >
2014-05-08 14:14:49 -07:00
< a href = "http://{{getShortNetworkName()}}.insight.is/tx/{{btx.txid}}" target = "blank" >
{{btx.txid}}
< / a >
2014-04-22 21:55:00 -07:00
< / div >
< div class = "large-4 columns text-right" >
{{btx.firstSeenTs * 1000 | date:'medium'}} < / h6 >
< / div >
< / div >
< / div >
2014-04-30 12:11:50 -07:00
< div class = "tx-copayers" >
2014-04-22 21:55:00 -07:00
< div class = "large-5 columns" >
< div ng-repeat = "vin in btx.vin" >
2014-04-30 12:11:50 -07:00
< p class = "left text-gray size-12" > {{vin.addr}} < / p >
< small class = "right" > {{vin.value}}< / small >
2014-04-22 21:55:00 -07:00
< / div >
< / div >
< div class = "large-1 columns text-center" >
< i class = "fi-arrow-right" > < / i >
< / div >
< div class = "large-6 columns" >
< div ng-repeat = "vout in btx.vout" >
< div class = "row" >
< div class = "large-10 columns" >
< div ng-repeat = "addr in vout.scriptPubKey.addresses" >
2014-04-30 12:11:50 -07:00
< p class = "text-gray size-12" > {{addr}} < / p >
2014-04-22 21:55:00 -07:00
< / div >
< / div >
< div class = "large-2 columns" >
< small > {{vout.value}}< / small >
< / div >
< / div >
< / div >
< / div >
< / div >
2014-04-30 12:11:50 -07:00
< div class = "m15 size-12 text-gray" >
2014-04-22 21:55:00 -07:00
< div class = "row" >
< div class = "large-4 columns" > Fees: {{btx.fees}}< / div >
< div class = "large-4 columns text-center" > Confirmations: {{btx.confirmations || 0}}< / div >
< div class = "large-4 columns text-right" > Total: {{btx.valueOut}}< / div >
< / div >
< / div >
2014-04-08 10:16:38 -07:00
< / div >
< / div >
< / div >
< / div >
2014-03-26 05:18:42 -07:00
< / div >
< / script >
2014-03-26 13:56:11 -07:00
<!-- SEND -->
2014-03-26 05:18:42 -07:00
< script type = "text/ng-template" id = "send.html" >
< div class = "send" data-ng-controller = "SendController" >
2014-04-17 10:49:54 -07:00
< div class = "row" ng-show = '$root.wallet.publicKeyRing.isComplete()' >
2014-05-07 11:16:56 -07:00
< div class = "medium-6 medium-centered large-6 large-centered columns" >
2014-04-20 16:21:54 -07:00
< h3 > {{title}}< / h3 >
2014-04-19 00:55:32 -07:00
< form name = "sendForm" ng-submit = "submitForm(sendForm)" novalidate >
< div class = "row" >
< div class = "large-12 columns" >
2014-05-06 13:02:49 -07:00
< div class = "row collapse" >
< label for = "address" > To address
2014-05-07 07:21:30 -07:00
< small ng-hide = "!sendForm.address.$pristine || address" > required< / small >
< small class = "is-valid" ng-show = "!sendForm.address.$invalid && address" > valid!< / small >
< small class = "has-error" ng-show = "sendForm.address.$invalid && address" >
2014-05-06 13:02:49 -07:00
not valid< / small >
< / label >
< div class = "small-10 columns" >
< input type = "text" id = "address" name = "address" placeholder = "Send to" ng-model = "address" valid-address required >
< / div >
< div class = "small-2 columns" ng-hide = "showScanner" >
2014-05-08 08:27:08 -07:00
< a class = "postfix button secondary" ng-click = "openScanner()" > < i class = "fi-camera" > < / i > < / a >
2014-05-06 13:02:49 -07:00
< / div >
< div class = "small-2 columns" ng-show = "showScanner" >
2014-05-08 08:27:08 -07:00
< a class = "postfix button warning" ng-click = "cancelScanner()" > Cancel< / a >
2014-05-06 13:02:49 -07:00
< / div >
< / div >
< div id = "scanner" class = "row" ng-if = "showScanner" >
< div class = "text-centered" >
< canvas id = "qr-canvas" width = "200" height = "150" > < / canvas >
< div ng-show = "isMobile" >
< div id = "file-input-wrapper" class = "btn btn-primary" >
< span class = "pull-left text-centered" >
< i class = "glyphicon glyphicon-refresh icon-rotate" > < / i >
Get QR code
< / span >
< input id = "qrcode-camera" type = "file" capture = "camera" accept = "image/*" >
< / div >
< / div >
< div ng-hide = "isMobile" >
< video id = "qrcode-scanner-video" width = "300" height = "225" ng-hide = "isMobile" > < / video >
< / div >
< / div >
< / div >
2014-04-19 00:55:32 -07:00
< / div >
< / div >
< div class = "row" >
2014-05-07 11:16:56 -07:00
< div class = "large-6 medium-6 columns" >
2014-04-19 00:55:32 -07:00
< div class = "row collapse" >
< label for = "amount" > Amount
< small ng-hide = "!sendForm.amount.$pristine" > required< / small >
2014-04-22 12:07:14 -07:00
< small class = "is-valid" ng-show = "!sendForm.amount.$invalid && !sendForm.amount.$pristine" > valid!< / small >
2014-04-19 00:55:32 -07:00
< small class = "has-error" ng-show = "sendForm.amount.$invalid && !sendForm.amount.$pristine" >
2014-04-23 09:16:20 -07:00
not valid.< / small >
< small ng-show = "notEnoughAmount" > {{notEnoughAmount}}< / small >
2014-04-19 00:55:32 -07:00
< / label >
< div class = "small-9 columns" >
2014-04-23 09:16:20 -07:00
< input type = "number" id = "amount" name = "amount" placeholder = "Amount" ng-model = "amount" min = "0.0001" max = "10000000" enough-amount required >
2014-04-19 00:55:32 -07:00
< / div >
< div class = "small-3 columns" >
< span class = "postfix" > BTC< / span >
< / div >
< / div >
< / div >
< / div >
< div class = "row" >
2014-04-24 18:43:19 -07:00
< div class = "large-5 columns" >
2014-04-30 10:59:20 -07:00
< button type = "submit" class = "button secondary radius text-center" ng-disabled = "sendForm.$invalid || loading" loading = "Sending" >
2014-04-19 00:55:32 -07:00
Send
< / button >
< / div >
< / div >
2014-04-16 06:52:13 -07:00
< / form >
< / div >
< / div >
2014-03-26 05:18:42 -07:00
< / div >
< / script >
2014-03-26 13:56:11 -07:00
<!-- BACKUP -->
2014-03-26 05:18:42 -07:00
< script type = "text/ng-template" id = "backup.html" >
2014-05-13 10:19:37 -07:00
< div class = "backup" ng-controller = "BackupController" >
2014-04-20 16:21:54 -07:00
< h3 > {{title}}< / h3 >
2014-04-03 12:32:17 -07:00
< div class = "row text-center" >
2014-05-09 06:43:24 -07:00
< div class = "large-6 medium-6 columns" >
2014-05-09 08:29:00 -07:00
< a class = "panel radius box-backup" ng-click = "download()" >
2014-04-03 12:32:17 -07:00
< i class = "fi-download size-72" > < / i >
< p > Download File < / p >
< / a >
< / div >
2014-05-09 06:43:24 -07:00
< div class = "large-6 medium-6 columns" >
2014-05-09 08:29:00 -07:00
< a class = "panel radius box-backup" ng-click = "email()" >
2014-04-03 12:32:17 -07:00
< i class = "fi-mail size-72" > < / i >
< p > Backup to email < / p >
< / a >
< / div >
< / div >
2014-03-26 05:18:42 -07:00
< / div >
2014-03-19 09:17:18 -07:00
< / script >
2014-04-17 09:43:34 -07:00
2014-05-13 10:19:37 -07:00
<!-- CONFIG -->
< script type = "text/ng-template" id = "settings.html" >
< div class = "settings" ng-controller = "SettingsController" >
< h3 > {{title}}< / h3 >
2014-05-15 12:58:15 -07:00
< form name = "settingsForm" >
< div class = "small-12 medium-6 medium-centered large-6 large-centered columns" >
< fieldset >
< legend > Bitcoin Network< / legend >
< input id = "network-name" type = "checkbox" ng-model = "networkName" ng-true-value = "livenet" ng-false-value = "testnet" class = "form-control" >
< label for = "network-name" > Livenet< / label >
< / fieldset >
< fieldset >
< legend > Insight API server< / legend >
< div class = "row" >
< label for = "insight-host" > Host< / label >
< input type = "text" ng-model = "insightHost" class = "form-control" name = "insight-host" >
< / div >
< div class = "row" >
< label for = "insight-port" > Port< / label >
< input type = "number" ng-model = "insightPort" class = "form-control" name = "insight-port" >
< / div >
< / fieldset >
< fieldset >
< legend > PeerJS server< / legend >
< div class = "row" >
< label for = "peerjs-key" > Key< / label >
< input type = "text" ng-model = "networkKey" class = "form-control" name = "peerjs-key" >
< / div >
< div class = "row" >
< label for = "peerjs-host" > Host< / label >
< input type = "text" ng-model = "networkHost" class = "form-control" name = "peerjs-host" >
< / div >
< div class = "row" >
< label for = "peerjs-port" > Port< / label >
< input type = "number" ng-model = "networkPort" class = "form-control" name = "peerjs-port" >
< / div >
< / fieldset >
< / div >
< div class = "row" >
< div class = "large-12 columns line-dashed" >
< button type = "submit" class = "button primary radius right ng-binding" ng-disabled = "setupForm.$invalid || loading" disabled = "disabled" ng-click = "save()" >
Save
< / button >
2014-05-16 08:40:26 -07:00
< a class = "button secondary radius" href = "#signin" ng-hide = "$root.wallet" > Home< / a >
2014-05-13 10:19:37 -07:00
< / div >
< / div >
2014-05-15 12:58:15 -07:00
< / form >
2014-05-13 10:19:37 -07:00
< / div >
< / script >
2014-05-12 08:00:25 -07:00
<!-- UNSUPPORTED -->
< script type = "text/ng-template" id = "unsupported.html" >
< h2 class = "text-center" > Browser unsupported< / h2 >
< h3 class = "text-center" >
Copay uses webRTC for peer-to-peer communications,
but your browser does not support it.
Please use
a current version of Google Chrome, Mozilla Firefox, or Opera.
< br > < br >
For more information
on supported browsers please check < a href = "http://www.webrtc.org/" > http://www.webrtc.org/< / a >
< / h3 >
< / script >
2014-03-26 13:56:11 -07:00
<!-- NOT FOUND -->
2014-03-19 09:17:18 -07:00
< script type = "text/ng-template" id = "404.html" >
2014-03-26 05:18:42 -07:00
< h2 class = "text-center" > 404< / h2 >
< h3 class = "text-center" > Page not found< / h3 >
< p class = "text-center" > < a href = "#/" > go back...< / a > < / p >
2014-03-19 09:17:18 -07:00
< / script >
2014-04-20 12:06:56 -07:00
< script src = "config.js" > < / script >
2014-03-19 09:17:18 -07:00
< script src = "lib/angular/angular.min.js" > < / script >
2014-03-26 13:56:11 -07:00
< script src = "lib/qrcode-generator/js/qrcode.js" > < / script >
< script src = "lib/angular-qrcode/qrcode.js" > < / script >
2014-03-19 09:17:18 -07:00
< script src = "lib/angular-route/angular-route.min.js" > < / script >
2014-03-27 08:07:10 -07:00
< script src = "lib/angular-foundation/mm-foundation.min.js" > < / script >
< script src = "lib/angular-foundation/mm-foundation-tpls.min.js" > < / script >
2014-03-21 14:45:59 -07:00
< script src = "lib/peerjs/peer.js" > < / script >
2014-05-14 13:36:34 -07:00
< script src = "lib/bitcore/browser/bundle.js" > < / script >
2014-04-28 13:23:15 -07:00
< script src = "lib/crypto-js/rollups/sha256.js" > < / script >
< script src = "lib/crypto-js/rollups/pbkdf2.js" > < / script >
2014-04-15 14:13:25 -07:00
< script src = "lib/crypto-js/rollups/aes.js" > < / script >
2014-04-17 14:02:20 -07:00
< script src = "lib/file-saver/FileSaver.js" > < / script >
2014-04-16 20:36:08 -07:00
< script src = "lib/socket.io.js" > < / script >
2014-04-30 10:14:43 -07:00
< script src = "lib/sjcl.js" > < / script >
2014-05-06 13:02:49 -07:00
< script src = "lib/ios-imagefile-megapixel/megapix-image.js" > < / script >
< script src = "lib/qrcode-decoder-js/lib/qrcode-decoder.min.js" > < / script >
2014-04-11 11:58:53 -07:00
< script src = "js/copayBundle.js" > < / script >
2014-04-07 11:31:41 -07:00
2014-03-19 09:17:18 -07:00
< script src = "js/app.js" > < / script >
2014-04-07 20:54:38 -07:00
< script src = "js/routes.js" > < / script >
2014-03-19 09:17:18 -07:00
< script src = "js/directives.js" > < / script >
< script src = "js/filters.js" > < / script >
2014-04-16 20:36:08 -07:00
< script src = "js/services/socket.js" > < / script >
2014-04-23 17:20:44 -07:00
< script src = "js/services/video.js" > < / script >
2014-04-16 15:14:58 -07:00
< script src = "js/services/walletFactory.js" > < / script >
2014-04-17 07:46:49 -07:00
< script src = "js/services/controllerUtils.js" > < / script >
2014-04-30 06:52:39 -07:00
< script src = "js/services/passphrase.js" > < / script >
2014-05-14 22:13:25 -07:00
< script src = "js/services/notifications.js" > < / script >
2014-03-27 12:31:42 -07:00
2014-03-25 07:35:04 -07:00
< script src = "js/controllers/header.js" > < / script >
2014-04-25 13:22:51 -07:00
< script src = "js/controllers/footer.js" > < / script >
2014-04-20 16:21:54 -07:00
< script src = "js/controllers/addresses.js" > < / script >
2014-03-26 05:18:42 -07:00
< script src = "js/controllers/transactions.js" > < / script >
< script src = "js/controllers/send.js" > < / script >
< script src = "js/controllers/backup.js" > < / script >
2014-03-27 12:31:42 -07:00
< script src = "js/controllers/signin.js" > < / script >
2014-04-16 13:07:14 -07:00
< script src = "js/controllers/setup.js" > < / script >
2014-04-25 13:34:24 -07:00
< script src = "js/controllers/import.js" > < / script >
2014-05-13 10:19:37 -07:00
< script src = "js/controllers/settings.js" > < / script >
2014-03-25 07:35:04 -07:00
2014-03-19 09:17:18 -07:00
< script src = "js/init.js" > < / script >
2014-03-14 13:38:27 -07:00
< / body >
< / html >