§ 0 · Overview
One stock.
Two chains, one receipt.
HoodBridge moves SKHY — a tokenised debt security issued by Robinhood Assets (Jersey) that tracks SK hynix ADS — between Robinhood Chain and BNB Chain. The original never leaves Robinhood Chain: it is locked in a lockbox, and a 1:1 receipt token (rSKHY) is minted on BNB Chain against it. Send it back and the receipt is burned before the original is released. The backing always exists before the receipt does.
§ 1 · Architecture
Three parts, one loop
The lockbox holds the original. Three independent verifiers attest each message and LayerZero's executor delivers it. The receipt contract mints and burns the mirror. Nothing else sits in the path of a crossing.
System diagram
§ 2 · Chains & routes
Robinhood Chain is the hub
Robinhood Stock Tokens live on Robinhood Chain, so it holds the lockbox. BNB Chain is the destination that receives the receipt. One asset, one route, both directions.
| Chain | Class | Standard | Status |
|---|---|---|---|
| EVM L3 · Arbitrum Orbit · id 4663 | ERC-20 + ERC-8056 | Hub · live | |
| EVM L1 · id 56 | BEP-20 receipt + ERC-8056 | Live |
LayerZero endpoint ids: 30416 (Robinhood Chain), 30102 (BNB Chain). Contracts are deployed per ticker; an unsupported pair is rejected at the contract, not queued.
§ 3 · The mechanism
The lockbox
The lockbox (RhStockOFTAdapter) sits on Robinhood Chain and does two things: it escrows SKHY on the way out and releases it against a verified message on the way back. Its ledger is public — locked(), outstanding(), isSolvent() — so anyone can check backing at any block.
freezeOnShortfall(); redemptions then pay pro rata and the UI discloses the haircut before you sign.The verifiers
Every crossing is a LayerZero message. Three independent verifiers (DVNs) — LayerZero Labs, Nethermind and Horizen — watch the source chain, wait for the configured block confirmations, and each attest the message. Only when all three agree is the message committed on the destination; the executor then delivers it.
The receipt token
On BNB Chain the receipt contract (StockOFT) issues rSKHY against a verified lock message and burns it when a holder bridges back. It is the only contract that can change rSKHY supply, and it can only do so through the LayerZero endpoint. It mirrors the ERC-8056 share multiplier from Robinhood Chain and the issuer's compliance blocklist, so 1 rSKHY always redeems for 1 SKHY whatever corporate actions do to the share count.
§ 4 · Crossings
Outbound: lock & mint
Moving SKHY from Robinhood Chain to BNB Chain. Four steps, in this order, every time.
Inbound: burn & release
Coming back, the receipt is destroyed before the backing is freed.
§ 5 · Finality & timing
Where the seconds go
A crossing waits for the source chain to reach the verifiers' confirmation depth, then for three attestations, then for the executor. The Overview stat above is the median measured across every delivered transfer on this bridge, not a target.
If the destination leg cannot execute yet (paused, halted, rate-limited), the message is stored and retryable indefinitely — funds are safe and nothing needs resending. The UI tracks each stage from LayerZero Scan.
§ 6 · Reference
Interface
Both sides expose the LayerZero OFT surface. Deposit and redeem are the same call on different chains; there is no separate deposit or withdraw.
// the crossing — identical on both chains function send(SendParam calldata, MessagingFee calldata, address refundAddress) payable returns (MessagingReceipt, OFTReceipt); // what it costs and what arrives function quoteSend(SendParam calldata, bool payInLzToken) view returns (MessagingFee); function quoteOFT(SendParam calldata) view returns (OFTLimit, OFTFeeDetail[], OFTReceipt); // capacity for this direction, rolling 24h function getAmountCanBeSent(uint32 dstEid) view returns (uint256 inFlight, uint256 canBeSent); // the reads that prove backing at any block (lockbox only) function locked() view returns (uint256); function outstanding() view returns (uint256); function isSolvent() view returns (bool); function feeBps() view returns (uint16); // capped by MAX_FEE_BPS = 100 // ERC-8056, on both tokens function uiMultiplier() view returns (uint256); function balanceOfUI(address) view returns (uint256);
Addresses: lockbox 0xcEaC580F2356d0DE359d17DF7254F35c3842f6C0 · receipt 0x4790E23342709d853c309051ED4f58a8Dd6DcbF0 · LayerZero endpoints 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B / 0x1a44076050125825900e736c501f859c50fE728c.
On-chain events
Every step announces itself, so a crossing can be audited end to end from chain data alone.
| Event | Meaning | Emitted on |
|---|---|---|
OFTSent(guid, dstEid, from, amountSentLD, amountReceivedLD) | Tokens locked (Robinhood) or burned (BNB); the GUID identifies the message on both chains | Source chain |
OFTReceived(guid, srcEid, to, amountReceivedLD) | Receipt minted (BNB) or stock unlocked (Robinhood) for that GUID | Destination chain |
ShortfallDetected(held, outstanding, haircutBps) / ShortfallCleared | Lockbox backing fell below receipts, or recovered; redemptions pay pro rata while frozen | Robinhood Chain |
EntryPauseSet(paused, by) / ExitHaltSet(halted) | Guardian paused deposits; owner halted redemptions (timelocked) | Robinhood Chain |
BlockedSet(account, blocked) | Compliance officer changed the wrapper's blocklist | BNB Chain |
UIMultiplierUpdated(old, new, effectiveAt) | Corporate action changed the ERC-8056 share multiplier; the relay mirrors it | Both chains |
Limits & risk
- Crossing time depends on verifier confirmations and executor delivery; the median is measured and shown, never promised.
- Net flow is rate-limited to 10% of source supply per 24 hours in each direction.
- The bridge fee cannot exceed 1% (the current value is read live in the Overview); it is taken from the amount credited at the destination and always shown before you sign.
- rSKHY inherits the issuer's terms: Robinhood Assets (Jersey) can pause SKHY, blocklist addresses (including the lockbox), and burn balances. Those powers sit outside this bridge; the UI reads them live and blocks the button rather than letting a transfer strand.
- One asset, one route. A second ticker means a second pair of contracts.
Ready to bridge?
Connect a wallet on Robinhood Chain with SKHY and a little ETH for the fee.