system_instruction.spec.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // SPDX-License-Identifier: Apache-2.0
  2. import { loadContract } from "./setup";
  3. import { Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js";
  4. import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
  5. describe('Test system instructions', function () {
  6. this.timeout(500000);
  7. const system_account = new PublicKey('11111111111111111111111111111111');
  8. const recent_block_hashes = new PublicKey('SysvarRecentB1ockHashes11111111111111111111');
  9. const rentAddress = new PublicKey('SysvarRent111111111111111111111111111111111');
  10. const seed = 'my_seed_is_tea';
  11. it('create account', async function create_account() {
  12. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  13. const to_key_pair = Keypair.generate();
  14. await contract.functions.create_account(
  15. payer.publicKey.toBytes(),
  16. to_key_pair.publicKey.toBytes(),
  17. 100000000,
  18. 5,
  19. TOKEN_PROGRAM_ID.toBytes(),
  20. {
  21. accounts: [system_account, TOKEN_PROGRAM_ID],
  22. writableAccounts: [payer.publicKey, to_key_pair.publicKey],
  23. signers: [payer, to_key_pair],
  24. }
  25. );
  26. });
  27. it('create account with seed', async function create_account_with_seed() {
  28. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  29. const base_keypair = Keypair.generate();
  30. const to_key_pair = await PublicKey.createWithSeed(base_keypair.publicKey, seed, TOKEN_PROGRAM_ID);
  31. await contract.functions.create_account_with_seed(
  32. payer.publicKey.toBytes(),
  33. to_key_pair.toBytes(),
  34. base_keypair.publicKey.toBytes(),
  35. seed,
  36. 100000000,
  37. 5,
  38. TOKEN_PROGRAM_ID.toBytes(),
  39. {
  40. accounts: [system_account, TOKEN_PROGRAM_ID],
  41. writableAccounts: [payer.publicKey, to_key_pair],
  42. signers: [payer, base_keypair]
  43. }
  44. );
  45. });
  46. it('assign', async function assign() {
  47. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  48. const to_key_pair = Keypair.generate();
  49. const assign_account = new PublicKey('AddressLookupTab1e1111111111111111111111111');
  50. await contract.functions.assign(
  51. to_key_pair.publicKey.toBytes(),
  52. assign_account.toBytes(),
  53. {
  54. accounts: [system_account, payer.publicKey],
  55. writable_accounts: [to_key_pair.publicKey],
  56. signers: [to_key_pair],
  57. }
  58. )
  59. });
  60. it('assign with seed', async function assign_with_with_seed() {
  61. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  62. const assign_account = new PublicKey('AddressLookupTab1e1111111111111111111111111');
  63. const to_key_pair = await PublicKey.createWithSeed(payer.publicKey, seed, assign_account);
  64. await contract.functions.assign_with_seed(
  65. to_key_pair.toBytes(),
  66. payer.publicKey.toBytes(),
  67. seed,
  68. assign_account.toBytes(),
  69. {
  70. accounts: [system_account, assign_account],
  71. writableAccounts: [to_key_pair],
  72. signers: [payer]
  73. }
  74. );
  75. });
  76. it('transfer', async function transfer() {
  77. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  78. const dest = new Keypair();
  79. await contract.functions.transfer(
  80. payer.publicKey.toBytes(),
  81. dest.publicKey.toBytes(),
  82. 100000000,
  83. {
  84. accounts: [system_account],
  85. writableAccounts: [payer.publicKey, dest.publicKey],
  86. signers: [payer]
  87. }
  88. );
  89. });
  90. it('transfer with seed', async function transfer_with_seed() {
  91. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  92. const dest = new Keypair();
  93. const assign_account = new PublicKey('AddressLookupTab1e1111111111111111111111111');
  94. const derived_payer = await PublicKey.createWithSeed(payer.publicKey, seed, assign_account);
  95. let signature = await connection.requestAirdrop(derived_payer, LAMPORTS_PER_SOL);
  96. await connection.confirmTransaction(signature, 'confirmed');
  97. await contract.functions.transfer_with_seed(
  98. derived_payer.toBytes(),
  99. payer.publicKey.toBytes(),
  100. seed,
  101. assign_account.toBytes(),
  102. dest.publicKey.toBytes(),
  103. 100000000,
  104. {
  105. accounts: [system_account, assign_account],
  106. writableAccounts: [derived_payer, dest.publicKey],
  107. signers: [payer]
  108. }
  109. );
  110. });
  111. it('allocate', async function allocate() {
  112. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  113. const account = Keypair.generate();
  114. await contract.functions.allocate(
  115. account.publicKey.toBytes(),
  116. 2,
  117. {
  118. accounts: [system_account],
  119. writableAccounts: [account.publicKey],
  120. signers: [account]
  121. }
  122. );
  123. });
  124. it('allocate with seed', async function allocate_with_seed() {
  125. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  126. const account = Keypair.generate();
  127. const owner = new PublicKey('Stake11111111111111111111111111111111111111');
  128. const derived_key = await PublicKey.createWithSeed(account.publicKey, seed, owner);
  129. await contract.functions.allocate_with_seed(
  130. derived_key.toBytes(),
  131. account.publicKey.toBytes(),
  132. seed,
  133. 200,
  134. owner.toBytes(),
  135. {
  136. accounts: [system_account, owner],
  137. writableAccounts: [derived_key],
  138. signers: [account],
  139. }
  140. );
  141. });
  142. it('create nonce account with seed', async function create_nonce_account_with_seed() {
  143. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  144. const base_address = Keypair.generate();
  145. const derived_account = await PublicKey.createWithSeed(base_address.publicKey, seed, system_account);
  146. const authority = Keypair.generate();
  147. await contract.functions.create_nonce_account_with_seed(
  148. payer.publicKey.toBytes(),
  149. derived_account.toBytes(),
  150. base_address.publicKey.toBytes(),
  151. seed,
  152. authority.publicKey.toBytes(),
  153. 100000000,
  154. {
  155. accounts: [system_account, recent_block_hashes, rentAddress],
  156. writableAccounts: [payer.publicKey, derived_account],
  157. signers: [payer, base_address]
  158. }
  159. );
  160. });
  161. it('nonce accounts', async function nonce_accounts() {
  162. const { contract, connection, payer, program } = await loadContract('TestingInstruction');
  163. const nonce = Keypair.generate();
  164. const authority = Keypair.generate();
  165. await contract.functions.create_nonce_account(
  166. payer.publicKey.toBytes(),
  167. nonce.publicKey.toBytes(),
  168. authority.publicKey.toBytes(),
  169. 100000000,
  170. {
  171. accounts: [system_account, recent_block_hashes, rentAddress],
  172. writableAccounts: [payer.publicKey, nonce.publicKey],
  173. signers: [payer, nonce],
  174. }
  175. );
  176. await contract.functions.advance_nonce_account(
  177. nonce.publicKey.toBytes(),
  178. authority.publicKey.toBytes(),
  179. {
  180. accounts: [system_account, recent_block_hashes],
  181. writableAccounts: [nonce.publicKey],
  182. signers: [authority],
  183. }
  184. );
  185. await contract.functions.withdraw_nonce_account(
  186. nonce.publicKey.toBytes(),
  187. authority.publicKey.toBytes(),
  188. payer.publicKey.toBytes(),
  189. 1000,
  190. {
  191. accounts: [system_account, recent_block_hashes, rentAddress],
  192. writableAccounts: [nonce.publicKey, payer.publicKey],
  193. signers: [authority],
  194. }
  195. );
  196. const new_authority = Keypair.generate();
  197. await contract.functions.authorize_nonce_account(
  198. nonce.publicKey.toBytes(),
  199. authority.publicKey.toBytes(),
  200. new_authority.publicKey.toBytes(),
  201. {
  202. accounts: [system_account],
  203. writableAccounts: [nonce.publicKey],
  204. signers: [authority],
  205. }
  206. );
  207. });
  208. });