Contracts
Plumb's on-chain surface runs on Base Sepolia (chainId 84532) during the public preview. All contracts are verified on Blockscout.
Addresses
| Contract | Address | Explorer |
|---|---|---|
PLMB | 0xE31e478A01AdF4a61813aE010B79875ed71e9f00 | Blockscout ↗ |
Settlement | 0x97e74C8EAEe37Da7D9A96676DFCD83850b1AEF5a | Blockscout ↗ |
HubRegistry | 0x08097d0a9b24779c6bf1a510473ce6776efbe492 | Blockscout ↗ |
PipeOracle | 0x6711393a52a2616b17a241b24dd262a5b0c885e6 | Blockscout ↗ |
PipeConsumer | 0xbf1ebe6191e32a436726861a3ecc4b6107ace06b | Blockscout ↗ |
The current rotated gateway signer (used by Settlement and PipeOracle) is 0xEB8BB06Ab3588ad6CF7Ba9B016dBF974Cfe3524e. Rotation is handled by the owner via setSigner() and published to SDK + explorer so downstream verifiers can validate post-rotation receipts.
ABIs
ABIs are pinned in the @plumb/contracts workspace as TypeScript consts:
import {
PLMB_ABI,
SETTLEMENT_ABI,
HUB_REGISTRY_ABI,
PIPE_ORACLE_ABI,
PIPE_CONSUMER_ABI,
} from '@plumb/contracts/abis';
deploymentForChain(84532) returns the same table as above.
Typical flows
Settlement.deposit(amount)
Top up credit. Transfers amount PLMB from the caller; indexer picks up the Deposited event and credits the ledger.
Settlement.checkpointReceipts(root, batch)
Operator-only. Batcher rolls up settled receipts into a Merkle root nightly.
HubRegistry.register(modelHash, uploader)
Admin-only during preview. Pins a (hash, uploader) tuple so future revenue can be routed to the uploader.
PipeOracle.request(modelHash, inputHash, callback)
Any contract can request inference. Returns a jobId; the worker emits JobFulfilled(jobId, result, sig) and calls IPipeCallback(callback).pipeCallback(jobId, result).
See /product/verification for a minimal consumer contract example.
Events
Settlement:
Deposited(address indexed addr, uint256 amountMicro, uint256 txBlock)
Checkpointed(bytes32 indexed root, uint64 receiptCount, uint64 totalCostMicro)
SignerRotated(address indexed from, address indexed to)
HubRegistry:
ModelRegistered(bytes32 indexed modelHash, address indexed uploader)
PipeOracle:
JobRequested(uint256 indexed jobId, address indexed caller, bytes32 modelHash, bytes32 inputHash)
JobFulfilled(uint256 indexed jobId, bytes32 resultHash)