$ cat writeup.md…
$ cat writeup.md…
sekai2026
Task: a TON/Tolk Jetton challenge gives each player a closed 50-token economy while solve requires 100 target jettons. Solution: create a donor session on the same shared localchain, sell its bonus for TON, fund the target, buy the missing jettons, and transfer 100 with the Solve payload.
$ cat /etc/rate-limit
Rate limit reached (20 reads/hour per IP). Showing preview only — full content returns at the next hour roll-over.
Jump into the TON =ω=
English summary: the task deploys a TON/Tolk Challenge contract with a JettonMinter and JettonWallet pair. The goal is to make isSolved() return true for the target session UUID and then request the flag from the nc service.
The solve condition is checked when Challenge receives TransferNotificationForRecipient from its own target jetton wallet. The notification must contain:
forwardPayload = Solve (0x13370005),transferInitiator == storage.player,jettonAmount >= 100.So the target player must own at least 100 target jettons and transfer them to the target Challenge with a non-zero forwarded TON amount and the Solve payload.
Inside one session this is impossible with the initial funds:
PlayerBonus appears to allow two bonuses of 50 jettons, but Tolk lazy evaluation makes hasBonus = storage.remainingPlayerBonus != 0 evaluate after storage.remainingPlayerBonus -= 1. With remainingPlayerBonus = 2, only the first call mints 50 jettons; the second decrements to zero and mints nothing.Buy(amount) requires msg.value > amount * 2 TON + 0.12, so buying the missing 50 costs about 100.12 TON.The key observation was the challenge title: Open-World. The new command creates a new player and challenge session, but all sessions on the same launched host live on the same underlying TON localchain. That means TON obtained in one session can be transferred to the player wallet of another session.
Use two sessions on the same host: a target session that will be solved, and a donor session used only as a source of TON.
...
$ grep --similar