Uang umrah jamaah dikunci per pos di Arbitrum One: hanya faktur vendor berlisensi yang bisa dibayar, ujrah setelah berangkat, siapa pun bisa refund.




Mabrur adalah kontrak real-world asset di Arbitrum One mainnet yang mengunci uang muka umrah setiap jamaah per pos (tiket, hotel, visa, ujrah), sehingga biro perjalanan hanya bisa membayar vendor berlisensi untuk jamaah itu sendiri dan siapa pun bisa mengembalikan sisa dana. Semua langkah demo adalah transaksi publik yang bisa diperiksa.
Coba langsung tanpa dompet: https://mabrur.edycu.dev
Jalur 30 detik untuk juri: https://mabrur.edycu.dev/judge
Pitch deck: https://mabrur.edycu.dev/pitch (PDF: https://mabrur.edycu.dev/Mabrur-pitch.pdf)
Proposal (PDF): https://mabrur.edycu.dev/Mabrur-proposal.pdf
Kode sumber: https://github.com/edycutjong/mabrur
Kontrak terverifikasi: https://arbiscan.io/address/0x36f1d899d9d4411b2DdfB60Dbbe989220336d2D5#code
Umrah dibayar di muka, sering berbulan-bulan sebelum berangkat, kepada biro perjalanan berizin (PPIU). Ketika biro memperlakukan dana itu sebagai modal kerja, jamaah baru membiayai keberangkatan jamaah lama sampai semuanya runtuh. First Travel: 63.310 calon jamaah, kerugian Rp 905 miliar (Kompas, 5 Jan 2023). Abu Tours: 86.720 jamaah, perkiraan Rp 1,8 triliun (Kompas, 29 Jan 2019). Sekitar 1,4 juta jamaah berangkat melalui PPIU pada 2024 (data SISKOPATUH via HIMPUH, sumber sekunder). Masalahnya bukan kurang aturan, tetapi dana yang tercampur dan tidak bisa diawasi sampai terlambat.
Mabrur menjadikan uang muka jamaah aset dunia nyata yang ia pegang sendiri: klaim atas layanan berizin yang tidak bisa dipindahtangankan mUMRAH), dipecah per pos TIKET · HOTEL · VISA · UJRAH.
1. Dana dipisah per jamaah — satu tanda tangan permit EIP-2612 + book(). Token mUMRAH tidak bisa ditransfer _update memblokir), jadi dana satu jamaah tidak pernah membiayai perjalanan jamaah lain.
2. Tidak ada yang memilih penerima — spend() membayar penanda tangan faktur EIP-712, dan hanya jika ia memegang klaim AIRLINE / HOTEL / VISA yang sah di ClaimRegistry (berbentuk ERC-3643, pemiliknya kunci regulator, tidak pernah agen). Tidak ada kolom alamat yang bisa diisi agen dengan alamat direkturnya.
3. Ujrah setelah berangkat — ujrah agen (maksimal 20 %) hanya terbuka dengan tanda tangan Departure dari jamaah, atau dari maskapai berizin yang dibayar dari pos tiketnya.
4. Tiket lunas atau sisa dana kembali — faktur tiket harus melunasi seluruh pos tiket (tiket Rp 1 ditolak FlightNotFullyPaid). Jika tiket belum lunas sebelum batas tiket yang ditandatangani jamaah, atau setelah tanggal berangkat lewat, siapa pun (tetangga, LSM, regulator) bisa memanggil refund() dan setiap rupiah yang belum terpakai kembali ke jamaah. book menolak tanggal berangkat lebih dari 180 hari.
5. Regulator membaca langsung — regulatorView(agency) dan conservation() menunjukkan booking terbuka, kewajiban dari buku besar setoran − pembayaran yang independen, dan bahwa semua dana jamaah dijamin rupiah di dalam kontrak.
6. Tanpa kunci darurat — tidak ada owner, pause, atau jalur upgrade yang menyentuh saldo.
Aplikasi (ID/EN): buku amanah jamaah, konsol agen yang mendekode setiap penolakan kontrak (simulasi tanpa dompet), halaman tanda tangan vendor, dan panel regulator.
- MabrurPBM: https://arbiscan.io/address/0x36f1d899d9d4411b2DdfB60Dbbe989220336d2D5#code
- ClaimRegistry: https://arbiscan.io/address/0xd5B731CD0f2c91D5D64b59d9E4a2A4E4b6315ADb#code
- TIDR (token uji tanpa nilai): https://arbiscan.io/address/0x66F838be32A624f4C797483a151C7f6209A43448#code
Empat percobaan curang agen ditambang sebagai transaksi gagal, masing-masing dengan nama error:
- EarmarkMismatch (faktur hotel Ibu Siti dipakai pada booking lain): https://arbiscan.io/tx/0x9ed30e3802f988fb2219a08c9d184ab779da13d2afbc7f9314d0ab3fa0bbc316
- VendorClaimMissing (faktur ditandatangani direktur agen): https://arbiscan.io/tx/0x887d6b86d4361666b883edb9624efbd9bef0cdc6e4b0244149433d964beffa61
- InvoiceReplayed (faktur yang sudah dibayar dikirim ulang): https://arbiscan.io/tx/0x952f30adf9d7cc08982d8128c5e0de85a241d92a2d0e099799df6c7a75b9619a
- NotDeparted (agen menandatangani "keberangkatan" sendiri): https://arbiscan.io/tx/0xe4855ebd72f05a8756a814cc8fbfb963b18f70bdd16856130cff391e1df5291b
Pembayaran tiket Rp 14.000.000 ke penanda tangan: https://arbiscan.io/tx/0x7bb513e7aa166844f26b49c2b94deb2b70ca62904de5b8afdaf23b114ac10590
Refund Rp 23.000.000 ke Ibu Siti oleh pihak ketiga: https://arbiscan.io/tx/0x13b8a1335b64ebaaef1a2e22de87c91f4c13604d224e2f06a3dcf51ca3f78666
Biaya per jamaah dari receipt asli: siklus lengkap 907.185 gas ≈ Rp 809, siklus refund 582.938 gas ≈ Rp 520 (ETH/IDR 44.563.294, CoinGecko, 9 Okt 2026) — sekitar 0,0025 % dari paket Rp 32.000.000.
- Kontrak — Solidity ^0.8.24 (dikompilasi dan diverifikasi dengan solc 0.8.33), OpenZeppelin 5.6.1 ERC20Wrapper, ERC20Permit, EIP712, ECDSA, ReentrancyGuard).
- Chain — Arbitrum One mainnet: biaya per jamaah di bawah Rp 1.000, verifikasi Arbiscan.
- Tooling — Foundry: unit, fuzz, invariant, dan skrip yang di-broadcast langsung ke mainnet (Setup, SeedDemo, DemoRun, DemoRefund, proof.sh, cost.sh).
- Aplikasi — Scaffold-ETH 2: Next.js App Router, wagmi + viem, RainbowKit; error kontrak didekode lewat simulateContract.
- Uang — tIDR, rupiah uji ERC20Permit tanpa nilai (decimals 0); wrapper menerima ERC-20 standar apa pun.
Quality & Security Engineering
- Kontrak: 87 tes forge test), termasuk 7 invariant × 256 run × kedalaman 100; cakupan baris · cabang · fungsi 100 % pada ketiga kontrak; tes regresi dinamai sesuai cacat yang dicegahnya.
- Frontend: tes unit Vitest dengan cakupan 100 % per file (ditegakkan di CI), E2E Playwright yang membaca Arbitrum One, 0 pelanggaran aksesibilitas (axe) dalam ID dan EN.
- Keamanan: CodeQL, Dependabot, gitleaks atas seluruh riwayat, secret scanning + push protection; 0 peringatan keamanan terbuka; 3 putaran review adversarial internal atas kontrak, putaran 3 bersih.
- CI/CD: GitHub Actions berlapis (kontrak, frontend Node 22/24, audit dependensi, build, E2E) → deploy otomatis ke Vercel + smoke check situs langsung.
- Bukti: script/proof.sh memutar ulang setiap revert yang ditambang dan mewajibkan nama error yang diharapkan; DEMO.md dibuat dari receipt broadcast yang di-commit.
- Celah "tiket Rp 1": tanpa aturan tambahan, pembayaran tiket sekecil apa pun bisa mematikan refund batas tiket. Kami mewajibkan faktur tiket melunasi seluruh pos tiket FlightNotFullyPaid) dan mengujinya.
- Registry penerbit klaim: review adversarial menemukan empat celah (penerbit menimpa klaim penerbit lain, penerbit yang ditambahkan ulang menghidupkan klaim lama, penyempitan topik, klaim kedaluwarsa yang memblokir). Diperbaiki dengan epoch per penerbit per topik, tes regresi, lalu redeploy dan verifikasi ulang di mainnet — putaran ketiga bersih.
- Demo tanpa vm.warp: di chain publik waktu itu nyata. Kami membuat skrip SeedDemo yang bisa dijalankan ulang sebelum setiap sesi, sehingga batas tiket Ibu Siti lewat tepat saat refund dipertunjukkan, dan memperbaiki UI agar tombol refund muncul sendiri saat tenggat lewat tanpa memuat ulang halaman.
Kepercayaan pada dana jamaah tidak perlu dibangun dari janji agen; ia bisa ditegakkan di jalur transfer token. Begitu penerima uang adalah penanda tangan faktur yang terverifikasi dan refund tidak membutuhkan izin siapa pun, pola First Travel tidak lagi bisa terjadi tanpa terlihat.
- Jalur uang produksi: token rupiah berizin (deposito tertokenisasi bank atau Rupiah Digital) sebagai pengganti tIDR.
- DP lalu pelunasan dan ujrah bertahap, tetap dalam satu booking yang sama.
- Integrasi regulator: penerbit klaim dari otoritas yang berwenang dan pelaporan ke sistem pengawasan umrah.
tIDR adalah token uji tanpa nilai. Kunci penerbit klaim adalah kunci demo pengganti Kemenag / IATA. Semua nama dalam demo fiktif ("PT Amanah Contoh Wisata", "PT Contoh GSA"). Mabrur tidak menjamin kursi; ia menjamin tiket lunas, atau setiap rupiah yang belum terpakai kembali.
Semua kode ditulis di dalam jendela hackathon. Commit pertama: 9 Okt 2026 10:38 WIB, setelah sprint dibuka pukul 10:00; seluruh riwayat publik di https://github.com/edycutjong/mabrur. Sebelum sprint hanya ada spesifikasi dan persiapan kunci/dompet.
- 10:38 — scaffold Scaffold-ETH 2 (Foundry), OpenZeppelin 5.6.1.
- 11:00 — tiga kontrak, 61 tes awal, deploy + verifikasi di Arbitrum One mainnet, skrip demo, transaksi demo pertama.
- 11:05–11:30 — tiga putaran review keamanan kontrak; empat temuan Low di ClaimRegistry diperbaiki, redeploy dan verifikasi ulang.
- 11:45–12:20 — aplikasi (jamaah, agen, vendor), /judge, DEMO.md dari receipt asli, CI/CD dengan deploy otomatis.
- 13:30 — 0 peringatan keamanan terbuka; cakupan tes 100 % pada kontrak dan frontend.
- Sore — landing page, pitch deck, video pitch berbahasa Indonesia, proposal, sakelar bahasa ID/EN, desain ulang visual.
- Hari 1 — walk-through mentor di venue (umpan balik: deploy di mainnet diapresiasi).
Belum menggalang dana. Proyek dibangun mandiri selama ETHJKT 2026 dan terbuka untuk diskusi dengan regulator, asosiasi penyelenggara umrah, dan penyedia rupiah berizin.