setup.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // SPDX-License-Identifier: Apache-2.0
  2. import { Connection, Keypair, LAMPORTS_PER_SOL, BpfLoader, BPF_LOADER_PROGRAM_ID } from '@solana/web3.js';
  3. import { Contract } from '@solana/solidity';
  4. import fs from 'fs';
  5. const endpoint: string = process.env.RPC_URL || "http://127.0.0.1:8899";
  6. export async function loadContract(name: string, args: any[] = [], space: number = 8192):
  7. Promise<{ contract: Contract, connection: Connection, payer: Keypair, program: Keypair, storage: Keypair }> {
  8. const abi = JSON.parse(fs.readFileSync(`${name}.abi`, 'utf8'));
  9. const connection = newConnection();
  10. const payerAccount = loadKey('payer.key');
  11. const program = loadKey(`${name}.key`);
  12. const storage = Keypair.generate();
  13. const contract = new Contract(connection, program.publicKey, storage.publicKey, abi, payerAccount);
  14. await contract.deploy(name, args, storage, space);
  15. return { contract, connection, payer: payerAccount, program, storage };
  16. }
  17. export function newConnectionAndAccounts(name: string): [Connection, Keypair, Keypair] {
  18. const connection = newConnection();
  19. const payerAccount = loadKey('payer.key');
  20. const program = loadKey(`${name}.key`);
  21. return [connection, payerAccount, program];
  22. }
  23. export async function loadContractWithExistingConnectionAndPayer(connection: Connection, payerAccount: Keypair, name: string, args: any[] = [], space: number = 8192): Promise<Contract> {
  24. const abi = JSON.parse(fs.readFileSync(`${name}.abi`, 'utf8'));
  25. const storage = Keypair.generate();
  26. const program = loadKey(`${name}.key`);
  27. const contract = new Contract(connection, program.publicKey, storage.publicKey, abi, payerAccount);
  28. await contract.deploy(name, args, storage, space);
  29. return contract;
  30. }
  31. function loadKey(filename: string): Keypair {
  32. const contents = fs.readFileSync(filename).toString();
  33. const bs = Uint8Array.from(JSON.parse(contents));
  34. return Keypair.fromSecretKey(bs);
  35. }
  36. async function newAccountWithLamports(connection: Connection): Promise<Keypair> {
  37. const account = Keypair.generate();
  38. console.log('Airdropping SOL to a new wallet ...');
  39. let signature = await connection.requestAirdrop(account.publicKey, 100 * LAMPORTS_PER_SOL);
  40. await connection.confirmTransaction(signature, 'confirmed');
  41. return account;
  42. }
  43. async function setup() {
  44. let write_key = (file_name: string, key: Keypair) => {
  45. fs.writeFileSync(file_name, JSON.stringify(Array.from(key.secretKey)));
  46. };
  47. const connection = newConnection();
  48. const payer = await newAccountWithLamports(connection);
  49. write_key('payer.key', payer);
  50. let files = fs.readdirSync(__dirname);
  51. for (let index in files) {
  52. let file = files[index];
  53. if (file.endsWith('.so')) {
  54. let name = file.slice(0, -3);
  55. let program;
  56. if (fs.existsSync(`${name}.key`)) {
  57. program = loadKey(`${name}.key`);
  58. } else {
  59. program = Keypair.generate();
  60. }
  61. console.log(`Loading ${name} at ${program.publicKey}...`);
  62. const program_so = fs.readFileSync(file);
  63. await BpfLoader.load(connection, payer, program, program_so, BPF_LOADER_PROGRAM_ID);
  64. console.log(`Done loading ${name} ...`);
  65. write_key(`${name}.key`, program);
  66. }
  67. }
  68. }
  69. function newConnection(): Connection {
  70. const connection = new Connection(endpoint, {
  71. commitment: "confirmed",
  72. confirmTransactionInitialTimeout: 1e6,
  73. });
  74. return connection;
  75. }
  76. if (require.main === module) {
  77. (async () => {
  78. await setup();
  79. })();
  80. }