> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/zh/rome-shang-de-ying-yong/bloom/issuing.md).

# 发行

Bloom 让您发行一个 **受权限控制的现实世界资产** 作为 Rome 链上的普通 Solidity 合约，并可通过按资产划分的控制台进行管理。该资产可从 EVM 和 Solana 钱包访问，但 **发行仅限 EVM** ——Solana 钱包持有资产；它不会创建资产。本指南涵盖发行方控制台、创建向导、控制台登录入口，以及六个管理选项卡。

> **您无需向 Bloom 提交任何文件或个人数据，您的投资者也不需要。** Bloom 记录 *结果* 您的合规决策结果；链上会为每个地址记录一个布尔值。您的 KYC/AML 流程——您的供应商、文件和留存策略——完全保留在您自己的系统中。完整模型见 [COMPLIANCE.md](/zh/rome-shang-de-ying-yong/bloom/compliance.md)；本指南仅指向该文档，而不重复其内容。

***

## 您可以做什么

作为资产的管理员，以下所有操作都可在控制台中完成——而且每一项都是实际的链上交易，并在 [证据](/zh/rome-shang-de-ying-yong/bloom/evidence.md) 页面：

* **发行资产** ——向导会将其部署为三个合约（见下文）。
* **审核申请** ——逐一批准或拒绝（拒绝时必须附上申请人应知晓的理由），并将已批准的地址加入允许名单。
* **管理允许名单** ——添加一个地址，或添加 **在单笔交易中批量添加地址** (`batchAddToWhitelist`），或移除一个地址；代币会在每次转账时强制执行该名单。
* **对资产设置转账门禁** ——将转账限制为允许名单中的地址（这会使供应量最终确定），或取消该限制。
* **管理供应量** ——读取总量，并在您持有该角色后铸造或销毁。
* **进行销售** ——开启销售（数量和价格）、关闭销售、召回未售库存并提取收益。
* **设置并分发收益** ——先设置支付货币，然后分发一笔付款；分发会按持有人逐笔交易进行，已排除的持有人会被跳过。
* **管理角色** ——向某个地址授予角色、撤销某个角色，或放弃您自己的角色。

下文会在对应选项卡中逐一说明，并注明链上强制执行的内容。

***

## 发行方控制台

![ /issuer 处的发行方控制台，列出此部署所知的资产及其销售状态。](/files/383638953051ae509cdb000fd73ab753da739f8b)

`/issuer` 列出您在此链上发行的资产，并允许您启动新的资产。

* 连接一个 **EVM 钱包**。未连接的访问者或 Solana 钱包会看到连接正确类型钱包的提示，而不是空白控制台——Solana 钱包不能发行资产，而这一产品边界由链上作为第二道独立防护来强制执行。
* 表格按资产列出其 **名称和代号**、其生命周期 **阶段**，以及其 **销售** 状态（一个 *开放* 徽标，或 *已关闭*).

两列—— **持有人** 和 **待审核** ——会显示破折号。持有人数量需要允许名单的枚举，而审核队列是一个按资产登录的链下存储；破折号表示 *未请求* 其中 `0` 会声称应用尚未读取的事实。

按下 **发行资产** 以打开向导，或选择一行以打开该资产的控制台。

***

## 创建资产：向导

![ /create 处的创建向导：先填写资产字段，然后是六个卡片，随着各自交易落链而点亮。](/files/d9a456533bc682871cdd7ec4473de80b8674baac)

`/create` 收集四个字段，然后部署您的资产。

| 字段       | 规则            |
| -------- | ------------- |
| **名称**   | 必填。           |
| **代号**   | 必填。           |
| **供应量**  | 大于零的整数。       |
| **小数位数** | 0 到 18 之间的整数。 |

按下 **开始**。如果某个字段无效，向导会告诉您哪个字段无效以及原因，而不是让您面对一个禁用按钮。草稿有效后，系统会依次请求您的钱包为每一步签名。

### 为何分步部署

> **一个代币会通过多笔交易部署为三个合约——绝不会是一笔。** Arc 的单笔交易 `createToken` 需要 **77 个账户锁**，而 Rome 将单笔交易上限设为 **62 个锁**。因此向导会在各自的交易中部署每个部分，然后通过 `ArcTokenFactoryV2.registerToken`。这是一个被显式呈现的 Rome 约束，而不是可选优化——并且这些防护会精确保持 Arc 的上游安全模型（规范代理、白名单实现、调用方持有代币的管理员角色、注册仅能执行一次）。见 [COMPLIANCE.md](/zh/rome-shang-de-ying-yong/bloom/compliance.md#what-rome-adds--and-what-registertoken-preserves).

### 六张卡片

向导会显示六张卡片，它们会跟随部署进度变化。某张卡会从 **等待中** 变为 **签名中…** 变为 **完成** （或 **失败**）随着其交易落链而变化。

| # | 卡片           | 作用                                |
| - | ------------ | --------------------------------- |
| 1 | **实现**       | 此链的共享资产实现——已解析，无需签名。（在任何步骤运行前完成。） |
| 2 | **资产**       | 部署您的资产，并一步设置其名称、代号、供应量和小数位数。      |
| 3 | **谁可持有**     | 部署该资产专属的权限模块，并由您担任其管理员。           |
| 4 | **在转账中强制执行** | 将资产指向该模块，使每一笔转账都由资产本身进行检查。        |
| 5 | **收益规则**     | 部署并关联决定向谁付款的模块。                   |
| 6 | **注册**       | 注册该资产——这会开启销售，并允许您之后升级它。          |

六张卡片实际上涵盖了八个底层部署步骤，因此一次 **开始** 会产生 **八次签名**。按钮下方的说明写着 *“您的钱包将要求您为每一步签名。您可在任意时点停止，并从离开的地方继续——不会丢失任何内容。”* 注册是最后一步，因此中途停止是安全的：资产在每个阶段都是真实部署的，最后才完成注册。

当运行完成后，向导会显示 *“已发行。您的资产已上线于 …”* 并附带指向该资产控制台的链接，位于 `/token/[address]`.

> **`initialize` 会授予您所有角色。** 向导的驱动地址——您的 EVM 地址——会获得代币的管理员、铸造/销毁、收益管理/分发和升级者角色，以及允许名单模块的管理员角色。因此，您的密钥保管是资产合规态势的一部分：丢失的投资者钱包只能通过您的管理员操作恢复，而控制台的 **权限** 选项卡会显示每项权限的持有者。（`UPGRADER_ROLE` 是 *不* 会自动授予工厂——如果您希望通过工厂执行升级，请显式授予它。）

***

## 按资产划分的控制台，以及登录入口

![控制台登录入口：请使用您的钱包签署一条消息——没有密码。](/files/59a7cc693b2e705b04778fd12c86bd6e975b680a)

打开 `/token/[address]` 会 **不** 立即显示控制台。它显示一个 **登录入口**:

> *“登录以管理此资产。请使用您的钱包签署一条消息——没有密码。您的权限来自资产本身，并且会在每项操作中再次核验，因此一旦撤销便会立即生效。”*

按下 **使用您的钱包登录**。具体流程如下：

1. 系统会请求您的钱包 `personal_sign` 对一段简短、可读的声明（标题为 *“Bloom —— 证明您正在管理此资产”*），其中写明其授权的唯一操作——读取该资产的申请队列——以及资产地址、链 ID 和时间戳。
2. 应用会将该已签名声明发送到 `GET /api/applications`.
3. 该 **服务器** 进行验证：它从签名中恢复您的地址，确认该声明适用于此链且仍然有效（授权窗口为两分钟，而非整个会话），读取 **代币自身的允许名单模块** 链上数据，并检查您的地址是否持有允许名单写入实际所需的角色—— `MANAGER_ROLE` ——该模块上的 MANAGER\_ROLE。
4. 如果您持有该角色，队列会返回并渲染控制台；如果没有，服务器会拒绝并返回 `403` 以及原因。

![显示引号中拒绝信息的入口：不管理此资产的钱包会被拒之门外。](/files/80681b2ff2d2c7eba2c5ee39c99210f0db9ce6f8)

> **由资产决定谁可以管理它——不是此应用。** 该角色在允许名单 **模块上**进行检查，而不是在代币上；在代币上持有同名角色并 *不* 不会自动继承——它们是不同的权限来源。没有账户，也没有会话：后续每个请求都携带各自新的签名，这就是 *“在每项操作中再次核验”* 的含义。只要在链上撤销某个钱包的角色，它就会立即失去登录能力。

拒绝会显示原因 **并以引号标示** ——Bloom 从不会写出钱包为何被拒绝的说明。如果您在钱包中拒绝签名，那是您的 *“不”*，不是资产的决定，而且不会被报告为一次拒绝。

> **这个入口决定这是“谁的控制台”，而不是“什么是秘密”。** 供应量、销售状态、允许名单名册以及角色都是公开的链上读取，任何区块浏览器都能查询。签名所换来的是 **申请队列** ——他人的声明——以及被显示控制台的权利。

### 控制台标题栏

登录后，标题栏会显示资产名称及其 **阶段** ——其最关键的事实：

| 阶段       | 含义                                                      |
| -------- | ------------------------------------------------------- |
| **草稿**   | 尚未链接权限模块，因此没有任何限制谁可以持有此资产。                              |
| **开放**   | 转账是开放的，供应量仍可变化。对资产设置门禁会使其供应量最终确定，而这一点无法撤销。              |
| **已设门禁** | 只有允许名单中的地址可以持有此资产， **且其供应量已最终确定** ——此后将无法再铸造或销毁，且为永久限制。 |

在选项卡上方，摘要会显示四个数字—— **持有人 · 待审核 · 已售 · 已支付收益**。其中两项来自链上和存储（*待审核* 在您登录后； *已售* 来自店面）； *持有人* 取决于收益预览中的持有人数量，而 *已支付收益* 则取决于稍后才会提供的支付历史光标。每个等待中的单元格都会显示破折号并说明其所需内容，而不是显示一个 `0` 会声称链上无人请求过的事实。

***

## 六个选项卡

控制台按以下顺序提供六个选项卡： **申请 · 谁可持有 · 供应量 · 销售 · 收益 · 权限。**

这些选项卡上的每次写入都使用同一个共享控件来显示写入的 **命名先决条件** 及其 **后果** *在* 按钮之前，并在运行时显示其阶段（*“等待您的钱包…”*, *“正在落链…”*）。不应通过回滚来让您学习本可以先检查的内容。

### 申请——审核队列

![“申请”选项卡——审核队列，其中包含待批准或拒绝的申请，以及合规接口。](/files/d72d737f90bb6722fe33aa46be045ac76d9e1343)

此选项卡列出已申请持有该资产的主体。每一行显示申请人的地址、司法辖区、持有人类型、一个 **检查** 列（*已通过* 如果您的提供方记录了结果，否则 *已声明*），以及一个 **状态** (*待审核*, *已批准*, *已拒绝*）。展开某一行可查看其事实和两个控件： **批准——可持有** 和 **拒绝**。拒绝需要给出理由，该理由将成为对申请人的答复。

> **批准是两个独立动作，而该选项卡会确保它们各自明确。** 按下 **批准** *会记录* 您在申请存储中的决定。将该地址加入资产链上允许名单是 **第二次签名** —— `batchAddToWhitelist` ——而在其落链之前，该行会明确显示这一点。当记录的决定与链上状态不一致时，选项卡会指出差异，并提供可消除差异的写入： **准入** 用于将已批准的地址加入允许名单，或（对于仍在列表中的被拒绝地址）提供移除它的控件。在允许名单写入落链之前，该地址不能持有该资产。

该选项卡上的固定说明—— **合规接口** ——说明您自己的流程接入点：

> *“这里不会索取或保存任何文件——检查完全由您自己负责。请在 `申请` 界面后连接您的提供方，或导入您已经作出的决定。Bloom 记录结果，而链上只对该地址记录一个是或否。”*

这是自托管发行方会替换的界面：将申请存储的实现替换为您自己的持久实现，而调用方无需更改。Bloom 不执行任何检查，也不持有任何文件。

### 谁可以持有——转账门禁

![“谁可以持有”选项卡——允许名单数量以及限制转账控件，展示其单向门后果。](/files/c152a71c523a6bc4d66d49e148d1e3568facff4b)

此选项卡报告该资产中有多少地址已加入允许名单，并允许您切换允许名单是否 **被强制执行**:

* 当转账处于 **不受限制**时，它会提供 **将转账限制为允许名单**。该写入的后果会说明：这样做会使供应量最终确定，并且对非管理员而言是单向门。
* 当转账处于 **受限制**时，它会提供 **取消限制**。其后果会明确说明这不是撤销操作。

在一个 *未设门禁的* （草稿）资产且未链接权限模块时，该选项卡会明确说明—— *“未链接权限模块，因此没有任何限制谁可以持有此资产”* ——且切换控件不会显示。

> **代币会检查每次转账的双方。** 在资产设有门禁时，任一方不在允许名单中的转账都会在链上以类型化错误回滚。对于 EVM 钱包转账、Solana 签名转账、店面销售以及初始流动性转移，都会执行同一道门禁——除非使用您自己的管理员权限，否则没有绕行路径。

### 供应量

![“供应量”选项卡——现存总单位数。](/files/a7789cc9bb34658ab1cbf879eeadc8eedda3a9ab)

此选项卡报告当前存在的总供应量，以整数单位表示。

### 销售——开启、关闭并提取收益

![“销售”选项卡——显示已开启的销售，以及关闭销售、召回未售和提取收益的控件。](/files/9ee121a93648c0e437ce28ee08b215edaa997d3b)

此选项卡通过店面合约运行主销售。

* **当没有销售开启时**，它会提供开启销售：输入 **待售单位数** 和 **单价** （以 `wUSDC`计），然后按下 **开启销售**。写入的前提条件会首先展示——代币必须已注册，店面必须持有待售库存，且店面本身必须在其所销售代币的允许名单中——因此尚不可开启的销售会准确说明其所需条件。
* **当销售开启时**，它会显示该报价还剩多少单位，并提供 **关闭此销售**.
* **召回未售单位** 将未售库存从店面转回接收方（默认为您）。这不是 **不** 关闭——销售仍保持启用状态，写入后果会明确说明，因此召回不会被误解为撤销。
* **提取收益** 将店面的收入发送到某个地址（默认为您）。收益的累积独立于销售状态，因此无论销售开启还是关闭都可以提取。

### 收益——每笔交易支付一位持有人

![“收益”选项卡——分发金额字段，并提醒先设置支付货币。](/files/998448ba15bcca236fa25f2363d4b5e788de25dd)

此选项卡向持有人分发收益支付。

> **一次分发是一个遍历过程，而不是一次点击。** 在 Rome 上， `distributeYieldWithLimit` 支付 **每笔交易一位持有人** （账户上限），因此一次支付是一系列窗口，每个窗口都需要各自签名。您只需输入一次金额，以支付货币的整数单位表示，并且在遍历开始后便会锁定。 **第一** 个窗口会从您这里拉取全部支付金额并支付给第一位持有人；之后每个窗口只会移动已在代币合约中的资金。Bloom 会在每个窗口后重新从链上读取光标——随着余额变化，持有人集合会重新排序，而发送过期索引会从零重新开始，并再次扣取您的资金。

该选项卡显示进度—— *“正在支付第 N 位（共 M 位）持有人”* ——并在光标回绕时结束。如果该资产未设置支付货币，选项卡会明确说明；设置支付货币是一次分发中唯一只能由您选择的字段。

> **受限制持有人的份额会留在合约中。** 被收益黑名单模块排除的地址会被跳过，其按比例分得的份额会留在代币合约中，而不会支付出去。

过去的支付尚未显示——读取它们需要沿着分发事件回溯到资产的首个区块，这需要稍后提供历史光标。该选项卡会在自身内部说明这一点，而不是显示一个 `0`.

### 权限——角色

![“权限”选项卡——列出每个角色及其是否已持有，以及授予 / 撤销 / 放弃控件。](/files/539a63be0f4e1d1e66a37f2509bf1f11e52aff19)

此选项卡列出代币声明的每个角色及其是否已持有，每项都通过一次 `hasRole` 对代币进行调用。一个……的角色 **不** 已持有的会如实显示，而不是被省略——在权限选项卡中，缺失的行和一个 *“不”* 是不同的事实。

在列表下方，有一个控件用于更改角色：

| 操作          | 作用对象                          | 权限                   |
| ----------- | ----------------------------- | -------------------- |
| **授予某个账户**  | 您输入的地址                        | `DEFAULT_ADMIN_ROLE` |
| **从某个账户撤销** | 您输入的地址                        | `DEFAULT_ADMIN_ROLE` |
| **放弃您自己的**  | 您本人（OpenZeppelin 要求确认者必须是调用者） | 您                    |

角色选项属于代币自身，因此该控件绝不会提供代币没有的角色。与每次写入一样，权限行和结果会在按钮之前渲染，因此会在您签名前先说明入口及其单向性。

***

## 绝不会触及 Bloom 或链上的内容

为明确合规内容存放的位置：

| 事物                     | 存放位置                                                       |
| ---------------------- | ---------------------------------------------------------- |
| KYC/AML 文件和个人身份信息（PII） | 您自己的系统，使用您自己的供应商和保留策略—— **绝不** 本应用或链上                      |
| 您决定允许某个地址进入            | 链下记录；存储由您负责                                                |
| 该决策在链上的效果              | 一个布尔值—— `isWhitelisted(address)` ——由 `batchAddToWhitelist` |
| 规则的执行                  | 资产合约在每次转账时                                                 |
| 谁可以管理该资产               | 资产许可名单模块中持有的角色，每次请求都会检查                                    |

有关完整的合规模型，请参阅 [COMPLIANCE.md](/zh/rome-shang-de-ying-yong/bloom/compliance.md)；有关持有人使用的双通道（EVM 和 Solana）机制，请参阅 [LANES.md](/zh/rome-shang-de-ying-yong/bloom/lanes.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.rome.builders/zh/rome-shang-de-ying-yong/bloom/issuing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
