sigma_rb 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +9 -0
  4. data/ext/Rakefile +7 -0
  5. data/ext/csigma.c +5 -0
  6. data/lib/sigma/address.rb +73 -0
  7. data/lib/sigma/block_header.rb +197 -0
  8. data/lib/sigma/box_selection.rb +105 -0
  9. data/lib/sigma/byte_array.rb +96 -0
  10. data/lib/sigma/constant.rb +117 -0
  11. data/lib/sigma/context_extension.rb +47 -0
  12. data/lib/sigma/contract.rb +70 -0
  13. data/lib/sigma/data_input.rb +100 -0
  14. data/lib/sigma/enums.rb +35 -0
  15. data/lib/sigma/ergo_box.rb +556 -0
  16. data/lib/sigma/ergo_box_candidate_builder.rb +123 -0
  17. data/lib/sigma/ergo_state_context.rb +41 -0
  18. data/lib/sigma/ergo_tree.rb +111 -0
  19. data/lib/sigma/input.rb +249 -0
  20. data/lib/sigma/merkle_proof.rb +79 -0
  21. data/lib/sigma/nipopow.rb +155 -0
  22. data/lib/sigma/pre_header.rb +38 -0
  23. data/lib/sigma/reduced_transaction.rb +88 -0
  24. data/lib/sigma/secret_key.rb +119 -0
  25. data/lib/sigma/structs.rb +31 -0
  26. data/lib/sigma/token.rb +225 -0
  27. data/lib/sigma/transaction.rb +365 -0
  28. data/lib/sigma/tx_builder.rb +116 -0
  29. data/lib/sigma/util.rb +27 -0
  30. data/lib/sigma/wallet.rb +97 -0
  31. data/lib/sigma.rb +32 -0
  32. data/sigma.gemspec +20 -0
  33. data/tests/all.rb +44 -0
  34. data/tests/sigma/address_test.rb +45 -0
  35. data/tests/sigma/block_header_test.rb +35 -0
  36. data/tests/sigma/box_selection_test.rb +78 -0
  37. data/tests/sigma/constant_test.rb +57 -0
  38. data/tests/sigma/context_extension_test.rb +16 -0
  39. data/tests/sigma/contract_test.rb +39 -0
  40. data/tests/sigma/data_input_test.rb +38 -0
  41. data/tests/sigma/ergo_box_candidate_builder_test.rb +76 -0
  42. data/tests/sigma/ergo_box_test.rb +219 -0
  43. data/tests/sigma/ergo_state_context_test.rb +26 -0
  44. data/tests/sigma/ergo_tree_test.rb +66 -0
  45. data/tests/sigma/input_test.rb +41 -0
  46. data/tests/sigma/merkle_proof_test.rb +34 -0
  47. data/tests/sigma/nipopow_test.rb +100 -0
  48. data/tests/sigma/secret_key_test.rb +31 -0
  49. data/tests/sigma/token_test.rb +87 -0
  50. data/tests/sigma/transaction_test.rb +438 -0
  51. data/tests/sigma_test.rb +18 -0
  52. data/tests/test_seeds.rb +35 -0
  53. data/tests/test_utils.rb +11 -0
  54. metadata +174 -0
@@ -0,0 +1,45 @@
1
+
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'test/unit'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::Address::Test < Test::Unit::TestCase
10
+ def test_testnet_addresses
11
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
12
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
13
+ assert_equal(p2pk_addr_str, p2pk_addr.to_base58(Sigma::NETWORK_PREFIX_ENUM[:testnet]))
14
+ assert_equal(Sigma::ADDRESS_TYPE_PREFIX_ENUM[:p2pk], p2pk_addr.type_prefix)
15
+
16
+ p2sh_addr_str = "rbcrmKEYduUvADj9Ts3dSVSG27h54pgrq5fPuwB"
17
+ p2sh_addr = Sigma::Address.with_testnet_address(p2sh_addr_str)
18
+ assert_equal(p2sh_addr_str, p2sh_addr.to_base58(Sigma::NETWORK_PREFIX_ENUM[:testnet]))
19
+ assert_equal(Sigma::ADDRESS_TYPE_PREFIX_ENUM[:pay2sh], p2sh_addr.type_prefix)
20
+ end
21
+
22
+ def test_mainnet_addresses
23
+ p2pk_addr_str = "9fRAWhdxEsTcdb8PhGNrZfwqa65zfkuYHAMmkQLcic1gdLSV5vA"
24
+ p2pk_addr = Sigma::Address.with_mainnet_address(p2pk_addr_str)
25
+ assert_equal(p2pk_addr_str, p2pk_addr.to_base58(Sigma::NETWORK_PREFIX_ENUM[:mainnet]))
26
+ assert_equal(Sigma::ADDRESS_TYPE_PREFIX_ENUM[:p2pk], p2pk_addr.type_prefix)
27
+
28
+ p2sh_addr_str = "8UApt8czfFVuTgQmMwtsRBZ4nfWquNiSwCWUjMg"
29
+ p2sh_addr = Sigma::Address.with_mainnet_address(p2sh_addr_str)
30
+ assert_equal(p2sh_addr_str, p2sh_addr.to_base58(Sigma::NETWORK_PREFIX_ENUM[:mainnet]))
31
+ assert_equal(Sigma::ADDRESS_TYPE_PREFIX_ENUM[:pay2sh], p2sh_addr.type_prefix)
32
+ end
33
+
34
+ def test_base58_address
35
+ addr_str = "9fRAWhdxEsTcdb8PhGNrZfwqa65zfkuYHAMmkQLcic1gdLSV5vA"
36
+ address = Sigma::Address.with_base58_address(addr_str)
37
+ assert_equal(addr_str, address.to_base58(Sigma::NETWORK_PREFIX_ENUM[:mainnet]))
38
+ end
39
+
40
+ def test_invalid_address
41
+ assert_raises do
42
+ Sigma::Address.with_mainnet_address("sss")
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::BlockHeader::Test < Test::Unit::TestCase
10
+ def test_block_header
11
+ header_json = TestSeeds.block_header_json
12
+ block_header = Sigma::BlockHeader.with_json(header_json)
13
+ assert_nothing_raised do
14
+ Sigma::PreHeader.with_block_header(block_header)
15
+ end
16
+ assert_raises do
17
+ Sigma::BlockHeader.from_json("")
18
+ end
19
+ headers = Sigma::BlockHeaders.create
20
+ assert_equal(nil, headers.get(0))
21
+ assert_equal(0, headers.len)
22
+ assert_nothing_raised do
23
+ headers.add(block_header)
24
+ end
25
+ assert_equal(1, headers.len)
26
+ assert_equal(block_header, headers.get(0))
27
+ assert_equal(nil, headers.get(1))
28
+ assert_nothing_raised do
29
+ headers.add(block_header)
30
+ end
31
+ assert_equal(2, headers.len)
32
+ assert_equal(block_header, headers.get(1))
33
+ assert_equal(nil, headers.get(2))
34
+ end
35
+ end
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::BoxSelection::Test < Test::Unit::TestCase
10
+ def test_box_selection
11
+ # create ergo boxes
12
+ box_id_str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
13
+ box_value_int = 67500000000
14
+ ergo_tree_encoded_str = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
15
+ tx_id_str = "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9"
16
+ creation_height = 284761
17
+ index = 1
18
+
19
+ box_id = Sigma::BoxId.with_string(box_id_str)
20
+ box_value = Sigma::BoxValue.from_i64(box_value_int)
21
+ ergo_tree = Sigma::ErgoTree.from_base16_encoded_string(ergo_tree_encoded_str)
22
+ contract = Sigma::Contract.from_ergo_tree(ergo_tree)
23
+ tx_id = Sigma::TxId.with_string(tx_id_str)
24
+ tokens = Sigma::Tokens.create
25
+ ergo_box = Sigma::ErgoBox.create(box_value: box_value, creation_height: creation_height,
26
+ contract: contract, tx_id: tx_id, index: index, tokens: tokens)
27
+ ergo_boxes = Sigma::ErgoBoxes.create
28
+ ergo_boxes.add(ergo_box)
29
+
30
+ # create change boxes
31
+ amount = 12345678
32
+ box_value = Sigma::BoxValue.from_i64(amount)
33
+ tokens = Sigma::Tokens.create
34
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
35
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
36
+ amount = 12345678
37
+ token_amount = Sigma::TokenAmount.with_i64(amount)
38
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
39
+ tokens.add(token)
40
+ ergo_box_assets_data = Sigma::ErgoBoxAssetsData.create(box_value: box_value, tokens: tokens)
41
+ change_boxes = Sigma::ErgoBoxAssetsDataList.create
42
+ change_boxes.add(ergo_box_assets_data)
43
+
44
+ selection = Sigma::BoxSelection.create(ergo_boxes: ergo_boxes, change_ergo_boxes: change_boxes)
45
+ retrieved_boxes = selection.get_boxes
46
+ assert_equal(ergo_boxes.len, retrieved_boxes.len)
47
+ assert_equal(ergo_boxes.get(0), retrieved_boxes.get(0))
48
+ assert_equal(ergo_boxes.get(1), retrieved_boxes.get(1))
49
+
50
+ retrieved_change_boxes = selection.get_change_boxes
51
+ assert_equal(change_boxes.len, retrieved_change_boxes.len)
52
+ assert_equal(change_boxes.get(0), retrieved_change_boxes.get(0))
53
+ assert_equal(change_boxes.get(1), retrieved_change_boxes.get(1))
54
+ end
55
+
56
+ def test_simple_box_selector
57
+ box_attrs = {
58
+ boxId: "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e",
59
+ value: 67500000000,
60
+ ergoTree: "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301",
61
+ assets: [],
62
+ creationHeight: 284761,
63
+ additionalRegisters: {},
64
+ transactionId: "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9",
65
+ index: 1
66
+ }
67
+
68
+ json = box_attrs.to_json
69
+ boxes = Sigma::ErgoBoxes.from_json([json])
70
+ sbs = Sigma::SimpleBoxSelector.create
71
+ value = Sigma::BoxValue.from_i64(10000000)
72
+ tokens = Sigma::Tokens.create
73
+ selection = sbs.select(inputs: boxes, target_balance: value, target_tokens: tokens)
74
+ expected_box_id = boxes.get(0).get_box_id
75
+ selected_box_id = selection.get_boxes.get(0).get_box_id
76
+ assert_equal(expected_box_id, selected_box_id)
77
+ end
78
+ end
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::Constant::Test < Test::Unit::TestCase
10
+ def test_i32
11
+ c = Sigma::Constant.with_i32(9999)
12
+ encoded = c.to_base16_string
13
+ decoded = Sigma::Constant.with_base_16(encoded)
14
+ assert_equal(c, decoded)
15
+ end
16
+
17
+ def test_i64
18
+ c = Sigma::Constant.with_i64(9223372036854775807)
19
+ encoded = c.to_base16_string
20
+ decoded = Sigma::Constant.with_base_16(encoded)
21
+ assert_equal(c, decoded)
22
+ end
23
+
24
+ def test_byte_array
25
+ bytes = [1,1,2,255]
26
+ c = Sigma::Constant.with_bytes(bytes)
27
+ encoded = c.to_base16_string
28
+ decoded = Sigma::Constant.with_base_16(encoded)
29
+ assert_equal(c, decoded)
30
+ end
31
+
32
+ def test_ec_point_bytes
33
+ str = "02d6b2141c21e4f337e9b065a031a6269fb5a49253094fc6243d38662eb765db00"
34
+ assert_nothing_raised do
35
+ Sigma::Constant.with_ecpoint_bytes(TestUtils.base16_string_to_bytes(str))
36
+ end
37
+ end
38
+
39
+ def test_ergo_box
40
+ json = {
41
+ "boxId": "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e",
42
+ "value": 67500000000,
43
+ "ergoTree": "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301",
44
+ "assets": [],
45
+ "creationHeight": 284761,
46
+ "additionalRegisters": {},
47
+ "transactionId": "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9",
48
+ "index": 1
49
+ }.to_json
50
+ ergo_box = Sigma::ErgoBox.with_json(json)
51
+ c = Sigma::Constant.with_ergo_box(ergo_box)
52
+ encoded = c.to_base16_string
53
+ decoded = Sigma::Constant.with_base_16(encoded)
54
+ assert_equal(c, decoded)
55
+ end
56
+ end
57
+
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::ContextExtension::Test < Test::Unit::TestCase
10
+ def test_context_extension
11
+ # create
12
+ ce = Sigma::ContextExtension.create
13
+ # get_keys
14
+ assert_equal([], ce.get_keys)
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+
5
+ require_relative '../../lib/sigma.rb'
6
+ require_relative '../test_utils.rb'
7
+
8
+ class Sigma::Contract::Test < Test::Unit::TestCase
9
+ def test_from_ergo_tree
10
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
11
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
12
+ contract = Sigma::Contract.from_ergo_tree(tree)
13
+ assert_equal(tree, contract.get_ergo_tree)
14
+ end
15
+
16
+ def test_pay_to_address
17
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
18
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
19
+ assert_nothing_raised do
20
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
21
+ end
22
+
23
+ p2pk_addr_str = "9fRAWhdxEsTcdb8PhGNrZfwqa65zfkuYHAMmkQLcic1gdLSV5vA"
24
+ p2pk_addr = Sigma::Address.with_mainnet_address(p2pk_addr_str)
25
+ assert_nothing_raised do
26
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
27
+ end
28
+ end
29
+
30
+ # TODO
31
+ # def test_compile_from_string
32
+ #script = <<-SCRIPT.chomp
33
+ #SCRIPT
34
+ #puts script
35
+ # assert_nothing_raised do
36
+ # contract = Sigma::Contract.compile_from_string(script)
37
+ # end
38
+ # end
39
+ end
@@ -0,0 +1,38 @@
1
+
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'test/unit'
5
+ require 'json'
6
+
7
+ require_relative '../../lib/sigma.rb'
8
+ require_relative '../test_utils.rb'
9
+
10
+ class Sigma::DataInput::Test < Test::Unit::TestCase
11
+ def test_data_input
12
+ str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
13
+ box_id = Sigma::BoxId.with_string(str)
14
+ data_input = Sigma::DataInput.with_box_id(box_id)
15
+ assert_equal(box_id, data_input.get_box_id)
16
+ end
17
+
18
+ def test_data_inputs
19
+ # create
20
+ data_inputs = assert_nothing_raised do
21
+ Sigma::DataInputs.create
22
+ end
23
+ # len
24
+ assert_equal(0, data_inputs.len)
25
+ # get
26
+ assert_equal(nil, data_inputs.get(0))
27
+ assert_equal(nil, data_inputs.get(1))
28
+ # add
29
+ str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
30
+ box_id = Sigma::BoxId.with_string(str)
31
+ data_input = Sigma::DataInput.with_box_id(box_id)
32
+ data_inputs.add(data_input)
33
+ assert_equal(1, data_inputs.len)
34
+ # no eq method for DataInput
35
+ assert_equal(box_id, data_inputs.get(0).get_box_id)
36
+ assert_equal(nil, data_inputs.get(1))
37
+ end
38
+ end
@@ -0,0 +1,76 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+
5
+ require_relative '../../lib/sigma.rb'
6
+ require_relative '../test_utils.rb'
7
+
8
+ class Sigma::ErgoBoxCandidateBuilder::Test < Test::Unit::TestCase
9
+ def test_create
10
+ amount = 12345678
11
+ box_value = Sigma::BoxValue.from_i64(amount)
12
+ base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
13
+ tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
14
+ contract = Sigma::Contract.from_ergo_tree(tree)
15
+ ebcb = Sigma::ErgoBoxCandidateBuilder.create(box_value: box_value, contract: contract, creation_height: 0)
16
+ end
17
+
18
+ def test_box_value
19
+ amount = 43000000
20
+ box_value = Sigma::BoxValue.from_i64(amount)
21
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
22
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
23
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
24
+ ebcb = assert_nothing_raised do
25
+ Sigma::ErgoBoxCandidateBuilder.create(box_value: box_value, contract: contract, creation_height: 0)
26
+ end
27
+
28
+ min_per_byte = 1000000
29
+ ebcb.set_min_box_value_per_byte(min_per_byte)
30
+ assert_equal(min_per_byte, ebcb.get_min_box_value_per_byte)
31
+ assert_nothing_raised do
32
+ ebcb.calc_box_size_bytes
33
+ end
34
+
35
+ new_amount = 123456789
36
+ new_box_value = Sigma::BoxValue.from_i64(new_amount)
37
+ ebcb.set_value(new_box_value)
38
+ assert_equal(new_box_value, ebcb.get_value)
39
+ end
40
+
41
+ def test_register_value
42
+ amount = 43000000
43
+ box_value = Sigma::BoxValue.from_i64(amount)
44
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
45
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
46
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
47
+ ebcb = assert_nothing_raised do
48
+ Sigma::ErgoBoxCandidateBuilder.create(box_value: box_value, contract: contract, creation_height: 0)
49
+ end
50
+ constant_val = 1
51
+ constant = Sigma::Constant.with_i32(constant_val)
52
+ ebcb.set_register_value(Sigma::REGISTER_ID_ENUM[:r4], constant)
53
+ assert_equal(constant, ebcb.get_register_value(Sigma::REGISTER_ID_ENUM[:r4]))
54
+ box = ebcb.build
55
+ assert_equal(constant, box.get_register_value(Sigma::REGISTER_ID_ENUM[:r4]))
56
+ end
57
+
58
+ def test_delete_register
59
+ amount = 43000000
60
+ box_value = Sigma::BoxValue.from_i64(amount)
61
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
62
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
63
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
64
+ ebcb = assert_nothing_raised do
65
+ Sigma::ErgoBoxCandidateBuilder.create(box_value: box_value, contract: contract, creation_height: 0)
66
+ end
67
+ constant_val = 1
68
+ constant = Sigma::Constant.with_i32(constant_val)
69
+ ebcb.set_register_value(Sigma::REGISTER_ID_ENUM[:r4], constant)
70
+ assert_equal(constant, ebcb.get_register_value(Sigma::REGISTER_ID_ENUM[:r4]))
71
+ ebcb = ebcb.delete_register_value(Sigma::REGISTER_ID_ENUM[:r4])
72
+ assert_equal(nil, ebcb.get_register_value(Sigma::REGISTER_ID_ENUM[:r4]))
73
+ box = ebcb.build
74
+ assert_equal(nil, box.get_register_value(Sigma::REGISTER_ID_ENUM[:r4]))
75
+ end
76
+ end
@@ -0,0 +1,219 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ class Sigma::ErgoBox::Test < Test::Unit::TestCase
10
+ def test_box_id
11
+ str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
12
+ box_id = Sigma::BoxId.with_string(str)
13
+ new_str = box_id.to_s
14
+ assert_equal(str, new_str)
15
+ new_bytes = box_id.to_bytes
16
+ expected_bytes = [229, 104, 71, 237, 25, 179, 220, 107, 114, 130, 143, 207, 185, 146, 253, 247, 49, 8, 40, 207, 41, 18, 33, 38, 155, 127, 252, 114, 253, 102, 112, 110]
17
+ assert_equal(expected_bytes, new_bytes)
18
+ end
19
+
20
+ def test_box_value
21
+ amount = 12345678
22
+ box_value = Sigma::BoxValue.from_i64(amount)
23
+ assert_equal(box_value.to_i64, amount)
24
+ end
25
+
26
+ def test_box_value_units_per_ergo
27
+ units_per_ergo = Sigma::BoxValue.units_per_ergo
28
+ expected_units_per_ergo = 1000000000
29
+ assert_equal(expected_units_per_ergo, units_per_ergo)
30
+ end
31
+
32
+ def test_box_value_sum_of
33
+ amount_one = 12345678
34
+ amount_two = 12345679
35
+ sum = amount_one + amount_two
36
+ bv_one = Sigma::BoxValue.from_i64(amount_one)
37
+ bv_two = Sigma::BoxValue.from_i64(amount_two)
38
+ bv_three = Sigma::BoxValue.sum_of(bv_one, bv_two)
39
+ assert_equal(bv_three.to_i64, sum)
40
+ end
41
+
42
+ def test_box_value_safe_user_min
43
+ bv = Sigma::BoxValue.safe_user_min
44
+ expected_safe_user_min = 1000000
45
+ assert_equal(expected_safe_user_min, bv.to_i64)
46
+ end
47
+
48
+ def test_ergo_box_initializer
49
+ box_id_str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
50
+ box_value_int = 67500000000
51
+ ergo_tree_encoded_str = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
52
+ tx_id_str = "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9"
53
+ creation_height = 284761
54
+ index = 1
55
+
56
+ box_id = Sigma::BoxId.with_string(box_id_str)
57
+ box_value = Sigma::BoxValue.from_i64(box_value_int)
58
+ ergo_tree = Sigma::ErgoTree.from_base16_encoded_string(ergo_tree_encoded_str)
59
+ contract = Sigma::Contract.from_ergo_tree(ergo_tree)
60
+ tx_id = Sigma::TxId.with_string(tx_id_str)
61
+ tokens = Sigma::Tokens.create
62
+ ergo_box = Sigma::ErgoBox.create(box_value: box_value, creation_height: creation_height,
63
+ contract: contract, tx_id: tx_id, index: index, tokens: tokens)
64
+
65
+ assert_equal(creation_height, ergo_box.get_creation_height)
66
+ assert_equal(box_id, ergo_box.get_box_id)
67
+ assert_equal(box_value, ergo_box.get_box_value)
68
+ assert_equal(ergo_tree, ergo_box.get_ergo_tree)
69
+ end
70
+
71
+ def test_ergo_box_json
72
+ box_id_str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
73
+ box_value_int = 67500000000
74
+ ergo_tree_encoded_str = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
75
+ tx_id_str = "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9"
76
+ creation_height = 284761
77
+ index = 1
78
+
79
+ box_id = Sigma::BoxId.with_string(box_id_str)
80
+ box_value = Sigma::BoxValue.from_i64(box_value_int)
81
+ ergo_tree = Sigma::ErgoTree.from_base16_encoded_string(ergo_tree_encoded_str)
82
+
83
+ payload = {
84
+ 'boxId' => box_id_str,
85
+ 'value' => box_value_int,
86
+ 'ergoTree' => ergo_tree_encoded_str,
87
+ 'assets' => [],
88
+ 'creationHeight' => creation_height,
89
+ 'additionalRegisters' => {},
90
+ 'transactionId' => tx_id_str,
91
+ 'index' => index
92
+ }
93
+ # EIP-12 Value can be a number or a string, in this case it is a string
94
+ payload_eip12 = payload.merge({'value' => box_value_int.to_s})
95
+
96
+ json_str = payload.to_json
97
+
98
+ ergo_box = Sigma::ErgoBox.with_json(json_str)
99
+
100
+ assert_equal(creation_height, ergo_box.get_creation_height)
101
+ assert_equal(box_id, ergo_box.get_box_id)
102
+ assert_equal(box_value, ergo_box.get_box_value)
103
+ assert_equal(ergo_tree, ergo_box.get_ergo_tree)
104
+ assert_equal(payload, JSON.parse(ergo_box.to_json))
105
+ assert_equal(payload_eip12, JSON.parse(ergo_box.to_json_eip12))
106
+ end
107
+
108
+ def test_ergo_boxes
109
+ box_id_str = "e56847ed19b3dc6b72828fcfb992fdf7310828cf291221269b7ffc72fd66706e"
110
+ box_value_int = 67500000000
111
+ ergo_tree_encoded_str = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
112
+ tx_id_str = "9148408c04c2e38a6402a7950d6157730fa7d49e9ab3b9cadec481d7769918e9"
113
+ creation_height = 284761
114
+ index = 1
115
+
116
+ box_id = Sigma::BoxId.with_string(box_id_str)
117
+ box_value = Sigma::BoxValue.from_i64(box_value_int)
118
+ ergo_tree = Sigma::ErgoTree.from_base16_encoded_string(ergo_tree_encoded_str)
119
+ contract = Sigma::Contract.from_ergo_tree(ergo_tree)
120
+ tx_id = Sigma::TxId.with_string(tx_id_str)
121
+ tokens = Sigma::Tokens.create
122
+ ergo_box = Sigma::ErgoBox.create(box_value: box_value, creation_height: creation_height,
123
+ contract: contract, tx_id: tx_id, index: index, tokens: tokens)
124
+
125
+ ergo_boxes = Sigma::ErgoBoxes.create
126
+ assert_equal(0, ergo_boxes.len)
127
+
128
+ ergo_boxes.add(ergo_box)
129
+ assert_equal(1, ergo_boxes.len)
130
+
131
+ retrieved_box = ergo_boxes.get(0)
132
+ assert_equal(ergo_box, retrieved_box)
133
+
134
+ nil_retrieved_box = ergo_boxes.get(1)
135
+ assert_equal(nil, nil_retrieved_box)
136
+
137
+ boxes_in_json = [ergo_box.to_json, retrieved_box.to_json]
138
+ ergo_boxes_from_json = Sigma::ErgoBoxes.from_json(boxes_in_json)
139
+ assert_equal(2, ergo_boxes_from_json.len)
140
+ assert_equal(ergo_box, ergo_boxes_from_json.get(0))
141
+ end
142
+
143
+ def test_ergo_box_candidates
144
+ # create
145
+ ebcs = assert_nothing_raised do
146
+ Sigma::ErgoBoxCandidates.create
147
+ end
148
+
149
+ # len
150
+ assert_equal(0, ebcs.len)
151
+
152
+ # get
153
+ assert_equal(nil, ebcs.get(0))
154
+ assert_equal(nil, ebcs.get(1))
155
+
156
+ # add
157
+ amount = 43000000
158
+ box_value = Sigma::BoxValue.from_i64(amount)
159
+ p2pk_addr_str = "3WvsT2Gm4EpsM9Pg18PdY6XyhNNMqXDsvJTbbf6ihLvAmSb7u5RN"
160
+ p2pk_addr = Sigma::Address.with_testnet_address(p2pk_addr_str)
161
+ contract = Sigma::Contract.pay_to_address(p2pk_addr)
162
+ ebcb = Sigma::ErgoBoxCandidateBuilder.create(box_value: box_value, contract: contract, creation_height: 0)
163
+ cbox = ebcb.build
164
+ ebcs.add(cbox)
165
+ assert_equal(1, ebcs.len)
166
+ assert_equal(cbox, ebcs.get(0))
167
+ assert_equal(nil, ebcs.get(1))
168
+ end
169
+
170
+ def test_ergo_box_assets_data
171
+ # create
172
+ amount = 12345678
173
+ box_value = Sigma::BoxValue.from_i64(amount)
174
+ tokens = Sigma::Tokens.create
175
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
176
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
177
+ amount = 12345678
178
+ token_amount = Sigma::TokenAmount.with_i64(amount)
179
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
180
+ tokens.add(token)
181
+ ergo_box_assets_data = Sigma::ErgoBoxAssetsData.create(box_value: box_value, tokens: tokens)
182
+ # get_box_value
183
+ assert_equal(box_value, ergo_box_assets_data.get_box_value)
184
+ # get_tokens
185
+ box_tokens = ergo_box_assets_data.get_box_tokens
186
+ assert_equal(tokens.len, box_tokens.len)
187
+ assert_equal(tokens.get(0), box_tokens.get(0))
188
+ assert_equal(tokens.get(1), box_tokens.get(1))
189
+ end
190
+
191
+ def test_ergo_box_assets_data_list
192
+ # create
193
+ ebs = assert_nothing_raised do
194
+ Sigma::ErgoBoxAssetsDataList.create
195
+ end
196
+
197
+ # len
198
+ assert_equal(0, ebs.len)
199
+
200
+ # get
201
+ assert_equal(nil, ebs.get(0))
202
+ assert_equal(nil, ebs.get(1))
203
+
204
+ # add
205
+ amount = 12345678
206
+ box_value = Sigma::BoxValue.from_i64(amount)
207
+ tokens = Sigma::Tokens.create
208
+ str = "19475d9a78377ff0f36e9826cec439727bea522f6ffa3bda32e20d2f8b3103ac"
209
+ token_id = Sigma::TokenId.from_base16_encoded_string(str)
210
+ amount = 12345678
211
+ token_amount = Sigma::TokenAmount.with_i64(amount)
212
+ token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
213
+ tokens.add(token)
214
+ ergo_box_assets_data = Sigma::ErgoBoxAssetsData.create(box_value: box_value, tokens: tokens)
215
+ ebs.add(ergo_box_assets_data)
216
+ assert_equal(1, ebs.len)
217
+ assert_equal(ergo_box_assets_data, ebs.get(0))
218
+ end
219
+ end
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'json'
5
+
6
+ require_relative '../../lib/sigma.rb'
7
+ require_relative '../test_utils.rb'
8
+
9
+ include Sigma
10
+
11
+ class ErgoStateContext::Test < Test::Unit::TestCase
12
+ def test_ergo_state_context
13
+ block_header = BlockHeader.with_json(TestSeeds.block_header_json)
14
+ pre_header = PreHeader.with_block_header(block_header)
15
+ block_headers = TestSeeds.block_headers_from_json
16
+ assert_nothing_raised do
17
+ ctx = ErgoStateContext.create(pre_header: pre_header, headers: block_headers)
18
+ end
19
+ # invalid # of headers
20
+ invalid_headers_json = Array.new(8) { TestSeeds.block_header_json }
21
+ invalid_block_headers = BlockHeaders.from_json(invalid_headers_json)
22
+ assert_raises do
23
+ ctx = ErgoStateContext.create(pre_header: pre_header, headers: invalid_block_headers)
24
+ end
25
+ end
26
+ end