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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2da1237215d9dd9b9734403cb13606b66cd3e80ea128a1d301180aec84720739
4
+ data.tar.gz: 8e7d5e940c16718d66fbfaaa3ac71c751ae107d925783e25ec163781acc2e06e
5
+ SHA512:
6
+ metadata.gz: 2111272de78b3807f966f984d1986c904e6f34543c06365bfddee20a8a9269d91cad6fd8b8147e9148ffcc500105f35fdf73bd100c69cf43151910622fcb14fb
7
+ data.tar.gz: 1a0d61d66d6d706b05c9e2c81142bbe28e90f0584d4d555b16e08218286f05d20eee572e0ff158b134918a202bd7556d1aa45875290d71dbae2a1d09e96dd78c
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Dark Lord of Programming
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # sigma_rb
2
+ Ruby bindings for https://github.com/ergoplatform/sigma-rust
3
+
4
+
5
+ ### TODO
6
+ - [ ] Package up into gem
7
+ - [ ] Add installation instructions and target platforms to README
8
+ - [ ] Add pointers to example usage to README
9
+ - [ ] Add YARD documentation so docs can be generated and viewed at https://www.rubydoc.info/
data/ext/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'ffi-compiler/compile_task'
2
+
3
+ FFI::Compiler::CompileTask.new('csigma') do |c|
4
+ c.have_header?('ergo_lib.h')
5
+ c.have_library?('ergo')
6
+ c.ldflags << "-Wl,--whole-archive,-lergo,--no-whole-archive"
7
+ end
data/ext/csigma.c ADDED
@@ -0,0 +1,5 @@
1
+ #include "ergo_lib.h"
2
+
3
+ int main(void) {
4
+ }
5
+
@@ -0,0 +1,73 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class Address
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_address_from_testnet, [:pointer,:pointer], :error_pointer
11
+ attach_function :ergo_lib_address_from_mainnet, [:pointer,:pointer], :error_pointer
12
+ attach_function :ergo_lib_address_from_base58, [:pointer,:pointer], :error_pointer
13
+ attach_function :ergo_lib_address_to_base58, [:pointer, Sigma::NETWORK_PREFIX_ENUM, :pointer], :void
14
+ attach_function :ergo_lib_address_delete, [:pointer], :void
15
+ attach_function :ergo_lib_address_type_prefix, [:pointer], :uint8
16
+ attr_accessor :pointer
17
+
18
+ def self.with_raw_pointer(unread_pointer)
19
+ init(unread_pointer)
20
+ end
21
+
22
+ def self.with_testnet_address(address_str)
23
+ pointer = FFI::MemoryPointer.new(:pointer)
24
+ error = ergo_lib_address_from_testnet(address_str, pointer)
25
+ Util.check_error!(error)
26
+
27
+ init(pointer)
28
+ end
29
+
30
+ def self.with_mainnet_address(address_str)
31
+ pointer = FFI::MemoryPointer.new(:pointer)
32
+ error = ergo_lib_address_from_mainnet(address_str, pointer)
33
+ Util.check_error!(error)
34
+
35
+ init(pointer)
36
+ end
37
+
38
+ def self.with_base58_address(address_str)
39
+ pointer = FFI::MemoryPointer.new(:pointer)
40
+ error = ergo_lib_address_from_base58(address_str, pointer)
41
+ Util.check_error!(error)
42
+
43
+ init(pointer)
44
+ end
45
+
46
+ def to_base58(network_prefix)
47
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
48
+ pointer = FFI::MemoryPointer.new(:pointer)
49
+ ergo_lib_address_to_base58(self.pointer, network_prefix, s_ptr)
50
+ s_ptr = s_ptr.read_pointer()
51
+ str = s_ptr.read_string().force_encoding('UTF-8')
52
+ Util.ergo_lib_delete_string(s_ptr)
53
+ str
54
+ end
55
+
56
+ def type_prefix
57
+ ergo_lib_address_type_prefix(self.pointer)
58
+ end
59
+
60
+ private
61
+
62
+ def self.init(unread_pointer)
63
+ obj = self.new
64
+ obj_ptr = unread_pointer.get_pointer(0)
65
+
66
+ obj.pointer = FFI::AutoPointer.new(
67
+ obj_ptr,
68
+ method(:ergo_lib_address_delete)
69
+ )
70
+ obj
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,197 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class BlockHeader
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_block_header_delete, [:pointer], :void
11
+ attach_function :ergo_lib_block_header_from_json, [:pointer, :pointer], :error_pointer
12
+ attach_function :ergo_lib_block_header_eq, [:pointer, :pointer], :bool
13
+ attr_accessor :pointer
14
+
15
+ def self.with_json(json)
16
+ pointer = FFI::MemoryPointer.new(:pointer)
17
+ error = ergo_lib_block_header_from_json(json, pointer)
18
+ Util.check_error!(error)
19
+ init(pointer)
20
+ end
21
+
22
+ def self.with_raw_pointer(pointer)
23
+ init(pointer)
24
+ end
25
+
26
+ def get_block_id
27
+ pointer = FFI::MemoryPointer.new(:pointer)
28
+ ergo_lib_block_header_id(self.pointer, pointer)
29
+ Sigma::BlockId.with_raw_pointer(:pointer)
30
+ end
31
+
32
+ def ==(bh_two)
33
+ ergo_lib_block_header_eq(self.pointer, bh_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_block_header_delete)
45
+ )
46
+ obj
47
+ end
48
+ end
49
+
50
+ class BlockHeaders
51
+ extend FFI::Library
52
+ ffi_lib FFI::Compiler::Loader.find('csigma')
53
+ typedef :pointer, :error_pointer
54
+ attach_function :ergo_lib_block_headers_new, [:pointer], :void
55
+ attach_function :ergo_lib_block_headers_delete, [:pointer], :void
56
+ attach_function :ergo_lib_block_headers_add, [:pointer, :pointer], :void
57
+ attach_function :ergo_lib_block_headers_len, [:pointer], :uint8
58
+ attach_function :ergo_lib_block_headers_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
59
+ attr_accessor :pointer
60
+
61
+ def self.with_raw_pointer(unread_pointer)
62
+ init(unread_pointer)
63
+ end
64
+
65
+ def self.create
66
+ pointer = FFI::MemoryPointer.new(:pointer)
67
+ ergo_lib_block_headers_new(pointer)
68
+
69
+ init(pointer)
70
+ end
71
+
72
+ # Parameter is an ARRAY of JSON Strings
73
+ def self.from_json(array_of_json_elements)
74
+ headers = array_of_json_elements.map do |json|
75
+ Sigma::BlockHeader.with_json(json)
76
+ end
77
+ container = create
78
+ headers.each do |header|
79
+ container.add(header)
80
+ end
81
+ container
82
+ end
83
+
84
+ def len
85
+ ergo_lib_block_headers_len(self.pointer)
86
+ end
87
+
88
+ def add(block_header)
89
+ ergo_lib_block_headers_add(block_header.pointer, self.pointer)
90
+ end
91
+
92
+ def get(index)
93
+ pointer = FFI::MemoryPointer.new(:pointer)
94
+ res = ergo_lib_block_headers_get(self.pointer, index, pointer)
95
+ Util.check_error!(res[:error])
96
+ if res[:is_some]
97
+ Sigma::BlockHeader.with_raw_pointer(pointer)
98
+ else
99
+ nil
100
+ end
101
+ end
102
+
103
+ private
104
+
105
+ def self.init(unread_pointer)
106
+ obj = self.new
107
+ obj_ptr = unread_pointer.get_pointer(0)
108
+
109
+ obj.pointer = FFI::AutoPointer.new(
110
+ obj_ptr,
111
+ method(:ergo_lib_block_headers_delete)
112
+ )
113
+ obj
114
+ end
115
+ end
116
+
117
+ class BlockId
118
+ extend FFI::Library
119
+ ffi_lib FFI::Compiler::Loader.find('csigma')
120
+ typedef :pointer, :error_pointer
121
+ attach_function :ergo_lib_block_id_delete, [:pointer], :void
122
+ attr_accessor :pointer
123
+
124
+ def self.with_raw_pointer(pointer)
125
+ init(pointer)
126
+ end
127
+
128
+ private
129
+
130
+ def self.init(unread_pointer)
131
+ obj = self.new
132
+ obj_ptr = unread_pointer.get_pointer(0)
133
+
134
+ obj.pointer = FFI::AutoPointer.new(
135
+ obj_ptr,
136
+ method(:ergo_lib_block_id_delete)
137
+ )
138
+ obj
139
+ end
140
+ end
141
+
142
+ class BlockIds
143
+ extend FFI::Library
144
+ ffi_lib FFI::Compiler::Loader.find('csigma')
145
+ typedef :pointer, :error_pointer
146
+ attach_function :ergo_lib_block_ids_new, [:pointer], :void
147
+ attach_function :ergo_lib_block_ids_delete, [:pointer], :void
148
+ attach_function :ergo_lib_block_ids_add, [:pointer, :pointer], :void
149
+ attach_function :ergo_lib_block_ids_len, [:pointer], :uint8
150
+ attach_function :ergo_lib_block_ids_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
151
+ attr_accessor :pointer
152
+
153
+ def self.with_raw_pointer(unread_pointer)
154
+ init(unread_pointer)
155
+ end
156
+
157
+ def self.create
158
+ pointer = FFI::MemoryPointer.new(:pointer)
159
+ ergo_lib_block_ids_new(pointer)
160
+
161
+ init(pointer)
162
+ end
163
+
164
+ def len
165
+ ergo_lib_block_ids_len(self.pointer)
166
+ end
167
+
168
+ def add(block_id)
169
+ ergo_lib_block_ids_add(block_id.pointer, self.pointer)
170
+ end
171
+
172
+ def get(index)
173
+ pointer = FFI::MemoryPointer.new(:pointer)
174
+ res = ergo_lib_block_ids_get(self.pointer, index, pointer)
175
+ Util.check_error!(res[:error])
176
+ if res[:is_some]
177
+ Sigma::BlockId.with_raw_pointer(pointer)
178
+ else
179
+ nil
180
+ end
181
+ end
182
+
183
+ private
184
+
185
+ def self.init(unread_pointer)
186
+ obj = self.new
187
+ obj_ptr = unread_pointer.get_pointer(0)
188
+
189
+ obj.pointer = FFI::AutoPointer.new(
190
+ obj_ptr,
191
+ method(:ergo_lib_block_ids_delete)
192
+ )
193
+ obj
194
+ end
195
+ end
196
+ end
197
+
@@ -0,0 +1,105 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class BoxSelection
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_box_selection_delete, [:pointer], :void
11
+ attach_function :ergo_lib_box_selection_eq, [:pointer, :pointer], :bool
12
+ attach_function :ergo_lib_box_selection_new, [:pointer, :pointer, :pointer], :void
13
+ attach_function :ergo_lib_box_selection_boxes, [:pointer, :pointer], :void
14
+ attach_function :ergo_lib_box_selection_change, [:pointer, :pointer], :void
15
+
16
+ attr_accessor :pointer
17
+
18
+ def self.create(ergo_boxes:, change_ergo_boxes:)
19
+ pointer = FFI::MemoryPointer.new(:pointer)
20
+ ergo_lib_box_selection_new(ergo_boxes.pointer, change_ergo_boxes.pointer, pointer)
21
+ init(pointer)
22
+ end
23
+
24
+ def self.with_raw_pointer(pointer)
25
+ init(pointer)
26
+ end
27
+
28
+ def get_boxes
29
+ pointer = FFI::MemoryPointer.new(:pointer)
30
+ ergo_lib_box_selection_boxes(self.pointer, pointer)
31
+ Sigma::ErgoBoxes.with_raw_pointer(pointer)
32
+ end
33
+
34
+ def get_change_boxes
35
+ pointer = FFI::MemoryPointer.new(:pointer)
36
+ ergo_lib_box_selection_change(self.pointer, pointer)
37
+ Sigma::ErgoBoxAssetsDataList.with_raw_pointer(pointer)
38
+ end
39
+
40
+ def ==(bs_two)
41
+ ergo_lib_box_selection_eq(self.pointer, bs_two.pointer)
42
+ end
43
+
44
+ private
45
+
46
+ def self.init(unread_pointer)
47
+ obj = self.new
48
+ obj_ptr = unread_pointer.get_pointer(0)
49
+
50
+ obj.pointer = FFI::AutoPointer.new(
51
+ obj_ptr,
52
+ method(:ergo_lib_box_selection_delete)
53
+ )
54
+ obj
55
+ end
56
+ end
57
+
58
+ class SimpleBoxSelector
59
+ extend FFI::Library
60
+ ffi_lib FFI::Compiler::Loader.find('csigma')
61
+ typedef :pointer, :error_pointer
62
+ attach_function :ergo_lib_simple_box_selector_delete, [:pointer], :void
63
+ attach_function :ergo_lib_simple_box_selector_new, [:pointer], :void
64
+ attach_function :ergo_lib_simple_box_selector_select, [:pointer, :pointer, :pointer, :pointer, :pointer], :error_pointer
65
+
66
+ attr_accessor :pointer
67
+
68
+ def self.create
69
+ pointer = FFI::MemoryPointer.new(:pointer)
70
+ ergo_lib_simple_box_selector_new(pointer)
71
+ init(pointer)
72
+ end
73
+
74
+ def select(inputs:, target_balance:, target_tokens:)
75
+ pointer = FFI::MemoryPointer.new(:pointer)
76
+ error = ergo_lib_simple_box_selector_select(
77
+ self.pointer,
78
+ inputs.pointer,
79
+ target_balance.pointer,
80
+ target_tokens.pointer,
81
+ pointer
82
+ )
83
+ Util.check_error!(error)
84
+ Sigma::BoxSelection.with_raw_pointer(pointer)
85
+ end
86
+
87
+ def self.with_raw_pointer(pointer)
88
+ init(pointer)
89
+ end
90
+
91
+ private
92
+
93
+ def self.init(unread_pointer)
94
+ obj = self.new
95
+ obj_ptr = unread_pointer.get_pointer(0)
96
+
97
+ obj.pointer = FFI::AutoPointer.new(
98
+ obj_ptr,
99
+ method(:ergo_lib_simple_box_selector_delete)
100
+ )
101
+ obj
102
+ end
103
+ end
104
+ end
105
+
@@ -0,0 +1,96 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ByteArray
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_byte_array_delete, [:pointer], :void
11
+ attach_function :ergo_lib_byte_array_from_raw_parts, [:pointer, :uint, :pointer], :error_pointer
12
+ attr_accessor :pointer
13
+
14
+ def self.from_bytes(bytes)
15
+ pointer = FFI::MemoryPointer.new(:pointer)
16
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
17
+ b_ptr.write_array_of_uint8(bytes)
18
+ error = ergo_lib_byte_array_from_raw_parts(b_ptr, bytes.size, pointer)
19
+ Util.check_error!(error)
20
+ init(pointer)
21
+ end
22
+
23
+ def self.with_raw_pointer(pointer)
24
+ init(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_byte_array_delete)
36
+ )
37
+ obj
38
+ end
39
+ end
40
+
41
+ class ByteArrays
42
+ extend FFI::Library
43
+ ffi_lib FFI::Compiler::Loader.find('csigma')
44
+ typedef :pointer, :error_pointer
45
+ attach_function :ergo_lib_byte_arrays_new, [:pointer], :void
46
+ attach_function :ergo_lib_byte_arrays_delete, [:pointer], :void
47
+ attach_function :ergo_lib_byte_arrays_add, [:pointer, :pointer], :void
48
+ attach_function :ergo_lib_byte_arrays_len, [:pointer], :uint8
49
+ attach_function :ergo_lib_byte_arrays_get, [:pointer, :uint8, :pointer], ReturnOption.by_value
50
+
51
+ attr_accessor :pointer
52
+
53
+ def self.with_raw_pointer(unread_pointer)
54
+ init(unread_pointer)
55
+ end
56
+
57
+ def self.create
58
+ pointer = FFI::MemoryPointer.new(:pointer)
59
+ ergo_lib_byte_arrays_new(pointer)
60
+
61
+ init(pointer)
62
+ end
63
+
64
+ def len
65
+ ergo_lib_byte_arrays_len(self.pointer)
66
+ end
67
+
68
+ def add(byte_array)
69
+ ergo_lib_byte_arrays_add(byte_array.pointer, self.pointer)
70
+ end
71
+
72
+ def get(index)
73
+ pointer = FFI::MemoryPointer.new(:pointer)
74
+ res = ergo_lib_byte_arrays_get(self.pointer, index, pointer)
75
+ Util.check_error!(res[:error])
76
+ if res[:is_some]
77
+ Sigma::ByteArray.with_raw_pointer(pointer)
78
+ else
79
+ nil
80
+ end
81
+ end
82
+ private
83
+
84
+ def self.init(unread_pointer)
85
+ obj = self.new
86
+ obj_ptr = unread_pointer.get_pointer(0)
87
+
88
+ obj.pointer = FFI::AutoPointer.new(
89
+ obj_ptr,
90
+ method(:ergo_lib_byte_arrays_delete)
91
+ )
92
+ obj
93
+ end
94
+ end
95
+ end
96
+
@@ -0,0 +1,117 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class Constant
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_constant_eq, [:pointer, :pointer], :bool
11
+ attach_function :ergo_lib_constant_from_base16, [:string, :pointer], :error_pointer
12
+ attach_function :ergo_lib_constant_from_i32, [:int32, :pointer], :error_pointer
13
+ attach_function :ergo_lib_constant_to_i32, [:pointer], ReturnNumI32.by_value
14
+ attach_function :ergo_lib_constant_from_i64, [:int64, :pointer], :error_pointer
15
+ attach_function :ergo_lib_constant_to_i64, [:pointer], ReturnNumI64.by_value
16
+ attach_function :ergo_lib_constant_to_base16, [:pointer, :pointer], :error_pointer
17
+ attach_function :ergo_lib_constant_from_bytes, [:pointer, :uint, :pointer], :error_pointer
18
+ attach_function :ergo_lib_constant_from_ecpoint_bytes, [:pointer, :uint, :pointer], :error_pointer
19
+ attach_function :ergo_lib_constant_from_ergo_box, [:pointer, :pointer], :error_pointer
20
+ attach_function :ergo_lib_constant_delete, [:pointer], :void
21
+ attr_accessor :pointer
22
+
23
+ def self.with_ergo_box(ergo_box)
24
+ c_ptr = FFI::MemoryPointer.new(:pointer)
25
+ ergo_lib_constant_from_ergo_box(ergo_box.pointer, c_ptr)
26
+
27
+ init(c_ptr)
28
+ end
29
+
30
+ def self.with_bytes(bytes)
31
+ c_ptr = FFI::MemoryPointer.new(:pointer)
32
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
33
+ b_ptr.write_array_of_uint8(bytes)
34
+ error = ergo_lib_constant_from_bytes(b_ptr, bytes.size, c_ptr)
35
+ Util.check_error!(error)
36
+
37
+ init(c_ptr)
38
+ end
39
+
40
+ def self.with_ecpoint_bytes(bytes)
41
+ c_ptr = FFI::MemoryPointer.new(:pointer)
42
+ b_ptr = FFI::MemoryPointer.new(:uint8, bytes.size)
43
+ b_ptr.write_array_of_uint8(bytes)
44
+ error = ergo_lib_constant_from_ecpoint_bytes(b_ptr, bytes.size, c_ptr)
45
+ Util.check_error!(error)
46
+
47
+ init(c_ptr)
48
+ end
49
+
50
+ def self.with_raw_pointer(constant_pointer)
51
+ init(constant_pointer)
52
+ end
53
+
54
+ def to_base16_string
55
+ s_ptr = FFI::MemoryPointer.new(:pointer, 1)
56
+ error = ergo_lib_constant_to_base16(self.pointer, s_ptr)
57
+ Util.check_error!(error)
58
+ s_ptr = s_ptr.read_pointer()
59
+ str = s_ptr.read_string().force_encoding('UTF-8')
60
+ Util.ergo_lib_delete_string(s_ptr)
61
+ str
62
+ end
63
+
64
+ def self.with_i32(int)
65
+ pointer = FFI::MemoryPointer.new(:pointer)
66
+ error = ergo_lib_constant_from_i32(int, pointer)
67
+ # TODO: This raises error even with valid output
68
+ #Util.check_error!(error)
69
+ init(pointer)
70
+ end
71
+
72
+ def self.with_i64(int)
73
+ pointer = FFI::MemoryPointer.new(:pointer)
74
+ error = ergo_lib_constant_from_i64(int, pointer)
75
+ # TODO: This raises error even with valid output
76
+ #Util.check_error!(error)
77
+ init(pointer)
78
+ end
79
+
80
+ def self.with_base_16(str)
81
+ c_ptr = FFI::MemoryPointer.new(:pointer)
82
+ error = ergo_lib_constant_from_base16(str, c_ptr)
83
+ Util.check_error!(error)
84
+
85
+ init(c_ptr)
86
+ end
87
+
88
+ def to_i32
89
+ res = ergo_lib_constant_to_i32(self.pointer)
90
+ Util.check_error!(res[:error])
91
+ res[:value]
92
+ end
93
+
94
+ def to_i64
95
+ res = ergo_lib_constant_to_i64(self.pointer)
96
+ Util.check_error!(res[:error])
97
+ res[:value]
98
+ end
99
+
100
+ def ==(constant_two)
101
+ ergo_lib_constant_eq(self.pointer, constant_two.pointer)
102
+ end
103
+
104
+ private
105
+
106
+ def self.init(unread_pointer)
107
+ obj = self.new
108
+ obj_ptr = unread_pointer.get_pointer(0)
109
+
110
+ obj.pointer = FFI::AutoPointer.new(
111
+ obj_ptr,
112
+ method(:ergo_lib_constant_delete)
113
+ )
114
+ obj
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,47 @@
1
+ require 'ffi'
2
+ require_relative './util.rb'
3
+ require 'ffi-compiler/loader'
4
+
5
+ module Sigma
6
+ class ContextExtension
7
+ extend FFI::Library
8
+ ffi_lib FFI::Compiler::Loader.find('csigma')
9
+ typedef :pointer, :error_pointer
10
+ attach_function :ergo_lib_context_extension_delete, [:pointer], :void
11
+ attach_function :ergo_lib_context_extension_empty, [:pointer], :void
12
+ attach_function :ergo_lib_context_extension_len, [:pointer], :uint
13
+ attach_function :ergo_lib_context_extension_keys, [:pointer, :pointer], :void
14
+ attr_accessor :pointer
15
+
16
+ def self.create
17
+ pointer = FFI::MemoryPointer.new(:pointer)
18
+ ergo_lib_context_extension_empty(pointer)
19
+ init(pointer)
20
+ end
21
+
22
+ def self.with_raw_pointer(pointer)
23
+ init(pointer)
24
+ end
25
+
26
+ def get_keys
27
+ ce_len = ergo_lib_context_extension_len(self.pointer)
28
+ b_ptr = FFI::MemoryPointer.new(:uint8, ce_len)
29
+ ergo_lib_context_extension_keys(self.pointer, b_ptr)
30
+ b_ptr.get_array_of_uint8(0, ce_len)
31
+ end
32
+
33
+ private
34
+
35
+ def self.init(unread_pointer)
36
+ obj = self.new
37
+ obj_ptr = unread_pointer.get_pointer(0)
38
+
39
+ obj.pointer = FFI::AutoPointer.new(
40
+ obj_ptr,
41
+ method(:ergo_lib_context_extension_delete)
42
+ )
43
+ obj
44
+ end
45
+ end
46
+ end
47
+