bpf-upgradable-state.ts 6.7 KB

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