11const bs58 = require ( "bs58" ) ;
2- const nacl = require ( ' tweetnacl' ) ;
2+ const nacl = require ( " tweetnacl" ) ;
33const helper = require ( "./helper" ) ;
44const ObservableStore = require ( "obs-store" ) ;
5- const solanaWeb3 = require ( '@solana/web3.js' ) ;
6-
5+ const solanaWeb3 = require ( "@solana/web3.js" ) ;
76
87const {
98 solana : { HD_PATH } ,
@@ -61,7 +60,7 @@ class KeyringController {
6160 }
6261
6362 async signMessage ( message , _address ) {
64- const { mnemonic, address } = this . store . getState ( )
63+ const { mnemonic, address } = this . store . getState ( ) ;
6564 const idx = address . indexOf ( _address ) ;
6665
6766 if ( idx < 0 )
@@ -87,34 +86,55 @@ class KeyringController {
8786
8887 try {
8988 const signer = helper . setupAccount ( mnemonic , helper . getHDPath ( idx ) ) ;
90-
9189 const connection = new solanaWeb3 . Connection ( network , "confirmed" ) ;
9290
93- const rawTx = await helper . generateTransactionObject ( transaction , signer , connection ) ;
94-
95- const rawSignedTxn = await helper . signTransaction ( rawTx , signer , connection , [ ] ) ;
96-
97- const signedTxn = rawSignedTxn . serialize ( ) . toString ( "hex" ) ;
98-
99- return { signedTransaction : signedTxn } ;
91+ // 🔄 Generate the transaction object (legacy or versioned)
92+ const rawTx = await helper . generateTransactionObject (
93+ transaction ,
94+ signer ,
95+ connection
96+ ) ;
97+
98+ // 🔁 Return serialized transaction in hex
99+ if ( transaction . serializedTx ) {
100+ // 🔐 Sign if it's not already signed
101+ if (
102+ rawTx . signatures &&
103+ rawTx . signatures . some ( ( sig ) => sig === undefined || sig . length === 0 )
104+ ) {
105+ rawTx . sign ( [ signer ] ) ;
106+ }
107+ const signedTxn = Buffer . from ( rawTx . serialize ( ) ) . toString ( "hex" ) ;
108+ return { signedTransaction : signedTxn } ;
109+ } else {
110+ const rawSignedTxn = await helper . signTransaction (
111+ rawTx ,
112+ signer ,
113+ connection ,
114+ [ ]
115+ ) ;
116+
117+ const signedTxn = rawSignedTxn . serialize ( ) . toString ( "hex" ) ;
118+ return { signedTransaction : signedTxn } ;
119+ }
100120 } catch ( err ) {
101121 throw err ;
102122 }
103123 }
104124
105125 async sendTransaction ( rawTransaction ) {
106-
107126 try {
108- const { network } = this . store . getState ( )
109- const stringBuff = Buffer . from ( rawTransaction , 'hex' )
110-
111- const connection = new solanaWeb3 . Connection ( network , "confirmed" )
112- const transactionDetails = await connection . sendRawTransaction ( stringBuff )
113- return { transactionDetails : transactionDetails }
127+ const { network } = this . store . getState ( ) ;
128+ const stringBuff = Buffer . from ( rawTransaction , "hex" ) ;
114129
130+ const connection = new solanaWeb3 . Connection ( network , "confirmed" ) ;
131+ const transactionDetails = await connection . sendRawTransaction (
132+ stringBuff
133+ ) ;
134+ return { transactionDetails : transactionDetails } ;
115135 } catch ( err ) {
116136 console . log ( err ) ;
117- throw err
137+ throw err ;
118138 }
119139 }
120140
@@ -126,18 +146,28 @@ class KeyringController {
126146 if ( idx < 0 )
127147 throw "Invalid address, the address is not available in the wallet" ;
128148
129- const signer = helper . setupAccount ( mnemonic , helper . getHDPath ( idx ) ) ;
149+ const signer = helper . setupAccount ( mnemonic , helper . getHDPath ( idx ) ) ;
130150
131- const connection = new solanaWeb3 . Connection ( network , "confirmed" ) ;
151+ const connection = new solanaWeb3 . Connection ( network , "confirmed" ) ;
132152
133- const rawTx = await helper . generateTransactionObject ( rawTransaction , signer , connection ) ;
134-
135- const rawSignedTxn = await helper . signTransaction ( rawTx , signer , connection , [ ] ) ;
153+ const rawTx = await helper . generateTransactionObject (
154+ rawTransaction ,
155+ signer ,
156+ connection
157+ ) ;
136158
137- const fees = await connection . getFeeForMessage ( rawSignedTxn . compileMessage ( ) ) ;
159+ const rawSignedTxn = await helper . signTransaction (
160+ rawTx ,
161+ signer ,
162+ connection ,
163+ [ ]
164+ ) ;
138165
139- return { fees : fees . value } ;
166+ const fees = await connection . getFeeForMessage (
167+ rawSignedTxn . compileMessage ( )
168+ ) ;
140169
170+ return { fees : fees . value } ;
141171 }
142172
143173 persistAllAddress ( _address ) {
@@ -156,13 +186,16 @@ class KeyringController {
156186
157187const getBalance = async ( address , network ) => {
158188 try {
159- const _network = helper . getNetwork ( network )
160- const connection = new solanaWeb3 . Connection ( _network , "confirmed" )
161- const accInfo = await connection . getAccountInfo ( new solanaWeb3 . PublicKey ( address ) , 'confirmed' )
162- return { balance : accInfo ? accInfo . lamports : 0 }
189+ const _network = helper . getNetwork ( network ) ;
190+ const connection = new solanaWeb3 . Connection ( _network , "confirmed" ) ;
191+ const accInfo = await connection . getAccountInfo (
192+ new solanaWeb3 . PublicKey ( address ) ,
193+ "confirmed"
194+ ) ;
195+ return { balance : accInfo ? accInfo . lamports : 0 } ;
163196 } catch ( err ) {
164- throw err
197+ throw err ;
165198 }
166- }
199+ } ;
167200
168201module . exports = { KeyringController, getBalance } ;
0 commit comments