TRUST — what enforces what in Kaskly

This is the plain-language map of what the Kaspa chain enforces versus what you are trusting the app to do. It is kept accurate with every change to how money is locked or moved, and it is written to be read by a non-developer. (Brief §7 L1, §8 R6.)


⚠️ This is TESTNET. Play money. No real value.

Everything here runs on Kaspa testnet-10. The coins ("TKAS") are free faucet tokens with no monetary value — you cannot lose or make real money using this app, and it is not a place to hold savings. The app refuses to run on any non-testnet network — it will not even start against mainnet. Your keys are generated and stored in your own browser, which is appropriate for testnet keys and nothing else.

Read the rest for exactly what is and isn't guaranteed. Where a guarantee has a limit, the limit is stated.


Two different things live here

Kaskly is a reference client for two separate on-chain primitives. They have different rules, so this document keeps them separate — a guarantee for one is not a guarantee for the other.

Both are non-custodial (your keys never touch a server) and carry no app fees, ever — no cut, no fee output, at any point. Network miner fees are separate and unavoidable, as with any Kaspa transaction.


Kaspaks (the prize-drop / party model)

A party link is a bearer instrument — this is the whole design

The link a creator posts for everyone (the "party link") carries every envelope's key. That is the same exposure as posting all the individual claim links at once, which is exactly what it is. So:

What the chain enforces here — no trust required

These are consensus rules on the envelope covenant; they hold no matter which client you use:

  1. 1.Each envelope opens exactly once. Opening one requires that envelope's own key, and the instant its money moves, it is gone from the envelope. Two people racing the same link is settled by the chain — one wins, the other's spend is rejected as a double-spend.
  2. 2.Only your key can sweep the leftovers, and only after the deadline. The return path requires the creator's signature and the chain rejects it before the deadline. Because only your key can sign it, nobody else — not us, not a miner, not a claimant — can sweep your leftovers. (Honest limit: unlike the Ask refund below, the envelope covenant does not script-pin where the sweep pays — it is your signature that controls that, and the app sends it to your own wallet. Only your key can move it; the destination is your key's choice, not the script's.)
  3. 3.A claim pays whoever signs it. Spending an envelope requires that envelope's key; the signer chooses the destination (the app sends it to your connected wallet). No one without the key can take it.
  4. 4.No app fees, and no path for us to touch any of it. There is no fee output and no route through our server to your funds, keys, or anyone's envelope. The server never sees a secret.

What the chain does NOT enforce — honest client, documented not prevented

The one double-claim guarantee, stated exactly

There is one thing the app itself guarantees on top of the chain, and it is worth stating precisely because it is easy to over- or under-claim:

The scoreboard — and exactly how much it can tell you

The public watch link shows a drop's live state, and everything on it comes from your own Kaspa node — no third-party service, no data of ours.

If your node is having a bad day, every screen here shows an error and asks to retry — a failed read is reported as a failed read, never as "the prize is gone."


Asks (the one-to-one reply-to-claim model)

What the chain enforces — no trust required

These hold on the Ask covenant (V3) no matter which client you use:

  1. 1.Only the recipient can claim, and only with a reply bound to this Ask. The claim requires the recipient's signature and a payload that carries this Ask's own id — so one reply cannot sweep several people's Asks, and a claim for a different Ask is rejected. (Earlier the chain only checked a 15-byte label; the shipped V3 covenant binds the specific Ask.)
  1. 2.Before the deadline, the sender cannot take the money back. The chain rejects an early refund.
  2. 3.After the deadline, the refund needs nobody's key. The refund carries no signature — anyone can send it, and the covenant forces it to pay only your address, as the single output, for your locked amount minus at most a small, fixed network-fee allowance set when the Ask was created. The chain rejects a refund to any other address, with a smaller amount, or with extra outputs. (This is stronger than the Kaspak sweep, which is signature-gated rather than output-pinned.)
  3. 4.Once a refund happens, a late reply can never take the money. The chain rejects it as a double-spend.
  4. 5.No app fees. Every test decodes the real transactions from independent chain data: money goes recipient-or-sender, and no fee output exists anywhere.

The one honest caveat

Between the deadline passing and the refund actually landing, a late reply is still valid. The chain cannot expire a claim on its own — the refund transaction is what closes the door. Because the refund needs no key, any participant can send it in the first block after the deadline (your app, the recipient's app, or an independent watcher), and the protocol requires clients to do exactly that and requires recipient apps to refuse late replies. The honest product statement: "a reply or your money back — late replies lose to the refund."

What this means if you're the one replying. Your reply is the claim, so it has to land before the refund does. Reply on time and you're paid. But a reply that arrives late — or right at the deadline — races that refund, and if the refund wins, your reply is rejected and the money returns to the asker. You lose only the network fee on the failed claim; the escrow itself can never be taken by a third party or redirected — it can only pay the recipient (you, on time) or refund the asker. A late claim that fails is the asker declining, not a loss of your funds. So reply to Asks you have some reason to trust — this is the same "we disclose it, we don't prevent it" honesty as the bearer risks in Kaspaks above, and it exists for the same reason: no Kaspa script can see the current time, so a claim cannot be made to expire and a late one cannot be given priority.

Message privacy

Everything you write is encrypted. There is no plaintext mode. Ask messages are encrypted so only the recipient can read them; replies are encrypted so only you can read them — using the same encryption scheme as Kasia, the encrypted messenger this extends. A Kaspa address is enough; no key exchange first.

What stays public, permanently, on chain: who asked whom (addresses), how much, the deadline, and whether it ended in a reply or a refund. The words themselves do not. (One honest asterisk: Kasia publishes no official test vectors, so our "same scheme" claim rests on a line-by-line reimplementation of their code, not a cross-check against their output. Flagged for confirmation with the Kasia team.)


The trust assumption we chose on purpose: the transaction indexer

Kaspa nodes do not index transactions by id. A node can tell you what is unspent right now, but it cannot hand you an old transaction or an address history — that is what a separate indexer service is for. This app reads one (api-tn10.kaspa.org), and there is no second source to check it against. So we state the assumption rather than paper over it.

What a dishonest indexer could do: change the message text you see on a settled Ask, misreport whether a finished Ask was answered or refunded, alter a reply shown to a sender, or make a settled Ask look unresolved. That is deception, and worth taking seriously.

What it cannot do — the bound that matters:

So: a hostile indexer can lie to your eyes about a finished item, or about an envelope's rarity colour. It cannot take, redirect, or freeze a single sompi, and it cannot decide what you are allowed to claim. (Your header's "Earned" figure — income you've been paid for replies and won from Kaspaks — is derived through this indexer route; the balance beside your address comes straight from a Kaspa node with no indexer in the path.)

What your browser talks to — and what it doesn't

Everything the app shows is chain-derived, so your browser only ever contacts:

No analytics, no telemetry, no beacons. Kaskly loads no analytics or tracking scripts of any kind and sends no usage data anywhere — no third-party analytics package, no page-view beacons, nothing that reports what you do. Every request the app makes on its own is one of the functional calls named above: your Kaspa node (the money path), the transaction indexer (settled and historical detail, and the reveal-tap rarity colour bounded above), our own cache, and — only for a .kas name — KNS.


The trust you place in us (the real one)

We never see your keys or your links. Keys are generated and used in your browser only, and Kaskly never holds them. But your browser runs JavaScript we served, and a hostile or compromised version of this site could misbehave inside your own browser — read a key it shouldn't, or jam a screen. This is true of every page here, Asks and Kaspaks alike, and no promise on any page can remove it. It is the one trust you place in us by using the app at all, and we would rather name it than imply it away.


Always true, regardless of outcome


How this stays honest: when the code changes how money is locked or moved, this page changes with it — we would rather correct an overclaim the same day than let a trust document promise more than the code delivers. That has happened before (an earlier version of this page described escrow defects that were later fixed and re-proven on testnet, and it was corrected), and it is the standing rule.

This page is rendered from TRUST.md, the same file that ships with the reference client, so what you read here is exactly what the code commits to. Back to Kaskly →