@@ -112,6 +112,16 @@ export abstract class Transaction {
112112 */
113113 protected abstract generateEmbeddedBytes ( ) : Uint8Array ;
114114
115+ /**
116+ * @internal
117+ */
118+ protected abstract buildTransaction ( ) : VerifiableTransaction ;
119+
120+ /**
121+ * @internal
122+ */
123+ protected abstract generateBytes ( ) : Uint8Array ;
124+
115125 /**
116126 * @internal
117127 * Serialize and sign transaction creating a new SignedTransaction
@@ -142,8 +152,60 @@ export abstract class Transaction {
142152 }
143153
144154 /**
145- * Converts the transaction into AggregateTransaction compatible
146- * @returns {Array.<*> } AggregateTransaction bytes
155+ * @internal
156+ * Serialize and sign transaction creating a new SignedTransaction
157+ * @param account - The account to sign the transaction
158+ * @param generationHash - Network generation hash hex
159+ * @param {SignSchema } signSchema The Sign Schema. (KECCAK_REVERSED_KEY / SHA3)
160+ * @returns {SignedTransaction }
161+ */
162+ public signWithCatbuffer ( account : Account , generationHash : string , signSchema : SignSchema = SignSchema . SHA3 ) : SignedTransaction {
163+ const generationHashBytes = Array . from ( Convert . hexToUint8 ( generationHash ) ) ;
164+ const byteBuffer = Array . from ( this . generateBytes ( ) ) ;
165+ const signingBytes = generationHashBytes . concat ( byteBuffer . slice ( 4 + 64 + 32 ) ) ;
166+ const keyPairEncoded = KeyPair . createKeyPairFromPrivateKeyString ( account . privateKey , signSchema ) ;
167+ const signature = Array . from ( KeyPair . sign ( account , new Uint8Array ( signingBytes ) , signSchema ) ) ;
168+ const signedTransactionBuffer = byteBuffer
169+ . splice ( 0 , 4 )
170+ . concat ( signature )
171+ . concat ( Array . from ( keyPairEncoded . publicKey ) )
172+ . concat ( byteBuffer
173+ . splice ( 64 + 32 , byteBuffer . length ) ) ;
174+ const payload = Convert . uint8ToHex ( signedTransactionBuffer ) ;
175+ return new SignedTransaction (
176+ payload ,
177+ this . createTransactionHash ( payload , generationHashBytes ) ,
178+ account . publicKey ,
179+ this . type ,
180+ this . networkType ) ;
181+ }
182+
183+ /**
184+ * Generate transaction hash hex
185+ * @param {string } transactionPayload HexString Payload
186+ * @param {Array<number> } generationHashBuffer Network generation hash byte
187+ * @returns {string } Returns Transaction Payload hash
188+ */
189+ public createTransactionHash ( transactionPayload : string , generationHashBuffer : number [ ] ) : string {
190+ const byteBuffer = Array . from ( Convert . hexToUint8 ( transactionPayload ) ) ;
191+ const signingBytes = byteBuffer
192+ . slice ( 4 , 36 )
193+ . concat ( byteBuffer
194+ . slice ( 4 + 64 , 4 + 64 + 32 ) )
195+ . concat ( generationHashBuffer )
196+ . concat ( byteBuffer
197+ . splice ( 4 + 64 + 32 , byteBuffer . length ) ) ;
198+
199+ const hash = new Uint8Array ( 32 ) ;
200+
201+ SHA3Hasher . func ( hash , signingBytes , 32 ) ;
202+
203+ return Convert . uint8ToHex ( hash ) ;
204+ }
205+
206+ /**
207+ * @internal
208+ * @returns {Array<number> }
147209 */
148210 public aggregateTransaction ( ) : number [ ] {
149211 const signer = Convert . hexToUint8 ( this . signer ! . publicKey ) ;
0 commit comments