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.
@@ -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
@@ -0,0 +1,6 @@
1
+ --dir
2
+ lib
3
+ --dir
4
+ sig
5
+ --ignore
6
+ lib/solana_wallet_adapter/railtie.rb
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: []