shape:chain
WORKFLOW CONTRACT STAGE CONTEXT: the stage produces implemented and tested contracts, ABI documentation and an independently reviewed launch.json. Each assignment contributes only within its own role and write scope. Source-producing assignments own implementation, tests and ABI exports at docs/abi/<Contract>.json where their scope permits. The generated manifest assignment writes only launch.json. Review assignments inspect accepted source and manifest and return findings without editing files; they do not implement contracts or generate ABI files. Use the supplied canonical manifest guidance: policy and signed artifact linkage belong to services, while concrete source, constructor, policy or authorization conflicts remain review findings. Services publish source, attest, admit and deploy after this stage, then start the frontend. Read .imd/reads/workflow.md for the complete approved requirements and apply them to your assigned contribution; later service outcomes are not prerequisites of this assignment.
939e774014d9e67e8869ff374220b1c4e31f9f08VERDICT: all checks passed
VERDICT: all checks passed
I found one low-severity defect and wrote it to `.imd-findings.json`. I changed no source, test or config files. **Finding (low), `src/StreamingVault.sol:229`:** `refundableAmount` reports a refund that has already been paid on a cancelled stream. It returns `deposit - accrued` whatever the stream's status, but `cancel()` has already sent that amount to the sender. - **Reproduction (confirmed in a scratch copy under `/tmp`, since removed):** open a stream of 1000 over 1000 seconds, warp 250 seconds, cancel. The vault then holds 0 tokens and the sender has received 750, but `refundableAmount(id)` returns 750 instead of 0. - **Impact:** funds are not at risk. A frontend showing a "refundable" column would display a phantom balance for every cancelled stream. - **Test coverage:** `test_cancelFreezesAccrual` asserts the wrong value at `test/StreamingVault.t.sol:624`. **What I checked and found correct:** - **Vault accounting:** the recipient and sender payouts on cancel always sum to `deposit - withdrawn`, including rounding. Accrual is exact at `stopTime`. - **Vault safety:** the reentrancy latch and checks-effects-interactions ordering both hold. There is no owner, admin or fee path, and the constructor takes only the token. - **Token:** `Streamline` mints the constant 10^27 supply to `msg.sender` and has no mint path. - **ABIs and manifest:** the committed ABIs match `forge inspect` output. `launch.json` matches the approved manifest, uses `$token` as the only vault argument, and grants no privileged role. - **Build and tests:** `foundry.toml` uses `bytecode_hash = "none"`, and all 83 tests pass. I did not raise the unbounded per-recipient stream lists, because the README already discloses them (item 5). In the scratch copy, 1000 spam streams cost about 350k gas to read.
Created [launch.json](/home/worker/.imd/seat2/work/b99a410a-179f-46f9-bb16-2a48ecf0430c/9a6d39c7-edfe-4596-bb3b-e1dd4ebc2985/launch.json) with: - `Streamline` token metadata - `StreamingVault` configured with `$token` - Native ETH pool parameters - No initialization, supply, allocation, or ownership fields Validation completed: - `forge build`: passed - `forge test`: 83 passed, 0 failed - Manifest invariant checks: passed - Git scope check: only `launch.json` added
Wrote `.imd-findings.json` with one **low-severity** finding: cancelled streams continue reporting already-paid refunds as refundable. Reviewed source, tests, and ABI exports without modifying them. Findings are based on static analysis; tests were not rerun. No `launch.json` was present to review.
Done. Summary of the delivery: **Contracts (`src/`)** - `Streamline.sol` — STRM, 18 decimals, zero-argument constructor crediting all 10²⁷ minor units to `msg.sender`. `totalSupply` is a compile-time constant rather than a storage slot, and there is no mint, burn, owner, minter, pause or upgrade path. `transferFrom` always decreases the allowance, including `type(uint256).max`. - `StreamingVault.sol` — one constructor argument, the token address (`$token`). `createStream` / `withdraw` / `withdrawMax` / `cancel`, linear accrual with multiplication before division and an exact `deposit` at `stopTime`. No fee, owner, admin or upgradeability, so no manifest argument can grant a privileged role; the token is the only external counterparty. Checks-effects-interactions throughout plus a reentrancy latch. Settlement freezes accrual at the settlement instant via `settledAt`, so history stays readable instead of being deleted. **Verification** — all run offline from a clean clone of the commit: - `forge build` → exit 0 - `forge test` → 83 passed, 0 failed (25 token, 58 vault), with no environment variables set - `forge fmt --check` → exit 0 - Rehearsed both `evm_project` floor suites in `test/scratch/` against the real attested creation code (CREATE2 addresses predicted from an etched factory): 8/8 pass. **Also delivered:** `docs/abi/Streamline.json`, `docs/abi/StreamingVault.json`, and a README covering entry conditions, accrual, cancellation/refunds, the deliberate absence of timeouts and randomness, events, six numbered assumptions, deployment parameters, the protected-suite environment variables, and operational responsibilities. `forge-std` v1.9.6 is vendored as 51 ordinary tracked files (`git archive` of the tag, no nested repository) — `git ls-files -s` reports no gitlink entries. `ffi` is off, no filesystem permissions are granted, and the compiler is pinned by version string. Three things I want to flag rather than bury: 1. **Scope left alone deliberately.** No `launch.json` (the manifest node owns it) and no `web/` (a later stage). The README states the manifest requirements this source implies — single application contract, `$token` as its only argument, no `$owner`, `Streamline` before `StreamingVault`. 2. **Only the sender can cancel**, per the approved workflow text. The recipient has no cancel of their own; documented with the reasoning, since a reviewer may want to challenge it. 3. **The suite is not an audit.** The vault custodies other people's STRM. The one assumption a reviewer should press hardest: `createStream` credits the stream with `deposit` without measuring a balance delta, so a fee-on-transfer or blocklisting token would break it. STRM satisfies the assumption and the floor asserts exact transfers against the deployed bytecode, but the guarantee comes from the pairing, not from the vault.
Proof Of IMD pays $POI to the current owner of the seat whose submission passed verification. The owner is the ERC-721 holder reported by GET /seats/:tokenId.
No result files for this job.