싱글체인 TrancheSDK도 같은 화면 데이터 메서드를 제공합니다 —
priceHistory()·realizedApy()·profitHistory()·faucet(),
그리고 investmentRequests()는 허브 TxRegistry에서 요청 tx 해시(txHash)를 보강합니다.
✓이 문서의 예시 값은 모두 실제 테스트베드
라이브 응답에서 가져온 것입니다.
Getting Started › About OmniFi & the SDK
OmniFi SDK
A TypeScript SDK for the OmniFi multichain RWA tranche protocol. It reads the
on-chain ledger through per-screen methods and runs deposit, redeem, and receive as single calls.
Every failure is a typed error that carries a display-ready message.
What is an OmniFi tranche product
An RWA (real-world-asset) product that accepts investors into a single managed pool
split into two layers (tranches).
Tranche
Yield
Profile
Senior
Fixed rate (e.g. 3% APR)
Paid first — lower-risk layer
Junior
Variable — residual yield
Takes what remains after Senior, with the matching risk
Investors deposit the asset (USDC) and receive shares. Share prices are finalized
at each periodic settlement, and deposits and redemptions execute at that price. This is
the same model as fund NAV pricing.
The multichain layout
Spoke (Sepolia) — where user transactions run: deposit/redeem requests and receiving.
Hub (Bifrost) — the source of truth for product configuration, settlement results, and the request ledger. Most reads come from here.
Requested funds travel to the hub over a bridge, get recorded, and settlement results
propagate back to the spoke. A delay between request and receivable is normal —
the SDK exposes the in-between progress as a timeline.
Product line-up — deposit vs basket
Four scenarios are live on the testbed. A·B·C are deposit-type (assets earn yield in
sources); D is basket-type (ETF-like — a QQQ-mirroring mock-stock basket, inspect with
basketHoldings()).
The single-chain TrancheSDK ships the same screen-data methods —
priceHistory()·realizedApy()·profitHistory()·faucet() —
and investmentRequests() enriches each request with its tx hash from the hub TxRegistry.
✓Every sample value in these docs comes from
live testbed responses.
시작하기 › Quick Start
Quick Start
설치부터 첫 입금 신청까지의 최소 절차입니다.
1. 설치
shell
pnpm add @omnifi/sdk # peer: viem
2. SDK 초기화
ts
import { OmniFi, OmniFiError } from'@omnifi/sdk'const omnifi = await OmniFi.create() // 최신 상품(시나리오 A · USDC) 자동 발견 — 조회는 이것으로 충분// 특정(구) 상품을 지정할 때만 — 나머지는 디폴트로 동작const custom = await OmniFi.create({ productId: 0x0000000200000009 })
볼트·자산·RPC는 모두 기본값이 있고, 주소는 허브 프리컴파일에서 자동으로 발견됩니다.
나머지 옵션(defaultChainId·chains·locale·hubRpcUrl)은
필요할 때만 넘기면 됩니다. 조회 메서드는 지갑 없이 동작합니다.
3. 첫 조회 — 상품 정보
ts
const ov = await omnifi.overview()
console.log(ov.tvl?.formatted, ov.assetSymbol) // "1,399.97" "USDC" (미정산이면 null)
console.log(ov.tranches[0].aprPercent) // 3 (Senior 고정 이율 %)
4. 지갑 연결 — 액션 실행 시에만 필요
ts
omnifi.connect(window.ethereum) // wagmi 사용 시 connector.getProvider() 결과 전달
5. 첫 입금 신청
ts
try {
const { txHash, requestId } = await omnifi.deposit('senior', '100.5')
// 자격 확인·네트워크 전환·approve·신청·영수증 대기가 모두 완료된 상태
} catch (e) {
if (e instanceof OmniFiError) toast(e.userMessage)
}
6. 이후 흐름 — 폴링으로 상태 갱신
신청 후에는 시스템이 자동으로 진행합니다(브릿징 → 정산 → 전파).
myAccount()를 10~15초 간격으로 폴링하면 상태가
processing → receivable로 전환되며,
이때 receive()를 호출하면 완료됩니다.
The minimal path from install to a first deposit request.
1. Install
shell
pnpm add @omnifi/sdk # peer: viem
2. Create the SDK
ts
import { OmniFi, OmniFiError } from'@omnifi/sdk'const omnifi = await OmniFi.create() // auto-discovers the latest product (scenario A · USDC)// only when targeting a specific product — everything else has sane defaultsconst custom = await OmniFi.create({ productId: 0x0000000200000009 })
Vaults, assets and RPCs all have defaults — this is enough. Addresses are auto-discovered
from the hub precompiles. Other options (defaultChainId · chains · locale ·
hubRpcUrl) only when you need them. All read methods work without a wallet.
3. First read — product info
ts
const ov = await omnifi.overview()
console.log(ov.tvl?.formatted, ov.assetSymbol) // "1,399.97" "USDC" (null before first settlement)
console.log(ov.tranches[0].aprPercent) // 3 (Senior fixed APR %)
4. Connect a wallet — actions only
ts
omnifi.connect(window.ethereum) // with wagmi: pass connector.getProvider()
Once requested, the system proceeds automatically. Poll myAccount() every 10–15 s;
the state moves processing → receivable,
then call receive() to finish.
Render `${a.formatted} ${a.symbol}`; input is a decimal string. Neither side touches bigint.
② The error model
Every failure is an OmniFiError. Branch on e.code, display
e.userMessage. The original error lives in e.cause — debugging only.
Full table: Error Handling.
i"No data" and "read failure" are distinct —
absence is null/empty (normal); failure is an OmniFiError (retry UI).
Settlement runs on a schedule (60-minute cycles; orders close 20 minutes before cycle end).
Late requests roll to the next round — overview().nextSettlementAt is the authoritative ETA.
!Requests cannot be cancelled.
A confirmation modal before redeem() is a UX requirement.
④ Prices are settlement-finalized
Prices and TVL are values finalized at the latest settlement — not live quotes. Always show
settledAt, and prefix estimate* results with "estimated".
시작하기 › 프로세스 단계 · 용어
프로세스 단계 · 용어
입금·상환이 신청부터 수령까지 어떤 단계를 거치는지, 각 단계를 무엇이라 부르고
SDK의 어떤 필드로 확인하는지 정리한 문서입니다.
요청 상태 3값
표준 상태
한국어 라벨
SDK status
의미
Pending
정산 대기
'processing'
유저가 입금·상환을 신청한 뒤 처리를 기다리는 단계. 브릿징·회차 배정이 자동으로 진행되며, 유저가 할 일은 없습니다
Receivable
수령 가능
'receivable'
입금·상환 처리가 끝나 유저가 수령할 수 있는 단계. 수령 버튼(receive())을 노출합니다 (온체인 7540의 Claimable — claimDeposit 등 코드 함수명은 원명 유지)
Received
수령 완료
수령 후 'none'
유저가 수령까지 마쳐 요청이 완료된 상태. 이후 이 요청은 진행중 화면에서 사라지고 내역에만 남습니다
activity() steps "브릿징 → 허브 도착 → 수익원 전달 → 공급 반영" + 단계별 txHash — 상세 뷰 전용
queued
정산 대기
status 'processing'의 기본 표시 — overview().nextSettlementAt 병기
settlement
정산 확정
activity().phase "정산 확정" — share 수량이 여기서 처음 확정
shareReceivable
수령 가능
status 'receivable' + amount(확정 share)
shareReceived
수령 완료
receive() 반환 received
상환 단계 ↔ SDK
redeemRequest상환 신청 완료유저 tx · 취소 불가
→
bridging브릿징자동 · 지급 재원 준비
→
queued정산 대기자동
→
settlement정산 확정자동 · 지급액 확정
→
collateralReceivable수령 가능Receivable
→
collateralReceived수령 완료유저 tx · share 소각
SDK 매핑은 입금과 동일합니다(redeem() → activity()/myAccount() → receive()).
차이는 두 가지: 지급액 문구는 가격 모드 종속이라 모드 중립 기본 표현이 지급 예정액
(estimateRedeem()도 "예상" 한정어 필수), 수령 시 escrow share가 소각됩니다.
화면에 직결되는 5가지 규칙
취소는 없습니다 — 입금·상환 모두 크로스체인 취소 미지원. 취소 버튼·상태를 만들지 말고,
신청 확인 모달에서 "신청 후 취소 불가"를 고지하세요 (SDK에도 취소 API가 없습니다).
미결제 요청은 트랜치·방향당 1건 — 앞 요청 수령 전 새 신청은 revert.
status !== 'none'이면 신청 버튼을 비활성하는 근거입니다.
share 토큰은 수령 시점에 발행 — Receivable의 share는 아직 지갑 잔액이 아닙니다.
잔액 표기는 지갑 share + 수령 대기 share 합산으로.
Pending 금액은 운용 전 — 수익이 붙지 않습니다. "정산 확정 시점부터 운용 시작"을 명시.
가격·수량 확정 전에는 "예상" 한정어 — estimate*() 결과와 신청~정산 구간 share 수량 표시에 필수.
정산 사이클 (시스템 프로세스)
trigger정산 개시봇/Auto Pilot
→
collectNAV 수집허브+전 스포크
→
record확정·기록가격 확정 tx
→
finalize확정 반영스포크 전파
유저 화면에는 정산 회차(settlementRound)와 다음 정산 예정 시각(nextSettlementAt)만 노출합니다.
사이클 크로스체인 진행은 omnifi.inner.settlementProgress(round)(운영 뷰 전용).
온체인 단계 레퍼런스 (프리컴파일 enum)
TxRegistry 프리컴파일이 각 단계에 부여하는 uint8 코드와 enum명입니다. SDK는 이 코드를
한국어 표준어(TimelineStep.label)와 enum명(TimelineStep.labelEn)으로 함께 노출합니다 —
enum명이 크로스팀 문의의 정본입니다(예: "CollectBridgeExecuted가 롤백됐다").
RequestStep — 요청 단계 (get_request.request_steps · adapter_legs)
코드
enum명
한국어 (입금 / 상환)
의미
1
Requested
신청 완료
유저 서명 tx로 요청 접수 — escrow 이동·requestId 발급
2
RequestBridgeExecuted
브릿징
접수 체인 → 허브 자산·지시 브릿지 실행 (Spoke-vault만)
3
RequestQueued
허브 도착
허브 원장 기록·정산 회차 배정
4
AdapterBridgeExecuted
수익원 전달 / 재원 회수
수익원 어댑터 체인으로 자금 브릿지 (원격 체인만 — 로컬은 생략)
5
AdapterApplied
공급 반영 / 회수 반영
어댑터에 공급(입금)·회수(상환) 반영
6
RequestCompleted
처리 완료
요청 자금이 허브·필요 어댑터 체인까지 모두 도달
i상환은 자금을 공급이 아니라 회수하므로 4·5의 한국어 라벨만
방향이 반대입니다 — enum명(AdapterBridgeExecuted·AdapterApplied)은 입금·상환 공통입니다.
SettlementStep — 정산 사이클 단계 (get_settlement.spoke_chains[].steps)
코드
enum명
한국어
의미
0
Queued
정산 대기
회차 배정됨, 아직 개시 전
1
SettleStarted
정산 개시
사이클 발동 (settle_started_tx)
2
CollectBridgeExecuted
NAV 수집 전달
허브 → 스포크 NAV 수집 지시 브릿지
3
NavReported
NAV 수집
스포크에서 NAV 산출·보고
4
ResponseBridgeExecuted
NAV 회신
스포크 → 허브 NAV 회신 브릿지
5
NavReceived
NAV 확정
허브에서 전 스포크 NAV 수신·집계 완료
6
RequestsApproved
승인 기록
워터폴·가격 확정 후 요청별 승인 기록 (steps에는 안 나옴 — get_request.settlement_id로 판단)
7
FinalizeBridgeExecuted
확정 반영 전달
허브 → 볼트 체인 정산 결과(분배) 브릿지
8
SettleApplied
확정 반영
볼트 체인에 share 발행·소각·지급액 전환 반영 (Receivable 전환)
9
Settled
정산 완료
사이클 전체 완료 (정산 레벨 상태 — 체인별 steps에는 안 나옴)
WhitelistStep — 화이트리스트 전파 (get_whitelist.steps)
코드
enum명
한국어
의미
1
WhitelistRequested
변경 접수
허브 정본에 grant/revoke 기록
2
BridgeExecuted
브릿지 전송
허브 → 스포크 전파 브릿지 (Spoke-vault만)
3
WhitelistApplied
반영 완료
스포크 전파본 반영 — 액션 종료
i브릿지 단계(코드 2·4·7 등)는 CCCP 롤백(Reverted)으로도 확정될 수 있습니다 —
settlementStatus().bridges·TimelineStep.failed가 성공/롤백 전체 시도를 노출합니다.
롤백 상태값은 CCCP SocketEventStatus(3 Executed · 4 Reverted)입니다.
피해야 할 표현
금지·제한
대신 쓸 것
이유
예치
입금(유저→상품) / 공급(상품→수익원)
방향이 다른 별개 행위
출금 (상환 의미)
상환(redeem) / 수령(receive)
withdraw는 어댑터 회수 용어와 충돌
셰어 · 지분 토큰
share (번역 금지)
ERC-4626/7540 공식 용어
브릿지 대기 중 (차단 상태로)
자금 공급 중 / 자금 회수 중
브릿징은 유저를 막는 단계가 아님
에폭
settlement 주기 / 정산 회차
epoch은 수익원 어댑터 로컬 용어
NAV (한정어 없이)
share 가격 (유저 뷰)
NAV는 층위 구분 필수
명사 자리의 settle
settlement 사이클·주기·가격
settle은 동사·함수 참조 전용
용어 계층 (디자이너 회의 기준)
계층
용도
용어
L1 공용어
회의·화면 라벨 — 설명 없이 통용
입금 · 상환 · 정산 · 수령 · 공급 · 회수 · 브릿징 + 상태 3개(정산 대기 · 수령 가능 · 수령 완료)
L2 도메인
첫 사용에 한 줄 설명
share · 트랜치/시니어/주니어 · settlement 가격 · 지급 예정액
L3 구현
기획·개발 문서 전용 — 화면 노출 금지
단계 코드 · escrow(라벨은 "잠금") · 워터폴 · 대기 제외 금액 · NAV 층위
iSDK의 라벨(statusLabel·stageLabel·activity().phase)은
전부 L1 표준어로 나갑니다 — 화면에 그대로 쓰면 표준 준수가 됩니다.
Getting Started › Process Stages & Terms
Process stages & terminology
What stages a deposit or redemption goes through from request to receive,
what each stage is called, and which SDK field surfaces it.
Deposit stages ↔ SDK
depositRequestRequesteduser tx
→
bridgingFunds movingauto · detail view
→
queuedAwaiting settlementauto · default
→
settlementSettledauto · amount fixed
→
shareReceivableReceivable
→
shareReceivedReceiveduser tx
Mapping: deposit() returns txHash/requestId → activity() carries the
bridging/supply timeline with per-step txHash (detail view only) → status 'processing'
displays as "awaiting settlement" with nextSettlementAt → 'receivable' +
confirmed amount → receive(). Redeem is symmetric; its payout wording defaults
to estimated payout (pricing-mode dependent).
Five rules that shape screens
No cancellation — cross-chain cancel is unsupported for both flows; say so in the
confirmation modal. The SDK has no cancel API.
One outstanding request per tranche × direction — disable the request button whenever
status !== 'none'.
Share tokens mint at receive time — display balance as wallet shares + receivable shares.
Pending amounts earn nothing yet — mark them "not yet deployed".
Qualify unconfirmed numbers as "estimated" — applies to all estimate*() output.
On-chain step reference (precompile enums)
The uint8 code and enum name the TxRegistry precompile assigns to each step. The SDK surfaces
both the Korean label (TimelineStep.label) and the enum name (TimelineStep.labelEn);
the enum name is the canonical id for cross-team communication (e.g. "CollectBridgeExecuted rolled back").
RequestStep
Code
Enum
Meaning
1
Requested
Request accepted (escrow + requestId)
2
RequestBridgeExecuted
Bridge from receiving chain to hub (Spoke-vault only)
3
RequestQueued
Recorded on hub ledger, round assigned
4
AdapterBridgeExecuted
Bridge to the yield adapter chain (remote chains only)
5
AdapterApplied
Supplied (deposit) / withdrawn (redeem) at the adapter
6
RequestCompleted
Funds reached hub and all required adapter chains
SettlementStep
Code
Enum
Meaning
0
Queued
Round assigned, not started
1
SettleStarted
Cycle started (settle_started_tx)
2
CollectBridgeExecuted
Hub → spoke NAV-collect bridge
3
NavReported
Spoke computes/reports NAV
4
ResponseBridgeExecuted
Spoke → hub NAV-response bridge
5
NavReceived
Hub received/aggregated all spoke NAVs
6
RequestsApproved
Per-request approvals recorded (not in steps — use get_request.settlement_id)
7
FinalizeBridgeExecuted
Hub → vault-chain distribution bridge
8
SettleApplied
Applied on vault chain (Receivable)
9
Settled
Whole cycle done (settlement-level, not per-chain)
WhitelistStep
Code
Enum
Meaning
1
WhitelistRequested
grant/revoke recorded on hub
2
BridgeExecuted
Hub → spoke propagation bridge (Spoke-vault only)
3
WhitelistApplied
Applied to spoke copy — action done
iBridge steps (codes 2, 4, 7…) may resolve to a CCCP rollback
(Reverted). settlementStatus().bridges and TimelineStep.failed expose the full
success/rollback attempt history (CCCP SocketEventStatus: 3 Executed · 4 Reverted).
iAll SDK labels (statusLabel ·
stageLabel · activity().phase) are emitted in the L1 standard vocabulary —
rendering them verbatim keeps your UI compliant.
데이터 API › overview()
overview() — 상품 페이지 데이터 단일 조회
상품 페이지에 필요한 전부: 트랜치 구성·이율·가격·TVL·정산 일정.
overview(): Promise<Overview>
파라미터 없음 · 지갑 불필요 · 실패 시 OmniFiError
반환 필드 — Overview 전체
필드
타입
의미 · null 조건 · 예시
productId
number
허브 원장의 상품 식별자 (uint64). 예: 0x0000000200000009 → 화면 뱃지는 seq #9
assetSymbol
string
기준 자산 심볼 — 모든 금액의 단위 라벨. 예: "USDC"
depositChains
number[]
입금 가능한 체인 ID 목록(중복 제거·우선순위 순). 예: [49088, 11155111]. 2개 이상이면 체인 셀렉터 노출
chains
ChainInfo[]
depositChains와 같은 순서의 체인 메타 — { chainId, label, nativeCurrency }. 셀렉터 라벨·가스 통화 안내에 그대로 사용
tranches[]
TrancheOverview[]
(트랜치 × 볼트 체인) 단위 배열 — 워터폴 우선순위 순(0번이 senior). 단일 체인 상품이면 2개
ChainInfo — chains[] 항목 필드
필드
타입
의미
chainId
number
체인 ID. 예: 49088(Bifrost)·11155111(Sepolia)
label
string
표시 이름 — 체인 셀렉터·뱃지에 그대로. 예: "Bifrost"
nativeCurrency
string
가스 통화 심볼 — INSUFFICIENT_GAS 문구에 사용. 예: Bifrost "BFC" · Sepolia "ETH"
rpcUrl
string | undefined
이 체인 조회·tx에 쓸 RPC. create({ chains })로 오버라이드 — 조회 응답엔 노출 안 됨(내부용)
ichains는 depositChains와 같은 순서입니다 —
depositChains[i]의 메타가 chains[i]. 셀렉터 라벨·가스 안내를 인덱스로 짝지어 쓸 수 있습니다.
체인 정의는 OMNIFI_CHAINS 레지스트리 정본이며 registerChains()로 확장합니다.
TrancheOverview — tranches[] 항목 필드
필드
타입
의미 · null 조건 · 예시
name
'senior' | 'junior'
트랜치 종류 — 화면 라벨·액션 파라미터로 그대로 사용
chainId
number
이 항목 볼트의 체인. 예: 11155111(Sepolia)
aprPercent
number | null
Senior 고정 이율(연 %). 예: 3 → "3.00% 고정". Junior는 null → "변동 — 잔여 수익"으로 표기
sharePrice
number | null
최근 정산 확정 share 가격(기준 자산/share). 1.0 = 원금 기준, 예: 1.000069. toFixed(6) 권장. 첫 정산 전이면 null
shareSymbol
string
share 토큰 심볼. 예: "oSR"
Overview — 나머지 필드
필드
타입
의미 · null 조건 · 예시
tvl
Amount | null
운용 총액(상품 NAV, 정산 확정치·기준 자산 단위). 첫 정산 전이면 null → "기록 없음". formatted는 소수 2자리 절사
No parameters · no wallet required · throws OmniFiError on failure
Return fields — full Overview
Field
Type
Meaning · null condition · example
productId
number
Hub ledger product identifier (uint64), e.g. 0x0000000200000009 — shown as seq #9
assetSymbol
string
Base-asset symbol — the unit label for every amount, e.g. "USDC"
depositChains
number[]
Chain IDs accepting deposits (deduped, priority order), e.g. [49088, 11155111]. Show a chain selector when > 1
chains
ChainInfo[]
Chain metadata aligned with depositChains — { chainId, label, nativeCurrency } for selector labels and gas guidance
tranches[]
TrancheOverview[]
(tranche × vault chain) entries in waterfall order — index 0 is senior
ChainInfo — chains[] item fields
Field
Type
Meaning
chainId
number
Chain ID, e.g. 49088 (Bifrost) / 11155111 (Sepolia)
label
string
Display name for selectors/badges, e.g. "Bifrost"
nativeCurrency
string
Gas currency symbol for INSUFFICIENT_GAS messages — "BFC" / "ETH"
rpcUrl
string | undefined
RPC for this chain's reads/txs; override via create({ chains }) — internal, not surfaced in responses
ichains is index-aligned with depositChains
(chains[i] describes depositChains[i]). Chain definitions live in the
OMNIFI_CHAINS registry; extend via registerChains().
TrancheOverview — tranches[] item fields
Field
Type
Meaning · null · example
name
'senior' | 'junior'
Tranche type — usable directly as an action parameter
chainId
number
Chain of this entry's vault, e.g. 11155111 (Sepolia)
aprPercent
number | null
Senior fixed APR (% p.a.), e.g. 3. null for Junior (variable/residual)
sharePrice
number | null
Latest settled share price (base asset per share); 1.0 = par, e.g. 1.000069. null before first settlement
shareSymbol
string
Share token symbol, e.g. "oSR"
Overview — remaining fields
Field
Type
Meaning · null · example
tvl
Amount | null
AUM (product NAV, as settled, in base asset). null before first settlement. formatted is floored to 2 dp
settlementRound
number
Latest settlement round; 0 = none yet
settledAt
Date | null
Record time of the latest settlement — always display next to prices/TVL
nextSettlementAt
Date
Next settlement ETA (cycle end); actual execution is bot-triggered and may lag minutes
orderCloseAt
Date
Order cutoff for this round — later requests roll to the next round
settlementPeriodMinutes
number
Cycle length in minutes, e.g. 60
⚠sharePrice is not a live quote —
render settledAt next to it.
Full 6-step timeline in fixed order; state: 'done' | 'current' | 'upcoming' — feed straight into a progress bar
amount
Amount | null
Requested amount while processing (asset for deposits, shares for redeems); receivable amount once receivable (shares for deposits, asset for redeems)
ActionState — status and stage
Progress comes in two forms: a coarse request status and a detailed process stage.
Drive the main widget from the request status only, and keep the process stage to detail views.
Using both in one view makes the displayed state inconsistent.
iBridging never blocks the user —
during processing the main label is always "awaiting settlement"; sub-stages belong to detail views.
steps[] carries the full sequence with
state: 'done' | 'current' | 'upcoming' per entry — feed it straight into a progress bar.
amount is the requested amount while processing and the receivable amount once receivable.
iJunior 표시용 APR (온체인 고정 이율이
없는 잔여 스프레드 트랜치): lastPeriodAprPercent(series) — 직전→현재 정산 NAV 변화만
1년 환산합니다. 표시 정책: 음수(구간 손실)면 +0.00%로 클램프. 전 구간 성장률 연환산은
realizedApyPercent, 연환산 없는 구간 수익률은 lastPeriodReturnPercent — 셋 다 export.
정산 2회 미만이면 null.
i재적재 시점: overview().settlementRound
변경 시에만 — 정산 사이에는 값이 변하지 않습니다.
결과 예시 — 테스트베드 라이브
live
[ …,
{ round: 8, at: 2026-08-19T15:02Z, senior: 1.000088, junior: 1.000000, tvl: 350.01 },
{ round: 9, at: 2026-08-20T03:33Z, senior: 1.000131, junior: 1.000000, tvl: 350.03 } ]
// 전부 number — 차트 라이브러리에 그대로. senior만 오르는 중 = 고정 이율 누적, junior는 수익원 미가동
Data API › priceHistory()
priceHistory() — chart data
Per-round finalized prices and TVL, all plain numbers.
priceHistory(): Promise<PricePoint[]>
Field
Type
Meaning · example
round
number
Settlement round — default X axis, e.g. 2
at
Date | null
Actual record time for tooltips/labels; null on legacy ledgers without timestamps
senior / junior
number
Finalized share prices, e.g. 1.0000171 / 0.9997577
tvl
number
AUM at that round in base-asset units, e.g. 1399.97
iDisplay APR for junior (no fixed on-chain rate —
residual spread): lastPeriodAprPercent(series) annualises only the latest settlement-to-settlement NAV change.
Display policy: clamp negatives (period loss) to +0.00%. Whole-series CAGR: realizedApyPercent;
non-annualised period return: lastPeriodReturnPercent — all three exported. null under two settlements.
iRefetch only when
overview().settlementRound changes.
확정 수령분 — 입금은 share, 상환은 기준 자산. 미승인이면 null → "정산 대기" 표기
round
number | null
확정(승인) 회차 — 내역 정렬 기준. 미승인이면 null
at
Date | null
확정 회차의 원장 기록 시각 — 날짜 표기 기준. 미승인이면 null
status
'pending' | 'approved'
대기/확정 뱃지
chainId
number
신청 볼트 체인 — 탐색기 링크 분기
withSteps 옵션 시 추가 필드
investmentHistory(user, { withSteps: true })일 때만 채워집니다 — 요청 처리 과정 타임라인.
필드
타입
화면에서
steps
TimelineStep[]
요청 처리 단계 (신청 완료 → 브릿징 → 허브 도착 …) — 단계별 tx·시각. TimelineStep 참조
adapterLegs
{ chainId: number, steps: TimelineStep[] }[]
체인별 수익원 leg (입금=공급 · 상환=회수) 진행
settlement
SettlementSection | null
배정 회차의 정산 사이클 — { round, settleStarted, chains }. 정산 개시 tx + 체인별 NAV 수집→확정 반영 단계 (settlementStatus와 동형)
receiveStep
TimelineStep
수령 단계 — 수령 이력에서 귀속. done이면 여정 100%(txHash = 실제 수령 tx), 매칭 시 phase도 '수령 완료'
phase
string | null
현재 국면 — 자금 공급 중 · 정산 대기 · 정산 진행 중 · 정산 확정 · 수령 가능 · 수령 완료
withSteps — 요청별 처리 과정 타임라인
{ withSteps: true }를 주면 각 이력에 TxRegistry의 과정 기록이 합쳐집니다 —
steps[](신청 완료→브릿징→허브 도착→…, 단계별 txHash·chainId·허브 기록 시각
at), adapterLegs[](체인별 수익원 전달), phase. 레코더 가동 전에 처리된
요청은 빈 배열입니다. 과거 입금·상환의 전 과정을 시간대별 tx와 함께 보여주는 화면이 이 옵션 하나로 끝납니다.
수령(receive) tx 이력 — 최신순. 수령은 요청과 1:1로 묶이지 않는 풀링 구조라 별도 조회입니다
(표시 목적이라면 withSteps의 receiveStep 귀속으로 충분한 경우가 많습니다).
필드
타입
화면에서
txHash · chainId
Hex · number
수령 tx — 탐색기 링크
tranche · kind
TrancheName · RequestKind
어느 트랜치의 입금분/상환분 수령인지
amount
Amount
수령분 — 입금 수령은 share, 상환 수령은 기준 자산
receiver
Address
실제 수취 주소 — 요청자와 다를 수 있음(수령처 지정)
at
Date | null
허브 기록 시각
정산 사이클 · 수령 기록까지 — 전 과정 공개
withSteps 결과의 settlement 필드가 배정 회차의 정산 사이클 전 과정을 담습니다 —
정산 개시(trigger tx) → 체인별 NAV 수집 전달 → NAV 수집 → NAV 회신 → NAV 확정 → 확정 반영 → 정산 완료,
단계마다 tx·허브 기록 시각. 유저가 "정산 대기"에서 "정산 확정"으로 넘어가는 동안 시스템이 실제로 무엇을 했는지
하나하나 검증할 수 있습니다. 수령(receive) tx는 receiveHistory(user)로 별도 조회 —
{ txHash, tranche, chainId, receiver, amount, kind, at } (요청과 1:1로 안 묶이는 풀링 수령이라 분리).
데이터 원천
허브 Investments 원장을 requestId(seq) 순회로 재구성합니다 — 이벤트·인덱서·TxRegistry를 쓰지 않아
어떤 환경에서도 동작합니다.
⚠신청 "제출 시각"은 팔렛에 저장되지 않아
확정 회차 시각(at)으로 대표합니다. 지갑 간 share 이전(transfer)은 원장 요청이 아니라
내역에 나오지 않습니다.
i갱신 주기: overview().settlementRound
변경 시에만 재적재 (폴링 전략).
Newest first. Each entry: kind (deposit/redeem), tranche,
amount (requested — asset for deposits, shares for redeems),
received (confirmed — shares for deposits, asset for redeems; null while pending),
round/at (settlement round and its ledger time), status.
⚠Request submission time is not stored
on-chain — the settlement round's time stands in. Wallet-to-wallet share transfers are not
ledger requests and do not appear here.
Accrues per-round held shares × settled-price change into period buckets — holdings are
reconstructed from investmentHistory(). Each point: period label,
profit (base asset), returnPct (vs period-start value; null when
starting from zero), startValue/endValue, byTranche breakdown.
P&L is realized (settled prices only).
⚠Wallet-to-wallet share transfers are not ledger
requests and are excluded from P&L.
iReload only when
overview().settlementRound changes.
Example result — live testbed
live
[{
period: '2026-08',
from: 2026-08-18T13:19Z, to: 2026-08-20T03:33Z,
profit: { formatted: '0.0005', symbol: 'USDC' }, // senior yield on 200 USDC held for a few hours
returnPct: null, // zero holding at period start → mark as "new entry"
startValue: { formatted: '0' }, endValue: { formatted: '0' }, // fully redeemed within the period → ends at 0
byTranche: { senior: 0.000598, junior: 0 }
}]
데이터 API › allocation()
allocation() — 포트폴리오 구성
상품의 자금이 체인별·수익원별로 어떤 비중으로 배분되는지 반환합니다. 구성 차트의 데이터 소스입니다.
allocation(): Promise<AllocationInfo>
필드
타입
화면에서
chains[]
{ chainId, label, weightPercent, sources[] }
체인별 배분 비중 도넛/바 차트 — sources는 체인 내 수익원별 서브 비중(onchain/offchain 구분)
How the product allocates capital across chains and yield sources — for composition charts.
allocation(): Promise<AllocationInfo>
chains[] — per-chain weight (weightPercent) with nested per-source weights
(onchain/offchain). valuations/round — latest settled valuation snapshot
(see sourceValuations()); null before the first record.
데이터 API › basketHoldings()
basketHoldings() — 바스켓 구성 종목
바스켓형(ETF형) 상품의 구성 종목·현재가·평가액·목표 비중을 조회합니다.
시나리오 D(로빈후드 QQQ 미러링 8종목 바스켓) 전용 — 예치형 상품(A·B·C)은 빈 배열을 반환합니다.
Constituents, current prices, values and target weights for basket-type
(ETF-like) products. Scenario D (Robinhood QQQ-mirroring basket) only — deposit-type products (A·B·C) return an empty array.
Target weight %; derive the actual weight from valueUsd/total
iPoint-in-time snapshot. For time series use
basketPriceHistory(chainId) — since the v3 adapter, per-constituent priceUsd is recorded at
every settlement, so round-by-round price charts need no indexer.
데이터 API › custom flows
custom flow 조회 — 리워드 클레임 등
governance가 등록한 custom flow(예: 리워드 풀 클레임)의 진행/완료 타임라인을
조회합니다. 싱글체인·멀티체인 공통이며 조회는 전부 허브 프리컴파일
CustomFlows(0x…0204)입니다.
i진행중 UI가 필요한 다단계 flow는
flowDescriptor(기대치)와 flowInstance(실제 기록)를 대조합니다 — 기록 배열에
없는 슬롯은 "미도달"이 아니라 descriptor에 있는지로 구분합니다. 리워드 클레임(1-slot·즉시 close)은
closed만 보면 충분합니다.
Data API › custom flows
Custom flow reads — reward claims etc.
Timelines for governance-registered custom flows (e.g. reward-pool claims).
Same surface for single-chain and multichain products; every read hits the hub
CustomFlows(0x…0204) precompile.
Method
Returns
Use
flowDescriptor(flowId)
topology | null
Expected chains/slots; null if unregistered. Cacheable
activeFlows(user, flowId)
instance_key[]
In-flight list — instant-close flows (reward claim) never appear here
flowHistory(user, flowId, offset?, limit?)
{ instanceKeys, total }
Completed, most-recent first (limit ≤ 50 — reverts above)
flowInstance(flowId, instanceKey)
timeline | null
One execution's full timeline; null if absent
Reward-specific helpers (rewardClaims() etc.) live on the
Rewards page — this page covers the generic flow reads only.
flowId is a bytes16 slug — use the FLOW_IDS constants
(currently FLOW_IDS.rewardClaim). Absence is signalled by sentinels, never reverts
(unlike TxRegistry's get_request): unregistered descriptor → null,
missing instance → null, empty history → empty array. recorded_at is a
hub block number, not a timestamp — sort with it, but resolve display times via
tx_hash on the source chain.
데이터 API › 리워드
리워드 — 조회·클레임·이력
RewardPool 애드온이 배선된 상품(현재 시나리오 B)의 보너스 이자.
예치 자산과 다른 통화일 수 있습니다 — B는 JPYC 예치·USDC 리워드.
적립은 정산·유저 tx마다 자동(harvest), 수령은 유저가 직접 클레임합니다.
메서드 3종 (TrancheSDK · 싱글체인)
메서드
반환
용도
rewardSupported()
{ symbol, decimals } | null
이 상품의 리워드 애드온 지원 여부 — 지갑 불필요·캐시. 카드 골격을 즉시 그릴 때
rewardClaimable(user)
{ raw, formatted, symbol, decimals } | null
지금 클레임하면 받는 값 — 동기화된 claimable + 미동기(pending)분 합산. 미지원 상품은 null
claimReward(tranche?)
Hash
클레임 실행 (유저 tx — vault.claimReward). 수령액 0이면 revert
rewardClaims(user, { offset?, limit? })
{ total, claims[] }
클레임 이력 — custom flows(0x…0204) 기록. amount(slot 0 디코딩)·txHash·시각(at)
i클레임 이력의 저수준 원본은
custom flows의 reward-claim flow — rewardClaims()는
그 위의 디코딩 편의 계층입니다.
Data API › Rewards
Rewards — balance, claim, history
Bonus yield for products with the RewardPool add-on (currently scenario B).
The reward asset can differ from the deposit asset — B deposits JPYC and rewards USDC.
Method
Returns
Use
rewardSupported()
meta | null
Does this product have the add-on — no wallet needed, cached
rewardClaimable(user)
amount | null
What a claim would pay right now — synced claimable + un-synced pending
claimReward(tranche?)
Hash
Execute the claim (user tx); reverts on zero
rewardClaims(user, opts?)
{ total, claims[] }
Claim history from custom flows — amount, txHash, timestamp
Rewards accrue only while holding shares across harvest ticks. On-chain
claimable is lazily synced — the SDK adds the pending portion (lane delta × share value).
profitHistory() attaches per-period claimed rewards as a separate rewards field
(different currency — never summed into profit).
데이터 API › 수익원
수익원 — 어느 프로토콜에 얼마씩
상품이 지금 어느 수익원 프로토콜에 자금을 배치 중인지와 어댑터별 배분을 반환합니다.
각 어댑터의 name()(프로토콜 식별자)·평가액·비중을 한 번에 — 상품 상세의 "구성 수익원" 표에 그대로 씁니다.
Each entry: chainId/adapter, principal (base asset),
totalUsd (NAV-counted sum), positions[] (per-asset amount, USD price,
counted — false for pre-swap reward tokens). Defaults to the latest round;
null when not recorded.
데이터 API › whitelistStatus()
whitelistStatus() — 참여 자격 · 전파 진행
유저가 어느 볼트에 등록돼 있는지, 최근 등록/해제가 어디까지 전파됐는지 — 온보딩·운영 화면용입니다.
whitelistStatus(user): Promise<WhitelistState>
반환 필드 — WhitelistState
필드
타입
의미
allRegistered
boolean
전 볼트 등록 완료 여부 — canInvest와 동일 판정. false면 온보딩 안내
vaults
VaultWhitelist[]
볼트(트랜치 × 체인) 단위 항목 — overview().tranches와 같은 순서
VaultWhitelist — vaults[] 항목 필드
필드
타입
의미 · null 조건
tranche
'senior' | 'junior'
트랜치 종류
chainId
number
이 볼트의 체인. 예: 11155111(Sepolia)
registered
boolean
허브 정본(is_tranche_investor) 등록 여부 — 부분 등록 진단
action
WhitelistAction | null
최근 grant/revoke의 전파 진행. 기록 없으면 null
WhitelistAction — action 필드
필드
타입
의미
kind
'grant' | 'revoke'
등록 / 해제
applied
boolean
스포크 전파까지 완료됐는지 (반영 완료 단계 도달)
steps
TimelineStep[]
전파 파이프라인 — 변경 접수 → 브릿지 전송 → 반영 완료. 단계별 tx·허브 기록 시각(TimelineStep 참조)
i부분 등록(일부 볼트만 grant됨)을 잡아내는 게 핵심 용도 —
예: 4볼트 중 3개만 등록된 유저는 나머지 볼트 입금에서 NOT_WHITELISTED가 됩니다.
운영자는 이 화면으로 어느 볼트의 grant가 누락/전파 중인지 즉시 확인합니다.
승인된 요청이 없는 정기 회차는 확정 반영(분배) 단계가 steps에 아예 없습니다 —
분배할 결과가 없어 브릿지가 발신되지 않은 것으로, 미도달·실패가 아닙니다 (노드 규칙: "배열에 항목 없음 = 해당 없음").
화면에는 "NAV만 갱신한 정기 정산" 안내를 병기하는 것을 권장합니다.
i과거 회차 전체를 훑으려면 settlementStatus를
1..overview().settlementRound로 순회하면 됩니다 — 미개시 회차 포함 전부 안전. 갱신은
진행 중(Triggered) 회차만 10초 폴링, 완료 회차는 불변입니다.
Data API › settlementStatus()
settlementStatus() — per-round cross-chain record
One round number → the full processing record: trigger tx, per-chain steps
(NAV collect → finalize), and the complete bridge-attempt history (successes and rollbacks).
Safe for any round — untriggered rounds return status 'Queued' without reverting.
Fields: status/statusLabel (badge), trigger, chains[].steps
(per-step tx/time/failed), progress, bridges[].legs[].attempts
(ordered success/rollback history — the failures the steps array hides). Rounds with no approved
requests have no finalize step at all (nothing to distribute — absent, not failed).
Price/NAV series per round live in priceHistory(); poll only
Triggered rounds — settled ones are immutable.
await omnifi.estimateDeposit('senior', '100')
{ formatted: '99.993', symbol: 'oSR', raw: 99993000000000000000n, decimals: 18 }
// 100 USDC 입금 시 받을 예상 share — 직전 정산가(≈1.00007) 기준
await omnifi.estimateRedeem('senior', '100')
{ formatted: '100.0069', symbol: 'USDC', … }
// share 100 상환 시 지급 예정액 — 첫 정산 전이면 두 함수 모두 null
Data API › estimateDeposit / estimateRedeem
Estimates — estimateDeposit / estimateRedeem
Live "you will receive ≈" hints while typing, based on the latest settled price.
iMulti-vault products: when
overview().depositChains has more than one entry, pass opts.chainId to pick
the deposit chain — fallback order is opts.chainId → create({ defaultChainId }) →
the product's first chain (deterministic). A chain the product doesn't serve throws CHAIN_NOT_SUPPORTED.
redeem, receive and estimate* accept the same option.
Wallet connected → NOT_CONNECTED
Parse amount → INVALID_AMOUNT
Balance check → INSUFFICIENT_BALANCE
Whitelist check → NOT_WHITELISTED
Auto-switch to the spoke chain (Sepolia)
Approve first if needed (waits for confirmation)
Send request tx → wait for receipt → extract requestId
At most two wallet signatures; one if already approved.
try {
await omnifi.deposit('senior', input)
} catch (e) {
if (e instanceof OmniFiError) {
if (e.code === 'NOT_WHITELISTED') returngoOnboarding()
if (e.code === 'USER_REJECTED') returntoast(e.userMessage) // 기본 처리는 이 한 줄로 충분
}
}
코드 전체 표
e.code
발생 시점
화면 대응
NOT_CONNECTED
지갑 미연결
지갑 연결 유도
INVALID_AMOUNT
금액 파싱 불가/0
입력 검증 표시
INSUFFICIENT_BALANCE
잔액 부족
userMessage 표시
NOT_WHITELISTED
투자 자격 없음
온보딩으로 유도
NOTHING_TO_RECEIVE
수령 가능분 없음
버튼 상태 갱신
USER_REJECTED
지갑에서 거절
무시 권장
INSUFFICIENT_GAS
수수료(가스) 부족
가스 안내 — 문구가 체인별 통화(BFC/ETH)로 자동 생성
CHAIN_NOT_SUPPORTED
상품에 없는 체인 지정
overview().depositChains 확인 유도
PRODUCT_NOT_FOUND
허브 팔렛에 상품 미등록
운영 안내(재등록 대기)
RPC_UNAVAILABLE
노드 무응답
재시도 버튼
TX_FAILED
그 외 온체인 실패
userMessage 표시
⚠e.cause(원본 오류)는 콘솔·모니터링
전용입니다 — 유저 화면에 노출하지 않습니다.
Guides › Error Handling
Error handling — eleven codes and their UI responses
Everything a catch block needs.
e.code
When
UI response
NOT_CONNECTED
No wallet connected
Prompt connection
INVALID_AMOUNT
Unparseable/zero amount
Input validation
INSUFFICIENT_BALANCE
Balance too low
Show userMessage
NOT_WHITELISTED
Not eligible
Route to onboarding
NOTHING_TO_RECEIVE
Nothing receivable
Refresh button state
USER_REJECTED
Rejected in wallet
Usually ignore
INSUFFICIENT_GAS
Not enough gas funds
Gas guidance — message auto-names the chain's currency (BFC/ETH)
CHAIN_NOT_SUPPORTED
Chain not served by product
Point to overview().depositChains
PRODUCT_NOT_FOUND
Product missing on hub pallet
Ops notice (await re-registration)
RPC_UNAVAILABLE
Node unreachable
Retry button
TX_FAILED
Other on-chain failure
Show userMessage
⚠e.cause is for consoles and monitoring
only. Locale: userMessage defaults to Korean — switch with create({ locale: 'en' })
or setOmniFiLocale('en'), or read a specific language via e.getMessage('en').
가이드 › 폴링 전략
갱신(폴링) 전략
크로스체인 특성상 이벤트 구독보다 폴링이 단순하며 충분합니다. SDK가 내부적으로
호출을 배칭(스포크 multicall · 허브 JSON-RPC 배치)하므로 폴링 비용은 왕복 수 회 수준입니다.
대상
주기
이유
myAccount · activity
10~15초
진행 단계 전환 감지에 충분 (브릿징·전파는 분 단위)
overview
폴링에 포함 가능
가볍고 nextSettlementAt 카운트다운의 근거
priceHistory
settlementRound 변경 시
정산 사이에는 불변
액션 성공 직후 즉시 1회 갱신 — 체감 반응성은 이것으로 확보됩니다.
폴링 실패는 다음 주기에 회복 — 화면을 비우지 않습니다.
Guides › Polling Strategy
Polling strategy
Polling beats event subscriptions on simplicity here — and the SDK batches calls
internally (multicall on the spoke, JSON-RPC batching on the hub), so a poll costs a few round-trips.
Target
Interval
Why
myAccount · activity
10–15 s
Stage transitions are minutes-scale
overview
May ride the same poll
Cheap; backs the countdown
priceHistory
On settlementRound change
Immutable between settlements
참고 › FAQ
FAQ · 트러블슈팅
연동 과정에서 자주 발생하는 질문과 해결 방법입니다.
신청 후 수령 버튼이 표시되지 않습니다
정상 동작입니다. 신청 → 수령 가능 전환은 다음 정산이 완료되어야 이루어집니다.
예정 시각은 overview().nextSettlementAt이며, 그 사이 상태는
processing + stageLabel로 진행이 표시됩니다.
orderCloseAt 이후의 신청은 한 회차 뒤로 배정됩니다.
estimateDeposit이 null을 반환합니다
상품의 첫 정산 전이라 기준 가격이 없는 상태입니다. "정산 후 확정"으로 표기하고 입력은 차단하지 않습니다.
deposit이 NOT_WHITELISTED 오류를 반환합니다
해당 지갑이 상품 화이트리스트에 등록되지 않은 상태입니다. 온보딩(KYC) 흐름으로 안내하며,
등록은 운영자가 수행합니다. myAccount().canInvest로 사전 판별이 가능합니다.
tx가 INSUFFICIENT_GAS로 실패합니다
신청·수령 tx는 Sepolia에서 실행되므로 소량의 Sepolia ETH가 필요합니다.
퍼블릭 파우셋에서 수급할 수 있습니다. (가스 대납은 로드맵 항목입니다)
모든 조회가 RPC_UNAVAILABLE을 반환합니다
허브 노드(테스트베드, 사내망) 연결 문제일 가능성이 높습니다 — 퍼블릭 Bifrost 노드에는
프리컴파일이 없어 대체가 불가합니다. VPN 연결과 노드 상태를 확인하고, 주소가 변경된 경우
create({ hubRpcUrl })로 지정합니다.
⚠테스트넷 전용 기능입니다 —
메인넷에는 파우셋이 존재하지 않으며, 프로덕션 화면에 노출하면 안 됩니다.
과거 이력(완료된 요청·수령 기록) 조회 방법
고수준 API는 진행 중(activity)만 다룹니다. 완료 이력은 로우레벨
omnifi.inner.requestHistory() / receiveHistory()(페이지네이션,
페이지당 최대 50건)로 조회합니다.
Reference › FAQ
FAQ · Troubleshooting
Common questions during integration.
The receive button doesn't appear after a request
Expected — requests become receivable only after the next settlement completes
(overview().nextSettlementAt). Requests after orderCloseAt roll one round later.
estimateDeposit returns null
No settlement has run yet, so there is no reference price. Show "finalized after settlement".
deposit throws NOT_WHITELISTED
The wallet is not whitelisted. Route to onboarding; detect beforehand with myAccount().canInvest.
Transactions fail with INSUFFICIENT_GAS
User txs run on Sepolia and need a little Sepolia ETH. (Gas sponsorship is on the roadmap.)
Self-service via faucet() — a UniversalFaucet deployed per chain dispenses the
deposit asset (max 10,000 per claim, 1-hour cooldown per address). Multichain:
omnifi.faucet(chainId); single-chain: sdk.faucet(). See faucet().
⚠Testnet-only. No faucet exists on
mainnet — never expose this in production UI.
Reading completed history
Use the low-level omnifi.inner.requestHistory() / receiveHistory() (paginated, max 50).
참고 › 용어집
용어집
화면 문구와 커뮤니케이션에 사용하는 표준어입니다. 사내 용어 정본과 정합합니다.
용어
영문
정의
트랜치
tranche
한 상품 안의 위험·수익 층 (Senior/Junior)
share
share
투자 지분 토큰 — 번역하지 않음 ("보유 지분 단위" 설명 병기)
입금
deposit
유저 → 상품으로 자산을 넣는 신청 ("예치" 사용 금지)
상환
redeem
share를 자산으로 되돌리는 신청 ("출금" 사용 금지)
수령
receive
확정된 share/자산을 지갑으로 가져오는 마지막 유저 액션
정산
settlement
주기적으로 가격을 확정하고 신청을 일괄 처리하는 사이클
정산 회차
settlementRound
정산의 순번 (#1, #2 …)
신청 마감
orderCloseAt
해당 회차에 포함되는 신청의 마감 시각
수령 가능
receivable
정산 확정 후 수령만 남은 상태
TVL / 상품 NAV
productNav
상품 운용 자산 전체의 정산 확정 평가액
i금칙어: "예치"(입금/공급 혼동), "출금"(상환/수령 혼동),
한정어 없는 "NAV". 유저 대상 문구는 위 표준어만 사용합니다.
Reference › Glossary
Glossary
Standard vocabulary for UI copy, aligned with the internal terminology spec.
Term
Definition
tranche
A risk/return layer within one product (Senior/Junior)
share
The investment unit token
deposit
User → product asset request
redeem
Share → asset request
receive
The final user action: claiming finalized shares/assets
settlement
The periodic cycle that finalizes prices and processes requests in batch
SDK는 조회를 내부적으로 묶어 전송합니다 — 스포크는 Multicall3 집계 + JSON-RPC HTTP 배치,
허브는 JSON-RPC HTTP 배치(테스트베드 체인에 Multicall3 미배포). 소비자 코드는 변경 없이
Promise.all로 병렬 호출하면 자동으로 묶입니다.
로우레벨 사용 예
ts
// 완료 포함 요청 이력 (페이지네이션 ≤50)const { requestIds, total } = await omnifi.inner.requestHistory(user, 0, 20)
// 정산 사이클의 체인별 진행 (운영 뷰)const sp = await omnifi.inner.settlementProgress(2)
Reference › Architecture
Architecture and low-level access
What sits under the facade, and how to reach it.
Precompile
Address
Question it answers
TrancheSystem
0x0000000000000000000000000000000000000200
How is the product configured (4 views)
Investments
0x0000000000000000000000000000000000000201
What was finalized (9 views)
TranchePermissions
0x0000000000000000000000000000000000000202
Is this wallet eligible
TxRegistry
0x0000000000000000000000000000000000000203
How far has it progressed (6 views)
CustomFlows
0x0000000000000000000000000000000000000204
Where a custom flow (e.g. reward claim) stands (4 views)
The facade's activity()/phase combine Investments ("results") with
TxRegistry ("progress"). The spoke (Sepolia) is the ERC-7540 vault standard — the source of truth
for balances and receivables.
Call batching
Reads are batched internally — Multicall3 aggregation plus JSON-RPC HTTP batching on the spoke,
JSON-RPC HTTP batching on the hub (no Multicall3 on the testbed chain). Consumer code just uses
Promise.all; batching is automatic.