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.
bb63fdcb2481baeae0705a99a64a18b4a95383fbVERDICT: all checks passed
VERDICT: all checks passed
Created `.imd-findings.json` with no substantiated defects: ```json {"findings":[]} ``` Reviewed contracts, tests, ABI exports, and `launch.json`. All 61 Foundry tests pass, and exported ABIs exactly match compiled artifacts. No project files were modified.
I wrote `launch.json` at the repo root, and it's the only file changed. `forge build` succeeds, and `forge test` passes all 61 tests. Build and test don't exercise the manifest itself. I only confirmed it parses as JSON, and I didn't run it through the `LaunchManifest` schema. - **Token:** `DescentToken`, name "Descent", symbol "DSNT", 18 decimals. This matches `src/DescentToken.sol`, which has a zero-argument constructor and mints the whole supply to the deployer. - **Contracts:** one entry, `DutchAuction`, with `constructorArgs: ["$token"]`. That matches its single address-typed constructor parameter, `constructor(address token_)`. There are no `$owner` arguments, since the contract has no owner or admin, and there are no initialization calls. - **Pool:** ETH is the paired currency (zero address), fee 3000, tickSpacing 60, and initialPrice `79228162514264337593543950336`. I took these from the Sepolia values in the launch guidance, since nothing in the brief or code sets pool terms. The manifest has no hook field. - **Notes:** about 1,100 characters, well under the 4,000 limit. They describe the token, the auction rules, that no privileged role is granted, and that the price is a pool parameter, not a market valuation. The `initialPrice` lines up with a 1:1 raw ratio, and the notes call it that. Whether that suits the launch's supply split is a policy question for the services and reviewers.
Review complete. No substantiated defects found. Created [.imd-findings.json](/home/worker/.imd/seat2/work/0c556eed-ee68-43ca-9519-67ad93d1a2d4/543e1d23-696f-497e-91d9-d31abf1104f2/.imd-findings.json) with: ```json {"findings":[]} ``` All 61 Foundry tests pass, and both exported ABIs match the compiled contracts.
I've implemented the DSNT token and the `DutchAuction` contract, with tests, ABI exports and a README. `forge build`, `forge test` and `forge fmt --check` all pass offline, and all 61 tests pass. I also ran the two protected suites against my compiled bytecode in `test/scratch/`, using CREATE2 addresses I predicted myself. All 8 tests passed: token supply and decimals, no mint path, no forbidden opcodes, and the auction constructed with `$token`. `test/scratch/` is deleted, so it isn't in the delivery. **What's in the repo** - `src/DescentToken.sol` is a minimal ERC-20 with 18 decimals and a constant supply of 10^27 units. Its constructor takes no arguments and mints everything to the deployer. There is no mint, burn, owner or proxy path. - `src/DutchAuction.sol` takes only the token address in its constructor and has no owner, fee or admin. - `test/DescentToken.t.sol` and `test/DutchAuction.t.sol` hold the 61 tests, covering every path in the brief plus two fuzz tests. - `docs/abi/DescentToken.json` and `docs/abi/DutchAuction.json` are the ABI exports. - `README.md` documents the rules, assumptions, deployment parameters and who is responsible for what. - `foundry.toml` uses solc 0.8.26, `bytecode_hash = "none"`, no ffi and no filesystem access. - I vendored `forge-std` v1.9.7 into `lib/forge-std` as plain files, with no submodule. **Behaviour I chose where the brief left it open** - **Price:** it falls linearly from the start price to the floor and is quoted in wei per whole token. The whole lot costs `ceil(price × amount / 1e18)`, so a lot never costs zero. - **Timing:** buying is allowed up to and including the end time. Reclaiming is seller-only and only strictly after the end, so the two windows never overlap. There is no cancel before the end. - **Overpayment:** `buy` refunds any excess ETH to the buyer and reverts if the payment is short. I did this rather than requiring an exact amount because the price falls every second, so an exact-amount transaction would fail whenever it lands a block late. The contract never holds ETH. - **Escrow:** the lot must arrive in full, so a fee-on-transfer or false-returning token is rejected. - **Reentrancy:** state changes and events happen before external calls, and a reentrancy lock guards every entry point. - **Limits:** the floor must be above zero. Amount and start price must fit in 128 bits, and the end time must fit in 64 bits. **Tests** - **Success and failure paths:** creating, buying and reclaiming listings, with wrong amounts, unauthorized callers, unknown ids and double actions. - **Timing and pricing:** the exact end-time boundary, price monotonicity, and ETH conservation under fuzzing. - **Failing counterparties:** a seller that rejects ETH, a buyer that rejects the refund, and a token that returns false. - **Reentrancy:** attacks through a malicious token and through the seller's and buyer's ETH hooks, all blocked. **Left for later stages** - I didn't write `launch.json`. The README suggests the token and `DutchAuction` with `constructorArgs: ["$token"]` and no `$owner`. - The independent adversarial review is still required. Passing tests here is not an audit. - How the launch supply gets distributed is a launch-policy decision outside these contracts.
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.