bitcoin-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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>