diff --git a/web3.js/src/transaction.js b/web3.js/src/transaction.js index f8013858db..b345cd695d 100644 --- a/web3.js/src/transaction.js +++ b/web3.js/src/transaction.js @@ -153,14 +153,10 @@ export class Transaction { const keys = this.signatures.map(({publicKey}) => publicKey.toString()); let numRequiredSignatures = 0; + let numCreditOnlySignedAccounts = 0; + let numCreditOnlyUnsignedAccounts = 0; - const programIds = []; this.instructions.forEach(instruction => { - const programId = instruction.programId.toString(); - if (!programIds.includes(programId)) { - programIds.push(programId); - } - instruction.keys.forEach(keySignerPair => { const keyStr = keySignerPair.pubkey.toString(); if (!keys.includes(keyStr)) { @@ -170,6 +166,12 @@ export class Transaction { keys.push(keyStr); } }); + + const programId = instruction.programId.toString(); + if (!keys.includes(programId)) { + keys.push(programId); + numCreditOnlyUnsignedAccounts += 1; + } }); if (numRequiredSignatures > this.signatures.length) { @@ -183,9 +185,6 @@ export class Transaction { let keyCount = []; shortvec.encodeLength(keyCount, keys.length); - let programIdCount = []; - shortvec.encodeLength(programIdCount, programIds.length); - const instructions = this.instructions.map(instruction => { const {data, programId} = instruction; let keyIndicesCount = []; @@ -193,7 +192,7 @@ export class Transaction { let dataCount = []; shortvec.encodeLength(dataCount, instruction.data.length); return { - programIdIndex: programIds.indexOf(programId.toString()), + programIdIndex: keys.indexOf(programId.toString()), keyIndicesCount: Buffer.from(keyIndicesCount), keyIndices: Buffer.from( instruction.keys.map(keyObj => @@ -247,27 +246,22 @@ export class Transaction { const signDataLayout = BufferLayout.struct([ BufferLayout.blob(1, 'numRequiredSignatures'), + BufferLayout.blob(1, 'numCreditOnlySignedAccounts'), + BufferLayout.blob(1, 'numCreditOnlyUnsignedAccounts'), BufferLayout.blob(keyCount.length, 'keyCount'), BufferLayout.seq(Layout.publicKey('key'), keys.length, 'keys'), Layout.publicKey('recentBlockhash'), - - BufferLayout.blob(programIdCount.length, 'programIdCount'), - BufferLayout.seq( - Layout.publicKey('programId'), - programIds.length, - 'programIds', - ), ]); const transaction = { numRequiredSignatures: Buffer.from([this.signatures.length]), + numCreditOnlySignedAccounts: Buffer.from([numCreditOnlySignedAccounts]), + numCreditOnlyUnsignedAccounts: Buffer.from([ + numCreditOnlyUnsignedAccounts, + ]), keyCount: Buffer.from(keyCount), keys: keys.map(key => new PublicKey(key).toBuffer()), recentBlockhash: Buffer.from(bs58.decode(recentBlockhash)), - programIdCount: Buffer.from(programIdCount), - programIds: programIds.map(programId => - new PublicKey(programId).toBuffer(), - ), }; let signData = Buffer.alloc(2048); @@ -438,6 +432,8 @@ export class Transaction { } byteArray = byteArray.slice(1); // Skip numRequiredSignatures byte + byteArray = byteArray.slice(1); // Skip numCreditOnlySignedAccounts byte + byteArray = byteArray.slice(1); // Skip numCreditOnlyUnsignedAccounts byte const accountCount = shortvec.decodeLength(byteArray); let accounts = []; @@ -450,14 +446,6 @@ export class Transaction { const recentBlockhash = byteArray.slice(0, PUBKEY_LENGTH); byteArray = byteArray.slice(PUBKEY_LENGTH); - const programIdCount = shortvec.decodeLength(byteArray); - let programs = []; - for (let i = 0; i < programIdCount; i++) { - const program = byteArray.slice(0, PUBKEY_LENGTH); - byteArray = byteArray.slice(PUBKEY_LENGTH); - programs.push(program); - } - const instructionCount = shortvec.decodeLength(byteArray); let instructions = []; for (let i = 0; i < instructionCount; i++) { @@ -484,7 +472,7 @@ export class Transaction { for (let i = 0; i < instructionCount; i++) { let instructionData = { keys: [], - programId: new PublicKey(programs[instructions[i].programIndex]), + programId: new PublicKey(accounts[instructions[i].programIndex]), data: Buffer.from(instructions[i].data), }; for (let j = 0; j < instructions[i].accountIndex.length; j++) { diff --git a/web3.js/test/transaction.test.js b/web3.js/test/transaction.test.js index 6bf505f646..e9ac56bd2f 100644 --- a/web3.js/test/transaction.test.js +++ b/web3.js/test/transaction.test.js @@ -93,72 +93,74 @@ test('parse wire format and serialize', () => { const wireTransaction = Buffer.from([ 1, + 91, 132, - 50, - 204, - 17, - 25, - 230, - 33, - 52, - 8, - 149, - 124, - 56, - 114, - 17, - 236, - 92, - 93, - 53, - 234, - 122, - 120, - 219, - 193, - 255, - 2, - 14, - 87, - 12, - 207, - 99, - 241, - 32, - 151, - 102, - 70, - 60, - 218, - 73, - 232, - 68, - 33, - 94, - 134, - 117, - 138, - 182, - 179, - 118, - 249, - 132, - 52, - 41, - 162, - 44, - 0, - 43, - 193, - 242, - 120, - 108, - 4, - 163, - 191, - 6, + 173, 1, - 2, + 218, + 94, + 253, + 18, + 27, + 79, + 207, + 114, + 27, + 167, + 127, + 17, + 202, + 183, + 204, + 12, + 69, + 243, + 25, + 206, + 165, + 116, + 182, + 64, + 185, + 168, + 238, + 168, + 193, + 140, + 86, + 83, + 107, + 252, + 239, + 80, + 40, + 91, + 44, + 6, + 160, + 84, + 43, + 227, + 63, + 170, + 255, + 185, + 132, + 242, + 82, + 46, + 124, + 217, + 127, + 147, + 24, + 254, + 157, + 13, + 1, + 0, + 1, + 3, 19, 152, 246, @@ -223,6 +225,38 @@ test('parse wire format and serialize', () => { 74, 243, 252, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 196, 154, 231, @@ -256,40 +290,7 @@ test('parse wire format and serialize', () => { 82, 235, 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, + 2, 2, 0, 1,