Superteam Kazakhstan x KASE · Corporate Actions on Blockchain
Bonds keep trading through the record date, and Blum still pays every coupon to the right holder
One Solana program services a tokenized bond from issue to redemption: it keeps the register, pays coupons, redeems, and runs a buyback and a tender offer. Every step below ran on Solana devnet.
Arrow keys, space or scroll. Every box and dot is a link to its proof.
2 · The track's requirements
Every requirement of the track has code and a devnet run behind it
| The listing asks for | Code | Devnet | Site | Slide |
|---|---|---|---|---|
| Test tokenized instrument | 5 | |||
| Holder registry | 6 | |||
| Record-date mechanism | 3, 4 | |||
| Entitlement calculation | 7 | |||
| Coupon payment | 8 | |||
| Bond redemption | 9 | |||
| One additional corporate action | 10 | |||
| Verifiable on-chain record | 11 | |||
| Implemented versus simulated | n/a | 16 | ||
| Technical overview | n/a | 17 |
Each dot opens its proof: a line of code, a devnet transaction or account, a page of this site. Results in one place: slide 15.
3 · The problem
The bond keeps trading after the record moment, so paying payment-day holders pays wrong amounts
Kazakhstan's depository pays whoever held the bond at 09:00 on the payment day and does not stop trading. A Solana program cannot snapshot every holder at 09:00 in one step, and a list made off chain would let an off-chain party decide who is paid.
Across the 1000-holder run, paying by holdings at payment would have got 1,039 of 4,000 coupon payments wrong. The two payments above are links to their transactions.
4 · Record-date mechanism
Each transfer first saves both holders' positions for the record moments that have passed
Either way the program knows each holder's position at 09:00: no snapshot, no freeze, and nobody has to act at 09:00.
5 · Test tokenized instrument
The bond is a Token-2022 token, and every power over it belongs to the program
At creation the program also checks the payment and record days against the terms, and refuses a cash token that could shrink or take a payment.
6 · Holder registry
Only registered wallets can hold the bond
The registrar creates one holder record per wallet (KYC is simulated). The transfer hook checks both sides of every transfer.
1,000 registered holders on devnet. Each box above opens its transaction.
7 · Entitlement calculation
The program computes each payment from the terms and the record-moment position
The listing's own example on one holder: BH#9 held 10 bonds from the first coupon to maturity and never traded. Rounded down once per holder; each coupon's budget uses the same formula on the whole supply, so payments never exceed it. 4,000 of 4,000 amounts in the 1000-holder run match the terms; the math matches QuantLib and FinancePy.
8 · Scenario 1: coupon payment
A coupon is paid from its own vault, and only once that vault can pay everyone
4 coupons, 2,003,300.00 paid to 1,000 holders; every vault emptied.
9 · Scenario 2: bond redemption
At maturity, bonds are burned and principal is paid in the same transaction
Both or neither: no bond is burned unpaid. 9,665 bonds from 918 holders redeemed; final supply 0.
10 · Scenario 3: the additional corporate action
Tendered bonds still earn their coupon, and the issuer buys exactly its maximum
Also a buyback, first come first served: 176 bonds at 990.00, each sale burned and paid in one transaction.
11 · Verifiable on-chain record
The ledger is the record, and an audit that never reads the program re-checks it
Every balance and payment is checked against the bond's terms to the smallest cash unit.
12 · Servicing does not depend on our operator
Any wallet can continue servicing the bond: ours stopped after coupon 0, and an outside wallet finished it
Keeper run, a separate 3-holder bond. Amounts come from on-chain positions, so the sender cannot change who is paid or how much. Audit of this run: 23 of 23.
13 · Attacks
35 attacks on devnet, 35 refused
Attacker run, a separate 6-holder bond. Solid tiles were refused by the bond's own program (22); dashed tiles by Solana's token programs or runtime (13). Each tile is a failed transaction anyone can open. 21 more are refused in local tests. Trusted, not stopped: the registrar, the cash issuer's freeze, and the program's upgrade authority.
14 · Real-world applicability
Market rules are terms of the bond, not code, so fixed-rate bonds from any market can be serviced
For MUM108_0015, a real KASE bond, the computed payment dates equal KASE's published ones.
15 · Results on devnet
1,000 holders, every bond accounted for: 10,251 placed, 0 left
16 · Implemented versus simulated
Everything on Solana is real; only the cash, KYC and the trading venue are simulated
Devnet time is compressed: 1 bond day = 1 to 20 seconds. Limits: fixed-rate bonds, up to 40 coupon periods, direct holders; the registrar and the program's upgrade authority, a single wallet, are trusted.
17 · Technical overview
One repository: the program, the checks that doubt it, and this site
Or press Claude or ChatGPT at the top: your own AI reads the sources and explains them.