12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import { Buffer } from 'node:buffer';
- import { describe, test } from 'node:test';
- import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js';
- import * as borsh from 'borsh';
- import { start } from 'solana-bankrun';
- describe('Create a system account', async () => {
- const PROGRAM_ID = PublicKey.unique();
- const context = await start([{ name: 'program', programId: PROGRAM_ID }], []);
- const client = context.banksClient;
- const payer = context.payer;
- class Assignable {
- constructor(properties) {
- for (const [key, value] of Object.entries(properties)) {
- this[key] = value;
- }
- }
- }
- class AddressData extends Assignable {
- toBuffer() {
- return Buffer.from(borsh.serialize(AddressDataSchema, this));
- }
- }
- const AddressDataSchema = new Map([
- [
- AddressData,
- {
- kind: 'struct',
- fields: [
- ['name', 'string'],
- ['address', 'string'],
- ],
- },
- ],
- ]);
- test('Create the account', async () => {
- const newKeypair = Keypair.generate();
- const addressData = new AddressData({
- name: 'Marcus',
- address: '123 Main St. San Francisco, CA',
- });
- // We're just going to serialize our object here so we can check
- // the size on the client side against the program logs
- const addressDataBuffer = addressData.toBuffer();
- console.log(`Address data buffer length: ${addressDataBuffer.length}`);
- const ix = new TransactionInstruction({
- keys: [
- { pubkey: payer.publicKey, isSigner: true, isWritable: true },
- { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true },
- { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
- ],
- programId: PROGRAM_ID,
- data: addressDataBuffer,
- });
- const tx = new Transaction();
- const blockhash = context.lastBlockhash;
- tx.recentBlockhash = blockhash;
- tx.add(ix).sign(payer, newKeypair);
- await client.processTransaction(tx);
- });
- });
|