npm package: @metaplex-foundation/genesis
Description: The Metaplex Genesis Program
Author: Metaplex Maintainers
Latest version: 0.35.0

# JavaScript client for Genesis

A Umi-compatible JavaScript library for the project.

## Getting started

1. First, if you're not already using Umi, [follow these instructions to install the Umi framework](https://github.com/metaplex-foundation/umi/blob/main/docs/installation.md).
2. Next, install this library using the package manager of your choice.
   ```sh
   npm install @metaplex-foundation/genesis
   ```
2. Finally, register the library with your Umi instance like so.
   ```ts
   import { genesis } from '@metaplex-foundation/genesis';
   umi.use(genesis());
   ```

## API Client

The API client provides three levels of control for creating and registering launches.

### Setup

All examples below assume the following shared setup:

```ts
import {
  createAndRegisterLaunch,
  createLaunch,
  registerLaunch,
} from '@metaplex-foundation/genesis';

const config = {}; // uses default API URL; set { baseUrl: '...' } to override
const input = {
  wallet: umi.identity.publicKey,
  launchType: 'project' as const,
  token: {
    name: 'My Token',
    symbol: 'MTK',
    image: 'https://gateway.irys.xyz/...',
  },
  launch: {
    launchpool: {
      tokenAllocation: 500_000_000,
      depositStartTime: new Date('2026-03-01T00:00:00Z'),
      raiseGoal: 200,
      raydiumLiquidityBps: 5000,
      fundsRecipient: 'RecipientWallet...',
    },
  },
};
```

### Basic — `createAndRegisterLaunch`

The simplest approach. The SDK creates the launch, signs and sends all transactions via Umi, then registers the launch — all in one call.

```ts
const result = await createAndRegisterLaunch(umi, config, input);

console.log(`Mint: ${result.mintAddress}`);
console.log(`Launch: ${result.launch.link}`);
```

### Custom transaction sender — `createAndRegisterLaunch` with `txSender`

If you need control over how transactions are signed and sent (e.g. using a custom wallet adapter), pass a `txSender` callback. The SDK still handles the create and register steps for you.

```ts
const result = await createAndRegisterLaunch(umi, config, input, {
  txSender: async (transactions) => {
    const signatures: Uint8Array[] = [];
    for (const tx of transactions) {
      const signed = await myCustomWallet.signTransaction(tx);
      const sig = await myCustomRpc.sendTransaction(signed);
      signatures.push(sig);
    }
    return signatures;
  },
});

console.log(`Launch: ${result.launch.link}`);
```

### Full control — `createLaunch` + `registerLaunch`

For complete control over the transaction lifecycle, call `createLaunch` and `registerLaunch` separately. You are responsible for signing, sending, and confirming the transactions yourself.

```ts
// Step 1: Create the launch (returns unsigned transactions)
const createResult = await createLaunch(umi, config, input);

// Step 2: Sign and send each transaction yourself
for (const tx of createResult.transactions) {
  const signed = await umi.identity.signTransaction(tx);
  await umi.rpc.sendTransaction(signed);
}

// Step 3: Register the launch after transactions are confirmed on-chain
const registerResult = await registerLaunch(umi, config, {
  genesisAccount: createResult.genesisAccount,
  createLaunchInput: input,
});

console.log(`Launch: ${registerResult.launch.link}`);
```