# Robinhood Chain 股票代币：乘数怎么换算，持有人与每日活跃怎么查

> 原文地址: https://docs.blockvectra.com/zh/guides/stock-token-multiplier/

> 数据来自链上公开记录与智能合约状态，仅供参考，不构成投资建议。股票代币在部分国家与地区受到法律限制。


Robinhood Chain 支持代币化现实世界资产（RWA），涵盖美股与交易型开放式指数基金（ETF）。普通 ERC-20 代币的余额通常与底层资产保持 1:1 对应，但股票代币引入了公司行动乘数（multiplier），用于在拆股或股息再投资时动态调整对应股数，而无需变动持币地址的原始代币余额。

本文介绍股票代币乘数的工作机制、如何把代币余额换算为实际底层股票份额、如何通过 JSON-RPC `eth_call` 读取链上 `uiMultiplier`，以及如何使用 BlockVectra Data API 查询每日持有人与转账活跃数据。

关于 Robinhood Chain 的基础网络参数、方法策略与 RPC 接入，请参阅 [Robinhood Chain 指南](https://docs.blockvectra.com/zh/guides/robinhood-chain/)；关于股票数据集的通用字段定义与 CU（计算单元）用量模型，请参阅[股票代币指南](https://docs.blockvectra.com/zh/guides/stocks/)。

## 什么是股票代币乘数

Robinhood Chain 上的股票代币是由 Robinhood Assets (Jersey) Limited（RHJ）发行的标准 ERC-20 代币（精度为 18 位小数）。为了支持股票拆股与股息调整等公司行动，这些合约遵循 &#x2A;*ERC-8056（Scaled UI Amount Extension）** 规范。

乘数（`uiMultiplier`）定义了「每代币对应的底层股票份额」（shares-per-token）：

* **返回精度**：`uiMultiplier()` 采用 18 位定点数表示，数值 `1e18` 代表 `1.0`。
* **初始数值**：在代币初次发行时，乘数初始为 `1e18`（即 1 个代币对应 1 股底层股票）。
* **公司行动触发**：当发生公司行动（例如股票拆股或股息再投资）时，合约更新 `uiMultiplier`，并抛出 `UIMultiplierUpdated(uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp)` 事件。

### 拆股时余额不变而乘数调整

股票代币**不是弹性供应（rebasing）代币**。在公司行动发生时：

* 用户的原始持币余额（`balanceOf(account)`）以及代币总发行量（`totalSupply()`）**保持固定不变**。
* 合约仅调整缩放乘数。

举个例子：某底层股票实施 2 拆 1 的正向拆股（2-for-1 forward split）：

* 持有 10 个代币的用户，其链上 `balanceOf` 依旧显示为 10。
* 合约内的 `uiMultiplier` 由 `1.0`（`1e18`）变更为 `2.0`（`2e18`）。
* 每个代币现在代表 2 股底层股票，该用户所代表的实际底层持仓为 20 股。

### 怎样换算成「股数」

换算为底层股票数量遵循 Robinhood 官方文档给出的公式：

```text
underlying shares = raw token amount × uiMultiplier ÷ 1e18
```

ERC-8056 合约还在链上提供了辅助读取函数：

* `balanceOfUI(address account)`：直接返回指定账户对应的底层股票份额（已按 `uiMultiplier` 缩放，精度为 18 位）。
* `totalSupplyUI()`：直接返回按底层股票份额计量的总供应量。

此外，代币转账时会触发 `TransferWithScaledUI(address indexed from, address indexed to, uint256 value, uint256 uiValue)` 事件，同时记录原始转账数值与换算后的底层股数。

### 乘数与预言机价格的关系

Robinhood Chain 为每个股票代币部署了专属的 Chainlink 价格预言机（`AggregatorV3Interface`）：

* Chainlink 喂价（`latestRoundData()`）返回的价格**已经预先包含了乘数调整**（底层股票价格乘以乘数）。
* 读取链上 Chainlink 预言机时，拿到的是代币的完整实际单价，**切勿重复乘以乘数**。
* 若需通过链下接口获取元数据，Robinhood 提供了 REST 端点 `GET https://api.robinhood.com/rhj/assets`，返回各代币的 `currentMultiplier`、`pendingMultiplier` 以及待生效时间戳。

## 用 JSON-RPC eth\_call 读取乘数

可以通过 BlockVectra 提供的 Robinhood Chain JSON-RPC 端点，发起标准 `eth_call` 调用合约读取乘数：

* **函数名称**：`uiMultiplier()`
* **4 字节函数选择器**：`0xa60bf13d`（即 `bytes4(keccak256("uiMultiplier()"))`）
* **返回格式**：32 字节十六进制编码的 `uint256`（18 位定点数）

BlockVectra 在 `https://api.blockvectra.com/v1/robinhood_mainnet` 提供 Robinhood Chain 的 JSON-RPC 服务。可通过 `x-api-key` 请求头传入 API key，或把 key 拼入路径（`https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}`）。

### 代码示例

以下示例对 Robinhood Chain 上的 Everpure 股票代币合约（`0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D`）查询 `uiMultiplier()`：

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/robinhood_mainnet" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_call",
    "params": [
      {
        "to": "0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D",
        "data": "0xa60bf13d"
      },
      "latest"
    ]
  }'
```


  **viem (TypeScript)**

```ts
import { createPublicClient, defineChain, http, parseAbi } from "viem";

const robinhoodMainnet = defineChain({
  id: 4663,
  name: "Robinhood Chain",
  nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
  rpcUrls: {
    default: { http: ["https://api.blockvectra.com/v1/robinhood_mainnet"] },
  },
});

const client = createPublicClient({
  chain: robinhoodMainnet,
  transport: http("https://api.blockvectra.com/v1/robinhood_mainnet", {
    fetchOptions: {
      headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
    },
  }),
});

const stockTokenAbi = parseAbi([
  "function uiMultiplier() external view returns (uint256)",
  "function balanceOfUI(address account) external view returns (uint256)",
  "function balanceOf(address account) external view returns (uint256)",
]);

const tokenAddress = "0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D";

// 1. 读取公司行动乘数（18 位精度，1e18 = 1.0）
const multiplier = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "uiMultiplier",
});

console.log("uiMultiplier 原始值:", multiplier.toString());

// 2. 读取原始代币余额并换算为实际股数
const holderAddress = "0x0000000000000000000000000000000000000001";
const rawBalance = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "balanceOf",
  args: [holderAddress],
});

const underlyingShares = (rawBalance * multiplier) / 10n ** 18n;
console.log("按公式换算的股数:", underlyingShares.toString());

// 3. 也可以直接调用 balanceOfUI 读取已换算股数
const directShares = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "balanceOfUI",
  args: [holderAddress],
});
console.log("balanceOfUI 直接读取的股数:", directShares.toString());
```


## 用 Data API 查股票代币持有人与每日活跃

JSON-RPC 适合获取单点实时状态，而若要汇总跨区块的每日转账笔数、净供应量变化以及持币人分布，直接扫描区块比较繁重。BlockVectra Data API 提供了预先聚合的股票代币每日数据。

### 相关的股票数据路径

在 OpenAPI 规范（`data.yaml`）中，`/v1/data/robinhood_mainnet/` 下与股票代币相关的接口共有两个：

1. **`GET /v1/data/robinhood_mainnet/stocks`**：代币化股票每日活跃榜单，按每日转账笔数降序排列。
2. **`GET /v1/data/robinhood_mainnet/stocks/{token}`**：查询单个代币化股票的合约元数据，以及近 30 天的历史每日指标。

### 每日活跃榜单（`GET /v1/data/robinhood_mainnet/stocks`）

该接口返回指定 UTC 日期的股票活跃榜单，包含持币地址数、参与转账的独立地址数、铸造销毁与交易数据。

#### 请求参数

* `chain`（路径参数，必填）：链标识，填 `robinhood_mainnet`。
* `day`（查询参数，可选）：UTC 日期，格式 `YYYY-MM-DD`。省略时默认为近期的有记录日期。若该日期无活动记录，返回 HTTP `200` 与空数组 `data: []`。格式错误返回 HTTP `400`（`error.code = "bad_request"`）。
* `limit`（查询参数，可选）：返回条数上限，默认 50，超过 500 会被截断至 500。

#### 返回字段说明（`StockDailyListEnvelope`）

返回外层为包含 `data`（`StockDaily` 数组）和 `meta` 的结构体，无分页游标：

| 字段名                      | 类型                   | 说明                                              |
| ------------------------ | -------------------- | ----------------------------------------------- |
| `day`                    | `string` (date)      | 汇总的 UTC 日期（`YYYY-MM-DD`）。                       |
| `token`                  | `string` (address)   | 20 字节代币合约地址（`0x` 开头 40 位小写十六进制字符）。              |
| `symbol`                 | `string`             | 代币代号。                                           |
| `name`                   | `string`             | 代币显示名称（不可用时为空字符串 `""`）。                         |
| `transfers`              | `integer` (int64)    | 该 UTC 日期内链上转账总笔数。                               |
| `unique_senders`         | `integer` (int64)    | 当日发起转账的独立发送方地址数。                                |
| `unique_receivers`       | `integer` (int64)    | 当日接收转账的独立接收方地址数。                                |
| `mint_raw_amount`        | `string` (decimal)   | 当日铸造的原始代币数量（UInt256 字符串）。                       |
| `burn_raw_amount`        | `string` (decimal)   | 当日销毁的原始代币数量（UInt256 字符串）。                       |
| `net_supply_change`      | `string` (decimal)   | 当日净供应量变化量（带符号的 Int256 字符串）。                     |
| `holder_count`           | `integer` (int64)    | 持币地址总数。                                         |
| `top10_holder_share_bps` | `integer`            | 前 10 名持币人总持仓份额，单位为基点（bps，0–10000，100 bps = 1%）。 |
| `dex_swap_count`         | `integer` (int64)    | 当日涉及该代币的 DEX 兑换笔数。                              |
| `dex_raw_volume`         | `string` (decimal)   | 当日 DEX 原始交易额（UInt256 字符串）。                      |
| `refreshed_at`           | `string` (timestamp) | 该记录的 ISO-8601 UTC 刷新时间戳。                        |

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks?day=2026-09-30&limit=10" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const res = await fetch(
  "https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks?day=2026-09-30&limit=10",
  {
    headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
  },
);
const body = await res.json();
console.log(body);
```


### 查询单个代币历史指标（`GET /v1/data/robinhood_mainnet/stocks/{token}`）

该接口返回特定股票代币的合约元数据，并在 `daily` 数组中附带至多 30 天的每日历史指标，按日期降序排列。

#### 请求参数

* `chain`（路径参数，必填）：链标识，填 `robinhood_mainnet`。
* `token`（路径参数，必填）：20 字节代币合约地址，不区分大小写，`0x` 前缀可选。代币不存在返回 HTTP `404`（`error.code = "not_found"`）。

#### 返回字段说明（`StockTokenEnvelope`）

返回外层包含 `data`（`StockToken` 对象）与 `meta`：

* **合约元数据**：
  * `address`：合约地址。
  * `symbol`：代币代号。
  * `name`：代币名称。
  * `decimals`：代币精度（0–255，或 `null`）。
  * `created_block`：合约创建时的区块高度。
  * `created_tx_hash`：创建合约的交易哈希。
  * `factory`：工厂合约地址。
  * `creator`：部署者地址（或 `null`）。
  * `mint_address`：授权铸造地址（或 `null`）。
  * `burn_address`：授权销毁地址（或 `null`）。
  * `refreshed_at`：元数据刷新时间戳。
* **`daily` 数组**：包含至多 30 天的历史每日记录（`StockDailyMetric`），字段与榜单结构一致：
  * `day`、`transfers`、`unique_senders`、`unique_receivers`
  * `mint_raw_amount`、`burn_raw_amount`、`net_supply_change`
  * `holder_count`（持币人总数）、`top10_holder_share_bps`（前 10 持仓基点）
  * `dex_swap_count`、`dex_raw_volume`、`refreshed_at`

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks/0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const tokenAddress = "0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D";
const res = await fetch(
  `https://api.blockvectra.com/v1/data/robinhood_mainnet/stocks/${tokenAddress}`,
  {
    headers: { "x-api-key": process.env.BLOCKVECTRA_API_KEY! },
  },
);
const body = await res.json();
console.log(body);
```


## 合规说明与地区限制

* **链上活动数据说明**：Data API 与 JSON-RPC 返回的指标（包括 `holder_count`、`transfers`、`dex_swap_count` 与 `uiMultiplier`）反映的是区块链公开账目与智能合约状态，不代表证券二级市场股价，不构成任何投资建议或资产评估。
* **非投资建议**：本技术指南不构成对任何金融产品的要约、招揽或购买建议。
* **地域法律限制**：Robinhood 股票代币属于由在泽西岛注册的 Robinhood Assets (Jersey) Limited（RHJ，注册编号 162428）发行的代币化债务证券。该产品提供对底层美股与 ETF 的经济敞口，但并不赋予投资者对底层证券发行公司的法律权益或直接股东权利。股票代币未根据美国 1933 年《证券法》进行注册，严禁在美国境内或向美国人（U.S. Persons）直接或间接进行发售、转让或交付；在英国、加拿大、瑞士等地区亦存在限制。完整的发售说明书与适用地区的法律声明，请参阅 [Robinhood RHJ 官方说明](https://docs.robinhood.com/rhj) 与 [Robinhood Chain 股票代币概览](https://docs.robinhood.com/chain/stock-tokens/)。

## 下一步

* [浏览数据集目录](https://blockvectra.com/zh/data/)，查看 BlockVectra 索引的全部数据集。
* [查看免费额度与定价](https://blockvectra.com/zh/pricing/#free)，确认账户可用的方案。
* [登录控制台](https://console.blockvectra.com/zh/login/?next=%2Fzh%2Fkeys%2F)创建 API key。
