> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://v3.viem.sh/api/mcp` to find what you need.

# Mint Tokens \[token.mint]

Mints TIP-20 tokens to an address. Requires the `ISSUER` role. [Learn more about roles](https://docs.tempo.xyz/protocol/tip20/spec#role-based-access-control)

## Usage

:::code-group
```ts twoslash [example.ts]
import { client } from './viem.config'

const { receipt } = await client.token.mintSync({
  amount: { formatted: '10.5' },
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token: '0x20c0000000000000000000000000000000000000',
})

console.log('Transaction hash:', receipt.transactionHash)
// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
```

```ts twoslash [viem.config.ts] filename="viem.config.ts"
// [!include ~/snippets/tempo/viem.config.ts:setup]
```
:::

### Undeclared Tokens

Formatted amounts resolve `decimals` from the Client's declared `tokens` (the pathUSD address above is declared on the default token set). For a token not declared on the Client, include `amount.decimals` so the formatted amount can be parsed.

:::code-group
```ts twoslash [example.ts]
import { client } from './viem.config'

const { receipt } = await client.token.mintSync({
  amount: { decimals: 6, formatted: '10.5' },
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token: '0x20c0000000000000000000000000000000000001',
})
```

```ts twoslash [viem.config.ts] filename="viem.config.ts"
// [!include ~/snippets/tempo/viem.config.ts:setup]
```
:::

### Base Amounts

Pass a `bigint` to use the token's base unit amount directly.

:::code-group
```ts twoslash [example.ts]
import { client } from './viem.config'

const { receipt } = await client.token.mintSync({
  amount: 10500000n,
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token: '0x20c0000000000000000000000000000000000000',
})
```

```ts twoslash [viem.config.ts] filename="viem.config.ts"
// [!include ~/snippets/tempo/viem.config.ts:setup]
```
:::

### Asynchronous Usage

The examples above use a `*Sync` variant of the action, that will wait for the transaction to be included before returning.

If you are optimizing for performance, you should use the non-sync `token.mint` action and wait for inclusion manually:

```ts twoslash
import { Actions } from 'viem/tempo'
import { client } from './viem.config'

const hash = await client.token.mint({
  amount: { formatted: '10.5' },
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token: '0x20c0000000000000000000000000000000000000',
})
const receipt = await client.transaction.waitForReceipt({ hash }).receipt

const { args } = Actions.token.mint.extractEvent(receipt.logs)
```

## Recipes

### Reconcile Fiat Deposits with a Mint Memo

Pass `memo` to tag each mint with the fiat deposit reference it backs (for example, `deposit_8421` hex-encoded), so onchain issuance reconciles against your banking records.

:::code-group
```ts twoslash [example.ts]
import { client } from './viem.config'

const { receipt } = await client.token.mintSync({
  amount: { formatted: '1000' },
  memo: '0x6465706f7369745f38343231', // [!code focus]
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token: '0x20c0000000000000000000000000000000000000',
})
```

```ts twoslash [viem.config.ts] filename="viem.config.ts"
// [!include ~/snippets/tempo/viem.config.ts:setup]
```
:::

### Guard Large Mints Against the Supply Cap

Combine [`token.getMetadata`](/tempo/actions/token.getMetadata) with `token.mintSync` to reject a mint that would exceed the token's supply cap before submitting a transaction that reverts.

:::code-group
```ts twoslash [example.ts]
import { client } from './viem.config'

const amount = 250_000_000_000n
const token = '0x20c0000000000000000000000000000000000000'

const { supplyCap, totalSupply } = await client.token.getMetadata({ token }) // [!code focus]
if (supplyCap && totalSupply + amount > supplyCap) // [!code focus]
  throw new Error('mint would exceed the supply cap') // [!code focus]

const { receipt } = await client.token.mintSync({
  amount,
  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  token,
})
```

```ts twoslash [viem.config.ts] filename="viem.config.ts"
// [!include ~/snippets/tempo/viem.config.ts:setup]
```
:::

## Return Value

```ts
type ReturnType = {
  /** Address that received the minted tokens. */
  to: Address
  /** Minted amount, in base units. */
  amount: bigint
  /** Token decimals used to derive `formatted`, if known. */
  decimals?: number | undefined
  /** Minted amount formatted with the token's `decimals`, if known. */
  formatted?: string | undefined
  /** Transaction receipt. */
  receipt: TransactionReceipt
}
```

## Parameters

### amount

* **Type:** `bigint | { decimals?: number, formatted: string }`

Amount of tokens to mint, in base units or formatted decimal form. Include `amount.decimals`
when the token is not declared on the Client's `tokens`.

### memo

* **Type:** `Hex`

Memo to include in the mint.

### to

* **Type:** `Address`

Address to mint tokens to.

### token

* **Type:** `Address | bigint`

Token to operate on: a TIP-20 token id or a contract address.

### account (optional)

* **Type:** `Account | Address`

Account that will be used to send the transaction.

### feePayer (optional)

* **Type:** `Account | boolean`

Fee payer for the transaction (TIP-1 gas sponsorship).

Pass `true` to defer the fee token to an external fee payer (e.g. a relay), or a local Account to co-sign the transaction as the fee payer.

### feeToken (optional)

* **Type:** `Address | bigint`

Fee token for the transaction.

Can be an unpaused USD-denominated TIP-20 token address or ID.

### gas (optional)

* **Type:** `bigint`

Gas limit for the transaction.

### keyAuthorization (optional)

* **Type:** `KeyAuthorization`

Signed key authorization to include with the transaction, authorizing an access key to act for the sending account.

### maxFeePerGas (optional)

* **Type:** `bigint`

Max fee per gas for the transaction.

### maxPriorityFeePerGas (optional)

* **Type:** `bigint`

Max priority fee per gas for the transaction.

### nonce (optional)

* **Type:** `number`

Nonce for the transaction.

### nonceKey (optional)

* **Type:** `'expiring' | 'random' | bigint`

Nonce key for the transaction (TIP-1009 2D nonces).

Use `'expiring'` to select an expiring nonce, which enables concurrent transaction submission without nonce ordering. Use `'random'` to select a random key.

### throwOnReceiptRevert (optional)

* **Type:** `boolean`
* **Default:** `true`

Whether a `Sync` action throws when the receipt reports a revert.

### validAfter (optional)

* **Type:** `number`

Unix timestamp after which the transaction can be included.

### validBefore (optional)

* **Type:** `number`

Unix timestamp before which the transaction must be included.
