|
|
@@ -0,0 +1,167 @@
|
|
|
+import { AnchorProvider, Wallet } from "@project-serum/anchor";
|
|
|
+import { pythOracleProgram } from "@pythnetwork/client";
|
|
|
+import {
|
|
|
+ getPythClusterApiUrl,
|
|
|
+ getPythProgramKeyForCluster,
|
|
|
+ PythCluster,
|
|
|
+} from "@pythnetwork/client/lib/cluster";
|
|
|
+import { Connection, Keypair, PublicKey } from "@solana/web3.js";
|
|
|
+import { MultisigInstructionProgram, MultisigParser } from "..";
|
|
|
+import { PythMultisigInstruction } from "../multisig_transaction/PythMultisigInstruction";
|
|
|
+
|
|
|
+test("Pyth multisig instruction parse: create price account", (done) => {
|
|
|
+ jest.setTimeout(60000);
|
|
|
+
|
|
|
+ const cluster: PythCluster = "devnet";
|
|
|
+ const pythProgram = pythOracleProgram(
|
|
|
+ getPythProgramKeyForCluster(cluster),
|
|
|
+ new AnchorProvider(
|
|
|
+ new Connection(getPythClusterApiUrl(cluster)),
|
|
|
+ new Wallet(new Keypair()),
|
|
|
+ AnchorProvider.defaultOptions()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ const parser = MultisigParser.fromCluster(cluster);
|
|
|
+
|
|
|
+ pythProgram.methods
|
|
|
+ .addPrice(-8, 1)
|
|
|
+ .accounts({
|
|
|
+ fundingAccount: PublicKey.unique(),
|
|
|
+ productAccount: PublicKey.unique(),
|
|
|
+ priceAccount: PublicKey.unique(),
|
|
|
+ })
|
|
|
+ .instruction()
|
|
|
+ .then((instruction) => {
|
|
|
+ const parsedInstruction = parser.parseInstruction(instruction);
|
|
|
+
|
|
|
+ if (parsedInstruction instanceof PythMultisigInstruction) {
|
|
|
+ expect(parsedInstruction.program).toBe(
|
|
|
+ MultisigInstructionProgram.PythOracle
|
|
|
+ );
|
|
|
+ expect(parsedInstruction.name).toBe("addPrice");
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].pubkey.equals(
|
|
|
+ instruction.keys[0].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].isSigner
|
|
|
+ ).toBe(instruction.keys[0].isSigner);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[0].isWritable);
|
|
|
+ console.log(parsedInstruction.accounts.named["productAccount"]);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["productAccount"].pubkey.equals(
|
|
|
+ instruction.keys[1].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["productAccount"].isSigner
|
|
|
+ ).toBe(instruction.keys[1].isSigner);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["productAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[1].isWritable);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["priceAccount"].pubkey.equals(
|
|
|
+ instruction.keys[2].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(parsedInstruction.accounts.named["priceAccount"].isSigner).toBe(
|
|
|
+ instruction.keys[2].isSigner
|
|
|
+ );
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["priceAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[2].isWritable);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].pubkey.equals(
|
|
|
+ instruction.keys[3].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].isSigner
|
|
|
+ ).toBe(instruction.keys[3].isSigner);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[3].isWritable);
|
|
|
+ expect(parsedInstruction.accounts.remaining.length).toBe(0);
|
|
|
+
|
|
|
+ expect(parsedInstruction.args.expo).toBe(-8);
|
|
|
+ expect(parsedInstruction.args.pType).toBe(1);
|
|
|
+ done();
|
|
|
+ } else {
|
|
|
+ done("Not instance of PythMultisigInstruction");
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+test("Pyth multisig instruction parse: set minimum publishers", (done) => {
|
|
|
+ jest.setTimeout(60000);
|
|
|
+
|
|
|
+ const cluster: PythCluster = "devnet";
|
|
|
+ const pythProgram = pythOracleProgram(
|
|
|
+ getPythProgramKeyForCluster(cluster),
|
|
|
+ new AnchorProvider(
|
|
|
+ new Connection(getPythClusterApiUrl(cluster)),
|
|
|
+ new Wallet(new Keypair()),
|
|
|
+ AnchorProvider.defaultOptions()
|
|
|
+ )
|
|
|
+ );
|
|
|
+ const parser = MultisigParser.fromCluster(cluster);
|
|
|
+
|
|
|
+ pythProgram.methods
|
|
|
+ .setMinPub(25, [0, 0, 0])
|
|
|
+ .accounts({
|
|
|
+ fundingAccount: PublicKey.unique(),
|
|
|
+ priceAccount: PublicKey.unique(),
|
|
|
+ })
|
|
|
+ .instruction()
|
|
|
+ .then((instruction) => {
|
|
|
+ const parsedInstruction = parser.parseInstruction(instruction);
|
|
|
+
|
|
|
+ if (parsedInstruction instanceof PythMultisigInstruction) {
|
|
|
+ expect(parsedInstruction.program).toBe(
|
|
|
+ MultisigInstructionProgram.PythOracle
|
|
|
+ );
|
|
|
+ expect(parsedInstruction.name).toBe("setMinPub");
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].pubkey.equals(
|
|
|
+ instruction.keys[0].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].isSigner
|
|
|
+ ).toBe(instruction.keys[0].isSigner);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["fundingAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[0].isWritable);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["priceAccount"].pubkey.equals(
|
|
|
+ instruction.keys[1].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(parsedInstruction.accounts.named["priceAccount"].isSigner).toBe(
|
|
|
+ instruction.keys[1].isSigner
|
|
|
+ );
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["priceAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[1].isWritable);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].pubkey.equals(
|
|
|
+ instruction.keys[2].pubkey
|
|
|
+ )
|
|
|
+ ).toBeTruthy();
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].isSigner
|
|
|
+ ).toBe(instruction.keys[2].isSigner);
|
|
|
+ expect(
|
|
|
+ parsedInstruction.accounts.named["permissionsAccount"].isWritable
|
|
|
+ ).toBe(instruction.keys[2].isWritable);
|
|
|
+ expect(parsedInstruction.accounts.remaining.length).toBe(0);
|
|
|
+ expect(parsedInstruction.args.minPub).toBe(25);
|
|
|
+ done();
|
|
|
+ } else {
|
|
|
+ done("Not instance of PythMultisigInstruction");
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|