# Robinhood Chain 주식 토큰: 하나의 API key로 승수, 보유자 및 일별 활동 조회하기

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

> 데이터는 공개된 온체인 기록 및 스마트 컨트랙트 상태에서 파생되며 정보 제공 목적으로만 사용됩니다. 투자 조언에 해당하지 않습니다. 주식 토큰에는 관할권 제한이 적용됩니다.


Robinhood Chain은 토큰화된 미국 주식 및 상장지수펀드(ETF)를 포함한 토큰화된 실물 자산(RWA)을 지원합니다. 표준 ERC-20 토큰은 잔액을 1:1로 매핑하지만, 토큰화된 주식은 지갑 잔액을 변경하지 않고 주식 분할 및 배당 조정을 반영하기 위해 기업 활동 승수(multiplier)를 도입합니다.

이 가이드에서는 주식 토큰 승수의 작동 방식, 원시 토큰 잔액을 기초 주식 수로 환산하는 방법, 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`(토큰당 주식 수) 비율을 정의합니다:

* **정밀도**: `uiMultiplier()`는 18자리 고정 소수점으로 표시되며, `1e18`은 `1.0`과 같습니다.
* **초기값**: 토큰 발행 시 승수는 `1e18`로 초기화됩니다(1개 토큰이 1개의 기초 주식을 나타냄).
* **기업 활동**: 기업 활동(예: 액면분할 또는 배당 재투자)이 발생하면 토큰 컨트랙트는 `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()`)에는 **이미 승수가 반영되어 있습니다**. 이는 1개 토큰의 전체 시장 가격(기초 주식 가격에 승수를 곱한 값)을 반영합니다.
* 온체인 Chainlink 오라클을 읽는 애플리케이션은 승수가 조정된 가격을 직접 수신하므로 승수를 **두 번 적용해서는 안 됩니다**.
* 오프체인 메타데이터는 `currentMultiplier` 및 `pendingMultiplier`를 제공하는 Robinhood의 REST 엔드포인트 `GET https://api.robinhood.com/rhj/assets`를 통해 확인할 수도 있습니다.

## JSON-RPC eth\_call로 승수 읽기

`eth_call`을 사용하여 Robinhood Chain에 대한 BlockVectra의 JSON-RPC 엔드포인트를 통해 토큰화된 모든 주식의 승수를 직접 검사할 수 있습니다.

* **함수**: `uiMultiplier()`
* **4바이트 함수 선택자**: `0xa60bf13d` (`bytes4(keccak256("uiMultiplier()"))`)
* **반환 형식**: 32바이트 16진수 인코딩된 `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. 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`를 사용하고, 한 토큰의 메타데이터와 최대 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 생성.
