Contracts

Plumb's on-chain surface runs on Base Sepolia (chainId 84532) during the public preview. All contracts are verified on Blockscout.

Addresses

ContractAddressExplorer
PLMB0xE31e478A01AdF4a61813aE010B79875ed71e9f00Blockscout ↗
Settlement0x97e74C8EAEe37Da7D9A96676DFCD83850b1AEF5aBlockscout ↗
HubRegistry0x08097d0a9b24779c6bf1a510473ce6776efbe492Blockscout ↗
PipeOracle0x6711393a52a2616b17a241b24dd262a5b0c885e6Blockscout ↗
PipeConsumer0xbf1ebe6191e32a436726861a3ecc4b6107ace06bBlockscout ↗

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)