block_io 1.2.1 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.appveyor.yml-disabled +26 -0
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/LICENSE +1 -1
- data/README.md +24 -15
- data/block_io.gemspec +9 -7
- data/examples/basic.rb +32 -10
- data/examples/dtrust.rb +59 -42
- data/examples/proxy.rb +36 -0
- data/examples/sweeper.rb +24 -14
- data/lib/block_io.rb +16 -411
- data/lib/block_io/api_exception.rb +11 -0
- data/lib/block_io/chainparams/BTC.yml +8 -0
- data/lib/block_io/chainparams/BTCTEST.yml +8 -0
- data/lib/block_io/chainparams/DOGE.yml +8 -0
- data/lib/block_io/chainparams/DOGETEST.yml +8 -0
- data/lib/block_io/chainparams/LTC.yml +8 -0
- data/lib/block_io/chainparams/LTCTEST.yml +8 -0
- data/lib/block_io/client.rb +244 -0
- data/lib/block_io/extended_bitcoinrb.rb +127 -0
- data/lib/block_io/helper.rb +322 -0
- data/lib/block_io/key.rb +38 -0
- data/lib/block_io/version.rb +1 -1
- data/spec/client_misc_spec.rb +76 -0
- data/spec/client_spec.rb +68 -0
- data/spec/dtrust_spec.rb +167 -0
- data/spec/helper_spec.rb +154 -0
- data/spec/key_spec.rb +92 -0
- data/spec/larger_transaction_spec.rb +351 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/sweep_spec.rb +115 -0
- data/spec/test-cases/.gitignore +2 -0
- data/spec/test-cases/LICENSE +21 -0
- data/spec/test-cases/README.md +2 -0
- data/spec/test-cases/json/create_and_sign_transaction_response.json +61 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_P2WSH-over-P2SH_1of2_251inputs.json +1261 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_P2WSH-over-P2SH_1of2_252inputs.json +1266 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_P2WSH-over-P2SH_1of2_253inputs.json +1271 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_P2WSH-over-P2SH_1of2_762inputs.json +3816 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2SH_3of5_195inputs.json +2931 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2SH_4of5_195inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_3of5_251inputs.json +3771 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_3of5_252inputs.json +3786 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_3of5_253inputs.json +3801 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_4of5_251inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_4of5_252inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_P2WSH-over-P2SH_4of5_253inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_3of5_251inputs.json +3771 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_3of5_252inputs.json +3786 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_3of5_253inputs.json +3801 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_4of5_251inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_4of5_252inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_WITNESS_V0_4of5_253inputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_p2sh_3_of_5_keys.json +21 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_p2sh_4_of_5_keys.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_p2wsh_over_p2sh_3_of_5_keys.json +21 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_p2wsh_over_p2sh_4_of_5_keys.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_3_of_5_keys.json +36 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_3of5_251outputs.json +591 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_3of5_252outputs.json +576 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_3of5_253outputs.json +531 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_4_of_5_keys.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_4of5_251outputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_4of5_252outputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_dtrust_witness_v0_4of5_253outputs.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_sweep_p2pkh.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_sweep_p2wpkh.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_sweep_p2wpkh_over_p2sh.json +5 -0
- data/spec/test-cases/json/create_and_sign_transaction_response_with_blockio_fee_and_expected_unsigned_txid.json +21 -0
- data/spec/test-cases/json/get_balance_response.json +8 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2SH_3of5_195inputs.json +1397 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2SH_4of5_195inputs.json +1397 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_3of5_251inputs.json +1795 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_3of5_252inputs.json +1802 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_3of5_253inputs.json +1809 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_4of5_251inputs.json +1789 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_4of5_252inputs.json +1802 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_P2WSH-over-P2SH_4of5_253inputs.json +1809 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_3of5_251inputs.json +1795 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_3of5_252inputs.json +1802 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_3of5_253inputs.json +1809 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_4of5_251inputs.json +1795 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_4of5_252inputs.json +1802 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_WITNESS_V0_4of5_253inputs.json +1809 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_p2sh.json +45 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_p2wsh_over_p2sh.json +45 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0.json +52 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_3of5_251outputs.json +1805 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_3of5_252outputs.json +1804 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_3of5_253outputs.json +1789 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_4of5_251outputs.json +1805 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_4of5_252outputs.json +1804 -0
- data/spec/test-cases/json/prepare_dtrust_transaction_response_witness_v0_4of5_253outputs.json +1789 -0
- data/spec/test-cases/json/prepare_sweep_transaction_response_p2pkh.json +35 -0
- data/spec/test-cases/json/prepare_sweep_transaction_response_p2wpkh.json +35 -0
- data/spec/test-cases/json/prepare_sweep_transaction_response_p2wpkh_over_p2sh.json +35 -0
- data/spec/test-cases/json/prepare_transaction_response.json +164 -0
- data/spec/test-cases/json/prepare_transaction_response_P2WSH-over-P2SH_1of2_251inputs.json +1796 -0
- data/spec/test-cases/json/prepare_transaction_response_P2WSH-over-P2SH_1of2_252inputs.json +1803 -0
- data/spec/test-cases/json/prepare_transaction_response_P2WSH-over-P2SH_1of2_253inputs.json +1810 -0
- data/spec/test-cases/json/prepare_transaction_response_P2WSH-over-P2SH_1of2_762inputs.json +5367 -0
- data/spec/test-cases/json/prepare_transaction_response_with_blockio_fee_and_expected_unsigned_txid.json +76 -0
- data/spec/test-cases/json/summarize_prepared_transaction_response_with_blockio_fee_and_expected_unsigned_txid.json +6 -0
- metadata +270 -44
- data/examples/change.rb +0 -117
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04ac726371db4f0ba948b04d19cf556427c593029ec883f1883c4c37bf215e3e
|
4
|
+
data.tar.gz: b705bb847c6af978f583580762e05183403478612866c63fb76377508c748aeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5706382a756eb2d06c8ee744dac42ac09c83a8b48465a3d7b2d602829d2c8c0879ae4e7aa9adc4fff63665de84ecbb00c8f4f7ec9160dd3b70c54163e1f44b48
|
7
|
+
data.tar.gz: 44483df6c48b4d839f33173939a388bb7bb674881d920c9e987776b8452be3dcae92847c145f70764972e2e709b649e31967e6b1be27db71b346d1a6334eba73
|
@@ -0,0 +1,26 @@
|
|
1
|
+
version: '{build}'
|
2
|
+
|
3
|
+
skip_tags: true
|
4
|
+
|
5
|
+
environment:
|
6
|
+
matrix:
|
7
|
+
- ruby_version: "24"
|
8
|
+
- ruby_version: "24-x64"
|
9
|
+
- ruby_version: "25"
|
10
|
+
- ruby_version: "25-x64"
|
11
|
+
- ruby_version: "26"
|
12
|
+
- ruby_version: "26-x64"
|
13
|
+
- ruby_version: "27"
|
14
|
+
- ruby_version: "27-x64"
|
15
|
+
- ruby_version: "30"
|
16
|
+
- ruby_version: "30-x64"
|
17
|
+
|
18
|
+
install:
|
19
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
20
|
+
- gem install bundler --no-document -v 2.1.4
|
21
|
+
- bundle install --retry=3
|
22
|
+
|
23
|
+
test_script:
|
24
|
+
- bundle exec rspec
|
25
|
+
|
26
|
+
build: off
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--require spec_helper
|
data/.travis.yml
ADDED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# BlockIo
|
2
2
|
|
3
|
-
This Ruby Gem is the official reference client for the Block.io
|
3
|
+
This Ruby Gem is the official reference client for the Block.io's infrastructure APIs. To use this, you will need the Dogecoin, Bitcoin, or Litecoin API key(s) from <a href="https://block.io" target="_blank">Block.io</a>. Go ahead, sign up :)
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -10,35 +10,44 @@ Add this line to your application's Gemfile:
|
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
13
|
-
$ bundle
|
13
|
+
$ bundle install
|
14
14
|
|
15
15
|
Or install it yourself as:
|
16
16
|
|
17
|
-
$ gem install block_io
|
17
|
+
$ gem install block_io
|
18
18
|
|
19
19
|
## Changelog
|
20
|
+
*07/21/21*: Version 3.0.2 fixes Litecoin P2SH address version.
|
21
|
+
*06/09/21*: Version 3.0.1 implements use of dynamic decryption algorithms.
|
22
|
+
*04/14/21*: BREAKING CHANGES. Version 3.0.0. Remove support for Ruby < 2.4.0, and Windows. Behavior and interfaces have changed. By upgrading you'll need to revise your code and tests.
|
20
23
|
|
21
|
-
|
22
|
-
*
|
23
|
-
*
|
24
|
-
*
|
25
|
-
*
|
26
|
-
*
|
27
|
-
|
24
|
+
## Important Notes
|
25
|
+
* This gem depends on the bitcoinrb gem. By using this gem, your application will load the bitcoinrb gem as well with the Bitcoin namespace. It may conflict with another gem using the same namespace.
|
26
|
+
* Transaction endpoints are updated as of v3.0.0.
|
27
|
+
* See the examples/ folder for basic examples.
|
28
|
+
* Be careful to test thoroughly before production.
|
29
|
+
* Use of this software is subject to its LICENSE.
|
28
30
|
|
29
31
|
## Usage
|
30
32
|
|
31
33
|
It's super easy to get started. In your Ruby shell ($ irb), for example, do this:
|
32
34
|
|
33
35
|
require 'block_io'
|
34
|
-
BlockIo.
|
35
|
-
|
36
|
+
blockio = BlockIo::Client.new(:api_key => "API KEY", :pin => "SECRET PIN")
|
37
|
+
|
38
|
+
If you do not have your PIN, or just wish to use your private key backup(s) directly, do this instead:
|
39
|
+
|
40
|
+
blockio = BlockIo::Client.new(:api_key => "API KEY")
|
41
|
+
blockio.get_balance
|
42
|
+
blockio.prepare_transaction(..., :keys => [BlockIo::Key.from_wif("PRIVATE_KEY_BACKUP_IN_WIF").private_key_hex])
|
43
|
+
|
36
44
|
And you're good to go:
|
37
45
|
|
38
|
-
|
39
|
-
|
46
|
+
blockio.get_new_address
|
47
|
+
blockio.get_my_addresses
|
40
48
|
|
41
|
-
For
|
49
|
+
For other initialization options/parameters, see `lib/block_io/client.rb`.
|
50
|
+
For more information, see https://block.io/api/simple/ruby.
|
42
51
|
|
43
52
|
## Contributing
|
44
53
|
|
data/block_io.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'block_io/version'
|
@@ -16,12 +15,15 @@ Gem::Specification.new do |spec|
|
|
16
15
|
spec.files = `git ls-files -z`.split("\x0")
|
17
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.required_ruby_version = '>= 2.4.0'
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler", "
|
22
|
-
spec.add_development_dependency "rake", "~> 0"
|
23
|
-
spec.
|
24
|
-
spec.
|
25
|
-
spec.add_runtime_dependency "
|
26
|
-
spec.add_runtime_dependency "
|
21
|
+
spec.add_development_dependency "bundler", ">= 1.16", "< 3.0"
|
22
|
+
spec.add_development_dependency "rake", "~> 13.0", ">= 13.0"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.6", ">= 3.6"
|
24
|
+
spec.add_development_dependency "webmock", "~> 3.12", "< 4.0"
|
25
|
+
spec.add_runtime_dependency "bitcoinrb", "~> 0.7.0", "= 0.7.0"
|
26
|
+
spec.add_runtime_dependency "http", ">= 4.4.1", "< 6.0"
|
27
|
+
spec.add_runtime_dependency "oj", "~> 3.0", "< 4.0"
|
28
|
+
spec.add_runtime_dependency "connection_pool", ">= 2.2", "< 3.0"
|
27
29
|
end
|
data/examples/basic.rb
CHANGED
@@ -3,26 +3,48 @@
|
|
3
3
|
# basic example: $ API_KEY=TESTNET_API_KEY PIN=YOUR_SECRET_PIN ruby basic.rb
|
4
4
|
# bundler example: $ API_KEY=TESTNET_API_KEY PIN=YOUR_SECRET_PIN bundle exec ruby basic.rb
|
5
5
|
#
|
6
|
-
# adjust amount below if not using the
|
6
|
+
# adjust amount below if not using the Litecoin Testnet
|
7
7
|
|
8
8
|
require 'block_io'
|
9
9
|
|
10
|
-
|
10
|
+
blockio = BlockIo::Client.new(:api_key => ENV['API_KEY'], :pin => ENV['PIN'])
|
11
|
+
puts blockio.get_balance
|
12
|
+
puts blockio.network
|
11
13
|
|
14
|
+
# create the address if it doesn't exist
|
12
15
|
begin
|
13
|
-
puts
|
14
|
-
rescue
|
15
|
-
# if this failed, we probably created testDest label before
|
16
|
+
puts blockio.get_new_address(:label => 'testDest')
|
17
|
+
rescue BlockIo::APIException => e
|
16
18
|
puts e.to_s
|
17
19
|
end
|
20
|
+
puts " -- "
|
18
21
|
|
19
|
-
|
22
|
+
# retrieve unspent outputs and other relevant data to create and sign the transaction
|
23
|
+
# you will inspect the prepared transaction for things like network fees being paid, block.io fees being paid, validating what destination addresses receive how much, etc.
|
24
|
+
prepared_transaction = blockio.prepare_transaction(:to_label => 'testDest', :amount => '0.012345')
|
25
|
+
puts JSON.pretty_generate(prepared_transaction)
|
26
|
+
puts " -- "
|
20
27
|
|
21
|
-
|
28
|
+
# a summary of what's in the prepared transaction
|
29
|
+
# for in-depth review of the transaction, look at the prepared_transaction object yourself
|
30
|
+
puts JSON.pretty_generate(blockio.summarize_prepared_transaction(prepared_transaction))
|
31
|
+
puts " -- "
|
22
32
|
|
23
|
-
|
33
|
+
# once satisfied with the prepared transaction, create and sign it
|
34
|
+
# inspect this again if you wish, it will contain the transaction payload in hexadecimal form you want Block.io to sign and broadcast
|
35
|
+
transaction_data = blockio.create_and_sign_transaction(prepared_transaction)
|
36
|
+
puts JSON.pretty_generate(transaction_data)
|
37
|
+
puts " -- "
|
24
38
|
|
25
|
-
|
39
|
+
# ask Block.io to sign and broadcast the transaction
|
40
|
+
puts JSON.pretty_generate(blockio.submit_transaction(:transaction_data => transaction_data))
|
41
|
+
puts " -- "
|
26
42
|
|
27
|
-
puts
|
43
|
+
puts blockio.get_address_balance(:labels => 'default,testDest')
|
44
|
+
|
45
|
+
puts blockio.get_transactions(:type => 'sent')
|
46
|
+
|
47
|
+
puts blockio.get_transactions(:type => 'received')
|
48
|
+
|
49
|
+
puts blockio.get_current_price(:base_price => 'BTC')
|
28
50
|
|
data/examples/dtrust.rb
CHANGED
@@ -1,32 +1,51 @@
|
|
1
|
-
# creates a new destination address,
|
1
|
+
# creates a new dTrust destination address, sends coins to it, withdraws coins from it, gets sent transactions, and the current price
|
2
2
|
|
3
3
|
require 'block_io'
|
4
4
|
require 'json'
|
5
5
|
|
6
|
-
# please use the
|
6
|
+
# please use the Litecoin Testnet API key here
|
7
7
|
puts "*** Initialize BlockIo library: "
|
8
|
-
|
8
|
+
blockio = BlockIo::Client.new(:api_key => ENV['API_KEY'], :pin => ENV['PIN'])
|
9
9
|
|
10
|
+
puts blockio.get_dtrust_balance
|
11
|
+
puts blockio.network
|
12
|
+
|
13
|
+
raise "Please use the LTCTEST network API Key here or modify this script for another network." unless blockio.network == "LTCTEST"
|
10
14
|
|
11
15
|
# create 4 keys
|
12
|
-
|
16
|
+
# you will generate your own private keys, for instance: key = BlockIo::Key.generate.
|
17
|
+
# you will need to record key.to_wif (private key in Wallet Import Format (WIF)) somewhere safe before you use your keys to generate dTrust addresses.
|
18
|
+
# if you already have hex private keys, load the keys (see below). Ensure the key's public_key (key.public_key_hex) matches what you expect.
|
19
|
+
# WARNING: The keys below are just for demonstration, DO NOT use them on mainnets, DO NOT use insecurely generated keys
|
20
|
+
# WARNING: You must ALWAYS use compressed public keys. Use of uncompressed public keys can lead to lost coins when using SegWit addresses.
|
21
|
+
|
22
|
+
# these keys will use the appropriate coin's parameters. The library will know what network you're interacting with once you make a successful API call first, like blockio.get_dtrust_balance above
|
23
|
+
|
24
|
+
keys = [
|
25
|
+
"b515fd806a662e061b488e78e5d0c2ff46df80083a79818e166300666385c0a2", # alpha1alpha2alpha3alpha4
|
26
|
+
"1584b821c62ecdc554e185222591720d6fe651ed1b820d83f92cdc45c5e21f", # alpha2alpha3alpha4alpha1
|
27
|
+
"2f9090b8aa4ddb32c3b0b8371db1b50e19084c720c30db1d6bb9fcd3a0f78e61", # alpha3alpha4alpha1alpha2
|
28
|
+
"6c1cefdfd9187b36b36c3698c1362642083dcc1941dc76d751481d3aa29ca65" # alpha4alpha1alpha2alpha3
|
29
|
+
].freeze
|
13
30
|
|
14
31
|
dtrust_address = nil
|
32
|
+
dtrust_address_label = "dTrust1_witness_v0"
|
15
33
|
|
16
34
|
begin
|
17
35
|
# let's create a new address with all 4 keys as signers, but only 3 signers required (i.e., 4 of 5 multisig, with 1 signature being Block.io)
|
36
|
+
# you will need all 4 of your keys to use your address without interacting with Block.io
|
18
37
|
|
19
|
-
signers =
|
20
|
-
keys.each { |key| signers += ',' if signers.length > 0; signers += key.public_key; }
|
38
|
+
signers = keys.map{|x| BlockIo::Key.from_private_key_hex(x)}.map(&:public_key_hex).join(',')
|
21
39
|
|
22
|
-
response =
|
40
|
+
response = blockio.get_new_dtrust_address(:label => dtrust_address_label, :public_keys => signers, :required_signatures => 3, :address_type => "witness_v0")
|
23
41
|
|
24
42
|
dtrust_address = response['data']['address']
|
25
|
-
|
43
|
+
|
44
|
+
rescue BlockIo::APIException => e
|
26
45
|
# if this failed, we probably created the same label before. let's fetch the address then.
|
27
46
|
puts e.to_s
|
28
47
|
|
29
|
-
response =
|
48
|
+
response = blockio.get_dtrust_address_by_label(:label => dtrust_address_label)
|
30
49
|
|
31
50
|
dtrust_address = response['data']['address']
|
32
51
|
end
|
@@ -34,57 +53,55 @@ end
|
|
34
53
|
puts "*** Our dTrust Address: #{dtrust_address}"
|
35
54
|
|
36
55
|
# let's deposit some coins into this new address
|
37
|
-
response = BlockIo.withdraw_from_labels(:from_labels => 'default', :to_address => dtrust_address, :amount => '3.5')
|
38
56
|
|
39
|
-
|
40
|
-
|
57
|
+
# blockio.prepare_transaction gets the appropriate data you need to create and sign your transaction. You will need to inspect it to ensure things are as expected yourself.
|
58
|
+
prepared_transaction = blockio.prepare_transaction(:to_address => dtrust_address, :amount => '0.001')
|
41
59
|
|
60
|
+
puts JSON.pretty_generate(prepared_transaction)
|
61
|
+
puts " -- "
|
42
62
|
|
43
|
-
|
44
|
-
puts "
|
45
|
-
puts JSON.pretty_generate(BlockIo.get_dtrust_address_balance(:label => 'dTrust1'))
|
46
|
-
|
47
|
-
# withdraw a few coins from dtrust1 to the default label
|
48
|
-
normal_address = BlockIo.get_address_by_label(:label => 'default')['data']['address']
|
63
|
+
puts JSON.pretty_generate(blockio.summarize_prepared_transaction(prepared_transaction))
|
64
|
+
puts " -- "
|
49
65
|
|
50
|
-
|
66
|
+
# blockio.create_and_sign_transaction creates the transaction client-side, and appends your signatures (if any)
|
67
|
+
transaction_data = blockio.create_and_sign_transaction(prepared_transaction)
|
51
68
|
|
52
|
-
|
69
|
+
# blockio.submit_transaction sends the signatures and transaction payload to Block.io so Block.io can add its signatures and broadcast the transaction to the network
|
70
|
+
response = blockio.submit_transaction(:transaction_data => transaction_data)
|
53
71
|
|
72
|
+
puts "*** Withdrawal response:"
|
54
73
|
puts JSON.pretty_generate(response)
|
55
74
|
|
56
|
-
# let's sign for the public keys specified
|
57
|
-
|
58
|
-
response['data']['inputs'].each do |input|
|
59
|
-
# for each input
|
60
75
|
|
61
|
-
|
76
|
+
# fetch the dtrust address' balance
|
77
|
+
puts "*** dtrust_address_label Balance:"
|
78
|
+
puts JSON.pretty_generate(blockio.get_dtrust_address_balance(:label => dtrust_address_label))
|
62
79
|
|
63
|
-
|
80
|
+
# withdraw a few coins from dtrust_address_label to the default label
|
81
|
+
normal_address = blockio.get_address_by_label(:label => 'default')['data']['address']
|
64
82
|
|
65
|
-
|
66
|
-
|
67
|
-
keys.each do |key|
|
68
|
-
# iterate over all keys till we've found the one that we need
|
83
|
+
puts "*** Withdrawing from dtrust_address_label to the 'default' label in normal multisig"
|
69
84
|
|
70
|
-
|
85
|
+
# note use of prepare_dtrust_transaction instead of prepare_transaction, since this is a dTrust transaction
|
86
|
+
# we're not doing any inspection here, but you will in your own code
|
87
|
+
prepared_transaction = blockio.prepare_dtrust_transaction(:from_labels => dtrust_address_label, :to_addresses => normal_address, :amounts => '0.0009')
|
71
88
|
|
72
|
-
|
89
|
+
# create the transaction and sign it with the keys we've provided
|
90
|
+
# we're signing the transaction partially by supplying only 3 of our 4 keys
|
91
|
+
transaction_data = blockio.create_and_sign_transaction(prepared_transaction, keys.first(3))
|
73
92
|
|
74
|
-
|
93
|
+
puts "*** Submitting transaction data:"
|
94
|
+
puts JSON.pretty_generate(transaction_data)
|
75
95
|
|
76
|
-
|
77
|
-
|
78
|
-
puts "*** Our signed response: "
|
79
|
-
puts JSON.pretty_generate(response['data']) #.to_json
|
96
|
+
# if successful, you will get a transaction ID when you submit_transaction.
|
97
|
+
response = blockio.submit_transaction(:transaction_data => transaction_data)
|
80
98
|
|
81
99
|
# let's final the withdrawal
|
82
|
-
puts "***
|
83
|
-
puts JSON.pretty_generate(
|
100
|
+
puts "*** Submit the transaction: "
|
101
|
+
puts JSON.pretty_generate(response)
|
84
102
|
|
85
103
|
# get the sent transactions for this dTrust address
|
86
104
|
|
87
|
-
puts "*** Get transactions sent by our
|
88
|
-
|
89
|
-
puts JSON.pretty_generate(BlockIo.get_dtrust_transactions(:type => 'sent', :labels => 'dTrust1'))
|
105
|
+
puts "*** Get transactions sent by our dtrust_address_label address: "
|
106
|
+
puts JSON.pretty_generate(blockio.get_dtrust_transactions(:type => 'sent', :labels => dtrust_address_label))
|
90
107
|
|
data/examples/proxy.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# creates a new destination address, withdraws from the default label to it,
|
2
|
+
# gets updated address balances, gets sent/received transactions, and the
|
3
|
+
# current price
|
4
|
+
# ... through an https proxy (like Squid)
|
5
|
+
#
|
6
|
+
# Unauthenticated:
|
7
|
+
# $ PROXY_HOST=localhost PROXY_PORT=3128 API_KEY=TESTNET_API_KEY PIN=YOUR_SECRET_PIN ruby proxy.rb
|
8
|
+
#
|
9
|
+
# Authenticated:
|
10
|
+
# $ PROXY_HOST=localhost PROXY_PORT=3128 PROXY_USER=user PROXY_PASS=pass API_KEY=TESTNET_API_KEY PIN=YOUR_SECRET_PIN ruby proxy.rb
|
11
|
+
#
|
12
|
+
# adjust amount below if not using the Dogecoin Testnet
|
13
|
+
|
14
|
+
require '../lib/block_io'
|
15
|
+
|
16
|
+
blockio = BlockIo::Client.new(:api_key => ENV['API_KEY'], :pin => ENV['PIN'], :version => 2, :proxy => {
|
17
|
+
:hostname => ENV['PROXY_HOST'],
|
18
|
+
:port => ENV['PROXY_PORT'],
|
19
|
+
:username => ENV['PROXY_USER'],
|
20
|
+
:password => ENV['PROXY_PASS']
|
21
|
+
})
|
22
|
+
puts blockio.get_balance
|
23
|
+
puts blockio.network
|
24
|
+
|
25
|
+
# create the address if it doesn't exist
|
26
|
+
puts blockio.get_new_address(:label => 'testDest')
|
27
|
+
|
28
|
+
puts blockio.withdraw_from_labels(:from_labels => 'default', :to_label => 'testDest', :amount => '2.5')
|
29
|
+
|
30
|
+
puts blockio.get_address_balance(:labels => 'default,testDest')
|
31
|
+
|
32
|
+
puts blockio.get_transactions(:type => 'sent')
|
33
|
+
|
34
|
+
puts blockio.get_transactions(:type => 'received')
|
35
|
+
|
36
|
+
puts blockio.get_current_price(:base_price => 'BTC')
|
data/examples/sweeper.rb
CHANGED
@@ -4,21 +4,31 @@
|
|
4
4
|
#
|
5
5
|
# Contact support@block.io if you have any issues
|
6
6
|
|
7
|
-
require
|
7
|
+
require 'block_io'
|
8
8
|
|
9
|
-
BlockIo.
|
9
|
+
blockio = BlockIo::Client.new(:api_key => ENV['API_KEY'])
|
10
10
|
|
11
|
-
to_address = '
|
11
|
+
to_address = ENV['TO_ADDRESS'] # sweep coins into this address
|
12
|
+
private_key = ENV['PRIVATE_KEY'] # private key for the address from which you wish to sweep coins (WIF)
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
# prepare the sweep transaction
|
15
|
+
# you will inspect this data to ensure things are in order (the network fees you pay, the amount being swept, etc.)
|
16
|
+
# the private key is used to determine the public key by prepare_sweep_transaction client-side
|
17
|
+
# the private key never travels to Block.io
|
18
|
+
prepared_transaction = blockio.prepare_sweep_transaction(:to_address => to_address, :private_key => private_key)
|
19
|
+
puts JSON.pretty_generate(prepared_transaction)
|
20
|
+
puts " -- "
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
# create and sign the transaction
|
23
|
+
# the signature is from the key you provided to prepare_sweep_transaction above
|
24
|
+
transaction_data = blockio.create_and_sign_transaction(prepared_transaction)
|
25
|
+
puts JSON.pretty_generate(transaction_data)
|
26
|
+
puts " -- "
|
27
|
+
|
28
|
+
# submit the final transaction to Block.io for broadcast to the network, or
|
29
|
+
# submit the transaction payload youself elsewhere (like using sendrawtransaction RPC calls with bitcoind, dogecoind, litecoind, etc.)
|
30
|
+
response = blockio.submit_transaction(:transaction_data => transaction_data)
|
31
|
+
puts JSON.pretty_generate(response)
|
32
|
+
puts " -- "
|
33
|
+
|
34
|
+
puts "Transaction ID: #{response['data']['txid']}"
|