# `token.create`

Creates a new TIP-20 token, and assigns the admin role to the calling account. [Learn more](https://docs.tempo.xyz/protocol/tip20/overview)

## Usage

Use the `token.create` action on the Viem `client` to create and deploy a new TIP-20 token.

:::code-group

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

const { admin, receipt, token, tokenId } = await client.token.createSync({
  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  currency: 'USD',
  logoURI: 'https://example.com/cusd.svg',
  name: 'My Company USD',
  symbol: 'CUSD',
})

console.log('Address:', token)
// @log: Address: 0x20c0000000000000000000000000000000000004
console.log('Admin:', admin)
// @log: Admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb
console.log('ID:', tokenId)
// @log: ID: 4n
```

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

:::

### Asynchronous Usage

The example above uses 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.create` action and wait for inclusion manually:

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

const hash = await client.token.create({
  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',
  currency: 'USD',
  logoURI: 'https://example.com/cusd.svg',
  name: 'My Company USD',
  symbol: 'CUSD',
})
const receipt = await client.waitForTransactionReceipt({ hash })

const { args: { token, tokenId } } 
  = Actions.token.create.extractEvent(receipt.logs)
```

## Return Type

```ts
type ReturnType = {
  /** Address of the admin that was granted the admin role */
  admin: Address
  /** Currency code of the token */
  currency: string
  /** Name of the token */
  name: string
  /** Address of the quote token */
  quoteToken: Address
  /** Transaction receipt */
  receipt: TransactionReceipt
  /** Symbol of the token */
  symbol: string
  /** Address of the deployed TIP-20 token */
  token: Address
  /** ID of the deployed TIP-20 token */
  tokenId: bigint
}
```

## Parameters

### admin

* **Type:** `Address`

Admin address for the token.

### currency

* **Type:** `string`

Currency code for the token.

### name

* **Type:** `string`

Name of the token.

### logoURI (optional)

* **Type:** `string`

Logo URI for the token. Requires a T5-enabled Tempo chain.

### quoteToken (optional)

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

Quote token address or ID.

### salt (optional)

* **Type:** `Hex`
* **Default:** `Hex.random(32)`

Unique salt for deterministic token address generation.

### symbol

* **Type:** `string`

Symbol of the token.

### account (optional)

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

Account that will be used to send the transaction.

### feeToken (optional)

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

Fee token for the transaction.

Can be an unpaused USD-denominated TIP-20 token address or ID. Use `client.fee.validateToken({ token })` to validate a token before submitting a transaction or setting it as a fee preference.

### feePayer (optional)

* **Type:** `Account | true`

Fee payer for the transaction.

Can be a [Viem Account](https://viem.sh/docs/accounts/local/privateKeyToAccount), or `true` if a [Fee Payer Service](https://docs.tempo.xyz/sdk/typescript/server/handler.feePayer) will be used.

### gas (optional)

* **Type:** `bigint`

Gas limit for the transaction.

### 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' | bigint`

Nonce key for the transaction. Use `'expiring'` to use [expiring nonces (TIP-1009)](https://docs.tempo.xyz/protocol/tips/tip-1009), which enables concurrent transaction submission without nonce ordering.

### validBefore (optional)

* **Type:** `number`

Unix timestamp before which the transaction must be included.

### validAfter (optional)

* **Type:** `number`

Unix timestamp after which the transaction can be included.

### throwOnReceiptRevert (optional)

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

Whether to throw an error if the transaction receipt indicates a revert. Only applicable to `*Sync` actions.
