# Robinhood Chain 株式トークン：1 つの API key で乗数、保有者、日次アクティビティを読み取る

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

> データはオンチェーンの公開記録およびスマートコントラクトの状態から取得されています。情報提供のみを目的としており、投資助言を構成するものではありません。株式トークンには管轄区域による制限があります。


Robinhood Chain は、トークン化された米国株式や上場投資信託（ETF）を含む、トークン化された現実世界資産（RWA）をサポートしています。標準的な ERC-20 トークンは残高を 1:1 でマッピングしますが、トークン化株式はコーポレートアクション乗数を導入し、ウォレット残高を変更することなく株式分割や配当調整に対応します。

このガイドでは、株式トークンの乗数がどのように動作するか、生のトークン残高を原資産の株数に換算する方法、JSON-RPC `eth_call` を使用してオンチェーンで `uiMultiplier` を照会する方法、および BlockVectra Data API を介して日次保有者と転送アクティビティを取得する方法を説明します。

広範なネットワークパラメータ、メソッドポリシー、RPC のセットアップについては、[Robinhood Chain ガイド](https://docs.blockvectra.com/en/guides/robinhood-chain/) を参照してください。データセットの包括的なフィールドリファレンスと Compute Unit（CU）使用量モデルについては、[トークン化株式ガイド](https://docs.blockvectra.com/en/guides/stocks/) を参照してください。

## 株式トークンの乗数とは

Robinhood の株式トークンは、Robinhood Assets (Jersey) Limited（RHJ）によって発行された標準的な ERC-20 トークン（小数第 18 位）です。株式分割や配当の再投資などのコーポレートアクションを処理するため、これらのコントラクトは **ERC-8056（Scaled UI Amount Extension）** を実装しています。

乗数（`uiMultiplier`）は、`shares-per-token`（1 トークンあたりの株数）の比率を定義します：

* **精度**：`uiMultiplier()` は 18 桁の固定小数点数として表され、`1e18` は `1.0` に相当します。
* **初期値**：トークン発行時、乗数は `1e18` に初期化されます（1 トークンが原資産の 1 株を表します）。
* **コーポレートアクション**：コーポレートイベント（順株式分割や配当の再投資など）が発生すると、トークンコントラクトは `uiMultiplier` を更新し、`UIMultiplierUpdated(uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp)` イベントを発行します。

### 分割時も固定されるトークン残高

株式トークンは**リベーストークンではありません**。コーポレートアクションの際：

* ウォレット残高（`balanceOf(account)`）およびトークン総発行量（`totalSupply()`）は**変更されません**。
* スケーリング乗数のみが変更されます。

例えば、原資産の株式が 1 株を 2 株にする順株式分割（2-for-1 forward split）を実施した場合：

* 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()`）は**すでに乗数を反映しています**。1 トークンの完全な市場価格（原資産の株価に乗数を掛けたもの）を反映しています。
* オンチェーンの 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 バイトの 16 進エンコードされた `uint256`（18 桁の固定小数点値）

BlockVectra は `https://api.blockvectra.com/v1/robinhood_mainnet` で Robinhood Chain の JSON-RPC リクエストを処理します。API key は `x-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` を、1 つのトークンのメタデータおよび最大 30 日間の日次メトリクスには `GET /v1/data/robinhood_mainnet/stocks/{token}` を使用します。リクエストパラメータ、レスポンスフィールド、およびサンプルについては、[トークン化株式ガイド](https://docs.blockvectra.com/en/guides/stocks/) を参照してください。

## 規制に関する注意事項

株式トークンは、Robinhood Assets (Jersey) Limited（RHJ）によって発行されたトークン化された債務証券です。目論見書、最終条件、および法域に関する通知については、[Robinhood RHJ ドキュメント](https://docs.robinhood.com/rhj) を参照してください。

## 次のステップ

* [データセットディレクトリを閲覧](https://blockvectra.com/en/data/) して、BlockVectra がインデックス化しているすべてのデータセットを確認できます。
* [無料プランと料金](https://blockvectra.com/en/pricing/#free) で、アカウントに含まれる内容を確認できます。
* [コンソールにログイン](https://console.blockvectra.com/login/?next=%2Fkeys%2F) して、API key を作成してください。
