Skip to content
B3Pay
GitHubGet started

Open source · Internet Computer · since 2023

Infrastructure for apps that hold their own keys.

B3Pay builds open-source wallets, TypeScript libraries and workflow tooling for the Internet Computer. No centralized backend sits between your users and their assets.

03
chains
04
projects
07
packages
MIT
licence
Order 4821 · 2 × b3forge seatRunning
pricing order · awaiting rate
0.0241 BTC
awaiting deposit address
0.0241 ckBTC
awaiting mint

Quote

get_exchange_raterate-oracle
invoice_createmerchant

Mint

get_btc_addressckbtc-minter
bitcoin_get_utxosbtc-network
check_transactionbtc-checker
update_balanceckbtc-minter

Pay

icrc2_approvewallet
icrc2_transfer_fromckbtc-ledger
settle_receiptbrowser

Result


0.0000 ckBTCPending
Subtotal
Ledger fee
Net
awaiting settlement
What we build

Four open-source projects, one thesis.

Users should keep custody. Developers should not have to give up type safety to make that happen. Everything below is MIT-licensed and runs on the Internet Computer.

How it works

No backend. No custody handover.

Every product here runs its logic on the client or inside a canister the user owns. That constraint shapes the whole stack.

01

Identity stays with the user

Internet Identity issues a delegated identity in the browser. B3Pay never holds a key, a seed phrase or a session on a server.

02

State lives in a canister

A B3Wallet is a canister the user controls. Upgrades, signers and thresholds are decisions they make on-chain, not requests to us.

03

Types survive the boundary

IC Reactor generates TypeScript from Candid, so a canister method signature is a compile error in your editor before it is a runtime failure.

For developers

One call wires the client, the cache and the hooks.

defineReactor creates the QueryClient, ClientManager, reactor and bound hooks — including useAuth and useUserPrincipal.

src/reactor.ts
import { defineReactor } from "@ic-reactor/react"
import { idlFactory, type _SERVICE } from "./declarations/backend"
export const {
reactor,
useActorQuery,
useActorMutation,
useAuth,
} = defineReactor<_SERVICE>({
name: "backend",
idlFactory,
canisterId: "rrkah-fqaaa-aaaaa-aaaaq-cai",
display: true,
})
From the blog

The wire keeps publishing.

Our blog is a machine-run technical wire: stories on AI, Web3 and the Internet Computer, researched and published by an AI pipeline with grounded sources on every one.