bitcoin-ruby 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. data/.gitignore +12 -0
  2. data/COPYING +18 -0
  3. data/Gemfile +4 -0
  4. data/README.rdoc +189 -0
  5. data/Rakefile +104 -0
  6. data/bin/bitcoin_dns_seed +130 -0
  7. data/bin/bitcoin_gui +80 -0
  8. data/bin/bitcoin_node +174 -0
  9. data/bin/bitcoin_shell +12 -0
  10. data/bin/bitcoin_wallet +323 -0
  11. data/bitcoin-ruby.gemspec +27 -0
  12. data/concept-examples/blockchain-pow.rb +151 -0
  13. data/doc/CONFIG.rdoc +66 -0
  14. data/doc/EXAMPLES.rdoc +9 -0
  15. data/doc/NODE.rdoc +35 -0
  16. data/doc/STORAGE.rdoc +21 -0
  17. data/doc/WALLET.rdoc +102 -0
  18. data/examples/balance.rb +60 -0
  19. data/examples/bbe_verify_tx.rb +55 -0
  20. data/examples/connect.rb +36 -0
  21. data/examples/relay_tx.rb +22 -0
  22. data/examples/verify_tx.rb +57 -0
  23. data/lib/bitcoin.rb +370 -0
  24. data/lib/bitcoin/builder.rb +266 -0
  25. data/lib/bitcoin/config.rb +56 -0
  26. data/lib/bitcoin/connection.rb +126 -0
  27. data/lib/bitcoin/ffi/openssl.rb +121 -0
  28. data/lib/bitcoin/gui/addr_view.rb +42 -0
  29. data/lib/bitcoin/gui/bitcoin-ruby.png +0 -0
  30. data/lib/bitcoin/gui/bitcoin-ruby.svg +80 -0
  31. data/lib/bitcoin/gui/conn_view.rb +36 -0
  32. data/lib/bitcoin/gui/connection.rb +68 -0
  33. data/lib/bitcoin/gui/em_gtk.rb +28 -0
  34. data/lib/bitcoin/gui/gui.builder +1643 -0
  35. data/lib/bitcoin/gui/gui.rb +290 -0
  36. data/lib/bitcoin/gui/helpers.rb +113 -0
  37. data/lib/bitcoin/gui/tree_view.rb +82 -0
  38. data/lib/bitcoin/gui/tx_view.rb +67 -0
  39. data/lib/bitcoin/key.rb +125 -0
  40. data/lib/bitcoin/logger.rb +65 -0
  41. data/lib/bitcoin/network/command_client.rb +93 -0
  42. data/lib/bitcoin/network/command_handler.rb +179 -0
  43. data/lib/bitcoin/network/connection_handler.rb +274 -0
  44. data/lib/bitcoin/network/node.rb +399 -0
  45. data/lib/bitcoin/protocol.rb +140 -0
  46. data/lib/bitcoin/protocol/address.rb +48 -0
  47. data/lib/bitcoin/protocol/alert.rb +47 -0
  48. data/lib/bitcoin/protocol/block.rb +154 -0
  49. data/lib/bitcoin/protocol/handler.rb +38 -0
  50. data/lib/bitcoin/protocol/parser.rb +148 -0
  51. data/lib/bitcoin/protocol/tx.rb +205 -0
  52. data/lib/bitcoin/protocol/txin.rb +97 -0
  53. data/lib/bitcoin/protocol/txout.rb +73 -0
  54. data/lib/bitcoin/protocol/version.rb +70 -0
  55. data/lib/bitcoin/script.rb +634 -0
  56. data/lib/bitcoin/storage/dummy.rb +164 -0
  57. data/lib/bitcoin/storage/models.rb +133 -0
  58. data/lib/bitcoin/storage/sequel.rb +335 -0
  59. data/lib/bitcoin/storage/sequel_store/sequel_migrations.rb +84 -0
  60. data/lib/bitcoin/storage/storage.rb +243 -0
  61. data/lib/bitcoin/version.rb +3 -0
  62. data/lib/bitcoin/wallet/coinselector.rb +30 -0
  63. data/lib/bitcoin/wallet/keygenerator.rb +75 -0
  64. data/lib/bitcoin/wallet/keystore.rb +203 -0
  65. data/lib/bitcoin/wallet/txdp.rb +116 -0
  66. data/lib/bitcoin/wallet/wallet.rb +243 -0
  67. data/spec/bitcoin/bitcoin_spec.rb +472 -0
  68. data/spec/bitcoin/builder_spec.rb +90 -0
  69. data/spec/bitcoin/fixtures/0d0affb5964abe804ffe85e53f1dbb9f29e406aa3046e2db04fba240e63c7fdd.json +27 -0
  70. data/spec/bitcoin/fixtures/23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63.json +23 -0
  71. data/spec/bitcoin/fixtures/477fff140b363ec2cc51f3a65c0c58eda38f4d41f04a295bbd62babf25e4c590.json +27 -0
  72. data/spec/bitcoin/fixtures/60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1.json +45 -0
  73. data/spec/bitcoin/fixtures/bc179baab547b7d7c1d5d8d6f8b0cc6318eaa4b0dd0a093ad6ac7f5a1cb6b3ba.json +34 -0
  74. data/spec/bitcoin/fixtures/rawblock-0.bin +0 -0
  75. data/spec/bitcoin/fixtures/rawblock-0.json +39 -0
  76. data/spec/bitcoin/fixtures/rawblock-1.bin +0 -0
  77. data/spec/bitcoin/fixtures/rawblock-1.json +39 -0
  78. data/spec/bitcoin/fixtures/rawblock-131025.bin +0 -0
  79. data/spec/bitcoin/fixtures/rawblock-131025.json +5063 -0
  80. data/spec/bitcoin/fixtures/rawblock-170.bin +0 -0
  81. data/spec/bitcoin/fixtures/rawblock-170.json +68 -0
  82. data/spec/bitcoin/fixtures/rawblock-9.bin +0 -0
  83. data/spec/bitcoin/fixtures/rawblock-9.json +39 -0
  84. data/spec/bitcoin/fixtures/rawblock-testnet-26478.bin +0 -0
  85. data/spec/bitcoin/fixtures/rawblock-testnet-26478.json +64 -0
  86. data/spec/bitcoin/fixtures/rawtx-01.bin +0 -0
  87. data/spec/bitcoin/fixtures/rawtx-01.json +27 -0
  88. data/spec/bitcoin/fixtures/rawtx-02.bin +0 -0
  89. data/spec/bitcoin/fixtures/rawtx-02.json +27 -0
  90. data/spec/bitcoin/fixtures/rawtx-03.bin +0 -0
  91. data/spec/bitcoin/fixtures/rawtx-03.json +48 -0
  92. data/spec/bitcoin/fixtures/rawtx-04.json +27 -0
  93. data/spec/bitcoin/fixtures/rawtx-0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9.bin +0 -0
  94. data/spec/bitcoin/fixtures/rawtx-05.json +23 -0
  95. data/spec/bitcoin/fixtures/rawtx-14be6fff8c6014f7c9493b4a6e4a741699173f39d74431b6b844fcb41ebb9984.bin +0 -0
  96. data/spec/bitcoin/fixtures/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.bin +0 -0
  97. data/spec/bitcoin/fixtures/rawtx-2f4a2717ec8c9f077a87dde6cbe0274d5238793a3f3f492b63c744837285e58a.json +27 -0
  98. data/spec/bitcoin/fixtures/rawtx-406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602.json +23 -0
  99. data/spec/bitcoin/fixtures/rawtx-52250a162c7d03d2e1fbc5ebd1801a88612463314b55102171c5b5d817d2d7b2.bin +0 -0
  100. data/spec/bitcoin/fixtures/rawtx-b5d4e8883533f99e5903ea2cf001a133a322fa6b1370b18a16c57c946a40823d.bin +0 -0
  101. data/spec/bitcoin/fixtures/rawtx-ba1ff5cd66713133c062a871a8adab92416f1e38d17786b2bf56ac5f6ffdfdf5.json +37 -0
  102. data/spec/bitcoin/fixtures/rawtx-c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73.json +24 -0
  103. data/spec/bitcoin/fixtures/rawtx-de35d060663750b3975b7997bde7fb76307cec5b270d12fcd9c4ad98b279c28c.json +23 -0
  104. data/spec/bitcoin/fixtures/rawtx-f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16.bin +0 -0
  105. data/spec/bitcoin/fixtures/rawtx-testnet-a220adf1902c46a39db25a24bc4178b6a88440f977a7e2cabfdd8b5c1dd35cfb.json +27 -0
  106. data/spec/bitcoin/fixtures/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.bin +0 -0
  107. data/spec/bitcoin/fixtures/rawtx-testnet-e232e0055dbdca88bbaa79458683195a0b7c17c5b6c524a8d146721d4d4d652f.json +41 -0
  108. data/spec/bitcoin/fixtures/reorg/blk_0_to_4.dat +0 -0
  109. data/spec/bitcoin/fixtures/reorg/blk_3A.dat +0 -0
  110. data/spec/bitcoin/fixtures/reorg/blk_4A.dat +0 -0
  111. data/spec/bitcoin/fixtures/reorg/blk_5A.dat +0 -0
  112. data/spec/bitcoin/fixtures/testnet/block_0.bin +0 -0
  113. data/spec/bitcoin/fixtures/testnet/block_1.bin +0 -0
  114. data/spec/bitcoin/fixtures/testnet/block_2.bin +0 -0
  115. data/spec/bitcoin/fixtures/testnet/block_3.bin +0 -0
  116. data/spec/bitcoin/fixtures/testnet/block_4.bin +0 -0
  117. data/spec/bitcoin/fixtures/testnet/block_5.bin +0 -0
  118. data/spec/bitcoin/fixtures/txdp-1.txt +32 -0
  119. data/spec/bitcoin/fixtures/txdp-2-signed.txt +19 -0
  120. data/spec/bitcoin/fixtures/txdp-2-unsigned.txt +14 -0
  121. data/spec/bitcoin/key_spec.rb +123 -0
  122. data/spec/bitcoin/network_spec.rb +48 -0
  123. data/spec/bitcoin/protocol/addr_spec.rb +68 -0
  124. data/spec/bitcoin/protocol/alert_spec.rb +20 -0
  125. data/spec/bitcoin/protocol/block_spec.rb +101 -0
  126. data/spec/bitcoin/protocol/inv_spec.rb +124 -0
  127. data/spec/bitcoin/protocol/ping_spec.rb +49 -0
  128. data/spec/bitcoin/protocol/tx_spec.rb +226 -0
  129. data/spec/bitcoin/protocol/version_spec.rb +77 -0
  130. data/spec/bitcoin/reorg_spec.rb +129 -0
  131. data/spec/bitcoin/script/opcodes_spec.rb +417 -0
  132. data/spec/bitcoin/script/script_spec.rb +246 -0
  133. data/spec/bitcoin/spec_helper.rb +36 -0
  134. data/spec/bitcoin/storage_spec.rb +229 -0
  135. data/spec/bitcoin/wallet/coinselector_spec.rb +35 -0
  136. data/spec/bitcoin/wallet/keygenerator_spec.rb +64 -0
  137. data/spec/bitcoin/wallet/keystore_spec.rb +188 -0
  138. data/spec/bitcoin/wallet/txdp_spec.rb +74 -0
  139. data/spec/bitcoin/wallet/wallet_spec.rb +207 -0
  140. metadata +295 -0
@@ -0,0 +1,121 @@
1
+ # autoload when you need to re-generate a public_key from only its private_key.
2
+ # ported from: https://github.com/sipa/bitcoin/blob/2d40fe4da9ea82af4b652b691a4185431d6e47a8/key.h
3
+
4
+ Bitcoin.require_dependency :ffi, exit: false, message:
5
+ "Skipping FFI needed for OpenSSL_EC.regenerate_key."
6
+
7
+ module Bitcoin
8
+ module OpenSSL_EC
9
+ extend FFI::Library
10
+ ffi_lib 'ssl'
11
+
12
+ NID_secp256k1 = 714
13
+
14
+ attach_function :SSL_library_init, [], :int
15
+ attach_function :ERR_load_crypto_strings, [], :void
16
+ attach_function :SSL_load_error_strings, [], :void
17
+ attach_function :RAND_poll, [], :int
18
+
19
+ #attach_function :BN_bin2bn, [:string, :int, :pointer], :pointer
20
+ attach_function :BN_bin2bn, [:pointer, :int, :pointer], :pointer
21
+ attach_function :EC_KEY_new_by_curve_name, [:int], :pointer
22
+ attach_function :EC_KEY_get0_group, [:pointer], :pointer
23
+ attach_function :BN_new, [], :pointer
24
+ attach_function :BN_CTX_new, [], :pointer
25
+ attach_function :EC_GROUP_get_order, [:pointer, :pointer, :pointer], :int
26
+ attach_function :EC_POINT_new, [:pointer], :pointer
27
+ attach_function :EC_POINT_mul, [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer], :int
28
+ attach_function :EC_KEY_set_private_key, [:pointer, :pointer], :int
29
+ attach_function :EC_KEY_set_public_key, [:pointer, :pointer], :int
30
+ attach_function :BN_free, [:pointer], :int
31
+ attach_function :EC_POINT_free, [:pointer], :int
32
+ attach_function :BN_CTX_free, [:pointer], :int
33
+ attach_function :EC_KEY_free, [:pointer], :int
34
+ attach_function :i2o_ECPublicKey, [:pointer, :pointer], :uint
35
+ attach_function :i2d_ECPrivateKey, [:pointer, :pointer], :int
36
+ attach_function :d2i_ECPrivateKey, [:pointer, :pointer, :long], :pointer
37
+ attach_function :EC_KEY_get0_private_key, [:pointer], :pointer
38
+ attach_function :BN_bn2bin, [:pointer, :pointer], :void
39
+
40
+
41
+ # resolve public from private key, using ffi and libssl.so
42
+ # example:
43
+ # keypair = Bitcoin.generate_key; Bitcoin::OpenSSL_EC.regenerate_key(keypair.first) == keypair
44
+ def self.regenerate_key(private_key)
45
+ private_key = [private_key].pack("H*") if private_key.bytesize >= (32*2)
46
+ private_key_hex = private_key.unpack("H*")[0]
47
+
48
+ #private_key = FFI::MemoryPointer.new(:uint8, private_key.bytesize)
49
+ # .put_bytes(0, private_key, 0, private_key.bytesize)
50
+ private_key = FFI::MemoryPointer.from_string(private_key)
51
+
52
+ init_ffi_ssl
53
+ eckey = EC_KEY_new_by_curve_name(NID_secp256k1)
54
+ #priv_key = BN_bin2bn(private_key, private_key.size, BN_new())
55
+ priv_key = BN_bin2bn(private_key, private_key.size-1, BN_new())
56
+
57
+ group, order, ctx = EC_KEY_get0_group(eckey), BN_new(), BN_CTX_new()
58
+ EC_GROUP_get_order(group, order, ctx)
59
+
60
+ pub_key = EC_POINT_new(group)
61
+ EC_POINT_mul(group, pub_key, priv_key, nil, nil, ctx)
62
+ EC_KEY_set_private_key(eckey, priv_key)
63
+ EC_KEY_set_public_key(eckey, pub_key)
64
+
65
+ BN_free(order)
66
+ BN_CTX_free(ctx)
67
+ EC_POINT_free(pub_key)
68
+ BN_free(priv_key)
69
+
70
+
71
+ length = i2d_ECPrivateKey(eckey, nil)
72
+ ptr = FFI::MemoryPointer.new(:pointer)
73
+ priv_hex = if i2d_ECPrivateKey(eckey, ptr) == length
74
+ size = ptr.read_pointer.get_array_of_uint8(8, 1)[0]
75
+ ptr.read_pointer.get_array_of_uint8(9, size).pack("C*").rjust(32, "\x00").unpack("H*")[0]
76
+ #der_to_private_key( ptr.read_pointer.read_string(length).unpack("H*")[0] )
77
+ end
78
+
79
+ if priv_hex != private_key_hex
80
+ raise "regenerated wrong private_key, raise here before generating a faulty public_key too!"
81
+ end
82
+
83
+
84
+ length = i2o_ECPublicKey(eckey, nil)
85
+ ptr = FFI::MemoryPointer.new(:pointer)
86
+ pub_hex = if i2o_ECPublicKey(eckey, ptr) == length
87
+ ptr.read_pointer.read_string(length).unpack("H*")[0]
88
+ end
89
+
90
+ EC_KEY_free(eckey)
91
+
92
+ [ priv_hex, pub_hex ]
93
+ end
94
+
95
+ # extract private key from uncompressed DER format
96
+ def self.der_to_private_key(der_hex)
97
+ init_ffi_ssl
98
+ #k = EC_KEY_new_by_curve_name(NID_secp256k1)
99
+ #kp = FFI::MemoryPointer.new(:pointer).put_pointer(0, eckey)
100
+
101
+ buf = FFI::MemoryPointer.from_string([der_hex].pack("H*"))
102
+ ptr = FFI::MemoryPointer.new(:pointer).put_pointer(0, buf)
103
+
104
+ #ec_key = d2i_ECPrivateKey(kp, ptr, buf.size-1)
105
+ ec_key = d2i_ECPrivateKey(nil, ptr, buf.size-1)
106
+ return nil if ec_key.null?
107
+ bn = EC_KEY_get0_private_key(ec_key)
108
+ BN_bn2bin(bn, buf)
109
+ buf.read_string(32).unpack("H*")[0]
110
+ end
111
+
112
+ def self.init_ffi_ssl
113
+ return if @ssl_loaded
114
+ SSL_library_init()
115
+ ERR_load_crypto_strings()
116
+ SSL_load_error_strings()
117
+ RAND_poll()
118
+ @ssl_loaded = true
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,42 @@
1
+ module Bitcoin::Gui
2
+ class AddrView < TreeView
3
+
4
+ def initialize gui
5
+ super(gui, :addr_view, [
6
+ [GObject::TYPE_STRING, "Address", :format_address_col],
7
+ [GObject::TYPE_STRING],
8
+ [GObject::TYPE_STRING, "Balance", :format_value_col],
9
+ [GObject::TYPE_BOOLEAN, "Mine?"]])
10
+ end
11
+
12
+ def update addrs
13
+ EM.defer do
14
+ @model.clear
15
+ addrs.each do |addr|
16
+ row = @model.append(nil)
17
+ @model.set_value(row, 0, addr[:addr])
18
+ @model.set_value(row, 1, addr[:label] || "")
19
+ @model.set_value(row, 3, !!addr[:mine])
20
+ balance = 0
21
+ unconfirmed = @gui.check_unconfirmed.active
22
+ @gui.storage.get_txouts_for_address(addr[:addr]).each do |txout|
23
+ next if !unconfirmed && !txout.get_tx.get_block
24
+ tx_row = @model.append(row)
25
+ @model.set_value(tx_row, 0, txout.get_tx.hash)
26
+ @model.set_value(tx_row, 2, txout.value.to_s)
27
+ balance += txout.value
28
+ if txin = txout.get_next_in
29
+ tx_row = @model.append(row)
30
+ @model.set_value(tx_row, 0, txin.get_tx.hash)
31
+ @model.set_value(tx_row, 2, (0 - txout.value).to_s)
32
+ balance -= txout.value
33
+ end
34
+ end
35
+ @model.set_value(row, 2, balance.to_s)
36
+ end
37
+ @view.set_model @model
38
+ end
39
+ end
40
+
41
+ end
42
+ end
Binary file
@@ -0,0 +1,80 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ width="744.09448819"
13
+ height="1052.3622047"
14
+ id="svg2"
15
+ version="1.1"
16
+ inkscape:version="0.48.3.1 r9886"
17
+ sodipodi:docname="bitcoin-ruby.svg">
18
+ <defs
19
+ id="defs4" />
20
+ <sodipodi:namedview
21
+ id="base"
22
+ pagecolor="#ffffff"
23
+ bordercolor="#666666"
24
+ borderopacity="1.0"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pageshadow="2"
27
+ inkscape:zoom="0.35"
28
+ inkscape:cx="-129.28571"
29
+ inkscape:cy="520"
30
+ inkscape:document-units="px"
31
+ inkscape:current-layer="layer1"
32
+ showgrid="false"
33
+ inkscape:window-width="1596"
34
+ inkscape:window-height="1180"
35
+ inkscape:window-x="2"
36
+ inkscape:window-y="18"
37
+ inkscape:window-maximized="0" />
38
+ <metadata
39
+ id="metadata7">
40
+ <rdf:RDF>
41
+ <cc:Work
42
+ rdf:about="">
43
+ <dc:format>image/svg+xml</dc:format>
44
+ <dc:type
45
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
46
+ <dc:title></dc:title>
47
+ </cc:Work>
48
+ </rdf:RDF>
49
+ </metadata>
50
+ <g
51
+ inkscape:label="Layer 1"
52
+ inkscape:groupmode="layer"
53
+ id="layer1">
54
+ <rect
55
+ style="fill:#8c0000;fill-opacity:1;stroke:#ffffff;stroke-width:0.75155282;stroke-opacity:1"
56
+ id="rect2987"
57
+ width="120.24844"
58
+ height="120.24844"
59
+ x="268.4472"
60
+ y="200.80939"
61
+ inkscape:export-filename="/home/mhanne/work/bitcoin-ruby/lib/bitcoin/gui/bitcoin-ruby.png"
62
+ inkscape:export-xdpi="74.380165"
63
+ inkscape:export-ydpi="74.380165" />
64
+ <text
65
+ xml:space="preserve"
66
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
67
+ x="285.71429"
68
+ y="303.79077"
69
+ id="text2989"
70
+ sodipodi:linespacing="125%"
71
+ inkscape:export-filename="/home/mhanne/work/bitcoin-ruby/lib/bitcoin/gui/bitcoin-ruby.png"
72
+ inkscape:export-xdpi="74.380165"
73
+ inkscape:export-ydpi="74.380165"><tspan
74
+ sodipodi:role="line"
75
+ id="tspan2991"
76
+ x="285.71429"
77
+ y="303.79077"
78
+ style="font-size:144px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">B</tspan></text>
79
+ </g>
80
+ </svg>
@@ -0,0 +1,36 @@
1
+ module Bitcoin::Gui
2
+ class ConnView < TreeView
3
+ def initialize gui
4
+ super(gui, :conn_view, [
5
+ [GObject::TYPE_STRING, "Host"],
6
+ [GObject::TYPE_INT, "Port"],
7
+ [GObject::TYPE_STRING, "State"],
8
+ [GObject::TYPE_INT, "Version", :format_version_col],
9
+ [GObject::TYPE_INT, "Block"],
10
+ [GObject::TYPE_INT, "Uptime", :format_uptime_col],
11
+ [GObject::TYPE_STRING, "User Agent"]])
12
+ @view.set_model @model
13
+ end
14
+
15
+ def connected data
16
+ row = @model.append(nil)
17
+ data.each_with_index do |pair, i|
18
+ @model.set_value(row, i, pair[1] || "")
19
+ end
20
+ end
21
+
22
+ def disconnected data
23
+ valid, i = @model.get_iter_first
24
+ while valid
25
+ host = @model.get_value(i, 0).get_string
26
+ port = @model.get_value(i, 1).get_int
27
+ if host == data[0] && port == data[1]
28
+ @model.remove(i)
29
+ break
30
+ end
31
+ valid = @model.iter_next(i.to_ptr)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,68 @@
1
+ module Bitcoin::Gui
2
+
3
+ class Bitcoin::Network::CommandClient
4
+ def gui &block
5
+ EM.next_tick do
6
+ @args[0].instance_eval &block
7
+ end
8
+ end
9
+ end
10
+
11
+ class Connection
12
+
13
+ def initialize host, port, gui
14
+ @gui = gui
15
+ @gui.node = Bitcoin::Network::CommandClient.connect(host, port, gui) do
16
+
17
+ on_connected do
18
+ request :info
19
+ request :monitor, "block", "connection"
20
+ end
21
+
22
+ on_info do |info|
23
+ text = "connections: #{info['connections']} | " +
24
+ "addrs: #{info['addrs']} | uptime: #{info['uptime']}"
25
+ gui { status_network.push 0, text }
26
+ EM::defer { sleep(1) && request(:info) }
27
+ end
28
+
29
+ on_block do |block, depth|
30
+ gui { status_store.push 0, "Blocks: #{depth}" }
31
+ end
32
+
33
+ on_connection do |state, data|
34
+ if state == "connected"
35
+ gui.conn_view.connected(data)
36
+ elsif state == "disconnected"
37
+ gui.conn_view.disconnected(data)
38
+ end
39
+
40
+ gui do
41
+ size = 0
42
+ v, i = conn_view.model.get_iter_first
43
+ while v
44
+ size += 1
45
+ v = conn_view.model.iter_next(i.to_ptr)
46
+ end
47
+
48
+ p = notebook.get_nth_page(2)
49
+ l = Gtk::Label.new("Connections (#{size})")
50
+ notebook.set_tab_label(p, l)
51
+ end
52
+ end
53
+
54
+ on_disconnected do
55
+ if @connection_attempts == 4
56
+ gui do
57
+ message(:warning, "Node not available", "The bitcoin node is not running " +
58
+ "or not reachable.\nYou can use the wallet to handle keys but you won't " +
59
+ "be able to send/receive transactions.", [:ok])
60
+ end
61
+ end
62
+ gui.status_network.push 0, "Offline"
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,28 @@
1
+ require "monitor"
2
+
3
+ module Gtk
4
+ GTK_PENDING_BLOCKS = []
5
+ GTK_PENDING_BLOCKS_LOCK = Monitor.new
6
+
7
+ def Gtk.queue &block
8
+ GTK_PENDING_BLOCKS_LOCK.synchronize do
9
+ GTK_PENDING_BLOCKS << block
10
+ end
11
+ end
12
+
13
+ def Gtk.main_iteration_with_queue
14
+ GTK_PENDING_BLOCKS_LOCK.synchronize do
15
+ for block in GTK_PENDING_BLOCKS
16
+ block.call
17
+ end
18
+ GTK_PENDING_BLOCKS.clear
19
+ end
20
+ Gtk.main_iteration while Gtk.events_pending
21
+ end
22
+ end
23
+
24
+ module EM
25
+ def self.gtk_main
26
+ EM.add_periodic_timer(0.001) { Gtk.main_iteration_with_queue }
27
+ end
28
+ end
@@ -0,0 +1,1643 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <interface>
3
+ <!-- interface-requires gtk+ 3.0 -->
4
+ <object class="GtkAboutDialog" id="about_dialog">
5
+ <property name="can_focus">False</property>
6
+ <property name="border_width">5</property>
7
+ <property name="title" translatable="yes">About</property>
8
+ <property name="type_hint">dialog</property>
9
+ <property name="program_name">Bitcoin-Ruby GUI</property>
10
+ <property name="version">0.0.1</property>
11
+ <property name="copyright" translatable="yes">Copyright (c) 2011 Julian Langschaedel &lt;meta.rb@gmail.com&gt;
12
+ Copyright (c) 2012 Marius Hanne &lt;marius.hanne@sourceagency.org&gt;</property>
13
+ <property name="comments" translatable="yes">a ruby library for interacting with the bitcoin protocol/network</property>
14
+ <property name="website">http://mhanne.github.com/bitcoin-ruby/</property>
15
+ <property name="license" translatable="yes">Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to
17
+ deal in the Software without restriction, including without limitation the
18
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
19
+ sell copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in
23
+ all copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
28
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
29
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</property>
31
+ <property name="authors">Julian Langschaedel
32
+ Marius Hanne</property>
33
+ <property name="logo">bitcoin-ruby.png</property>
34
+ <property name="wrap_license">True</property>
35
+ <property name="license_type">artistic</property>
36
+ <signal name="response" handler="on_about_close" swapped="no"/>
37
+ <child internal-child="vbox">
38
+ <object class="GtkBox" id="aboutdialog-vbox1">
39
+ <property name="can_focus">False</property>
40
+ <property name="orientation">vertical</property>
41
+ <property name="spacing">2</property>
42
+ <child internal-child="action_area">
43
+ <object class="GtkButtonBox" id="aboutdialog-action_area1">
44
+ <property name="can_focus">False</property>
45
+ <property name="layout_style">end</property>
46
+ <signal name="add" handler="on_about_close" swapped="no"/>
47
+ <signal name="remove" handler="on_about_close" swapped="no"/>
48
+ </object>
49
+ <packing>
50
+ <property name="expand">False</property>
51
+ <property name="fill">True</property>
52
+ <property name="pack_type">end</property>
53
+ <property name="position">0</property>
54
+ </packing>
55
+ </child>
56
+ <child>
57
+ <placeholder/>
58
+ </child>
59
+ </object>
60
+ </child>
61
+ </object>
62
+ <object class="GtkAccelGroup" id="accelgroup1">
63
+ <signal name="accel-activate" handler="on_accel_activate" swapped="no"/>
64
+ </object>
65
+ <object class="GtkAction" id="action_exit">
66
+ <property name="label" translatable="yes">aaa</property>
67
+ <signal name="activate" handler="on_exit" swapped="no"/>
68
+ </object>
69
+ <object class="GtkTreeStore" id="addr_store">
70
+ <columns>
71
+ <!-- column-name Address -->
72
+ <column type="gchararray"/>
73
+ <!-- column-name column1 -->
74
+ <column type="gchararray"/>
75
+ <!-- column-name Balance -->
76
+ <column type="gchararray"/>
77
+ </columns>
78
+ </object>
79
+ <object class="GtkImage" id="image_new_addr">
80
+ <property name="visible">True</property>
81
+ <property name="can_focus">False</property>
82
+ <property name="stock">gtk-add</property>
83
+ </object>
84
+ <object class="GtkImage" id="image_new_tx">
85
+ <property name="visible">True</property>
86
+ <property name="can_focus">False</property>
87
+ <property name="stock">gtk-go-forward</property>
88
+ </object>
89
+ <object class="GtkListStore" id="liststore1"/>
90
+ <object class="GtkWindow" id="main_window">
91
+ <property name="can_focus">False</property>
92
+ <property name="title" translatable="yes">Bitcoin-Ruby GUI</property>
93
+ <accel-groups>
94
+ <group name="accelgroup1"/>
95
+ </accel-groups>
96
+ <signal name="delete-event" handler="on_exit" swapped="no"/>
97
+ <child>
98
+ <object class="GtkBox" id="box1">
99
+ <property name="visible">True</property>
100
+ <property name="can_focus">False</property>
101
+ <property name="orientation">vertical</property>
102
+ <child>
103
+ <object class="GtkMenuBar" id="menubar1">
104
+ <property name="visible">True</property>
105
+ <property name="can_focus">False</property>
106
+ <child>
107
+ <object class="GtkMenuItem" id="menuitem1">
108
+ <property name="use_action_appearance">False</property>
109
+ <property name="visible">True</property>
110
+ <property name="can_focus">False</property>
111
+ <property name="label" translatable="yes">_File</property>
112
+ <property name="use_underline">True</property>
113
+ <child type="submenu">
114
+ <object class="GtkMenu" id="menu1">
115
+ <property name="visible">True</property>
116
+ <property name="can_focus">False</property>
117
+ <child>
118
+ <object class="GtkImageMenuItem" id="menu_file_new">
119
+ <property name="label">gtk-new</property>
120
+ <property name="use_action_appearance">False</property>
121
+ <property name="visible">True</property>
122
+ <property name="can_focus">False</property>
123
+ <property name="use_underline">True</property>
124
+ <property name="use_stock">True</property>
125
+ <signal name="activate" handler="on_new_wallet" swapped="no"/>
126
+ </object>
127
+ </child>
128
+ <child>
129
+ <object class="GtkImageMenuItem" id="menu_file_open">
130
+ <property name="label">gtk-open</property>
131
+ <property name="use_action_appearance">False</property>
132
+ <property name="visible">True</property>
133
+ <property name="can_focus">False</property>
134
+ <property name="use_underline">True</property>
135
+ <property name="use_stock">True</property>
136
+ <signal name="activate" handler="on_open_wallet" swapped="no"/>
137
+ </object>
138
+ </child>
139
+ <child>
140
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
141
+ <property name="use_action_appearance">False</property>
142
+ <property name="visible">True</property>
143
+ <property name="can_focus">False</property>
144
+ </object>
145
+ </child>
146
+ <child>
147
+ <object class="GtkImageMenuItem" id="menu_file_quit">
148
+ <property name="label">gtk-quit</property>
149
+ <property name="use_action_appearance">False</property>
150
+ <property name="related_action">action_exit</property>
151
+ <property name="visible">True</property>
152
+ <property name="can_focus">False</property>
153
+ <property name="use_underline">True</property>
154
+ <property name="use_stock">True</property>
155
+ <signal name="activate" handler="on_exit" swapped="no"/>
156
+ </object>
157
+ </child>
158
+ </object>
159
+ </child>
160
+ </object>
161
+ </child>
162
+ <child>
163
+ <object class="GtkMenuItem" id="menuitem2">
164
+ <property name="use_action_appearance">False</property>
165
+ <property name="visible">True</property>
166
+ <property name="can_focus">False</property>
167
+ <property name="label" translatable="yes">_Edit</property>
168
+ <property name="use_underline">True</property>
169
+ <child type="submenu">
170
+ <object class="GtkMenu" id="menu2">
171
+ <property name="visible">True</property>
172
+ <property name="can_focus">False</property>
173
+ <child>
174
+ <object class="GtkImageMenuItem" id="menu_edit_copy">
175
+ <property name="label">gtk-copy</property>
176
+ <property name="use_action_appearance">False</property>
177
+ <property name="visible">True</property>
178
+ <property name="can_focus">False</property>
179
+ <property name="use_underline">True</property>
180
+ <property name="use_stock">True</property>
181
+ <signal name="activate" handler="on_copy_addr" swapped="no"/>
182
+ </object>
183
+ </child>
184
+ <child>
185
+ <object class="GtkImageMenuItem" id="menu_edit_paste">
186
+ <property name="label">gtk-paste</property>
187
+ <property name="use_action_appearance">False</property>
188
+ <property name="visible">True</property>
189
+ <property name="can_focus">False</property>
190
+ <property name="use_underline">True</property>
191
+ <property name="use_stock">True</property>
192
+ <signal name="activate" handler="on_paste_addr" swapped="no"/>
193
+ </object>
194
+ </child>
195
+ <child>
196
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
197
+ <property name="use_action_appearance">False</property>
198
+ <property name="visible">True</property>
199
+ <property name="can_focus">False</property>
200
+ </object>
201
+ </child>
202
+ <child>
203
+ <object class="GtkImageMenuItem" id="menu_edit_preferences">
204
+ <property name="label">gtk-preferences</property>
205
+ <property name="use_action_appearance">False</property>
206
+ <property name="visible">True</property>
207
+ <property name="can_focus">False</property>
208
+ <property name="use_underline">True</property>
209
+ <property name="use_stock">True</property>
210
+ <signal name="activate" handler="on_preferences" swapped="no"/>
211
+ </object>
212
+ </child>
213
+ </object>
214
+ </child>
215
+ </object>
216
+ </child>
217
+ <child>
218
+ <object class="GtkMenuItem" id="menuitem3">
219
+ <property name="use_action_appearance">False</property>
220
+ <property name="visible">True</property>
221
+ <property name="can_focus">False</property>
222
+ <property name="label" translatable="yes">_View</property>
223
+ <property name="use_underline">True</property>
224
+ <child type="submenu">
225
+ <object class="GtkMenu" id="menu4">
226
+ <property name="visible">True</property>
227
+ <property name="can_focus">False</property>
228
+ <child>
229
+ <object class="GtkCheckMenuItem" id="check_unconfirmed">
230
+ <property name="use_action_appearance">False</property>
231
+ <property name="visible">True</property>
232
+ <property name="can_focus">False</property>
233
+ <property name="tooltip_text" translatable="yes">Display transactions that are not yet confirmed and use unconfirmed values to calculate balances</property>
234
+ <property name="label" translatable="yes">Display Unconfirmed</property>
235
+ <property name="use_underline">True</property>
236
+ <signal name="toggled" handler="on_check_unconfirmed_toggled" swapped="no"/>
237
+ </object>
238
+ </child>
239
+ </object>
240
+ </child>
241
+ </object>
242
+ </child>
243
+ <child>
244
+ <object class="GtkMenuItem" id="menuitem4">
245
+ <property name="use_action_appearance">False</property>
246
+ <property name="visible">True</property>
247
+ <property name="can_focus">False</property>
248
+ <property name="label" translatable="yes">_Help</property>
249
+ <property name="use_underline">True</property>
250
+ <child type="submenu">
251
+ <object class="GtkMenu" id="menu3">
252
+ <property name="visible">True</property>
253
+ <property name="can_focus">False</property>
254
+ <child>
255
+ <object class="GtkImageMenuItem" id="menu_help_about">
256
+ <property name="label">gtk-about</property>
257
+ <property name="use_action_appearance">False</property>
258
+ <property name="visible">True</property>
259
+ <property name="can_focus">False</property>
260
+ <property name="use_underline">True</property>
261
+ <property name="use_stock">True</property>
262
+ <property name="accel_group">accelgroup1</property>
263
+ <signal name="activate" handler="on_about" swapped="no"/>
264
+ </object>
265
+ </child>
266
+ </object>
267
+ </child>
268
+ </object>
269
+ </child>
270
+ </object>
271
+ <packing>
272
+ <property name="expand">False</property>
273
+ <property name="fill">True</property>
274
+ <property name="position">0</property>
275
+ </packing>
276
+ </child>
277
+ <child>
278
+ <object class="GtkNotebook" id="notebook">
279
+ <property name="visible">True</property>
280
+ <property name="can_focus">True</property>
281
+ <child>
282
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
283
+ <property name="visible">True</property>
284
+ <property name="can_focus">True</property>
285
+ <property name="shadow_type">in</property>
286
+ <child>
287
+ <object class="GtkTreeView" id="addr_view">
288
+ <property name="visible">True</property>
289
+ <property name="can_focus">True</property>
290
+ <property name="model">addr_store</property>
291
+ <property name="enable_grid_lines">both</property>
292
+ <child internal-child="selection">
293
+ <object class="GtkTreeSelection" id="treeview-selection1"/>
294
+ </child>
295
+ </object>
296
+ </child>
297
+ </object>
298
+ <packing>
299
+ <property name="tab_expand">True</property>
300
+ </packing>
301
+ </child>
302
+ <child type="tab">
303
+ <object class="GtkLabel" id="notebook_label_addresses">
304
+ <property name="visible">True</property>
305
+ <property name="can_focus">False</property>
306
+ <property name="label" translatable="yes">Addresses</property>
307
+ </object>
308
+ <packing>
309
+ <property name="tab_fill">False</property>
310
+ </packing>
311
+ </child>
312
+ <child>
313
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
314
+ <property name="visible">True</property>
315
+ <property name="can_focus">True</property>
316
+ <property name="shadow_type">in</property>
317
+ <child>
318
+ <object class="GtkTreeView" id="tx_view">
319
+ <property name="visible">True</property>
320
+ <property name="can_focus">True</property>
321
+ <child internal-child="selection">
322
+ <object class="GtkTreeSelection" id="treeview-selection2"/>
323
+ </child>
324
+ </object>
325
+ </child>
326
+ </object>
327
+ <packing>
328
+ <property name="position">1</property>
329
+ <property name="tab_expand">True</property>
330
+ </packing>
331
+ </child>
332
+ <child type="tab">
333
+ <object class="GtkLabel" id="notebook_label_transactions">
334
+ <property name="visible">True</property>
335
+ <property name="can_focus">False</property>
336
+ <property name="label" translatable="yes">Transactions</property>
337
+ </object>
338
+ <packing>
339
+ <property name="position">1</property>
340
+ <property name="tab_fill">False</property>
341
+ </packing>
342
+ </child>
343
+ <child>
344
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
345
+ <property name="visible">True</property>
346
+ <property name="can_focus">True</property>
347
+ <property name="shadow_type">in</property>
348
+ <child>
349
+ <object class="GtkTreeView" id="conn_view">
350
+ <property name="visible">True</property>
351
+ <property name="can_focus">True</property>
352
+ <child internal-child="selection">
353
+ <object class="GtkTreeSelection" id="treeview-selection4"/>
354
+ </child>
355
+ </object>
356
+ </child>
357
+ </object>
358
+ <packing>
359
+ <property name="position">2</property>
360
+ <property name="tab_expand">True</property>
361
+ </packing>
362
+ </child>
363
+ <child type="tab">
364
+ <object class="GtkLabel" id="notebook_label_peers">
365
+ <property name="visible">True</property>
366
+ <property name="can_focus">False</property>
367
+ <property name="label" translatable="yes">Connections</property>
368
+ </object>
369
+ <packing>
370
+ <property name="position">2</property>
371
+ <property name="tab_fill">False</property>
372
+ </packing>
373
+ </child>
374
+ <child>
375
+ <placeholder/>
376
+ </child>
377
+ <child type="tab">
378
+ <placeholder/>
379
+ </child>
380
+ </object>
381
+ <packing>
382
+ <property name="expand">True</property>
383
+ <property name="fill">True</property>
384
+ <property name="position">1</property>
385
+ </packing>
386
+ </child>
387
+ <child>
388
+ <object class="GtkButtonBox" id="buttonbar">
389
+ <property name="visible">True</property>
390
+ <property name="can_focus">False</property>
391
+ <property name="homogeneous">True</property>
392
+ <property name="layout_style">start</property>
393
+ <child>
394
+ <object class="GtkButton" id="button_new_addr">
395
+ <property name="label" translatable="yes">New Address</property>
396
+ <property name="use_action_appearance">False</property>
397
+ <property name="visible">True</property>
398
+ <property name="can_focus">True</property>
399
+ <property name="receives_default">True</property>
400
+ <property name="use_action_appearance">False</property>
401
+ <property name="image">image_new_addr</property>
402
+ <signal name="clicked" handler="on_new_addr" swapped="no"/>
403
+ </object>
404
+ <packing>
405
+ <property name="expand">False</property>
406
+ <property name="fill">True</property>
407
+ <property name="position">0</property>
408
+ </packing>
409
+ </child>
410
+ <child>
411
+ <object class="GtkButton" id="button_new_tx">
412
+ <property name="label" translatable="yes">New Transaction</property>
413
+ <property name="use_action_appearance">False</property>
414
+ <property name="visible">True</property>
415
+ <property name="can_focus">True</property>
416
+ <property name="receives_default">True</property>
417
+ <property name="use_action_appearance">False</property>
418
+ <property name="image">image_new_tx</property>
419
+ <signal name="clicked" handler="on_new_tx" swapped="no"/>
420
+ </object>
421
+ <packing>
422
+ <property name="expand">False</property>
423
+ <property name="fill">True</property>
424
+ <property name="position">1</property>
425
+ </packing>
426
+ </child>
427
+ <child>
428
+ <placeholder/>
429
+ </child>
430
+ </object>
431
+ <packing>
432
+ <property name="expand">False</property>
433
+ <property name="fill">True</property>
434
+ <property name="position">2</property>
435
+ </packing>
436
+ </child>
437
+ <child>
438
+ <object class="GtkBox" id="box4">
439
+ <property name="visible">True</property>
440
+ <property name="can_focus">False</property>
441
+ <child>
442
+ <object class="GtkImage" id="image1">
443
+ <property name="visible">True</property>
444
+ <property name="can_focus">False</property>
445
+ <property name="stock">gtk-network</property>
446
+ </object>
447
+ <packing>
448
+ <property name="expand">False</property>
449
+ <property name="fill">True</property>
450
+ <property name="position">0</property>
451
+ </packing>
452
+ </child>
453
+ <child>
454
+ <object class="GtkStatusbar" id="status_network">
455
+ <property name="visible">True</property>
456
+ <property name="can_focus">False</property>
457
+ <property name="orientation">vertical</property>
458
+ <property name="spacing">2</property>
459
+ </object>
460
+ <packing>
461
+ <property name="expand">True</property>
462
+ <property name="fill">True</property>
463
+ <property name="padding">10</property>
464
+ <property name="position">1</property>
465
+ </packing>
466
+ </child>
467
+ <child>
468
+ <object class="GtkImage" id="image2">
469
+ <property name="visible">True</property>
470
+ <property name="can_focus">False</property>
471
+ <property name="stock">gtk-harddisk</property>
472
+ </object>
473
+ <packing>
474
+ <property name="expand">False</property>
475
+ <property name="fill">True</property>
476
+ <property name="position">2</property>
477
+ </packing>
478
+ </child>
479
+ <child>
480
+ <object class="GtkStatusbar" id="status_store">
481
+ <property name="visible">True</property>
482
+ <property name="can_focus">False</property>
483
+ <property name="orientation">vertical</property>
484
+ <property name="spacing">2</property>
485
+ </object>
486
+ <packing>
487
+ <property name="expand">True</property>
488
+ <property name="fill">True</property>
489
+ <property name="padding">10</property>
490
+ <property name="position">3</property>
491
+ </packing>
492
+ </child>
493
+ <child>
494
+ <object class="GtkImage" id="image3">
495
+ <property name="visible">True</property>
496
+ <property name="can_focus">False</property>
497
+ <property name="stock">gtk-dialog-authentication</property>
498
+ </object>
499
+ <packing>
500
+ <property name="expand">False</property>
501
+ <property name="fill">True</property>
502
+ <property name="position">4</property>
503
+ </packing>
504
+ </child>
505
+ <child>
506
+ <object class="GtkStatusbar" id="status_wallet">
507
+ <property name="visible">True</property>
508
+ <property name="can_focus">False</property>
509
+ <property name="orientation">vertical</property>
510
+ <property name="spacing">2</property>
511
+ </object>
512
+ <packing>
513
+ <property name="expand">True</property>
514
+ <property name="fill">True</property>
515
+ <property name="padding">10</property>
516
+ <property name="position">5</property>
517
+ </packing>
518
+ </child>
519
+ </object>
520
+ <packing>
521
+ <property name="expand">False</property>
522
+ <property name="fill">True</property>
523
+ <property name="position">3</property>
524
+ </packing>
525
+ </child>
526
+ </object>
527
+ </child>
528
+ </object>
529
+ <object class="GtkMessageDialog" id="message_dialog">
530
+ <property name="can_focus">False</property>
531
+ <property name="border_width">5</property>
532
+ <property name="window_position">mouse</property>
533
+ <property name="type_hint">dialog</property>
534
+ <property name="skip_taskbar_hint">True</property>
535
+ <property name="text" translatable="yes">aaa</property>
536
+ <property name="secondary_text" translatable="yes">aaaaa</property>
537
+ <child internal-child="vbox">
538
+ <object class="GtkBox" id="messagedialog-vbox1">
539
+ <property name="can_focus">False</property>
540
+ <property name="orientation">vertical</property>
541
+ <property name="spacing">2</property>
542
+ <child internal-child="action_area">
543
+ <object class="GtkButtonBox" id="messagedialog-action_area1">
544
+ <property name="can_focus">False</property>
545
+ <property name="layout_style">end</property>
546
+ <child>
547
+ <object class="GtkButton" id="message_dialog_button_no">
548
+ <property name="label">gtk-no</property>
549
+ <property name="use_action_appearance">False</property>
550
+ <property name="visible">True</property>
551
+ <property name="can_focus">True</property>
552
+ <property name="receives_default">True</property>
553
+ <property name="use_action_appearance">False</property>
554
+ <property name="use_stock">True</property>
555
+ </object>
556
+ <packing>
557
+ <property name="expand">False</property>
558
+ <property name="fill">True</property>
559
+ <property name="position">0</property>
560
+ </packing>
561
+ </child>
562
+ <child>
563
+ <object class="GtkButton" id="message_dialog_button_yes">
564
+ <property name="label">gtk-yes</property>
565
+ <property name="use_action_appearance">False</property>
566
+ <property name="visible">True</property>
567
+ <property name="can_focus">True</property>
568
+ <property name="receives_default">True</property>
569
+ <property name="use_action_appearance">False</property>
570
+ <property name="use_stock">True</property>
571
+ </object>
572
+ <packing>
573
+ <property name="expand">False</property>
574
+ <property name="fill">True</property>
575
+ <property name="position">1</property>
576
+ </packing>
577
+ </child>
578
+ <child>
579
+ <object class="GtkButton" id="message_dialog_button_ok">
580
+ <property name="label">gtk-ok</property>
581
+ <property name="use_action_appearance">False</property>
582
+ <property name="visible">True</property>
583
+ <property name="can_focus">True</property>
584
+ <property name="receives_default">True</property>
585
+ <property name="use_action_appearance">False</property>
586
+ <property name="use_stock">True</property>
587
+ </object>
588
+ <packing>
589
+ <property name="expand">False</property>
590
+ <property name="fill">True</property>
591
+ <property name="position">2</property>
592
+ </packing>
593
+ </child>
594
+ </object>
595
+ <packing>
596
+ <property name="expand">False</property>
597
+ <property name="fill">True</property>
598
+ <property name="pack_type">end</property>
599
+ <property name="position">0</property>
600
+ </packing>
601
+ </child>
602
+ </object>
603
+ </child>
604
+ <action-widgets>
605
+ <action-widget response="-1">message_dialog_button_no</action-widget>
606
+ <action-widget response="1">message_dialog_button_yes</action-widget>
607
+ <action-widget response="1">message_dialog_button_ok</action-widget>
608
+ </action-widgets>
609
+ </object>
610
+ <object class="GtkDialog" id="new_addr_dialog">
611
+ <property name="can_focus">False</property>
612
+ <property name="border_width">5</property>
613
+ <property name="title" translatable="yes">New Address</property>
614
+ <property name="type_hint">dialog</property>
615
+ <child internal-child="vbox">
616
+ <object class="GtkBox" id="dialog-vbox1">
617
+ <property name="can_focus">False</property>
618
+ <property name="orientation">vertical</property>
619
+ <property name="spacing">2</property>
620
+ <child internal-child="action_area">
621
+ <object class="GtkButtonBox" id="dialog-action_area1">
622
+ <property name="can_focus">False</property>
623
+ <property name="layout_style">end</property>
624
+ <child>
625
+ <object class="GtkButton" id="new_addr_dialog_cancel">
626
+ <property name="label">gtk-cancel</property>
627
+ <property name="use_action_appearance">False</property>
628
+ <property name="visible">True</property>
629
+ <property name="can_focus">True</property>
630
+ <property name="receives_default">True</property>
631
+ <property name="use_action_appearance">False</property>
632
+ <property name="use_stock">True</property>
633
+ <signal name="clicked" handler="on_new_addr_cancel" swapped="no"/>
634
+ </object>
635
+ <packing>
636
+ <property name="expand">False</property>
637
+ <property name="fill">True</property>
638
+ <property name="position">0</property>
639
+ </packing>
640
+ </child>
641
+ <child>
642
+ <object class="GtkButton" id="new_addr_dialog_apply">
643
+ <property name="label">gtk-apply</property>
644
+ <property name="use_action_appearance">False</property>
645
+ <property name="visible">True</property>
646
+ <property name="can_focus">True</property>
647
+ <property name="receives_default">True</property>
648
+ <property name="use_action_appearance">False</property>
649
+ <property name="use_stock">True</property>
650
+ <signal name="clicked" handler="on_new_addr_apply" swapped="no"/>
651
+ </object>
652
+ <packing>
653
+ <property name="expand">False</property>
654
+ <property name="fill">True</property>
655
+ <property name="position">1</property>
656
+ </packing>
657
+ </child>
658
+ </object>
659
+ <packing>
660
+ <property name="expand">False</property>
661
+ <property name="fill">True</property>
662
+ <property name="pack_type">end</property>
663
+ <property name="position">0</property>
664
+ </packing>
665
+ </child>
666
+ <child>
667
+ <object class="GtkGrid" id="grid8">
668
+ <property name="visible">True</property>
669
+ <property name="can_focus">False</property>
670
+ <child>
671
+ <object class="GtkLabel" id="label22">
672
+ <property name="visible">True</property>
673
+ <property name="can_focus">False</property>
674
+ <property name="label" translatable="yes">Label</property>
675
+ </object>
676
+ <packing>
677
+ <property name="left_attach">0</property>
678
+ <property name="top_attach">0</property>
679
+ <property name="width">1</property>
680
+ <property name="height">1</property>
681
+ </packing>
682
+ </child>
683
+ <child>
684
+ <object class="GtkEntry" id="new_addr_entry_label">
685
+ <property name="visible">True</property>
686
+ <property name="can_focus">True</property>
687
+ <property name="invisible_char">●</property>
688
+ <property name="invisible_char_set">True</property>
689
+ </object>
690
+ <packing>
691
+ <property name="left_attach">1</property>
692
+ <property name="top_attach">0</property>
693
+ <property name="width">1</property>
694
+ <property name="height">1</property>
695
+ </packing>
696
+ </child>
697
+ <child>
698
+ <object class="GtkCheckButton" id="new_addr_check_addr">
699
+ <property name="label" translatable="yes">Address</property>
700
+ <property name="use_action_appearance">False</property>
701
+ <property name="visible">True</property>
702
+ <property name="can_focus">True</property>
703
+ <property name="receives_default">False</property>
704
+ <property name="use_action_appearance">False</property>
705
+ <property name="xalign">0</property>
706
+ <property name="draw_indicator">True</property>
707
+ </object>
708
+ <packing>
709
+ <property name="left_attach">0</property>
710
+ <property name="top_attach">1</property>
711
+ <property name="width">1</property>
712
+ <property name="height">1</property>
713
+ </packing>
714
+ </child>
715
+ <child>
716
+ <object class="GtkEntry" id="new_addr_entry_addr">
717
+ <property name="visible">True</property>
718
+ <property name="can_focus">True</property>
719
+ <property name="invisible_char">●</property>
720
+ <property name="invisible_char_set">True</property>
721
+ </object>
722
+ <packing>
723
+ <property name="left_attach">1</property>
724
+ <property name="top_attach">1</property>
725
+ <property name="width">1</property>
726
+ <property name="height">1</property>
727
+ </packing>
728
+ </child>
729
+ <child>
730
+ <object class="GtkCheckButton" id="new_addr_check_pubkey">
731
+ <property name="label" translatable="yes">Pubkey</property>
732
+ <property name="use_action_appearance">False</property>
733
+ <property name="visible">True</property>
734
+ <property name="can_focus">True</property>
735
+ <property name="receives_default">False</property>
736
+ <property name="use_action_appearance">False</property>
737
+ <property name="xalign">0</property>
738
+ <property name="draw_indicator">True</property>
739
+ </object>
740
+ <packing>
741
+ <property name="left_attach">0</property>
742
+ <property name="top_attach">2</property>
743
+ <property name="width">1</property>
744
+ <property name="height">1</property>
745
+ </packing>
746
+ </child>
747
+ <child>
748
+ <object class="GtkEntry" id="new_addr_entry_pubkey">
749
+ <property name="visible">True</property>
750
+ <property name="can_focus">True</property>
751
+ <property name="invisible_char">●</property>
752
+ <property name="invisible_char_set">True</property>
753
+ </object>
754
+ <packing>
755
+ <property name="left_attach">1</property>
756
+ <property name="top_attach">2</property>
757
+ <property name="width">1</property>
758
+ <property name="height">1</property>
759
+ </packing>
760
+ </child>
761
+ <child>
762
+ <object class="GtkCheckButton" id="new_addr_check_mine">
763
+ <property name="label" translatable="yes">Mine</property>
764
+ <property name="use_action_appearance">False</property>
765
+ <property name="visible">True</property>
766
+ <property name="can_focus">True</property>
767
+ <property name="receives_default">False</property>
768
+ <property name="use_action_appearance">False</property>
769
+ <property name="xalign">0</property>
770
+ <property name="active">True</property>
771
+ <property name="draw_indicator">True</property>
772
+ </object>
773
+ <packing>
774
+ <property name="left_attach">0</property>
775
+ <property name="top_attach">3</property>
776
+ <property name="width">1</property>
777
+ <property name="height">1</property>
778
+ </packing>
779
+ </child>
780
+ <child>
781
+ <placeholder/>
782
+ </child>
783
+ </object>
784
+ <packing>
785
+ <property name="expand">False</property>
786
+ <property name="fill">True</property>
787
+ <property name="position">1</property>
788
+ </packing>
789
+ </child>
790
+ </object>
791
+ </child>
792
+ <action-widgets>
793
+ <action-widget response="0">new_addr_dialog_cancel</action-widget>
794
+ <action-widget response="1">new_addr_dialog_apply</action-widget>
795
+ </action-widgets>
796
+ </object>
797
+ <object class="GtkDialog" id="new_tx_dialog">
798
+ <property name="can_focus">False</property>
799
+ <property name="border_width">5</property>
800
+ <property name="title" translatable="yes">New Transaction</property>
801
+ <property name="type_hint">dialog</property>
802
+ <child internal-child="vbox">
803
+ <object class="GtkBox" id="dialog-vbox3">
804
+ <property name="can_focus">False</property>
805
+ <property name="orientation">vertical</property>
806
+ <property name="spacing">2</property>
807
+ <child internal-child="action_area">
808
+ <object class="GtkButtonBox" id="dialog-action_area3">
809
+ <property name="can_focus">False</property>
810
+ <property name="layout_style">end</property>
811
+ <child>
812
+ <object class="GtkButton" id="button5">
813
+ <property name="label">gtk-cancel</property>
814
+ <property name="use_action_appearance">False</property>
815
+ <property name="visible">True</property>
816
+ <property name="can_focus">True</property>
817
+ <property name="receives_default">True</property>
818
+ <property name="use_action_appearance">False</property>
819
+ <property name="use_stock">True</property>
820
+ </object>
821
+ <packing>
822
+ <property name="expand">False</property>
823
+ <property name="fill">True</property>
824
+ <property name="position">0</property>
825
+ </packing>
826
+ </child>
827
+ <child>
828
+ <object class="GtkButton" id="button6">
829
+ <property name="label">gtk-apply</property>
830
+ <property name="use_action_appearance">False</property>
831
+ <property name="visible">True</property>
832
+ <property name="can_focus">True</property>
833
+ <property name="receives_default">True</property>
834
+ <property name="use_action_appearance">False</property>
835
+ <property name="use_stock">True</property>
836
+ </object>
837
+ <packing>
838
+ <property name="expand">False</property>
839
+ <property name="fill">True</property>
840
+ <property name="position">1</property>
841
+ </packing>
842
+ </child>
843
+ </object>
844
+ <packing>
845
+ <property name="expand">False</property>
846
+ <property name="fill">True</property>
847
+ <property name="pack_type">end</property>
848
+ <property name="position">0</property>
849
+ </packing>
850
+ </child>
851
+ <child>
852
+ <object class="GtkGrid" id="grid2">
853
+ <property name="visible">True</property>
854
+ <property name="can_focus">False</property>
855
+ <child>
856
+ <object class="GtkLabel" id="label4">
857
+ <property name="visible">True</property>
858
+ <property name="can_focus">False</property>
859
+ <property name="label" translatable="yes">Recipient</property>
860
+ </object>
861
+ <packing>
862
+ <property name="left_attach">0</property>
863
+ <property name="top_attach">0</property>
864
+ <property name="width">1</property>
865
+ <property name="height">1</property>
866
+ </packing>
867
+ </child>
868
+ <child>
869
+ <object class="GtkLabel" id="label5">
870
+ <property name="visible">True</property>
871
+ <property name="can_focus">False</property>
872
+ <property name="label" translatable="yes">Amount</property>
873
+ </object>
874
+ <packing>
875
+ <property name="left_attach">0</property>
876
+ <property name="top_attach">1</property>
877
+ <property name="width">1</property>
878
+ <property name="height">1</property>
879
+ </packing>
880
+ </child>
881
+ <child>
882
+ <object class="GtkEntry" id="new_tx_entry_address">
883
+ <property name="visible">True</property>
884
+ <property name="can_focus">True</property>
885
+ <property name="invisible_char">●</property>
886
+ </object>
887
+ <packing>
888
+ <property name="left_attach">1</property>
889
+ <property name="top_attach">0</property>
890
+ <property name="width">1</property>
891
+ <property name="height">1</property>
892
+ </packing>
893
+ </child>
894
+ <child>
895
+ <object class="GtkEntry" id="new_tx_entry_amount">
896
+ <property name="visible">True</property>
897
+ <property name="can_focus">True</property>
898
+ <property name="invisible_char">●</property>
899
+ </object>
900
+ <packing>
901
+ <property name="left_attach">1</property>
902
+ <property name="top_attach">1</property>
903
+ <property name="width">1</property>
904
+ <property name="height">1</property>
905
+ </packing>
906
+ </child>
907
+ </object>
908
+ <packing>
909
+ <property name="expand">False</property>
910
+ <property name="fill">True</property>
911
+ <property name="position">1</property>
912
+ </packing>
913
+ </child>
914
+ </object>
915
+ </child>
916
+ <action-widgets>
917
+ <action-widget response="0">button5</action-widget>
918
+ <action-widget response="1">button6</action-widget>
919
+ </action-widgets>
920
+ </object>
921
+ <object class="GtkEntryCompletion" id="new_tx_recipient_completion"/>
922
+ <object class="GtkMenu" id="popup_menu">
923
+ <property name="visible">True</property>
924
+ <property name="can_focus">False</property>
925
+ <child>
926
+ <object class="GtkImageMenuItem" id="menu_popup_quit">
927
+ <property name="label">gtk-quit</property>
928
+ <property name="use_action_appearance">False</property>
929
+ <property name="related_action">action_exit</property>
930
+ <property name="visible">True</property>
931
+ <property name="can_focus">False</property>
932
+ <property name="use_underline">True</property>
933
+ <property name="use_stock">True</property>
934
+ </object>
935
+ </child>
936
+ </object>
937
+ <object class="GtkDialog" id="preferences_dialog">
938
+ <property name="can_focus">False</property>
939
+ <property name="border_width">5</property>
940
+ <property name="title" translatable="yes">Preferences</property>
941
+ <property name="type_hint">dialog</property>
942
+ <child internal-child="vbox">
943
+ <object class="GtkBox" id="dialog-vbox4">
944
+ <property name="can_focus">False</property>
945
+ <property name="orientation">vertical</property>
946
+ <property name="spacing">2</property>
947
+ <child internal-child="action_area">
948
+ <object class="GtkButtonBox" id="dialog-action_area4">
949
+ <property name="can_focus">False</property>
950
+ <property name="layout_style">end</property>
951
+ <child>
952
+ <object class="GtkButton" id="button7">
953
+ <property name="label">gtk-cancel</property>
954
+ <property name="use_action_appearance">False</property>
955
+ <property name="visible">True</property>
956
+ <property name="can_focus">True</property>
957
+ <property name="receives_default">True</property>
958
+ <property name="use_action_appearance">False</property>
959
+ <property name="use_stock">True</property>
960
+ </object>
961
+ <packing>
962
+ <property name="expand">False</property>
963
+ <property name="fill">True</property>
964
+ <property name="position">0</property>
965
+ </packing>
966
+ </child>
967
+ <child>
968
+ <object class="GtkButton" id="button8">
969
+ <property name="label">gtk-save</property>
970
+ <property name="use_action_appearance">False</property>
971
+ <property name="visible">True</property>
972
+ <property name="can_focus">True</property>
973
+ <property name="receives_default">True</property>
974
+ <property name="use_action_appearance">False</property>
975
+ <property name="use_stock">True</property>
976
+ </object>
977
+ <packing>
978
+ <property name="expand">False</property>
979
+ <property name="fill">True</property>
980
+ <property name="position">1</property>
981
+ </packing>
982
+ </child>
983
+ </object>
984
+ <packing>
985
+ <property name="expand">False</property>
986
+ <property name="fill">True</property>
987
+ <property name="pack_type">end</property>
988
+ <property name="position">0</property>
989
+ </packing>
990
+ </child>
991
+ <child>
992
+ <object class="GtkNotebook" id="notebook1">
993
+ <property name="visible">True</property>
994
+ <property name="can_focus">True</property>
995
+ <property name="tab_pos">left</property>
996
+ <child>
997
+ <object class="GtkGrid" id="grid3">
998
+ <property name="visible">True</property>
999
+ <property name="can_focus">False</property>
1000
+ <child>
1001
+ <object class="GtkLabel" id="label9">
1002
+ <property name="visible">True</property>
1003
+ <property name="can_focus">False</property>
1004
+ <property name="label" translatable="yes">Network</property>
1005
+ </object>
1006
+ <packing>
1007
+ <property name="left_attach">0</property>
1008
+ <property name="top_attach">0</property>
1009
+ <property name="width">1</property>
1010
+ <property name="height">1</property>
1011
+ </packing>
1012
+ </child>
1013
+ <child>
1014
+ <object class="GtkLabel" id="label10">
1015
+ <property name="visible">True</property>
1016
+ <property name="can_focus">False</property>
1017
+ <property name="label" translatable="yes">Command Socket</property>
1018
+ </object>
1019
+ <packing>
1020
+ <property name="left_attach">0</property>
1021
+ <property name="top_attach">1</property>
1022
+ <property name="width">1</property>
1023
+ <property name="height">1</property>
1024
+ </packing>
1025
+ </child>
1026
+ <child>
1027
+ <object class="GtkLabel" id="label11">
1028
+ <property name="visible">True</property>
1029
+ <property name="can_focus">False</property>
1030
+ <property name="label" translatable="yes">Listen Socket</property>
1031
+ </object>
1032
+ <packing>
1033
+ <property name="left_attach">0</property>
1034
+ <property name="top_attach">2</property>
1035
+ <property name="width">1</property>
1036
+ <property name="height">1</property>
1037
+ </packing>
1038
+ </child>
1039
+ <child>
1040
+ <object class="GtkEntry" id="preferences_entry_command">
1041
+ <property name="visible">True</property>
1042
+ <property name="can_focus">True</property>
1043
+ <property name="invisible_char">●</property>
1044
+ </object>
1045
+ <packing>
1046
+ <property name="left_attach">1</property>
1047
+ <property name="top_attach">1</property>
1048
+ <property name="width">1</property>
1049
+ <property name="height">1</property>
1050
+ </packing>
1051
+ </child>
1052
+ <child>
1053
+ <object class="GtkEntry" id="preferences_entry_listen">
1054
+ <property name="visible">True</property>
1055
+ <property name="can_focus">True</property>
1056
+ <property name="invisible_char">●</property>
1057
+ </object>
1058
+ <packing>
1059
+ <property name="left_attach">1</property>
1060
+ <property name="top_attach">2</property>
1061
+ <property name="width">1</property>
1062
+ <property name="height">1</property>
1063
+ </packing>
1064
+ </child>
1065
+ <child>
1066
+ <object class="GtkEntry" id="preferences_entry_network">
1067
+ <property name="visible">True</property>
1068
+ <property name="can_focus">True</property>
1069
+ <property name="invisible_char">●</property>
1070
+ </object>
1071
+ <packing>
1072
+ <property name="left_attach">1</property>
1073
+ <property name="top_attach">0</property>
1074
+ <property name="width">1</property>
1075
+ <property name="height">1</property>
1076
+ </packing>
1077
+ </child>
1078
+ <child>
1079
+ <object class="GtkLabel" id="label17">
1080
+ <property name="visible">True</property>
1081
+ <property name="can_focus">False</property>
1082
+ <property name="label" translatable="yes">Storage Backend</property>
1083
+ </object>
1084
+ <packing>
1085
+ <property name="left_attach">0</property>
1086
+ <property name="top_attach">3</property>
1087
+ <property name="width">1</property>
1088
+ <property name="height">1</property>
1089
+ </packing>
1090
+ </child>
1091
+ <child>
1092
+ <object class="GtkComboBox" id="combobox2">
1093
+ <property name="visible">True</property>
1094
+ <property name="can_focus">False</property>
1095
+ </object>
1096
+ <packing>
1097
+ <property name="left_attach">1</property>
1098
+ <property name="top_attach">3</property>
1099
+ <property name="width">1</property>
1100
+ <property name="height">1</property>
1101
+ </packing>
1102
+ </child>
1103
+ </object>
1104
+ </child>
1105
+ <child type="tab">
1106
+ <object class="GtkLabel" id="label6">
1107
+ <property name="visible">True</property>
1108
+ <property name="can_focus">False</property>
1109
+ <property name="label" translatable="yes">General</property>
1110
+ </object>
1111
+ <packing>
1112
+ <property name="tab_fill">False</property>
1113
+ </packing>
1114
+ </child>
1115
+ <child>
1116
+ <object class="GtkGrid" id="grid4">
1117
+ <property name="visible">True</property>
1118
+ <property name="can_focus">False</property>
1119
+ <child>
1120
+ <object class="GtkLabel" id="label12">
1121
+ <property name="visible">True</property>
1122
+ <property name="can_focus">False</property>
1123
+ <property name="label" translatable="yes">Headers Only</property>
1124
+ </object>
1125
+ <packing>
1126
+ <property name="left_attach">0</property>
1127
+ <property name="top_attach">0</property>
1128
+ <property name="width">1</property>
1129
+ <property name="height">1</property>
1130
+ </packing>
1131
+ </child>
1132
+ <child>
1133
+ <object class="GtkLabel" id="label13">
1134
+ <property name="visible">True</property>
1135
+ <property name="can_focus">False</property>
1136
+ <property name="label" translatable="yes">DNS</property>
1137
+ </object>
1138
+ <packing>
1139
+ <property name="left_attach">0</property>
1140
+ <property name="top_attach">1</property>
1141
+ <property name="width">1</property>
1142
+ <property name="height">1</property>
1143
+ </packing>
1144
+ </child>
1145
+ <child>
1146
+ <object class="GtkLabel" id="label14">
1147
+ <property name="visible">True</property>
1148
+ <property name="can_focus">False</property>
1149
+ </object>
1150
+ <packing>
1151
+ <property name="left_attach">0</property>
1152
+ <property name="top_attach">2</property>
1153
+ <property name="width">1</property>
1154
+ <property name="height">1</property>
1155
+ </packing>
1156
+ </child>
1157
+ <child>
1158
+ <object class="GtkSwitch" id="switch1">
1159
+ <property name="use_action_appearance">False</property>
1160
+ <property name="visible">True</property>
1161
+ <property name="can_focus">True</property>
1162
+ <property name="use_action_appearance">False</property>
1163
+ </object>
1164
+ <packing>
1165
+ <property name="left_attach">1</property>
1166
+ <property name="top_attach">0</property>
1167
+ <property name="width">1</property>
1168
+ <property name="height">1</property>
1169
+ </packing>
1170
+ </child>
1171
+ <child>
1172
+ <object class="GtkSwitch" id="switch2">
1173
+ <property name="use_action_appearance">False</property>
1174
+ <property name="visible">True</property>
1175
+ <property name="can_focus">True</property>
1176
+ <property name="use_action_appearance">False</property>
1177
+ </object>
1178
+ <packing>
1179
+ <property name="left_attach">1</property>
1180
+ <property name="top_attach">1</property>
1181
+ <property name="width">1</property>
1182
+ <property name="height">1</property>
1183
+ </packing>
1184
+ </child>
1185
+ <child>
1186
+ <placeholder/>
1187
+ </child>
1188
+ </object>
1189
+ <packing>
1190
+ <property name="position">1</property>
1191
+ </packing>
1192
+ </child>
1193
+ <child type="tab">
1194
+ <object class="GtkLabel" id="label7">
1195
+ <property name="visible">True</property>
1196
+ <property name="can_focus">False</property>
1197
+ <property name="label" translatable="yes">Node</property>
1198
+ </object>
1199
+ <packing>
1200
+ <property name="position">1</property>
1201
+ <property name="tab_fill">False</property>
1202
+ </packing>
1203
+ </child>
1204
+ <child>
1205
+ <object class="GtkGrid" id="grid5">
1206
+ <property name="visible">True</property>
1207
+ <property name="can_focus">False</property>
1208
+ <child>
1209
+ <object class="GtkLabel" id="label15">
1210
+ <property name="visible">True</property>
1211
+ <property name="can_focus">False</property>
1212
+ <property name="label" translatable="yes">Backend</property>
1213
+ </object>
1214
+ <packing>
1215
+ <property name="left_attach">0</property>
1216
+ <property name="top_attach">0</property>
1217
+ <property name="width">1</property>
1218
+ <property name="height">1</property>
1219
+ </packing>
1220
+ </child>
1221
+ <child>
1222
+ <object class="GtkLabel" id="label16">
1223
+ <property name="visible">True</property>
1224
+ <property name="can_focus">False</property>
1225
+ <property name="label" translatable="yes">File</property>
1226
+ </object>
1227
+ <packing>
1228
+ <property name="left_attach">1</property>
1229
+ <property name="top_attach">0</property>
1230
+ <property name="width">1</property>
1231
+ <property name="height">1</property>
1232
+ </packing>
1233
+ </child>
1234
+ <child>
1235
+ <object class="GtkComboBox" id="combobox1">
1236
+ <property name="visible">True</property>
1237
+ <property name="can_focus">False</property>
1238
+ </object>
1239
+ <packing>
1240
+ <property name="left_attach">0</property>
1241
+ <property name="top_attach">1</property>
1242
+ <property name="width">1</property>
1243
+ <property name="height">1</property>
1244
+ </packing>
1245
+ </child>
1246
+ <child>
1247
+ <object class="GtkFileChooserButton" id="filechooserbutton1">
1248
+ <property name="visible">True</property>
1249
+ <property name="can_focus">False</property>
1250
+ <property name="orientation">vertical</property>
1251
+ </object>
1252
+ <packing>
1253
+ <property name="left_attach">1</property>
1254
+ <property name="top_attach">1</property>
1255
+ <property name="width">1</property>
1256
+ <property name="height">1</property>
1257
+ </packing>
1258
+ </child>
1259
+ </object>
1260
+ <packing>
1261
+ <property name="position">2</property>
1262
+ </packing>
1263
+ </child>
1264
+ <child type="tab">
1265
+ <object class="GtkLabel" id="label8">
1266
+ <property name="visible">True</property>
1267
+ <property name="can_focus">False</property>
1268
+ <property name="label" translatable="yes">Wallet</property>
1269
+ </object>
1270
+ <packing>
1271
+ <property name="position">2</property>
1272
+ <property name="tab_fill">False</property>
1273
+ </packing>
1274
+ </child>
1275
+ </object>
1276
+ <packing>
1277
+ <property name="expand">False</property>
1278
+ <property name="fill">True</property>
1279
+ <property name="position">1</property>
1280
+ </packing>
1281
+ </child>
1282
+ </object>
1283
+ </child>
1284
+ <action-widgets>
1285
+ <action-widget response="0">button7</action-widget>
1286
+ <action-widget response="0">button8</action-widget>
1287
+ </action-widgets>
1288
+ </object>
1289
+ <object class="GtkStatusIcon" id="statusicon">
1290
+ <property name="pixbuf">bitcoin-ruby.png</property>
1291
+ </object>
1292
+ <object class="GtkDialog" id="tx_dialog">
1293
+ <property name="can_focus">False</property>
1294
+ <property name="border_width">5</property>
1295
+ <property name="title" translatable="yes">Transaction</property>
1296
+ <property name="type_hint">dialog</property>
1297
+ <child internal-child="vbox">
1298
+ <object class="GtkBox" id="dialog-vbox6">
1299
+ <property name="can_focus">False</property>
1300
+ <property name="orientation">vertical</property>
1301
+ <property name="spacing">2</property>
1302
+ <child internal-child="action_area">
1303
+ <object class="GtkButtonBox" id="dialog-action_area6">
1304
+ <property name="can_focus">False</property>
1305
+ <property name="layout_style">end</property>
1306
+ <child>
1307
+ <placeholder/>
1308
+ </child>
1309
+ <child>
1310
+ <object class="GtkButton" id="button9">
1311
+ <property name="label">gtk-close</property>
1312
+ <property name="use_action_appearance">False</property>
1313
+ <property name="visible">True</property>
1314
+ <property name="can_focus">True</property>
1315
+ <property name="receives_default">True</property>
1316
+ <property name="use_action_appearance">False</property>
1317
+ <property name="use_stock">True</property>
1318
+ </object>
1319
+ <packing>
1320
+ <property name="expand">False</property>
1321
+ <property name="fill">True</property>
1322
+ <property name="position">1</property>
1323
+ </packing>
1324
+ </child>
1325
+ </object>
1326
+ <packing>
1327
+ <property name="expand">False</property>
1328
+ <property name="fill">True</property>
1329
+ <property name="pack_type">end</property>
1330
+ <property name="position">0</property>
1331
+ </packing>
1332
+ </child>
1333
+ <child>
1334
+ <object class="GtkGrid" id="grid6">
1335
+ <property name="visible">True</property>
1336
+ <property name="can_focus">False</property>
1337
+ <child>
1338
+ <object class="GtkLabel" id="tx_label_hash">
1339
+ <property name="visible">True</property>
1340
+ <property name="can_focus">False</property>
1341
+ <property name="label" translatable="yes">label</property>
1342
+ </object>
1343
+ <packing>
1344
+ <property name="left_attach">0</property>
1345
+ <property name="top_attach">0</property>
1346
+ <property name="width">4</property>
1347
+ <property name="height">1</property>
1348
+ </packing>
1349
+ </child>
1350
+ <child>
1351
+ <object class="GtkScrolledWindow" id="scrolledwindow4">
1352
+ <property name="visible">True</property>
1353
+ <property name="can_focus">True</property>
1354
+ <property name="shadow_type">in</property>
1355
+ <child>
1356
+ <object class="GtkTreeView" id="treeview2">
1357
+ <property name="visible">True</property>
1358
+ <property name="can_focus">True</property>
1359
+ <child internal-child="selection">
1360
+ <object class="GtkTreeSelection" id="treeview-selection6"/>
1361
+ </child>
1362
+ </object>
1363
+ </child>
1364
+ </object>
1365
+ <packing>
1366
+ <property name="left_attach">2</property>
1367
+ <property name="top_attach">3</property>
1368
+ <property name="width">2</property>
1369
+ <property name="height">2</property>
1370
+ </packing>
1371
+ </child>
1372
+ <child>
1373
+ <object class="GtkScrolledWindow" id="scrolledwindow5">
1374
+ <property name="visible">True</property>
1375
+ <property name="can_focus">True</property>
1376
+ <property name="shadow_type">in</property>
1377
+ <child>
1378
+ <object class="GtkTreeView" id="tx_txin_view">
1379
+ <property name="visible">True</property>
1380
+ <property name="can_focus">True</property>
1381
+ <child internal-child="selection">
1382
+ <object class="GtkTreeSelection" id="treeview-selection5"/>
1383
+ </child>
1384
+ </object>
1385
+ </child>
1386
+ </object>
1387
+ <packing>
1388
+ <property name="left_attach">0</property>
1389
+ <property name="top_attach">3</property>
1390
+ <property name="width">2</property>
1391
+ <property name="height">2</property>
1392
+ </packing>
1393
+ </child>
1394
+ <child>
1395
+ <object class="GtkLabel" id="label19">
1396
+ <property name="visible">True</property>
1397
+ <property name="can_focus">False</property>
1398
+ <property name="label" translatable="yes">Value:</property>
1399
+ </object>
1400
+ <packing>
1401
+ <property name="left_attach">0</property>
1402
+ <property name="top_attach">1</property>
1403
+ <property name="width">1</property>
1404
+ <property name="height">1</property>
1405
+ </packing>
1406
+ </child>
1407
+ <child>
1408
+ <object class="GtkLabel" id="tx_label_value">
1409
+ <property name="visible">True</property>
1410
+ <property name="can_focus">False</property>
1411
+ </object>
1412
+ <packing>
1413
+ <property name="left_attach">1</property>
1414
+ <property name="top_attach">1</property>
1415
+ <property name="width">1</property>
1416
+ <property name="height">1</property>
1417
+ </packing>
1418
+ </child>
1419
+ <child>
1420
+ <object class="GtkLabel" id="label21">
1421
+ <property name="visible">True</property>
1422
+ <property name="can_focus">False</property>
1423
+ <property name="label" translatable="yes">Confirmations:</property>
1424
+ </object>
1425
+ <packing>
1426
+ <property name="left_attach">2</property>
1427
+ <property name="top_attach">1</property>
1428
+ <property name="width">1</property>
1429
+ <property name="height">1</property>
1430
+ </packing>
1431
+ </child>
1432
+ <child>
1433
+ <object class="GtkLabel" id="tx_label_confirmations">
1434
+ <property name="visible">True</property>
1435
+ <property name="can_focus">False</property>
1436
+ </object>
1437
+ <packing>
1438
+ <property name="left_attach">3</property>
1439
+ <property name="top_attach">1</property>
1440
+ <property name="width">1</property>
1441
+ <property name="height">1</property>
1442
+ </packing>
1443
+ </child>
1444
+ <child>
1445
+ <object class="GtkLabel" id="label18">
1446
+ <property name="visible">True</property>
1447
+ <property name="can_focus">False</property>
1448
+ <property name="label" translatable="yes">Inputs</property>
1449
+ </object>
1450
+ <packing>
1451
+ <property name="left_attach">0</property>
1452
+ <property name="top_attach">2</property>
1453
+ <property name="width">2</property>
1454
+ <property name="height">1</property>
1455
+ </packing>
1456
+ </child>
1457
+ <child>
1458
+ <object class="GtkLabel" id="label20">
1459
+ <property name="visible">True</property>
1460
+ <property name="can_focus">False</property>
1461
+ <property name="label" translatable="yes">Outputs</property>
1462
+ </object>
1463
+ <packing>
1464
+ <property name="left_attach">2</property>
1465
+ <property name="top_attach">2</property>
1466
+ <property name="width">2</property>
1467
+ <property name="height">1</property>
1468
+ </packing>
1469
+ </child>
1470
+ </object>
1471
+ <packing>
1472
+ <property name="expand">False</property>
1473
+ <property name="fill">True</property>
1474
+ <property name="position">1</property>
1475
+ </packing>
1476
+ </child>
1477
+ </object>
1478
+ </child>
1479
+ <action-widgets>
1480
+ <action-widget response="0">button9</action-widget>
1481
+ </action-widgets>
1482
+ </object>
1483
+ <object class="GtkWindow" id="tx_window">
1484
+ <property name="can_focus">False</property>
1485
+ <child>
1486
+ <placeholder/>
1487
+ </child>
1488
+ </object>
1489
+ <object class="GtkFileChooserDialog" id="wallet_open_dialog">
1490
+ <property name="can_focus">False</property>
1491
+ <property name="border_width">5</property>
1492
+ <property name="title" translatable="yes">Open wallet</property>
1493
+ <property name="window_position">center-on-parent</property>
1494
+ <property name="type_hint">dialog</property>
1495
+ <signal name="response" handler="on_foobar" swapped="no"/>
1496
+ <child internal-child="vbox">
1497
+ <object class="GtkBox" id="filechooserdialog-vbox1">
1498
+ <property name="can_focus">False</property>
1499
+ <property name="orientation">vertical</property>
1500
+ <property name="spacing">2</property>
1501
+ <child internal-child="action_area">
1502
+ <object class="GtkButtonBox" id="filechooserdialog-action_area1">
1503
+ <property name="can_focus">False</property>
1504
+ <property name="layout_style">end</property>
1505
+ <child>
1506
+ <object class="GtkButton" id="button1">
1507
+ <property name="label">gtk-cancel</property>
1508
+ <property name="use_action_appearance">False</property>
1509
+ <property name="visible">True</property>
1510
+ <property name="can_focus">True</property>
1511
+ <property name="receives_default">True</property>
1512
+ <property name="use_action_appearance">False</property>
1513
+ <property name="use_stock">True</property>
1514
+ <signal name="clicked" handler="on_wallet_open_cancel" swapped="no"/>
1515
+ </object>
1516
+ <packing>
1517
+ <property name="expand">False</property>
1518
+ <property name="fill">True</property>
1519
+ <property name="position">0</property>
1520
+ </packing>
1521
+ </child>
1522
+ <child>
1523
+ <object class="GtkButton" id="button2">
1524
+ <property name="label">gtk-apply</property>
1525
+ <property name="use_action_appearance">False</property>
1526
+ <property name="visible">True</property>
1527
+ <property name="can_focus">True</property>
1528
+ <property name="receives_default">True</property>
1529
+ <property name="use_action_appearance">False</property>
1530
+ <property name="use_stock">True</property>
1531
+ <signal name="clicked" handler="on_wallet_open" swapped="no"/>
1532
+ </object>
1533
+ <packing>
1534
+ <property name="expand">False</property>
1535
+ <property name="fill">True</property>
1536
+ <property name="position">1</property>
1537
+ </packing>
1538
+ </child>
1539
+ </object>
1540
+ <packing>
1541
+ <property name="expand">False</property>
1542
+ <property name="fill">True</property>
1543
+ <property name="pack_type">end</property>
1544
+ <property name="position">0</property>
1545
+ </packing>
1546
+ </child>
1547
+ <child>
1548
+ <object class="GtkLabel" id="label1">
1549
+ <property name="visible">True</property>
1550
+ <property name="can_focus">False</property>
1551
+ <property name="label" translatable="yes">Select a wallet file</property>
1552
+ </object>
1553
+ <packing>
1554
+ <property name="expand">False</property>
1555
+ <property name="fill">True</property>
1556
+ <property name="position">2</property>
1557
+ </packing>
1558
+ </child>
1559
+ </object>
1560
+ </child>
1561
+ <action-widgets>
1562
+ <action-widget response="0">button1</action-widget>
1563
+ <action-widget response="1">button2</action-widget>
1564
+ </action-widgets>
1565
+ </object>
1566
+ <object class="GtkFileChooserDialog" id="wallet_save_dialog">
1567
+ <property name="can_focus">False</property>
1568
+ <property name="border_width">5</property>
1569
+ <property name="title" translatable="yes">Save wallet</property>
1570
+ <property name="type_hint">dialog</property>
1571
+ <property name="action">save</property>
1572
+ <signal name="update-preview" handler="on_wallet_save_dialog_update_preview" swapped="no"/>
1573
+ <child internal-child="vbox">
1574
+ <object class="GtkBox" id="filechooserdialog-vbox2">
1575
+ <property name="can_focus">False</property>
1576
+ <property name="orientation">vertical</property>
1577
+ <property name="spacing">2</property>
1578
+ <child internal-child="action_area">
1579
+ <object class="GtkButtonBox" id="filechooserdialog-action_area2">
1580
+ <property name="can_focus">False</property>
1581
+ <property name="layout_style">end</property>
1582
+ <child>
1583
+ <object class="GtkButton" id="button3">
1584
+ <property name="label">gtk-cancel</property>
1585
+ <property name="use_action_appearance">False</property>
1586
+ <property name="visible">True</property>
1587
+ <property name="can_focus">True</property>
1588
+ <property name="receives_default">True</property>
1589
+ <property name="use_action_appearance">False</property>
1590
+ <property name="use_stock">True</property>
1591
+ <signal name="clicked" handler="on_wallet_save_cancel" swapped="no"/>
1592
+ </object>
1593
+ <packing>
1594
+ <property name="expand">False</property>
1595
+ <property name="fill">True</property>
1596
+ <property name="position">0</property>
1597
+ </packing>
1598
+ </child>
1599
+ <child>
1600
+ <object class="GtkButton" id="button4">
1601
+ <property name="label">gtk-apply</property>
1602
+ <property name="use_action_appearance">False</property>
1603
+ <property name="visible">True</property>
1604
+ <property name="can_focus">True</property>
1605
+ <property name="receives_default">True</property>
1606
+ <property name="use_action_appearance">False</property>
1607
+ <property name="use_stock">True</property>
1608
+ <signal name="clicked" handler="on_wallet_save" swapped="no"/>
1609
+ </object>
1610
+ <packing>
1611
+ <property name="expand">False</property>
1612
+ <property name="fill">True</property>
1613
+ <property name="position">1</property>
1614
+ </packing>
1615
+ </child>
1616
+ </object>
1617
+ <packing>
1618
+ <property name="expand">False</property>
1619
+ <property name="fill">True</property>
1620
+ <property name="pack_type">end</property>
1621
+ <property name="position">0</property>
1622
+ </packing>
1623
+ </child>
1624
+ <child>
1625
+ <object class="GtkLabel" id="label3">
1626
+ <property name="visible">True</property>
1627
+ <property name="can_focus">False</property>
1628
+ <property name="label" translatable="yes">Choose a filename to save your wallet</property>
1629
+ </object>
1630
+ <packing>
1631
+ <property name="expand">False</property>
1632
+ <property name="fill">True</property>
1633
+ <property name="position">2</property>
1634
+ </packing>
1635
+ </child>
1636
+ </object>
1637
+ </child>
1638
+ <action-widgets>
1639
+ <action-widget response="0">button3</action-widget>
1640
+ <action-widget response="1">button4</action-widget>
1641
+ </action-widgets>
1642
+ </object>
1643
+ </interface>