pochette_web 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +37 -0
- data/app/assets/javascripts/pochette_web/application.js +16 -0
- data/app/assets/javascripts/pochette_web/bootstrap.js +4 -0
- data/app/assets/javascripts/pochette_web/home.js.coffee +172 -0
- data/app/assets/javascripts/pochette_web/lib/bitcoinjs.js +5140 -0
- data/app/assets/javascripts/pochette_web/lib/trezor.js +7267 -0
- data/app/assets/javascripts/pochette_web/lib/trezor_utils.js.coffee +47 -0
- data/app/assets/javascripts/pochette_web/lib/underscore.js +1548 -0
- data/app/assets/stylesheets/pochette_web/application.css +15 -0
- data/app/assets/stylesheets/pochette_web/bootstrap_and_overrides.css +7 -0
- data/app/assets/stylesheets/pochette_web/home.css +4 -0
- data/app/controllers/pochette_web/application_controller.rb +4 -0
- data/app/controllers/pochette_web/home_controller.rb +34 -0
- data/app/helpers/pochette_web/application_helper.rb +4 -0
- data/app/helpers/pochette_web/home_helper.rb +4 -0
- data/app/views/layouts/pochette_web/application.html.erb +14 -0
- data/app/views/pochette_web/home/index.html.haml +186 -0
- data/config/routes.rb +5 -0
- data/lib/pochette_web.rb +9 -0
- data/lib/pochette_web/engine.rb +5 -0
- data/lib/pochette_web/version.rb +3 -0
- data/lib/tasks/pochette_web_tasks.rake +4 -0
- data/test/controllers/pochette_web/home_controller_test.rb +13 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +27 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/pochette.rb +7 -0
- data/test/dummy/config/initializers/rack_attack.rb +5 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/trezor_config_signed.bin +1 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/pochette_web_test.rb +7 -0
- data/test/test_helper.rb +21 -0
- metadata +262 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_dependency "pochette_web/application_controller"
|
2
|
+
|
3
|
+
module PochetteWeb
|
4
|
+
class HomeController < ApplicationController
|
5
|
+
rescue_from(ActionController::ParameterMissing) do |parameter_missing_exception|
|
6
|
+
error = {parameter_missing_exception.param => ['parameter is required']}
|
7
|
+
render json: { errors: [error] }, status: 422
|
8
|
+
end
|
9
|
+
|
10
|
+
def index
|
11
|
+
end
|
12
|
+
|
13
|
+
def trezor_transaction_builder
|
14
|
+
t = Pochette::TrezorTransactionBuilder.new(
|
15
|
+
bip32_addresses: params.require(:bip32_addresses),
|
16
|
+
outputs: params.require(:outputs),
|
17
|
+
utxo_blacklist: params[:utxo_blacklist],
|
18
|
+
change_address: params[:change_address].presence,
|
19
|
+
fee_per_kb: params[:fee_per_kb].presence && params[:fee_per_kb].to_i,
|
20
|
+
spend_all: params[:spend_all]
|
21
|
+
)
|
22
|
+
|
23
|
+
render json: ( t.valid? ? t.as_hash : t.errors )
|
24
|
+
end
|
25
|
+
|
26
|
+
def make_multisig
|
27
|
+
public_keys = params[:xpubs].collect do |x|
|
28
|
+
MoneyTree::Node.from_bip32(x).node_for_path(params[:path]).public_key.key
|
29
|
+
end
|
30
|
+
address, _ = Bitcoin.pubkeys_to_p2sh_multisig_address(params[:signers].to_i, *public_keys)
|
31
|
+
render json: address
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>PochetteWeb</title>
|
5
|
+
<%= stylesheet_link_tag "pochette_web/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "pochette_web/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,186 @@
|
|
1
|
+
.container
|
2
|
+
%h1
|
3
|
+
Pochette Trezor Sandbox
|
4
|
+
%p
|
5
|
+
Play with your trezor and Pochette, create multisig addresses,
|
6
|
+
spend their unspent outputs, have fun!
|
7
|
+
%p
|
8
|
+
Source available on GitHub
|
9
|
+
%a(href="https://github.com/bitex-la/pochette-web") bitex-la/pochette-web
|
10
|
+
.alert.alert-warning
|
11
|
+
Running on
|
12
|
+
%strong Testnet3.
|
13
|
+
You're limited to prepare no more than 5 transactions per minute because our testnet node is very modest.
|
14
|
+
|
15
|
+
%ul.nav.nav-tabs(role="tablist")
|
16
|
+
%li.active(role="presentation")
|
17
|
+
%a(data-toggle="tab" href="#trezor_transaction_builder")
|
18
|
+
TrezorTransactionBuilder
|
19
|
+
%li(role="presentation")
|
20
|
+
%a(data-toggle="tab" href="#multisig_address")
|
21
|
+
Make Multisig Address
|
22
|
+
|
23
|
+
.tab-content
|
24
|
+
#trezor_transaction_builder.tab-pane.active(role="tabpanel")
|
25
|
+
%form
|
26
|
+
%h2 Parameters
|
27
|
+
%p
|
28
|
+
Start by setting all the parameters to create a transaction to be signed
|
29
|
+
with your trezor.
|
30
|
+
.form-group
|
31
|
+
%h3 bip32_addresses
|
32
|
+
%p
|
33
|
+
List of addresses in wallet. We will be spending their unspent outputs.
|
34
|
+
Each address is represented as a pair, with the public address string
|
35
|
+
and the BIP32 path as a list of integers.
|
36
|
+
%p
|
37
|
+
Multisig addresses are represented as a list of root XPUBs,
|
38
|
+
and the BIP32 derivation path as an array of integers.
|
39
|
+
%textarea#bip32_addresses.form-control(rows=10)
|
40
|
+
%span#add_address.btn.btn-default Add Address
|
41
|
+
%span#add_multisig_address.btn.btn-default Add Multisig Address
|
42
|
+
.form-group
|
43
|
+
%h3 outputs
|
44
|
+
%p
|
45
|
+
List of pairs [recipient_address, amount_in_satoshis] This will not be all the final
|
46
|
+
outputs in the transaction, as a 'change' output may be added if needed.
|
47
|
+
%textarea#outputs.form-control(rows=10)
|
48
|
+
%span#add_output.btn.btn-default Add Output
|
49
|
+
.form-group
|
50
|
+
%h3 utxo_blacklist
|
51
|
+
%p
|
52
|
+
Optional. List of utxos to ignore, a list of pairs [transaction hash, position]
|
53
|
+
%textarea#utxo_blacklist.form-control(rows=10)
|
54
|
+
%span#add_utxo_blacklist.btn.btn-default Add UTXO to blacklist
|
55
|
+
.form-group
|
56
|
+
%h3 change_address
|
57
|
+
%p
|
58
|
+
Optional. Change address to use. Will default to the first source address.
|
59
|
+
%input#change_address.form-control(type="text")
|
60
|
+
.form-group
|
61
|
+
%h3 fee_per_kb
|
62
|
+
%p
|
63
|
+
Optional. Defaults to 10000 satoshis
|
64
|
+
%input#fee_per_kb.form-control(type="text")
|
65
|
+
%h3 spend all
|
66
|
+
%p
|
67
|
+
Optional. Wether to spend all available utxos or just select enough to cover the given outputs.
|
68
|
+
.checkbox
|
69
|
+
%label
|
70
|
+
%input#spend_all(type="checkbox")
|
71
|
+
yes
|
72
|
+
%br
|
73
|
+
%p
|
74
|
+
#prepare_transaction.btn.btn-primary.btn-lg Prepare Transaction
|
75
|
+
|
76
|
+
%hr
|
77
|
+
%h2 Prepared Transaction
|
78
|
+
%p
|
79
|
+
This is the prepared transaction as returned by Pochette::TrezorTransactionBuilder#as_hash
|
80
|
+
.form-group
|
81
|
+
%textarea#as_hash.form-control(rows=30)
|
82
|
+
|
83
|
+
#pending_multisig_signatures.alert.alert-warning.hidden
|
84
|
+
This transaction has multi-signature inputs, connect another trezor and
|
85
|
+
keep on signing.
|
86
|
+
|
87
|
+
%span#sign_transaction.btn.btn-primary.btn-lg Sign Transaction
|
88
|
+
|
89
|
+
%hr
|
90
|
+
%h2 Signed Transaction
|
91
|
+
%p
|
92
|
+
Copy and paste your raw transaction hex representation and push it however you want,
|
93
|
+
Here are some transaction pushing services:
|
94
|
+
%br
|
95
|
+
%a(href="https://tbtc.blockr.io/tx/push") https://tbtc.blockr.io/tx/push
|
96
|
+
%br
|
97
|
+
%a(href="https://live.blockcypher.com/btc-testnet/pushtx/") https://live.blockcypher.com/btc-testnet/pushtx/
|
98
|
+
|
99
|
+
.form-group
|
100
|
+
%textarea#signed_transaction.form-control(rows=25)
|
101
|
+
|
102
|
+
#multisig_address.tab-pane(role="tabpanel")
|
103
|
+
%form
|
104
|
+
.form-group
|
105
|
+
%h3 Collect xpub's
|
106
|
+
%p
|
107
|
+
Connect your Trezors, one at a time, and fetch their root xpubs
|
108
|
+
from which the multisig address will be derived.
|
109
|
+
Unplugging your device then plugging it again but using a different
|
110
|
+
passphrase is also interpreted as a different device.
|
111
|
+
%textarea#xpubs.form-control(rows=6)
|
112
|
+
%span#read_xpub.btn.btn-default Read Current Trezor xpub
|
113
|
+
.form-group
|
114
|
+
%h3 Required signatures
|
115
|
+
%p
|
116
|
+
How many signatures are required to redeem funds received to this address?
|
117
|
+
%input#signers.form-control(value="2")
|
118
|
+
.form-group
|
119
|
+
%h3 Path
|
120
|
+
%p
|
121
|
+
BIP32 derivation path (ex: 44/0/0/1). Your address will be created from
|
122
|
+
all the public keys at this path in each device.
|
123
|
+
%input#path.form-control(value="0/0")
|
124
|
+
|
125
|
+
%br
|
126
|
+
%p
|
127
|
+
#make_multisig_address.btn.btn-primary.btn-lg Make Multisig Address
|
128
|
+
%hr
|
129
|
+
.form-group
|
130
|
+
%h3 Your address
|
131
|
+
%input#view_multisig_address.form-control
|
132
|
+
|
133
|
+
|
134
|
+
.pin_dialog.modal.fade(role="dialog")
|
135
|
+
.modal-dialog
|
136
|
+
.modal-content
|
137
|
+
.modal-body
|
138
|
+
%h3 Enter PIN
|
139
|
+
%p Look at the device for number positions
|
140
|
+
|
141
|
+
.grid
|
142
|
+
.row
|
143
|
+
.col-xs-4
|
144
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="7") •
|
145
|
+
.col-xs-4
|
146
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="8") •
|
147
|
+
.col-xs-4
|
148
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="9") •
|
149
|
+
%br
|
150
|
+
.row
|
151
|
+
.col-xs-4
|
152
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="4") •
|
153
|
+
.col-xs-4
|
154
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="5") •
|
155
|
+
.col-xs-4
|
156
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="6") •
|
157
|
+
%br
|
158
|
+
.row
|
159
|
+
.col-xs-4
|
160
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="1") •
|
161
|
+
.col-xs-4
|
162
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="2") •
|
163
|
+
.col-xs-4
|
164
|
+
%button.btn-block.btn-primary.btn(type="button" data-value="3") •
|
165
|
+
|
166
|
+
%br
|
167
|
+
.preview.row
|
168
|
+
.col-xs-9
|
169
|
+
%input.form-control(type="password" disabled="disabled")
|
170
|
+
.col-xs-3
|
171
|
+
%button.btn-block.btn-primary.btn.pin-del(type="button") <
|
172
|
+
|
173
|
+
.modal-footer
|
174
|
+
%button.btn-block.btn.btn-success.done.pin-enter(type="button") Enter
|
175
|
+
|
176
|
+
.passphrase_dialog.modal.fade(role="dialog")
|
177
|
+
.modal-dialog
|
178
|
+
.modal-content
|
179
|
+
.modal-body
|
180
|
+
%h3 Enter Passphrase
|
181
|
+
%input#passphrase.form-control(type="password" placeholder="Password")
|
182
|
+
%br
|
183
|
+
%input#passphrase_confirmation.form-control(type="password" placeholder="Password confirmation")
|
184
|
+
|
185
|
+
.modal-footer
|
186
|
+
%button.btn-block.btn.btn-success.done.passphrase-enter(type="button") Enter
|
data/config/routes.rb
ADDED
data/lib/pochette_web.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/test/dummy/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
data/test/dummy/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
# path to your application root.
|
5
|
+
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
|
6
|
+
|
7
|
+
Dir.chdir APP_ROOT do
|
8
|
+
# This script is a starting point to setup your application.
|
9
|
+
# Add necessary setup steps to this file:
|
10
|
+
|
11
|
+
puts "== Installing dependencies =="
|
12
|
+
system "gem install bundler --conservative"
|
13
|
+
system "bundle check || bundle install"
|
14
|
+
|
15
|
+
# puts "\n== Copying sample files =="
|
16
|
+
# unless File.exist?("config/database.yml")
|
17
|
+
# system "cp config/database.yml.sample config/database.yml"
|
18
|
+
# end
|
19
|
+
|
20
|
+
puts "\n== Preparing database =="
|
21
|
+
system "bin/rake db:setup"
|
22
|
+
|
23
|
+
puts "\n== Removing old logs and tempfiles =="
|
24
|
+
system "rm -f log/*"
|
25
|
+
system "rm -rf tmp/cache"
|
26
|
+
|
27
|
+
puts "\n== Restarting application server =="
|
28
|
+
system "touch tmp/restart.txt"
|
29
|
+
end
|