|
@@ -0,0 +1,86 @@
|
|
|
+import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata";
|
|
|
+import {
|
|
|
+ Connection,
|
|
|
+ Keypair,
|
|
|
+ PublicKey,
|
|
|
+ SystemProgram,
|
|
|
+ SYSVAR_RENT_PUBKEY,
|
|
|
+ TransactionInstruction,
|
|
|
+ Transaction,
|
|
|
+ sendAndConfirmTransaction,
|
|
|
+} from "@solana/web3.js";
|
|
|
+import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";
|
|
|
+import * as borsh from "borsh";
|
|
|
+import { Buffer } from "buffer";
|
|
|
+
|
|
|
+function createKeypairFromFile(path: string): Keypair {
|
|
|
+ return Keypair.fromSecretKey(
|
|
|
+ Buffer.from(JSON.parse(require("fs").readFileSync(path, "utf-8")))
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+class Assignable {
|
|
|
+ constructor(properties) {
|
|
|
+ Object.keys(properties).map((key) => {
|
|
|
+ return (this[key] = properties[key]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class CreateTokenArgs extends Assignable {
|
|
|
+ toBuffer() {
|
|
|
+ return Buffer.from(borsh.serialize(CreateTokenArgsSchema, this));
|
|
|
+ }
|
|
|
+}
|
|
|
+const CreateTokenArgsSchema = new Map([
|
|
|
+ [
|
|
|
+ CreateTokenArgs,
|
|
|
+ {
|
|
|
+ kind: "struct",
|
|
|
+ fields: [["token_decimals", "u8"]],
|
|
|
+ },
|
|
|
+ ],
|
|
|
+]);
|
|
|
+
|
|
|
+describe("Create Token", async () => {
|
|
|
+ const connection = new Connection(
|
|
|
+ `https://api.devnet.solana.com/`,
|
|
|
+ "confirmed"
|
|
|
+ );
|
|
|
+ const payer = createKeypairFromFile(
|
|
|
+ require("os").homedir() + "/.config/solana/id.json"
|
|
|
+ );
|
|
|
+ const program = createKeypairFromFile(
|
|
|
+ "./program/target/deploy/program-keypair.json"
|
|
|
+ );
|
|
|
+
|
|
|
+ it("Create a Token-22 SPL-Token !", async () => {
|
|
|
+ const mintKeypair: Keypair = Keypair.generate();
|
|
|
+
|
|
|
+ const instructionData = new CreateTokenArgs({
|
|
|
+ token_decimals: 9,
|
|
|
+ });
|
|
|
+
|
|
|
+ const instruction = new TransactionInstruction({
|
|
|
+ keys: [
|
|
|
+ { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account
|
|
|
+ { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account
|
|
|
+ { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Transaction Payer
|
|
|
+ { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account
|
|
|
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program
|
|
|
+ { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program
|
|
|
+ ],
|
|
|
+ programId: program.publicKey,
|
|
|
+ data: instructionData.toBuffer(),
|
|
|
+ });
|
|
|
+
|
|
|
+ const signature = await sendAndConfirmTransaction(
|
|
|
+ connection,
|
|
|
+ new Transaction().add(instruction),
|
|
|
+ [payer, mintKeypair]
|
|
|
+ );
|
|
|
+
|
|
|
+ console.log(`Token Mint Address: `, mintKeypair.publicKey.toBase58());
|
|
|
+ console.log(`Transaction Signature: `, signature);
|
|
|
+ });
|
|
|
+});
|