sigma_rb 0.1.3

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