@@ -214,16 +214,12 @@ export abstract class Transaction {
214214 public signWith ( account : Account , generationHash : string ) : SignedTransaction {
215215 const generationHashBytes = Array . from ( Convert . hexToUint8 ( generationHash ) ) ;
216216 const byteBuffer = Array . from ( this . generateBytes ( ) ) ;
217+ // 1. prepare the raw transaction to be signed
217218 const signingBytes = this . getSigningBytes ( byteBuffer , generationHashBytes ) ;
218- const keyPairEncoded = KeyPair . createKeyPairFromPrivateKeyString ( account . privateKey ) ;
219- const signature = Array . from ( KeyPair . sign ( keyPairEncoded , new Uint8Array ( signingBytes ) ) ) ;
220- const signedTransactionBuffer = byteBuffer
221- . splice ( 0 , 8 )
222- . concat ( signature )
223- . concat ( Array . from ( keyPairEncoded . publicKey ) )
224- . concat ( Array . from ( new Uint8Array ( 4 ) ) )
225- . concat ( byteBuffer . splice ( 64 + 32 + 4 , byteBuffer . length ) ) ;
226- const payload = Convert . uint8ToHex ( signedTransactionBuffer ) ;
219+ // 2. sign the raw transaction
220+ const signature = Transaction . signRawTransaction ( account . privateKey , Uint8Array . from ( signingBytes ) ) ;
221+ // 3. prepare the (signed) payload
222+ const payload = Transaction . preparePayload ( Uint8Array . from ( byteBuffer ) , signature , account . publicKey ) ;
227223 return new SignedTransaction (
228224 payload ,
229225 Transaction . createTransactionHash ( payload , generationHashBytes ) ,
@@ -233,6 +229,36 @@ export abstract class Transaction {
233229 ) ;
234230 }
235231
232+ /**
233+ * Signs raw transaction with the given private key
234+ * @param {string } privateKey - Private key of the signer account
235+ * @param {Uint8Array } rawTransactionSigningBytes - Raw transaction siging bytes
236+ * @returns {Uint8Array } Signature byte array
237+ */
238+ public static signRawTransaction ( privateKey : string , rawTransactionSigningBytes : Uint8Array ) : Uint8Array {
239+ const keyPairEncoded = KeyPair . createKeyPairFromPrivateKeyString ( privateKey ) ;
240+ return KeyPair . sign ( keyPairEncoded , new Uint8Array ( rawTransactionSigningBytes ) ) ;
241+ }
242+
243+ /**
244+ * Prepares and return signed payload
245+ * @param {Uint8Array } serializedTransaction Serialized transaction
246+ * @param {Uint8Array } signature Signature of the transaction
247+ * @param {string } publicKey Public key of the signing account
248+ * @returns {string } Payload (ready to be announced)
249+ */
250+ public static preparePayload ( serializedTransaction : Uint8Array , signature : Uint8Array , publicKey : string ) : string {
251+ const transactionBytes = Array . from ( serializedTransaction ) ;
252+ const signatureBytes = Array . from ( signature ) ;
253+ const signedTransactionBuffer = transactionBytes
254+ . splice ( 0 , 8 )
255+ . concat ( signatureBytes )
256+ . concat ( Array . from ( Convert . hexToUint8 ( publicKey ) ) )
257+ . concat ( Array . from ( new Uint8Array ( 4 ) ) )
258+ . concat ( transactionBytes . splice ( 64 + 32 + 4 , transactionBytes . length ) ) ;
259+ return Convert . uint8ToHex ( signedTransactionBuffer ) ;
260+ }
261+
236262 /**
237263 * Generate signing bytes
238264 * @param payloadBytes Payload buffer
0 commit comments