> **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.

# Renounce Token Roles \[token.renounceRoles]

Renounces roles for a TIP-20 token, removing them from the caller's account. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)

## Usage

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

const { receipt, value } = await client.token.renounceRolesSync({
  roles: ['issuer'],
  token: '0x20c0000000000000000000000000000000000001',
})

console.log('Roles renounced:', value.length)
// @log: Roles renounced: 1
```

```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.renounceRoles` action and wait for inclusion manually:

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

const hash = await client.token.renounceRoles({
  roles: ['issuer'],
  token: '0x20c0000000000000000000000000000000000001',
})
const receipt = await client.transaction.waitForReceipt({ hash }).receipt

const events = Actions.token.renounceRoles.extractEvents(receipt.logs)
```

## Recipes

### Decommission a Retired Minting Service

Renounce the service's roles when you retire it, then confirm with [`token.hasRole`](/tempo/actions/token.hasRole) so credentials left on the old deployment stay harmless.

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

const token = '0x20c0000000000000000000000000000000000001'

await client.token.renounceRolesSync({
  roles: ['issuer'],
  token,
})

const stillIssuer = await client.token.hasRole({ // [!code focus]
  role: 'issuer', // [!code focus]
  token, // [!code focus]
}) // [!code focus]

console.log('Still issuer:', stillIssuer)
// @log: Still issuer: false
```

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

### Hand Over Administration and Step Down

Combine `renounceRolesSync` with [`token.grantRolesSync`](/tempo/actions/token.grantRoles) to transfer `defaultAdmin` to a new operations account before giving up your own, so the token is never left without an admin.

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

const token = '0x20c0000000000000000000000000000000000001'

await client.token.grantRolesSync({ // [!code focus]
  roles: ['defaultAdmin'], // [!code focus]
  to: '0x8ba1f109551bD432803012645Ac136ddd64DBA72', // [!code focus]
  token, // [!code focus]
}) // [!code focus]

const { value } = await client.token.renounceRolesSync({
  roles: ['defaultAdmin'], // [!code focus]
  token,
})

console.log('Caller holds defaultAdmin:', value[0].hasRole)
// @log: Caller holds defaultAdmin: false
```

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

## Return Value

```ts
type ReturnType = {
  /** Transaction receipt. */
  receipt: TransactionReceipt
  /** Role membership update events. */
  value: readonly {
    /** Role whose membership changed. */
    role: Hex
    /** Account whose role membership changed. */
    account: Address
    /** Sender that changed role membership. */
    sender: Address
    /** Whether the account has the role after the update. */
    hasRole: boolean
  }[]
}
```

## Parameters

### roles

* **Type:** `readonly ("defaultAdmin" | "pause" | "unpause" | "issuer" | "burnBlocked")[]`

Roles to renounce.

### 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.
