# Token cổ phiếu Robinhood Chain: đọc hệ số nhân, người nắm giữ và hoạt động hằng ngày bằng một API key

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

> Dữ liệu được suy ra từ bản ghi on-chain công khai và trạng thái hợp đồng thông minh. Dữ liệu chỉ phục vụ mục đích thông tin và không phải tư vấn đầu tư. Token cổ phiếu chịu các hạn chế theo khu vực pháp lý.


Robinhood Chain hỗ trợ tài sản thực được token hóa (RWA), gồm cổ phiếu Mỹ và quỹ hoán đổi danh mục (ETF) được token hóa. Trong khi token ERC-20 tiêu chuẩn ánh xạ số dư theo tỷ lệ 1:1, cổ phiếu được token hóa dùng hệ số nhân cho hành động doanh nghiệp để xử lý chia tách cổ phiếu và điều chỉnh cổ tức mà không thay đổi số dư ví.

Hướng dẫn này giải thích cách hệ số nhân token cổ phiếu hoạt động, cách quy đổi số dư token thô thành số cổ phiếu cơ sở, cách truy vấn `uiMultiplier` on-chain bằng JSON-RPC `eth_call` và cách lấy dữ liệu người nắm giữ cùng hoạt động chuyển hằng ngày qua BlockVectra Data API.

Để biết tham số mạng chung, chính sách phương thức và cấu hình RPC, xem [hướng dẫn Robinhood Chain](https://docs.blockvectra.com/vi/guides/robinhood-chain/). Để biết tham chiếu trường đầy đủ và mô hình sử dụng Compute Unit (CU) của bộ dữ liệu, xem [hướng dẫn cổ phiếu được token hóa](https://docs.blockvectra.com/vi/guides/stocks/).

## Hệ số nhân token cổ phiếu là gì

Token cổ phiếu Robinhood là token ERC-20 tiêu chuẩn (18 chữ số thập phân) do Robinhood Assets (Jersey) Limited (RHJ) phát hành. Để xử lý hành động doanh nghiệp như chia tách cổ phiếu và tái đầu tư cổ tức, các hợp đồng này triển khai **ERC-8056 (Scaled UI Amount Extension)**.

Hệ số nhân (`uiMultiplier`) xác định tỷ lệ `shares-per-token`:

* **Độ chính xác**: `uiMultiplier()` được biểu diễn bằng số điểm cố định 18 chữ số thập phân, trong đó `1e18` bằng `1.0`.
* **Giá trị ban đầu**: Khi phát hành token, hệ số nhân được khởi tạo là `1e18` (một token đại diện cho một cổ phiếu cơ sở).
* **Hành động doanh nghiệp**: Khi có sự kiện doanh nghiệp (như chia tách tăng số lượng cổ phiếu hoặc tái đầu tư cổ tức), hợp đồng token cập nhật `uiMultiplier` và phát sự kiện `UIMultiplierUpdated(uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp)`.

### Số dư token cố định khi chia tách

Token cổ phiếu **không phải token rebasing**. Trong hành động doanh nghiệp:

* Số dư ví (`balanceOf(account)`) và tổng lượng token phát hành (`totalSupply()`) **không thay đổi**.
* Chỉ hệ số nhân điều chỉnh thay đổi.

Ví dụ, nếu cổ phiếu cơ sở thực hiện chia tách theo tỷ lệ 2:1:

* Người nắm giữ 10 token tiếp tục có 10 token trong `balanceOf`.
* Hợp đồng cập nhật `uiMultiplier` từ `1.0` (`1e18`) thành `2.0` (`2e18`).
* Mỗi token lúc này đại diện cho 2 cổ phiếu cơ sở, nên phần sở hữu kinh tế hiệu dụng của người nắm giữ tương đương 20 cổ phiếu.

### Quy đổi số dư thành số cổ phiếu

Để tính số cổ phiếu cơ sở mà số dư token đại diện, dùng công thức ERC-8056:

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

Hợp đồng token ERC-8056 cũng cung cấp các hàm hỗ trợ chỉ đọc on-chain:

* `balanceOfUI(address account)`: Trả trực tiếp số dư tài khoản tính bằng cổ phiếu cơ sở (được điều chỉnh theo `uiMultiplier`, 18 chữ số thập phân).
* `totalSupplyUI()`: Trả trực tiếp tổng cung token tính bằng cổ phiếu cơ sở.

Ngoài ra, chuyển token phát sự kiện `TransferWithScaledUI(address indexed from, address indexed to, uint256 value, uint256 uiValue)`, ghi lại cả lượng token thô và số cổ phiếu cơ sở đã điều chỉnh.

### Hệ số nhân và nguồn giá oracle

Robinhood Chain triển khai nguồn giá Chainlink riêng (`AggregatorV3Interface`) cho mỗi token cổ phiếu:

* Nguồn giá Chainlink (`latestRoundData()`) **đã bao gồm hệ số nhân**. Giá phản ánh toàn bộ giá thị trường của một token (giá cổ phiếu cơ sở nhân với hệ số nhân).
* Ứng dụng đọc oracle Chainlink on-chain nhận trực tiếp giá đã điều chỉnh theo hệ số nhân và **không được** áp dụng hệ số nhân lần nữa.
* Metadata off-chain cũng có thể kiểm tra qua endpoint REST của Robinhood `GET https://api.robinhood.com/rhj/assets`, cung cấp `currentMultiplier` và `pendingMultiplier`.

## Đọc hệ số nhân bằng JSON-RPC eth\_call

Bạn có thể kiểm tra trực tiếp hệ số nhân của bất kỳ cổ phiếu được token hóa nào qua endpoint JSON-RPC của BlockVectra cho Robinhood Chain bằng `eth_call`.

* **Hàm**: `uiMultiplier()`
* **Selector hàm 4 byte**: `0xa60bf13d` (`bytes4(keccak256("uiMultiplier()"))`)
* **Định dạng trả về**: `uint256` mã hóa thập lục phân 32 byte (giá trị điểm cố định 18 chữ số thập phân)

BlockVectra phục vụ yêu cầu JSON-RPC Robinhood Chain tại `https://api.blockvectra.com/v1/robinhood_mainnet`. Truyền API key qua header `x-api-key` hoặc thêm vào đường dẫn (`https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}`).

### Ví dụ mã

Các ví dụ sau truy vấn `uiMultiplier()` trên hợp đồng token cổ phiếu Everpure (`0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D`):

**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. Read the corporate-action multiplier (18 decimals, 1e18 = 1.0)
const multiplier = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "uiMultiplier",
});

console.log("uiMultiplier (raw uint256):", multiplier.toString());

// 2. Read raw balance and convert to underlying shares
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. Or read pre-scaled shares directly using balanceOfUI
const directShares = await client.readContract({
  address: tokenAddress,
  abi: stockTokenAbi,
  functionName: "balanceOfUI",
  args: [holderAddress],
});
console.log("Direct balanceOfUI shares:", directShares.toString());
```


## Truy vấn người nắm giữ và hoạt động hằng ngày bằng Data API

BlockVectra Data API cung cấp bản tổng hợp hằng ngày đã lập chỉ mục cho cổ phiếu được token hóa. Dùng `GET /v1/data/robinhood_mainnet/stocks` để lấy bảng xếp hạng hoạt động hằng ngày và `GET /v1/data/robinhood_mainnet/stocks/{token}` để lấy metadata của một token cùng tối đa 30 ngày chỉ số hằng ngày. Xem tham số yêu cầu, trường phản hồi và ví dụ trong [hướng dẫn cổ phiếu được token hóa](https://docs.blockvectra.com/vi/guides/stocks/).

## Lưu ý pháp lý

Token cổ phiếu là chứng khoán nợ được token hóa do Robinhood Assets (Jersey) Limited (RHJ) phát hành. Xem [tài liệu Robinhood RHJ](https://docs.robinhood.com/rhj) để biết bản cáo bạch, điều khoản cuối cùng và thông báo theo khu vực pháp lý.

## Các bước tiếp theo

* [Duyệt danh mục bộ dữ liệu](https://blockvectra.com/vi/data/) để xem mọi bộ dữ liệu BlockVectra lập chỉ mục.
* [Xem gói miễn phí và bảng giá](https://blockvectra.com/vi/pricing/#free) để kiểm tra những gì tài khoản của bạn bao gồm.
* [Đăng nhập bảng điều khiển](https://console.blockvectra.com/login/?next=%2Fkeys%2F) để tạo API key.
