# Address List

> On-chain address list where membership = owning x1 of token ID 1. Manager can add/remove addresses.

**Category:** Token Types

## Summary

Required standards: \["Address List"]

* validTokenIds: MUST be exactly \[{ "start": "1", "end": "1" }]
* TWO collection approvals required with EXACT approvalIds (frontend depends on these):
  1. "manager-add": fromListId "Mint", toListId "All", initiatedByListId = creator. Mints token to add address.
  2. "manager-remove": fromListId "All", toListId burn address (bb1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqs7gvmv), initiatedByListId = creator. Burns token to remove address.
* BOTH approvals MUST have overridesFromOutgoingApprovals: true
* NO peer-to-peer transfer approval — only manager can modify the list
* Standard is "Address List" (NOT "Non-Transferable")
* Use per-field tools (set\_standards, add\_approval, set\_permissions, set\_invariants)

## Instructions

## Address List Configuration

An address list collection represents membership as token ownership: owning x1 of token ID 1 = being on the list. The manager controls membership by minting (adding) and burning (removing) tokens.

### CRITICAL: Exact Approval IDs Required

The frontend identifies address list approvals by their EXACT approvalIds. Using different IDs will break the UI.

* Approval 1: approvalId MUST be **"manager-add"**
* Approval 2: approvalId MUST be **"manager-remove"**

### Required Structure

1. **Standards**: \["Address List"] (NOT "Non-Transferable")
2. **validTokenIds**: \[{ "start": "1", "end": "1" }]
3. **Burn address**: bb1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqs7gvmv (ETH null address in bb1 format)

### Manager-Add Approval (mint to add)

```json
{
  "fromListId": "Mint",
  "toListId": "All",
  "initiatedByListId": "bb1creator...",
  "transferTimes": [{ "start": "1", "end": "18446744073709551615" }],
  "tokenIds": [{ "start": "1", "end": "1" }],
  "ownershipTimes": [{ "start": "1", "end": "18446744073709551615" }],
  "uri": "ipfs://METADATA_APPROVAL_manager-add",
  "customData": "",
  "approvalId": "manager-add",
  "approvalCriteria": {
    "overridesFromOutgoingApprovals": true
  },
  "version": "0"
}
```

### Manager-Remove Approval (forceful burn to remove)

```json
{
  "fromListId": "All",
  "toListId": "bb1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqs7gvmv",
  "initiatedByListId": "bb1creator...",
  "transferTimes": [{ "start": "1", "end": "18446744073709551615" }],
  "tokenIds": [{ "start": "1", "end": "1" }],
  "ownershipTimes": [{ "start": "1", "end": "18446744073709551615" }],
  "uri": "ipfs://METADATA_APPROVAL_manager-remove",
  "customData": "",
  "approvalId": "manager-remove",
  "approvalCriteria": {
    "overridesFromOutgoingApprovals": true
  },
  "version": "0"
}
```

### Default Balances

```json
{
  "balances": [],
  "outgoingApprovals": [],
  "incomingApprovals": [],
  "autoApproveAllIncomingTransfers": true,
  "autoApproveSelfInitiatedOutgoingTransfers": true,
  "autoApproveSelfInitiatedIncomingTransfers": true,
  "userPermissions": {}
}
```

### Permissions

Lock approvals and token IDs:

* canUpdateCollectionApprovals: frozen
* canUpdateValidTokenIds: frozen
* canUpdateManager: frozen (typically)

## Common Mistakes

* DON'T use approvalId other than "manager-add" and "manager-remove" — the frontend depends on these exact strings.
* DON'T use standard "Non-Transferable" — address lists use "Address List".
* DON'T add a peer-to-peer transfer approval — only the manager should modify the list.
* DON'T forget overridesFromOutgoingApprovals: true on BOTH approvals.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.bitbadges.io/token-standard/skills/address-list.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
