Spark Program | Dular

Dular — Mobile Money Stablecoin Wallet on Fiber Network

Team Profile & Contact


Project Description

Problem

1.4 billion people across Africa, Southeast Asia, and Latin America depend on mobile money (M-Pesa, MTN MoMo, Airtel Money) as their primary financial infrastructure. These users face:

  • High fees: Cross-border transfers cost 6–9%, eating into remittances that families depend on
  • Slow settlement: 1–3 business days for cross-network transfers
  • Closed ecosystems: M-Pesa users can’t send directly to MTN MoMo users
  • Crypto complexity: Existing stablecoin wallets require understanding hex addresses, gas fees, and blockchain concepts — inaccessible to mobile money users
  • Smartphone dependency: Most crypto wallets require smartphones, excluding hundreds of millions of feature phone users

Solution

Dular is a stablecoin wallet that speaks the language of mobile money users. It is built natively on CKB’s Fiber Network and wraps it in interfaces that mobile money users already understand:

  1. Phone Number Identity: Users send stablecoins to phone numbers (+254712345678), not hex addresses. Dular maintains a phone-to-pubkey registry that maps phone numbers to Fiber Network identities.

  2. M-Pesa On/Off Ramp: Users deposit KES (Kenyan Shillings) via M-Pesa STK Push and receive RUSD stablecoins in their Dular wallet. To cash out, they withdraw RUSD and receive KES back to their M-Pesa. Powered by Safaricom’s Daraja API.

  3. USSD Support for Feature Phones: Users dial a shared short code (*483*XXXX#, works on Safaricom, Airtel, and Telkom) to access their wallet from any phone — no smartphone, no internet, no app download required. Built on Africa’s Talking USSD API with a pre-paid session model (KES 1 per session from the user’s airtime).

  4. Instant, Near-Zero Fee Payments: Fiber Network’s off-chain payment channels enable millisecond settlement at < 0.001% fees. We demonstrated this with a successful end-to-end 1 RUSD payment through the public testnet relay nodes.

Why CKB / Fiber Network?

CKB’s Fiber Network provides unique advantages:

  • Native stablecoin support (UDT): Fiber channels natively support UDT assets like RUSD, no wrapped tokens, no bridges, no extra complexity
  • Multi-asset channels: A single channel can carry multiple stablecoin types, enabling future local currency stablecoins (KES, GHS, NGN) without separate infrastructure
  • PTLC security: Point Time-Locked Contracts (more advanced than HTLCs) provide stronger privacy and atomicity guarantees
  • Low on-chain costs: CKB’s cell model keeps channel open/close transactions inexpensive, critical for users transacting $1–$50 at a time

Expected Deliverables

Code Repository

Deliverable 1: Phone Number Identity Layer

  • Phone number → Fiber pubkey mapping service
  • Registration flow: verify phone via OTP, link to wallet
  • Send-to-phone-number UI in Dular web app
  • Contact lookup and resolution

Deliverable 2: M-Pesa On/Off Ramp

  • M-Pesa STK Push integration (deposit KES → receive RUSD)
  • M-Pesa B2C integration (withdraw RUSD → receive KES)
  • Transaction status tracking and receipt generation
  • Basic KYC-lite flow (phone number verification)

Deliverable 3: USSD Interface

  • USSD menu system for feature phones:
    • Check balance
    • Send to phone number
    • Receive (display invoice)
    • Deposit from M-Pesa
    • Withdraw to M-Pesa
  • Session management and security PIN

Deliverable 4: 30-User Pilot

  • Recruit 30 seed users
  • Structured testing protocol:
    • Week 1: Onboarding and first deposit
    • Week 2: Peer-to-peer transfers between pilot users
    • Week 3: Cross-corridor transfers and edge cases
    • Week 4: Feedback collection, interviews, and iteration
  • Documented user feedback report with key insights
  • Product improvement recommendations based on real usage

Documentation

  • Technical documentation and deployment guide
  • USSD menu flow diagrams
  • User testing report with data and feedback
  • Video demonstration of full user flow

Required Funding: $2,000

Line-Item Cost Breakdown

Infrastructure & API Costs

Item Unit Cost Quantity Subtotal (KES) Subtotal (USD)
Africa’s Talking shared USSD code (*483*XXXX#) — monthly maintenance KES 10,000/month 2 months KES 20,000 $154
Africa’s Talking USSD — compulsory infrastructure deposit KES 5,000 (one-time) 1 KES 5,000 $38
Africa’s Talking USSD — per-session infrastructure fee KES 0.25/session ~600 sessions (30 users × 20 sessions) KES 150 $1
Africa’s Talking SMS — OTP verification messages KES 0.80/SMS ~90 messages (30 users × 3 OTPs) KES 72 $1
M-Pesa B2C disbursement fees (production) ~KES 22/transaction ~100 withdrawals KES 2,200 $17
M-Pesa Daraja production API access Free $0
VPS hosting ~$10/month 2.5 months $25
Domain ~$12/year 1 $12
Infrastructure subtotal $248

Pilot Costs (Milestone 3)

Item Unit Cost Quantity Subtotal (USD)
M-Pesa B2C float — seed capital for cash-out during pilot KES 500/user avg 30 users $115
Pilot user incentives — airtime top-up for participation KES 300/user 30 users $70
Google Workspace / Typeform — feedback collection ~$3/month 2 months $6
Pilot subtotal $191

Note: The B2C float is revolving, user deposits fund subsequent withdrawals. The $115 is the initial seed required before deposits accumulate. If unspent float remains at pilot end, it will be documented and rolled into post-grant operations.

Developer Time

Phase Hours Description
Milestone 1: Phone identity + M-Pesa ramp 55 hrs Registry service, OTP flow, send-to-phone UI, Daraja STK Push + B2C integration, end-to-end testing
Milestone 2: USSD interface 55 hrs Africa’s Talking integration, 5-screen menu system, security PIN, session management, multi-handset QA
Milestone 3: Pilot + documentation 55 hrs User recruitment, onboarding support, structured testing coordination, feedback analysis, demo video, final docs
Total developer time 165 hrs 5.5 weeks × ~30 hrs/week
Developer time budget $1,561 $2,000 − $248 (infra) − $191 (pilot)
Effective hourly rate $9.45/hr

Why $2,000, Not $1,000

The standard $1,000 ceiling does not cover this project’s scope. Here is why:

  • Hard costs alone are $439. USSD code fees ($192), M-Pesa float ($115), pilot incentives ($70), hosting ($37), SMS and transaction fees ($25). These are non-negotiable third-party costs with published rate cards. A $1,000 budget would leave $561 for 165 hours of development — $3.40/hour.
  • Three distinct production integrations. This is not one API integration, it is three (phone identity registry, Safaricom Daraja M-Pesa, Africa’s Talking USSD), each with its own auth flow, callback handling, error states, and compliance requirements.
  • Real-world pilot with real money. Milestone 3 puts real KES through real M-Pesa on real phones with 30 non-technical users. This is not a testnet demo, it is a production validation that requires float capital, user coordination, and structured feedback collection.
  • Working prototype already shipped. This grant does not fund exploration. A verified RUSD payment on Fiber testnet already works. Every dollar goes toward production-ready infrastructure and real user validation.

CKB Disbursement & Exchange Rate Risk

We acknowledge that Spark grants are disbursed in 100% CKB. This does not change the total ask, but it introduces exchange rate risk on the $439 in hard costs that must ultimately be paid in KES or USD (Africa’s Talking invoices in KES, Safaricom in KES, hosting providers in USD).

Mitigation strategy:

  • Prompt conversion of hard-cost portion. Upon each milestone disbursement, we will convert the hard-cost allocation for that milestone to fiat (KES/USD) immediately to lock in purchasing power. Specifically: ~$54 from M1, ~$193 from M2, ~$192 from M3.

  • Line items remain valid. The USD figures in the breakdown represent target purchasing power.


How to Verify

Every milestone produces artifacts a committee member or community reviewer can independently check without trusting the applicant’s word.

Milestone 1: Phone Identity + M-Pesa Ramp

Phone-to-pubkey registry is live:

  • Public API endpoint. The registry service will be deployed at a public URL (e.g. https://api.dular.app/registry). A reviewer can call GET /lookup?phone=+254700000001 and receive the associated Fiber pubkey, or a 404 if unregistered. API docs will be published in the repo README.
  • Registration screen recording. A narrated screen recording (uploaded to GitHub Releases) will show: entering a phone number → receiving OTP on the phone → confirming OTP → the phone-to-pubkey entry appearing in a subsequent API lookup call.
  • Source code. The registry service code, OTP verification flow, and database schema will be in the public GitHub repo. A reviewer can clone the repo and run the service locally against a test phone number using the provided seed script.

M-Pesa STK Push and B2C flows actually settle end-to-end:

Dular already holds production Daraja API keys from Safaricom. Pilot users and reviewers with Kenyan M-Pesa accounts will transact with real KES no sandbox, no test money.

  • Live production flow. A reviewer with a Kenyan M-Pesa number can use the Dular web app to trigger a real STK Push deposit (small amount, e.g. KES 10 ≈ $0.08), watch the M-Pesa prompt appear on their phone, confirm, and see RUSD credited to their Dular wallet. They can then withdraw RUSD and receive KES back to their M-Pesa. The entire flow uses production Daraja APIs with real settlement.
  • End-to-end screen recording. A narrated video will show the full production cycle: initiate STK Push → M-Pesa prompt on phone → payment confirmed → RUSD appears in Dular wallet → initiate withdrawal → M-Pesa B2C payout received. Real M-Pesa confirmation codes and timestamps will be visible.
  • CKB testnet transaction hashes. Every deposit (KES → RUSD) and withdrawal (RUSD → KES) triggers Fiber Network activity. The milestone report will include the on-chain CKB testnet transaction hashes for channel funding and settlement. Reviewers can independently verify these on CKB Testnet Explorer , the transactions will show the RUSD UDT script hash matching the public testnet configuration.
  • M-Pesa transaction receipts. Screenshots of real M-Pesa confirmation SMS messages (with sensitive details redacted but timestamps and transaction codes visible) will be included in the milestone report.
  • Sandbox fallback for non-Kenyan reviewers. Reviewers without a Kenyan phone can follow a provided walkthrough using Safaricom’s official Daraja sandbox (test credentials publicly available at developer.safaricom.co.ke) to independently verify the integration code path. No Kenyan phone number required.

Milestone 2: USSD Interface

Dular will use a shared pre-paid USSD code (*483*XXXX#) from Africa’s Talking, covering Safaricom, Airtel, and Telkom networks.

  • Live USSD on real phones. Any reviewer or pilot user with a Kenyan SIM (Safaricom, Airtel, or Telkom) can dial the short code from their phone, including feature phones and interact with the live Dular wallet: check balance, send to a phone number, receive, deposit from M-Pesa, withdraw to M-Pesa. This is the primary verification method.
  • screen recording. A video recorded on an actual phone showing the full USSD session: dialing the short code, navigating menus, checking balance, initiating a send-to-phone-number transfer.
  • Simulator fallback for non-Kenyan reviewers. Africa’s Talking provides a free USSD simulator usable in-browser, no phone, no account, no SIM required. The milestone deliverable will include the USSD callback URL and a walkthrough: launch simulator → dial short code → navigate full menu tree → observe correct responses. The simulator connects to the same live Dular backend as the real USSD code.
  • Session logs. The USSD service will log anonymized session transcripts (menu selections, timestamps, response codes). A sample log bundle will be included in the milestone report.

Milestone 3: 30-User Pilot Data is Real

  • Anonymized user directory. A spreadsheet of 30 entries: hashed phone number (SHA-256, so the real number isn’t leaked but the count is verifiable), registration timestamp, Fiber pubkey , and number of transactions completed. A reviewer can cross-reference pubkeys against the Fiber testnet graph to confirm these nodes existed and had open channels.
  • On-chain proof of activity. Each pilot user’s Fiber channel produces on-chain funding transactions. The milestone report will list all channel funding tx hashes on CKB testnet. A reviewer can verify on CKB Explorer that ≥30 distinct channels were opened during the pilot period, with the RUSD UDT script hash matching the testnet configuration.
  • Fiber Network graph snapshot. A list_channels RPC dump from the Dular node at pilot end, showing active channels with pilot user pubkeys. Reviewers running their own Fiber testnet node can independently query the gossip network to confirm these channels were announced.
  • Signed user feedback. Each pilot user will submit feedback. The raw, timestamped response export (with phone numbers redacted, but preserving response timestamps and unique respondent IDs) will be published. A reviewer can verify that ≥30 unique respondents submitted feedback within the pilot window.
  • Demo video. A 5–10 minute narrated video showing: a new pilot user onboarding (phone registration), depositing via M-Pesa, sending RUSD to another pilot user by phone number, and the recipient withdrawing to M-Pesa. This end-to-end flow will be shown from both the sender’s and receiver’s perspective.

Summary: Evidence Checklist per Milestone

Milestone Primary (real users) Fallback (technical reviewers)
M1: Phone Identity + M-Pesa Public registry API, live M-Pesa production deposit/withdraw, CKB testnet tx hashes on Explorer, M-Pesa SMS receipts Daraja sandbox walkthrough for non-Kenyan reviewers
M2: USSD Interface Live *483*XXXX# code dialable from any Kenyan SIM, phone video, session logs Africa’s Talking in-browser simulator (no phone needed)
M3: 30-User Pilot ≥30 CKB testnet channel funding txs on Explorer, anonymized user directory with pubkeys, Fiber graph snapshot, timestamped feedback export, end-to-end demo video

All evidence artifacts will be committed to the GitHub repo under a /verification directory and linked in each milestone’s completion report.


Estimated Completion Time: 5.5 Weeks (~1.3 Months)

Week 1–2: Milestone 1: Phone Identity + M-Pesa Ramp

  • Phone-to-pubkey registry service and OTP verification
  • Send-to-phone-number UI in Dular
  • M-Pesa Daraja API integration (STK Push deposits, B2C withdrawals)
  • End-to-end flow: deposit KES → send RUSD → withdraw KES

Week 3–4: Milestone 2 — USSD Interface

  • Africa’s Talking USSD integration
  • Menu system: balance, send, receive, deposit, withdraw
  • Security PIN and session management
  • Feature phone testing across multiple handsets

Week 4.5–5.5: Milestone 3 — 30-User Pilot + Documentation

  • Recruit and onboard 30 seed users
  • Structured testing: onboarding → transfers → feedback
  • User feedback report with key insights and improvement directions
  • Demo video and final project documentation

To-Do List

  • Phone number → pubkey registry service
  • OTP phone verification flow
  • Send-to-phone-number in Dular UI
  • M-Pesa STK Push deposit integration
  • M-Pesa B2C withdrawal integration
  • USSD menu interface for feature phones
  • Security PIN system
  • Recruit 30 pilot users (Kenya + Ghana)
  • Run structured 2-week pilot test
  • Collect and document user feedback
  • Write project completion report
  • Record video demonstration
  • Publish all code and documentation

Relevance to CKB Ecosystem

Meeting Actual Needs

  • First mobile money bridge in CKB: No project currently connects CKB/Fiber to mobile money rails. Dular creates an entirely new user acquisition channel.
  • Real user validation: The 30-user pilot generates structured feedback from a demographic (mobile money users in Africa) that no CKB project has ever reached.
  • Fiber Network adoption: Every Dular user runs a Fiber node and opens payment channels, directly growing the network’s liquidity and routing capacity.

CKB’s Unique Technical Advantages

  • UDT stablecoins on Fiber: CKB’s native UDT standard allows stablecoins in payment channels without bridges or wrapping
  • Multi-asset channels: Fiber’s multi-asset support enables future local currency stablecoins (KES-stable, GHS-stable) on the same infrastructure.
  • Cell model efficiency: Low on-chain costs make $1–$50 transactions economically viable, matching mobile money transaction sizes.
  • Programmable verification: CKB scripts enable custom logic for phone number verification and on/off ramp settlement contracts.

Web5 Alignment

Dular embodies the Web5 philosophy, organic combination of Web2 and Web3:

  • Web2 interface (phone numbers, USSD, M-Pesa) meets Web3 infrastructure (Fiber Network, non-custodial keys)
  • Small but real: Not a speculative DeFi protocol, a practical tool for people sending money to their families
  • User-centric: Designed around how mobile money users actually behave, not how crypto users think they should
  • Human-oriented: Feature phone USSD support ensures nobody is excluded by technology barriers

Existing Progress

Dular is not a concept it is a working prototype with a verified end-to-end payment flow and public testnet multi-hop RUSD payment.

  • Web app built (Vite + React) with premium dark-mode UI
  • Fiber Network RPC integration (node_info, list_channels, open_channel, send_payment, new_invoice)
  • RUSD stablecoin channel opened with public testnet relay node
  • **RUSD payment successfully executed through public testnet multi-hop
    routing (see proof below)
  • Open source on GitHub: GitHub - duongja/Dular · GitHub

This grant funds the next phase: making it accessible to real mobile money users.

Public Testnet Multi-Hop RUSD Proof

Here is a completed public testnet multi-hop RUSD payment:

- Fiber payment hash:
0x20fd6c4a9d9e207420b4f55b4ae095eee9840fca1678afc89f9065298fe4a9e2

  • Status: Success
  • Route: nodeA → public node1 → public node2
  • Hop pubkeys:
    • sender:
      0232739a0e4af969db12b003dbcaf90b370ab78355078fc02d81d4d072df3e7087
    • relay:
      02b6d4e3ab86a2ca2fad6fae0ecb2e1e559e0b911939872a90abdda6d20302be71
    • payee:
      0291a6576bd5a94bd74b27080a48340875338fff9f6d6361fe6b8db8d0d1912fcc
  • Delivered amount: 0x5f5e100 = 100,000,000 base units = 1 RUSD
  • Routing fee: 0x186a0 = 100,000 base units = 0.001 RUSD

Relevant on-chain channel funding transactions used by the route:

  • nodeA ↔ public node1 funding tx hash:
    0xefdb791ac44ba1af435ae2b22f5572862519865990185d3c0d0cd5bd068e9e39
    • output index: 0x0
  • public node1 ↔ public node2 funding tx hash:
    0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c
    • output index: 0x0

For the second relay channel specifically, output 0x0 of tx
0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c is a Fiber
FundingLock cell carrying the public testnet RUSD type script. In other words,
this is the on-chain RUSD channel cell used by the second hop of the payment
route.

Important note: the Fiber payment hash is an off-chain payment
identifier, not a CKB L1 transaction hash, so it should not be expected to
appear directly as a standalone transfer on the CKB explorer. What can be
checked on the explorer are the channel lifecycle transactions / funding cells
above. The multi-hop property itself is proven by the Fiber payment record
returned by get_payment(payment_hash) / list_payments, which includes the
routed hop list.


Execution Risk & Mitigation

1. M-Pesa Daraja Production Access

Risk:
Safaricom Daraja production approval can take 4–8 weeks and often requires a Kenyan legal entity or local partner, particularly for B2C disbursements.

Mitigation (Current Status):
This risk is already resolved.

  • Dular already holds production Daraja API credentials for both:

    • STK Push (C2B deposits)
    • B2C disbursements (withdrawals)
  • Integration is being built directly against live production endpoints, not sandbox.

  • No dependency on pending approvals, third-party aggregators, or partner onboarding.

Implication for execution:

  • Milestone 1 can proceed immediately without external blockers
  • Real KES transactions (deposit → RUSD → withdrawal) will be executed during development, not deferred to post-build validation
  • Timeline is not exposed to Safaricom approval delays

2. User Recruitment & Field Testing Capacity

Risk:
Previous projects have underperformed on real user validation due to weak recruitment pipelines, lack of local context, or reliance on synthetic testers.

Mitigation (On-the-Ground Advantage):
This project is executed locally in Kenya with direct access to the target user base.

  • Geographic presence:
    I’m based in Nairobi with day-to-day access to mobile money users across Safaricom, Airtel, and Telkom networks.

  • Recruitment approach:

    • Direct, in-person onboarding (friends, local networks, small business operators, students)
    • No reliance on online-only recruitment or crypto-native users
    • Target users are existing mobile money users with no prior crypto experience
  • User profile targeting:

    • Frequent M-Pesa users (peer transfers, small business payments, remittances)
    • Mix of smartphone and feature phone users (critical for USSD validation)
  • Vernacular & usability support:

    • English + Swahili support during onboarding and testing
    • Ability to observe real usage behavior and confusion points in context (not just survey responses)
  • Field testing method:

    • Assisted first transaction (guided onboarding)
    • Followed by independent usage (send/receive/withdraw)
    • Real-time troubleshooting and iteration during pilot window

Implication for execution:

  • Recruitment of 30 users is low risk and does not depend on external channels
  • Feedback quality will be grounded in actual behavior, not hypothetical responses
  • USSD flows will be validated on real devices and real network conditions

Post-Spark Program Plans

After successfully completing the pilot, Dular will be positioned to apply for Community Fund DAO funding to:

  1. Launch local stablecoins: KES-pegged, GHS-pegged, NGN-pegged stablecoins as UDTs on CKB, tradeable through Fiber channels
  2. Scale to 1,000+ users across multiple East and West African corridors
  3. Build agent network tools: enable local agents to provide cash-in/cash-out services
  4. Expand to additional mobile money networks: MTN MoMo (Ghana, Uganda), Airtel Money (across Africa), GCash (Philippines)

Dular: Instant stablecoin payments for mobile money markets, no banks, no borders, no middlemen. Just your phone number.

9 Likes

Hi duongja,

Thanks for the submission. The proposal aligns well with Spark 2026’s technical focus on Fiber Network and UDT-based payments, and the fact that you already have a working multi-hop RUSD payment through testnet relays is a strong differentiator. Before I bring this to the committee for formal review, I’d like you to revise a few sections so the evaluation can move efficiently.

  1. Add a “How to Verify” section. Starting from 2026, every Spark proposal is required to include a low-cost, reproducible verification scheme. For Dular specifically, please describe how a committee member or community reviewer can independently confirm: the phone-to-pubkey registry is live, the M-Pesa STK Push and B2C flows actually settle end-to-end, and the 30-user pilot data is real. Public demo URLs, signed transaction hashes, screen recordings, or a sandbox the reviewer can poke are all acceptable. This is the single most important addition.

  2. Provide a line-item funding breakdown. Spark’s standard ceiling is $1,000. The $2,000 tier is reserved for projects with exceptional impact, so the justification needs to be concrete. Please upgrade the current per-milestone summary with itemized costs: Daraja API fees (sandbox vs production), Africa’s Talking USSD per-session pricing × estimated sessions, KES float for cash-in/cash-out reconciliation during the pilot, user incentives or transport reimbursement for the 30 testers, and any developer-hour estimate you’d like to include.

  3. Payment currency. The committee recently decided that, currently, Spark grants will be disbursed in 100% CKB only (no USDI option for now). If this materially affects your numbers, adjust the breakdown accordingly.

  4. Address two execution risks up front. First, Safaricom Daraja Production approval typically takes 4–8 weeks and usually requires a Kenyan legal entity or local partner, especially for B2C. Please clarify whether you already hold production credentials, hold sandbox only, or have a partner arrangement in Kenya. Second, please describe your on-the-ground resources for recruitment, vernacular support, and field testing. The 2025 cycle had a project that delivered the technical MVP cleanly but was penalized 10% because the user-testing portion was thin, so this is a recurring committee concern.

  5. Optional but encouraged. Add a verifiable checkpoint at the end of each milestone (a public release tag, a recorded demo, or a published tx hash). For the existing proposal, appreciate sharing the transaction hash of the successful multi-hop RUSD payment in the proposal itself. This both strengthens the credibility of the application and feeds directly into the “How to Verify” framework above.

Looking forward to the revised draft.

Best,

CC @xingtianchunyan

6 Likes

Hi @zz_tovarishch ,

Thanks for the detailed feedback, I’ve updated the proposal to address all the points you raised.

  • Added a comprehensive “How to Verify” section with reproducible checks for the phone-to-pubkey registry, M-Pesa STK Push/B2C flows, and pilot data (including public endpoints, transaction hashes, and demo recordings).
  • Expanded the funding breakdown into full line-item detail, including USSD costs (Africa’s Talking), M-Pesa fees, pilot float, user incentives, and developer time.
  • Clarified CKB-only disbursement and added a mitigation strategy for exchange rate risk.
  • Included an Execution Risk & Mitigation section confirming that Daraja production credentials are already secured and outlining local, on-the-ground user recruitment and testing capacity.
  • Added verifiable checkpoints per milestone .

Let me know if there’s anything else you’d like refined before committee review.

Best,
duongja

3 Likes

@duongja 你好,感谢你提交 Dular 项目提案,并根据预审建议补充了 How to Verify、预算拆分与风险说明等内容。整体方向(Fiber + RUSD/UDT + 真实在地试点)很契合 Spark 对“可落地、可验证”的资助导向。

本项目当前状态暂定为 Pending,并非否定项目价值,而是表示:在进入下次正式评审/投票前,我们还需要你补齐两类“可验证凭据”,并纠正提案中关于 CKB 发放与汇率折算机制的表述,以避免后续沟通成本与验收争议。


1) 请补充:Daraja 生产环境凭据的可视化证据。

你已声明持有 STK Push + B2C 生产凭据,请通过私信发我一张 Daraja Developer Portal 的后台截图(API Key 字段可全部打码,但需保留 Production 环境标识、App 名称、创建时间)。这一步用于委员会内部尽调,不会公开。委员会在验证后,会在本帖中发布一条信息,说明已经核验。


2) 请补充:现有 multi-hop RUSD payment 的可核验证据。

为了让委员会/社区能低成本持续复核你的技术交付(而不是只在结项时“补材料”),请在主楼直接给出对应的 Fiber payment hash 或相关 CKB testnet tx hash,并简要说明 Fiber payment hash 与 CKB L1 explorer 的对应关系(避免读者误以为每笔 Fiber 支付都能在 CKB explorer 直查)。


3) 关于 CKB 发放与汇率风险:请修正提案中的流程假设,并按 Spark 口径重写

你在提案的 “CKB Disbursement & Exchange Rate Risk” 中写到:

“The CKB amount per milestone will be calculated at the market rate on the day of disbursement, per standard Spark procedure.”

这里需要更正:Spark 的标准口径不是“每次发放按当日汇率重新折算 CKB”。

Spark 2026 资金口径:

  1. 发放币种:当前周期 Spark 资助仅支持100% 以 CKB 形式发放
  2. 折算口径(锁定):委员会通常以 USD 口径沟通资助额度以便横向对比;但若以 CKB 发放,则会在项目审批通过时点以当时参考汇率折算并确定该项目的 CKB 总额,并在对外决议/公告中公示。后续发放以约定的 CKB 数额为基准执行,不随每次发放当日价格重新折算。
  3. 汇率风险:审批通过后至实际支出期间,CKB 价格波动导致的购买力变化风险由提案申请人/团队自行承担,这是CKB生态相关grants的惯例。对存在法币硬成本的项目,建议在收到款项后及时换汇/锁定硬成本,并在预算中清晰区分“硬成本 vs 人力成本”。

下一步

请根据上述内容优化提案后,在本帖回复“已更新”并@xingtianchunyan,并标明你更新了主楼的哪些小节/新增了哪些链接或附件。委员会会在信息齐备后尽快推进正式评审流程。

祝好,
行天
代表星火计划委员会

3 Likes

Updated @xingtianchunyan

I have updated the following sections of the main post:

  • Existing Progress
    • clarified that the prototype has a public testnet multi-hop RUSD payment
      proof
  • Public Testnet Multi-Hop RUSD Proof (new subsection added)
    • added the completed Fiber payment hash
    • added the route / hop pubkeys
    • added the delivered amount and routing fee
    • added the relevant channel funding tx hashes + output indexes
    • added a short explanation clarifying the relationship between the Fiber
      payment hash and CKB L1 explorer records
  • CKB Disbursement & Exchange Rate Risk
    • corrected the disbursement language to match Spark’s standard procedure

Links / evidence added to the main post:

  • Fiber payment hash:
    0x20fd6c4a9d9e207420b4f55b4ae095eee9840fca1678afc89f9065298fe4a9e2
  • Channel funding tx hash:
    0xefdb791ac44ba1af435ae2b22f5572862519865990185d3c0d0cd5bd068e9e39 (output
    index 0x0)
  • Relay channel funding tx hash:
    0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c (output
    index 0x0)

Also Sent you the Visual evidence of Daraja environment credentials via DM.

3 Likes

Hi @duongja

很高兴通知你:Spark Program Committee 已通过 Dular 提案,资助金额为 $2,000 USD(100% 以 CKB 支付,0.001420 CKB/USD, 1,408,451 CKB)

我们认可 Dular 项目把 Fiber Network 的能力落到“真实用户可用”的移动支付场景,并将 30 人试点与结构化用户反馈报告写成明确交付项,符合 Spark 对“可落地、可验证”的资助导向。恭喜,也期待你把这个方向做成社区可复用的参考实现。

接下来请你在本帖回复确认以下事项:

1. 资金与钱包地址

资助总额 $2,000 USD(当前周期 Spark 资助 100% 以 CKB 形式发放),首笔(20%)将尽快发放。请提供接收资金的 CKB 钱包地址。剩余 80% 采用灵活模式:可在每周同步时按需申请,也可在结项时领取。

2. 每周同步

我们希望建立固定的周同步机制,有两种方式:

  • 在本帖进行文字同步,每周固定时间更新进展,委员会回复反馈。
  • 简短的视频通话。请告知你的偏好和方便的时间。

3. 提案内容锁定

提案获批后,我们会将当前版本的提案帖锁定,作为后续交付验收的参照基准。这是所有 Spark 获批项目的常规流程。如果开发过程中需要调整,可以在每周同步时沟通并记录。

再次恭喜,期待合作!

祝好,
行天
代表 Spark Program 委员会

4 Likes

Hi @xingtianchunyan and the Spark Program Committee,

Thank you so much for the approval and the warm welcome! thrilled to be part of the Spark Program and look forward to working together.

Here are the details and preferences regarding the next steps:

  1. CKB Wallet Address: ckb1qyqvw6dpjrle0e4w8cjemehg2nyvym4l99uqzexgpp
  2. Weekly Sync: We prefer the text-based updates option. We will post our progress updates directly in this thread every Thursday by 5:00 PM UTC.
  3. Proposal Content Lock: Understood and agreed. We will use the locked proposal as our baseline and will bring up any necessary development adjustments during our weekly updates.

Thank you again for this opportunity!

4 Likes

Hi @duongja,收到,每周四在本帖文字同步没问题,首次周报的时间将定于5月28日。

Dular 项目金库的地址

ckb1qrg6n7rh4mfltcruh8zjkcdtjmgx7fg2u6yre3ls5fprmvyhdlyzzqgmrw6q4f2tahs6qv588764w9dhuts09gqry34sp

首笔启动资金(281,800 CKB ,20%)已发放:

0xbbafcdb1903b6db53befc7bcc14283a0f70ea07db4c3c01356d2177ea527c084

请确认到账。期待 Dular 项目的首次进展更新。

祝好
行天
代表 Spark Program 委员会

3 Likes

Received

Hello, Find the detailed Milestone 1 Report in the google docs

Milestone 1 Report

2 Likes

Hi Duongja, 谷歌文档没有开放权限

另外,为了方便社区更容易跟进项目的进度,建议直接在Nervos Talk上发布(就像其他项目那样,主要内容直接发布,代码部分用github, 必要的外部内容可以使用跳转的链接)

Dular Milestone 1 Verification Report

Opening Note

Apologies for the delay in submitting this Milestone 1 report. The delay was caused by unavoidable circumstances while finishing the hosted verification API, collecting evidence, and confirming that the public testnet/Fiber evidence was presented clearly. Going forward, I will keep the original reporting cadence stated in the proposal: Thursday reporting, without delays.

Milestone 1 Scope

Milestone 1 covers:

  • Phone number identity registry.
  • OTP-based phone verification.
  • Public phone-to-Fiber pubkey lookup API.
  • M-Pesa STK Push deposit flow using production Daraja credentials.
  • RUSD crediting after successful M-Pesa payment and Fiber-backed settlement.
  • Public evidence that reviewers can verify without trusting my word.

B2C withdrawal is the only part of the original M-Pesa ramp that is not fully working yet. The blocker is not the Dular application code path; it is access to the correct M-Pesa Org Portal initiator password/security credential. The initiator password setup button was unavailable/blurred on the M-Pesa Org Portal, so I am currently in communication with Safaricom developer relations to resolve the initiator credential issue. I expect this to be sorted out before Milestone 2 reporting.

Source Code Evidence

The source code is public:

  • GitHub repository: GitHub - duongja/Dular · GitHub
  • Latest implementation/evidence commit before this report: d7beff1
  • Vercel API deployment support commit: 5e049bb
  • Database-backed registry cleanup commit: 3aad8e9
  • Screenshot evidence commits: 9be2df6, d7beff1

Relevant source files:

  • server/index.js — Express API routes for OTP, registry lookup, M-Pesa deposit callbacks, transactions, and verification endpoints.
  • server/schema.sql — PostgreSQL schema for users, OTP requests, sessions, M-Pesa transactions, Fiber payments, callbacks, and ledger entries.
  • server/services/africasTalking.js — OTP SMS provider integration.
  • server/services/daraja.js — Safaricom Daraja STK Push, STK query, and B2C request logic.
  • server/services/fiber.js — Fiber RPC integration.
  • server/services/settlement.js — Fiber-backed deposit settlement and RUSD ledger crediting.
  • server/seed-registry.js — reviewer/local seed script for a phone-to-pubkey registry entry.
  • api/index.js and vercel.json — hosted API deployment adapter for Vercel.

Public Registry API

The public registry API is live on Vercel:

https://dular.vercel.app/api

Health check:

curl https://dular.vercel.app/api/health

Example response observed during verification:

{"ok":true,"mode":"production","dbTime":"2026-06-05T20:28:01.317Z"}

Phone-to-pubkey lookup:

curl "https://dular.vercel.app/api/registry/lookup?phone=%2B254718948041"

Verified response:

{
  "phone": "+254718948041",
  "fiberPubkey": "0232739a0e4af969db12b003dbcaf90b370ab78355078fc02d81d4d072df3e7087",
  "verifiedAt": "2026-06-03T18:59:56.794Z",
  "lookupProof": {
    "source": "database",
    "publicEndpoint": "https://dular.vercel.app/api/registry/lookup?phone=%2B254718948041"
  }
}

Another verified lookup:

curl "https://dular.vercel.app/api/registry/lookup?phone=%2B254706306515"

Verified response:

{
  "phone": "+254706306515",
  "fiberPubkey": "02c963a086524e2da9366a587008f09740675c1cf4d3a29b6404e99d29ac8cc1fe",
  "verifiedAt": "2026-06-05T10:44:50.721Z",
  "lookupProof": {
    "source": "database",
    "publicEndpoint": "https://dular.vercel.app/api/registry/lookup?phone=%2B254706306515"
  }
}

404 behavior for unregistered numbers is also live:

curl "https://dular.vercel.app/api/registry/lookup?phone=%2B254000000000"

Expected response:

{"error":"Phone number is not registered"}

Registered Phone Identity Records

The current registry contains the following verified test records:

Phone Fiber pubkey Status

| +254706306515 | 02c963a086524e2da9366a587008f09740675c1cf4d3a29b6404e99d29ac8cc1fe | Verified |
| +254718948041 | 0232739a0e4af969db12b003dbcaf90b370ab78355078fc02d81d4d072df3e7087 | Verified |

The public lookup endpoint is database-backed. There is no hardcoded/static fallback pubkey in the hosted registry response.

Registration / OTP Evidence

The OTP registration flow is implemented and tested using Africa’s Talking SMS delivery.

Screen recording covering the OTP flow and STK Push:

https://drive.google.com/file/d/1bWI5LG1LBsec0Pui2JF4QTPXNhpnNGU-/view?usp=drive_link

GitHub screenshot evidence:

  • Original OTP screenshot: verification/milestone-1/screenshots/raw/otp-delivery-nexuspay-original.jpeg

The screenshot shows SMS sender delivering Dular verification codes. The source code path is:

  • POST /api/auth/request-otp creates an OTP request and sends SMS.
  • POST /api/auth/verify-otp verifies the code, creates/updates the user, stores verified_at, links fiber_pubkey where available, creates a session, and initializes a ledger account.

M-Pesa STK Push Evidence

Production STK Push was tested with real KES payments to NEXUSPAY/Dular. The screen recording above covers the STK Push user flow.

GitHub screenshot evidence:

  • Original M-Pesa receipt screenshot: verification/milestone-1/screenshots/raw/mpesa-stk-nexuspay-original.jpeg

The M-Pesa screenshot shows KES 1 payments sent to NEXUSPAY LIMITED for Dular account references. The original screenshot is included because the committee may want to verify actual receipt details; the redacted copy is also included for public-safe sharing.

June 5 Production STK Test Results

The following June 5, 2026 production STK Push tests were recorded in the database. Completed rows are the successful proof rows; failed rows are included for transparency as cancelled/no-response attempts.

Time UTC Phone KES Status CheckoutRequestID Fiber payment hash
2026-06-05 09:58:33 +254706306515 1.00 failed ws_CO_05062026125835693706306515
2026-06-05 10:02:11 +254706306515 1.00 completed ws_CO_05062026130221070706306515 0xe56221768012b1147e7b13d8a41d41b22ddb8b07ee72f7da107e99ccb8eb274f
2026-06-05 10:23:27 +254706306515 1.00 failed ws_CO_05062026132334950706306515
2026-06-05 10:24:39 +254706306515 1.00 failed ws_CO_05062026132439888706306515
2026-06-05 10:25:07 +254706306515 2.00 failed ws_CO_05062026132508171706306515
2026-06-05 10:25:36 +254706306515 100.00 failed ws_CO_05062026132536163706306515
2026-06-05 10:26:11 +254706306515 1.00 failed ws_CO_05062026132611459706306515
2026-06-05 10:28:38 +254706306515 1.00 completed ws_CO_05062026132839139706306515 0x6119909019626b3765181a62b9f1959c9d70ca896532d90cdb9889785b0b6d15
2026-06-05 10:45:20 +254706306515 1.00 completed ws_CO_05062026134521731706306515 0x5be88335953f2511b1f40b91ff14ddb99673de16dfc603fd76355689e87a3aa4

For the three completed rows, fiber_status = Success, fiber_fee_base_units = 0, and the RUSD ledger was credited after settlement.

Public Verification Endpoint for Deposits

A reviewer can inspect deposit proof by CheckoutRequestID:

curl https://dular.vercel.app/api/verification/deposit/ws_CO_05062026134521731706306515

Other completed examples:

curl https://dular.vercel.app/api/verification/deposit/ws_CO_05062026132839139706306515
curl https://dular.vercel.app/api/verification/deposit/ws_CO_05062026130221070706306515

These endpoints return the M-Pesa transaction row, Fiber payment hash, status, amount, timestamps, and linked Fiber payment record where present.

Fiber / CKB Testnet Evidence

Important distinction: Fiber payment hashes are off-chain payment identifiers. They are not CKB L1 transaction hashes, so they should not be expected to appear as standalone transfers on the CKB explorer. What appears on the CKB explorer are channel lifecycle transactions, especially channel funding cells. The individual RUSD payments occur off-chain inside those channels.

Today’s successful Fiber payment hashes:

0xe56221768012b1147e7b13d8a41d41b22ddb8b07ee72f7da107e99ccb8eb274f
0x6119909019626b3765181a62b9f1959c9d70ca896532d90cdb9889785b0b6d15
0x5be88335953f2511b1f40b91ff14ddb99673de16dfc603fd76355689e87a3aa4

Relevant CKB testnet L1 channel funding transactions:

0xcd0f48335321040a477b01cbedd9c5559ab0fc65b743abbe5472edc875bc0154
0xefdb791ac44ba1af435ae2b22f5572862519865990185d3c0d0cd5bd068e9e39
0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c

These were checked against CKB testnet RPC and returned committed status:

CKB tx hash Status Block
0xcd0f48335321040a477b01cbedd9c5559ab0fc65b743abbe5472edc875bc0154 committed 0x145198c
0xefdb791ac44ba1af435ae2b22f5572862519865990185d3c0d0cd5bd068e9e39 committed 0x1409d17
0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c committed 0x125c4b1

Earlier public multi-hop RUSD proof is also included in the repo:

PUBLIC_TESTNET_MULTIHOP_RUSD_PROOF.md

Key multi-hop proof:

  • Fiber payment hash: 0x20fd6c4a9d9e207420b4f55b4ae095eee9840fca1678afc89f9065298fe4a9e2
  • Route: local nodeA → public node1 → public node2
  • Delivered amount: 100000000 base units = 1 RUSD
  • Routing fee: 100000 base units = 0.001 RUSD
  • Funding tx to public node1: 0xefdb791ac44ba1af435ae2b22f5572862519865990185d3c0d0cd5bd068e9e39, output 0x0
  • Funding tx to public node2: 0x6156f3a8f46063d529f74df2a40407fc79ac70322615d2e862875eedf2b6a79c, output 0x0

The second relay channel funding cell uses Fiber FundingLock and public testnet RUSD type script:

  • FundingLock code hash: 0x6c67887fe201ee0c7853f1682c0b77c0e6214044c156c7558269390a8afa6d7c
  • RUSD type script code hash: 0x1142755a044bf2ee358cba9f2da187ce928c91cd4dc8692ded0337efa677d21a

B2C Withdrawal Status

B2C withdrawal is not complete yet. The implementation exists in the codebase, but live payout execution is blocked by the M-Pesa Org Portal initiator password/security credential issue.

Current status:

  • STK Push deposit path works with production Daraja credentials.
  • B2C code path exists in server/services/daraja.js and POST /api/mpesa/withdraw.
  • The required initiator credential could not be completed because the M-Pesa Org Portal initiator password control was unavailable/blurred.
  • I have contacted Safaricom developer relations and am working with them to resolve this.
  • I expect this to be fixed before Milestone 2 reporting.

Sandbox / Non-Kenyan Reviewer Fallback

For reviewers without Kenyan M-Pesa access:

  • The code can be cloned and run locally.
  • DEMO_MODE=true can be used for local development/provider mocks.
  • npm run migrate initializes the PostgreSQL schema.
  • npm run registry:seed -- +254700000001 <actual_fiber_pubkey> can seed a local registry record.
  • GET /api/registry/lookup?phone=+254700000001 can verify the lookup behavior.
  • Safaricom Daraja sandbox credentials can be used against the same integration code path for STK Push simulation.

Summary

Milestone 1 is substantially complete for phone identity, OTP verification, public registry lookup, production M-Pesa STK Push deposits, and Fiber-backed RUSD crediting evidence.

Completed:

  • Public hosted API is live.
  • Phone-to-pubkey registry is database-backed and publicly verifiable.
  • OTP flow is implemented and evidenced by screen recording and screenshots.
  • Production M-Pesa STK Push was tested with real KES payments.
  • Successful deposits produced Fiber payment hashes and credited RUSD after settlement.
  • Relevant CKB testnet channel funding transactions are listed and committed on-chain.
  • Source code and verification artifacts are public in GitHub.

Outstanding:

  • B2C withdrawal is blocked by M-Pesa Org Portal initiator password/security credential setup, currently being resolved with Safaricom developer relations.

I’m requesting a payment of 281800 CKB.

3 Likes