# โทเค็นหุ้นบน Robinhood Chain: การอ่านตัวคูณ ผู้ถือ และกิจกรรมรายวันด้วย API key เดียว

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

> ข้อมูลได้มาจากบันทึกบนเชนสาธารณะและสถานะของสัญญาอัจฉริยะ จัดทำขึ้นเพื่อวัตถุประสงค์ในการให้ข้อมูลเท่านั้น และไม่ถือเป็นคำแนะนำในการลงทุน โทเค็นหุ้นมีข้อจำกัดตามเขตอำนาจศาล


Robinhood Chain รองรับสินทรัพย์ในโลกแห่งความเป็นจริงในรูปแบบโทเค็น (RWAs) รวมถึงหุ้นสหรัฐฯ และกองทุนซื้อขายแลกเปลี่ยน (ETFs) ในรูปแบบโทเค็น ในขณะที่โทเค็น ERC-20 มาตรฐานจะแมปยอดคงเหลือแบบ 1:1 แต่หุ้นโทเค็นจะมีการนำตัวคูณการดำเนินการขององค์กรมาใช้ เพื่อรองรับการแตกหุ้นและการปรับเงินปันผลโดยไม่ต้องเปลี่ยนยอดคงเหลือในกระเป๋าเงิน

คู่มือนี้จะอธิบายวิธีการทำงานของตัวคูณโทเค็นหุ้น วิธีแปลงยอดคงเหลือโทเค็นดิบเป็นจำนวนหุ้นอ้างอิง วิธีสืบค้น `uiMultiplier` บนเชนโดยใช้ JSON-RPC `eth_call` และวิธีดึงข้อมูลผู้ถือรายวันและกิจกรรมการโอนผ่าน 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 เป็นโทเค็น ERC-20 มาตรฐาน (มี 18 decimals) ที่ออกโดย Robinhood Assets (Jersey) Limited (RHJ) เพื่อรองรับการดำเนินการขององค์กร เช่น การแตกหุ้นและการนำเงินปันผลไปลงทุนใหม่ สัญญาเหล่านี้ได้นำมาตรฐาน **ERC-8056 (Scaled UI Amount Extension)** มาใช้งาน

ตัวคูณ (`uiMultiplier`) กำหนดอัตราส่วน `จำนวนหุ้นต่อหนึ่งโทเค็น`:

* **ความแม่นยำ**: `uiMultiplier()` แสดงในรูปแบบตัวเลขทศนิยมคงที่ขนาด 18 ตำแหน่ง โดย `1e18` เท่ากับ `1.0`
* **ค่าเริ่มต้น**: เมื่อออกโทเค็น ตัวคูณจะถูกกำหนดค่าเริ่มต้นเป็น `1e18` (หนึ่งโทเค็นแทนหนึ่งหุ้นอ้างอิง)
* **การดำเนินการขององค์กร**: เมื่อเกิดเหตุการณ์ระดับองค์กร (เช่น การแตกหุ้นไปข้างหน้า หรือการนำเงินปันผลไปลงทุนใหม่) สัญญาโทเค็นจะอัปเดต `uiMultiplier` และส่ง event `UIMultiplierUpdated(uint256 oldMultiplier, uint256 newMultiplier, uint256 effectiveAtTimestamp)`

### ยอดคงเหลือโทเค็นคงที่ระหว่างการแตกหุ้น

โทเค็นหุ้น**ไม่ใช่โทเค็นประเภท rebasing** ระหว่างการดำเนินการขององค์กร:

* ยอดคงเหลือในกระเป๋าเงิน (`balanceOf(account)`) และการออกโทเค็นทั้งหมด (`totalSupply()`) **จะไม่มีการเปลี่ยนแปลง**
* มีเพียงตัวคูณปรับสเกลเท่านั้นที่เปลี่ยนแปลง

ตัวอย่างเช่น หากหุ้นอ้างอิงดำเนินการแตกหุ้นไปข้างหน้าแบบ 2 ต่อ 1:

* ผู้ถือที่ครอบครอง 10 โทเค็นจะยังคงถือ 10 โทเค็นใน `balanceOf`
* สัญญาจะอัปเดต `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 decimals)
* `totalSupplyUI()`: ส่งคืนอุปทานโทเค็นทั้งหมดโดยแสดงเป็นจำนวนหุ้นอ้างอิงโดยตรง

นอกจากนี้ การโอนโทเค็นจะส่ง event `TransferWithScaledUI(address indexed from, address indexed to, uint256 value, uint256 uiValue)` ออกมา เพื่อบันทึกทั้งจำนวนโทเค็นดิบและจำนวนหุ้นอ้างอิงที่ปรับสเกลแล้ว

### ตัวคูณและ Price Feed ของ Oracle

Robinhood Chain ได้ดีพลอย Chainlink price feed (`AggregatorV3Interface`) โดยเฉพาะสำหรับแต่ละโทเค็นหุ้น:

* Chainlink price feed (`latestRoundData()`) **ได้รวมตัวคูณเข้าไปเรียบร้อยแล้ว** โดยจะสะท้อนราคาตลาดเต็มรูปแบบของหนึ่งโทเค็น (ราคาหุ้นอ้างอิงคูณด้วยตัวคูณ)
* แอปพลิเคชันที่อ่าน Chainlink oracle บนเชนจะได้รับราคาที่ปรับด้วยตัวคูณแล้วโดยตรง และ**ต้องไม่**นำตัวคูณไปคูณซ้ำเป็นครั้งที่สอง
* ข้อมูลเมทาดาตาแบบ off-chain สามารถตรวจสอบได้ผ่าน REST endpoint ของ Robinhood `GET https://api.robinhood.com/rhj/assets` ซึ่งให้ข้อมูล `currentMultiplier` และ `pendingMultiplier`

## การอ่านตัวคูณด้วย JSON-RPC eth\_call

คุณสามารถตรวจสอบตัวคูณของหุ้นโทเค็นใดๆ ได้โดยตรงผ่าน JSON-RPC endpoint ของ BlockVectra สำหรับ Robinhood Chain โดยใช้ `eth_call`:

* **ฟังก์ชัน**: `uiMultiplier()`
* **ตัวเลือกฟังก์ชัน 4 ไบต์**: `0xa60bf13d` (`bytes4(keccak256("uiMultiplier()"))`)
* **รูปแบบการส่งคืน**: `uint256` ที่เข้ารหัสฐานสิบหกขนาด 32 ไบต์ (ค่า fixed-point 18 ตำแหน่ง)

BlockVectra ให้บริการคำขอ JSON-RPC ของ Robinhood Chain ภายใต้ `https://api.blockvectra.com/v1/robinhood_mainnet` ให้ส่ง API key ของคุณผ่านส่วนหัว `x-api-key` หรือต่อท้ายในพาธ (`https://api.blockvectra.com/v1/robinhood_mainnet/{api_key}`)

### ตัวอย่างโค้ด

ตัวอย่างด้านล่างนี้สอบถาม `uiMultiplier()` บนสัญญาโทเค็นหุ้น 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());
```


## การสืบค้นผู้ถือและกิจกรรมรายวันด้วย Data API

BlockVectra Data API มีข้อมูลสรุปรายวันที่จัดทำดัชนีไว้ล่วงหน้าสำหรับหุ้นโทเค็น ใช้ `GET /v1/data/robinhood_mainnet/stocks` สำหรับกระดานผู้นำกิจกรรมรายวัน และ `GET /v1/data/robinhood_mainnet/stocks/{token}` สำหรับเมทาดาตาของโทเค็นหนึ่งรายการและเมตริกรายวันย้อนหลังสูงสุด 30 วัน ดูพารามิเตอร์คำขอ ฟิลด์การตอบกลับ และตัวอย่างได้ที่ [คู่มือหุ้นโทเค็น](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
