Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/rare-bears-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solana/compat": patch
---

Fixed a bug where calling `fromVersionedTransaction()` with a `VersionedTransaction` that uses address table lookups would result in a runtime fatal
78 changes: 23 additions & 55 deletions packages/compat/src/__tests__/transaction-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,13 @@ describe('fromVersionedTransaction', () => {
const messageBytes = new Uint8Array([1, 2, 3, 4]);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [],
};
},
header: {
numRequiredSignatures: 0,
},
serialize() {
return messageBytes;
},
staticAccountKeys: [],
},
signatures: [],
} as unknown as VersionedTransaction;
Expand All @@ -32,17 +28,13 @@ describe('fromVersionedTransaction', () => {
it('freezes the signature map', () => {
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [],
};
},
header: {
numRequiredSignatures: 0,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [],
},
signatures: [],
} as unknown as VersionedTransaction;
Expand All @@ -55,17 +47,13 @@ describe('fromVersionedTransaction', () => {
const signature = new Uint8Array([1, 2, 3, 4]);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK')],
};
},
header: {
numRequiredSignatures: 1,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK')],
},
signatures: [signature],
} as unknown as VersionedTransaction;
Expand All @@ -80,17 +68,13 @@ describe('fromVersionedTransaction', () => {
const nullSignature = new Uint8Array(64).fill(0);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK')],
};
},
header: {
numRequiredSignatures: 1,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK')],
},
signatures: [nullSignature],
} as unknown as VersionedTransaction;
Expand All @@ -107,21 +91,17 @@ describe('fromVersionedTransaction', () => {
const signature3 = new Uint8Array(64).fill(3);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
};
},
header: {
numRequiredSignatures: 3,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
},
signatures: [signature1, signature2, signature3],
} as unknown as VersionedTransaction;
Expand All @@ -138,21 +118,17 @@ describe('fromVersionedTransaction', () => {
const nullSignature = new Uint8Array(64).fill(0);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
};
},
header: {
numRequiredSignatures: 3,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
},
signatures: [nullSignature, nullSignature, nullSignature],
} as unknown as VersionedTransaction;
Expand All @@ -171,21 +147,17 @@ describe('fromVersionedTransaction', () => {
const signature3 = new Uint8Array(64).fill(3);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
};
},
header: {
numRequiredSignatures: 3,
},
serialize() {
return new Uint8Array();
},
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
new PublicKey('F7Kzv7G6p1PvHXL1xXLPTm4myKWpLjnVphCV8ABZJfgT'),
],
},
signatures: [signature1, nullSignature, signature3],
} as unknown as VersionedTransaction;
Expand All @@ -202,20 +174,16 @@ describe('fromVersionedTransaction', () => {
const messageBytes = new Uint8Array([1, 2, 3, 4]);
const transaction = {
message: {
getAccountKeys() {
return {
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
],
};
},
header: {
numRequiredSignatures: 2,
},
serialize() {
return messageBytes;
},
staticAccountKeys: [
new PublicKey('7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK'),
new PublicKey('9A87Qt8sxxLMe7hcrjC4cPnho1CwWKRpk84ZTRPyvWNw'),
],
},
signatures: [new Uint8Array(64).fill(1)],
} as unknown as VersionedTransaction;
Expand Down
2 changes: 1 addition & 1 deletion packages/compat/src/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ function convertSignatures(transaction: VersionedTransaction, staticAccountKeys:
*/
export function fromVersionedTransaction(transaction: VersionedTransaction): Transaction {
const { message } = transaction;
const { staticAccountKeys } = message.getAccountKeys();
const staticAccountKeys = message.staticAccountKeys;

const { numRequiredSignatures } = message.header;
if (numRequiredSignatures !== transaction.signatures.length) {
Expand Down
Loading