Operational playbooks, reconciliation guides, and policy docs
Trust
Audit posture, enforced safety properties, pause/drain plan, ownership controls, and support targets.
Pricing
Platform fee structure, minimums, batching coverage, and our Base gas sponsorship policy.
The BillingModule emits a Charge event every time a customer is billed. Each event includes:
Event topic (for log filters): 0x47c57412f9a6e6a175c6c8b61cf7256cab2f39c16b0f229b7d6862a5eecefe33
Tip: you can also copy the JSON-RPC log filter and run it from your scripts if you prefer code.
You can pull Charge events directly from a Base RPC using your favorite library. Below is an example with viem:
import { createPublicClient, http } from 'viem';
import { base } from 'viem/chains';
const client = createPublicClient({ chain: base, transport: http(process.env.BASE_RPC_URL!) });
const logs = await client.getLogs({
address: process.env.BILLING_MODULE_ADDRESS as `0x${string}`,
fromBlock: 0n,
event: {
type: 'event',
name: 'Charge',
inputs: [
{ name: 'account', type: 'address', indexed: true },
{ name: 'merchant', type: 'address', indexed: true },
{ name: 'amount', type: 'uint256', indexed: false },
{ name: 'usageId', type: 'bytes32', indexed: true },
{ name: 'timestamp', type: 'uint256', indexed: false },
],
},
});
console.log(logs[0].transactionHash, logs[0].args.usageId);The dashboard export (/v1/charges/export?format=csv) includes usageId, txHash, and blockNumber. To reconcile:
usageId.usageId; txHash and blockNumber should align between the on-chain log and the export.If you are using batching, multiple usageIds can share the same txHash. Block numbers still map to the block where the batch was settled.