solana-ruby-kit 8.2.0 → 8.3.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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +82 -12
  3. data/lib/solana/ruby/kit/accounts/maybe_account.rb +1 -1
  4. data/lib/solana/ruby/kit/addresses/address.rb +1 -1
  5. data/lib/solana/ruby/kit/addresses/curve.rb +1 -1
  6. data/lib/solana/ruby/kit/addresses/program_derived_address.rb +1 -1
  7. data/lib/solana/ruby/kit/addresses/public_key.rb +1 -1
  8. data/lib/solana/ruby/kit/codecs/codec.rb +95 -1
  9. data/lib/solana/ruby/kit/codecs/data_structures.rb +51 -8
  10. data/lib/solana/ruby/kit/codecs/numbers.rb +49 -50
  11. data/lib/solana/ruby/kit/codecs/strings.rb +132 -6
  12. data/lib/solana/ruby/kit/encoding/base58.rb +1 -1
  13. data/lib/solana/ruby/kit/errors.rb +6 -0
  14. data/lib/solana/ruby/kit/fast_stable_stringify.rb +1 -1
  15. data/lib/solana/ruby/kit/functional.rb +1 -1
  16. data/lib/solana/ruby/kit/instruction_plans/instruction_plan.rb +1 -1
  17. data/lib/solana/ruby/kit/instruction_plans/max_instructions.rb +1 -1
  18. data/lib/solana/ruby/kit/instruction_plans/transaction_plan.rb +1 -1
  19. data/lib/solana/ruby/kit/instruction_plans/transaction_plan_executor.rb +2 -2
  20. data/lib/solana/ruby/kit/instruction_plans/transaction_plan_result.rb +1 -1
  21. data/lib/solana/ruby/kit/instruction_plans/transaction_planner.rb +2 -2
  22. data/lib/solana/ruby/kit/instructions/accounts.rb +1 -1
  23. data/lib/solana/ruby/kit/instructions/instruction.rb +1 -1
  24. data/lib/solana/ruby/kit/instructions/roles.rb +1 -1
  25. data/lib/solana/ruby/kit/keys/key_pair.rb +1 -1
  26. data/lib/solana/ruby/kit/keys/private_key.rb +1 -1
  27. data/lib/solana/ruby/kit/keys/public_key.rb +1 -1
  28. data/lib/solana/ruby/kit/keys/signatures.rb +1 -1
  29. data/lib/solana/ruby/kit/offchain_messages/codec.rb +1 -1
  30. data/lib/solana/ruby/kit/offchain_messages/message_v1.rb +1 -1
  31. data/lib/solana/ruby/kit/options/option.rb +1 -1
  32. data/lib/solana/ruby/kit/plugin_core.rb +1 -1
  33. data/lib/solana/ruby/kit/programs/associated_token_account.rb +1 -1
  34. data/lib/solana/ruby/kit/programs/stake_program.rb +1 -1
  35. data/lib/solana/ruby/kit/programs/system_program.rb +1 -1
  36. data/lib/solana/ruby/kit/programs.rb +1 -1
  37. data/lib/solana/ruby/kit/promises.rb +1 -1
  38. data/lib/solana/ruby/kit/resource_limit_estimation.rb +1 -1
  39. data/lib/solana/ruby/kit/rpc_parsed_types/address_lookup_table.rb +1 -1
  40. data/lib/solana/ruby/kit/rpc_parsed_types/nonce_account.rb +1 -1
  41. data/lib/solana/ruby/kit/rpc_parsed_types/stake_account.rb +1 -1
  42. data/lib/solana/ruby/kit/rpc_parsed_types/token_account.rb +1 -1
  43. data/lib/solana/ruby/kit/rpc_parsed_types/vote_account.rb +1 -1
  44. data/lib/solana/ruby/kit/rpc_types/cluster_url.rb +1 -1
  45. data/lib/solana/ruby/kit/rpc_types/commitment.rb +1 -1
  46. data/lib/solana/ruby/kit/rpc_types/lamports.rb +1 -1
  47. data/lib/solana/ruby/kit/rpc_types/sol.rb +1 -1
  48. data/lib/solana/ruby/kit/signers/keypair_signer.rb +1 -1
  49. data/lib/solana/ruby/kit/subscribable/async_iterable.rb +1 -1
  50. data/lib/solana/ruby/kit/subscribable/bridge_store_to_async_iterable.rb +1 -1
  51. data/lib/solana/ruby/kit/subscribable/reactive_action_store.rb +1 -1
  52. data/lib/solana/ruby/kit/subscribable/reactive_stream_store.rb +1 -1
  53. data/lib/solana/ruby/kit/sysvars/clock.rb +1 -1
  54. data/lib/solana/ruby/kit/sysvars/epoch_schedule.rb +1 -1
  55. data/lib/solana/ruby/kit/sysvars/last_restart_slot.rb +1 -1
  56. data/lib/solana/ruby/kit/sysvars/rent.rb +1 -1
  57. data/lib/solana/ruby/kit/sysvars.rb +1 -1
  58. data/lib/solana/ruby/kit/transaction_confirmation.rb +1 -1
  59. data/lib/solana/ruby/kit/transaction_introspection/compiled_transaction_message.rb +1 -1
  60. data/lib/solana/ruby/kit/transaction_introspection/decode_rpc_transaction.rb +1 -1
  61. data/lib/solana/ruby/kit/transaction_introspection/get_inner_instructions.rb +1 -1
  62. data/lib/solana/ruby/kit/transaction_introspection/get_instructions.rb +1 -1
  63. data/lib/solana/ruby/kit/transaction_introspection/walk_instructions.rb +1 -1
  64. data/lib/solana/ruby/kit/transaction_messages/compute_budget.rb +1 -1
  65. data/lib/solana/ruby/kit/transaction_messages/resource_limit_validation.rb +1 -1
  66. data/lib/solana/ruby/kit/transaction_messages/transaction_message.rb +1 -1
  67. data/lib/solana/ruby/kit/transactions/compiler.rb +2 -2
  68. data/lib/solana/ruby/kit/transactions/transaction.rb +30 -10
  69. data/lib/solana/ruby/kit/version.rb +1 -1
  70. data/lib/solana/ruby/kit/wallet_standard.rb +3 -3
  71. metadata +1 -1
@@ -34,12 +34,32 @@ module Solana::Ruby::Kit
34
34
  const :signatures, T::Hash[String, T.nilable(String)]
35
35
  end
36
36
 
37
- module_function
37
+ # Either transaction struct.
38
+ #
39
+ # Because `FullySignedTransaction` is a *parallel* struct rather than a
40
+ # subclass of `Transaction` (T::Struct is final), it is not a subtype of it,
41
+ # and a signature naming only `Transaction` rejects it. That matters for
42
+ # nearly everything below, because `sign_transaction` returns a
43
+ # `FullySignedTransaction` and encoding, inspecting or sending one is the
44
+ # ordinary next step — `wire_encode_transaction(sign_transaction(...))` is
45
+ # the single most common two-call sequence in the whole library.
46
+ #
47
+ # TypeScript has no such problem: `FullySignedTransaction` there is
48
+ # `Transaction & { readonly [brand] }`, an intersection that *is* assignable
49
+ # to `Transaction`. This alias is the Ruby equivalent of that assignability.
50
+ #
51
+ # Use it for any parameter that reads a transaction. Use `Transaction`
52
+ # alone only where the value is specifically an unsigned or partially
53
+ # signed one, and `FullySignedTransaction` alone only as a return type
54
+ # asserting that signing happened.
55
+ AnyTransaction = T.type_alias { T.any(Transaction, FullySignedTransaction) }
56
+
57
+ extend self
38
58
 
39
59
  # Returns the base58-encoded signature that uniquely identifies a transaction.
40
60
  # This is the fee payer's signature (first entry in the signatures map).
41
61
  # Mirrors `getSignatureFromTransaction(transaction)`.
42
- sig { params(transaction: Transaction).returns(Keys::Signature) }
62
+ sig { params(transaction: AnyTransaction).returns(Keys::Signature) }
43
63
  def get_signature_from_transaction(transaction)
44
64
  sig_bytes = transaction.signatures.values.first
45
65
  Kernel.raise SolanaError.new(:SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING) unless sig_bytes
@@ -49,14 +69,14 @@ module Solana::Ruby::Kit
49
69
 
50
70
  # Returns true if every slot in the signatures map is filled.
51
71
  # Mirrors `isFullySignedTransaction(transaction)`.
52
- sig { params(transaction: Transaction).returns(T::Boolean) }
72
+ sig { params(transaction: AnyTransaction).returns(T::Boolean) }
53
73
  def fully_signed_transaction?(transaction)
54
74
  transaction.signatures.values.all? { |sig| !sig.nil? }
55
75
  end
56
76
 
57
77
  # Raises SolanaError unless every signer slot is filled.
58
78
  # Mirrors `assertIsFullySignedTransaction(transaction)`.
59
- sig { params(transaction: Transaction).void }
79
+ sig { params(transaction: AnyTransaction).void }
60
80
  def assert_fully_signed_transaction!(transaction)
61
81
  missing = transaction.signatures.filter_map { |addr, sig| addr if sig.nil? }
62
82
  return if missing.empty?
@@ -69,14 +89,14 @@ module Solana::Ruby::Kit
69
89
 
70
90
  # Returns true if the wire-encoded transaction fits within TRANSACTION_SIZE_LIMIT.
71
91
  # Mirrors `isTransactionWithinSizeLimit(transaction)`.
72
- sig { params(transaction: Transaction).returns(T::Boolean) }
92
+ sig { params(transaction: AnyTransaction).returns(T::Boolean) }
73
93
  def within_size_limit?(transaction)
74
94
  wire_encode_transaction(transaction).bytesize <= TRANSACTION_SIZE_LIMIT
75
95
  end
76
96
 
77
97
  # Raises SolanaError if the wire-encoded transaction exceeds TRANSACTION_SIZE_LIMIT.
78
98
  # Mirrors `assertIsTransactionWithinSizeLimit(transaction)`.
79
- sig { params(transaction: Transaction).void }
99
+ sig { params(transaction: AnyTransaction).void }
80
100
  def assert_within_size_limit!(transaction)
81
101
  actual = wire_encode_transaction(transaction).bytesize
82
102
  return if actual <= TRANSACTION_SIZE_LIMIT
@@ -90,14 +110,14 @@ module Solana::Ruby::Kit
90
110
  # Returns true if the transaction is both fully signed and within the size limit.
91
111
  # Mirrors `isSendableTransaction(transaction)`.
92
112
  # sendableTransaction = FullySignedTransaction & TransactionWithinSizeLimit
93
- sig { params(transaction: Transaction).returns(T::Boolean) }
113
+ sig { params(transaction: AnyTransaction).returns(T::Boolean) }
94
114
  def sendable_transaction?(transaction)
95
115
  fully_signed_transaction?(transaction) && within_size_limit?(transaction)
96
116
  end
97
117
 
98
118
  # Raises SolanaError unless the transaction is fully signed and within size limit.
99
119
  # Mirrors `assertIsSendableTransaction(transaction)`.
100
- sig { params(transaction: Transaction).void }
120
+ sig { params(transaction: AnyTransaction).void }
101
121
  def assert_sendable_transaction!(transaction)
102
122
  assert_fully_signed_transaction!(transaction)
103
123
  assert_within_size_limit!(transaction)
@@ -112,7 +132,7 @@ module Solana::Ruby::Kit
112
132
  sig do
113
133
  params(
114
134
  signing_keys: T::Array[T.untyped], # Array<RbNaCl::SigningKey>
115
- transaction: Transaction
135
+ transaction: AnyTransaction
116
136
  ).returns(Transaction)
117
137
  end
118
138
  def partially_sign_transaction(signing_keys, transaction)
@@ -155,7 +175,7 @@ module Solana::Ruby::Kit
155
175
  sig do
156
176
  params(
157
177
  signing_keys: T::Array[T.untyped],
158
- transaction: Transaction
178
+ transaction: AnyTransaction
159
179
  ).returns(FullySignedTransaction)
160
180
  end
161
181
  def sign_transaction(signing_keys, transaction)
@@ -4,7 +4,7 @@
4
4
  module Solana
5
5
  module Ruby
6
6
  module Kit
7
- VERSION = '8.2.0'
7
+ VERSION = '8.3.0'
8
8
  end
9
9
  end
10
10
  end
@@ -54,7 +54,7 @@ module Solana::Ruby::Kit
54
54
  DISCONNECT = T.let('standard:disconnect', String)
55
55
  EVENTS = T.let('standard:events', String)
56
56
 
57
- module_function
57
+ extend self
58
58
 
59
59
  # ── Wire-format decoder ───────────────────────────────────────────────────
60
60
 
@@ -165,7 +165,7 @@ module Solana::Ruby::Kit
165
165
  # any signature does not verify. Nil (unfilled) slots are skipped silently;
166
166
  # use +Transactions.assert_fully_signed_transaction!+ to enforce that all
167
167
  # required signers have signed.
168
- sig { params(transaction: Transactions::Transaction).void }
168
+ sig { params(transaction: Transactions::AnyTransaction).void }
169
169
  def verify_transaction_signatures!(transaction)
170
170
  transaction.signatures.each do |addr_str, sig_raw|
171
171
  next if sig_raw.nil?
@@ -201,7 +201,7 @@ module Solana::Ruby::Kit
201
201
  # Returns +true+ if +address+ has provided a cryptographically valid
202
202
  # signature for +transaction+; +false+ if the slot is absent, nil, or the
203
203
  # signature does not verify against +transaction.message_bytes+.
204
- sig { params(transaction: Transactions::Transaction, address: Addresses::Address).returns(T::Boolean) }
204
+ sig { params(transaction: Transactions::AnyTransaction, address: Addresses::Address).returns(T::Boolean) }
205
205
  def signed_by?(transaction, address)
206
206
  sig_raw = transaction.signatures[address.value]
207
207
  return false if sig_raw.nil?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solana-ruby-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.2.0
4
+ version: 8.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Zupan, Idhra Inc.