diff --git a/web3.js/src/connection.js b/web3.js/src/connection.js index 0d683be13e..14b3aba629 100644 --- a/web3.js/src/connection.js +++ b/web3.js/src/connection.js @@ -431,8 +431,15 @@ export class Connection { async sendRawTransaction( rawTransaction: Buffer, ): Promise { + + // sendTransaction RPC API requires a u64 length field prepended to the raw + // Transaction bytes + const rpcTransaction = Buffer.alloc(8 + rawTransaction.length); + rpcTransaction.writeUInt32LE(rawTransaction.length, 0); + rawTransaction.copy(rpcTransaction, 8); + const unsafeRes = await this._rpcRequest('sendTransaction', [ - [...rawTransaction], + [...rpcTransaction], ]); const res = SendTransactionRpcResult(unsafeRes); if (res.error) { diff --git a/web3.js/src/transaction.js b/web3.js/src/transaction.js index e48f6a7124..e0ad14fe6d 100644 --- a/web3.js/src/transaction.js +++ b/web3.js/src/transaction.js @@ -365,21 +365,20 @@ export class Transaction { shortvec.encodeLength(signatureCount, signatures.length); const transactionLength = signatureCount.length + signatures.length * 64 + signData.length; - const wireTransaction = Buffer.alloc(8 + transactionLength); - wireTransaction.writeUInt32LE(transactionLength, 0); + const wireTransaction = Buffer.alloc(transactionLength); invariant(signatures.length < 256); - Buffer.from(signatureCount).copy(wireTransaction, 8); + Buffer.from(signatureCount).copy(wireTransaction, 0); signatures.forEach(({signature}, index) => { invariant(signature !== null, `null signature`); invariant(signature.length === 64, `signature has invalid length`); Buffer.from(signature).copy( wireTransaction, - 8 + signatureCount.length + index * 64, + signatureCount.length + index * 64, ); }); signData.copy( wireTransaction, - 8 + signatureCount.length + signatures.length * 64, + signatureCount.length + signatures.length * 64, ); invariant( wireTransaction.length <= PACKET_DATA_SIZE, @@ -427,11 +426,6 @@ export class Transaction { // Slice up wire data let byteArray = [...buffer]; - const transactionLength = byteArray.slice(0, 8); - byteArray = byteArray.slice(8); - const len = Buffer.from(transactionLength).readIntLE(0, 4); - invariant(len == byteArray.length); - const signatureCount = shortvec.decodeLength(byteArray); let signatures = []; for (let i = 0; i < signatureCount; i++) { diff --git a/web3.js/test/transaction.test.js b/web3.js/test/transaction.test.js index b13b39296f..8c29f62954 100644 --- a/web3.js/test/transaction.test.js +++ b/web3.js/test/transaction.test.js @@ -51,14 +51,6 @@ test('parse wire format and serialize', () => { expectedTransaction.sign(sender); const wireTransaction = Buffer.from([ - 221, - 0, - 0, - 0, - 0, - 0, - 0, - 0, 1, 50, 238,