@@ -214,16 +214,12 @@ export abstract class Transaction {
214
214
public signWith ( account : Account , generationHash : string ) : SignedTransaction {
215
215
const generationHashBytes = Array . from ( Convert . hexToUint8 ( generationHash ) ) ;
216
216
const byteBuffer = Array . from ( this . generateBytes ( ) ) ;
217
+ // 1. prepare the raw transaction to be signed
217
218
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 ) ;
227
223
return new SignedTransaction (
228
224
payload ,
229
225
Transaction . createTransactionHash ( payload , generationHashBytes ) ,
@@ -233,6 +229,36 @@ export abstract class Transaction {
233
229
) ;
234
230
}
235
231
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
+
236
262
/**
237
263
* Generate signing bytes
238
264
* @param payloadBytes Payload buffer
0 commit comments