bpf-upgradable-state.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import * as anchor from "@project-serum/anchor";
  2. import { AnchorError, Program } from "@project-serum/anchor";
  3. import { findProgramAddressSync } from "@project-serum/anchor/dist/cjs/utils/pubkey";
  4. import { PublicKey } from "@solana/web3.js";
  5. import { assert } from "chai";
  6. import { BpfUpgradeableState } from "../target/types/bpf_upgradeable_state";
  7. describe("bpf_upgradeable_state", () => {
  8. const provider = anchor.AnchorProvider.env();
  9. // Configure the client to use the local cluster.
  10. anchor.setProvider(provider);
  11. const program = anchor.workspace
  12. .BpfUpgradeableState as Program<BpfUpgradeableState>;
  13. const programDataAddress = findProgramAddressSync(
  14. [program.programId.toBytes()],
  15. new anchor.web3.PublicKey("BPFLoaderUpgradeab1e11111111111111111111111")
  16. )[0];
  17. it("Reads ProgramData and sets field", async () => {
  18. const settings = anchor.web3.Keypair.generate();
  19. const tx = await program.rpc.setAdminSettings(new anchor.BN(500), {
  20. accounts: {
  21. authority: provider.wallet.publicKey,
  22. systemProgram: anchor.web3.SystemProgram.programId,
  23. programData: programDataAddress,
  24. program: program.programId,
  25. settings: settings.publicKey,
  26. },
  27. signers: [settings],
  28. });
  29. assert.strictEqual(
  30. (
  31. await program.account.settings.fetch(settings.publicKey)
  32. ).adminData.toNumber(),
  33. 500
  34. );
  35. });
  36. it("Reads ProgramData and sets field, uses program state", async () => {
  37. const settings = anchor.web3.Keypair.generate();
  38. const tx = await program.rpc.setAdminSettingsUseProgramState(
  39. new anchor.BN(500),
  40. {
  41. accounts: {
  42. authority: provider.wallet.publicKey,
  43. systemProgram: anchor.web3.SystemProgram.programId,
  44. programData: programDataAddress,
  45. program: program.programId,
  46. settings: settings.publicKey,
  47. },
  48. signers: [settings],
  49. }
  50. );
  51. assert.strictEqual(
  52. (
  53. await program.account.settings.fetch(settings.publicKey)
  54. ).adminData.toNumber(),
  55. 500
  56. );
  57. });
  58. it("Validates constraint on ProgramData", async () => {
  59. const settings = anchor.web3.Keypair.generate();
  60. try {
  61. const authority = anchor.web3.Keypair.generate();
  62. await provider.connection.confirmTransaction(
  63. await provider.connection.requestAirdrop(
  64. authority.publicKey,
  65. 10000000000
  66. ),
  67. "confirmed"
  68. );
  69. await program.rpc.setAdminSettings(new anchor.BN(500), {
  70. accounts: {
  71. authority: authority.publicKey,
  72. systemProgram: anchor.web3.SystemProgram.programId,
  73. programData: programDataAddress,
  74. settings: settings.publicKey,
  75. program: program.programId,
  76. },
  77. signers: [settings, authority],
  78. });
  79. assert.ok(false);
  80. } catch (_err) {
  81. assert.isTrue(_err instanceof AnchorError);
  82. const err: AnchorError = _err;
  83. assert.strictEqual(err.error.errorCode.number, 2003);
  84. assert.strictEqual(
  85. err.error.errorMessage,
  86. "A raw constraint was violated"
  87. );
  88. }
  89. });
  90. it("Validates that account is ProgramData", async () => {
  91. const settings = anchor.web3.Keypair.generate();
  92. try {
  93. await program.rpc.setAdminSettings(new anchor.BN(500), {
  94. accounts: {
  95. authority: provider.wallet.publicKey,
  96. systemProgram: anchor.web3.SystemProgram.programId,
  97. programData: program.programId,
  98. settings: settings.publicKey,
  99. program: program.programId,
  100. },
  101. signers: [settings],
  102. });
  103. assert.ok(false);
  104. } catch (_err) {
  105. assert.isTrue(_err instanceof AnchorError);
  106. const err: AnchorError = _err;
  107. assert.strictEqual(err.error.errorCode.number, 3013);
  108. assert.strictEqual(
  109. err.error.errorMessage,
  110. "The given account is not a program data account"
  111. );
  112. }
  113. });
  114. it("Validates that account is owned by the upgradeable bpf loader", async () => {
  115. const settings = anchor.web3.Keypair.generate();
  116. try {
  117. await program.rpc.setAdminSettings(new anchor.BN(500), {
  118. accounts: {
  119. authority: provider.wallet.publicKey,
  120. systemProgram: anchor.web3.SystemProgram.programId,
  121. programData: provider.wallet.publicKey,
  122. settings: settings.publicKey,
  123. program: program.programId,
  124. },
  125. signers: [settings],
  126. });
  127. assert.ok(false);
  128. } catch (_err) {
  129. assert.isTrue(_err instanceof AnchorError);
  130. const err: AnchorError = _err;
  131. assert.strictEqual(err.error.errorCode.number, 3007);
  132. assert.strictEqual(
  133. err.error.errorMessage,
  134. "The given account is owned by a different program than expected"
  135. );
  136. }
  137. });
  138. it("Deserializes UpgradableLoaderState and validates that programData is the expected account", async () => {
  139. const secondProgramAddress = new PublicKey(
  140. "Fkv67TwmbakfZw2PoW57wYPbqNexAH6vuxpyT8vmrc3B"
  141. );
  142. const secondProgramProgramDataAddress = findProgramAddressSync(
  143. [secondProgramAddress.toBytes()],
  144. new anchor.web3.PublicKey("BPFLoaderUpgradeab1e11111111111111111111111")
  145. )[0];
  146. const settings = anchor.web3.Keypair.generate();
  147. try {
  148. await program.rpc.setAdminSettings(new anchor.BN(500), {
  149. accounts: {
  150. authority: provider.wallet.publicKey,
  151. systemProgram: anchor.web3.SystemProgram.programId,
  152. programData: secondProgramProgramDataAddress,
  153. settings: settings.publicKey,
  154. program: program.programId,
  155. },
  156. signers: [settings],
  157. });
  158. assert.ok(false);
  159. } catch (_err) {
  160. assert.isTrue(_err instanceof AnchorError);
  161. const err: AnchorError = _err;
  162. assert.strictEqual(err.error.errorCode.number, 6000);
  163. }
  164. });
  165. it("Deserializes Program and validates that programData is the expected account", async () => {
  166. const secondProgramAddress = new PublicKey(
  167. "Fkv67TwmbakfZw2PoW57wYPbqNexAH6vuxpyT8vmrc3B"
  168. );
  169. const secondProgramProgramDataAddress = findProgramAddressSync(
  170. [secondProgramAddress.toBytes()],
  171. new anchor.web3.PublicKey("BPFLoaderUpgradeab1e11111111111111111111111")
  172. )[0];
  173. const settings = anchor.web3.Keypair.generate();
  174. try {
  175. await program.rpc.setAdminSettingsUseProgramState(new anchor.BN(500), {
  176. accounts: {
  177. authority: provider.wallet.publicKey,
  178. systemProgram: anchor.web3.SystemProgram.programId,
  179. programData: secondProgramProgramDataAddress,
  180. settings: settings.publicKey,
  181. program: program.programId,
  182. },
  183. signers: [settings],
  184. });
  185. assert.ok(false);
  186. } catch (_err) {
  187. assert.isTrue(_err instanceof AnchorError);
  188. const err: AnchorError = _err;
  189. assert.strictEqual(err.error.errorCode.number, 2003);
  190. }
  191. });
  192. });