solana_ruby_wallet_adapter 0.1.1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +608 -0
- data/lib/solana_ruby_wallet_adapter.rb +39 -0
- data/lib/solana_wallet_adapter/adapter.rb +112 -0
- data/lib/solana_wallet_adapter/controller_helpers.rb +69 -0
- data/lib/solana_wallet_adapter/errors.rb +70 -0
- data/lib/solana_wallet_adapter/event_emitter.rb +82 -0
- data/lib/solana_wallet_adapter/message_signer_adapter.rb +123 -0
- data/lib/solana_wallet_adapter/network.rb +30 -0
- data/lib/solana_wallet_adapter/public_key.rb +72 -0
- data/lib/solana_wallet_adapter/railtie.rb +22 -0
- data/lib/solana_wallet_adapter/signature_verifier.rb +86 -0
- data/lib/solana_wallet_adapter/signer_adapter.rb +114 -0
- data/lib/solana_wallet_adapter/transaction.rb +66 -0
- data/lib/solana_wallet_adapter/version.rb +6 -0
- data/lib/solana_wallet_adapter/view_helpers.rb +22 -0
- data/lib/solana_wallet_adapter/wallet_ready_state.rb +19 -0
- data/lib/solana_wallet_adapter/wallet_registry.rb +65 -0
- data/lib/solana_wallet_adapter/wallets/coinbase.rb +77 -0
- data/lib/solana_wallet_adapter/wallets/ledger.rb +74 -0
- data/lib/solana_wallet_adapter/wallets/phantom.rb +118 -0
- data/lib/solana_wallet_adapter/wallets/solflare.rb +85 -0
- data/lib/solana_wallet_adapter/wallets/walletconnect.rb +88 -0
- data/sig/solana_wallet_adapter/adapter.rbi +47 -0
- data/sig/solana_wallet_adapter/errors.rbi +29 -0
- data/sig/solana_wallet_adapter/public_key.rbi +25 -0
- data/sorbet/config +6 -0
- metadata +183 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# typed: strict
|
|
3
|
+
|
|
4
|
+
module SolanaWalletAdapter
|
|
5
|
+
module Wallets
|
|
6
|
+
# WalletConnect adapter – connects via QR-code/deep-link protocol.
|
|
7
|
+
class WalletConnectWalletAdapter < BaseMessageSignerWalletAdapter
|
|
8
|
+
extend T::Sig
|
|
9
|
+
|
|
10
|
+
WALLETCONNECT_ICON = T.let(
|
|
11
|
+
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzAwIiBoZWlnaHQ9IjE4NSIgdmlld0JveD0iMCAwIDMwMCAxODUiIHhtbG5z" \
|
|
12
|
+
"PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYxLjQzODUgMzYuMjU2MkMxMDkuMzQ4IC0x" \
|
|
13
|
+
"Mi4wODU0IDE4Ny4xNjkgLTEyLjA4NTQgMjM1LjA3OCAzNi4yNTYyTDI0MC44ODEgNDIuMTEyN0MyNDMuNDM2IDQ0" \
|
|
14
|
+
"LjY5MDcgMjQzLjQzNiA0OC44NjkzIDI0MC44ODEgNTEuNDQ3M0wyMjAuOTg3IDcxLjQ4NTVDMjE5LjcwOSA3Mi43" \
|
|
15
|
+
"NzQ1IDIxNy42NDQgNzIuNzc0NSAyMTYuMzY2IDcxLjQ4NTVMMjA4LjA2MSA2My4xMjg1QzE3NS40MDkgMzAuMzMw" \
|
|
16
|
+
"MyAxMjEuMTA4IDMwLjMzMDMgODguNDU2IDYzLjEyODVMNzkuNTc3IDcyLjA2NzFDNzguMjk5IDczLjM1NjEgNzYu" \
|
|
17
|
+
"MjMzOSA3My4zNTYxIDc0Ljk1NTkgNzIuMDY3MUw1NS4wNjIyIDUyLjAyODhDNTIuNTA3MyA0OS40NTA4IDUyLjUw" \
|
|
18
|
+
"NzMgNDUuMjcyMiA1NS4wNjIyIDQyLjY5NDJMNjEuNDM4NSAzNi4yNTYyWk0yNzYuNDQ3IDc3Ljk3NzJMMjk0LjIg" \
|
|
19
|
+
"OTUuODQ5MkMyOTYuNzU1IDk4LjQyNzIgMjk2Ljc1NSAxMDIuNjA2IDI5NC4yIDEwNS4xODRMMjEyLjE0NiAxODcu" \
|
|
20
|
+
"Njg5QzIwOS41OTEgMTkwLjI2NyAyMDUuNDYgMTkwLjI2NyAyMDIuOTA1IDE4Ny42ODlMMTQzLjIxMiAxMjcuODI2" \
|
|
21
|
+
"QzE0Mi41NzMgMTI3LjE4MiAxNDEuNTQgMTI3LjE4MiAxNDAuOTAxIDEyNy44MjZMODEuMjA4NiAxODcuNjg5Qzc4" \
|
|
22
|
+
"LjY1MzcgMTkwLjI2NyA3NC41MjMzIDE5MC4yNjcgNzEuOTY4NCAxODcuNjg5TDkuODU2NjkgMTA1LjE4NEM3LjMw" \
|
|
23
|
+
"MTc2IDEwMi42MDYgNy4zMDE3NiA5OC40MjcyIDkuODU2NjkgOTUuODQ5MkwyNy42MDUxIDc3Ljk3NzJDMzAuMTYg" \
|
|
24
|
+
"NzUuMzk5MiAzNC4yOTA0IDc1LjM5OTIgMzYuODQ1MyA3Ny45NzcyTDk2LjUzODUgMTM3Ljg0Qzk3LjE3NzMgMTM4" \
|
|
25
|
+
"LjQ4NCA5OC4yMTA2IDEzOC40ODQgOTguODQ5NCAxMzcuODRMMTU4LjU0MiA3Ny45NzcyQzE2MS4wOTcgNzUuMzk5" \
|
|
26
|
+
"MiAxNjUuMjI3IDc1LjM5OTIgMTY3Ljc4MiA3Ny45NzcyTDIyNy40NzUgMTM3Ljg0QzIyOC4xMTQgMTM4LjQ4NCAy" \
|
|
27
|
+
"MjkuMTQ3IDEzOC40ODQgMjI5Ljc4NiAxMzcuODRMMjg5LjQ3OSA3Ny45NzcyQzI5Mi4wMzQgNzUuMzk5MiAyOTYu" \
|
|
28
|
+
"MTY0IDc1LjM5OTIgMjk4LjcxOSA3Ny45NzcyWiIgZmlsbD0iIzM0OTZGRiIvPjwvc3ZnPg==",
|
|
29
|
+
String
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
sig { override.returns(String) }
|
|
33
|
+
def name = "WalletConnect"
|
|
34
|
+
|
|
35
|
+
sig { override.returns(String) }
|
|
36
|
+
def url = "https://walletconnect.com"
|
|
37
|
+
|
|
38
|
+
sig { override.returns(String) }
|
|
39
|
+
def icon = WALLETCONNECT_ICON
|
|
40
|
+
|
|
41
|
+
sig { override.returns(WalletReadyState) }
|
|
42
|
+
def ready_state = WalletReadyState::Loadable
|
|
43
|
+
|
|
44
|
+
sig { override.returns(T.nilable(PublicKey)) }
|
|
45
|
+
def public_key = nil
|
|
46
|
+
|
|
47
|
+
sig { override.returns(T::Boolean) }
|
|
48
|
+
def connecting? = false
|
|
49
|
+
|
|
50
|
+
sig { override.returns(SupportedTransactionVersions) }
|
|
51
|
+
def supported_transaction_versions
|
|
52
|
+
Set[TransactionVersion::Legacy].freeze
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
sig { override.void }
|
|
56
|
+
def connect
|
|
57
|
+
raise WalletNotReadyError, "#{name} connection is initiated in the browser via QR code"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
sig { override.void }
|
|
61
|
+
def disconnect; end
|
|
62
|
+
|
|
63
|
+
sig do
|
|
64
|
+
override
|
|
65
|
+
.params(transaction: Transaction, rpc_url: String, options: SendTransactionOptions)
|
|
66
|
+
.returns(String)
|
|
67
|
+
end
|
|
68
|
+
def send_transaction(transaction, rpc_url, options = SendTransactionOptions.new)
|
|
69
|
+
raise WalletNotConnectedError, "send_transaction must use a pre-signed transaction server-side"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
sig { override.params(transaction: Transaction).returns(Transaction) }
|
|
73
|
+
def sign_transaction(transaction)
|
|
74
|
+
raise WalletNotConnectedError, "sign_transaction must be performed client-side"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
sig { override.params(transactions: T::Array[Transaction]).returns(T::Array[Transaction]) }
|
|
78
|
+
def sign_all_transactions(transactions)
|
|
79
|
+
raise WalletNotConnectedError, "sign_all_transactions must be performed client-side"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
sig { override.params(message: String).returns(String) }
|
|
83
|
+
def sign_message(message)
|
|
84
|
+
raise WalletNotConnectedError, "sign_message must be performed client-side"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module SolanaWalletAdapter
|
|
4
|
+
class BaseWalletAdapter
|
|
5
|
+
include EventEmitter
|
|
6
|
+
|
|
7
|
+
sig { abstract.returns(String) }
|
|
8
|
+
def name; end
|
|
9
|
+
|
|
10
|
+
sig { abstract.returns(String) }
|
|
11
|
+
def url; end
|
|
12
|
+
|
|
13
|
+
sig { abstract.returns(String) }
|
|
14
|
+
def icon; end
|
|
15
|
+
|
|
16
|
+
sig { abstract.returns(WalletReadyState) }
|
|
17
|
+
def ready_state; end
|
|
18
|
+
|
|
19
|
+
sig { abstract.returns(T.nilable(PublicKey)) }
|
|
20
|
+
def public_key; end
|
|
21
|
+
|
|
22
|
+
sig { abstract.returns(T::Boolean) }
|
|
23
|
+
def connecting?; end
|
|
24
|
+
|
|
25
|
+
sig { returns(SupportedTransactionVersions) }
|
|
26
|
+
def supported_transaction_versions; end
|
|
27
|
+
|
|
28
|
+
sig { abstract.void }
|
|
29
|
+
def connect; end
|
|
30
|
+
|
|
31
|
+
sig { abstract.void }
|
|
32
|
+
def disconnect; end
|
|
33
|
+
|
|
34
|
+
sig do
|
|
35
|
+
abstract
|
|
36
|
+
.params(transaction: Transaction, rpc_url: String, options: SendTransactionOptions)
|
|
37
|
+
.returns(String)
|
|
38
|
+
end
|
|
39
|
+
def send_transaction(transaction, rpc_url, options); end
|
|
40
|
+
|
|
41
|
+
sig { returns(T::Boolean) }
|
|
42
|
+
def connected?; end
|
|
43
|
+
|
|
44
|
+
sig { returns(T::Hash[String, T.untyped]) }
|
|
45
|
+
def to_h; end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module SolanaWalletAdapter
|
|
4
|
+
class WalletError < StandardError
|
|
5
|
+
sig { returns(T.nilable(Exception)) }
|
|
6
|
+
def cause_error; end
|
|
7
|
+
|
|
8
|
+
sig { params(message: T.nilable(String), cause_error: T.nilable(Exception)).void }
|
|
9
|
+
def initialize(message = nil, cause_error = nil); end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class WalletNotReadyError < WalletError; end
|
|
13
|
+
class WalletLoadError < WalletError; end
|
|
14
|
+
class WalletConfigError < WalletError; end
|
|
15
|
+
class WalletConnectionError < WalletError; end
|
|
16
|
+
class WalletDisconnectedError < WalletError; end
|
|
17
|
+
class WalletDisconnectionError < WalletError; end
|
|
18
|
+
class WalletAccountError < WalletError; end
|
|
19
|
+
class WalletPublicKeyError < WalletError; end
|
|
20
|
+
class WalletKeypairError < WalletError; end
|
|
21
|
+
class WalletNotConnectedError < WalletError; end
|
|
22
|
+
class WalletSendTransactionError < WalletError; end
|
|
23
|
+
class WalletSignTransactionError < WalletError; end
|
|
24
|
+
class WalletSignMessageError < WalletError; end
|
|
25
|
+
class WalletSignInError < WalletError; end
|
|
26
|
+
class WalletTimeoutError < WalletError; end
|
|
27
|
+
class WalletWindowBlockedError < WalletError; end
|
|
28
|
+
class WalletWindowClosedError < WalletError; end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# typed: true
|
|
2
|
+
|
|
3
|
+
module SolanaWalletAdapter
|
|
4
|
+
class PublicKey
|
|
5
|
+
BYTE_LENGTH = T.let(32, Integer)
|
|
6
|
+
|
|
7
|
+
sig { returns(String) }
|
|
8
|
+
def bytes; end
|
|
9
|
+
|
|
10
|
+
sig { params(value: T.any(String, T::Array[Integer])).void }
|
|
11
|
+
def initialize(value); end
|
|
12
|
+
|
|
13
|
+
sig { returns(String) }
|
|
14
|
+
def to_base58; end
|
|
15
|
+
|
|
16
|
+
sig { returns(String) }
|
|
17
|
+
def to_s; end
|
|
18
|
+
|
|
19
|
+
sig { returns(T::Array[Integer]) }
|
|
20
|
+
def to_bytes; end
|
|
21
|
+
|
|
22
|
+
sig { params(other: PublicKey).returns(T::Boolean) }
|
|
23
|
+
def ==(other); end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/sorbet/config
ADDED
metadata
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: solana_ruby_wallet_adapter
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- pzupan
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 2026-04-09 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: sorbet-runtime
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.5'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0.5'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: ed25519
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '1.2'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '1.2'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: base58
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0.2'
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0.2'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rails
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '7.0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '7.0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: sorbet
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0.5'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0.5'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: tapioca
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0.11'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '0.11'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: rspec
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '3.12'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '3.12'
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: rspec-rails
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - ">="
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '6.0'
|
|
117
|
+
type: :development
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - ">="
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '6.0'
|
|
124
|
+
description: |
|
|
125
|
+
A Ruby port of @solana/wallet-adapter. Provides typed wallet adapter
|
|
126
|
+
abstractions, server-side signature verification, Sign-In-With-Solana
|
|
127
|
+
(SIWS) helpers, and a wallet registry for Rails applications.
|
|
128
|
+
email: []
|
|
129
|
+
executables: []
|
|
130
|
+
extensions: []
|
|
131
|
+
extra_rdoc_files: []
|
|
132
|
+
files:
|
|
133
|
+
- LICENSE
|
|
134
|
+
- README.md
|
|
135
|
+
- lib/solana_ruby_wallet_adapter.rb
|
|
136
|
+
- lib/solana_wallet_adapter/adapter.rb
|
|
137
|
+
- lib/solana_wallet_adapter/controller_helpers.rb
|
|
138
|
+
- lib/solana_wallet_adapter/errors.rb
|
|
139
|
+
- lib/solana_wallet_adapter/event_emitter.rb
|
|
140
|
+
- lib/solana_wallet_adapter/message_signer_adapter.rb
|
|
141
|
+
- lib/solana_wallet_adapter/network.rb
|
|
142
|
+
- lib/solana_wallet_adapter/public_key.rb
|
|
143
|
+
- lib/solana_wallet_adapter/railtie.rb
|
|
144
|
+
- lib/solana_wallet_adapter/signature_verifier.rb
|
|
145
|
+
- lib/solana_wallet_adapter/signer_adapter.rb
|
|
146
|
+
- lib/solana_wallet_adapter/transaction.rb
|
|
147
|
+
- lib/solana_wallet_adapter/version.rb
|
|
148
|
+
- lib/solana_wallet_adapter/view_helpers.rb
|
|
149
|
+
- lib/solana_wallet_adapter/wallet_ready_state.rb
|
|
150
|
+
- lib/solana_wallet_adapter/wallet_registry.rb
|
|
151
|
+
- lib/solana_wallet_adapter/wallets/coinbase.rb
|
|
152
|
+
- lib/solana_wallet_adapter/wallets/ledger.rb
|
|
153
|
+
- lib/solana_wallet_adapter/wallets/phantom.rb
|
|
154
|
+
- lib/solana_wallet_adapter/wallets/solflare.rb
|
|
155
|
+
- lib/solana_wallet_adapter/wallets/walletconnect.rb
|
|
156
|
+
- sig/solana_wallet_adapter/adapter.rbi
|
|
157
|
+
- sig/solana_wallet_adapter/errors.rbi
|
|
158
|
+
- sig/solana_wallet_adapter/public_key.rbi
|
|
159
|
+
- sorbet/config
|
|
160
|
+
homepage: https://github.com/pzupan/solana-ruby-wallet-adapter
|
|
161
|
+
licenses:
|
|
162
|
+
- Apache-2.0
|
|
163
|
+
metadata:
|
|
164
|
+
homepage_uri: https://github.com/pzupan/solana-ruby-wallet-adapter
|
|
165
|
+
source_code_uri: https://github.com/pzupan/solana-ruby-wallet-adapter
|
|
166
|
+
rdoc_options: []
|
|
167
|
+
require_paths:
|
|
168
|
+
- lib
|
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - ">="
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '3.2'
|
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
|
+
requirements:
|
|
176
|
+
- - ">="
|
|
177
|
+
- !ruby/object:Gem::Version
|
|
178
|
+
version: '0'
|
|
179
|
+
requirements: []
|
|
180
|
+
rubygems_version: 3.6.2
|
|
181
|
+
specification_version: 4
|
|
182
|
+
summary: Modular Solana wallet adapters for Ruby on Rails
|
|
183
|
+
test_files: []
|