Proof-of-action infrastructure · TON

Don't trust the claim. Verify it.

TonAttest turns real STON.fi activity into programmable, signed proof. Your app defines the rule. We resolve the chain, evaluate the evidence and return an attestation your backend can verify offline.

Non-custodialVerification never moves funds
Offline-verifiableEd25519 signed attestations
Self-hostableOpen-source verification service
MIT licensedBuilt for TON developers
The essentials

What is TonAttest?

Swaps Liquidity added Positions held
Signed attestation Evidence returned Your app pays out

TonAttest reads a wallet's real STON.fi history and checks it against a rule you define in code — swap amounts, pools, tokens, and how long liquidity actually stayed. Nothing is self-reported by the user.

The result is an Ed25519 attestation your backend verifies offline against a pinned key. We never hold funds, issue a token, or touch the payout — eligibility is the entire product.

See how it works
01 — Architecture

A thin verification layer between your app and the chain.

The architecture keeps the differentiated logic — rules, evidence and attestations — independent from the data provider and from reward settlement.

Your TON appMini App · dApp · bot

@ston-rewards SDK
createCampaign() · verify()
Verification serviceSELF-HOSTABLE
01 / RULESTyped DSL + evaluation
02 / VERIFIERActivity resolution
03 / EVIDENCEExact tx + aggregates
04 / SIGNERCanonical JSON + Ed25519
TON datatonapi.io
TON Center fallback

STON.fi events
Postgres activity cache
PostgreSQL
campaigns · rules · attestations
Redis
TTL cache · rate limits · idempotency
DataProvider
replace indexing without rewriting rules
02 — Rule engine

The technique that makes TonAttest more than a transaction checker.

Rules are composable condition trees. The SDK provides typed builders while the service evaluates bounded, explainable logic and returns evidence for every leaf.

AND / composite eligibility

Both conditions must be satisfied. This is where simple transaction filters become a reusable campaign primitive.

Conditions: swap + LP hold
Evidence: exact tx hashes + aggregates
Bound: combinators nest to max depth 3
// real volume AND real commitment
rule(all(
  swap({ minVolumeUsd: 100, token: "USDT" }),
  lpHold({ pool: "TON/USDT", minDuration: "7d" })
))
03 — STON.fi decoding

We reconstruct actions from events instead of trusting labels.

The highest-risk technical component is isolated behind a decoding layer. Known STON.fi router/pool addresses and official SDK structures turn raw chain events into normalized activity.

TXJETTONPOOL
01 / RESOLVE

Find the wallet's events

Check Redis freshness first. Pull from tonapi when stale and refresh the activity cache.

ROUTER+OP+POOL
02 / DECODE

Decode the operation

Match known addresses and decode Jetton transfer payloads using official STON.fi SDK types.

SWAPUSDTTON
03 / NORMALIZE

Create canonical evidence

Normalize action, token, pool, amount and timestamp so the rule engine can evaluate deterministic activity.

04 — Verification pipeline

From “I did it” to a proof your backend can check.

The service verifies on claim. No permanent eligibility state is trusted; the current activity is resolved, evaluated and signed.

01
REQUESTwallet + campaign
02
AUTHAPI key + idempotency
03
RESOLVEcache → tonapi
04
EVALUATErule + evidence
05
SIGNcanonical JSON
06
RETURNproof / ineligible
attestation {
  project: "prj_abc", wallet: "EQ...",
  rule_hash: "sha256:...", eligible: true,
  evidence_hash: "sha256:...",
  issued_at: 1755300000, expires_at: 1755303600,
  nonce: "..."
}
ED25519 Offline verifiable
05 — Anti-abuse

Layered defenses, with the limits stated plainly.

The system is designed to make common reward farming expensive without pretending a rule engine can solve coordinated identity attacks.

Net-volume counting

Use |buys − sells| per token pair instead of gross volume by default.

DEFAULTWASH RESISTANCE

Per-wallet caps

Limit maximum rewardable volume per wallet for each campaign.

CAMPAIGN

Cooldowns

Require minimum time between qualifying actions.

MIN INTERVAL

Replay guard

tx_hash is unique in the activity cache, so one event cannot count twice.

UNIQUE TX

Wallet-age floor

Optionally ignore wallets younger than a configured number of days.

OPTIONAL

Sybil boundary

Multi-wallet rings remain unsolved in v1. Apps can combine attestations with their own identity layer.

HONEST LIMIT
Design principle: don't claim “Sybil-proof”. Prove the on-chain action accurately, then let the integrating app add its identity signal.
06 — Technology

Replaceable infrastructure around a focused primitive.

The v1 architecture deliberately avoids running a custom TON indexer. A DataProvider boundary lets the data layer evolve without rewriting the rules engine.

TypeScript · Node 20+Fastifytonapi.ioTON Center@ston-fi/sdk@ston-fi/apiPostgreSQL 16RedisEd25519tsupDocker Compose
07 — Roadmap

One primitive at a time.

The grant scope stays narrow: verify and attest first, then expand only after the primitive is used.

V1 · IN BUILD

Verify + attest

SWAP + LP_ADD, composable rules, evidence, signed attestations, SDK, docs and demo Mini App.

PHASE 2

Settle + scale

Optional settlement, webhooks, duration scheduler, dashboard, self-hosted indexer and additional protocols.

PHASE 3

Understand

Attribution graphs, reputation signals and stronger Sybil heuristics.

Ship in an afternoon

Integrate TonAttest

// last verified: mainnet, EQB4…9xKt
$ npm install @tonattest/sdk
+ @tonattest/sdk@0.1.0
added 3 packages, audited in 4s
✓ attestation verified offline

Define a rule, call verify, check the signature. Whether you run a Mini App, a game economy or a liquidity programme, the integration is the same three steps — and nothing custodial ever touches your users' funds.

Read the docs
Open source · MIT · self-hostable

Give TON apps a verification primitive, not another campaign dashboard.

Write the rule in your code. Verify against the chain. Consume a proof your backend can verify offline.