|
|
@@ -0,0 +1,105 @@
|
|
|
+import { PythCluster } from "@pythnetwork/client";
|
|
|
+import {
|
|
|
+ BpfUpgradableLoaderInstruction,
|
|
|
+ MultisigInstructionProgram,
|
|
|
+ MultisigParser,
|
|
|
+ UNRECOGNIZED_INSTRUCTION,
|
|
|
+} from "../multisig_transaction";
|
|
|
+import {
|
|
|
+ PublicKey,
|
|
|
+ SYSVAR_CLOCK_PUBKEY,
|
|
|
+ SYSVAR_RENT_PUBKEY,
|
|
|
+ TransactionInstruction,
|
|
|
+} from "@solana/web3.js";
|
|
|
+import { BPF_UPGRADABLE_LOADER } from "../bpf_upgradable_loader";
|
|
|
+
|
|
|
+test("Bpf Upgradable Loader multisig instruction parse", (done) => {
|
|
|
+ jest.setTimeout(60000);
|
|
|
+
|
|
|
+ const cluster: PythCluster = "devnet";
|
|
|
+
|
|
|
+ const parser = MultisigParser.fromCluster(cluster);
|
|
|
+
|
|
|
+ const upgradeInstruction = new TransactionInstruction({
|
|
|
+ programId: BPF_UPGRADABLE_LOADER,
|
|
|
+ data: Buffer.from([3, 0, 0, 0]),
|
|
|
+ keys: [
|
|
|
+ { pubkey: new PublicKey(0), isSigner: false, isWritable: true },
|
|
|
+ { pubkey: new PublicKey(1), isSigner: false, isWritable: true },
|
|
|
+ { pubkey: new PublicKey(2), isSigner: false, isWritable: true },
|
|
|
+ { pubkey: new PublicKey(3), isSigner: false, isWritable: true },
|
|
|
+ { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },
|
|
|
+ { pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
|
|
|
+ {
|
|
|
+ pubkey: new PublicKey(4),
|
|
|
+ isSigner: true,
|
|
|
+ isWritable: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ pubkey: new PublicKey(5),
|
|
|
+ isSigner: true,
|
|
|
+ isWritable: false,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ });
|
|
|
+
|
|
|
+ const parsedInstruction = parser.parseInstruction(upgradeInstruction);
|
|
|
+ if (parsedInstruction instanceof BpfUpgradableLoaderInstruction) {
|
|
|
+ expect(parsedInstruction.program).toBe(
|
|
|
+ MultisigInstructionProgram.BpfUpgradableLoader
|
|
|
+ );
|
|
|
+ expect(parsedInstruction.name).toBe("Upgrade");
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.programData.pubkey.equals(
|
|
|
+ new PublicKey(0)
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.program.pubkey.equals(new PublicKey(1))
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.buffer.pubkey.equals(new PublicKey(2))
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.spill.pubkey.equals(new PublicKey(3))
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.rent.pubkey.equals(SYSVAR_RENT_PUBKEY)
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.clock.pubkey.equals(SYSVAR_CLOCK_PUBKEY)
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named.upgradeAuthority.pubkey.equals(
|
|
|
+ new PublicKey(4)
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(parsedInstruction.accounts.remaining.length).toBe(1);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.remaining[0].pubkey.equals(new PublicKey(5))
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(parsedInstruction.args).toEqual({});
|
|
|
+ } else {
|
|
|
+ done("Not instance of BpfUpgradableLoaderInstruction");
|
|
|
+ }
|
|
|
+
|
|
|
+ const badInstruction = new TransactionInstruction({
|
|
|
+ keys: [],
|
|
|
+ programId: new PublicKey(BPF_UPGRADABLE_LOADER),
|
|
|
+ data: Buffer.from([9]),
|
|
|
+ });
|
|
|
+
|
|
|
+ const parsedBadInstruction = parser.parseInstruction(badInstruction);
|
|
|
+ if (parsedBadInstruction instanceof BpfUpgradableLoaderInstruction) {
|
|
|
+ expect(parsedBadInstruction.program).toBe(
|
|
|
+ MultisigInstructionProgram.BpfUpgradableLoader
|
|
|
+ );
|
|
|
+ expect(parsedBadInstruction.name).toBe(UNRECOGNIZED_INSTRUCTION);
|
|
|
+ expect(
|
|
|
+ parsedBadInstruction.args.data.equals(Buffer.from([9]))
|
|
|
+ ).toBeTruthy();
|
|
|
+ done();
|
|
|
+ } else {
|
|
|
+ done("Not instance of BpfUpgradableLoaderInstruction");
|
|
|
+ }
|
|
|
+});
|