sigma_rb 0.1.3 → 0.2.0

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.
@@ -3,6 +3,7 @@ require_relative './util.rb'
3
3
  require 'ffi-compiler/loader'
4
4
 
5
5
  module Sigma
6
+ # UnsignedTransaction builder
6
7
  class TxBuilder
7
8
  extend FFI::Library
8
9
  ffi_lib FFI::Compiler::Loader.find('csigma')
@@ -24,6 +25,14 @@ module Sigma
24
25
 
25
26
  attr_accessor :pointer
26
27
 
28
+ # Create new TxBuilder
29
+ # @param box_selection [BoxSelection] selected input boxes
30
+ # @param output_candidates [ErgoBoxCandidates] output boxes to be "created" in this transaction
31
+ # @param current_height [Integer] chain height that will be used in additionally created boxes (change, miner's fee, etc.)
32
+ # @param fee_amount [BoxValue] miner's fee
33
+ # @param change_address [Address] change (inputs - outputs) will be sent to this address
34
+ # @param min_change_value [BoxValue] minimal value of the change to be sent to `change_address`, value less than that will be given to miners
35
+ # @return [TxBuilder]
27
36
  def self.create(box_selection:, output_candidates:, current_height:, fee_amount:, change_address:, min_change_value:)
28
37
  pointer = FFI::MemoryPointer.new(:pointer)
29
38
  ergo_lib_tx_builder_new(
@@ -38,26 +47,37 @@ module Sigma
38
47
  init(pointer)
39
48
  end
40
49
 
50
+ # Suggested transaction fee (semi-default value used across wallets and dApps as of Oct 2020)
51
+ # @return [BoxValue]
41
52
  def self.suggested_tx_fee
42
53
  pointer = FFI::MemoryPointer.new(:pointer)
43
54
  ergo_lib_tx_builder_suggested_tx_fee(pointer)
44
55
  Sigma::BoxValue.with_raw_pointer(pointer)
45
56
  end
46
57
 
58
+ # Set transaction's data inputs
59
+ # @param data_inputs [DataInputs]
47
60
  def set_data_inputs(data_inputs)
48
61
  ergo_lib_tx_builder_set_data_inputs(self.pointer, data_inputs.pointer)
49
62
  end
50
63
 
64
+ # Set context extension for given input
65
+ # @param box_id [BoxId]
66
+ # @param context_extension [ContextExension]
51
67
  def set_context_extension(box_id, context_extension)
52
68
  ergo_lib_tx_builder_set_context_extension(self.pointer, box_id.pointer, context_extension.pointer)
53
69
  end
54
70
 
71
+ # Get data inputs
72
+ # @return [DataInputs]
55
73
  def get_data_inputs
56
74
  pointer = FFI::MemoryPointer.new(:pointer)
57
75
  ergo_lib_tx_builder_data_inputs(self.pointer, pointer)
58
76
  Sigma::DataInputs.with_raw_pointer(pointer)
59
77
  end
60
78
 
79
+ # Build the UnsignedTransaction
80
+ # @return [UnsignedTransaction]
61
81
  def build
62
82
  pointer = FFI::MemoryPointer.new(:pointer)
63
83
  error = ergo_lib_tx_builder_build(self.pointer, pointer)
@@ -65,34 +85,46 @@ module Sigma
65
85
  Sigma::UnsignedTransaction.with_raw_pointer(pointer)
66
86
  end
67
87
 
88
+ # Get box selection
89
+ # @return [BoxSelection]
68
90
  def get_box_selection
69
91
  pointer = FFI::MemoryPointer.new(:pointer)
70
92
  ergo_lib_tx_builder_box_selection(self.pointer, pointer)
71
93
  Sigma::BoxSelection.with_raw_pointer(pointer)
72
94
  end
73
95
 
96
+ # Get output candidates
97
+ # @return [ErgoBoxCandidates]
74
98
  def get_output_candidates
75
99
  pointer = FFI::MemoryPointer.new(:pointer)
76
100
  ergo_lib_tx_builder_output_candidates(self.pointer, pointer)
77
101
  Sigma::ErgoBoxCandidates.with_raw_pointer(pointer)
78
102
  end
79
103
 
104
+ # Get current height
105
+ # @return [Integer]
80
106
  def get_current_height
81
107
  ergo_lib_tx_builder_current_height(self.pointer)
82
108
  end
83
109
 
110
+ # Get fee amount
111
+ # @return [BoxValue]
84
112
  def get_fee_amount
85
113
  pointer = FFI::MemoryPointer.new(:pointer)
86
114
  ergo_lib_tx_builder_fee_amount(self.pointer, pointer)
87
115
  Sigma::BoxValue.with_raw_pointer(pointer)
88
116
  end
89
117
 
118
+ # Get change address
119
+ # @return [Address]
90
120
  def get_change_address
91
121
  pointer = FFI::MemoryPointer.new(:pointer)
92
122
  ergo_lib_tx_builder_change_address(self.pointer, pointer)
93
123
  Sigma::Address.with_raw_pointer(pointer)
94
124
  end
95
125
 
126
+ # Get min change value
127
+ # @return [BoxValue]
96
128
  def get_min_change_value
97
129
  pointer = FFI::MemoryPointer.new(:pointer)
98
130
  ergo_lib_tx_builder_min_change_value(self.pointer, pointer)
data/lib/sigma/wallet.rb CHANGED
@@ -19,6 +19,11 @@ module Sigma
19
19
  attach_function :ergo_lib_wallet_add_secret, [:pointer, :pointer], :error_pointer
20
20
  attr_accessor :pointer
21
21
 
22
+ # Create Wallet instance loading secret key from mnemonic. Throws error if a DlogSecretKey cannot be
23
+ # parsed from the provided phrase
24
+ # @param mnemonic_phrase [String]
25
+ # @param mnemonic_pass [String]
26
+ # @return [Wallet]
22
27
  def self.create_from_mnemonic(mnemonic_phrase, mnemonic_pass)
23
28
  pointer = FFI::MemoryPointer.new(:pointer)
24
29
  error = ergo_lib_wallet_from_mnemonic(mnemonic_phrase, mnemonic_pass, pointer)
@@ -26,17 +31,28 @@ module Sigma
26
31
  init(pointer)
27
32
  end
28
33
 
34
+ # Create Wallet from secrets
35
+ # @param secrets [SecretKeys]
36
+ # @return [Wallet]
29
37
  def self.create_from_secrets(secrets)
30
38
  pointer = FFI::MemoryPointer.new(:pointer)
31
39
  ergo_lib_wallet_from_secrets(secrets.pointer, pointer)
32
40
  init(pointer)
33
41
  end
34
42
 
43
+ # Add a secret to the wallet's prover
44
+ # @param secret [SecretKey]
35
45
  def add_secret(secret)
36
46
  error = ergo_lib_wallet_add_secret(self.pointer, secret.pointer)
37
47
  Util.check_error!(error)
38
48
  end
39
49
 
50
+ # Sign a transaction
51
+ # @param state_context: [ErgoStateContext]
52
+ # @param unsigned_tx: [UnsignedTransaction]
53
+ # @param boxes_to_spend: [ErgoBoxes]
54
+ # @param data_boxes: [ErgoBoxes]
55
+ # @return [Transaction]
40
56
  def sign_transaction(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:)
41
57
  pointer = FFI::MemoryPointer.new(:pointer)
42
58
  error = ergo_lib_wallet_sign_transaction(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, pointer)
@@ -44,6 +60,13 @@ module Sigma
44
60
  Sigma::Transaction.with_raw_pointer(pointer)
45
61
  end
46
62
 
63
+ # Sign a multi-signature transaction
64
+ # @param state_context: [ErgoStateContext]
65
+ # @param unsigned_tx: [UnsignedTransaction]
66
+ # @param boxes_to_spend: [ErgoBoxes]
67
+ # @param data_boxes: [ErgoBoxes]
68
+ # @param tx_hints: [TransactionHintsBag]
69
+ # @return [Transaction]
47
70
  def sign_transaction_multi(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:, tx_hints:)
48
71
  pointer = FFI::MemoryPointer.new(:pointer)
49
72
  error = ergo_lib_wallet_sign_transaction_multi(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, tx_hints.pointer, pointer)
@@ -51,6 +74,9 @@ module Sigma
51
74
  Sigma::Transaction.with_raw_pointer(pointer)
52
75
  end
53
76
 
77
+ # Signs a reduced transaction (generating proofs for inputs)
78
+ # @param reduced_tx [ReducedTransaction]
79
+ # @return [Transaction]
54
80
  def sign_reduced_transaction(reduced_tx)
55
81
  pointer = FFI::MemoryPointer.new(:pointer)
56
82
  error = ergo_lib_wallet_sign_reduced_transaction(self.pointer, reduced_tx.pointer, pointer)
@@ -58,6 +84,10 @@ module Sigma
58
84
  Sigma::Transaction.with_raw_pointer(pointer)
59
85
  end
60
86
 
87
+ # Signs a multi signature reduced transaction
88
+ # @param reduced_tx [ReducedTransaction]
89
+ # @param tx_hints: [TransactionHintsBag]
90
+ # @return [Transaction]
61
91
  def sign_reduced_transaction_multi(reduced_tx:, tx_hints:)
62
92
  pointer = FFI::MemoryPointer.new(:pointer)
63
93
  error = ergo_lib_wallet_sign_reduced_transaction_multi(self.pointer, reduced_tx.pointer, tx_hints.pointer, pointer)
@@ -65,6 +95,12 @@ module Sigma
65
95
  Sigma::Transaction.with_raw_pointer(pointer)
66
96
  end
67
97
 
98
+ # Generate Commitments for unsigned tx
99
+ # @param state_context: [ErgoStateContext]
100
+ # @param unsigned_tx: [UnsignedTransaction]
101
+ # @param boxes_to_spend: [ErgoBoxes]
102
+ # @param data_boxes: [ErgoBoxes]
103
+ # @return [TransactionHintsBag]
68
104
  def generate_commitments(state_context:, unsigned_tx:, boxes_to_spend:, data_boxes:)
69
105
  pointer = FFI::MemoryPointer.new(:pointer)
70
106
  error = ergo_lib_wallet_generate_commitments(self.pointer, state_context.pointer, unsigned_tx.pointer, boxes_to_spend.pointer, data_boxes.pointer, pointer)
@@ -72,6 +108,9 @@ module Sigma
72
108
  Sigma::TransactionHintsBag.with_raw_pointer(pointer)
73
109
  end
74
110
 
111
+ # Generate Commitments for reduced transaction
112
+ # @param reduced_tx [ReducedTransaction]
113
+ # @return [TransactionHintsBag]
75
114
  def generate_commitments_for_reduced_transaction(reduced_tx)
76
115
  pointer = FFI::MemoryPointer.new(:pointer)
77
116
  error = ergo_lib_wallet_generate_commitments_for_reduced_transaction(self.pointer, reduced_tx.pointer, pointer)
data/lib/sigma.rb CHANGED
@@ -26,7 +26,7 @@ module Sigma
26
26
  require_relative 'sigma/merkle_proof'
27
27
  require_relative 'sigma/nipopow'
28
28
 
29
- SIGMA_RUST_VERSION = '0.16.0'
29
+ SIGMA_RUST_VERSION = '0.18.0'
30
30
  end
31
31
 
32
32
 
data/sigma.gemspec CHANGED
@@ -1,18 +1,19 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'sigma_rb'
3
- s.version = '0.1.3'
3
+ s.version = '0.2.0'
4
4
  s.summary = "Ruby bindings for Ergo types, abstractions, and interfaces provided by Sigma-Rust."
5
5
  s.description = "Ruby bindings for the Ergo-Lib crate of Sigma-Rust. Specifically for chain types and abstractions, json serialization, box selection for tx inputs, tx creation, and signing."
6
6
  s.authors = ["Dark Lord of Programming"]
7
7
  s.email = 'thedlop@sent.com'
8
8
  s.homepage = 'https://github.com/thedlop/sigma_rb'
9
9
  s.license = 'MIT'
10
- s.files = Dir.glob("{lib}/**/*")
10
+ s.files = Dir.glob("{lib}/**/*")
11
11
  s.files += %w(sigma.gemspec README.md LICENSE ext/Rakefile ext/csigma.c)
12
12
  s.add_dependency 'ffi-compiler', '1.0.1'
13
13
  s.add_dependency 'rake', '~> 13.0'
14
14
  s.add_development_dependency 'ffi', '1.15.5'
15
15
  s.add_development_dependency 'test-unit', '~> 3.5'
16
+ s.add_development_dependency 'yard', '~> 0.9.20'
16
17
  s.extensions << "ext/Rakefile"
17
18
  s.test_files = Dir["tests/**/*.rb"]
18
19
  s.require_paths = ["lib"]
@@ -11,9 +11,11 @@ class Sigma::ErgoTree::Test < Test::Unit::TestCase
11
11
  base_16 = "100204a00b08cd021dde34603426402615658f1d970cfa7c7bd92ac81a8b16eeebff264d59ce4604ea02d192a39a8cc7a70173007301"
12
12
  tree = Sigma::ErgoTree.from_base16_encoded_string(base_16)
13
13
  assert_equal(base_16, tree.to_base16_encoded_string)
14
- assert_nothing_raised do
14
+ bytes = assert_nothing_raised do
15
15
  tree.to_bytes
16
16
  end
17
+ tree_from_bytes = Sigma::ErgoTree.from_bytes(bytes)
18
+ assert_equal(tree_from_bytes, tree)
17
19
  assert_nothing_raised do
18
20
  tree.to_template_bytes
19
21
  end
@@ -1,7 +1,7 @@
1
-
2
1
  require 'rubygems'
3
2
  require 'bundler/setup'
4
3
  require 'test/unit'
4
+ require 'json'
5
5
 
6
6
  require_relative '../../lib/sigma.rb'
7
7
  require_relative '../test_utils.rb'
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'test/unit'
4
+ require 'json'
4
5
 
5
6
  require_relative '../../lib/sigma.rb'
6
7
  require_relative '../test_utils.rb'
@@ -73,13 +73,15 @@ class Sigma::Token::Test < Test::Unit::TestCase
73
73
  token_amount = Sigma::TokenAmount.with_i64(amount)
74
74
  token = Sigma::Token.create(token_id: token_id, token_amount: token_amount)
75
75
 
76
- 255.times do |i|
76
+ max_tokens_count = ErgoBox::MAX_TOKENS_COUNT
77
+
78
+ max_tokens_count.times do |i|
77
79
  tokens.add(token)
78
80
  end
79
- assert_equal(255, tokens.len)
80
- assert_equal(tokens.get(254), token)
81
+ assert_equal(max_tokens_count, tokens.len)
82
+ assert_equal(tokens.get(max_tokens_count - 1), token)
81
83
 
82
- # 256 raises error
84
+ # Next raises error
83
85
  assert_raise do
84
86
  tokens.add(token)
85
87
  end
data/tests/test_seeds.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require_relative '../lib/sigma'
2
+ require 'json'
2
3
 
3
4
  module TestSeeds
4
5
  def self.block_header_json
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sigma_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dark Lord of Programming
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-20 00:00:00.000000000 Z
11
+ date: 2022-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi-compiler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.9.20
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.20
69
83
  description: Ruby bindings for the Ergo-Lib crate of Sigma-Rust. Specifically for
70
84
  chain types and abstractions, json serialization, box selection for tx inputs, tx
71
85
  creation, and signing.