# V3 Asset Accounting Hardening Handoff

## Scope delivered

- `PullPaymentsV3` now tracks per-asset pull-credit liabilities, uses OpenZeppelin `SafeERC20`, verifies exact sender and recipient balance deltas, and retains pause-safe `withdrawCredit` access.
- `RewardProgramV3` tracks `assetLiabilities`, exposes `assets(asset)`, `liabilities(asset)`, `isSolvent(asset)`, and `surplus(asset)`, and rejects fee-on-transfer and non-delivery ERC-20 funding/claims.
- `MutualAidPoolV3` has immutable payout caps, exact ERC-20 input/output checks, an explicit legal-contribution liability view, and a surplus-only owner recovery path.
- `TaskEscrowV3` supports exact ERC-20 task creation, immutable `maxTaskAmount`, immutable per-asset `maxAggregateLiabilityPerAsset`, immutable dispute decision timeout, duplicate/creator/unlisted bidder rejection, submitted and disputed permissionless default terminal paths, pull-payment settlement, asset solvency views, and surplus-only recovery.
- `VaultfireBIPVaultV3` has immutable `totalAssetCap`, ERC-4626-compatible capped `maxDeposit`/`maxMint`, and exact withdrawal delivery checks.

## Constructor changes

- `TaskEscrowV3(owner, treasury, feeBps, maxTaskAmount, maxAggregateLiabilityPerAsset, disputeDecisionTimeout)`
- `VaultfireBIPVaultV3(asset, owner, totalAssetCap)`
- `MutualAidPoolV3` retains its constructor shape; its supplied payout caps are now immutable and `setCaps` was removed.

## New tests

- Adversarial no-delivery, fee-on-transfer, and outbound-fee ERC-20 mocks.
- Fuzz tests of exact receipt, task settlement, per-task/per-asset caps, mutual-aid payouts, reward claims, and vault ERC-4626 paths.
- Explicit task coverage for open, assigned, submitted-default, disputed-default, refunds, duplicate bids, forced donations, surplus recovery, and solvency.

## Validation

- `forge fmt --check` passed.
- `forge build` passed.
- `forge test -vv` passed: 60 tests, 0 failures, 0 skipped.
