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,88 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ReducedTransaction
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_reduced_tx_delete, [:pointer], :void
11
+ attach_function :ergo_lib_reduced_tx_from_unsigned_tx, [:pointer, :pointer, :pointer, :pointer, :pointer], :error_pointer
12
+ attach_function :ergo_lib_reduced_tx_unsigned_tx, [:pointer, :pointer], :void
13
+ attr_accessor :pointer
14
+
15
+ def self.from_unsigned_tx(unsigned_tx:, boxes_to_spend:, data_boxes:, state_context:)
16
+ pointer = FFI::MemoryPointer.new(:pointer)
17
+ error = ergo_lib_reduced_tx_from_unsigned_tx(
18
+ unsigned_tx.pointer,
19
+ boxes_to_spend.pointer,
20
+ data_boxes.pointer,
21
+ state_context.pointer,
22
+ pointer
23
+ )
24
+ Util.check_error!(error)
25
+ init(pointer)
26
+ end
27
+
28
+ def self.with_raw_pointer(pointer)
29
+ init(pointer)
30
+ end
31
+
32
+ def get_unsigned_transaction
33
+ pointer = FFI::MemoryPointer.new(:pointer)
34
+ ergo_lib_reduced_tx_unsigned_tx(self.pointer, pointer)
35
+ UnsignedTransaction.with_raw_pointer(pointer)
36
+ end
37
+
38
+ private
39
+
40
+ def self.init(unread_pointer)
41
+ obj = self.new
42
+ obj_ptr = unread_pointer.get_pointer(0)
43
+
44
+ obj.pointer = FFI::AutoPointer.new(
45
+ obj_ptr,
46
+ method(:ergo_lib_reduced_tx_delete)
47
+ )
48
+ obj
49
+ end
50
+ end
51
+
52
+ class Propositions
53
+ extend FFI::Library
54
+ ffi_lib FFI::Compiler::Loader.find('csigma')
55
+ typedef :pointer, :error_pointer
56
+ attach_function :ergo_lib_propositions_delete, [:pointer], :void
57
+ attach_function :ergo_lib_propositions_new, [:pointer], :void
58
+ attach_function :ergo_lib_propositions_add_proposition_from_bytes, [:pointer, :pointer, :uint], :error_pointer
59
+ attr_accessor :pointer
60
+
61
+ def self.create
62
+ pointer = FFI::MemoryPointer.new(:pointer)
63
+ ergo_lib_propositions_new(pointer)
64
+ init(pointer)
65
+ end
66
+
67
+ def add_proposition(bytes)
68
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
69
+ b_ptr.write_array_of_uint8(bytes)
70
+ error = ergo_lib_propositions_add_proposition_from_bytes(self.pointer, b_ptr, bytes.size)
71
+ Util.check_error!(error)
72
+ end
73
+
74
+ private
75
+
76
+ def self.init(unread_pointer)
77
+ obj = self.new
78
+ obj_ptr = unread_pointer.get_pointer(0)
79
+
80
+ obj.pointer = FFI::AutoPointer.new(
81
+ obj_ptr,
82
+ method(:ergo_lib_propositions_delete)
83
+ )
84
+ obj
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,119 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class SecretKey
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_secret_key_delete, [:pointer], :void
11
+ attach_function :ergo_lib_secret_key_generate_random, [:pointer], :void
12
+ attach_function :ergo_lib_secret_key_from_bytes, [:pointer, :pointer], :error_pointer
13
+ attach_function :ergo_lib_secret_key_get_address, [:pointer, :pointer], :void
14
+ attach_function :ergo_lib_secret_key_to_bytes, [:pointer, :pointer], :void
15
+
16
+ attr_accessor :pointer
17
+
18
+ def self.create
19
+ pointer = FFI::MemoryPointer.new(:pointer)
20
+ ergo_lib_secret_key_generate_random(pointer)
21
+ init(pointer)
22
+ end
23
+
24
+ def self.from_bytes(bytes)
25
+ pointer = FFI::MemoryPointer.new(:pointer)
26
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
27
+ b_ptr.write_array_of_uint8(bytes)
28
+ error = ergo_lib_secret_key_from_bytes(b_ptr, pointer)
29
+ Util.check_error!(error)
30
+ init(pointer)
31
+ end
32
+
33
+ def self.with_raw_pointer(pointer)
34
+ init(pointer)
35
+ end
36
+
37
+ def get_address
38
+ pointer = FFI::MemoryPointer.new(:pointer)
39
+ ergo_lib_secret_key_get_address(self.pointer, pointer)
40
+ Sigma::Address.with_raw_pointer(pointer)
41
+ end
42
+
43
+ def to_bytes
44
+ bytes_len = 32
45
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes_len)
46
+ ergo_lib_secret_key_to_bytes(self.pointer, b_ptr)
47
+ b_ptr.get_array_of_uint8(0, bytes_len)
48
+ end
49
+
50
+ private
51
+
52
+ def self.init(unread_pointer)
53
+ obj = self.new
54
+ obj_ptr = unread_pointer.get_pointer(0)
55
+
56
+ obj.pointer = FFI::AutoPointer.new(
57
+ obj_ptr,
58
+ method(:ergo_lib_secret_key_delete)
59
+ )
60
+ obj
61
+ end
62
+ end
63
+
64
+ class SecretKeys
65
+ extend FFI::Library
66
+ ffi_lib FFI::Compiler::Loader.find('csigma')
67
+ typedef :pointer, :error_pointer
68
+ attach_function :ergo_lib_secret_keys_new, [:pointer], :void
69
+ attach_function :ergo_lib_secret_keys_delete, [:pointer], :void
70
+ attach_function :ergo_lib_secret_keys_add, [:pointer, :pointer], :void
71
+ attach_function :ergo_lib_secret_keys_len, [:pointer], :uint8
72
+ attach_function :ergo_lib_secret_keys_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
73
+
74
+ attr_accessor :pointer
75
+
76
+ def self.with_raw_pointer(unread_pointer)
77
+ init(unread_pointer)
78
+ end
79
+
80
+ def self.create
81
+ pointer = FFI::MemoryPointer.new(:pointer)
82
+ ergo_lib_secret_keys_new(pointer)
83
+
84
+ init(pointer)
85
+ end
86
+
87
+ def len
88
+ ergo_lib_secret_keys_len(self.pointer)
89
+ end
90
+
91
+ def add(secret_key)
92
+ ergo_lib_secret_keys_add(secret_key.pointer, self.pointer)
93
+ end
94
+
95
+ def get(index)
96
+ pointer = FFI::MemoryPointer.new(:pointer)
97
+ res = ergo_lib_secret_keys_get(self.pointer, index, pointer)
98
+ Util.check_error!(res[:error])
99
+ if res[:is_some]
100
+ Sigma::SecretKey.with_raw_pointer(pointer)
101
+ else
102
+ nil
103
+ end
104
+ end
105
+
106
+ private
107
+
108
+ def self.init(unread_pointer)
109
+ obj = self.new
110
+ obj_ptr = unread_pointer.get_pointer(0)
111
+
112
+ obj.pointer = FFI::AutoPointer.new(
113
+ obj_ptr,
114
+ method(:ergo_lib_secret_keys_delete)
115
+ )
116
+ obj
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,31 @@
1
+ require 'ffi'
2
+
3
+ module Sigma
4
+ extend FFI::Library
5
+ typedef :pointer, :error_pointer
6
+
7
+ class ReturnOption < FFI::Struct
8
+ layout :is_some, :bool,
9
+ :error, :error_pointer
10
+ end
11
+
12
+ class ReturnNumUsize < FFI::Struct
13
+ layout :value, :uint,
14
+ :error, :error_pointer
15
+ end
16
+
17
+ class ReturnNumI32 < FFI::Struct
18
+ layout :value, :int32,
19
+ :error, :error_pointer
20
+ end
21
+
22
+ class ReturnNumI64 < FFI::Struct
23
+ layout :value, :int64,
24
+ :error, :error_pointer
25
+ end
26
+
27
+ class ReturnBool < FFI::Struct
28
+ layout :value, :bool,
29
+ :error, :error_pointer
30
+ end
31
+ end
@@ -0,0 +1,225 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class TokenAmount
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_token_amount_delete, [:pointer], :void
11
+ attach_function :ergo_lib_token_amount_from_i64, [:int64, :pointer], :error_pointer
12
+ attach_function :ergo_lib_token_amount_as_i64, [:pointer], :int64
13
+ attach_function :ergo_lib_token_amount_eq, [:pointer, :pointer], :bool
14
+ attr_accessor :pointer
15
+
16
+ def self.with_raw_pointer(unread_pointer)
17
+ init(unread_pointer)
18
+ end
19
+
20
+ def self.with_i64(int)
21
+ ptr = FFI::MemoryPointer.new(:pointer)
22
+ error = ergo_lib_token_amount_from_i64(int, ptr)
23
+ Util.check_error!(error)
24
+
25
+ init(ptr)
26
+ end
27
+
28
+ def to_i
29
+ ergo_lib_token_amount_as_i64(self.pointer)
30
+ end
31
+
32
+ def ==(token_amount_two)
33
+ ergo_lib_token_amount_eq(self.pointer, token_amount_two.pointer)
34
+ end
35
+
36
+ private
37
+
38
+ def self.init(unread_pointer)
39
+ obj = self.new
40
+ obj_ptr = unread_pointer.get_pointer(0)
41
+
42
+ obj.pointer = FFI::AutoPointer.new(
43
+ obj_ptr,
44
+ method(:ergo_lib_token_amount_delete)
45
+ )
46
+ obj
47
+ end
48
+ end
49
+
50
+ class TokenId
51
+ extend FFI::Library
52
+ ffi_lib FFI::Compiler::Loader.find('csigma')
53
+ typedef :pointer, :error_pointer
54
+ attach_function :ergo_lib_token_id_from_box_id, [:pointer, :pointer], :void
55
+ attach_function :ergo_lib_token_id_from_str, [:pointer, :pointer], :error_pointer
56
+ attach_function :ergo_lib_token_id_delete, [:pointer], :void
57
+ attach_function :ergo_lib_token_id_eq, [:pointer, :pointer], :bool
58
+ attach_function :ergo_lib_token_id_to_str, [:pointer, :pointer], :void
59
+ attr_accessor :pointer
60
+
61
+ def self.with_raw_pointer(tid_pointer)
62
+ init(tid_pointer)
63
+ end
64
+
65
+ def self.with_box_id(box_id)
66
+ tid_ptr = FFI::MemoryPointer.new(:pointer)
67
+ ergo_lib_token_id_from_box_id(box_id.pointer, tid_ptr)
68
+
69
+ init(tid_ptr)
70
+ end
71
+
72
+ def self.from_base16_encoded_string(str)
73
+ tid_ptr = FFI::MemoryPointer.new(:pointer)
74
+ error = ergo_lib_token_id_from_str(str, tid_ptr)
75
+ Util.check_error!(error)
76
+
77
+ init(tid_ptr)
78
+ end
79
+
80
+ def to_base16_encoded_string
81
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
82
+ ergo_lib_token_id_to_str(self.pointer, s_ptr)
83
+ s_ptr = s_ptr.read_pointer()
84
+ str = s_ptr.read_string().force_encoding('UTF-8')
85
+ Util.ergo_lib_delete_string(s_ptr)
86
+ str
87
+ end
88
+
89
+ def ==(token_id_two)
90
+ ergo_lib_token_id_eq(self.pointer, token_id_two.pointer)
91
+ end
92
+
93
+ private
94
+
95
+ def self.init(unread_pointer)
96
+ obj = self.new
97
+ obj_ptr = unread_pointer.get_pointer(0)
98
+
99
+ obj.pointer = FFI::AutoPointer.new(
100
+ obj_ptr,
101
+ method(:ergo_lib_token_id_delete)
102
+ )
103
+ obj
104
+ end
105
+ end
106
+
107
+ class Token
108
+ extend FFI::Library
109
+ ffi_lib FFI::Compiler::Loader.find('csigma')
110
+ typedef :pointer, :error_pointer
111
+ attach_function :ergo_lib_token_new, [:pointer, :pointer, :pointer], :void
112
+ attach_function :ergo_lib_token_get_id, [:pointer, :pointer], :void
113
+ attach_function :ergo_lib_token_get_amount, [:pointer, :pointer], :void
114
+ attach_function :ergo_lib_token_delete, [:pointer], :void
115
+ attach_function :ergo_lib_token_to_json_eip12, [:pointer, :pointer], :error_pointer
116
+ attach_function :ergo_lib_token_eq, [:pointer, :pointer], :bool
117
+ attr_accessor :pointer
118
+
119
+ def self.create(token_id:, token_amount:)
120
+ pointer = FFI::MemoryPointer.new(:pointer)
121
+ ergo_lib_token_new(token_id.pointer, token_amount.pointer, pointer)
122
+
123
+ init(pointer)
124
+ end
125
+
126
+ def self.with_raw_pointer(pointer)
127
+ init(pointer)
128
+ end
129
+
130
+ def get_id
131
+ pointer = FFI::MemoryPointer.new(:pointer)
132
+ ergo_lib_token_get_id(self.pointer, pointer)
133
+ Sigma::TokenId.with_raw_pointer(pointer)
134
+ end
135
+
136
+ def get_amount
137
+ pointer = FFI::MemoryPointer.new(:pointer)
138
+ ergo_lib_token_get_amount(self.pointer, pointer)
139
+ Sigma::TokenAmount.with_raw_pointer(pointer)
140
+ end
141
+
142
+ def to_json_eip12
143
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
144
+ error = ergo_lib_token_to_json_eip12(self.pointer, s_ptr)
145
+ Util.check_error!(error)
146
+ s_ptr = s_ptr.read_pointer()
147
+ str = s_ptr.read_string().force_encoding('UTF-8')
148
+ Util.ergo_lib_delete_string(s_ptr)
149
+ str
150
+ end
151
+
152
+ def ==(token_two)
153
+ ergo_lib_token_eq(self.pointer, token_two.pointer)
154
+ end
155
+
156
+ private
157
+
158
+ def self.init(unread_pointer)
159
+ obj = self.new
160
+ obj_ptr = unread_pointer.get_pointer(0)
161
+
162
+ obj.pointer = FFI::AutoPointer.new(
163
+ obj_ptr,
164
+ method(:ergo_lib_token_delete)
165
+ )
166
+ obj
167
+ end
168
+ end
169
+
170
+ class Tokens
171
+ extend FFI::Library
172
+ ffi_lib FFI::Compiler::Loader.find('csigma')
173
+ typedef :pointer, :error_pointer
174
+ attach_function :ergo_lib_tokens_delete, [:pointer], :void
175
+ attach_function :ergo_lib_tokens_new, [:pointer], :void
176
+ attach_function :ergo_lib_tokens_len, [:pointer], :uint8
177
+ attach_function :ergo_lib_tokens_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
178
+ attach_function :ergo_lib_tokens_add, [:pointer, :pointer], :error_pointer
179
+ attr_accessor :pointer
180
+
181
+ def self.create
182
+ pointer = FFI::MemoryPointer.new(:pointer)
183
+ ergo_lib_tokens_new(pointer)
184
+ init(pointer)
185
+ end
186
+
187
+ def self.with_raw_pointer(tokens_ptr)
188
+ init(tokens_ptr)
189
+ end
190
+
191
+ def len
192
+ ergo_lib_tokens_len(self.pointer)
193
+ end
194
+
195
+ def get(index)
196
+ token_pointer = FFI::MemoryPointer.new(:pointer)
197
+ res = ergo_lib_tokens_get(self.pointer, index, token_pointer)
198
+ Util.check_error!(res[:error])
199
+ if res[:is_some]
200
+ Sigma::Token.with_raw_pointer(token_pointer)
201
+ else
202
+ nil
203
+ end
204
+ end
205
+
206
+ def add(token)
207
+ error = ergo_lib_tokens_add(token.pointer, self.pointer)
208
+ Util.check_error!(error)
209
+ end
210
+
211
+ private
212
+
213
+ def self.init(unread_pointer)
214
+ obj = self.new
215
+ obj_ptr = unread_pointer.get_pointer(0)
216
+
217
+ obj.pointer = FFI::AutoPointer.new(
218
+ obj_ptr,
219
+ method(:ergo_lib_tokens_delete)
220
+ )
221
+ obj
222
+ end
223
+ end
224
+ end
225
+