# Robinhood Chain 股票代幣：用一把 API key 讀取乘數、持有人與每日活動

> Source: https://docs.blockvectra.com/zh-hant/guides/stock-token-multiplier/

> 資料來自公開的鏈上記錄與智慧合約狀態，僅供參考，不構成投資建議。股票代幣在部分司法管轄區受到限制。


Robinhood Chain 支援代幣化的現實世界資產（RWA），包括代幣化的美國股票與指數股票型基金（ETF）。標準 ERC-20 代幣的餘額以 1:1 對應，但代幣化股票引入了公司行為乘數，以便在不改變錢包餘額的情況下因應股票分割與股利調整。

本指南說明股票代幣乘數的運作方式、如何將原始代幣餘額換算為底層股數、如何使用 JSON-RPC `eth_call` 查詢鏈上 `uiMultiplier`，以及如何透過 BlockVectra Data API 取得每日持有人與轉帳活動。

關於整體網路參數、方法策略與 RPC 設定，請參閱 [Robinhood Chain 指南](https://docs.blockvectra.com/zh-hant/guides/robinhood-chain/)。關於該資料集的完整欄位參考與計算單位（CU）用量模型，請參閱[代幣化股票指南](https://docs.blockvectra.com/zh-hant/guides/stocks/)。

## 什麼是股票代幣乘數

Robinhood 股票代幣是由 Robinhood Assets (Jersey) Limited（RHJ）發行的標準 ERC-20 代幣（18 位小數）。為了處理股票分割與股利再投資等公司行為，這些合約實作 **ERC-8056（Scaled UI Amount Extension）**。

乘數（`uiMultiplier`）定義了 `shares-per-token`（每代幣對應股數）比率：

* **精度**：`uiMultiplier()` 以 18 位小數定點數表示，其中 `1e18` 等於 `1.0`。
* **初始值**：代幣發行時，乘數初始化為 `1e18`（一個代幣代表一股底層股票）。
* **公司行為**：當公司事件發生時（例如正向股票分割或股利再投資），代幣合約會更新 `uiMultiplier`，並發出 `UIMultiplierUpdated(uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp)` 事件。

### 分割期間代幣餘額維持不變

股票代幣**不是 rebasing 代幣**。在公司行為期間：

* 錢包餘額（`balanceOf(account)`）與代幣總發行量（`totalSupply()`）**維持不變**。
* 只有縮放乘數會改變。

例如，若底層股票執行 2 拆 1 的正向分割：

* 持有 10 個代幣的持有人，其 `balanceOf` 仍顯示持有 10 個代幣。
* 合約將 `uiMultiplier` 從 `1.0`（`1e18`）更新為 `2.0`（`2e18`）。
* 每個代幣現在代表 2 股底層股票，使持有人擁有相當於 20 股的實際曝險。

### 將餘額換算為股數

若要計算代幣餘額所代表的底層股數，請使用 ERC-8056 公式：

```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 讀取乘數

你可以使用 `eth_call`，透過 BlockVectra 的 Robinhood Chain JSON-RPC 端點直接檢視任何代幣化股票的乘數。

* **函式**：`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，或將其附加到路徑（`https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}`）。

### 程式碼範例

以下範例查詢 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 (raw uint256):", 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("Calculated underlying shares:", underlyingShares.toString());

// 3. 或使用 balanceOfUI 直接讀取已縮放的股數
const directShares = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "balanceOfUI",
  args: [holderAddress],
});
console.log("Direct balanceOfUI shares:", directShares.toString());
```


## 使用 Data API 查詢持有人與每日活動

BlockVectra Data API 提供代幣化股票的預先索引每日摘要。使用 `GET /v1/data/robinhood_mainnet/stocks` 取得每日活動排行榜，並使用 `GET /v1/data/robinhood_mainnet/stocks/{token}` 取得單一代幣的中繼資料與最多 30 天的每日指標。請求參數、回應欄位與範例請參閱[代幣化股票指南](https://docs.blockvectra.com/zh-hant/guides/stocks/)。

## 法規注意事項

股票代幣是由 Robinhood Assets (Jersey) Limited（RHJ）發行的代幣化債務證券。公開說明書、最終條款與司法管轄區通知請參閱 [Robinhood RHJ 文件](https://docs.robinhood.com/rhj)。

## 下一步

* [瀏覽資料集目錄](https://blockvectra.com/zh-hant/data/)，查看 BlockVectra 索引的每個資料集。
* [查看免費方案與定價](https://blockvectra.com/zh-hant/pricing/#free)，確認你的帳戶包含哪些內容。
* [登入控制台](https://console.blockvectra.com/login/?next=%2Fkeys%2F)建立 API key。
