Hey all ![]()
Last month I promised good news on the iCKB side: here it is!! ickb.org now runs a brand new DApp, built together with a new SDK and a new bot, all on CCC ![]()
They replace the Lumos versions that served iCKB since 2024: the old DApp, the old bot and their libraries @ickb/v1-core and @ickb/lumos-utils. Lumos is no longer actively maintained, so the move was overdue. Now it’s done!!
In June I wrote about a setback with CCC UDT support. That setback is behind us: the SDK doesn’t need it at all, it reads iCKB cells with CCC core alone.
Safety first
The new code runs on the same contracts, so I went back to them too. They can’t be changed on chain, so I tried hard to make them accept something they shouldn’t: almost 50 million attempts, each checked against the four protocol rules. They held every single time, not a single break!! Anyone can also rebuild them from source and get exactly the bytes running on chain. All the details are in iCKB Contracts Revisited and its report.
The new stack adds its own guard: the DApp reads the chain through public nodes, so now the SDK checks what a node says before your wallet signs. Each cell is checked against the transaction that created it, each header against its hash.
Users
Look before you connect: the DApp quotes a conversion and shows what your CKB is worth in iCKB over time, with no wallet connected. The old DApp asked for JoyID first.
Any wallet CCC supports: JoyID and UTXO Global, but also MetaMask, OKX, UniSat and other EVM, Bitcoin or Nostr wallets, or a wallet on another device through Khie pairing. The old DApp supported JoyID only.
Know before you sign: the preview is the real transaction, rebuilt once more right before your wallet pops up. Under the button the DApp says in plain words what it does:
- a direct conversion, at a fixed time;
- an order, converted when a bot fills it;
- or part of each.
An order also says how much CKB it holds as cell space, returned when you collect. Then the DApp shows one Ready date for everything you have converting, plus the fee.
All your CKB: the old DApp held back 600 CKB from every conversion. Now you can convert what you have. If it’s not enough for fees and cells, the DApp tells you before signing.
Deposits spread over the whole DAO cycle: the bot now actively spreads pool deposits along the roughly 30 days of a NervosDAO cycle, instead of leaving them lumped together. In the February 2025 liquidity crunch the closest deposit ended up two weeks away. Spreading takes one cycle to settle, so withdrawal times should improve considerably once this first month passes.
Faster fills: orders now pay bots a 0.01% fee instead of 0.001%. At 0.001%, DAO growth put a CKB to iCKB order under par within four hours, so no bot would touch it. At 0.01% an order stays worth filling for about two days.
That 2,000 CKB order was filled by the testnet bot about five minutes after it committed.
Collecting is part of every transaction: each transaction you sign also collects what is ready. To only collect, leave the amount at zero.
Orders don’t get stuck: an order older than thirty days comes back to you with your next transaction. A buy that bots refuse to fill also comes back.
Small amounts: a few iCKB can often still go back to CKB, which also frees the CKB behind a small iCKB cell.
Send everything elsewhere: point the address in the header to another wallet and the next transaction sends your CKB and iCKB there. That’s the way out for a wallet that can’t transfer xUDT tokens itself.
Integrators
Install @ickb/sdk: one package, whose only dependency is CCC itself (@ckb-ccc/core, as a peer). It works in the browser too.
The Lumos libraries were two packages pulling in eight Lumos packages. The new flow follows CCC:
IckbSdk.fromChain(chain);getL1AccountState(...)reads the account, the pool and the order book;buildConversionTransaction(...)returns a funded transaction with its planned fee;signAndSendTransaction(...), thenwaitTransaction(...).
The SDK README explains each step and the reasons behind it.
Operators
The bot is now one process running a turn every ten minutes:
- the signing key lives in a
0600file, not in an environment variable; - each turn writes JSON lines to the journal, including why it did nothing, so you can tell a quiet market from an empty wallet;
- on any error it exits and systemd restarts it clean.
It has been running on testnet since September. The bot README covers setup and the journal.
Try it
Open ickb.org, pick Testnet and grab some CKB from the faucet link under CKB. The screenshots above are from testnet.
Everything is in one repository: ickb/stack. Feedback is very welcome, here or in the Nervos Nation iCKB channel.
Love & Peace,
Phroi



