Gaslt

Il manuale — documentation

The protocol, briefly.

Gaslt turns the Napoletano caffè sospeso into Solana gas abstraction. A sponsor pre-pays gas into an on-chain escrow; a relayer signs as fee-payer so a newcomer transacts with zero SOL; the escrow reconciles the cost on-chain.

On-chain program (live on devnet)

sospeso_verifier (Anchor) holds the escrow and the claim accounting. Deployed and verified on Solana devnet — program id:

HmVEqQkhXa3RJS2J7zco6PG8Kb8teqrrEAj1Z5XvAZ53

View the program on Solana Explorer (devnet) →

Accounts (PDAs)

  • Sospeso — seeds ["sospeso", sponsor, nonce_le]. Holds sponsor, total/remaining lamports, per-claim cap, claim count/limit, expiry, and the new-wallet-only flag.
  • ClaimReceipt — seeds ["claim", sospeso, beneficiary]. Its mere existence blocks a second claim by the same wallet.

Instructions

  • create_sospeso — sponsor funds a new pool with caps + policy.
  • claim_sospeso — beneficiary (or relayer paying rent) claims lamports; writes a receipt.
  • top_up — sponsor adds more lamports to an existing pool.
  • reclaim — after expiry, the sponsor recovers the remainder.

TypeScript SDK

The @gaslt/sospeso-sdk ships PDA helpers and a typed client with both instruction builders (*Ix, for bundling / relayer fee-payer) and convenience *Rpc methods.

const client = new SospesoVerifierClient(provider);
const sig = await client.createSospeso(sponsor, {
  nonce, amount, maxPerClaim, maxClaims, expiryTs, newWalletOnly,
});
const claimSig = await client.claimSospeso(sospeso, beneficiary, amount);

Relayer flow (Octane pattern)

A client sends a partially-signed transaction to the relayer (POST /sponsor). The relayer checks eligibility + rate limits, signs as fee-payer, submits the transaction on-chain, and pairs it with a claim to recover the gas from escrow.

API surface

  • GET /sospeso — available pools.
  • POST /match — pick an eligible pool for a wallet.
  • POST /sponsor — relayer fee-payer + submit.
  • GET /stats — protocol totals.
  • GET /idl — the program IDL.

The web app calls these through same-origin /api/* route handlers to avoid CORS.