|
@@ -0,0 +1,125 @@
|
|
|
+import * as anchor from '@project-serum/anchor';
|
|
|
+import { Program } from '@project-serum/anchor';
|
|
|
+import { findProgramAddressSync } from '@project-serum/anchor/dist/cjs/utils/pubkey';
|
|
|
+import { PublicKey } from '@solana/web3.js';
|
|
|
+import assert from 'assert';
|
|
|
+import { BpfUpgradeableState } from '../target/types/bpf_upgradeable_state';
|
|
|
+
|
|
|
+describe('bpf_upgradeable_state', () => {
|
|
|
+ const provider = anchor.Provider.env();
|
|
|
+ // Configure the client to use the local cluster.
|
|
|
+ anchor.setProvider(provider);
|
|
|
+
|
|
|
+ const program = anchor.workspace.BpfUpgradeableState as Program<BpfUpgradeableState>;
|
|
|
+ const programDataAddress = findProgramAddressSync(
|
|
|
+ [program.programId.toBytes()],
|
|
|
+ new anchor.web3.PublicKey("BPFLoaderUpgradeab1e11111111111111111111111")
|
|
|
+ )[0];
|
|
|
+
|
|
|
+ it('Reads ProgramData and sets field', async () => {
|
|
|
+ const settings = anchor.web3.Keypair.generate();
|
|
|
+ const tx = await program.rpc.setAdminSettings(new anchor.BN(500), {
|
|
|
+ accounts: {
|
|
|
+ authority: program.provider.wallet.publicKey,
|
|
|
+ systemProgram: anchor.web3.SystemProgram.programId,
|
|
|
+ programData: programDataAddress,
|
|
|
+ program: program.programId,
|
|
|
+ settings: settings.publicKey
|
|
|
+ },
|
|
|
+ signers: [settings]
|
|
|
+ });
|
|
|
+ assert.equal((await program.account.settings.fetch(settings.publicKey)).adminData, 500);
|
|
|
+
|
|
|
+ console.log("Your transaction signature", tx);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('Validates constraint on ProgramData', async () => {
|
|
|
+ const settings = anchor.web3.Keypair.generate();
|
|
|
+ try {
|
|
|
+ const authority = anchor.web3.Keypair.generate();
|
|
|
+ await provider.connection.confirmTransaction(
|
|
|
+ await provider.connection.requestAirdrop(authority.publicKey, 10000000000),
|
|
|
+ "confirmed"
|
|
|
+ );
|
|
|
+ await program.rpc.setAdminSettings(new anchor.BN(500), {
|
|
|
+ accounts: {
|
|
|
+ authority: authority.publicKey,
|
|
|
+ systemProgram: anchor.web3.SystemProgram.programId,
|
|
|
+ programData: programDataAddress,
|
|
|
+ settings: settings.publicKey,
|
|
|
+ program: program.programId,
|
|
|
+ },
|
|
|
+ signers: [settings, authority]
|
|
|
+ });
|
|
|
+ assert.ok(false);
|
|
|
+ } catch (err) {
|
|
|
+ assert.equal(err.code, 143);
|
|
|
+ assert.equal(err.msg, "A raw constraint was violated");
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('Validates that account is ProgramData', async () => {
|
|
|
+ const settings = anchor.web3.Keypair.generate();
|
|
|
+ try {
|
|
|
+ await program.rpc.setAdminSettings(new anchor.BN(500), {
|
|
|
+ accounts: {
|
|
|
+ authority: program.provider.wallet.publicKey,
|
|
|
+ systemProgram: anchor.web3.SystemProgram.programId,
|
|
|
+ programData: program.programId,
|
|
|
+ settings: settings.publicKey,
|
|
|
+ program: program.programId,
|
|
|
+ },
|
|
|
+ signers: [settings]
|
|
|
+ });
|
|
|
+ assert.ok(false);
|
|
|
+ } catch (err) {
|
|
|
+ assert.equal(err.code, 173);
|
|
|
+ assert.equal(err.msg, "The given account is not a program data account");
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('Validates that account is owned by the upgradeable bpf loader', async () => {
|
|
|
+ const settings = anchor.web3.Keypair.generate();
|
|
|
+ try {
|
|
|
+ await program.rpc.setAdminSettings(new anchor.BN(500), {
|
|
|
+ accounts: {
|
|
|
+ authority: program.provider.wallet.publicKey,
|
|
|
+ systemProgram: anchor.web3.SystemProgram.programId,
|
|
|
+ programData: program.provider.wallet.publicKey,
|
|
|
+ settings: settings.publicKey,
|
|
|
+ program: program.programId,
|
|
|
+ },
|
|
|
+ signers: [settings]
|
|
|
+ });
|
|
|
+ assert.ok(false);
|
|
|
+ } catch (err) {
|
|
|
+ assert.equal(err.code, 167);
|
|
|
+ assert.equal(err.msg, "The given account is not owned by the executing program");
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ it('Deserializes UpgradableLoaderState and validates that programData is the expected account', async () => {
|
|
|
+ const secondProgramAddress = new PublicKey("Fkv67TwmbakfZw2PoW57wYPbqNexAH6vuxpyT8vmrc3B");
|
|
|
+ const secondProgramProgramDataAddress = findProgramAddressSync(
|
|
|
+ [secondProgramAddress.toBytes()],
|
|
|
+ new anchor.web3.PublicKey("BPFLoaderUpgradeab1e11111111111111111111111")
|
|
|
+ )[0];
|
|
|
+
|
|
|
+ const settings = anchor.web3.Keypair.generate();
|
|
|
+ try {
|
|
|
+ await program.rpc.setAdminSettings(new anchor.BN(500), {
|
|
|
+ accounts: {
|
|
|
+ authority: program.provider.wallet.publicKey,
|
|
|
+ systemProgram: anchor.web3.SystemProgram.programId,
|
|
|
+ programData: secondProgramProgramDataAddress,
|
|
|
+ settings: settings.publicKey,
|
|
|
+ program: program.programId,
|
|
|
+ },
|
|
|
+ signers: [settings]
|
|
|
+ });
|
|
|
+ assert.ok(false);
|
|
|
+ } catch (err) {
|
|
|
+ assert.equal(err.code, 300);
|
|
|
+ }
|
|
|
+ });
|
|
|
+});
|