Skip to main content
Goaly is a layered protocol on Arbitrum One (chainId 42161). A thin prediction layer sits on top of an ERC-4626 yield vault, which spreads principal across pluggable strategies. Settlement and cross-chain surplus each live in their own contract. Everything below is deployed and verified on Arbiscan.

Contracts

The stake token is USD₮0 — Tether’s omnichain USDT on Arbitrum (the app labels it “USDT” to users). Players always stake and withdraw USD₮0; internally the yield may be earned in USD₮0 or USDC.
  • GoalyMarkets — the no-loss prediction layer. Players predict(marketId, outcome, amount) staking USD₮0; every stake is deposited into GoalyVault to earn yield. Winners split a prize funded purely by that yield, and claim(marketId) returns the stake plus any prize — always in USD₮0. The protocol fee is taken from the prize only, never from the principal.
  • GoalyVault — an ERC-4626 (UUPS) vault that pools principal and allocates it across whitelisted strategies while keeping a liquidity buffer for on-demand claims.
  • MorphoStrategy — a same-asset strategy that routes USD₮0 into a Morpho USD₮0 vault.
  • MorphoSwapStrategy — a cross-asset strategy that swaps USD₮0 ↔ USDC so the vault can also earn in USDC Morpho vaults.
  • GoalySettlement — an optimistic settlement oracle. Results are proposed with a bond, finalize after a dispute window if unchallenged, and escalate to governance if disputed — replacing a single trusted oracle key.
  • ReserveManager — bridges surplus only (prize funds, never principal) cross-chain as USDC via Circle CCTP (Wormhole-relayed). Principal never leaves Arbitrum.
  • AllocationLib — an external delegatecall library holding the vault’s allocation logic, which keeps the vault under 24 KB without the optimizer.

What a player calls

Two functions cover the whole player flow, both on GoalyMarkets:

No-loss is an on-chain invariant

The vault only ever earns, so principal is always redeemable 1:1. That guarantee isn’t a policy — it’s enforced on-chain by GoalyMarkets.isSolvent():
Because a stake can never be worth less than it was deposited, a wrong prediction can only ever cost you the yield you would have won — never your principal.

Roles

Access follows least privilege. The protocol is UUPS-upgradeable, uses ERC-7201 namespaced storage, and is compiled without the optimizer for plain, auditable bytecode. Source and tests (Foundry — 19 tests including a fuzzed no-loss invariant) live in the Goaly-Protocol/contracts repo.