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,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
+