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.
- checksums.yaml +4 -4
- data/README.md +82 -12
- data/lib/solana/ruby/kit/accounts/maybe_account.rb +1 -1
- data/lib/solana/ruby/kit/addresses/address.rb +1 -1
- data/lib/solana/ruby/kit/addresses/curve.rb +1 -1
- data/lib/solana/ruby/kit/addresses/program_derived_address.rb +1 -1
- data/lib/solana/ruby/kit/addresses/public_key.rb +1 -1
- data/lib/solana/ruby/kit/codecs/codec.rb +95 -1
- data/lib/solana/ruby/kit/codecs/data_structures.rb +51 -8
- data/lib/solana/ruby/kit/codecs/numbers.rb +49 -50
- data/lib/solana/ruby/kit/codecs/strings.rb +132 -6
- data/lib/solana/ruby/kit/encoding/base58.rb +1 -1
- data/lib/solana/ruby/kit/errors.rb +6 -0
- data/lib/solana/ruby/kit/fast_stable_stringify.rb +1 -1
- data/lib/solana/ruby/kit/functional.rb +1 -1
- data/lib/solana/ruby/kit/instruction_plans/instruction_plan.rb +1 -1
- data/lib/solana/ruby/kit/instruction_plans/max_instructions.rb +1 -1
- data/lib/solana/ruby/kit/instruction_plans/transaction_plan.rb +1 -1
- data/lib/solana/ruby/kit/instruction_plans/transaction_plan_executor.rb +2 -2
- data/lib/solana/ruby/kit/instruction_plans/transaction_plan_result.rb +1 -1
- data/lib/solana/ruby/kit/instruction_plans/transaction_planner.rb +2 -2
- data/lib/solana/ruby/kit/instructions/accounts.rb +1 -1
- data/lib/solana/ruby/kit/instructions/instruction.rb +1 -1
- data/lib/solana/ruby/kit/instructions/roles.rb +1 -1
- data/lib/solana/ruby/kit/keys/key_pair.rb +1 -1
- data/lib/solana/ruby/kit/keys/private_key.rb +1 -1
- data/lib/solana/ruby/kit/keys/public_key.rb +1 -1
- data/lib/solana/ruby/kit/keys/signatures.rb +1 -1
- data/lib/solana/ruby/kit/offchain_messages/codec.rb +1 -1
- data/lib/solana/ruby/kit/offchain_messages/message_v1.rb +1 -1
- data/lib/solana/ruby/kit/options/option.rb +1 -1
- data/lib/solana/ruby/kit/plugin_core.rb +1 -1
- data/lib/solana/ruby/kit/programs/associated_token_account.rb +1 -1
- data/lib/solana/ruby/kit/programs/stake_program.rb +1 -1
- data/lib/solana/ruby/kit/programs/system_program.rb +1 -1
- data/lib/solana/ruby/kit/programs.rb +1 -1
- data/lib/solana/ruby/kit/promises.rb +1 -1
- data/lib/solana/ruby/kit/resource_limit_estimation.rb +1 -1
- data/lib/solana/ruby/kit/rpc_parsed_types/address_lookup_table.rb +1 -1
- data/lib/solana/ruby/kit/rpc_parsed_types/nonce_account.rb +1 -1
- data/lib/solana/ruby/kit/rpc_parsed_types/stake_account.rb +1 -1
- data/lib/solana/ruby/kit/rpc_parsed_types/token_account.rb +1 -1
- data/lib/solana/ruby/kit/rpc_parsed_types/vote_account.rb +1 -1
- data/lib/solana/ruby/kit/rpc_types/cluster_url.rb +1 -1
- data/lib/solana/ruby/kit/rpc_types/commitment.rb +1 -1
- data/lib/solana/ruby/kit/rpc_types/lamports.rb +1 -1
- data/lib/solana/ruby/kit/rpc_types/sol.rb +1 -1
- data/lib/solana/ruby/kit/signers/keypair_signer.rb +1 -1
- data/lib/solana/ruby/kit/subscribable/async_iterable.rb +1 -1
- data/lib/solana/ruby/kit/subscribable/bridge_store_to_async_iterable.rb +1 -1
- data/lib/solana/ruby/kit/subscribable/reactive_action_store.rb +1 -1
- data/lib/solana/ruby/kit/subscribable/reactive_stream_store.rb +1 -1
- data/lib/solana/ruby/kit/sysvars/clock.rb +1 -1
- data/lib/solana/ruby/kit/sysvars/epoch_schedule.rb +1 -1
- data/lib/solana/ruby/kit/sysvars/last_restart_slot.rb +1 -1
- data/lib/solana/ruby/kit/sysvars/rent.rb +1 -1
- data/lib/solana/ruby/kit/sysvars.rb +1 -1
- data/lib/solana/ruby/kit/transaction_confirmation.rb +1 -1
- data/lib/solana/ruby/kit/transaction_introspection/compiled_transaction_message.rb +1 -1
- data/lib/solana/ruby/kit/transaction_introspection/decode_rpc_transaction.rb +1 -1
- data/lib/solana/ruby/kit/transaction_introspection/get_inner_instructions.rb +1 -1
- data/lib/solana/ruby/kit/transaction_introspection/get_instructions.rb +1 -1
- data/lib/solana/ruby/kit/transaction_introspection/walk_instructions.rb +1 -1
- data/lib/solana/ruby/kit/transaction_messages/compute_budget.rb +1 -1
- data/lib/solana/ruby/kit/transaction_messages/resource_limit_validation.rb +1 -1
- data/lib/solana/ruby/kit/transaction_messages/transaction_message.rb +1 -1
- data/lib/solana/ruby/kit/transactions/compiler.rb +2 -2
- data/lib/solana/ruby/kit/transactions/transaction.rb +30 -10
- data/lib/solana/ruby/kit/version.rb +1 -1
- data/lib/solana/ruby/kit/wallet_standard.rb +3 -3
- 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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
178
|
+
transaction: AnyTransaction
|
|
159
179
|
).returns(FullySignedTransaction)
|
|
160
180
|
end
|
|
161
181
|
def sign_transaction(signing_keys, transaction)
|
|
@@ -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
|
-
|
|
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::
|
|
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::
|
|
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?
|