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.
855091d4d2f5dd432cd7ea5707eb905b7b47f8d5VERDICT: all checks passed
VERDICT: all checks passed
Created [.imd-findings.json](/home/identitymd/.identitymd/work/f35f97cb-6e88-4ce6-b044-efc6b8cd1741/aa1b131a-0711-468a-a163-0c485ea489c1/.imd-findings.json) with two reproduced findings: - **Medium:** Unauthorized first binding can block launch initialization. - **Low:** Aliased pool keys mask four validation test cases. ABI exports and manifest checks passed. No high or critical findings.
Done. `launch.json` is written and verified. The only change in the working tree is the new manifest. **What the manifest declares** - `kind` is the first field and is exactly `univ4_hook`. - Hook `PvPadHook` with a single constructor argument, the Sepolia PoolManager address, matching the one-parameter constructor in the source and the checked-in ABI. No placeholders. - Permissions `beforeInitialize` and `beforeSwap`, exactly what `getHookPermissions` returns (flags 0x2080, decimal 8320). - Token `PVP`, name Pepe Values Pepe, symbol PVP, 18 decimals. No supply or allocation fields. - Pool paired with native ETH, fee 3000, tick spacing 60, the only key the hook accepts. Initial price is sqrtPriceX96 for 1,000,000 PVP per ETH, in decimal. The workflow fixes no price, so the notes flag this as a manifest choice open to review. - Notes are 3987 characters, under the 4000 cap, and describe the bind wiring without instructing anyone to put sibling addresses in constructor args. **Verification performed** - Schema validation with a Draft 2020-12 validator against the canonical schema passes, and the initialPrice refinement holds. - The protected hook and token suites were run from scratch against the built creation code with flags 8320, the Sepolia PoolManager etched, and decimals 18. All 9 tests pass. - A scratch test opened the ETH/PVP pool through PvPad at the manifest price, confirmed slot0 and tick 138162, then completed a buy and a sell at roughly the expected rate. - `forge build` and `forge test` pass, 123 tests, 0 failures. Not done here: deployment, Sepolia fork rehearsal, and the independent review, which are separate stages.
The deliverable is complete and committed on `main` as commit `49e78c6`. A clean offline rebuild, all 122 forge tests, `forge fmt --check`, the ABI consistency check and the Python tests pass. **What was built** - **PVP token** at `src/PVP.sol`. Zero-argument constructor, name "Pepe Values Pepe", symbol PVP, mints exactly 10^27 minor units to its deployer. No owner, no mint path, holder burn only. - **PvPadHook**. Its constructor takes only the PoolManager, so the attested creation code carries one address word and nothing else. The pad and PVP are wired by a one-shot `bind` that `PvPad.initialize` performs on the hook. Permissions are beforeInitialize and beforeSwap only, flags 0x2080. Callbacks refuse any caller but the PoolManager, any sender but the bound pad, and any key but native ETH/PVP at fee 3000 and spacing 60. Liquidity is never gated. - **PvPad, KingOfThePad, WorkerSubsidy, PvPadFeeRouter, PvPadBurner** implement the approved economics: a fixed pad fee (default 100 bps) routed to the king's beneficiary with zero house cut, EOA beneficiaries paid in ETH and contract beneficiaries offered buy-and-burn with a pullable fallback, king claims forwarded entirely to workers with no payout to the dethroned king, and Merkle epochs opened only by the updater. **Verification** - 122 tests in 8 suites run against the real PoolManager code: supply and immutability, hook flags and opcode scan, bind rules including a front-run then recovery, trades with fee accounting, slippage, partial fills, reentrancy, epoch proofs, delivery rollback, and a stateful invariant on router ETH conservation. - The two protected floor suites were run from `test/scratch` against the built creation code with the Sepolia PoolManager address baked in and etched. All 9 tests pass, with and without `IMD_POOL_MANAGER` set. - The Python Merkle builder's root and proofs were cross-checked against OpenZeppelin `MerkleProof` in Solidity, and those vectors are pinned in its unit test. **Documentation and tooling** - `README.md`, `docs/deployment.md`, `docs/keeper.md`, `docs/review-notes.md`, `docs/manifest-notes.md`, `docs/dependencies.json`, and ABIs under `docs/abi/`. - `scripts/check.sh` runs the whole offline check. `scripts/merkle.py` builds epochs with a self-contained keccak. `scripts/mine-hook.py` mines the CREATE2 salt. **One design limitation to flag for the reviewer** Between hook deployment and `PvPad.initialize`, any contract can call `bind` first. This is a griefing window only: it cannot move funds and only forces a redeploy with a new salt. It follows directly from the rule that the hook constructor may carry no sibling address. The deployment doc says to close it by deploying the hook and calling `initialize` in one transaction and to verify `hook.pad()` before seeding liquidity. **Not part of this assignment** No `launch.json` was written. The manifest assignment has everything it needs in `docs/manifest-notes.md`. The pool in the manifest must be opened through `PvPad.initialize`, since the hook refuses a direct `PoolManager.initialize` from the service. Fork rehearsal, static analysis and the independent adversarial review remain open.
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.