Getting started
For a trader or LP
- Open the app from the landing page. Before launch it runs in preview on mainnet data: you can see markets, quotes, caps and halt state, and every transaction button reads "Opens at launch".
- Hold a wallet that the issuer has allowlisted. For FWDI and GLXY that means onboarding with Superstate; the mint keeps every token account frozen until Superstate's transfer agent thaws it.
- Ask the venue to admit the same wallet. Admission is a
Participantrecord created by the venue authority. - Trade a stock against USDC, or deposit both sides to earn the LP share of fees.
For a developer, on a local validator
The real FWDI and GLXY mints keep every account frozen until Superstate thaws it, so local tests use mock Token-2022 mints with a stand-in gate: a transfer hook (allowlist_hook) that only lets allowed wallets move tokens.
# toolchain: Anchor 0.31.1, agave cargo-build-sbf
cd engine
anchor build
# start your own validator on a free port, load the four programs and the hook
solana-test-validator --reset --rpc-port 18899 \
--bpf-program 3vkpdUbzcQ7p5Ak36kjcfmWmgpuH3syswtwa5CGina8j target/deploy/floor_venue.so \
--bpf-program hZWUysrRYBmuindfRrE78rKuwG7iqQwKm5c9ZpAqk7o target/deploy/floor_halt.so \
--bpf-program riN4V5uUokJ2GqBVtbfnHpwUKmvCQv3A2Ygt7kNYmxN target/deploy/floor_caps.so \
--bpf-program 4MLRiWbL48QgrZivaHp1RzZPTPGLNDU9zqNHnbFxBuKr target/deploy/floor_notice.so \
--bpf-program 6MsQwMt2jB1yH9PY5E3s7bGVqot5Zc4NpaYt2pKRT96g target/deploy/allowlist_hook.so
cargo test -p harness
The harness tests cover access, caps, halts, notices, the full lifecycle, fuzzed solvency and compute units.
Setup order on a fresh chain
floor_notice::initialize(authority)
floor_halt::initialize(authority, keepers, threshold)
floor_caps::initialize(authority, recorder = venue PDA, keepers, threshold)
floor_venue::initialize(authority, fee_recipient, fee_bps, venue_share_bps)
floor_venue::register_quote(USDC, PaymentStablecoin)
floor_notice::file_notice(FWDI mint, issuer_sponsored = true, 0)
floor_caps::list_symbol("FWDI", tier = 1, decimals = 6)
floor_caps::post_adv("FWDI", prior month, adv_shares) # by keepers, to threshold
floor_halt::open_symbol("FWDI")
floor_venue::create_pool("FWDI")
floor_venue::admit(wallet)
The venue PDA is find_program_address(["venue"], floor_venue); it must be the caps recorder, or every swap fails with Recorder.
Running the site
cd web
node node_modules/next/dist/bin/next dev -p 4300
Set SOLANA_RPC_URL to a keyed provider for /api/rpc, NEXT_PUBLIC_SITE_URL to the public origin, and NEXT_PUBLIC_LAUNCHED=1 only when the venue opens.