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,556 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+ require 'json'
5
+
6
+ module Sigma
7
+ class BoxId
8
+ extend FFI::Library
9
+ ffi_lib FFI::Compiler::Loader.find('csigma')
10
+ typedef :pointer, :error_pointer
11
+ attach_function :ergo_lib_box_id_from_str, [:string, :pointer], :error_pointer
12
+ attach_function :ergo_lib_box_id_to_str, [:pointer, :pointer], :void
13
+ attach_function :ergo_lib_box_id_eq, [:pointer, :pointer], :bool
14
+ attach_function :ergo_lib_box_id_delete, [:pointer], :void
15
+ attach_function :ergo_lib_box_id_to_bytes, [:pointer, :pointer], :void
16
+
17
+ attr_accessor :pointer
18
+
19
+ def self.with_raw_pointer(bid_ptr)
20
+ init(bid_ptr)
21
+ end
22
+
23
+ def self.with_string(str)
24
+ bid_ptr = FFI::MemoryPointer.new(:pointer)
25
+ error = ergo_lib_box_id_from_str(str, bid_ptr)
26
+ Util.check_error!(error)
27
+
28
+ init(bid_ptr)
29
+ end
30
+
31
+ def to_bytes
32
+ b_ptr = FFI::MemoryPointer.new(:uint8, 32)
33
+ ergo_lib_box_id_to_bytes(self.pointer, b_ptr)
34
+ b_ptr.get_array_of_uint8(0, 32)
35
+ end
36
+
37
+ def to_s
38
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
39
+ ergo_lib_box_id_to_str(self.pointer, s_ptr)
40
+ s_ptr = s_ptr.read_pointer()
41
+ str = s_ptr.read_string().force_encoding('UTF-8')
42
+ Util.ergo_lib_delete_string(s_ptr)
43
+ str
44
+ end
45
+
46
+ def ==(box_id_two)
47
+ ergo_lib_box_id_eq(self.pointer, box_id_two.pointer)
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_box_id_delete)
59
+ )
60
+ obj
61
+ end
62
+ end
63
+
64
+ class BoxValue
65
+ extend FFI::Library
66
+ ffi_lib FFI::Compiler::Loader.find('csigma')
67
+ typedef :pointer, :error_pointer
68
+ attach_function :ergo_lib_box_value_delete, [:pointer], :void
69
+ attach_function :ergo_lib_box_value_eq, [:pointer, :pointer], :bool
70
+ attach_function :ergo_lib_box_value_from_i64, [:int64, :pointer], :error_pointer
71
+ attach_function :ergo_lib_box_value_as_i64, [:pointer], :int64
72
+ attach_function :ergo_lib_box_value_units_per_ergo, [], :int64
73
+ attach_function :ergo_lib_box_value_sum_of, [:pointer, :pointer, :pointer], :error_pointer
74
+ attach_function :ergo_lib_box_value_safe_user_min, [:pointer], :void
75
+
76
+ attr_accessor :pointer
77
+
78
+ def self.with_raw_pointer(bv_pointer)
79
+ init(bv_pointer)
80
+ end
81
+
82
+ def self.units_per_ergo
83
+ ergo_lib_box_value_units_per_ergo
84
+ end
85
+
86
+ def self.safe_user_min
87
+ bv_ptr = FFI::MemoryPointer.new(:pointer)
88
+ ergo_lib_box_value_safe_user_min(bv_ptr)
89
+
90
+ init(bv_ptr)
91
+ end
92
+
93
+ def self.sum_of(bv_one, bv_two)
94
+ bv_ptr = FFI::MemoryPointer.new(:pointer)
95
+ error = ergo_lib_box_value_sum_of(bv_one.pointer, bv_two.pointer, bv_ptr)
96
+ Util.check_error!(error)
97
+
98
+ init(bv_ptr)
99
+ end
100
+
101
+ def self.from_i64(int)
102
+ bv_ptr = FFI::MemoryPointer.new(:pointer)
103
+ error = ergo_lib_box_value_from_i64(int, bv_ptr)
104
+ Util.check_error!(error)
105
+
106
+ init(bv_ptr)
107
+ end
108
+
109
+ def to_i64
110
+ ergo_lib_box_value_as_i64(self.pointer)
111
+ end
112
+
113
+ def ==(box_value_two)
114
+ ergo_lib_box_value_eq(self.pointer, box_value_two.pointer)
115
+ end
116
+
117
+ private
118
+
119
+ def self.init(unread_pointer)
120
+ obj = self.new
121
+ obj_ptr = unread_pointer.get_pointer(0)
122
+
123
+ obj.pointer = FFI::AutoPointer.new(
124
+ obj_ptr,
125
+ method(:ergo_lib_box_value_delete)
126
+ )
127
+ obj
128
+ end
129
+ end
130
+
131
+ class ErgoBoxCandidate
132
+ extend FFI::Library
133
+ ffi_lib FFI::Compiler::Loader.find('csigma')
134
+ typedef :pointer, :error_pointer
135
+ attach_function :ergo_lib_ergo_box_candidate_eq, [:pointer, :pointer], :bool
136
+ attach_function :ergo_lib_ergo_box_candidate_delete, [:pointer], :void
137
+ attach_function :ergo_lib_ergo_box_candidate_box_value, [:pointer, :pointer], :void
138
+ attach_function :ergo_lib_ergo_box_candidate_ergo_tree, [:pointer, :pointer], :void
139
+ attach_function :ergo_lib_ergo_box_candidate_tokens, [:pointer, :pointer], :void
140
+ attach_function :ergo_lib_ergo_box_candidate_creation_height, [:pointer], :uint32
141
+ attach_function :ergo_lib_ergo_box_candidate_register_value, [:pointer, Sigma::REGISTER_ID_ENUM, :pointer], ReturnOption.by_value
142
+
143
+ attr_accessor :pointer
144
+
145
+ def self.with_raw_pointer(pointer)
146
+ init(pointer)
147
+ end
148
+
149
+ def get_register_value(register_id)
150
+ constant_ptr = FFI::MemoryPointer.new(:pointer)
151
+ res = ergo_lib_ergo_box_candidate_register_value(self.pointer, register_id, constant_ptr)
152
+ Util.check_error!(res[:error])
153
+ if res[:is_some]
154
+ Sigma::Constant.with_raw_pointer(constant_ptr)
155
+ else
156
+ nil
157
+ end
158
+ end
159
+
160
+ def get_creation_height
161
+ ergo_lib_ergo_box_candidate_creation_height(self.pointer)
162
+ end
163
+
164
+ def get_tokens
165
+ pointer = FFI::MemoryPointer.new(:pointer)
166
+ ergo_lib_ergo_box_candidate_tokens(self.pointer, pointer)
167
+ Sigma::Tokens.with_raw_pointer(pointer)
168
+ end
169
+
170
+ def get_ergo_tree
171
+ pointer = FFI::MemoryPointer.new(:pointer)
172
+ ergo_lib_ergo_box_candidate_ergo_tree(self.pointer, pointer)
173
+ Sigma::ErgoTree.with_raw_pointer(pointer)
174
+ end
175
+
176
+ def get_box_value
177
+ pointer = FFI::MemoryPointer.new(:pointer)
178
+ ergo_lib_ergo_box_candidate_box_value(self.pointer, pointer)
179
+ Sigma::BoxValue.with_raw_pointer(pointer)
180
+ end
181
+
182
+ def ==(ebc_two)
183
+ ergo_lib_ergo_box_candidate_eq(self.pointer, ebc_two.pointer)
184
+ end
185
+
186
+ private
187
+
188
+ def self.init(unread_pointer)
189
+ obj = self.new
190
+ obj_ptr = unread_pointer.get_pointer(0)
191
+
192
+ obj.pointer = FFI::AutoPointer.new(
193
+ obj_ptr,
194
+ method(:ergo_lib_ergo_box_candidate_delete)
195
+ )
196
+ obj
197
+ end
198
+ end
199
+
200
+ class ErgoBoxCandidates
201
+ extend FFI::Library
202
+ ffi_lib FFI::Compiler::Loader.find('csigma')
203
+ typedef :pointer, :error_pointer
204
+ attach_function :ergo_lib_ergo_box_candidates_new, [:pointer], :void
205
+ attach_function :ergo_lib_ergo_box_candidates_delete, [:pointer], :void
206
+ attach_function :ergo_lib_ergo_box_candidates_add, [:pointer, :pointer], :void
207
+ attach_function :ergo_lib_ergo_box_candidates_len, [:pointer], :uint8
208
+ attach_function :ergo_lib_ergo_box_candidates_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
209
+
210
+ attr_accessor :pointer
211
+
212
+ def self.create
213
+ pointer = FFI::MemoryPointer.new(:pointer)
214
+ ergo_lib_ergo_box_candidates_new(pointer)
215
+
216
+ init(pointer)
217
+ end
218
+
219
+ def self.with_raw_pointer(pointer)
220
+ init(pointer)
221
+ end
222
+
223
+ def len
224
+ ergo_lib_ergo_box_candidates_len(self.pointer)
225
+ end
226
+
227
+ def add(ergo_box_candidate)
228
+ ergo_lib_ergo_box_candidates_add(ergo_box_candidate.pointer, self.pointer)
229
+ end
230
+
231
+ def get(index)
232
+ pointer = FFI::MemoryPointer.new(:pointer)
233
+ res = ergo_lib_ergo_box_candidates_get(self.pointer, index, pointer)
234
+ Util.check_error!(res[:error])
235
+ if res[:is_some]
236
+ Sigma::ErgoBoxCandidate.with_raw_pointer(pointer)
237
+ else
238
+ nil
239
+ end
240
+ end
241
+
242
+ private
243
+
244
+ def self.init(unread_pointer)
245
+ obj = self.new
246
+ obj_ptr = unread_pointer.get_pointer(0)
247
+
248
+ obj.pointer = FFI::AutoPointer.new(
249
+ obj_ptr,
250
+ method(:ergo_lib_ergo_box_candidates_delete)
251
+ )
252
+ obj
253
+ end
254
+ end
255
+
256
+ class ErgoBox
257
+ extend FFI::Library
258
+ ffi_lib FFI::Compiler::Loader.find('csigma')
259
+ typedef :pointer, :error_pointer
260
+
261
+ attach_function :ergo_lib_ergo_box_id, [:pointer, :pointer], :void
262
+ attach_function :ergo_lib_ergo_box_creation_height, [:pointer], :uint32
263
+ attach_function :ergo_lib_ergo_box_tokens, [:pointer, :pointer], :void
264
+ attach_function :ergo_lib_ergo_box_ergo_tree, [:pointer, :pointer], :void
265
+ attach_function :ergo_lib_ergo_box_value, [:pointer, :pointer], :void
266
+ attach_function :ergo_lib_ergo_box_register_value, [:pointer, Sigma::REGISTER_ID_ENUM, :pointer], ReturnOption.by_value
267
+ attach_function :ergo_lib_ergo_box_new, [:pointer,:uint32, :pointer, :pointer, :uint16, :pointer, :pointer], :error_pointer
268
+ attach_function :ergo_lib_ergo_box_delete, [:pointer], :void
269
+ attach_function :ergo_lib_ergo_box_eq, [:pointer, :pointer], :bool
270
+ attach_function :ergo_lib_ergo_box_from_json, [:pointer, :pointer], :error_pointer
271
+ attach_function :ergo_lib_ergo_box_to_json, [:pointer, :pointer], :error_pointer
272
+ attach_function :ergo_lib_ergo_box_to_json_eip12, [:pointer, :pointer], :error_pointer
273
+
274
+ attr_accessor :pointer
275
+
276
+ def self.create(box_value:,
277
+ creation_height:,
278
+ contract:,
279
+ tx_id:,
280
+ index:,
281
+ tokens:)
282
+
283
+ eb_pointer = FFI::MemoryPointer.new(:pointer)
284
+ error_pointer = ergo_lib_ergo_box_new(box_value.pointer, creation_height,
285
+ contract.pointer, tx_id.pointer, index, tokens.pointer, eb_pointer)
286
+ #ergo_lib_ergo_box_new(nil, 0, nil, nil, 0, nil, eb_pointer)
287
+ #Util.check_error!(error_pointer)
288
+
289
+ init(eb_pointer)
290
+ end
291
+
292
+ def self.with_raw_pointer(unread_pointer)
293
+ init(unread_pointer)
294
+ end
295
+
296
+ def self.with_json(json_str)
297
+ pointer = FFI::MemoryPointer.new(:pointer)
298
+ error = ergo_lib_ergo_box_from_json(json_str, pointer)
299
+ Util.check_error!(error)
300
+ init(pointer)
301
+ end
302
+
303
+ def get_box_id
304
+ box_id_ptr = FFI::MemoryPointer.new(:pointer)
305
+ ergo_lib_ergo_box_id(self.pointer, box_id_ptr)
306
+ Sigma::BoxId.with_raw_pointer(box_id_ptr)
307
+ end
308
+
309
+ def get_box_value
310
+ box_value_ptr = FFI::MemoryPointer.new(:pointer)
311
+ ergo_lib_ergo_box_value(self.pointer, box_value_ptr)
312
+ Sigma::BoxValue.with_raw_pointer(box_value_ptr)
313
+ end
314
+
315
+ def get_creation_height
316
+ ergo_lib_ergo_box_creation_height(self.pointer)
317
+ end
318
+
319
+ def get_register_value(register_id)
320
+ constant_ptr = FFI::MemoryPointer.new(:pointer)
321
+ res = ergo_lib_ergo_box_register_value(self.pointer, register_id, constant_ptr)
322
+ Util.check_error!(res[:error])
323
+ if res[:is_some]
324
+ Sigma::Constant.with_raw_pointer(constant_ptr)
325
+ else
326
+ nil
327
+ end
328
+ end
329
+
330
+ def get_tokens
331
+ tokens_ptr = FFI::MemoryPointer.new(:pointer)
332
+ ergo_lib_ergo_box_tokens(self.pointer, tokens_ptr)
333
+ Sigma::Tokens.with_raw_pointer(tokens_ptr)
334
+ end
335
+
336
+ def get_ergo_tree
337
+ ergo_tree_ptr = FFI::MemoryPointer.new(:pointer)
338
+ ergo_lib_ergo_box_ergo_tree(self.pointer, ergo_tree_ptr)
339
+ Sigma::ErgoTree.with_raw_pointer(ergo_tree_ptr)
340
+ end
341
+
342
+ def to_json
343
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
344
+ error = ergo_lib_ergo_box_to_json(self.pointer, s_ptr)
345
+ Util.check_error!(error)
346
+ s_ptr = s_ptr.read_pointer()
347
+ str = s_ptr.read_string().force_encoding('UTF-8')
348
+ Util.ergo_lib_delete_string(s_ptr)
349
+ str
350
+ end
351
+
352
+ def to_json_eip12
353
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
354
+ error = ergo_lib_ergo_box_to_json_eip12(self.pointer, s_ptr)
355
+ Util.check_error!(error)
356
+ s_ptr = s_ptr.read_pointer()
357
+ str = s_ptr.read_string().force_encoding('UTF-8')
358
+ Util.ergo_lib_delete_string(s_ptr)
359
+ str
360
+ end
361
+
362
+ def ==(ergo_box_two)
363
+ ergo_lib_ergo_box_eq(self.pointer, ergo_box_two.pointer)
364
+ end
365
+
366
+ private
367
+
368
+ def self.init(unread_pointer)
369
+ obj = self.new
370
+ obj_ptr = unread_pointer.get_pointer(0)
371
+
372
+ obj.pointer = FFI::AutoPointer.new(
373
+ obj_ptr,
374
+ method(:ergo_lib_ergo_box_delete)
375
+ )
376
+ obj
377
+ end
378
+ end
379
+
380
+ class ErgoBoxes
381
+ extend FFI::Library
382
+ ffi_lib FFI::Compiler::Loader.find('csigma')
383
+ typedef :pointer, :error_pointer
384
+ attach_function :ergo_lib_ergo_boxes_new, [:pointer], :void
385
+ attach_function :ergo_lib_ergo_boxes_delete, [:pointer], :void
386
+ attach_function :ergo_lib_ergo_boxes_add, [:pointer, :pointer], :void
387
+ attach_function :ergo_lib_ergo_boxes_len, [:pointer], :uint8
388
+ attach_function :ergo_lib_ergo_boxes_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
389
+
390
+ attr_accessor :pointer
391
+
392
+ def self.with_raw_pointer(unread_pointer)
393
+ init(unread_pointer)
394
+ end
395
+
396
+ def self.create
397
+ pointer = FFI::MemoryPointer.new(:pointer)
398
+ ergo_lib_ergo_boxes_new(pointer)
399
+
400
+ init(pointer)
401
+ end
402
+
403
+ # Parameter is an ARRAY of JSON Strings
404
+ def self.from_json(array_of_json_elements)
405
+ boxes = array_of_json_elements.map do |json|
406
+ Sigma::ErgoBox.with_json(json)
407
+ end
408
+ container = create
409
+ boxes.each do |box|
410
+ container.add(box)
411
+ end
412
+ container
413
+ end
414
+
415
+ def len
416
+ ergo_lib_ergo_boxes_len(self.pointer)
417
+ end
418
+
419
+ def add(ergo_box)
420
+ ergo_lib_ergo_boxes_add(ergo_box.pointer, self.pointer)
421
+ end
422
+
423
+ def get(index)
424
+ pointer = FFI::MemoryPointer.new(:pointer)
425
+ res = ergo_lib_ergo_boxes_get(self.pointer, index, pointer)
426
+ Util.check_error!(res[:error])
427
+ if res[:is_some]
428
+ Sigma::ErgoBox.with_raw_pointer(pointer)
429
+ else
430
+ nil
431
+ end
432
+ end
433
+
434
+ private
435
+
436
+ def self.init(unread_pointer)
437
+ obj = self.new
438
+ obj_ptr = unread_pointer.get_pointer(0)
439
+
440
+ obj.pointer = FFI::AutoPointer.new(
441
+ obj_ptr,
442
+ method(:ergo_lib_ergo_boxes_delete)
443
+ )
444
+ obj
445
+ end
446
+ end
447
+
448
+ class ErgoBoxAssetsData
449
+ extend FFI::Library
450
+ ffi_lib FFI::Compiler::Loader.find('csigma')
451
+ typedef :pointer, :error_pointer
452
+ attach_function :ergo_lib_ergo_box_assets_data_delete, [:pointer], :void
453
+ attach_function :ergo_lib_ergo_box_assets_data_eq, [:pointer, :pointer], :bool
454
+ attach_function :ergo_lib_ergo_box_assets_data_new, [:pointer, :pointer, :pointer], :void
455
+ attach_function :ergo_lib_ergo_box_assets_data_value, [:pointer, :pointer], :void
456
+ attach_function :ergo_lib_ergo_box_assets_data_tokens, [:pointer, :pointer], :void
457
+
458
+ attr_accessor :pointer
459
+
460
+ def self.create(box_value:, tokens:)
461
+ pointer = FFI::MemoryPointer.new(:pointer)
462
+ ergo_lib_ergo_box_assets_data_new(box_value.pointer, tokens.pointer, pointer)
463
+ init(pointer)
464
+ end
465
+
466
+ def self.with_raw_pointer(pointer)
467
+ init(pointer)
468
+ end
469
+
470
+ def get_box_value
471
+ pointer = FFI::MemoryPointer.new(:pointer)
472
+ ergo_lib_ergo_box_assets_data_value(self.pointer, pointer)
473
+ Sigma::BoxValue.with_raw_pointer(pointer)
474
+ end
475
+
476
+ def get_box_tokens
477
+ pointer = FFI::MemoryPointer.new(:pointer)
478
+ ergo_lib_ergo_box_assets_data_tokens(self.pointer, pointer)
479
+ Sigma::Tokens.with_raw_pointer(pointer)
480
+ end
481
+
482
+ def ==(eb_asset_data_two)
483
+ ergo_lib_ergo_box_assets_data_eq(self.pointer, eb_asset_data_two.pointer)
484
+ end
485
+
486
+ private
487
+
488
+ def self.init(unread_pointer)
489
+ obj = self.new
490
+ obj_ptr = unread_pointer.get_pointer(0)
491
+
492
+ obj.pointer = FFI::AutoPointer.new(
493
+ obj_ptr,
494
+ method(:ergo_lib_ergo_box_assets_data_delete)
495
+ )
496
+ obj
497
+ end
498
+ end
499
+
500
+ class ErgoBoxAssetsDataList
501
+ extend FFI::Library
502
+ ffi_lib FFI::Compiler::Loader.find('csigma')
503
+ typedef :pointer, :error_pointer
504
+ attach_function :ergo_lib_ergo_box_assets_data_list_new, [:pointer], :void
505
+ attach_function :ergo_lib_ergo_box_assets_data_list_delete, [:pointer], :void
506
+ attach_function :ergo_lib_ergo_box_assets_data_list_add, [:pointer, :pointer], :void
507
+ attach_function :ergo_lib_ergo_box_assets_data_list_len, [:pointer], :uint8
508
+ attach_function :ergo_lib_ergo_box_assets_data_list_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
509
+
510
+ attr_accessor :pointer
511
+
512
+ def self.with_raw_pointer(unread_pointer)
513
+ init(unread_pointer)
514
+ end
515
+
516
+ def self.create
517
+ pointer = FFI::MemoryPointer.new(:pointer)
518
+ ergo_lib_ergo_box_assets_data_list_new(pointer)
519
+
520
+ init(pointer)
521
+ end
522
+
523
+ def len
524
+ ergo_lib_ergo_box_assets_data_list_len(self.pointer)
525
+ end
526
+
527
+ def add(ergo_box_assets_data)
528
+ ergo_lib_ergo_box_assets_data_list_add(ergo_box_assets_data.pointer, self.pointer)
529
+ end
530
+
531
+ def get(index)
532
+ pointer = FFI::MemoryPointer.new(:pointer)
533
+ res = ergo_lib_ergo_box_assets_data_list_get(self.pointer, index, pointer)
534
+ Util.check_error!(res[:error])
535
+ if res[:is_some]
536
+ Sigma::ErgoBoxAssetsData.with_raw_pointer(pointer)
537
+ else
538
+ nil
539
+ end
540
+ end
541
+
542
+ private
543
+
544
+ def self.init(unread_pointer)
545
+ obj = self.new
546
+ obj_ptr = unread_pointer.get_pointer(0)
547
+
548
+ obj.pointer = FFI::AutoPointer.new(
549
+ obj_ptr,
550
+ method(:ergo_lib_ergo_box_assets_data_list_delete)
551
+ )
552
+ obj
553
+ end
554
+ end
555
+ end
556
+
@@ -0,0 +1,123 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ErgoBoxCandidateBuilder
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_ergo_box_candidate_builder_delete, [:pointer], :void
11
+ attach_function :ergo_lib_ergo_box_candidate_builder_build, [:pointer, :pointer], :error_pointer
12
+ attach_function :ergo_lib_ergo_box_candidate_builder_new, [:pointer, :pointer, :uint32, :pointer], :void
13
+ attach_function :ergo_lib_ergo_box_candidate_builder_set_min_box_value_per_byte, [:pointer, :uint32], :void
14
+ attach_function :ergo_lib_ergo_box_candidate_builder_min_box_value_per_byte, [:pointer], :uint32
15
+ attach_function :ergo_lib_ergo_box_candidate_builder_set_value, [:pointer, :pointer], :void
16
+ attach_function :ergo_lib_ergo_box_candidate_builder_value, [:pointer, :pointer], :void
17
+ attach_function :ergo_lib_ergo_box_candidate_builder_calc_box_size_bytes, [:pointer], ReturnNumUsize.by_value
18
+ attach_function :ergo_lib_ergo_box_candidate_calc_min_box_value, [:pointer, :pointer], :error_pointer
19
+ attach_function :ergo_lib_ergo_box_candidate_builder_set_register_value, [:pointer, REGISTER_ID_ENUM, :pointer], :void
20
+ attach_function :ergo_lib_ergo_box_candidate_builder_register_value, [:pointer, REGISTER_ID_ENUM, :pointer], ReturnOption.by_value
21
+ attach_function :ergo_lib_ergo_box_candidate_builder_delete_register_value, [:pointer, REGISTER_ID_ENUM], :void
22
+ attach_function :ergo_lib_ergo_box_candidate_builder_mint_token, [:pointer, :pointer, :pointer, :pointer, :uint8], :void
23
+ attach_function :ergo_lib_ergo_box_candidate_builder_add_token, [:pointer, :pointer, :pointer], :void
24
+
25
+ attr_accessor :pointer
26
+
27
+ def self.create(box_value:, contract:, creation_height:)
28
+ pointer = FFI::MemoryPointer.new(:pointer)
29
+ ergo_lib_ergo_box_candidate_builder_new(box_value.pointer, contract.pointer, creation_height, pointer)
30
+
31
+ init(pointer)
32
+ end
33
+
34
+ def set_min_box_value_per_byte(min_box_value)
35
+ ergo_lib_ergo_box_candidate_builder_set_min_box_value_per_byte(self.pointer, min_box_value)
36
+ self
37
+ end
38
+
39
+ def get_min_box_value_per_byte
40
+ ergo_lib_ergo_box_candidate_builder_min_box_value_per_byte(self.pointer)
41
+ end
42
+
43
+ def set_value(box_value)
44
+ ergo_lib_ergo_box_candidate_builder_set_value(self.pointer, box_value.pointer)
45
+ self
46
+ end
47
+
48
+ def get_value
49
+ pointer = FFI::MemoryPointer.new(:pointer)
50
+ ergo_lib_ergo_box_candidate_builder_value(self.pointer, pointer)
51
+ Sigma::BoxValue.with_raw_pointer(pointer)
52
+ end
53
+
54
+ def calc_box_size_bytes
55
+ res = ergo_lib_ergo_box_candidate_builder_calc_box_size_bytes(self.pointer)
56
+ Util.check_error!(res[:error])
57
+ res[:value]
58
+ end
59
+
60
+ def calc_min_box_value
61
+ pointer = FFI::MemoryPointer.new(:pointer)
62
+ error = ergo_lib_ergo_box_candidate_calc_min_box_value(self.pointer, pointer)
63
+ Util.check_error!(error)
64
+ Sigma::BoxValue.with_raw_pointer(pointer)
65
+ end
66
+
67
+ def set_register_value(register_id, constant)
68
+ ergo_lib_ergo_box_candidate_builder_set_register_value(self.pointer, register_id, constant.pointer)
69
+ end
70
+
71
+ def get_register_value(register_id)
72
+ pointer = FFI::MemoryPointer.new(:pointer)
73
+ res = ergo_lib_ergo_box_candidate_builder_register_value(self.pointer, register_id, pointer)
74
+ Util.check_error!(res[:error])
75
+ if res[:is_some]
76
+ Sigma::Constant.with_raw_pointer(pointer)
77
+ else
78
+ nil
79
+ end
80
+ end
81
+
82
+ def delete_register_value(register_id)
83
+ ergo_lib_ergo_box_candidate_builder_delete_register_value(self.pointer, register_id)
84
+ self
85
+ end
86
+
87
+ def mint_token(token:, name:, description:, num_decimals:)
88
+ ergo_lib_ergo_box_candidate_builder_mint_token(
89
+ self.pointer,
90
+ token.pointer,
91
+ name,
92
+ description,
93
+ num_decimals
94
+ )
95
+ self
96
+ end
97
+
98
+ def add_token(token_id, token_amount)
99
+ ergo_lib_ergo_box_candidate_builder_add_token(self.pointer, token_id.pointer, token_amount.pointer)
100
+ self
101
+ end
102
+
103
+ def build
104
+ pointer = FFI::MemoryPointer.new(:pointer)
105
+ error = ergo_lib_ergo_box_candidate_builder_build(self.pointer, pointer)
106
+ Util.check_error!(error)
107
+ ErgoBoxCandidate.with_raw_pointer(pointer)
108
+ end
109
+
110
+ private
111
+
112
+ def self.init(unread_pointer)
113
+ obj = self.new
114
+ obj_ptr = unread_pointer.get_pointer(0)
115
+
116
+ obj.pointer = FFI::AutoPointer.new(
117
+ obj_ptr,
118
+ method(:ergo_lib_ergo_box_candidate_builder_delete)
119
+ )
120
+ obj
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,41 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ErgoStateContext
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_ergo_state_context_delete, [:pointer], :void
11
+ attach_function :ergo_lib_ergo_state_context_eq, [:pointer, :pointer], :bool
12
+ attach_function :ergo_lib_ergo_state_context_new, [:pointer, :pointer, :pointer], :error_pointer
13
+
14
+ attr_accessor :pointer
15
+
16
+ def self.create(pre_header:, headers:)
17
+ pointer = FFI::MemoryPointer.new(:pointer)
18
+ error = ergo_lib_ergo_state_context_new(pre_header.pointer, headers.pointer, pointer)
19
+ Util.check_error!(error)
20
+ init(pointer)
21
+ end
22
+
23
+ def ==(esc_two)
24
+ ergo_lib_ergo_state_context_eq(self.pointer, esc.pointer)
25
+ end
26
+
27
+ private
28
+
29
+ def self.init(unread_pointer)
30
+ obj = self.new
31
+ obj_ptr = unread_pointer.get_pointer(0)
32
+
33
+ obj.pointer = FFI::AutoPointer.new(
34
+ obj_ptr,
35
+ method(:ergo_lib_ergo_state_context_delete)
36
+ )
37
+ obj
38
+ end
39
+ end
40
+ end
41
+