Executed on arrival
A Deposit instruction places the USDC into a SEP-56 vault in the same transaction that delivers it. No second step, and no USDC trustline — vault shares live in the vault.
Circle’s CCTP delivers native USDC to Stellar but does not execute hooks. Skyhook reads the payload it leaves behind and runs the instruction inside it.
Circle already carries USDC to Stellar. What it does not do is run the instruction a sender attaches — so the money arrives, and then nothing happens. Skyhook is that missing step.
Someone burns USDC through CCTP. Every transfer recorded in this project came from Arc Testnet; CCTP supports the rest, and Skyhook never asks which chain a message came from.
Burns on the source chain, attests, and mints native USDC on Stellar. This is where it has always stopped — the forwarder credits the recipient and never invokes it.

Reads the instruction Circle leaves in the trailing payload and runs it, inside the same transaction that delivered the funds. This is the piece that did not exist.
A vault deployed on Stellar, holding the position the recipient now owns. The USDC arrives already deposited, and the address travels in the instruction, so any conforming vault works.
A Deposit instruction places the USDC into a SEP-56 vault in the same transaction that delivers it. No second step, and no USDC trustline — vault shares live in the vault.
A recipient who cannot yet receive would normally make the whole transfer fail. The funds route to Hold instead and stay claimable, with the fee paid by a sponsor.
If Hold fails too, the funds stay in the contract marked unresolved. That last step performs no transfer and no external call — only a storage write, so it cannot fail.
The registry is permissionless and append-only. An instruction names its own handler, and an id once bound can never be pointed somewhere else.
No admin key, no whitelist, no upgrade path. Skyhook adds nobody to trust, and inherits exactly the trust the CCTP deployment already requires.
The relayer holds no funds and takes no custody; it pays for one invocation. Run your own, or rely on someone else running theirs.
Point a Deposit instruction at any SEP-56 vault and the USDC lands as a position the recipient holds — no second transaction, and no USDC trustline, because vault shares live in the vault’s own storage. The vault address travels in the instruction, so switching to a different one is a change of parameter, not of code.
Every address below resolves on a public explorer. Testnet only, and not audited.