{"assessments":[],"deployments":[{"attestationHash":"520573baf18fc4417280ddc49617ec04814dde8d447778d572270761cdf4651d","chainId":1,"contracts":[{"address":"0xbe916a53b9bbe634af7e10e604e06b6069edee76","blockNumber":26198165,"name":"Endowments","role":"other","txHash":"0x1806c02e5e38d4c8496476b3f3cf39f250a9d0c97ff5834c75a0475a12bd62fb"},{"address":"0x51bf8c74bd9bd74ad08cabdc90dac7835c18b21a","blockNumber":26198165,"name":"Zap","role":"other","txHash":"0x1806c02e5e38d4c8496476b3f3cf39f250a9d0c97ff5834c75a0475a12bd62fb"},{"address":"0xcbf0dddf07c00a78e2e7561a6f47c275b8c05d7e","blockNumber":26198165,"name":"Rules","role":"other","txHash":"0x1806c02e5e38d4c8496476b3f3cf39f250a9d0c97ff5834c75a0475a12bd62fb"}],"id":"833dbd2c-fb6a-44c7-81a0-f75292e202e8","manifestHash":"23cd1fc6b1630ee50c0899bafc11eb7fa86b1d0404b5f92e2ac7b36bf9873360","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"7f2023fc-fa1f-4a7f-a507-3bbc712c51d6","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"af671a367377b38c1bed15111de812938beff85017b3ee59c0405c42503767a0","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"fb8a2187c6ea2b26b77614487e62dfe5f8f9c63e5a9f0f9208bc269865793631","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"2b6ef932b31c4af02be7a06e9826e75fe81dd7ab98a4343e30baa3cb341414be","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"836aa89785bb21dcd3d8ef692a8f7b9c4ffb80a83b1f720121a42e4e93d89eb2","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"8c44bd4796267e3457be505504b00b445f6be8d7ed7e75842eae9437e278974b","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"593e5020258cf0a6dbdd089236cd3fb3d6f667cb2ae9a8cadb4d29c1bd5645c5","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"77a4adde8e7ba79d964cb0d9b4141081376eb3484181337feda01b0fa052427c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8db3dc487a713de6645b2da8f57495d88966f1d8c886413280b6fe7510a9f034","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"308a42304b2b7a431a0ae9ba228c9872855b5f207901720690a2feccfcfab1f6","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Please deploy this repository as it is: contracts only, on Ethereum mainnet. There is no token and no owner.\n\nIt holds three contracts, to be created in this order: Rules, Endowments, Zap. Their constructor arguments are in docs/LAUNCH.md: ten addresses in all, every one a literal. Three are existing mainnet contracts (IMD, the sIMD staking vault and Uniswap's v4 PoolManager) and three are contracts of our two earlier launches, live since 13 October 2026: Questions (0xEECE4628ceb091C13393fc64056Be8b8501fD3F6) of launch 1531, and WorkOrders (0x730CB6C845d896e33283d3A4Ed8967F8BAA778d2) and CrowdPots (0x8C2FfCdcb103659aa05c772b8F2059868B496EB5) of launch 1573. Some are given to more than one contract. No contract of this launch refers to another, so there is no $contract: reference, and no argument is $owner: no contract has an owner, an admin or a setter.\n\nNothing has to be called after deployment. The constructors make no external call and check no code size, so they run on an empty chain. There is no proxy, no initializer, no pausing and no minting; the runtime bytecode holds no DELEGATECALL, CALLCODE or SELFDESTRUCT. Zap has three functions that take ETH, because paying with ETH is what it is for; deployment sends none. forge test checks each of these statements (test/launch/LaunchC.t.sol).\n\nThe project builds with solc 0.8.26, EVM version cancun, optimizer 200 runs, via_ir, bytecode_hash = \"none\" and cbor_metadata = false, as foundry.toml already says. We believe no source file needs to change for the launch. The folder integration/ is a second Foundry project that tests these contracts against the sources of our earlier launches; forge build, forge test and forge fmt --check run from the root do not reach it, it builds only beside those two repositories, and it is not part of what is deployed. docs/THREATS.md, section 10, says what we checked in this code after the changes your pipeline made to our first launch and the findings your auditors raised on our second, and why each rule here is as it is.\n\nOne sentence on two rules we ask you to leave as they are: Rules.fire pays a rule's tip to whoever fires it first, and Endowments.harvest, open to anyone, sends yield only to the target the endowment's creator fixed, a contract included, because there is no earlier party to pay instead and no other address the money may go to (docs/THREATS.md, section 10, patterns 1 to 3).\n\nThe manifest we expect (also in docs/LAUNCH.md, where a test checks it against the code):\n{\n \"kind\": \"evm_contracts\",\n \"contracts\": [\n  {\n   \"contract\": \"Rules\",\n   \"constructorArgs\": [\n    \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",\n    \"0x730cb6c845d896e33283d3a4ed8967f8baa778d2\"\n   ]\n  },\n  {\n   \"contract\": \"Endowments\",\n   \"constructorArgs\": [\n    \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",\n    \"0x9efa934d9fad4ae28c998a40195646b965a97247\",\n    \"0xeece4628ceb091c13393fc64056be8b8501fd3f6\",\n    \"0x8c2ffcdcb103659aa05c772b8f2059868b496eb5\"\n   ]\n  },\n  {\n   \"contract\": \"Zap\",\n   \"constructorArgs\": [\n    \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",\n    \"0x000000000004444c5dc75cb358380d2e3de08a90\",\n    \"0x8c2ffcdcb103659aa05c772b8f2059868b496eb5\",\n    \"0xeece4628ceb091c13393fc64056be8b8501fd3f6\"\n   ]\n  }\n ],\n \"notes\": \"Contracts only. No token, no owner, nothing to call after deployment. Three arguments are contracts of our two earlier launches: WorkOrders and CrowdPots of launch 1573 and Questions of launch 1531.\"\n}","parentJobId":null,"planHash":"cd06ca1eb6d1b4d4b4f9950cd90fd455729e5dc9bc759773205bde7e193ee848","previousHash":"f5ace40fc50d95c3406e1b35570b68938f00bde6a7ccb5bf0a7cea8b10e62bba","projectId":"7f2023fc-fa1f-4a7f-a507-3bbc712c51d6","publication":{"commit":"6ad9a2022a27a9e8170275fdb6bf253bc214fe03","deliveredAt":"2026-10-15T13:15:33.575Z","repoUrl":"https://github.com/identity-md-launches/launch-1845-please-deploy-repository-contracts"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"2e6fcd94d162d93eb4876df5760778d83b75f7799332d2cf69eedf4ff24ff06d","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c872aaeb2e58b080","findings":[{"citation":"resolved","description":"`_strands` refuses the addresses Endowments knows would lose or misdirect IMD sent by plain transfer, but it cannot know this launch's sibling Zap, because no contract of the launch refers to another. Zap's `_returnEverything` (src/rules/Zap.sol:270-271: `uint256 imdLeft = IMD.balanceOf(address(this)); if (imdLeft != 0) IMD.safeTransfer(msg.sender, imdLeft);`) sends its whole IMD balance to whoever calls `buy`, `chipIn` or `fundMeter` next. So with Zap as a Recipient endowment's `recipient`, or as a Pot endowment's `fallbackBeneficiary`, the yield is not lost (which the NatSpec accepts) but goes to a third party chosen by timing. `harvest` is open to anyone, so the party who triggers the payout can also collect it in the same transaction. The same applies to a Rules PAY rule whose `pay.recipient` is Zap: Rules refuses only zero and itself (Rules.sol:397). This is Pattern 1/3 of docs/THREATS.md section 10 (a payout an observer can force and redirect) through a sibling contract. Depositors' principal is not at risk; the endowment's yield, or the PAY amount, is.","line":626,"path":"src/endowments/Endowments.sol","reproduction":"Deploy Rules, Endowments and Zap with the manifest's arguments. 1) Alice calls Endowments.createForRecipient(address(zap)), which succeeds because _strands(zap) is false, then deposit(id, 1_000_000e18); stake() runs and sIMD accrues yield so that harvestable(id) = Y >= MIN_HARVEST. 2) In one transaction Mallory calls Endowments.harvest(id), which safeTransfers Y IMD to Zap, and then zap.buy{value: 0.001 ether}(0, type(uint256).max). _returnEverything reads IMD.balanceOf(zap) = imdOut + Y and transfers all of it to Mallory. Expected: createForRecipient reverts BadTarget for an address that passes plain-transferred IMD on to arbitrary callers, or the yield reaches the intended target. Actual: Mallory receives Y, the endowment's whole harvest. The same steps with createForPot(potId, address(zap)) when the pot takes nothing (remaining == 0) send the whole harvest to Mallory through FallbackPaid. Possible fixes that keep the design: have Zap pay out only what the current call produced (imdOut - chipped) instead of its whole balance, so IMD that arrives by plain transfer stays put; or warn about it in createForRecipient/createForPot and the pages, with Zap's address listed beside the other refused targets in docs.","severity":"low","snippet":"        return to == address(0) || to == address(this) || to == address(IMD) || to == address(SIMD)","title":"Endowments accepts this launch's own Zap as recipient or fallback, and Zap hands every harvest to whoever calls it next"}],"hash":"2b6ef932b31c4af02be7a06e9826e75fe81dd7ab98a4343e30baa3cb341414be","nodeId":"e9ce319d-569c-4112-90c7-4111378e1804","outcome":"completed","summary":"I found one low-severity issue and nothing critical, high or medium. The results are in `.imd-findings.json`, with a coverage row for each of the 19 entry points. I didn't run any tests: an attempt at `forge build` was stopped after 500 seconds, so no build finished. The finding therefore has no test file; at low severity it doesn't need one.\n\n**The finding: an endowment can pay its yield to Zap, and the next caller of Zap takes it** (`src/endowments/Endowments.sol:626`)\n- **Cause:** Endowments refuses recipients it knows would lose IMD, but it can't refuse Zap because no contract in this launch refers to another. At the end of every `buy`, `chipIn` or `fundMeter`, Zap sends its whole IMD balance to the caller (`src/rules/Zap.sol:270-271`).\n- **Reproduction:** Alice calls `createForRecipient(zap)` and deposits. Once yield builds up, Mallory calls `Endowments.harvest(id)` and then `zap.buy{value: 0.001 ether}(0, type(uint256).max)` in the same transaction, and receives the whole harvest. `createForPot(potId, zap)` behaves the same way when the pot takes nothing, and so does a Rules PAY rule that names Zap as its recipient.\n- **Impact:** Depositors' principal is safe; only the yield (or the PAY amount) goes to the wrong party.\n- **Fix that keeps the design:** have Zap return only what the current call produced, rather than its whole balance. Otherwise, warn about Zap in the docs and pages.\n\n**What holds:**\n- **Rules:** the escrow accounting, the gas floor on condition reads, the exact check of what the hire desk pulls, the job-text character check, and the books built from the desk's own figures in `reconcile` and `recall`.\n- **Endowments:** `exit` and `withdraw` in both payout paths, the share split when IMD is staked, the margin `harvest` must leave, the price-drop guard, and the gas floors for paying into crowd pots.\n- **Zap:** the swap callback (signs of the amounts, the ETH it pays never above what was sent, settle and take) and the refunds.\n\n**Checked live on mainnet with `cast`:**\n- IMD's symbol is \"IMD\", and sIMD's underlying token is IMD.\n- Questions, WorkOrders and CrowdPots all have code, including the functions Zap and Rules call (`fundFor`, `chipInFor`, `MAX_DELIVERY`).\n- The ETH/IMD pool that Zap's code names (fee 1%, tick spacing 200, no hook) exists.\n\n**Not covered:**\n- I couldn't get the source of the live WorkOrders and Questions contracts (Sourcify has no match), so the desk's own checks are known only through the repository's stand-in contracts.\n- I didn't verify sIMD's code. Endowments' price-drop guard assumes sIMD's price never falls in normal use.","treeHash":null,"usage":{"cachedInputTokens":1610084,"inputTokens":40,"model":"claude-opus-5-5","outputTokens":27091,"runtime":"claude","turns":21,"wallClockMs":837848}},{"artifacts":[],"attempt":1,"bundleHash":"a8d8414d8d7d3421a9dfd7509df974995cf1c6e652834f197c88168a29ae9f21","device":"672c29f92850efe0","findings":[],"hash":"308a42304b2b7a431a0ae9ba228c9872855b5f207901720690a2feccfcfab1f6","nodeId":"83eebd60-01dd-478f-8a44-d530ca6b5288","outcome":"completed","summary":"The suite passes in full with the verifier's seed, and the three new files are formatted and lint-clean. No defect was found, so no findings file was written.\n\n**What I added** (24 tests, all under test/, on top of the 417 already there):\n\n- `test/rules/RulesEdges.t.sol` covers the 96-bit escrow ceiling: a top-up past it reverts with a checked-arithmetic panic and changes nothing, a deposit exactly at it fires, and a desk return that cannot be booked into a full escrow is freed by cancel. It also pins the escrow-at-cost line as a fuzz, the widest cooldown, order lifetime and feed age a creator can set, two rules sharing one feed each firing once per round, a feed whose rounds go backwards, an answer exactly at its maximum age, unknown ids on every function, and a rule whose condition reads Rules' own books under the transient lock.\n- `test/rules/ZapDelta.t.sol` drives the swap callback with a scripted pool manager that returns any packed 256-bit delta. A 2000-run fuzz over both signed 128-bit halves checks Zap accepts exactly the well-signed results within the ETH sent and pays out what the halves say. The corners of each half are pinned, including the lower half's sign bit not leaking into the ETH side.\n- `test/endowments/Endowments.edges.t.sol` covers the stake interval and pot-id boundaries with exact revert arguments, the views outside their domain, one depositor's withdrawal being paid from another's fresh deposit with the other then backed by shares and still paid to the wei, the creator's seed being non-refundable and harvested to the target, and an endowment everyone has left taking deposits again.\n\n**One edge worth knowing, not a defect:** a rule whose escrow sits at the uint96 ceiling cannot book a desk return through reconcile until the creator cancels. That needs about 79 billion IMD in one escrow and is recoverable, so I tested it rather than reporting it.\n\n**Still owed:** the fork runs under the fork profile against live mainnet state, which cannot run here without network.","treeHash":"83e9a7d2e5d7b2dd80282e715608652a1597ecc7","usage":{"cachedInputTokens":3257244,"inputTokens":740,"model":"claude-fable-5-1","outputTokens":36919,"runtime":"claude","turns":30,"wallClockMs":1293502}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"629adec6a25d9241","findings":[],"hash":"3bc31580c886dfed33faf326209001f90a0f112bf04732eac10bdc156d0380e5","nodeId":"8911bc68-0801-4988-b43c-c858a8cf8a79","outcome":"failed","summary":"clone failed: fatal: destination path '/var/lib/imd/seat-682/work/7f2023fc-fa1f-4a7f-a507-3bbc712c51d6/8911bc68-0801-4988-b43c-c858a8cf8a79' already exists and is not an empty directory.\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":516}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a11137177fc72d8b","findings":[{"citation":"resolved","description":"The meter branch of `_harvestPlan` refuses a harvest whose cut amount is below MIN_HARVEST (`room < MIN_HARVEST ? 0 : ...`, line 739), so a nearly full meter does not trigger a whole vault withdrawal for dust. The pot branch has no such cut: any nonzero `room` below `worth` becomes the harvest amount. `harvestable` reports the same value, so a keeper that acts on `harvestable(id) > 0` pays for a full vault withdrawal, the gas-floored 500k pot call and a Harvested/Settled event set to deliver one wei. Nothing is lost (the shares burned are exactly previewWithdraw(1) = ~124k share-wei, worth one wei, out of the yield; the fallback gets nothing) and the pot is then full so the next harvest pays the fallback, so this is a consistency and keeper-cost note, not a defect in custody. Boundary: `room` in (0, MIN_HARVEST) is treated differently by the two target kinds, and the documentation of `MIN_HARVEST` (\"The least IMD a harvest is run for\") does not hold on the pot path.","line":756,"path":"src/endowments/Endowments.sol","reproduction":"Offline suite state (EndowmentsBase): pot POT needs 1000e18. alice deposits 100e18 into the pot endowment; stake; wait a block; add 1% yield to the vault. A stranger chips 1000e18 - 1 directly into the pot, so `remaining(POT) == 1`. Now `endow.harvestable(potId)` returns 1 and `endow.harvest{gas: 850_000}(potId)` succeeds, returns 1, the pot receives 1 wei, the fallback beneficiary receives 0, and the endowment's shares drop by 124330 (previewWithdraw(1)). Expected by the MIN_HARVEST doc comment: NothingToHarvest, as the meter branch gives for room < 1e15. Actual: a one-wei harvest costing the caller ~900k gas.","severity":"info","snippet":"            if (room != 0 && room < worth) {\n                uint256 part = SIMD.previewWithdraw(room);","title":"Pot harvest has no MIN_HARVEST floor on the pot's room: a pot that needs 1 wei makes harvest spend ~900k gas to move 1 wei"}],"hash":"593e5020258cf0a6dbdd089236cd3fb3d6f667cb2ae9a8cadb4d29c1bd5645c5","nodeId":"457fff68-e52f-4eaf-9c87-ebdb372779cc","outcome":"completed","summary":"The review is complete. The findings file is written, the scratch tests are removed, and the working tree is otherwise untouched.\n\n**Outcome.** No substantiated money-losing defect in the Math Precision, Boundary or Numerical Gap areas. I recorded one informational note and a full coverage record (all 19 entry points plus two invariants) in `.imd-findings.json`.\n\n**What I checked, with concrete values**\n\n- **Endowments share math.** At the fixture's vault state one IMD-wei is about 125,572 share-wei, so `MARGIN` (1e12 share-wei) and `SEED` (1e12 IMD-wei, about 1.26e17 share-wei) are far larger than the rounding they absorb. A batch split costs an endowment under 3 share-wei, a withdrawal at most 1. I verified with scratch tests that a 1-wei deposit round-trips exactly, that 600 tiny exits after a harvest wear at most one share-wei each, and that a harvest drained to exactly `MARGIN` by a donation leaves the endowment whole after the next stake.\n- **Rules escrow math.** Every fire cost is bounded by `CostTooHigh` at creation, the uint96 downcast follows a `held >= cost` check, and uint96 additions revert rather than wrap at 2^96 IMD-wei, which is unreachable. The 32-byte-at-a-time spec filter is carry-free for every allowed byte and walks refused words byte by byte, so its positions match the desk's.\n- **Zap delta unpacking.** The arithmetic shift and int128 truncation reproduce v4's packed-delta signs, `ethSpent <= ethIn` is enforced, and the price limit is one above the minimum sqrt price.\n- **Boundary lead closed.** `createRule` does not pre-check `orderTtl` against the desk, but the desk only requires a future expiry, which the nonzero-TTL check guarantees.\n\n**The one note (info).** The pot branch of `_harvestPlan` has no `MIN_HARVEST` floor on the pot's `remaining`, unlike the meter branch. With the pot one wei short of full, `harvestable` returns 1 and `harvest` succeeds, burning about 124k share-wei and roughly 900k gas to move one wei. No funds are lost, so it is a consistency and keeper-cost observation only.\n\n**Not reached.** The real CrowdPots and Questions sources are not in this tree, so the 50k gas allowance for `remaining` and any minimum-chip or minimum-fund rule on the live contracts could only be checked through the project's own integration tests, not independently.","treeHash":null,"usage":{"cachedInputTokens":1983019,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":41121,"runtime":"claude","turns":33,"wallClockMs":803026}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5dd3af20ad7ac0c2","findings":[{"citation":"resolved","description":"Trust gap (access x asymmetry). createForMeter refuses a feed Questions states no cost for (line 310, FeedNotLive), so a meter endowment can only be created while its target can actually absorb yield. createForPot checks only that the pot id has been handed out (potId <= potCount). It does not ask CROWD_POTS.remaining(potId), so a pot that is already full, launched, expired or closed is accepted. For such an endowment _potRoom returns 0 on every harvest, the whole excess is offered to the pot, the pot takes nothing, and _forward pays everything to the fallback beneficiary (lines 942-947). The endowment is published in Created as kind=Pot with the pot id as target, but economically it is a Recipient endowment whose recipient is the fallback, who is chosen by the creator (and may be the creator). E6 in docs/THREATS.md says a full pot's later yield is the beneficiary's, but that describes a pot that fills after the endowment was announced; here the pot can be dead before anyone deposits, and the one on-chain check a depositor would rely on (the Created event's kind) says the yield funds a pot. No principal is at risk and the harvest goes to a party fixed at creation, hence low. Minimal fix that keeps the design: in createForPot, revert (e.g. PotNotCollecting) when CROWD_POTS.remaining(potId) == 0 at creation, mirroring createForMeter; a series always reports a non-zero remaining so it is unaffected.","line":326,"path":"src/endowments/Endowments.sol","reproduction":"State: CrowdPots has a single pot 1 that exists (potCount >= 1) and is full/closed, so remaining(1) == 0. Call Endowments.createForPot(1, attacker). Expected (by symmetry with createForMeter): revert, the pot cannot take yield. Actual: succeeds, emits Created(id, Kind.Pot, bytes32(1), attacker, creator). Then after deposits, stake and yield, any harvest(id): _harvestPlan room == 0 -> full excess; _forward: chipInFor takes 0 -> FallbackPaid(id, attacker, amount) with the whole harvest. Reproduced with the repository's MockCrowdPots: pots.open(1, 0); assertEq(pots.remaining(1), 0); e.createForPot(1, 0xBEEF) returns an id whose kind is Pot (test passed on this tree).","severity":"low","snippet":"        if (potId == 0 || potId > CROWD_POTS.potCount()) revert UnknownPot(potId);","title":"createForPot accepts a pot that already needs nothing, so a 'Pot' endowment can be a disguised recipient endowment for its fallback beneficiary (asymmetric with createForMeter's liveness check)"},{"citation":"resolved","description":"Branch asymmetry in createRule. For the condition, fields that do not apply are rejected with FieldNotUsed (line 380 for VIEW, line 383 for FEED), so a stored rule and its RuleCreated event agree. For the action, only the matching half is stored (lines 416-421) but nothing rejects the other half, and the event publishes the caller's whole RuleParams. A HIRE rule can therefore be created with p.pay = {recipient: X, amount: Y}: getRule(id).pay is all zeros, while RuleCreated.params.pay names X and Y. The NatSpec of RuleParams says 'Only the matching one of hire and pay is read and stored' but does not say the other is published. No funds move on the unused half (fire reads r.pay / r.hire from storage, which are zero), so this is informational: it only lets a creator publish misleading terms to indexers, keeper UIs and pages that decode RuleCreated instead of calling getRule. Minimal fix: in the ACT_HIRE branch revert FieldNotUsed when p.pay.recipient != 0 || p.pay.amount != 0; in the ACT_PAY branch revert FieldNotUsed when any field of p.hire is set (or at least kindHash/maxPay/orderTtl), mirroring the condition checks.","line":424,"path":"src/rules/Rules.sol","reproduction":"createRule with when = VIEW/GE on any target, action = ACT_HIRE, hire = {kindHash: keccak256('audit'), minPay 1e18, maxPay 2e18, deliverySecs 3 days, bond 0.25e18, orderTtl 1 day, flags 0}, pay = {recipient: 0xBEEF, amount: 5e18}, spec 'do the thing', deposit 0. Expected (by symmetry with lines 380/383): revert FieldNotUsed. Actual: succeeds; getRule(id).pay.recipient == address(0) while the decoded RuleCreated.params.pay.recipient == 0xBEEF and amount == 5e18. Verified with a scratch test on this tree against MockDesk (passed).","severity":"info","snippet":"        emit RuleCreated(id, msg.sender, p, spec, deposit);","title":"createRule refuses unused condition fields but accepts and publishes unused action fields (a PAY half on a HIRE rule, a HIRE half on a PAY rule)"}],"hash":"77a4adde8e7ba79d964cb0d9b4141081376eb3484181337feda01b0fa052427c","nodeId":"21ae5183-4bd8-444d-9c5c-f451a9890502","outcome":"completed","summary":"The review is complete and the findings file is written. No source file was changed, and the scratch test was removed.\n\n**Outcome.** The permission model of Rules, Endowments and Zap holds. I found no permission bypass, no confused deputy, no asymmetry that moves money to the wrong party, and no trust gap between the three contracts and their live siblings. Two minor issues are recorded in `.imd-findings.json`, one low and one informational.\n\n**What I checked, in my area.**\n- Every state-changing entry point (19 listed, plus `Rules.createRule`, which the verifier's list omits) was traced for its guard, its state writes and its failure paths. All 22 coverage rows are answered: 20 hold, 2 point to the findings.\n- Pashov's Access Control, Trust Gap and Asymmetry guides were applied item by item: inconsistent guards on shared storage, confused deputies through token approvals, paired functions (deposit/exit, stake/settle, create/harvest, fire/cancel/reconcile), branch diffs, and the seams between access, economics and asymmetry.\n- Trust roots on mainnet: all six manifest addresses carry code, sIMD's asset is IMD, the desk's constants match the mocks, every selector called on Questions, WorkOrders, CrowdPots, sIMD and the PoolManager is present in the live bytecode, and the fixed v4 pool exists with liquidity.\n- The full suite passes on this tree.\n\n```\n417 tests passed, 0 failed (20 suites)\n```\n\n**Findings.**\n1. **Low, `Endowments.createForPot`.** A pot endowment can be created for a pot that already needs nothing, since only `potId <= potCount` is checked. Every harvest then goes to the fallback beneficiary, who is chosen by the creator, while the Created event labels it a pot endowment. This is asymmetric with `createForMeter`, which refuses a feed that cannot absorb yield. Reproduced against the repository's mock pots. Suggested fix: revert when `remaining(potId)` is zero at creation.\n2. **Info, `Rules.createRule`.** Unused condition fields are refused, but unused action fields are accepted and published in `RuleCreated`, so a HIRE rule's event can name a PAY recipient that the stored rule ignores. No funds are affected. Reproduced with a scratch test.\n\n**Not reached.** I could not verify, without the earlier launches' sources, whether the real `CrowdPots.chipInFor` for a pot-completing chip fits the 500,000 gas Endowments allows. If it does not, a harvest that would complete a pot pays the fallback instead. This is a lead for the judge, not a finding. The two documented design choices the author asked to keep, the tip to the first firer and harvests paid to contract targets, were checked and behave as described.","treeHash":null,"usage":{"cachedInputTokens":2086827,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":42031,"runtime":"claude","turns":34,"wallClockMs":1115928}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4199bf0c80a9d6cf","findings":[{"citation":"resolved","description":"sIMD pays nothing out to a holder in the block it was minted shares (or received freshly minted shares). Endowments only guards against the hold its own stake() causes (lastStakeBlock). A stranger can call SIMD.deposit(1, address(endowments)) in every block: the contract is then stamped in every block, so every harvest() of every endowment reverts inside _leaveVault with the vault's RedeemMoreThanMax/WithdrawMoreThanMax, and every withdraw()/exit(inKind=false) that needs the vault reverts the same way. Cost to the attacker is 1 IMD-wei plus one deposit's gas per block (about 60k gas, a few cents at today's base fee); it can be kept up for days. No principal is lost (exit with inKind still works and hands over sIMD shares that redeem next block), but no endowment's yield can reach its meter, pot or recipient while it lasts, and ordinary depositors following the runbook's `withdraw` see an opaque vault error instead of HoldActive. docs/THREATS.md E3 accepts this; it is recorded here so the adapter and the final panel weigh the liveness trade-off knowingly. The hold is the vault's rule, so no change inside this contract can remove it; the design-preserving mitigation is to keep the inKind escape hatch prominent in the runbook (it is) and, optionally, to surface the external hold as HoldActive by checking SIMD.maxRedeem(address(this)) before calling the vault, so callers get the documented error. No code change is required.","line":497,"path":"src/endowments/Endowments.sol","reproduction":"State: Endowments with one recipient endowment, alice deposits 100 IMD, stake(), one block later 1% yield is transferred to the vault so harvestable(id) > 0. Each block: stranger calls simd.deposit(1, address(endow)). Then endow.vaultHold() == true; endow.harvest(id) reverts RedeemMoreThanMax (expected: yield reaches the recipient); alice's endow.withdraw(id, 1e18) reverts WithdrawMoreThanMax (expected: 1 IMD back). Repeating the 1-wei deposit each block keeps both reverting for as long as the stranger pays gas. Reproduced in a scratch Foundry test against the project's own MockStakedIMD (which follows the real vault's hold stamp) for five consecutive blocks.","severity":"low","snippet":"        if (block.number <= lastStakeBlock) revert HoldActive();","title":"Anyone can hold Endowments' vault every block for 1 wei, stopping harvest and IMD withdrawals indefinitely"},{"citation":"resolved","description":"_meterRoom returns zero whenever Questions.costOf(feedId) is zero (the Intake no longer sells the feed's action, or its price is above the feed's cap). _harvestPlan then reports nothing to harvest, so harvest() reverts NothingToHarvest. Nothing else can move the shares an endowment holds beyond its principal: harvest is the only exit for yield, the target is fixed, there is no sweep, and depositors receive exactly their principal. If the feed never becomes askable again the yield that accrued before and after that moment is locked in the contract forever, even after the last depositor has left (principal 0, shares > 0). The creation-time check (FeedNotLive) only guards the moment of creation. docs/THREATS.md E5/E12 says the yield 'waits'; what it does not say is that there is no path at all if the wait never ends. The design intentionally has no owner and no retargeting, so this is reported as a documented trade-off with a concrete state, not a bug in the arithmetic: the minimal change that preserves the design would be a creator-chosen fallback for a meter endowment too (as pot endowments have), used only while costOf is zero.","line":777,"path":"src/endowments/Endowments.sol","reproduction":"State: meter endowment for FEED (costOf 0.5 IMD at creation), alice deposits 100 IMD, stake(), next block 1% yield into the vault; harvestable(id) > 0. Then Questions reports costOf(FEED) == 0 (the project's MockQuestions.setCost(0) models the Intake no longer selling the action). harvestable(id) == 0; harvest(id) reverts NothingToHarvest. alice withdraws 100 IMD to the wei (works). endowment(id) then shows principal 0 and shares worth about 1 IMD; every later harvest(id) still reverts NothingToHarvest and no other function can move those shares. Expected: a way for the creator-chosen beneficiary to receive the yield, or at least for it to be recoverable; actual: locked for good unless the feed is sold again. Reproduced in a scratch Foundry test.","severity":"low","snippet":"        if (cost == 0) return 0;","title":"A meter endowment's accrued yield is stranded for good if Questions stops pricing the feed"},{"citation":"resolved","description":"Read line by line: src/rules/Rules.sol, src/rules/Zap.sol, src/endowments/Endowments.sol, src/interfaces/IWorkOrders.sol, IQuestions.sol, ICrowdPots.sol, src/rules/v4/IPoolManagerLike.sol, src/interfaces/external/Mainnet.sol, docs/LAUNCH.md and docs/THREATS.md, plus the stand-ins MockDesk, MockStakedIMD, MockPots, MockCrowdPots, MockIMD and the Endowments/Rules test bases. Every external and public state-changing function was walked against the Pashov SOP (access, value in and out, reentrancy, rounding, time, external trust): no loss of funds, no payment to a party other than the one the creator or caller fixed, no broken accounting, no reentrancy path past the transient locks, no overflow, and no forbidden construct (no owner, proxy, initializer, mint, pause, DELEGATECALL, CALLCODE or SELFDESTRUCT; constructors make no external call). forge build and the full default suite plus the fork suite (public RPC reachable) passed: 442 tests, 0 failures. The manifest in docs/LAUNCH.md has only kind/contracts/notes, 2/4/4 string arguments in constructor order, no $owner and no $contract reference, and its six addresses match Mainnet.sol and the brief. Not reached: the real sources of Questions (launch 1531) and WorkOrders/CrowdPots (launch 1573) behind the frozen interfaces, since the sibling repositories integration/ builds against are not in this checkout; conclusions about those three rest on the interface comments, the stand-ins that mirror them and the fork tests that call the live contracts. The invariant suites (test/**/invariant/**) were not re-run within the time budget; the project's own run is the evidence for them.","line":36,"path":"src/interfaces/external/Mainnet.sol","reproduction":"Not a defect. Commands run: forge build; forge test --no-match-path 'test/**/invariant/**' (442 passed, including the fork suites); a scratch test for the two findings above.","severity":"info","snippet":"    address internal constant QUESTIONS = 0xEECE4628ceb091C13393fc64056Be8b8501fD3F6;","title":"Coverage: Rules, Endowments, Zap and their interfaces read in full; the live Questions, WorkOrders and CrowdPots sources could not be reached"}],"hash":"836aa89785bb21dcd3d8ef692a8f7b9c4ffb80a83b1f720121a42e4e93d89eb2","nodeId":"e0d05364-9d9d-47fa-9c8a-ba2609e1b23d","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result: no critical, high or medium defects, two substantiated low findings, and one coverage note. No source file was changed and the tree is clean.\n\n**What I read.** All three contracts in full (`Rules`, `Endowments`, `Zap`), the frozen interfaces, the mainnet address library, both docs, and the stand-ins for the desk, vault, pots and token. Every state-changing entry point was walked for access, value flow, reentrancy, rounding, time and external trust. Build and the default plus fork suites pass: 442 tests, 0 failures. The manifest in docs/LAUNCH.md matches the constructors, the brief and the schema. No owner, proxy, initializer, minting, pausing, DELEGATECALL, CALLCODE or SELFDESTRUCT is present, and constructors make no external call.\n\n**What I could not reach.** The real sources of Questions, WorkOrders and CrowdPots are not in this checkout, so the integration project cannot build here. Conclusions about those three rest on the interface comments, the stand-ins, and the fork tests that call the live contracts. The invariant suites were not re-run in the time budget.\n\n**Findings, both reproduced in a scratch Foundry test:**\n\n- **Low, Endowments line 497.** Anyone can deposit 1 wei into sIMD in Endowments' name every block. That holds the vault each block, so every harvest and every IMD withdrawal reverts with the vault's error for as long as the attacker pays gas. Principal is safe via in-kind exit. Documented as accepted in THREATS.md E3, but worth a conscious decision by the panel.\n- **Low, Endowments line 777.** If Questions stops pricing a feed for good, a meter endowment's accrued yield has no exit at all: harvest reverts forever, nothing else can move the shares, and after the last depositor leaves the yield sits locked. A creator-chosen fallback, as pot endowments have, would preserve the design.\n\nNeither carries a proof file, since neither is high severity. The two rules the requester asked to keep, the tip to the first firer and harvest paying a contract target, were checked and read as correct for the stated design.","treeHash":null,"usage":{"cachedInputTokens":2149092,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":49348,"runtime":"claude","turns":34,"wallClockMs":880913}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"918f8261a6fd589c","findings":[{"citation":"resolved","description":"Merged from audit_permissions. createForMeter refuses a feed Questions states no cost for (line 310, FeedNotLive), so a meter endowment can only be announced while its target can absorb yield. createForPot only checks that the id has been handed out; it never asks CROWD_POTS.remaining(potId). A pot that is already full, launched, expired or closed is accepted. For such an endowment _potRoom returns 0 on every harvest, the whole excess is offered to the pot, the pot takes nothing, and _forward (lines 942-947) pays everything to the fallback beneficiary, an address the creator chose and may be. The Created event still says kind=Pot with the pot id as target. docs/THREATS.md E6 describes a pot that fills after the endowment was announced; here the pot can be dead before anyone deposits, and the on-chain fact a depositor reads (Created.kind) says the yield funds a pot. No principal is at risk and the yield goes to a party fixed at creation, hence low. Minimal fix that keeps the design: in createForPot revert (e.g. PotNotCollecting) when CROWD_POTS.remaining(potId) == 0, mirroring createForMeter; a series always reports a non-zero remaining (mock line 20, THREATS E6) so series endowments are unaffected.","line":326,"path":"src/endowments/Endowments.sol","reproduction":"Reproduced on this tree with test/scratch/Specialists.t.sol (SpecialistEndowmentsRepro.test_createForPotAcceptsAFullPot, passes = defect present). State: EndowmentsBase fixture; pots.open(8, 0) so pots.remaining(8) == 0 and potCount >= 8. Call endow.createForPot(8, heir) as creator. Expected (by symmetry with createForMeter): revert. Actual: returns an id whose endowment(id).kind == Kind.Pot and beneficiary == heir. Then alice deposits 100e18, stake, roll one block, add 1% vault yield; harvestable(id) = Y > MIN_HARVEST; harvest{gas: 850_000}(id) returns Y and imd.balanceOf(heir) == Y: the whole harvest was paid to the fallback through FallbackPaid, the pot received nothing.","severity":"low","snippet":"        if (potId == 0 || potId > CROWD_POTS.potCount()) revert UnknownPot(potId);","title":"createForPot accepts a pot that already needs nothing, so a 'Pot' endowment is a disguised recipient endowment paying its fallback beneficiary"},{"citation":"resolved","description":"Merged from audit_flow. _strands refuses the six addresses Endowments knows would strand or misdirect IMD sent by plain transfer, but it cannot know the sibling Zap, since no contract of the launch refers to another. Zap._returnEverything (src/rules/Zap.sol:270-271: `uint256 imdLeft = IMD.balanceOf(address(this)); if (imdLeft != 0) IMD.safeTransfer(msg.sender, imdLeft);`) sends Zap's whole IMD balance to whoever calls buy, chipIn or fundMeter next, by design (Z4). So with Zap as a Recipient endowment's recipient, or as a Pot endowment's fallbackBeneficiary, the yield is not lost (which the NatSpec accepts for an arbitrary contract) but goes to a third party chosen by timing, and since harvest is open to anyone, the party that triggers the payout can collect it in the same transaction. The same holds for a Rules PAY rule whose pay.recipient is Zap (Rules.sol:397 refuses only zero and Rules itself). This is pattern 1/3 of docs/THREATS.md section 10 reached through a sibling contract. Only the creator's choice of target makes it reachable, and only yield (or the PAY amount), never principal, is exposed, hence low. Fixes that keep the design: have Zap pay out only what the current call produced (imdOut minus what the pot or meter took) so IMD that arrives by plain transfer stays put, or list Zap's deployed address beside the refused targets in the docs and pages.","line":626,"path":"src/endowments/Endowments.sol","reproduction":"Reproduced on this tree with test/scratch/Specialists.t.sol (SpecialistEndowmentsRepro.test_zapAsRecipientPaysTheNextZapCaller, passes = defect present). Deploy Zap(imd, MockPoolManager, pots, questions) next to the EndowmentsBase fixture. 1) creator calls endow.createForRecipient(address(zap)): succeeds because _strands(zap) is false. 2) alice deposits 1_000_000e18, stake, roll one block, add 1% vault yield so harvestable(id) = Y > MIN_HARVEST. 3) mallory, in one transaction, calls endow.harvest(id) (Y IMD is safeTransferred to Zap, imd.balanceOf(zap) == Y) and then zap.buy{value: 0.001 ether}(0, type(uint256).max). Expected: the yield reaches the intended target or createForRecipient refuses an address that passes IMD on to arbitrary callers. Actual: imd.balanceOf(mallory) == bought + Y and imd.balanceOf(zap) == 0: mallory received the endowment's whole harvest.","severity":"low","snippet":"        return to == address(0) || to == address(this) || to == address(IMD) || to == address(SIMD)\n            || to == address(QUESTIONS) || to == address(CROWD_POTS);","title":"Endowments and Rules accept this launch's own Zap as a payee, and Zap hands any IMD it holds to whoever calls it next"},{"citation":"resolved","description":"Merged from audit_math. The meter branch of _harvestPlan refuses a harvest whose cut amount is below MIN_HARVEST (line 739: `uint256 part = room < MIN_HARVEST ? 0 : SIMD.previewWithdraw(room);`), so a nearly full meter does not trigger a vault withdrawal for dust. The pot branch has no such cut: any non-zero room below worth becomes the harvest amount. harvestable reports the same value, so a keeper acting on harvestable(id) > 0 must send a gas limit above POT_GAS_FLOOR (about 628k; 850k per the NatSpec) and pays for a vault withdrawal, the pot call and the Harvested/Settled events to deliver one wei. Nothing is lost: the shares burned are exactly previewWithdraw(1) and come out of yield, and the next harvest pays the fallback once the pot is full. The doc comment on MIN_HARVEST ('The least IMD a harvest is run for') does not hold on the pot path. Keeper-cost and consistency note only.","line":756,"path":"src/endowments/Endowments.sol","reproduction":"Reproduced on this tree with test/scratch/Specialists.t.sol (SpecialistEndowmentsRepro.test_potRoomOfOneWeiIsHarvested, passes = behaviour present). EndowmentsBase fixture: pot POT needs 1000e18. alice deposits 100e18 into potId, stake, roll one block, add 1% vault yield. stranger chips 1000e18 - 1 directly into the pot so pots.remaining(POT) == 1. Then endow.harvestable(potId) == 1 and endow.harvest{gas: 850_000}(potId) succeeds and returns 1; the pot's remaining becomes 0, the fallback (heir) receives 0, and the endowment's shares drop by 124330 (= previewWithdraw(1)); 266,549 gas used against the mock pot. Expected by the MIN_HARVEST comment and the meter branch: NothingToHarvest for room < 1e15. Actual: a one-wei harvest.","severity":"info","snippet":"            if (room != 0 && room < worth) {","title":"Pot harvest has no MIN_HARVEST floor on the pot's room: a pot one wei short makes harvest burn shares and spend a gas-floored call to move one wei"},{"citation":"resolved","description":"Merged from audit_permissions. For the condition, fields that do not apply are rejected with FieldNotUsed (line 380 for VIEW, line 383 for FEED), so a stored rule and its RuleCreated event agree. For the action, only the matching half is stored (lines 416-421) but nothing rejects the other half, and the event publishes the caller's whole RuleParams. A HIRE rule can be created with p.pay = {recipient: X, amount: Y}: getRule(id).pay is all zeros while RuleCreated.params.pay names X and Y. No funds move on the unused half (fire reads r.pay / r.hire from storage), so this only lets a creator publish misleading terms to indexers and keeper pages that decode RuleCreated instead of calling getRule. Minimal fix: in the ACT_HIRE branch revert FieldNotUsed when p.pay.recipient != 0 || p.pay.amount != 0; in the ACT_PAY branch revert FieldNotUsed when any field of p.hire is set, mirroring the condition checks.","line":424,"path":"src/rules/Rules.sol","reproduction":"Reproduced on this tree with test/scratch/Specialists.t.sol (SpecialistRulesRepro.test_hireRuleAcceptsPayFields, passes = behaviour present). RulesBase fixture (MockDesk). createRule with when = VIEW/GE 100 on the gauge, action = ACT_HIRE, hire = the base fixture's terms, pay = {recipient: 0xBEEF, amount: 5e18}, spec 'do the thing', deposit 0. Expected (by symmetry with lines 380/383): revert FieldNotUsed. Actual: succeeds; getRule(id).pay.recipient == address(0) and pay.amount == 0 while the RuleCreated event at line 424 carries p with pay.recipient == 0xBEEF and amount == 5e18.","severity":"info","snippet":"        emit RuleCreated(id, msg.sender, p, spec, deposit);","title":"createRule refuses unused condition fields but accepts and publishes unused action fields (a PAY half on a HIRE rule, a HIRE half on a PAY rule)"},{"citation":"resolved","description":"Merged from audit_economics. Every vault exit of Endowments redeems or withdraws from address(this). sIMD stamps a holder with the block in which it was minted shares, and a transfer carries a newer stamp to the receiver, so anyone who calls sIMD.deposit(1, Endowments) (about 60k gas) in a block makes sIMD pay nothing out to Endowments in that block. Repeated every block, harvest(id) and withdraw(id, amount) for any amount above the endowment's buffer revert with the vault's own error and no yield reaches any target. Principal is not at risk: exit(id, amount, minOut, true) hands over sIMD shares in any block and buffered IMD is still paid as IMD. The requester documents this in docs/THREATS.md E3 and ADAPTATION.md and tests it (test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen). Recorded so the review shows it was weighed: the griefer gains nothing, the loss is delay of yield and the inconvenience of leaving in kind. No change asked for.","line":894,"path":"src/endowments/Endowments.sol","reproduction":"Existing test test/endowments/Endowments.audit.t.sol test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen (passes on this tree). State: an endowment with staked principal and harvestable yield (deposit 100e18, stake, roll one block, add yield). Each block the stranger approves sIMD for 1 and calls sIMD.deposit(1, address(Endowments)) (the fixture's _strangerCausesHold). In that block harvest(id) reverts with sIMD's error (not HoldActive) and withdraw(id, 100e18) reverts the same way; exit(id, 100e18, 100e18, true) succeeds and transfers sIMD shares worth at least 100e18 IMD. Expected per the contract's own design: exactly this.","severity":"info","snippet":"            agrees = SIMD.redeem(shares, address(this), address(this)) >= assets;","title":"Unbounded liveness grief, accepted by design: a stranger renewing sIMD's one-block hold on Endowments every block stops every harvest and every IMD withdrawal that needs the vault"}],"hash":"8c44bd4796267e3457be505504b00b445f6be8d7ed7e75842eae9437e278974b","nodeId":"520b8c72-4892-4614-b7fa-b61f4f6d26a7","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds five findings and a 21-row coverage record.\n\n**Outcome.** No critical, high or medium defect. All five specialist findings reproduce on this tree, and I kept each at the severity its impact supports. Nothing blocks the launch.\n\n**What I verified**\n- The project builds with the pinned settings and all 441 tests pass. Runtime sizes are 13,161 (Endowments), 13,762 (Rules) and 3,834 (Zap) bytes.\n- The manifest's argument order matches every constructor. All six mainnet addresses have code, sIMD's asset is IMD and its owner is zero, WorkOrders reports IMD, and the undeclared live functions Zap relies on (`fundFor`, `chipInFor`) are present in the deployed bytecode. The v4 pool with Zap's hard-wired key is initialized with liquidity.\n- One scratch test file (`test/scratch/Specialists.t.sol`) reproduces four specialist findings against the real code. The fifth is covered by an existing repository test.\n\n**Findings kept, by severity**\n1. **Low.** `createForPot` accepts a pot that already needs nothing, so a \"Pot\" endowment pays all yield to its creator-chosen fallback while the on-chain record says it funds a pot. Asymmetric with `createForMeter`'s liveness check.\n2. **Low.** Endowments and Rules accept the sibling Zap as a payee, and Zap hands its whole IMD balance to whoever calls it next, so a harvester can collect the yield in the same transaction. Requires the creator to choose Zap. Only yield, never principal.\n3. **Info.** The pot branch of the harvest plan has no `MIN_HARVEST` floor. A pot one wei short makes a gas-floored harvest move one wei.\n4. **Info.** `createRule` validates unused condition fields but accepts and publishes unused action fields in the event.\n5. **Info.** The documented every-block sIMD hold grief, recorded as accepted by design.\n\n**Coverage.** All 19 listed entry points are answered: 16 hold, 3 carry a finding (`createForPot`, `createForRecipient`, `harvest`), plus a row for `createRule` and one for the manifest and dependency checks. No row is unreached.","treeHash":null,"usage":{"cachedInputTokens":1558153,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":34922,"runtime":"claude","turns":30,"wallClockMs":743354}},{"artifacts":[],"attempt":2,"bundleHash":"49b7dcc4e6e4b727b5abed0bb98b5a20e06f936096d89aee738c543d3c5ccbaf","device":"68fd8dd6450ac70c","findings":[],"hash":"8db3dc487a713de6645b2da8f57495d88966f1d8c886413280b6fe7510a9f034","nodeId":"8911bc68-0801-4988-b43c-c858a8cf8a79","outcome":"completed","summary":"Created `launch.json` exactly as requested for Rules, Endowments, and Zap.\n\nValidated all ten addresses against the source and constructor ABIs. `forge build` passed; `forge test` passed all 417 tests with the specified fuzz seed.\n\nOnly `launch.json` changed.","treeHash":"25c2b49389ca704b35772aec4e3fc25b8434dbdf","usage":{"cachedInputTokens":731520,"inputTokens":76620,"model":"gpt-6-astra","outputTokens":4004,"runtime":"codex","turns":6,"wallClockMs":310162}},{"artifacts":[],"attempt":1,"bundleHash":"306bef66d0b05473dca29fda0d66bf741e598b99da21f7e6fa0b25f3e73d1ab2","device":"f494611affb5524c","findings":[],"hash":"af671a367377b38c1bed15111de812938beff85017b3ee59c0405c42503767a0","nodeId":"69cab6b1-d1ab-4738-b1d4-9c6c404a2b49","outcome":"completed","summary":"The work is complete and verified. No source file changed.\n\n**Outcome.** The project already meets every rule of the contracts-only launch: nonpayable constructors with literal address arguments, no external call or code check at construction, no owner, no token, no proxy, and no forbidden opcode in any runtime. The project's own launch suite proves each of these. Both audit findings reproduce, and neither required a code change.\n\n**What I did.**\n- Added `test/endowments/Endowments.audit.t.sol` with two tests that follow the auditor's steps exactly. The first shows a stranger holding the vault for five consecutive blocks with one wei each, with harvest and withdrawal reverting on the vault's error and the in-kind exit working throughout. The second shows a meter endowment's yield stuck after Questions stops pricing the feed, surviving the last depositor's exact withdrawal, and leaving only once the feed is priced again.\n- Tightened `docs/THREATS.md` at E3, E5 and E12 to say plainly what the auditor showed was left unsaid: the external hold has no upper bound, and a meter endowment's yield has no exit at all while its feed is not sold.\n- Updated the test count in the README and wrote `ADAPTATION.md` with each change, the reason, and why both findings were kept as they are.\n\n**Why no code change.** The hold finding states itself that no code change is required, since the hold is the vault's rule. Its optional suggestion would only rename an error path that the docs and existing tests already describe. The stranded-yield finding calls itself a documented trade-off, and its sketched fix would change a public function's signature, the launch runbook that the tests hold against the code, and the design's rule that yield has no address but the one fixed at creation. The requester asked for the code as it is, and the launch asks for the smallest diff.\n\n**Verification.** The build is clean. The full default suite passes with the verifier's fuzz seed.\n\n| Check | Result |\n|---|---|\n| forge build | clean |\n| forge test (seeded) | 417 passed, 0 failed, 20 suites |\n| forge fmt --check | clean |\n\nFork suites were not run, since they need a mainnet RPC. Nothing was committed, and no launch.json was written.","treeHash":"7639e174ff0ce22efd9107bf1536faa3ba371b59","usage":{"cachedInputTokens":2357873,"inputTokens":930,"model":"claude-fable-5-1","outputTokens":23376,"runtime":"claude","turns":30,"wallClockMs":769995}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8109087d965ddf6c","findings":[{"citation":"resolved","description":"Every vault exit of Endowments redeems or withdraws from address(this). sIMD stamps a holder with the block in which it was minted shares, and a transfer carries a newer stamp to the receiver, so anyone who calls sIMD.deposit(1, Endowments) (about 60,000 gas) in a block makes sIMD's maxRedeem(Endowments) zero for that block. While that is repeated every block, harvest(id) and withdraw(id, amount) for any amount above the endowment's buffer revert with the vault's own error, and no yield reaches any target. Principal is not at risk: exit(id, amount, minOut, true) hands over sIMD shares in any block and the receiver can redeem them next block, and buffered IMD is still paid as IMD. The requester documents this in docs/THREATS.md E3 and ADAPTATION.md (finding fb892c57, kept as is) and tests it in test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen. It is recorded here only so the economics review shows it was weighed: cost to the griefer is roughly 60,000 gas per block with nothing gained, the loss is delay of yield and the inconvenience of leaving in kind, and no principal moves to a wrong party. No change is asked for.","line":894,"path":"src/endowments/Endowments.sol","reproduction":"State: an endowment with staked principal and harvestable yield (deposit 100e18, stake, roll one block, send the vault 0.1% of its assets as yield). Each block: stranger calls IMD.approve(sIMD, 1) then sIMD.deposit(1, address(Endowments)). In that block harvest(id) reverts with sIMD's RedeemMoreThanMax / WithdrawMoreThanMax (not HoldActive), and withdraw(id, 100e18) reverts the same way; exit(id, 100e18, 100e18, true) succeeds and transfers sIMD shares worth at least 100e18 IMD. Expected per the contract's own design: exactly this; the finding is a liveness bound the design accepts, not a loss.","severity":"info","snippet":"            agrees = SIMD.redeem(shares, address(this), address(this)) >= assets;","title":"Unbounded liveness grief: a stranger can renew sIMD's one-block hold on Endowments every block, stopping every harvest and every IMD withdrawal that needs the vault (already documented and kept by the"}],"hash":"fb8a2187c6ea2b26b77614487e62dfe5f8f9c63e5a9f0f9208bc269865793631","nodeId":"e23ed923-6f14-4db4-9937-94b039c0e69c","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is in place with one info-level entry and a full coverage record.\n\n**Outcome.** No reproducible loss-of-funds, wrong-party payment, or broken-guarantee defect was found in the economic area. Rules, Endowments and Zap behave as THREATS.md describes on every entry point I traced. The only item recorded is the already-documented liveness grief on Endowments, kept at info severity because the requester has accepted it and principal remains reachable through in-kind exit.\n\n**What I checked, by guide.**\n- Economic Security: tip front-running and keeper churn in Rules (bounded by creator-set tip, cooldown, maxFires, escrow), fallback-beneficiary capture of pot harvests (creator-fixed trust assumption), meter filling around a harvest (only delays yield), stranger-caused sIMD hold (the recorded info item), Zap sandwiching (caller sets minimum and deadline), price-mark griefing (vault rounding makes the price monotone, so no stranger can trigger PriceFell).\n- Invariant: Rules balance covers totalEscrowed on every path; Endowments buffer equals pendingTotal and booked shares never exceed sIMD held; each depositor gets exactly its principal; yield only reaches the fixed target. Scratch probes confirmed harvest and withdrawal commute to within 64 share-wei of dust, 50 tiny in-kind exits wear the cushion by 48 share-wei, and a buffered donation followed by harvest and stake leaves depositors whole.\n- Flow Gap: desk pull measured exactly in Rules.fire, returns credited only from the desk's books, meter must pull the whole harvest, pot chip read from balance with a fixed gas allowance, Zap delta sign and settle checks, buffer-first withdrawals handing one depositor's IMD to another while shares back the newcomer.\n\n**Not reached.** The real CrowdPots, Questions and WorkOrders sources are not in this tree, so the seams that depend on them (gas of `remaining` for a series under 50,000, `fundFor` existing on the live Questions, series ids counting in `potCount`) rest on the integration suite's claims rather than my own trace.\n\n**Coverage record.** All 19 listed entry points have rows: 18 hold, `Endowments.harvest` points at the info finding, plus four invariant rows. The scratch test directory was removed since nothing in it backs a finding.","treeHash":null,"usage":{"cachedInputTokens":1442114,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":43839,"runtime":"claude","turns":29,"wallClockMs":1156480}}],"verification":[{"checks":[{"durationMs":160943,"exitCode":0,"name":"build","output":"Compiling 94 files with Solc 0.8.26\nSolc 0.8.26 finished in 160.83s\nCompiler run successful!\n","passed":true},{"durationMs":7177,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/scaffold/Interfaces.t.sol:InterfacesCompileTest\n[PASS] test_theAddressesThisLaunchIsGiven() (gas: 239)\n[PASS] test_whatEndowmentsAndZapCallOnThePots() (gas: 151)\n[PASS] test_whatRulesCallsOnTheDesk() (gas: 283)\n[PASS] test_whatThisLaunchCallsOnQuestions() (gas: 327)\n[PASS] test_whatZapCallsOnUniswap() (gas: 437)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 263.29µs (257.03µs CPU time)\n\nRan 1 test for test/rules/RulesDeskScenario.t.sol:RulesDeskScenarioTest\n[PASS] test_scenario_aHireRuleWalksThroughTheStandInDesk() (gas: 6694201)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.04ms (2.52ms CPU time)\n\nRan 2 tests for test/endowments/Endowments.audit.t.sol:EndowmentsAuditTest\n[PASS] test_audit_aMeterEndowmentsYieldWaitsForAsLongAsTheFeedIsNotSold() (gas: 1333828)\n[PASS] test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen() (gas: 3500129)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.05ms (3.36ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.create.t.sol:EndowmentsCreateTest\n[PASS] test_constructor_constants() (gas: 39563)\n[PASS] test_constructor_makesNoCallAndNeedsNoCodeAtItsArguments() (gas: 36642)\n[PASS] test_constructor_revertsOnAnyZeroAddress() (gas: 4856)\n[PASS] test_constructor_storesTheFourAddresses() (gas: 43551)\n[PASS] test_createForMeter_recordsTheFeed() (gas: 233421)\n[PASS] test_createForMeter_revertsForAnIdThatIsNotAFeed() (gas: 55101)\n[PASS] test_createForMeter_revertsIfQuestionsHasNoCode() (gas: 93268)\n[PASS] test_createForMeter_revertsOnZeroFeed() (gas: 33017)\n[PASS] test_createForMeter_revertsWhileTheFeedCannotBeAsked_andWorksOnceItCan() (gas: 252863)\n[PASS] test_createForPot_acceptsASeries() (gas: 217470)\n[PASS] test_createForPot_recordsThePotAndTheFallback() (gas: 223321)\n[PASS] test_createForPot_revertsForAPotThatDoesNotExistYet() (gas: 414087)\n[PASS] test_createForPot_revertsIfCrowdPotsHasNoCode() (gas: 92497)\n[PASS] test_createForPot_revertsWithoutAUsableFallback() (gas: 169639)\n[PASS] test_createForRecipient_acceptsAnyOtherContract() (gas: 1082671)\n[PASS] test_createForRecipient_recordsTheRecipient() (gas: 141295)\n[PASS] test_createForRecipient_refusesTheVault_soNoHarvestCanBeCollectedByAOneBlockStaker() (gas: 138946)\n[PASS] test_createForRecipient_revertsWhereTheYieldWouldBeStranded() (gas: 167298)\n[PASS] test_create_idsFollowTheOrderOfCreation() (gas: 245549)\n[PASS] test_create_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 191139)\n[PASS] test_create_revertsWhenTheSeedCannotBePulled() (gas: 317384)\n[PASS] test_endowment_unknownIdReadsAsNone() (gas: 43397)\n[PASS] test_launch_create2FromInitcode_staysInsideOurGates() (gas: 2763356)\nLogs:\n  create2 gas: 2694036\n  runtime bytes: 13161\n  initcode bytes with the four argument words: 13874\n\n[PASS] test_setUp_createdOneEndowmentOfEachKind() (gas: 100844)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 7.69ms (4.36ms CPU time)\n\nRan 8 tests for test/launch/LaunchRunbook.t.sol:LaunchRunbookTest\n[PASS] test_runbook_buyingImdWithEthWithAMinimumAndADeadline() (gas: 1044021)\n[PASS] test_runbook_everyDocumentedCommandNamesAFunctionThatExists() (gas: 7915375)\n[PASS] test_runbook_leavingWithSharesInABlockWhereTheVaultPaysNothingOut() (gas: 1100386)\n[PASS] test_runbook_theFirstDaysLedgerIsWhatTheParametersGive() (gas: 886715)\n[PASS] test_runbook_theFirstEndowmentIsCreatedStakedHarvestedAndWithdrawn() (gas: 1938085)\n[PASS] test_runbook_theFirstRuleCanBeUnwoundWithoutTheHire() (gas: 4832990)\n[PASS] test_runbook_theFirstRuleIsWrittenFiredAndPaid() (gas: 2607984)\n[PASS] test_runbook_theFirstRulesCommandCarriesTheDocumentedParameters() (gas: 649260)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 18.28ms (25.37ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.loss.t.sol:EndowmentsLossTest\n[PASS] test_loss_aDonationMakesAShortEndowmentWholeAgain() (gas: 934277)\n[PASS] test_loss_bufferedImdIsSharedInTheSameProportion() (gas: 907146)\n[PASS] test_loss_exitRespectsTheCallersMinimum() (gas: 779050)\n[PASS] test_loss_harvestTakesNothingFromAShortEndowment() (gas: 634889)\n[PASS] test_loss_inKindExitHandsOverTheSameSliceInShares() (gas: 711841)\n[PASS] test_loss_inKindExitRespectsTheCallersMinimum() (gas: 642777)\n[PASS] test_loss_isSharedProRata_theFirstToLeaveCannotTakeEverything() (gas: 844734)\n[PASS] test_loss_makesTheEndowmentShort() (gas: 612829)\n[PASS] test_loss_noNewDepositsWhileShort() (gas: 916568)\n[PASS] test_loss_partialExitsLeaveTheRestNoWorseOff() (gas: 709956)\n[PASS] test_loss_totalLossPaysNothingButStillLetsDepositorsClose() (gas: 663792)\n[PASS] test_loss_whileTheVaultHoldsTheContract_theImdExitWaitsButTheInKindExitDoesNot() (gas: 1065119)\n[PASS] test_loss_withdrawRefusesToPayLessThanWasAsked() (gas: 649773)\n[PASS] test_loss_yieldMakesAShortEndowmentWholeAgain() (gas: 885318)\n[PASS] test_priceFall_aNewDepositWaitsInTheBufferAndComesBackToTheWei() (gas: 886026)\n[PASS] test_priceFall_bothResumeOnceThePriceIsBack() (gas: 1186793)\n[PASS] test_priceFall_stakeAndHarvestStop_andTheYieldKeptCoversASecondFall() (gas: 1599634)\n[PASS] test_priceFall_thatNoStakeOrHarvestSaw_eatsYieldFirstAndNeverPrincipal() (gas: 943544)\n[PASS] test_priceFall_thePriceAtTheMarkIsNotAFall() (gas: 910259)\n[PASS] test_spare_aDepositTheGateAccepts_isStakedAndComesBackToTheWei() (gas: 1723094)\n[PASS] test_spare_none_isCoveredButNotWhole_andTakesNoDeposit() (gas: 1179073)\n[PASS] test_spare_none_noWithdrawalLeavesTheOthersAShareWeiShort() (gas: 8558702)\n[PASS] test_spare_theLineIsExactlyAtSpare() (gas: 2525702)\n[PASS] test_spare_whileWhole_anyPartOfOnesPrincipalIsPaid() (gas: 4005527)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 43.52ms (17.00ms CPU time)\n\nRan 9 tests for test/endowments/MockStakedIMD.t.sol:MockStakedIMDTest\n[PASS] testFuzz_priceNeverFallsFromDepositsAndExits(uint256,uint256) (runs: 256, μ: 334494, ~: 334633)\n[PASS] test_depositMintsWhatThePreviewSaid_andWithdrawBurnsWhatThePreviewSaid() (gas: 227648)\n[PASS] test_fixture_depositAndWithdrawPreviewsMatchTheRealVault() (gas: 481198)\n[PASS] test_fixture_mintAndRedeemPreviewsMatchTheRealVault() (gas: 586282)\n[PASS] test_fixture_totalAssetsIsTheVaultsImdBalance() (gas: 300741)\n[PASS] test_hold_aMintBlocksThatHoldersExitInTheSameBlockOnly() (gas: 262077)\n[PASS] test_hold_travelsWithATransfer_butNeverBackwards() (gas: 420930)\n[PASS] test_hold_zeroAmountsStampNothing() (gas: 205206)\n[PASS] test_plainTransferIsYield_andLoseIsALoss() (gas: 152558)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 55.80ms (54.72ms CPU time)\n\nRan 14 tests for test/rules/RulesEdges.t.sol:RulesEdgesTest\n[PASS] testFuzz_fire_escrowExactlyAtTheCostFires_oneWeiLessDoesNot(uint96,uint96) (runs: 256, μ: 635092, ~: 636055)\n[PASS] test_createRule_aDepositAtTheCeilingIsAccepted_andTheRuleFires() (gas: 536763)\n[PASS] test_creatorOnlyFunctions_refuseAnUnknownRuleAsNotCreator() (gas: 144116)\n[PASS] test_fire_feed_aSourceWhoseRoundsGoBackwardsStopsTheRuleUntilTheyPassTheLastOne() (gas: 853454)\n[PASS] test_fire_feed_anAnswerExactlyMaxAgeOldIsFresh_oneSecondOlderIsNot() (gas: 593942)\n[PASS] test_fire_feed_theWidestMaximumAgeAcceptsAnyPastAnswer() (gas: 544281)\n[PASS] test_fire_feed_twoRulesOnTheSameFeedEachFireOncePerRound() (gas: 1295488)\n[PASS] test_fire_hire_theWidestOrderLifetimeStillFitsTheDesksExpiry() (gas: 838987)\n[PASS] test_fire_theWidestCooldownHoldsForTheWholeOfIt() (gas: 619846)\n[PASS] test_fire_view_aRuleMayWatchRulesOwnBooks() (gas: 661867)\n[PASS] test_fire_view_aRuleWatchingItselfCanOnlySpendItsOwnEscrow() (gas: 923071)\n[PASS] test_reconcile_cannotBookAReturnIntoAFullEscrow_butCancelThenFreesIt() (gas: 1184635)\n[PASS] test_reconcile_refusesRuleZeroAndOrderZero() (gas: 858298)\n[PASS] test_topUp_pastTheEscrowCeilingRevertsAndChangesNothing() (gas: 516054)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 61.01ms (65.18ms CPU time)\n\nRan 35 tests for test/rules/RulesMoney.t.sol:RulesMoneyTest\n[PASS] test_cancel_anEmptyRule() (gas: 260619)\n[PASS] test_cancel_leavesOtherRulesAlone() (gas: 597887)\n[PASS] test_cancel_onlyOnce() (gas: 346094)\n[PASS] test_cancel_onlyTheCreator() (gas: 356624)\n[PASS] test_cancel_returnsTheUnspentEscrowToTheCreator() (gas: 605819)\n[PASS] test_onWorkDelivered_afterCancel_paysTheCreator() (gas: 1021363)\n[PASS] test_onWorkDelivered_gasFitsTheDesksAllowance() (gas: 1013567)\nLogs:\n  gas: onWorkDelivered with change to credit: 62365\n\n[PASS] test_onWorkDelivered_ignoresAnOrderItDidNotOpen() (gas: 37435)\n[PASS] test_onWorkDelivered_onlyTheDesk() (gas: 874161)\n[PASS] test_onWorkDelivered_returnsTheChangeInTheSameTransaction() (gas: 1055364)\n[PASS] test_recall_afterCancel_sendsTheOrdersEscrowToTheCreator() (gas: 994931)\n[PASS] test_recall_onlyTheCreator() (gas: 896467)\n[PASS] test_recall_refusesAnotherRulesOrder() (gas: 1508032)\n[PASS] test_recall_revertsWhenTheDeskWillNotCancel() (gas: 1012409)\n[PASS] test_recall_withdrawsAnUntakenOrderIntoTheRule() (gas: 987718)\n[PASS] test_reconcile_afterCancel_paysTheCreatorDirectly() (gas: 1169983)\n[PASS] test_reconcile_creditsARefundedOrder() (gas: 1074807)\n[PASS] test_reconcile_creditsAnOrderRefundedAtTheSecondItExpires() (gas: 1022131)\n[PASS] test_reconcile_creditsEachNewAmountOnce() (gas: 1288455)\n[PASS] test_reconcile_creditsOnlyTheRuleThatPaid() (gas: 1986388)\n[PASS] test_reconcile_creditsTheChangeFromADeliveredOrder() (gas: 1025607)\n[PASS] test_reconcile_isSafeToRepeat() (gas: 1106998)\n[PASS] test_reconcile_nothingComesBackFromAnOrderDeliveredAtFullPrice() (gas: 977049)\n[PASS] test_reconcile_nothingToCreditWhileTheOrderIsOpen() (gas: 891896)\n[PASS] test_reconcile_refusesADeskThatNamesAnotherEmployer() (gas: 1000018)\n[PASS] test_reconcile_refusesADeskThatReportsMoreThanItSent() (gas: 1521331)\n[PASS] test_reconcile_refusesAnOrderOfAnotherRule() (gas: 1700580)\n[PASS] test_reconcile_refusesOrdersItDidNotOpen() (gas: 1309708)\n[PASS] test_reconcile_theBalanceCheckProtectsBookedEscrows_notUnreconciledReturns() (gas: 2015301)\n[PASS] test_reconcile_theReturnedMoneyCanBeSpentAgain() (gas: 1458912)\n[PASS] test_reentrancy_everyMoneyFunctionIsLockedWhileARuleFires() (gas: 2965442)\n[PASS] test_reentrancy_lockedWhileAnOrderIsRecalled() (gas: 975563)\n[PASS] test_topUp_anExhaustedRuleStillTakesMoney_whichItsCreatorCanWithdraw() (gas: 585093)\n[PASS] test_topUp_anyoneAddsToARulesEscrow() (gas: 418696)\n[PASS] test_topUp_refusesUnknownCancelledAndZero() (gas: 402103)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 76.90ms (20.44ms CPU time)\n\nRan 47 tests for test/rules/RulesCreate.t.sol:RulesCreateTest\n[PASS] test_constants() (gas: 47575)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9115)\n[PASS] test_constructor_recordsItsTwoAddresses() (gas: 26011)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 6532)\n[PASS] test_createRule_acceptsAZeroDeposit() (gas: 272964)\n[PASS] test_createRule_acceptsShortestAndLongestConditionData() (gas: 1300868)\n[PASS] test_createRule_feedPay_storesEverything() (gas: 327613)\n[PASS] test_createRule_hire_aDeskThatPublishesNoMaximumIsNotAnObstacle() (gas: 682066)\n[PASS] test_createRule_hire_acceptsEveryAllowedByte() (gas: 392588)\n[PASS] test_createRule_hire_acceptsSpecsOfEveryLengthAroundTheWordSize() (gas: 34211548)\n[PASS] test_createRule_hire_acceptsTheLongestSpec() (gas: 4955351)\nLogs:\n  gas: createRule with a 7,900 byte spec: 607044\n\n[PASS] test_createRule_hire_everyFlagValueItAcceptsCanFire() (gas: 3031012)\n[PASS] test_createRule_hire_findsARefusedByteAtEveryPosition() (gas: 45515625)\n[PASS] test_createRule_hire_ignoresBytesBeyondTheSpec() (gas: 1377010)\n[PASS] test_createRule_hire_readsTheCapByTheDesksOwnSelector() (gas: 570)\n[PASS] test_createRule_hire_refusesADeliveryTimeAboveTheDesksMaximum() (gas: 981445)\n[PASS] test_createRule_hire_refusesASpecThatIsTooLong() (gas: 1155515)\n[PASS] test_createRule_hire_refusesAnEmptySpec() (gas: 52401)\n[PASS] test_createRule_hire_refusesBadPrices() (gas: 112617)\n[PASS] test_createRule_hire_refusesFlagsTheDeskRefuses() (gas: 10901621)\n[PASS] test_createRule_hire_refusesLeadingAndTrailingSpaces() (gas: 161310)\n[PASS] test_createRule_hire_refusesQuoteBackslashAndNonPrintableBytes() (gas: 324024)\n[PASS] test_createRule_hire_refusesTermsBelowTheDesksMinimums() (gas: 463301)\n[PASS] test_createRule_hire_refusesZeroOrderLifetime() (gas: 58370)\n[PASS] test_createRule_hire_reportsTheLowestPositionAtFault() (gas: 293866)\n[PASS] test_createRule_hire_revertsWhenTheDeskHasNoCode_butPayStillWorks() (gas: 528569)\n[PASS] test_createRule_idsCountFromOne() (gas: 809929)\n[PASS] test_createRule_pay_refusesASpec() (gas: 59946)\n[PASS] test_createRule_pay_refusesBadRecipients() (gas: 107999)\n[PASS] test_createRule_pay_refusesZeroAmount() (gas: 57433)\n[PASS] test_createRule_publishesParamsAndSpec() (gas: 389218)\n[PASS] test_createRule_pullsExactlyTheDeposit() (gas: 300399)\n[PASS] test_createRule_refusesACostNoEscrowCanHold() (gas: 347945)\n[PASS] test_createRule_refusesAFeedConditionWithoutAMaximumAge() (gas: 57731)\n[PASS] test_createRule_refusesCalldataOnAFeedCondition() (gas: 57355)\n[PASS] test_createRule_refusesConditionDataLongerThanTheLimit() (gas: 113186)\n[PASS] test_createRule_refusesFeedFieldsOnAViewCondition() (gas: 108083)\n[PASS] test_createRule_refusesUnknownAction() (gas: 108828)\n[PASS] test_createRule_refusesUnknownComparison() (gas: 106231)\n[PASS] test_createRule_refusesUnknownConditionKind() (gas: 107268)\n[PASS] test_createRule_refusesZeroFires() (gas: 56414)\n[PASS] test_createRule_refusesZeroTarget() (gas: 56656)\n[PASS] test_createRule_revertsWithoutAllowance() (gas: 248981)\n[PASS] test_createRule_viewHire_storesEverything() (gas: 460452)\n[PASS] test_getRule_unknownIdIsAllZeros() (gas: 69586)\n[PASS] test_mockDesk_refusesAnOrderForEachReasonTheRealDeskDoes() (gas: 2543664)\n[PASS] test_mockDesk_refusesTheFlagsTheRealDeskRefuses() (gas: 767559)\nSuite result: ok. 47 passed; 0 failed; 0 skipped; finished in 125.31ms (126.58ms CPU time)\n\nRan 18 tests for test/launch/LaunchC.t.sol:LaunchCTest\n[PASS] test_launch_aMissingAddressIsRefused() (gas: 2417285)\n[PASS] test_launch_beforeTheDependenciesExistEveryUseReverts() (gas: 7098752)\n[PASS] test_launch_constructorCodeHoldsNoCallAndNoCodeCheck() (gas: 11075257)\n[PASS] test_launch_constructorsAreNonpayable() (gas: 759331)\n[PASS] test_launch_constructorsTouchNothingOutsideTheirOwnContract() (gas: 7043090)\n[PASS] test_launch_deploysInManifestOrderOnAnEmptyChain() (gas: 7006356)\n[PASS] test_launch_noForbiddenInstructionInAnyDeployedRuntime() (gas: 66671111)\n[PASS] test_launch_noFunctionNamesAnOwnerOrAPowerToChange() (gas: 4208422)\n[PASS] test_launch_onceTheDependenciesExistEachContractWorks() (gas: 16271964)\n[PASS] test_launch_sizeAndGasGates() (gas: 6902563)\nLogs:\n  contract: Rules\n    runtime bytes: 13762\n    initcode bytes, with arguments: 14217\n  contract: Endowments\n    runtime bytes: 13161\n    initcode bytes, with arguments: 13874\n  contract: Zap\n    runtime bytes: 3834\n    initcode bytes, with arguments: 4586\n  initcode bytes, whole launch: 32677\n  gas, three CREATE2 in one call (measured here): 6835468\n  gas, at 241 per initcode byte (a real launch's rate): 7875157\n\n[PASS] test_launch_stateChangingFunctionsAreExactlyTheDocumentedOnes() (gas: 10654155)\n[PASS] test_manifest_everyArgumentInTheDocumentIsWhatTheCodeExpects() (gas: 396246)\n[PASS] test_manifest_literals() (gas: 21340)\n[PASS] test_manifest_namesAndArgumentsFitTheLaunchRules() (gas: 75432)\n[PASS] test_manifest_theDocumentNamesTheThreeContractsInOrder() (gas: 988200)\n[PASS] test_manifest_theEarlierLaunchesAreWrittenWithTheirLiveAddresses() (gas: 2576058)\n[PASS] test_scan_findsADelegatecallInCompiledCodeAndNotInAConstant() (gas: 515957)\n[PASS] test_scan_seesInstructionsAndStepsOverPushData() (gas: 24153)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 260.92ms (417.46ms CPU time)\n\nRan 51 tests for test/endowments/Endowments.flow.t.sol:EndowmentsFlowTest\n[PASS] test_backingOf_countsBufferAndShares() (gas: 609236)\n[PASS] test_cushion_aBatchCostsAtMostTwoShareWei_andAWithdrawalAtMostOne() (gas: 888170)\n[PASS] test_deposit_addsUpPerDepositorAndPerEndowment() (gas: 471708)\n[PASS] test_deposit_recordsPrincipalAndBuffersTheImd() (gas: 272524)\n[PASS] test_deposit_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 195228)\n[PASS] test_deposit_revertsOnUnknownEndowment() (gas: 62399)\n[PASS] test_deposit_revertsOnZero() (gas: 36841)\n[PASS] test_deposit_revertsWithoutAllowance() (gas: 138375)\n[PASS] test_donate_addsToTheBufferButIsNobodysPrincipal() (gas: 173492)\n[PASS] test_donate_revertsOnZeroAndOnUnknownEndowment() (gas: 61069)\n[PASS] test_exit_inImd_isTheSameAsWithdrawWhileTheEndowmentIsWhole() (gas: 481551)\n[PASS] test_exit_inKind_cannotTakeMoreThanTheCallersPrincipal() (gas: 507131)\n[PASS] test_exit_inKind_paysTheBufferedPartInImd() (gas: 720042)\n[PASS] test_exit_inKind_revertsIfTheCallerAsksForMoreThanTheSharesAreWorth() (gas: 461332)\n[PASS] test_exit_inKind_worksInTheStakeBlock_andTheSharesAreWorthThePrincipal() (gas: 657216)\n[PASS] test_exit_inKind_worksWhileSomeoneElseHoldsTheContract() (gas: 690530)\n[PASS] test_exit_revertsIfTheCallerAsksForMoreThanTheirPrincipalIsWorth() (gas: 160780)\n[PASS] test_exit_revertsOnZeroAndOnUnknownEndowment() (gas: 173426)\n[PASS] test_nextStakeBlock_followsTheLastStake() (gas: 241264)\n[PASS] test_quote_matchesWhatWithdrawAndExitPay() (gas: 596931)\n[PASS] test_stake_anEndowmentLeftAloneForSeveralBatchesKeepsItsOwnSplit() (gas: 1853914)\n[PASS] test_stake_anyoneMayCall() (gas: 333132)\n[PASS] test_stake_movesTheWholeBufferIntoTheVaultInOneDeposit() (gas: 530886)\n[PASS] test_stake_recordsTheHighestPriceSeen() (gas: 783751)\n[PASS] test_stake_revertsIfTheBatchWouldMintNothing() (gas: 306160)\n[PASS] test_stake_revertsIfTheVaultIsNotOverImd() (gas: 2328465)\n[PASS] test_stake_revertsIfTheVaultMintsFewerSharesThanItPreviewed() (gas: 408721)\n[PASS] test_stake_revertsIfTheVaultReportsFewerSharesThanItPreviewed() (gas: 408316)\n[PASS] test_stake_revertsInsideTheInterval() (gas: 660329)\n[PASS] test_stake_revertsWithAnEmptyBuffer() (gas: 256473)\n[PASS] test_stake_splitsTheBatchInProportion_andNeverHandsOutMoreThanWasMinted() (gas: 955727)\n[PASS] test_stake_theSplitIsBookedOnTheNextTouch() (gas: 575765)\n[PASS] test_stake_theVaultsOwnRoundingNeverTripsTheMark() (gas: 2248038)\n[PASS] test_vaultHold_reportsAHoldWhoeverCausedIt() (gas: 772390)\n[PASS] test_withdraw_afterStaking_isExactToTheWei_withNoYieldAtAll() (gas: 571230)\n[PASS] test_withdraw_fromTheBuffer_isExactAndNeverAsksTheVault() (gas: 263959)\n[PASS] test_withdraw_inAStakeBlock_revertsHoldActive_andWorksOneBlockLater() (gas: 562555)\n[PASS] test_withdraw_inAStakeBlock_stillPaysWhatTheBufferCovers() (gas: 653201)\n[PASS] test_withdraw_oddAmountsAndManyPieces_areEachExact() (gas: 910827)\n[PASS] test_withdraw_principalInOneEndowmentCannotBeTakenFromAnother() (gas: 268366)\n[PASS] test_withdraw_revertsAboveTheCallersOwnPrincipal() (gas: 319586)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItPreviewed() (gas: 539389)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 638727)\n[PASS] test_withdraw_revertsIfTheVaultPaysShort() (gas: 540515)\n[PASS] test_withdraw_revertsIfTheVaultReportsMoreBurnedThanItPreviewed() (gas: 540124)\n[PASS] test_withdraw_revertsIfTheVaultSaysImdLeavesForNoShares() (gas: 465552)\n[PASS] test_withdraw_revertsOnUnknownEndowment() (gas: 35509)\n[PASS] test_withdraw_revertsOnZero() (gas: 145094)\n[PASS] test_withdraw_usesTheBufferFirst_thenTheVault() (gas: 879140)\n[PASS] test_withdraw_whenSomeoneDepositsIntoTheVaultInOurName_waitsOneBlock() (gas: 909712)\n[PASS] test_withdraw_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 775431)\nSuite result: ok. 51 passed; 0 failed; 0 skipped; finished in 279.60ms (15.70ms CPU time)\n\nRan 42 tests for test/rules/Zap.t.sol:ZapTest\n[PASS] testFuzz_buy_minimumOut(uint256,uint256,uint256) (runs: 256, μ: 230518, ~: 230544)\n[PASS] testFuzz_chipIn_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 452573, ~: 456522)\n[PASS] testFuzz_deadline_runsExactlyWhenNotLate(uint256,uint256,uint8) (runs: 256, μ: 250785, ~: 260112)\n[PASS] testFuzz_fundMeter_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 706659, ~: 711042)\n[PASS] test_buy_minimumOutAndNoEth() (gas: 193935)\n[PASS] test_buy_refundsTheEthThePoolCouldNotUse() (gas: 234154)\n[PASS] test_buy_sendsTheImdToTheCaller() (gas: 199726)\n[PASS] test_chipIn_minimumOut_passesAtTheExactAmountAndFailsOneAbove() (gas: 444556)\n[PASS] test_chipIn_minimumOut_protectsAgainstAWorsePrice() (gas: 271681)\n[PASS] test_chipIn_refundsTheEthThePoolCouldNotUse() (gas: 346704)\n[PASS] test_chipIn_revertsWhenTheCallerCannotTakeItsEthBack() (gas: 855551)\n[PASS] test_chipIn_revertsWhenThePoolGivesNothing_evenWithAZeroMinimum() (gas: 186549)\n[PASS] test_chipIn_revertsWhenThePotTakesNothing() (gas: 952239)\n[PASS] test_chipIn_revertsWithoutEth() (gas: 104386)\n[PASS] test_chipIn_sendsBackTheImdThePotDidNotNeed() (gas: 351471)\n[PASS] test_chipIn_swapsAndChipsInTheCallersName() (gas: 344805)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9083)\n[PASS] test_constructor_recordsItsArguments() (gas: 30582)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 4591)\n[PASS] test_deadline_isCheckedBeforeEverythingElse() (gas: 175381)\n[PASS] test_deadline_runsInItsLastSecondAndRevertsOneSecondLater() (gas: 820970)\n[PASS] test_deadline_zeroIsNotNoDeadline() (gas: 40894)\n[PASS] test_fundMeter_creditsSharesAtTheMetersWorth() (gas: 563760)\n[PASS] test_fundMeter_minimumOutAndNoEth() (gas: 464181)\n[PASS] test_fundMeter_refundsTheEthThePoolCouldNotUse() (gas: 317294)\n[PASS] test_fundMeter_revertsWhenNoSharesAreCredited() (gas: 342388)\n[PASS] test_fundMeter_revertsWhenQuestionsRefuses() (gas: 231534)\n[PASS] test_fundMeter_sendsBackTheImdTheMeterDidNotTake() (gas: 346680)\n[PASS] test_fundMeter_swapsAndFundsInTheCallersName() (gas: 329138)\n[PASS] test_gas() (gas: 681658)\nLogs:\n  gas: chipIn (mock pool, mock pots): 252710\n  gas: fundMeter (mock pool, mock questions): 300939\n  gas: buy (mock pool): 186187\n\n[PASS] test_poolId_matchesTheMainnetFixture() (gas: 20125)\n[PASS] test_poolKey_isTheHooklessEthImdPool() (gas: 24508)\n[PASS] test_reentrancy_aCallerCannotStartASecondZapFromItsRefund() (gas: 523899)\n[PASS] test_strayEth_aCallerOwedARefundItCannotTakeStillReverts() (gas: 455693)\n[PASS] test_strayEth_doesNotStopACallerThatIsOwedNoRefund() (gas: 1367160)\n[PASS] test_strayImdAndEthLeaveWithTheNextCall() (gas: 241861)\n[PASS] test_swap_revertsOnAResultOfTheWrongSign() (gas: 174517)\n[PASS] test_swap_revertsWhenTheManagerDoesNotCountTheEthItWasPaid() (gas: 182458)\n[PASS] test_swap_revertsWhenTheManagerUsesMoreEthThanItWasOffered() (gas: 173285)\n[PASS] test_swap_usesItsOwnPoolKey() (gas: 573339)\n[PASS] test_unlockCallback_onlyThePoolManager() (gas: 36050)\n[PASS] test_zapCannotBeSentEth() (gas: 68234)\nSuite result: ok. 42 passed; 0 failed; 0 skipped; finished in 287.70ms (191.13ms CPU time)\n\nRan 11 tests for test/endowments/Endowments.fuzz.t.sol:EndowmentsFuzzTest\n[PASS] testFuzz_batchSplitNeverExceedsWhatWasMinted(uint256,uint256,uint256) (runs: 256, μ: 868985, ~: 868988)\n[PASS] testFuzz_everyDepositorGetsExactlyTheirOwn(uint256,uint256,uint256,uint256) (runs: 256, μ: 1487465, ~: 1487452)\n[PASS] testFuzz_harvestNeverTakesPrincipal(uint256,uint256) (runs: 256, μ: 789440, ~: 822115)\n[PASS] testFuzz_inKindExitIsWorthThePrincipal(uint256,uint256,uint256) (runs: 256, μ: 824527, ~: 824654)\n[PASS] testFuzz_lossIsSharedInProportion(uint256,uint256,uint256,bool) (runs: 256, μ: 820263, ~: 820353)\n[PASS] testFuzz_potHarvestTakesOutNoMoreThanThePotNeeds(uint256,uint256,uint256) (runs: 256, μ: 1064435, ~: 1064838)\n[PASS] testFuzz_principalComesBackToTheWei(uint256,uint256,uint256) (runs: 256, μ: 772443, ~: 777603)\n[PASS] testFuzz_quoteMatchesExit(uint256,uint256,uint256,bool) (runs: 256, μ: 758387, ~: 757055)\n[PASS] testFuzz_roundingWearIsBounded(uint256,uint8) (runs: 256, μ: 2728886, ~: 2071712)\n[PASS] testFuzz_theGateOpensExactlyAtSpare_andWholeMeansPaidInFull(uint256,uint256) (runs: 256, μ: 993253, ~: 939481)\n[PASS] testFuzz_unstakedEndowmentIsUntouchedByTheVault(uint256,uint256) (runs: 256, μ: 742841, ~: 743297)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 305.35ms (1.58s CPU time)\n\nRan 57 tests for test/endowments/Endowments.harvest.t.sol:EndowmentsHarvestTest\n[PASS] testFuzz_runway_neverLiftsTheMeterAboveThirtyRequests(uint256,uint256,uint256,uint256) (runs: 256, μ: 934311, ~: 837567)\n[PASS] test_harvest_aDonationIsPaidOutAsYield() (gas: 514990)\n[PASS] test_harvest_anyoneMayCall_andTheCallerGetsNothing() (gas: 640628)\n[PASS] test_harvest_leavesBufferedPrincipalAlone() (gas: 1090737)\n[PASS] test_harvest_meter_aCallBackIntoEndowmentsIsRefused() (gas: 920829)\n[PASS] test_harvest_meter_fundsTheFeedsMeter() (gas: 827925)\n[PASS] test_harvest_meter_ifFundRevertsTheYieldStaysStaked() (gas: 1292606)\n[PASS] test_harvest_meter_ifTheFeedWereEverUnknownTheYieldStaysStaked() (gas: 761568)\n[PASS] test_harvest_meter_revertsIfTheMeterPullsLessThanItWasSent() (gas: 822066)\n[PASS] test_harvest_paysARecipientContractThatCannotMoveIMD_becauseItsCreatorChoseIt() (gas: 1793861)\n[PASS] test_harvest_pot_aCallBackIntoEndowmentsIsRefused() (gas: 908403)\n[PASS] test_harvest_pot_aFullPotSendsEverythingToTheFallback() (gas: 730784)\n[PASS] test_harvest_pot_aPotThatAsksAndThenTakesNothingMovesOnlyWhatItAskedFor() (gas: 868579)\n[PASS] test_harvest_pot_aPotThatBurnsItsGasCannotStopTheHarvest() (gas: 1201689)\n[PASS] test_harvest_pot_aPotThatNeedsAtLeastTheYieldGetsAllOfIt() (gas: 869178)\n[PASS] test_harvest_pot_aPotThatNeedsOneWeiIsSentOneWei() (gas: 857440)\n[PASS] test_harvest_pot_aPotThatReturnsHugeDataCannotStopTheHarvest() (gas: 1046372)\n[PASS] test_harvest_pot_aRevertingPotSendsEverythingToTheFallback() (gas: 713522)\n[PASS] test_harvest_pot_aSeriesIsFundedRoundAfterRound() (gas: 1831679)\n[PASS] test_harvest_pot_atTheLeastGasAllowed_aPotThatBurnsEverythingStillLeavesTheFallbackPaid() (gas: 9534882)\n[PASS] test_harvest_pot_chipsInForTheFallbackBeneficiary() (gas: 793413)\n[PASS] test_harvest_pot_ifThePotCannotBeAskedItIsOfferedEverything() (gas: 3030553)\n[PASS] test_harvest_pot_lowGasIsRefusedBeforeThePotIsAsked() (gas: 530046)\n[PASS] test_harvest_pot_noCodeAtThePotsAddressSendsEverythingToTheFallback() (gas: 712068)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback() (gas: 63143865)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback_howeverMuchGasTheVaultUses() (gas: 167837680)\n[PASS] test_harvest_pot_revertsIfThePotTakesMoreThanItWasOffered() (gas: 945518)\n[PASS] test_harvest_pot_revertsWhenThePotCallCouldNotGetItsGas() (gas: 522885)\n[PASS] test_harvest_pot_takesOutOnlyWhatThePotStillNeeds_andTheRestStaysStaked() (gas: 1427737)\n[PASS] test_harvest_pot_whenAShareWeiIsWorthThousandsOfImdWei_theAmountsAreStillExact() (gas: 4302912)\n[PASS] test_harvest_pot_withEnoughGasThePotGetsItsChip() (gas: 710303)\n[PASS] test_harvest_recipientAndMeterNeedNoGasReserve() (gas: 622994)\n[PASS] test_harvest_recordsTheHighestPriceSeen() (gas: 643042)\n[PASS] test_harvest_revertsBelowTheMinimum() (gas: 520910)\n[PASS] test_harvest_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 661861)\n[PASS] test_harvest_revertsIfTheVaultPaysShort() (gas: 660027)\n[PASS] test_harvest_revertsIfTheVaultReportsLessThanItPreviewed() (gas: 658717)\n[PASS] test_harvest_revertsInAStakeBlock() (gas: 1022046)\n[PASS] test_harvest_revertsOnUnknownEndowment() (gas: 36156)\n[PASS] test_harvest_revertsWhenNothingWasEarned() (gas: 467083)\n[PASS] test_harvest_sendsOnlyTheYieldToTheRecipient() (gas: 863754)\n[PASS] test_harvest_thenThePrincipalStillComesBackToTheWei() (gas: 745771)\n[PASS] test_harvest_twiceInARow_theSecondFindsNothing() (gas: 696052)\n[PASS] test_harvest_twoEndowmentsWithTheSamePrincipalEarnTheSame() (gas: 650704)\n[PASS] test_harvest_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 891704)\n[PASS] test_runway_aFullMeterWaitsUntilARequestIsBought() (gas: 1383815)\n[PASS] test_runway_aFundAndDefundAroundAHarvestOnlyDelaysTheYield() (gas: 1294584)\n[PASS] test_runway_aHarvestFillsTheMeterToThirtyRequestsAndNoFurther() (gas: 1088840)\n[PASS] test_runway_aMeterSomeoneElseFilledTakesNothing() (gas: 1030688)\n[PASS] test_runway_afterAPartialHarvestThePrincipalComesBackToTheWei() (gas: 1410060)\n[PASS] test_runway_anAbsurdCostDoesNotOverflow() (gas: 827654)\n[PASS] test_runway_atTheLine_roomForAllOfItAndRoomForOneWeiLess() (gas: 1422493)\n[PASS] test_runway_doesNotApplyToOtherKinds() (gas: 633394)\n[PASS] test_runway_followsTheFeedsCost() (gas: 1560519)\n[PASS] test_runway_ifQuestionsCannotBeReadTheYieldStaysStaked() (gas: 1391194)\n[PASS] test_runway_isThirtyRequests() (gas: 18565)\n[PASS] test_runway_roomBelowTheSmallestHarvestIsNotTaken() (gas: 1185477)\nSuite result: ok. 57 passed; 0 failed; 0 skipped; finished in 347.21ms (466.17ms CPU time)\n\nRan 3 tests for test/rules/ZapDelta.t.sol:ZapDeltaTest\n[PASS] testFuzz_buy_minimumIsCheckedAgainstTheDecodedAmount(int128,uint256) (runs: 256, μ: 200953, ~: 203096)\n[PASS] testFuzz_unlockCallback_acceptsExactlyTheWellSignedDeltasWithinTheEthSent(int128,int128,uint128) (runs: 2000, μ: 137298, ~: 123522)\n[PASS] test_unlockCallback_theCornersOfThePackedWord() (gas: 662703)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 450.38ms (796.81ms CPU time)\n\nRan 7 tests for test/endowments/Endowments.edges.t.sol:EndowmentsEdgesTest\n[PASS] testFuzz_withdraw_twoPiecesInOneBlockAreExact(uint256) (runs: 256, μ: 630019, ~: 629935)\n[PASS] test_anEndowmentEverybodyLeft_isWhole_takesDepositsAgain_andIsExactAgain() (gas: 1511608)\n[PASS] test_createForPot_theNewestPotIsAccepted_theNextIdIsNot() (gas: 287385)\n[PASS] test_seed_isNotRefundable_andIsHarvestedToTheTargetWithTheYield() (gas: 745854)\n[PASS] test_stake_theIntervalIsCountedFromTheLastStakeBlock_toTheBlock() (gas: 705710)\n[PASS] test_views_answerZerosOutsideTheirDomain() (gas: 217868)\n[PASS] test_withdraw_oneDepositorIsPaidWithAnothersFreshDeposit_andTheOtherIsBackedByShares() (gas: 983054)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 450.53ms (451.73ms CPU time)\n\nRan 56 tests for test/rules/RulesFire.t.sol:RulesFireTest\n[PASS] test_canFire_followsEveryGate() (gas: 1043741)\n[PASS] test_cancel_racesAFireOnceTheConditionHolds_andWhicheverLandsFirstDecides() (gas: 593588)\n[PASS] test_check_isOnlyAsGoodAsTheGasItIsGiven() (gas: 371773)\n[PASS] test_feed_theMockAnswersTheFrozenSelector() (gas: 1460)\n[PASS] test_fire_aCopiedFireTakesTheTip_andTheFireItCopiedRevertsHavingMovedNothing() (gas: 495125)\n[PASS] test_fire_aRuleCannotSpendAnotherRulesEscrow() (gas: 651085)\n[PASS] test_fire_aZeroCooldownAllowsFiresBackToBack() (gas: 614712)\n[PASS] test_fire_everyComparison() (gas: 4936246)\n[PASS] test_fire_feed_aNewRoundBelowTheLineDoesNotFire_andDoesNotUseTheRoundUp() (gas: 451305)\n[PASS] test_fire_feed_aRoundThatDoesNotFit64BitsOnlyStopsTheRule() (gas: 1110723)\n[PASS] test_fire_feed_aShortAnswerOnlyStopsTheRule() (gas: 1066402)\n[PASS] test_fire_feed_aSourceThatBurnsItsGasOnlyStopsTheRule() (gas: 863533)\n[PASS] test_fire_feed_aSourceThatRevertsOnlyStopsTheRule() (gas: 454112)\n[PASS] test_fire_feed_aSourceWithoutCodeOnlyStopsTheRule() (gas: 388490)\n[PASS] test_fire_feed_aTimestampWiderThan64BitsOnlyStopsTheRule() (gas: 531871)\n[PASS] test_fire_feed_anAnswerStampedInTheFutureIsNotAnAnswer() (gas: 591923)\n[PASS] test_fire_feed_cooldownAndRoundBothApply() (gas: 675007)\n[PASS] test_fire_feed_doesNotFireBeforeAnyAnswer() (gas: 341364)\n[PASS] test_fire_feed_firesOnAFreshAnswer() (gas: 553445)\n[PASS] test_fire_feed_firesOncePerRound() (gas: 752129)\n[PASS] test_fire_feed_hire() (gas: 879968)\n[PASS] test_fire_feed_respectsTheMaximumAge() (gas: 592662)\n[PASS] test_fire_feed_theCallerCannotStarveTheSourceOfGas() (gas: 549631347)\n[PASS] test_fire_gas() (gas: 1126530)\nLogs:\n  gas: fire, VIEW then PAY: 111553\n  gas: fire, VIEW then HIRE (mock desk): 391443\n\n[PASS] test_fire_gasShort_isACleanRefusal_andAnOrdinaryLimitIsEnough() (gas: 560609)\n[PASS] test_fire_hire_announcesTheFireWithItsOrder() (gas: 819000)\n[PASS] test_fire_hire_eachFireOpensItsOwnOrder() (gas: 1238129)\n[PASS] test_fire_hire_opensTheOrderWithThePinnedTerms() (gas: 982507)\n[PASS] test_fire_hire_refusesADeskThatTakesLessThanTheOrderCosts() (gas: 867330)\n[PASS] test_fire_hire_refusesAnOrderIdItAlreadyKnows() (gas: 1394564)\n[PASS] test_fire_hire_refusesAnyOtherSpec() (gas: 610667)\n[PASS] test_fire_hire_whenTheDeskRefusesNothingChanges() (gas: 720537)\n[PASS] test_fire_pay_announcesTheFire() (gas: 443014)\n[PASS] test_fire_pay_ignoresWhateverSpecBytesTheCallerSends() (gas: 442090)\n[PASS] test_fire_pay_paysTheRecipientAndTipsTheCaller() (gas: 547469)\n[PASS] test_fire_refusesACancelledRule() (gas: 393407)\n[PASS] test_fire_refusesAnUnknownRule() (gas: 59483)\n[PASS] test_fire_refusesWhenTheConditionIsFalse() (gas: 398342)\n[PASS] test_fire_refusesWhenTheEscrowIsShort() (gas: 565383)\n[PASS] test_fire_respectsTheCooldown() (gas: 656494)\n[PASS] test_fire_stopsAtTheMaximumNumberOfFires() (gas: 652427)\n[PASS] test_fire_theCreatorMayFireItsOwnRule() (gas: 438631)\n[PASS] test_fire_theFirstFireNeedsNoCooldown() (gas: 476318)\n[PASS] test_fire_view_aTargetThatAnswersWithTooFewBytesOnlyStopsTheRule() (gas: 622956)\n[PASS] test_fire_view_aTargetThatBurnsItsGasOnlyStopsTheRule() (gas: 857371)\nLogs:\n  gas: check() against a target that spins: 113336\n\n[PASS] test_fire_view_aTargetThatRevertsOnlyStopsTheRule() (gas: 447888)\n[PASS] test_fire_view_aTargetThatTriesToWriteOnlyStopsTheRule() (gas: 782935)\n[PASS] test_fire_view_aTargetWithoutCodeOnlyStopsTheRule() (gas: 360895)\n[PASS] test_fire_view_aVeryLongAnswerIsReadByItsFirstWordOnly() (gas: 525441)\n[PASS] test_fire_view_exactly32BytesIsEnough() (gas: 502092)\n[PASS] test_fire_view_readsAFourArgumentView() (gas: 544048)\n[PASS] test_fire_view_readsAOneArgumentView() (gas: 573168)\n[PASS] test_fire_view_readsATargetThatAnswersPlainCalls() (gas: 559487)\n[PASS] test_fire_view_theCallerCannotStarveTheConditionOfGas() (gas: 553870395)\n[PASS] test_fire_view_theLongestCalldataLeavesTheAllowanceWhole() (gas: 691184220)\n[PASS] test_fire_withoutATipPaysTheCallerNothing() (gas: 456918)\nSuite result: ok. 56 passed; 0 failed; 0 skipped; finished in 450.54ms (768.45ms CPU time)\n\nRan 18 tests for test/rules/RulesFuzz.t.sol:RulesFuzzTest\n[PASS] testFuzz_conditionDataLength(uint16) (runs: 256, μ: 188421, ~: 257725)\n[PASS] testFuzz_cooldown(uint32,uint32) (runs: 256, μ: 532028, ~: 483362)\n[PASS] testFuzz_costMustFitAnEscrow(uint96,uint96) (runs: 256, μ: 163153, ~: 229238)\n[PASS] testFuzz_feed_answerLength(uint16) (runs: 256, μ: 403387, ~: 351734)\n[PASS] testFuzz_feed_anyAnswer(uint256,uint256,uint256,uint8,uint256,uint32,bool) (runs: 256, μ: 419904, ~: 422128)\n[PASS] testFuzz_feed_freshnessAndRound(uint32,uint32,uint64,uint64) (runs: 256, μ: 679520, ~: 640666)\n[PASS] testFuzz_hire_changeComesBackExactly(uint96,uint96,uint96,uint96) (runs: 256, μ: 1155884, ~: 1158977)\n[PASS] testFuzz_hire_deliveryTimeAgreesWithTheDesk(uint32,bool) (runs: 256, μ: 377411, ~: 110758)\n[PASS] testFuzz_hire_flagsAgreeWithTheDesk(uint8) (runs: 256, μ: 322296, ~: 103367)\n[PASS] testFuzz_pay_sumsAreExact(uint96,uint96,uint96,uint8) (runs: 256, μ: 728581, ~: 456039)\n[PASS] testFuzz_spec_arbitraryBytesAgreeWithTheDesk(bytes) (runs: 256, μ: 85919, ~: 68820)\n[PASS] testFuzz_spec_lengthLimit(uint16) (runs: 256, μ: 3143144, ~: 4366471)\n[PASS] testFuzz_spec_nearlyValidTextAgreesWithTheDesk(uint256,uint16,uint16,uint8) (runs: 256, μ: 691049, ~: 659110)\n[PASS] testFuzz_spec_oneRefusedByteIsFoundWhereItIs(uint16,uint16,uint8) (runs: 256, μ: 2505379, ~: 1017001)\n[PASS] testFuzz_twoRulesNeverShareMoney(uint96,uint96,uint96,uint8) (runs: 256, μ: 1075046, ~: 903067)\n[PASS] testFuzz_view_anyAnswer(bytes,uint8,uint256) (runs: 256, μ: 329957, ~: 321366)\n[PASS] testFuzz_view_comparisonAtTheLine(uint8,uint256,uint8) (runs: 256, μ: 336852, ~: 337118)\n[PASS] testFuzz_view_comparisonMatchesTheReference(uint8,uint256,uint256) (runs: 256, μ: 358827, ~: 359404)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 450.63ms (2.23s CPU time)\n\nRan 2 tests for test/rules/ZapInvariant.t.sol:ZapInvariantTest\n[PASS]\nZapInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_everyWeiIsAccountedFor\n[PASS] invariant_zapKeepsNothingOfACallers\n ZapInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭------------+-----------+-------+---------+----------╮\n| Contract   | Selector  | Calls | Reverts | Discards |\n+=====================================================+\n| ZapHandler | buy       | 856   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | chipIn    | 820   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | fundMeter | 839   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | openPot   | 882   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | passTime  | 878   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushEth   | 836   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushImd   | 919   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setDepth  | 840   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setPrice  | 810   | 0       | 0        |\n╰------------+-----------+-------+---------+----------╯\n\nLogs:\n  chipIn: 10\n  chipIn reverted: 6\n  fundMeter: 5\n  fundMeter reverted: 10\n  buy: 4\n  buy reverted: 9\n  served through the relay: 5\n    of which with stray ETH waiting in Zap: 4\n  calls that carried a deadline already passed: 7\n  calls that carried this very second: 9\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 5316609)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.39s (1.39s CPU time)\n\nRan 2 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsLossInvariantTest\n[PASS]\nEndowmentsLossInvariantTest invariants:\n[PASS] invariant_loss_bookedSharesWithinSimdHeld\n[PASS] invariant_loss_bufferIsExactlyTheImdHeld\n[PASS] invariant_loss_principalBooksAgree\n[PASS] invariant_loss_sharedFairlyAndHarvestStops\n EndowmentsLossInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 581   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 520   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 557   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 562   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 561   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 529   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 564   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 617   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | lose                | 569   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 573   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 606   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 570   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 588   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 586   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 552   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 524   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 541   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 1\n    to the meter: 1\n    to the meter, cut to the room under the runway: 1\n  meter harvests that had to wait for room: 6\n\n[PASS] test_handler_reachesLossBehaviour() (gas: 3315397)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.39s (6.38s CPU time)\n\nRan 2 tests for test/rules/RulesInvariant.t.sol:RulesInvariantTest\n[PASS]\nRulesInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_cancelledRulesAndOrderLinks\n[PASS] invariant_eachRulesEscrowIsConserved\n[PASS] invariant_escrowsPlusMoneyOnOrdersEqualsHeldPlusOwed\n[PASS] invariant_firesRespectCooldownAndMaximum\n[PASS] invariant_holdingsCoverEveryEscrow\n[PASS] invariant_nothingIsCreatedOrLost\n RulesInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| RulesHandler | cancel        | 363   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | createRule    | 665   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskAwardBond | 332   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskDeliver   | 673   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskRefund    | 355   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | fire          | 2199  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | pushFeed      | 339   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | recall        | 291   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | reconcile     | 702   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | setGauge      | 348   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | stray         | 353   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | topUp         | 354   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | warp          | 706   | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  rules: 10\n  orders: 4\n  fires: 7\n  fires refused: 27\n    rule cancelled: 15\n    rule exhausted: 6\n    escrow short: 6\n    condition false or cooling down: 0\n  reconciles: 13\n  recalls: 2\n  deliveries: 0\n  refunds: 2\n  bond awards: 0\n  cancels: 5\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 11439536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.67s (6.68s CPU time)\n\nRan 3 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsInvariantTest\n[PASS]\nEndowmentsInvariantTest invariants:\n[PASS] invariant_E1_holdingsCoverPrincipal\n[PASS] invariant_E2_bookedSharesWithinSimdHeld\n[PASS] invariant_E3_exactWithdrawalsOnlyWaitForAHold\n[PASS] invariant_bufferIsExactlyTheImdHeld\n[PASS] invariant_priceMarkFollowsThePrice\n[PASS] invariant_principalBooksAgree\n EndowmentsInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 622   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 572   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 546   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 587   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 631   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 626   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 623   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 618   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 580   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 584   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 597   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 612   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 591   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 583   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 3\n    to the meter: 2\n    to the meter, cut to the room under the runway: 2\n  meter harvests that had to wait for room: 2\n\n[PASS] test_handler_reachesEveryBehaviour() (gas: 4633194)\n[PASS] test_handler_reachesTheMeterRunway() (gas: 3366239)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.02s (7.02s CPU time)\n\nRan 23 test suites in 7.02s (25.14s CPU time): 441 tests passed, 0 failed, 0 skipped (441 total tests)\n","passed":true},{"durationMs":92,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Endowments.createForMeter(bytes32)\",\"Endowments.createForPot(uint256,address)\",\"Endowments.createForRecipient(address)\",\"Endowments.deposit(uint256,uint256)\",\"Endowments.donate(uint256,uint256)\",\"Endowments.exit(uint256,uint256,uint256,bool)\",\"Endowments.harvest(uint256)\",\"Endowments.stake()\",\"Endowments.withdraw(uint256,uint256)\",\"Rules.cancel(uint256)\",\"Rules.fire(uint256,bytes)\",\"Rules.onWorkDelivered(uint256,bytes16,bytes32)\",\"Rules.recall(uint256,uint256)\",\"Rules.reconcile(uint256,uint256)\",\"Rules.topUp(uint256,uint96)\",\"Zap.buy(uint256,uint256)\",\"Zap.chipIn(uint256,uint256,uint256)\",\"Zap.fundMeter(bytes32,uint256,uint256)\",\"Zap.unlockCallback(bytes)\"],\"files\":{\".gitignore\":12,\"ADAPTATION.md\":119,\"LICENSE\":21,\"README.md\":307,\"docs/DEVIATIONS.md\":207,\"docs/LAUNCH.md\":714,\"docs/THREATS.md\":752,\"foundry.toml\":45,\"integration/foundry.toml\":54,\"integration/test/DeploymentsBook.t.sol\":75,\"integration/test/DocumentedCommands.t.sol\":132,\"integration/test/EndowmentsWithRealSiblings.t.sol\":308,\"integration/test/RulesWithRealDesk.t.sol\":393,\"integration/test/RulesWithRealQuestions.t.sol\":199,\"integration/test/Siblings.sol\":143,\"integration/test/StandInsAgree.t.sol\":429,\"integration/test/ZapWithRealSiblings.t.sol\":169,\"remappings.txt\":2,\"src/endowments/Endowments.sol\":951,\"src/interfaces/ICrowdPots.sol\":21,\"src/interfaces/IQuestions.sol\":57,\"src/interfaces/IWorkOrders.sol\":113,\"src/interfaces/external/Mainnet.sol\":55,\"src/rules/Rules.sol\":855,\"src/rules/Zap.sol\":287,\"src/rules/v4/IPoolManagerLike.sol\":68,\"test/endowments/Endowments.audit.t.sol\":124,\"test/endowments/Endowments.create.t.sol\":362,\"test/endowments/Endowments.edges.t.sol\":193,\"test/endowments/Endowments.flow.t.sol\":702,\"test/endowments/Endowments.fuzz.t.sol\":319,\"test/endowments/Endowments.harvest.t.sol\":1055,\"test/endowments/Endowments.loss.t.sol\":513,\"test/endowments/EndowmentsBase.sol\":200,\"test/endowments/MockStakedIMD.t.sol\":158,\"test/endowments/fork/Endowments.fork.t.sol\":442,\"test/endowments/invariant/Endowments.invariant.t.sol\":442,\"test/endowments/invariant/EndowmentsHandler.sol\":487,\"test/endowments/mocks/MockCrowdPots.sol\":207,\"test/endowments/mocks/MockIMD.sol\":35,\"test/endowments/mocks/MockQuestions.sol\":202,\"test/endowments/mocks/MockStakedIMD.sol\":196,\"test/fixtures/endowments/simd-block-26164296.json\":76,\"test/fixtures/rules/eth-imd-pool.json\":22,\"test/fixtures/rules/records/e9efec16-skill-research-report-3db99325.hex\":1,\"test/kit/EarlierLaunches.sol\":33,\"test/kit/LiveSiblings.sol\":254,\"test/kit/RecordKit.sol\":250,\"test/kit/RecordMaker.sol\":103,\"test/launch/Bytecode.sol\":53,\"test/launch/LaunchBench.sol\":83,\"test/launch/LaunchC.t.sol\":685,\"test/launch/LaunchDoc.sol\":201,\"test/launch/LaunchManifest.sol\":112,\"test/launch/LaunchRunbook.t.sol\":651,\"test/launch/fork/LaunchC.fork.t.sol\":505,\"test/launch/fork/LiveSiblings.fork.t.sol\":469,\"test/rules/RulesBase.sol\":148,\"test/rules/RulesCreate.t.sol\":685,\"test/rules/RulesDeskScenario.sol\":131,\"test/rules/RulesDeskScenario.t.sol\":39,\"test/rules/RulesEdges.t.sol\":313,\"test/rules/RulesFire.t.sol\":902,\"test/rules/RulesFuzz.t.sol\":433,\"test/rules/RulesInvariant.t.sol\":566,\"test/rules/RulesMoney.t.sol\":579,\"test/rules/Zap.t.sol\":777,\"test/rules/ZapDelta.t.sol\":162,\"test/rules/ZapInvariant.t.sol\":454,\"test/rules/fork/RulesAndZapFork.t.sol\":395,\"test/rules/fork/RulesDeskFork.t.sol\":70,\"test/rules/mocks/BareDesk.sol\":13,\"test/rules/mocks/MockDesk.sol\":245,\"test/rules/mocks/MockFeed.sol\":43,\"test/rules/mocks/MockIMD.sol\":13,\"test/rules/mocks/MockPoolManager.sol\":101,\"test/rules/mocks/MockPots.sol\":97,\"test/rules/mocks/MockQuestions.sol\":102,\"test/rules/mocks/Targets.sol\":86,\"test/scaffold/Interfaces.t.sol\":74},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"308a42304b2b7a431a0ae9ba228c9872855b5f207901720690a2feccfcfab1f6","verifiedTreeHash":"83e9a7d2e5d7b2dd80282e715608652a1597ecc7","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":153483,"exitCode":0,"name":"build","output":"Compiling 91 files with Solc 0.8.26\nSolc 0.8.26 finished in 153.38s\nCompiler run successful!\n","passed":true},{"durationMs":7580,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/scaffold/Interfaces.t.sol:InterfacesCompileTest\n[PASS] test_theAddressesThisLaunchIsGiven() (gas: 239)\n[PASS] test_whatEndowmentsAndZapCallOnThePots() (gas: 151)\n[PASS] test_whatRulesCallsOnTheDesk() (gas: 283)\n[PASS] test_whatThisLaunchCallsOnQuestions() (gas: 327)\n[PASS] test_whatZapCallsOnUniswap() (gas: 437)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 191.91µs (153.40µs CPU time)\n\nRan 1 test for test/rules/RulesDeskScenario.t.sol:RulesDeskScenarioTest\n[PASS] test_scenario_aHireRuleWalksThroughTheStandInDesk() (gas: 6694201)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.64ms (2.25ms CPU time)\n\nRan 2 tests for test/endowments/Endowments.audit.t.sol:EndowmentsAuditTest\n[PASS] test_audit_aMeterEndowmentsYieldWaitsForAsLongAsTheFeedIsNotSold() (gas: 1333828)\n[PASS] test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen() (gas: 3500129)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.32ms (2.85ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.create.t.sol:EndowmentsCreateTest\n[PASS] test_constructor_constants() (gas: 39563)\n[PASS] test_constructor_makesNoCallAndNeedsNoCodeAtItsArguments() (gas: 36642)\n[PASS] test_constructor_revertsOnAnyZeroAddress() (gas: 4856)\n[PASS] test_constructor_storesTheFourAddresses() (gas: 43551)\n[PASS] test_createForMeter_recordsTheFeed() (gas: 233421)\n[PASS] test_createForMeter_revertsForAnIdThatIsNotAFeed() (gas: 55101)\n[PASS] test_createForMeter_revertsIfQuestionsHasNoCode() (gas: 93268)\n[PASS] test_createForMeter_revertsOnZeroFeed() (gas: 33017)\n[PASS] test_createForMeter_revertsWhileTheFeedCannotBeAsked_andWorksOnceItCan() (gas: 252863)\n[PASS] test_createForPot_acceptsASeries() (gas: 217470)\n[PASS] test_createForPot_recordsThePotAndTheFallback() (gas: 223321)\n[PASS] test_createForPot_revertsForAPotThatDoesNotExistYet() (gas: 414087)\n[PASS] test_createForPot_revertsIfCrowdPotsHasNoCode() (gas: 92497)\n[PASS] test_createForPot_revertsWithoutAUsableFallback() (gas: 169639)\n[PASS] test_createForRecipient_acceptsAnyOtherContract() (gas: 1082671)\n[PASS] test_createForRecipient_recordsTheRecipient() (gas: 141295)\n[PASS] test_createForRecipient_refusesTheVault_soNoHarvestCanBeCollectedByAOneBlockStaker() (gas: 138946)\n[PASS] test_createForRecipient_revertsWhereTheYieldWouldBeStranded() (gas: 167298)\n[PASS] test_create_idsFollowTheOrderOfCreation() (gas: 245549)\n[PASS] test_create_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 191139)\n[PASS] test_create_revertsWhenTheSeedCannotBePulled() (gas: 317384)\n[PASS] test_endowment_unknownIdReadsAsNone() (gas: 43397)\n[PASS] test_launch_create2FromInitcode_staysInsideOurGates() (gas: 2763356)\nLogs:\n  create2 gas: 2694036\n  runtime bytes: 13161\n  initcode bytes with the four argument words: 13874\n\n[PASS] test_setUp_createdOneEndowmentOfEachKind() (gas: 100844)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 6.24ms (6.70ms CPU time)\n\nRan 51 tests for test/endowments/Endowments.flow.t.sol:EndowmentsFlowTest\n[PASS] test_backingOf_countsBufferAndShares() (gas: 609236)\n[PASS] test_cushion_aBatchCostsAtMostTwoShareWei_andAWithdrawalAtMostOne() (gas: 888170)\n[PASS] test_deposit_addsUpPerDepositorAndPerEndowment() (gas: 471708)\n[PASS] test_deposit_recordsPrincipalAndBuffersTheImd() (gas: 272524)\n[PASS] test_deposit_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 195228)\n[PASS] test_deposit_revertsOnUnknownEndowment() (gas: 62399)\n[PASS] test_deposit_revertsOnZero() (gas: 36841)\n[PASS] test_deposit_revertsWithoutAllowance() (gas: 138375)\n[PASS] test_donate_addsToTheBufferButIsNobodysPrincipal() (gas: 173492)\n[PASS] test_donate_revertsOnZeroAndOnUnknownEndowment() (gas: 61069)\n[PASS] test_exit_inImd_isTheSameAsWithdrawWhileTheEndowmentIsWhole() (gas: 481551)\n[PASS] test_exit_inKind_cannotTakeMoreThanTheCallersPrincipal() (gas: 507131)\n[PASS] test_exit_inKind_paysTheBufferedPartInImd() (gas: 720042)\n[PASS] test_exit_inKind_revertsIfTheCallerAsksForMoreThanTheSharesAreWorth() (gas: 461332)\n[PASS] test_exit_inKind_worksInTheStakeBlock_andTheSharesAreWorthThePrincipal() (gas: 657216)\n[PASS] test_exit_inKind_worksWhileSomeoneElseHoldsTheContract() (gas: 690530)\n[PASS] test_exit_revertsIfTheCallerAsksForMoreThanTheirPrincipalIsWorth() (gas: 160780)\n[PASS] test_exit_revertsOnZeroAndOnUnknownEndowment() (gas: 173426)\n[PASS] test_nextStakeBlock_followsTheLastStake() (gas: 241264)\n[PASS] test_quote_matchesWhatWithdrawAndExitPay() (gas: 596931)\n[PASS] test_stake_anEndowmentLeftAloneForSeveralBatchesKeepsItsOwnSplit() (gas: 1853914)\n[PASS] test_stake_anyoneMayCall() (gas: 333132)\n[PASS] test_stake_movesTheWholeBufferIntoTheVaultInOneDeposit() (gas: 530886)\n[PASS] test_stake_recordsTheHighestPriceSeen() (gas: 783751)\n[PASS] test_stake_revertsIfTheBatchWouldMintNothing() (gas: 306160)\n[PASS] test_stake_revertsIfTheVaultIsNotOverImd() (gas: 2328465)\n[PASS] test_stake_revertsIfTheVaultMintsFewerSharesThanItPreviewed() (gas: 408721)\n[PASS] test_stake_revertsIfTheVaultReportsFewerSharesThanItPreviewed() (gas: 408316)\n[PASS] test_stake_revertsInsideTheInterval() (gas: 660329)\n[PASS] test_stake_revertsWithAnEmptyBuffer() (gas: 256473)\n[PASS] test_stake_splitsTheBatchInProportion_andNeverHandsOutMoreThanWasMinted() (gas: 955727)\n[PASS] test_stake_theSplitIsBookedOnTheNextTouch() (gas: 575765)\n[PASS] test_stake_theVaultsOwnRoundingNeverTripsTheMark() (gas: 2248038)\n[PASS] test_vaultHold_reportsAHoldWhoeverCausedIt() (gas: 772390)\n[PASS] test_withdraw_afterStaking_isExactToTheWei_withNoYieldAtAll() (gas: 571230)\n[PASS] test_withdraw_fromTheBuffer_isExactAndNeverAsksTheVault() (gas: 263959)\n[PASS] test_withdraw_inAStakeBlock_revertsHoldActive_andWorksOneBlockLater() (gas: 562555)\n[PASS] test_withdraw_inAStakeBlock_stillPaysWhatTheBufferCovers() (gas: 653201)\n[PASS] test_withdraw_oddAmountsAndManyPieces_areEachExact() (gas: 910827)\n[PASS] test_withdraw_principalInOneEndowmentCannotBeTakenFromAnother() (gas: 268366)\n[PASS] test_withdraw_revertsAboveTheCallersOwnPrincipal() (gas: 319586)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItPreviewed() (gas: 539389)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 638727)\n[PASS] test_withdraw_revertsIfTheVaultPaysShort() (gas: 540515)\n[PASS] test_withdraw_revertsIfTheVaultReportsMoreBurnedThanItPreviewed() (gas: 540124)\n[PASS] test_withdraw_revertsIfTheVaultSaysImdLeavesForNoShares() (gas: 465552)\n[PASS] test_withdraw_revertsOnUnknownEndowment() (gas: 35509)\n[PASS] test_withdraw_revertsOnZero() (gas: 145094)\n[PASS] test_withdraw_usesTheBufferFirst_thenTheVault() (gas: 879140)\n[PASS] test_withdraw_whenSomeoneDepositsIntoTheVaultInOurName_waitsOneBlock() (gas: 909712)\n[PASS] test_withdraw_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 775431)\nSuite result: ok. 51 passed; 0 failed; 0 skipped; finished in 19.15ms (17.58ms CPU time)\n\nRan 9 tests for test/endowments/MockStakedIMD.t.sol:MockStakedIMDTest\n[PASS] testFuzz_priceNeverFallsFromDepositsAndExits(uint256,uint256) (runs: 256, μ: 334503, ~: 334645)\n[PASS] test_depositMintsWhatThePreviewSaid_andWithdrawBurnsWhatThePreviewSaid() (gas: 227648)\n[PASS] test_fixture_depositAndWithdrawPreviewsMatchTheRealVault() (gas: 481198)\n[PASS] test_fixture_mintAndRedeemPreviewsMatchTheRealVault() (gas: 586282)\n[PASS] test_fixture_totalAssetsIsTheVaultsImdBalance() (gas: 300741)\n[PASS] test_hold_aMintBlocksThatHoldersExitInTheSameBlockOnly() (gas: 262077)\n[PASS] test_hold_travelsWithATransfer_butNeverBackwards() (gas: 420930)\n[PASS] test_hold_zeroAmountsStampNothing() (gas: 205206)\n[PASS] test_plainTransferIsYield_andLoseIsALoss() (gas: 152558)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 28.30ms (29.84ms CPU time)\n\nRan 18 tests for test/launch/LaunchC.t.sol:LaunchCTest\n[PASS] test_launch_aMissingAddressIsRefused() (gas: 2417285)\n[PASS] test_launch_beforeTheDependenciesExistEveryUseReverts() (gas: 7098752)\n[PASS] test_launch_constructorCodeHoldsNoCallAndNoCodeCheck() (gas: 11075257)\n[PASS] test_launch_constructorsAreNonpayable() (gas: 759331)\n[PASS] test_launch_constructorsTouchNothingOutsideTheirOwnContract() (gas: 7043090)\n[PASS] test_launch_deploysInManifestOrderOnAnEmptyChain() (gas: 7006356)\n[PASS] test_launch_noForbiddenInstructionInAnyDeployedRuntime() (gas: 66671111)\n[PASS] test_launch_noFunctionNamesAnOwnerOrAPowerToChange() (gas: 4208422)\n[PASS] test_launch_onceTheDependenciesExistEachContractWorks() (gas: 16271964)\n[PASS] test_launch_sizeAndGasGates() (gas: 6902563)\nLogs:\n  contract: Rules\n    runtime bytes: 13762\n    initcode bytes, with arguments: 14217\n  contract: Endowments\n    runtime bytes: 13161\n    initcode bytes, with arguments: 13874\n  contract: Zap\n    runtime bytes: 3834\n    initcode bytes, with arguments: 4586\n  initcode bytes, whole launch: 32677\n  gas, three CREATE2 in one call (measured here): 6835468\n  gas, at 241 per initcode byte (a real launch's rate): 7875157\n\n[PASS] test_launch_stateChangingFunctionsAreExactlyTheDocumentedOnes() (gas: 10654155)\n[PASS] test_manifest_everyArgumentInTheDocumentIsWhatTheCodeExpects() (gas: 396246)\n[PASS] test_manifest_literals() (gas: 21340)\n[PASS] test_manifest_namesAndArgumentsFitTheLaunchRules() (gas: 75432)\n[PASS] test_manifest_theDocumentNamesTheThreeContractsInOrder() (gas: 988200)\n[PASS] test_manifest_theEarlierLaunchesAreWrittenWithTheirLiveAddresses() (gas: 2576058)\n[PASS] test_scan_findsADelegatecallInCompiledCodeAndNotInAConstant() (gas: 515957)\n[PASS] test_scan_seesInstructionsAndStepsOverPushData() (gas: 24153)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 220.20ms (318.49ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.loss.t.sol:EndowmentsLossTest\n[PASS] test_loss_aDonationMakesAShortEndowmentWholeAgain() (gas: 934277)\n[PASS] test_loss_bufferedImdIsSharedInTheSameProportion() (gas: 907146)\n[PASS] test_loss_exitRespectsTheCallersMinimum() (gas: 779050)\n[PASS] test_loss_harvestTakesNothingFromAShortEndowment() (gas: 634889)\n[PASS] test_loss_inKindExitHandsOverTheSameSliceInShares() (gas: 711841)\n[PASS] test_loss_inKindExitRespectsTheCallersMinimum() (gas: 642777)\n[PASS] test_loss_isSharedProRata_theFirstToLeaveCannotTakeEverything() (gas: 844734)\n[PASS] test_loss_makesTheEndowmentShort() (gas: 612829)\n[PASS] test_loss_noNewDepositsWhileShort() (gas: 916568)\n[PASS] test_loss_partialExitsLeaveTheRestNoWorseOff() (gas: 709956)\n[PASS] test_loss_totalLossPaysNothingButStillLetsDepositorsClose() (gas: 663792)\n[PASS] test_loss_whileTheVaultHoldsTheContract_theImdExitWaitsButTheInKindExitDoesNot() (gas: 1065119)\n[PASS] test_loss_withdrawRefusesToPayLessThanWasAsked() (gas: 649773)\n[PASS] test_loss_yieldMakesAShortEndowmentWholeAgain() (gas: 885318)\n[PASS] test_priceFall_aNewDepositWaitsInTheBufferAndComesBackToTheWei() (gas: 886026)\n[PASS] test_priceFall_bothResumeOnceThePriceIsBack() (gas: 1186793)\n[PASS] test_priceFall_stakeAndHarvestStop_andTheYieldKeptCoversASecondFall() (gas: 1599634)\n[PASS] test_priceFall_thatNoStakeOrHarvestSaw_eatsYieldFirstAndNeverPrincipal() (gas: 943544)\n[PASS] test_priceFall_thePriceAtTheMarkIsNotAFall() (gas: 910259)\n[PASS] test_spare_aDepositTheGateAccepts_isStakedAndComesBackToTheWei() (gas: 1723094)\n[PASS] test_spare_none_isCoveredButNotWhole_andTakesNoDeposit() (gas: 1179073)\n[PASS] test_spare_none_noWithdrawalLeavesTheOthersAShareWeiShort() (gas: 8558702)\n[PASS] test_spare_theLineIsExactlyAtSpare() (gas: 2525702)\n[PASS] test_spare_whileWhole_anyPartOfOnesPrincipalIsPaid() (gas: 4005527)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 224.54ms (18.90ms CPU time)\n\nRan 42 tests for test/rules/Zap.t.sol:ZapTest\n[PASS] testFuzz_buy_minimumOut(uint256,uint256,uint256) (runs: 256, μ: 230535, ~: 230544)\n[PASS] testFuzz_chipIn_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 452612, ~: 456677)\n[PASS] testFuzz_deadline_runsExactlyWhenNotLate(uint256,uint256,uint8) (runs: 256, μ: 251756, ~: 260183)\n[PASS] testFuzz_fundMeter_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 706246, ~: 710998)\n[PASS] test_buy_minimumOutAndNoEth() (gas: 193935)\n[PASS] test_buy_refundsTheEthThePoolCouldNotUse() (gas: 234154)\n[PASS] test_buy_sendsTheImdToTheCaller() (gas: 199726)\n[PASS] test_chipIn_minimumOut_passesAtTheExactAmountAndFailsOneAbove() (gas: 444556)\n[PASS] test_chipIn_minimumOut_protectsAgainstAWorsePrice() (gas: 271681)\n[PASS] test_chipIn_refundsTheEthThePoolCouldNotUse() (gas: 346704)\n[PASS] test_chipIn_revertsWhenTheCallerCannotTakeItsEthBack() (gas: 855551)\n[PASS] test_chipIn_revertsWhenThePoolGivesNothing_evenWithAZeroMinimum() (gas: 186549)\n[PASS] test_chipIn_revertsWhenThePotTakesNothing() (gas: 952239)\n[PASS] test_chipIn_revertsWithoutEth() (gas: 104386)\n[PASS] test_chipIn_sendsBackTheImdThePotDidNotNeed() (gas: 351471)\n[PASS] test_chipIn_swapsAndChipsInTheCallersName() (gas: 344805)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9083)\n[PASS] test_constructor_recordsItsArguments() (gas: 30582)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 4591)\n[PASS] test_deadline_isCheckedBeforeEverythingElse() (gas: 175381)\n[PASS] test_deadline_runsInItsLastSecondAndRevertsOneSecondLater() (gas: 820970)\n[PASS] test_deadline_zeroIsNotNoDeadline() (gas: 40894)\n[PASS] test_fundMeter_creditsSharesAtTheMetersWorth() (gas: 563760)\n[PASS] test_fundMeter_minimumOutAndNoEth() (gas: 464181)\n[PASS] test_fundMeter_refundsTheEthThePoolCouldNotUse() (gas: 317294)\n[PASS] test_fundMeter_revertsWhenNoSharesAreCredited() (gas: 342388)\n[PASS] test_fundMeter_revertsWhenQuestionsRefuses() (gas: 231534)\n[PASS] test_fundMeter_sendsBackTheImdTheMeterDidNotTake() (gas: 346680)\n[PASS] test_fundMeter_swapsAndFundsInTheCallersName() (gas: 329138)\n[PASS] test_gas() (gas: 681658)\nLogs:\n  gas: chipIn (mock pool, mock pots): 252710\n  gas: fundMeter (mock pool, mock questions): 300939\n  gas: buy (mock pool): 186187\n\n[PASS] test_poolId_matchesTheMainnetFixture() (gas: 20125)\n[PASS] test_poolKey_isTheHooklessEthImdPool() (gas: 24508)\n[PASS] test_reentrancy_aCallerCannotStartASecondZapFromItsRefund() (gas: 523899)\n[PASS] test_strayEth_aCallerOwedARefundItCannotTakeStillReverts() (gas: 455693)\n[PASS] test_strayEth_doesNotStopACallerThatIsOwedNoRefund() (gas: 1367160)\n[PASS] test_strayImdAndEthLeaveWithTheNextCall() (gas: 241861)\n[PASS] test_swap_revertsOnAResultOfTheWrongSign() (gas: 174517)\n[PASS] test_swap_revertsWhenTheManagerDoesNotCountTheEthItWasPaid() (gas: 182458)\n[PASS] test_swap_revertsWhenTheManagerUsesMoreEthThanItWasOffered() (gas: 173285)\n[PASS] test_swap_usesItsOwnPoolKey() (gas: 573339)\n[PASS] test_unlockCallback_onlyThePoolManager() (gas: 36050)\n[PASS] test_zapCannotBeSentEth() (gas: 68234)\nSuite result: ok. 42 passed; 0 failed; 0 skipped; finished in 234.00ms (238.65ms CPU time)\n\nRan 11 tests for test/endowments/Endowments.fuzz.t.sol:EndowmentsFuzzTest\n[PASS] testFuzz_batchSplitNeverExceedsWhatWasMinted(uint256,uint256,uint256) (runs: 256, μ: 868986, ~: 868982)\n[PASS] testFuzz_everyDepositorGetsExactlyTheirOwn(uint256,uint256,uint256,uint256) (runs: 256, μ: 1487461, ~: 1487425)\n[PASS] testFuzz_harvestNeverTakesPrincipal(uint256,uint256) (runs: 256, μ: 791742, ~: 822142)\n[PASS] testFuzz_inKindExitIsWorthThePrincipal(uint256,uint256,uint256) (runs: 256, μ: 824530, ~: 824661)\n[PASS] testFuzz_lossIsSharedInProportion(uint256,uint256,uint256,bool) (runs: 256, μ: 820274, ~: 820353)\n[PASS] testFuzz_potHarvestTakesOutNoMoreThanThePotNeeds(uint256,uint256,uint256) (runs: 256, μ: 1064431, ~: 1064838)\n[PASS] testFuzz_principalComesBackToTheWei(uint256,uint256,uint256) (runs: 256, μ: 772951, ~: 777616)\n[PASS] testFuzz_quoteMatchesExit(uint256,uint256,uint256,bool) (runs: 256, μ: 758376, ~: 757055)\n[PASS] testFuzz_roundingWearIsBounded(uint256,uint8) (runs: 256, μ: 2759314, ~: 2071712)\n[PASS] testFuzz_theGateOpensExactlyAtSpare_andWholeMeansPaidInFull(uint256,uint256) (runs: 256, μ: 997886, ~: 939481)\n[PASS] testFuzz_unstakedEndowmentIsUntouchedByTheVault(uint256,uint256) (runs: 256, μ: 742920, ~: 743309)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 255.07ms (1.59s CPU time)\n\nRan 56 tests for test/rules/RulesFire.t.sol:RulesFireTest\n[PASS] test_canFire_followsEveryGate() (gas: 1043741)\n[PASS] test_cancel_racesAFireOnceTheConditionHolds_andWhicheverLandsFirstDecides() (gas: 593588)\n[PASS] test_check_isOnlyAsGoodAsTheGasItIsGiven() (gas: 371773)\n[PASS] test_feed_theMockAnswersTheFrozenSelector() (gas: 1460)\n[PASS] test_fire_aCopiedFireTakesTheTip_andTheFireItCopiedRevertsHavingMovedNothing() (gas: 495125)\n[PASS] test_fire_aRuleCannotSpendAnotherRulesEscrow() (gas: 651085)\n[PASS] test_fire_aZeroCooldownAllowsFiresBackToBack() (gas: 614712)\n[PASS] test_fire_everyComparison() (gas: 4936246)\n[PASS] test_fire_feed_aNewRoundBelowTheLineDoesNotFire_andDoesNotUseTheRoundUp() (gas: 451305)\n[PASS] test_fire_feed_aRoundThatDoesNotFit64BitsOnlyStopsTheRule() (gas: 1110723)\n[PASS] test_fire_feed_aShortAnswerOnlyStopsTheRule() (gas: 1066402)\n[PASS] test_fire_feed_aSourceThatBurnsItsGasOnlyStopsTheRule() (gas: 863533)\n[PASS] test_fire_feed_aSourceThatRevertsOnlyStopsTheRule() (gas: 454112)\n[PASS] test_fire_feed_aSourceWithoutCodeOnlyStopsTheRule() (gas: 388490)\n[PASS] test_fire_feed_aTimestampWiderThan64BitsOnlyStopsTheRule() (gas: 531871)\n[PASS] test_fire_feed_anAnswerStampedInTheFutureIsNotAnAnswer() (gas: 591923)\n[PASS] test_fire_feed_cooldownAndRoundBothApply() (gas: 675007)\n[PASS] test_fire_feed_doesNotFireBeforeAnyAnswer() (gas: 341364)\n[PASS] test_fire_feed_firesOnAFreshAnswer() (gas: 553445)\n[PASS] test_fire_feed_firesOncePerRound() (gas: 752129)\n[PASS] test_fire_feed_hire() (gas: 879968)\n[PASS] test_fire_feed_respectsTheMaximumAge() (gas: 592662)\n[PASS] test_fire_feed_theCallerCannotStarveTheSourceOfGas() (gas: 549631347)\n[PASS] test_fire_gas() (gas: 1126530)\nLogs:\n  gas: fire, VIEW then PAY: 111553\n  gas: fire, VIEW then HIRE (mock desk): 391443\n\n[PASS] test_fire_gasShort_isACleanRefusal_andAnOrdinaryLimitIsEnough() (gas: 560609)\n[PASS] test_fire_hire_announcesTheFireWithItsOrder() (gas: 819000)\n[PASS] test_fire_hire_eachFireOpensItsOwnOrder() (gas: 1238129)\n[PASS] test_fire_hire_opensTheOrderWithThePinnedTerms() (gas: 982507)\n[PASS] test_fire_hire_refusesADeskThatTakesLessThanTheOrderCosts() (gas: 867330)\n[PASS] test_fire_hire_refusesAnOrderIdItAlreadyKnows() (gas: 1394564)\n[PASS] test_fire_hire_refusesAnyOtherSpec() (gas: 610667)\n[PASS] test_fire_hire_whenTheDeskRefusesNothingChanges() (gas: 720537)\n[PASS] test_fire_pay_announcesTheFire() (gas: 443014)\n[PASS] test_fire_pay_ignoresWhateverSpecBytesTheCallerSends() (gas: 442090)\n[PASS] test_fire_pay_paysTheRecipientAndTipsTheCaller() (gas: 547469)\n[PASS] test_fire_refusesACancelledRule() (gas: 393407)\n[PASS] test_fire_refusesAnUnknownRule() (gas: 59483)\n[PASS] test_fire_refusesWhenTheConditionIsFalse() (gas: 398342)\n[PASS] test_fire_refusesWhenTheEscrowIsShort() (gas: 565383)\n[PASS] test_fire_respectsTheCooldown() (gas: 656494)\n[PASS] test_fire_stopsAtTheMaximumNumberOfFires() (gas: 652427)\n[PASS] test_fire_theCreatorMayFireItsOwnRule() (gas: 438631)\n[PASS] test_fire_theFirstFireNeedsNoCooldown() (gas: 476318)\n[PASS] test_fire_view_aTargetThatAnswersWithTooFewBytesOnlyStopsTheRule() (gas: 622956)\n[PASS] test_fire_view_aTargetThatBurnsItsGasOnlyStopsTheRule() (gas: 857371)\nLogs:\n  gas: check() against a target that spins: 113336\n\n[PASS] test_fire_view_aTargetThatRevertsOnlyStopsTheRule() (gas: 447888)\n[PASS] test_fire_view_aTargetThatTriesToWriteOnlyStopsTheRule() (gas: 782935)\n[PASS] test_fire_view_aTargetWithoutCodeOnlyStopsTheRule() (gas: 360895)\n[PASS] test_fire_view_aVeryLongAnswerIsReadByItsFirstWordOnly() (gas: 525441)\n[PASS] test_fire_view_exactly32BytesIsEnough() (gas: 502092)\n[PASS] test_fire_view_readsAFourArgumentView() (gas: 544048)\n[PASS] test_fire_view_readsAOneArgumentView() (gas: 573168)\n[PASS] test_fire_view_readsATargetThatAnswersPlainCalls() (gas: 559487)\n[PASS] test_fire_view_theCallerCannotStarveTheConditionOfGas() (gas: 553870395)\n[PASS] test_fire_view_theLongestCalldataLeavesTheAllowanceWhole() (gas: 691184220)\n[PASS] test_fire_withoutATipPaysTheCallerNothing() (gas: 456918)\nSuite result: ok. 56 passed; 0 failed; 0 skipped; finished in 264.72ms (701.03ms CPU time)\n\nRan 8 tests for test/launch/LaunchRunbook.t.sol:LaunchRunbookTest\n[PASS] test_runbook_buyingImdWithEthWithAMinimumAndADeadline() (gas: 1044021)\n[PASS] test_runbook_everyDocumentedCommandNamesAFunctionThatExists() (gas: 7915375)\n[PASS] test_runbook_leavingWithSharesInABlockWhereTheVaultPaysNothingOut() (gas: 1100386)\n[PASS] test_runbook_theFirstDaysLedgerIsWhatTheParametersGive() (gas: 886715)\n[PASS] test_runbook_theFirstEndowmentIsCreatedStakedHarvestedAndWithdrawn() (gas: 1938085)\n[PASS] test_runbook_theFirstRuleCanBeUnwoundWithoutTheHire() (gas: 4832990)\n[PASS] test_runbook_theFirstRuleIsWrittenFiredAndPaid() (gas: 2607984)\n[PASS] test_runbook_theFirstRulesCommandCarriesTheDocumentedParameters() (gas: 649260)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 339.17ms (20.77ms CPU time)\n\nRan 47 tests for test/rules/RulesCreate.t.sol:RulesCreateTest\n[PASS] test_constants() (gas: 47575)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9115)\n[PASS] test_constructor_recordsItsTwoAddresses() (gas: 26011)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 6532)\n[PASS] test_createRule_acceptsAZeroDeposit() (gas: 272964)\n[PASS] test_createRule_acceptsShortestAndLongestConditionData() (gas: 1300868)\n[PASS] test_createRule_feedPay_storesEverything() (gas: 327613)\n[PASS] test_createRule_hire_aDeskThatPublishesNoMaximumIsNotAnObstacle() (gas: 682066)\n[PASS] test_createRule_hire_acceptsEveryAllowedByte() (gas: 392588)\n[PASS] test_createRule_hire_acceptsSpecsOfEveryLengthAroundTheWordSize() (gas: 34211548)\n[PASS] test_createRule_hire_acceptsTheLongestSpec() (gas: 4955351)\nLogs:\n  gas: createRule with a 7,900 byte spec: 607044\n\n[PASS] test_createRule_hire_everyFlagValueItAcceptsCanFire() (gas: 3031012)\n[PASS] test_createRule_hire_findsARefusedByteAtEveryPosition() (gas: 45515625)\n[PASS] test_createRule_hire_ignoresBytesBeyondTheSpec() (gas: 1377010)\n[PASS] test_createRule_hire_readsTheCapByTheDesksOwnSelector() (gas: 570)\n[PASS] test_createRule_hire_refusesADeliveryTimeAboveTheDesksMaximum() (gas: 981445)\n[PASS] test_createRule_hire_refusesASpecThatIsTooLong() (gas: 1155515)\n[PASS] test_createRule_hire_refusesAnEmptySpec() (gas: 52401)\n[PASS] test_createRule_hire_refusesBadPrices() (gas: 112617)\n[PASS] test_createRule_hire_refusesFlagsTheDeskRefuses() (gas: 10901621)\n[PASS] test_createRule_hire_refusesLeadingAndTrailingSpaces() (gas: 161310)\n[PASS] test_createRule_hire_refusesQuoteBackslashAndNonPrintableBytes() (gas: 324024)\n[PASS] test_createRule_hire_refusesTermsBelowTheDesksMinimums() (gas: 463301)\n[PASS] test_createRule_hire_refusesZeroOrderLifetime() (gas: 58370)\n[PASS] test_createRule_hire_reportsTheLowestPositionAtFault() (gas: 293866)\n[PASS] test_createRule_hire_revertsWhenTheDeskHasNoCode_butPayStillWorks() (gas: 528569)\n[PASS] test_createRule_idsCountFromOne() (gas: 809929)\n[PASS] test_createRule_pay_refusesASpec() (gas: 59946)\n[PASS] test_createRule_pay_refusesBadRecipients() (gas: 107999)\n[PASS] test_createRule_pay_refusesZeroAmount() (gas: 57433)\n[PASS] test_createRule_publishesParamsAndSpec() (gas: 389218)\n[PASS] test_createRule_pullsExactlyTheDeposit() (gas: 300399)\n[PASS] test_createRule_refusesACostNoEscrowCanHold() (gas: 347945)\n[PASS] test_createRule_refusesAFeedConditionWithoutAMaximumAge() (gas: 57731)\n[PASS] test_createRule_refusesCalldataOnAFeedCondition() (gas: 57355)\n[PASS] test_createRule_refusesConditionDataLongerThanTheLimit() (gas: 113186)\n[PASS] test_createRule_refusesFeedFieldsOnAViewCondition() (gas: 108083)\n[PASS] test_createRule_refusesUnknownAction() (gas: 108828)\n[PASS] test_createRule_refusesUnknownComparison() (gas: 106231)\n[PASS] test_createRule_refusesUnknownConditionKind() (gas: 107268)\n[PASS] test_createRule_refusesZeroFires() (gas: 56414)\n[PASS] test_createRule_refusesZeroTarget() (gas: 56656)\n[PASS] test_createRule_revertsWithoutAllowance() (gas: 248981)\n[PASS] test_createRule_viewHire_storesEverything() (gas: 460452)\n[PASS] test_getRule_unknownIdIsAllZeros() (gas: 69586)\n[PASS] test_mockDesk_refusesAnOrderForEachReasonTheRealDeskDoes() (gas: 2543664)\n[PASS] test_mockDesk_refusesTheFlagsTheRealDeskRefuses() (gas: 767559)\nSuite result: ok. 47 passed; 0 failed; 0 skipped; finished in 342.29ms (100.40ms CPU time)\n\nRan 35 tests for test/rules/RulesMoney.t.sol:RulesMoneyTest\n[PASS] test_cancel_anEmptyRule() (gas: 260619)\n[PASS] test_cancel_leavesOtherRulesAlone() (gas: 597887)\n[PASS] test_cancel_onlyOnce() (gas: 346094)\n[PASS] test_cancel_onlyTheCreator() (gas: 356624)\n[PASS] test_cancel_returnsTheUnspentEscrowToTheCreator() (gas: 605819)\n[PASS] test_onWorkDelivered_afterCancel_paysTheCreator() (gas: 1021363)\n[PASS] test_onWorkDelivered_gasFitsTheDesksAllowance() (gas: 1013567)\nLogs:\n  gas: onWorkDelivered with change to credit: 62365\n\n[PASS] test_onWorkDelivered_ignoresAnOrderItDidNotOpen() (gas: 37435)\n[PASS] test_onWorkDelivered_onlyTheDesk() (gas: 874161)\n[PASS] test_onWorkDelivered_returnsTheChangeInTheSameTransaction() (gas: 1055364)\n[PASS] test_recall_afterCancel_sendsTheOrdersEscrowToTheCreator() (gas: 994931)\n[PASS] test_recall_onlyTheCreator() (gas: 896467)\n[PASS] test_recall_refusesAnotherRulesOrder() (gas: 1508032)\n[PASS] test_recall_revertsWhenTheDeskWillNotCancel() (gas: 1012409)\n[PASS] test_recall_withdrawsAnUntakenOrderIntoTheRule() (gas: 987718)\n[PASS] test_reconcile_afterCancel_paysTheCreatorDirectly() (gas: 1169983)\n[PASS] test_reconcile_creditsARefundedOrder() (gas: 1074807)\n[PASS] test_reconcile_creditsAnOrderRefundedAtTheSecondItExpires() (gas: 1022131)\n[PASS] test_reconcile_creditsEachNewAmountOnce() (gas: 1288455)\n[PASS] test_reconcile_creditsOnlyTheRuleThatPaid() (gas: 1986388)\n[PASS] test_reconcile_creditsTheChangeFromADeliveredOrder() (gas: 1025607)\n[PASS] test_reconcile_isSafeToRepeat() (gas: 1106998)\n[PASS] test_reconcile_nothingComesBackFromAnOrderDeliveredAtFullPrice() (gas: 977049)\n[PASS] test_reconcile_nothingToCreditWhileTheOrderIsOpen() (gas: 891896)\n[PASS] test_reconcile_refusesADeskThatNamesAnotherEmployer() (gas: 1000018)\n[PASS] test_reconcile_refusesADeskThatReportsMoreThanItSent() (gas: 1521331)\n[PASS] test_reconcile_refusesAnOrderOfAnotherRule() (gas: 1700580)\n[PASS] test_reconcile_refusesOrdersItDidNotOpen() (gas: 1309708)\n[PASS] test_reconcile_theBalanceCheckProtectsBookedEscrows_notUnreconciledReturns() (gas: 2015301)\n[PASS] test_reconcile_theReturnedMoneyCanBeSpentAgain() (gas: 1458912)\n[PASS] test_reentrancy_everyMoneyFunctionIsLockedWhileARuleFires() (gas: 2965442)\n[PASS] test_reentrancy_lockedWhileAnOrderIsRecalled() (gas: 975563)\n[PASS] test_topUp_anExhaustedRuleStillTakesMoney_whichItsCreatorCanWithdraw() (gas: 585093)\n[PASS] test_topUp_anyoneAddsToARulesEscrow() (gas: 418696)\n[PASS] test_topUp_refusesUnknownCancelledAndZero() (gas: 402103)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 415.75ms (20.08ms CPU time)\n\nRan 18 tests for test/rules/RulesFuzz.t.sol:RulesFuzzTest\n[PASS] testFuzz_conditionDataLength(uint16) (runs: 256, μ: 186594, ~: 257725)\n[PASS] testFuzz_cooldown(uint32,uint32) (runs: 256, μ: 535328, ~: 483362)\n[PASS] testFuzz_costMustFitAnEscrow(uint96,uint96) (runs: 256, μ: 163153, ~: 229238)\n[PASS] testFuzz_feed_answerLength(uint16) (runs: 256, μ: 408153, ~: 353980)\n[PASS] testFuzz_feed_anyAnswer(uint256,uint256,uint256,uint8,uint256,uint32,bool) (runs: 256, μ: 420015, ~: 422152)\n[PASS] testFuzz_feed_freshnessAndRound(uint32,uint32,uint64,uint64) (runs: 256, μ: 679524, ~: 640666)\n[PASS] testFuzz_hire_changeComesBackExactly(uint96,uint96,uint96,uint96) (runs: 256, μ: 1155884, ~: 1158977)\n[PASS] testFuzz_hire_deliveryTimeAgreesWithTheDesk(uint32,bool) (runs: 256, μ: 368701, ~: 110742)\n[PASS] testFuzz_hire_flagsAgreeWithTheDesk(uint8) (runs: 256, μ: 322296, ~: 103367)\n[PASS] testFuzz_pay_sumsAreExact(uint96,uint96,uint96,uint8) (runs: 256, μ: 719151, ~: 456039)\n[PASS] testFuzz_spec_arbitraryBytesAgreeWithTheDesk(bytes) (runs: 256, μ: 86001, ~: 68820)\n[PASS] testFuzz_spec_lengthLimit(uint16) (runs: 256, μ: 3155607, ~: 4366471)\n[PASS] testFuzz_spec_nearlyValidTextAgreesWithTheDesk(uint256,uint16,uint16,uint8) (runs: 256, μ: 685497, ~: 653762)\n[PASS] testFuzz_spec_oneRefusedByteIsFoundWhereItIs(uint16,uint16,uint8) (runs: 256, μ: 2513975, ~: 1020248)\n[PASS] testFuzz_twoRulesNeverShareMoney(uint96,uint96,uint96,uint8) (runs: 256, μ: 1077335, ~: 903079)\n[PASS] testFuzz_view_anyAnswer(bytes,uint8,uint256) (runs: 256, μ: 329740, ~: 321351)\n[PASS] testFuzz_view_comparisonAtTheLine(uint8,uint256,uint8) (runs: 256, μ: 336857, ~: 337121)\n[PASS] testFuzz_view_comparisonMatchesTheReference(uint8,uint256,uint256) (runs: 256, μ: 358832, ~: 359411)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 415.81ms (2.88s CPU time)\n\nRan 57 tests for test/endowments/Endowments.harvest.t.sol:EndowmentsHarvestTest\n[PASS] testFuzz_runway_neverLiftsTheMeterAboveThirtyRequests(uint256,uint256,uint256,uint256) (runs: 256, μ: 937337, ~: 837575)\n[PASS] test_harvest_aDonationIsPaidOutAsYield() (gas: 514990)\n[PASS] test_harvest_anyoneMayCall_andTheCallerGetsNothing() (gas: 640628)\n[PASS] test_harvest_leavesBufferedPrincipalAlone() (gas: 1090737)\n[PASS] test_harvest_meter_aCallBackIntoEndowmentsIsRefused() (gas: 920829)\n[PASS] test_harvest_meter_fundsTheFeedsMeter() (gas: 827925)\n[PASS] test_harvest_meter_ifFundRevertsTheYieldStaysStaked() (gas: 1292606)\n[PASS] test_harvest_meter_ifTheFeedWereEverUnknownTheYieldStaysStaked() (gas: 761568)\n[PASS] test_harvest_meter_revertsIfTheMeterPullsLessThanItWasSent() (gas: 822066)\n[PASS] test_harvest_paysARecipientContractThatCannotMoveIMD_becauseItsCreatorChoseIt() (gas: 1793861)\n[PASS] test_harvest_pot_aCallBackIntoEndowmentsIsRefused() (gas: 908403)\n[PASS] test_harvest_pot_aFullPotSendsEverythingToTheFallback() (gas: 730784)\n[PASS] test_harvest_pot_aPotThatAsksAndThenTakesNothingMovesOnlyWhatItAskedFor() (gas: 868579)\n[PASS] test_harvest_pot_aPotThatBurnsItsGasCannotStopTheHarvest() (gas: 1201689)\n[PASS] test_harvest_pot_aPotThatNeedsAtLeastTheYieldGetsAllOfIt() (gas: 869178)\n[PASS] test_harvest_pot_aPotThatNeedsOneWeiIsSentOneWei() (gas: 857440)\n[PASS] test_harvest_pot_aPotThatReturnsHugeDataCannotStopTheHarvest() (gas: 1046372)\n[PASS] test_harvest_pot_aRevertingPotSendsEverythingToTheFallback() (gas: 713522)\n[PASS] test_harvest_pot_aSeriesIsFundedRoundAfterRound() (gas: 1831679)\n[PASS] test_harvest_pot_atTheLeastGasAllowed_aPotThatBurnsEverythingStillLeavesTheFallbackPaid() (gas: 9534882)\n[PASS] test_harvest_pot_chipsInForTheFallbackBeneficiary() (gas: 793413)\n[PASS] test_harvest_pot_ifThePotCannotBeAskedItIsOfferedEverything() (gas: 3030553)\n[PASS] test_harvest_pot_lowGasIsRefusedBeforeThePotIsAsked() (gas: 530046)\n[PASS] test_harvest_pot_noCodeAtThePotsAddressSendsEverythingToTheFallback() (gas: 712068)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback() (gas: 63143865)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback_howeverMuchGasTheVaultUses() (gas: 167837680)\n[PASS] test_harvest_pot_revertsIfThePotTakesMoreThanItWasOffered() (gas: 945518)\n[PASS] test_harvest_pot_revertsWhenThePotCallCouldNotGetItsGas() (gas: 522885)\n[PASS] test_harvest_pot_takesOutOnlyWhatThePotStillNeeds_andTheRestStaysStaked() (gas: 1427737)\n[PASS] test_harvest_pot_whenAShareWeiIsWorthThousandsOfImdWei_theAmountsAreStillExact() (gas: 4302912)\n[PASS] test_harvest_pot_withEnoughGasThePotGetsItsChip() (gas: 710303)\n[PASS] test_harvest_recipientAndMeterNeedNoGasReserve() (gas: 622994)\n[PASS] test_harvest_recordsTheHighestPriceSeen() (gas: 643042)\n[PASS] test_harvest_revertsBelowTheMinimum() (gas: 520910)\n[PASS] test_harvest_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 661861)\n[PASS] test_harvest_revertsIfTheVaultPaysShort() (gas: 660027)\n[PASS] test_harvest_revertsIfTheVaultReportsLessThanItPreviewed() (gas: 658717)\n[PASS] test_harvest_revertsInAStakeBlock() (gas: 1022046)\n[PASS] test_harvest_revertsOnUnknownEndowment() (gas: 36156)\n[PASS] test_harvest_revertsWhenNothingWasEarned() (gas: 467083)\n[PASS] test_harvest_sendsOnlyTheYieldToTheRecipient() (gas: 863754)\n[PASS] test_harvest_thenThePrincipalStillComesBackToTheWei() (gas: 745771)\n[PASS] test_harvest_twiceInARow_theSecondFindsNothing() (gas: 696052)\n[PASS] test_harvest_twoEndowmentsWithTheSamePrincipalEarnTheSame() (gas: 650704)\n[PASS] test_harvest_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 891704)\n[PASS] test_runway_aFullMeterWaitsUntilARequestIsBought() (gas: 1383815)\n[PASS] test_runway_aFundAndDefundAroundAHarvestOnlyDelaysTheYield() (gas: 1294584)\n[PASS] test_runway_aHarvestFillsTheMeterToThirtyRequestsAndNoFurther() (gas: 1088840)\n[PASS] test_runway_aMeterSomeoneElseFilledTakesNothing() (gas: 1030688)\n[PASS] test_runway_afterAPartialHarvestThePrincipalComesBackToTheWei() (gas: 1410060)\n[PASS] test_runway_anAbsurdCostDoesNotOverflow() (gas: 827654)\n[PASS] test_runway_atTheLine_roomForAllOfItAndRoomForOneWeiLess() (gas: 1422493)\n[PASS] test_runway_doesNotApplyToOtherKinds() (gas: 633394)\n[PASS] test_runway_followsTheFeedsCost() (gas: 1560519)\n[PASS] test_runway_ifQuestionsCannotBeReadTheYieldStaysStaked() (gas: 1391194)\n[PASS] test_runway_isThirtyRequests() (gas: 18565)\n[PASS] test_runway_roomBelowTheSmallestHarvestIsNotTaken() (gas: 1185477)\nSuite result: ok. 57 passed; 0 failed; 0 skipped; finished in 416.86ms (335.77ms CPU time)\n\nRan 2 tests for test/rules/ZapInvariant.t.sol:ZapInvariantTest\n[PASS]\nZapInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_everyWeiIsAccountedFor\n[PASS] invariant_zapKeepsNothingOfACallers\n ZapInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭------------+-----------+-------+---------+----------╮\n| Contract   | Selector  | Calls | Reverts | Discards |\n+=====================================================+\n| ZapHandler | buy       | 856   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | chipIn    | 820   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | fundMeter | 839   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | openPot   | 882   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | passTime  | 878   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushEth   | 836   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushImd   | 919   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setDepth  | 840   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setPrice  | 810   | 0       | 0        |\n╰------------+-----------+-------+---------+----------╯\n\nLogs:\n  chipIn: 8\n  chipIn reverted: 8\n  fundMeter: 3\n  fundMeter reverted: 12\n  buy: 3\n  buy reverted: 10\n  served through the relay: 1\n    of which with stray ETH waiting in Zap: 1\n  calls that carried a deadline already passed: 6\n  calls that carried this very second: 7\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 5316609)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.29s (1.29s CPU time)\n\nRan 2 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsLossInvariantTest\n[PASS]\nEndowmentsLossInvariantTest invariants:\n[PASS] invariant_loss_bookedSharesWithinSimdHeld\n[PASS] invariant_loss_bufferIsExactlyTheImdHeld\n[PASS] invariant_loss_principalBooksAgree\n[PASS] invariant_loss_sharedFairlyAndHarvestStops\n EndowmentsLossInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 581   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 520   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 557   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 562   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 561   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 529   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 564   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 617   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | lose                | 569   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 573   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 606   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 570   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 588   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 586   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 552   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 524   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 541   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 2\n    to the meter: 2\n    to the meter, cut to the room under the runway: 2\n  meter harvests that had to wait for room: 6\n\n[PASS] test_handler_reachesLossBehaviour() (gas: 3315397)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.68s (6.68s CPU time)\n\nRan 2 tests for test/rules/RulesInvariant.t.sol:RulesInvariantTest\n[PASS]\nRulesInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_cancelledRulesAndOrderLinks\n[PASS] invariant_eachRulesEscrowIsConserved\n[PASS] invariant_escrowsPlusMoneyOnOrdersEqualsHeldPlusOwed\n[PASS] invariant_firesRespectCooldownAndMaximum\n[PASS] invariant_holdingsCoverEveryEscrow\n[PASS] invariant_nothingIsCreatedOrLost\n RulesInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| RulesHandler | cancel        | 363   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | createRule    | 665   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskAwardBond | 332   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskDeliver   | 673   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskRefund    | 355   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | fire          | 2199  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | pushFeed      | 339   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | recall        | 291   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | reconcile     | 702   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | setGauge      | 348   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | stray         | 353   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | topUp         | 354   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | warp          | 706   | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  rules: 10\n  orders: 3\n  fires: 9\n  fires refused: 25\n    rule cancelled: 20\n    rule exhausted: 3\n    escrow short: 1\n    condition false or cooling down: 1\n  reconciles: 13\n  recalls: 2\n  deliveries: 0\n  refunds: 1\n  bond awards: 0\n  cancels: 5\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 11439536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.73s (6.74s CPU time)\n\nRan 3 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsInvariantTest\n[PASS]\nEndowmentsInvariantTest invariants:\n[PASS] invariant_E1_holdingsCoverPrincipal\n[PASS] invariant_E2_bookedSharesWithinSimdHeld\n[PASS] invariant_E3_exactWithdrawalsOnlyWaitForAHold\n[PASS] invariant_bufferIsExactlyTheImdHeld\n[PASS] invariant_priceMarkFollowsThePrice\n[PASS] invariant_principalBooksAgree\n EndowmentsInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 622   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 572   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 546   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 587   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 631   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 626   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 623   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 618   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 580   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 584   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 597   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 612   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 591   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 583   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 1\n    to the meter: 1\n    to the meter, cut to the room under the runway: 1\n  meter harvests that had to wait for room: 4\n\n[PASS] test_handler_reachesEveryBehaviour() (gas: 4633194)\n[PASS] test_handler_reachesTheMeterRunway() (gas: 3366239)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.42s (7.43s CPU time)\n\nRan 20 test suites in 7.43s (25.32s CPU time): 417 tests passed, 0 failed, 0 skipped (417 total tests)\n","passed":true},{"durationMs":80,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Endowments.createForMeter(bytes32)\",\"Endowments.createForPot(uint256,address)\",\"Endowments.createForRecipient(address)\",\"Endowments.deposit(uint256,uint256)\",\"Endowments.donate(uint256,uint256)\",\"Endowments.exit(uint256,uint256,uint256,bool)\",\"Endowments.harvest(uint256)\",\"Endowments.stake()\",\"Endowments.withdraw(uint256,uint256)\",\"Rules.cancel(uint256)\",\"Rules.fire(uint256,bytes)\",\"Rules.onWorkDelivered(uint256,bytes16,bytes32)\",\"Rules.recall(uint256,uint256)\",\"Rules.reconcile(uint256,uint256)\",\"Rules.topUp(uint256,uint96)\",\"Zap.buy(uint256,uint256)\",\"Zap.chipIn(uint256,uint256,uint256)\",\"Zap.fundMeter(bytes32,uint256,uint256)\",\"Zap.unlockCallback(bytes)\"],\"files\":{\".gitignore\":12,\"ADAPTATION.md\":119,\"LICENSE\":21,\"README.md\":307,\"docs/DEVIATIONS.md\":207,\"docs/LAUNCH.md\":714,\"docs/THREATS.md\":752,\"foundry.toml\":45,\"integration/foundry.toml\":54,\"integration/test/DeploymentsBook.t.sol\":75,\"integration/test/DocumentedCommands.t.sol\":132,\"integration/test/EndowmentsWithRealSiblings.t.sol\":308,\"integration/test/RulesWithRealDesk.t.sol\":393,\"integration/test/RulesWithRealQuestions.t.sol\":199,\"integration/test/Siblings.sol\":143,\"integration/test/StandInsAgree.t.sol\":429,\"integration/test/ZapWithRealSiblings.t.sol\":169,\"launch.json\":31,\"remappings.txt\":2,\"src/endowments/Endowments.sol\":951,\"src/interfaces/ICrowdPots.sol\":21,\"src/interfaces/IQuestions.sol\":57,\"src/interfaces/IWorkOrders.sol\":113,\"src/interfaces/external/Mainnet.sol\":55,\"src/rules/Rules.sol\":855,\"src/rules/Zap.sol\":287,\"src/rules/v4/IPoolManagerLike.sol\":68,\"test/endowments/Endowments.audit.t.sol\":124,\"test/endowments/Endowments.create.t.sol\":362,\"test/endowments/Endowments.flow.t.sol\":702,\"test/endowments/Endowments.fuzz.t.sol\":319,\"test/endowments/Endowments.harvest.t.sol\":1055,\"test/endowments/Endowments.loss.t.sol\":513,\"test/endowments/EndowmentsBase.sol\":200,\"test/endowments/MockStakedIMD.t.sol\":158,\"test/endowments/fork/Endowments.fork.t.sol\":442,\"test/endowments/invariant/Endowments.invariant.t.sol\":442,\"test/endowments/invariant/EndowmentsHandler.sol\":487,\"test/endowments/mocks/MockCrowdPots.sol\":207,\"test/endowments/mocks/MockIMD.sol\":35,\"test/endowments/mocks/MockQuestions.sol\":202,\"test/endowments/mocks/MockStakedIMD.sol\":196,\"test/fixtures/endowments/simd-block-26164296.json\":76,\"test/fixtures/rules/eth-imd-pool.json\":22,\"test/fixtures/rules/records/e9efec16-skill-research-report-3db99325.hex\":1,\"test/kit/EarlierLaunches.sol\":33,\"test/kit/LiveSiblings.sol\":254,\"test/kit/RecordKit.sol\":250,\"test/kit/RecordMaker.sol\":103,\"test/launch/Bytecode.sol\":53,\"test/launch/LaunchBench.sol\":83,\"test/launch/LaunchC.t.sol\":685,\"test/launch/LaunchDoc.sol\":201,\"test/launch/LaunchManifest.sol\":112,\"test/launch/LaunchRunbook.t.sol\":651,\"test/launch/fork/LaunchC.fork.t.sol\":505,\"test/launch/fork/LiveSiblings.fork.t.sol\":469,\"test/rules/RulesBase.sol\":148,\"test/rules/RulesCreate.t.sol\":685,\"test/rules/RulesDeskScenario.sol\":131,\"test/rules/RulesDeskScenario.t.sol\":39,\"test/rules/RulesFire.t.sol\":902,\"test/rules/RulesFuzz.t.sol\":433,\"test/rules/RulesInvariant.t.sol\":566,\"test/rules/RulesMoney.t.sol\":579,\"test/rules/Zap.t.sol\":777,\"test/rules/ZapInvariant.t.sol\":454,\"test/rules/fork/RulesAndZapFork.t.sol\":395,\"test/rules/fork/RulesDeskFork.t.sol\":70,\"test/rules/mocks/BareDesk.sol\":13,\"test/rules/mocks/MockDesk.sol\":245,\"test/rules/mocks/MockFeed.sol\":43,\"test/rules/mocks/MockIMD.sol\":13,\"test/rules/mocks/MockPoolManager.sol\":101,\"test/rules/mocks/MockPots.sol\":97,\"test/rules/mocks/MockQuestions.sol\":102,\"test/rules/mocks/Targets.sol\":86,\"test/scaffold/Interfaces.t.sol\":74},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8db3dc487a713de6645b2da8f57495d88966f1d8c886413280b6fe7510a9f034","verifiedTreeHash":"25c2b49389ca704b35772aec4e3fc25b8434dbdf","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":155003,"exitCode":0,"name":"build","output":"Compiling 91 files with Solc 0.8.26\nSolc 0.8.26 finished in 154.88s\nCompiler run successful!\n","passed":true},{"durationMs":7223,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/scaffold/Interfaces.t.sol:InterfacesCompileTest\n[PASS] test_theAddressesThisLaunchIsGiven() (gas: 239)\n[PASS] test_whatEndowmentsAndZapCallOnThePots() (gas: 151)\n[PASS] test_whatRulesCallsOnTheDesk() (gas: 283)\n[PASS] test_whatThisLaunchCallsOnQuestions() (gas: 327)\n[PASS] test_whatZapCallsOnUniswap() (gas: 437)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 241.29µs (292.42µs CPU time)\n\nRan 1 test for test/rules/RulesDeskScenario.t.sol:RulesDeskScenarioTest\n[PASS] test_scenario_aHireRuleWalksThroughTheStandInDesk() (gas: 6694201)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.54ms (2.99ms CPU time)\n\nRan 2 tests for test/endowments/Endowments.audit.t.sol:EndowmentsAuditTest\n[PASS] test_audit_aMeterEndowmentsYieldWaitsForAsLongAsTheFeedIsNotSold() (gas: 1333828)\n[PASS] test_audit_aStrangerCanHoldTheVaultEveryBlock_andOnlyTheInKindExitIsOpen() (gas: 3500129)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.01ms (3.36ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.create.t.sol:EndowmentsCreateTest\n[PASS] test_constructor_constants() (gas: 39563)\n[PASS] test_constructor_makesNoCallAndNeedsNoCodeAtItsArguments() (gas: 36642)\n[PASS] test_constructor_revertsOnAnyZeroAddress() (gas: 4856)\n[PASS] test_constructor_storesTheFourAddresses() (gas: 43551)\n[PASS] test_createForMeter_recordsTheFeed() (gas: 233421)\n[PASS] test_createForMeter_revertsForAnIdThatIsNotAFeed() (gas: 55101)\n[PASS] test_createForMeter_revertsIfQuestionsHasNoCode() (gas: 93268)\n[PASS] test_createForMeter_revertsOnZeroFeed() (gas: 33017)\n[PASS] test_createForMeter_revertsWhileTheFeedCannotBeAsked_andWorksOnceItCan() (gas: 252863)\n[PASS] test_createForPot_acceptsASeries() (gas: 217470)\n[PASS] test_createForPot_recordsThePotAndTheFallback() (gas: 223321)\n[PASS] test_createForPot_revertsForAPotThatDoesNotExistYet() (gas: 414087)\n[PASS] test_createForPot_revertsIfCrowdPotsHasNoCode() (gas: 92497)\n[PASS] test_createForPot_revertsWithoutAUsableFallback() (gas: 169639)\n[PASS] test_createForRecipient_acceptsAnyOtherContract() (gas: 1082671)\n[PASS] test_createForRecipient_recordsTheRecipient() (gas: 141295)\n[PASS] test_createForRecipient_refusesTheVault_soNoHarvestCanBeCollectedByAOneBlockStaker() (gas: 138946)\n[PASS] test_createForRecipient_revertsWhereTheYieldWouldBeStranded() (gas: 167298)\n[PASS] test_create_idsFollowTheOrderOfCreation() (gas: 245549)\n[PASS] test_create_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 191139)\n[PASS] test_create_revertsWhenTheSeedCannotBePulled() (gas: 317384)\n[PASS] test_endowment_unknownIdReadsAsNone() (gas: 43397)\n[PASS] test_launch_create2FromInitcode_staysInsideOurGates() (gas: 2763356)\nLogs:\n  create2 gas: 2694036\n  runtime bytes: 13161\n  initcode bytes with the four argument words: 13874\n\n[PASS] test_setUp_createdOneEndowmentOfEachKind() (gas: 100844)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 13.75ms (2.64ms CPU time)\n\nRan 8 tests for test/launch/LaunchRunbook.t.sol:LaunchRunbookTest\n[PASS] test_runbook_buyingImdWithEthWithAMinimumAndADeadline() (gas: 1044021)\n[PASS] test_runbook_everyDocumentedCommandNamesAFunctionThatExists() (gas: 7915375)\n[PASS] test_runbook_leavingWithSharesInABlockWhereTheVaultPaysNothingOut() (gas: 1100386)\n[PASS] test_runbook_theFirstDaysLedgerIsWhatTheParametersGive() (gas: 886715)\n[PASS] test_runbook_theFirstEndowmentIsCreatedStakedHarvestedAndWithdrawn() (gas: 1938085)\n[PASS] test_runbook_theFirstRuleCanBeUnwoundWithoutTheHire() (gas: 4832990)\n[PASS] test_runbook_theFirstRuleIsWrittenFiredAndPaid() (gas: 2607984)\n[PASS] test_runbook_theFirstRulesCommandCarriesTheDocumentedParameters() (gas: 649260)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 23.96ms (27.39ms CPU time)\n\nRan 51 tests for test/endowments/Endowments.flow.t.sol:EndowmentsFlowTest\n[PASS] test_backingOf_countsBufferAndShares() (gas: 609236)\n[PASS] test_cushion_aBatchCostsAtMostTwoShareWei_andAWithdrawalAtMostOne() (gas: 888170)\n[PASS] test_deposit_addsUpPerDepositorAndPerEndowment() (gas: 471708)\n[PASS] test_deposit_recordsPrincipalAndBuffersTheImd() (gas: 272524)\n[PASS] test_deposit_revertsIfTheTokenKeepsPartOfTheTransfer() (gas: 195228)\n[PASS] test_deposit_revertsOnUnknownEndowment() (gas: 62399)\n[PASS] test_deposit_revertsOnZero() (gas: 36841)\n[PASS] test_deposit_revertsWithoutAllowance() (gas: 138375)\n[PASS] test_donate_addsToTheBufferButIsNobodysPrincipal() (gas: 173492)\n[PASS] test_donate_revertsOnZeroAndOnUnknownEndowment() (gas: 61069)\n[PASS] test_exit_inImd_isTheSameAsWithdrawWhileTheEndowmentIsWhole() (gas: 481551)\n[PASS] test_exit_inKind_cannotTakeMoreThanTheCallersPrincipal() (gas: 507131)\n[PASS] test_exit_inKind_paysTheBufferedPartInImd() (gas: 720042)\n[PASS] test_exit_inKind_revertsIfTheCallerAsksForMoreThanTheSharesAreWorth() (gas: 461332)\n[PASS] test_exit_inKind_worksInTheStakeBlock_andTheSharesAreWorthThePrincipal() (gas: 657216)\n[PASS] test_exit_inKind_worksWhileSomeoneElseHoldsTheContract() (gas: 690530)\n[PASS] test_exit_revertsIfTheCallerAsksForMoreThanTheirPrincipalIsWorth() (gas: 160780)\n[PASS] test_exit_revertsOnZeroAndOnUnknownEndowment() (gas: 173426)\n[PASS] test_nextStakeBlock_followsTheLastStake() (gas: 241264)\n[PASS] test_quote_matchesWhatWithdrawAndExitPay() (gas: 596931)\n[PASS] test_stake_anEndowmentLeftAloneForSeveralBatchesKeepsItsOwnSplit() (gas: 1853914)\n[PASS] test_stake_anyoneMayCall() (gas: 333132)\n[PASS] test_stake_movesTheWholeBufferIntoTheVaultInOneDeposit() (gas: 530886)\n[PASS] test_stake_recordsTheHighestPriceSeen() (gas: 783751)\n[PASS] test_stake_revertsIfTheBatchWouldMintNothing() (gas: 306160)\n[PASS] test_stake_revertsIfTheVaultIsNotOverImd() (gas: 2328465)\n[PASS] test_stake_revertsIfTheVaultMintsFewerSharesThanItPreviewed() (gas: 408721)\n[PASS] test_stake_revertsIfTheVaultReportsFewerSharesThanItPreviewed() (gas: 408316)\n[PASS] test_stake_revertsInsideTheInterval() (gas: 660329)\n[PASS] test_stake_revertsWithAnEmptyBuffer() (gas: 256473)\n[PASS] test_stake_splitsTheBatchInProportion_andNeverHandsOutMoreThanWasMinted() (gas: 955727)\n[PASS] test_stake_theSplitIsBookedOnTheNextTouch() (gas: 575765)\n[PASS] test_stake_theVaultsOwnRoundingNeverTripsTheMark() (gas: 2248038)\n[PASS] test_vaultHold_reportsAHoldWhoeverCausedIt() (gas: 772390)\n[PASS] test_withdraw_afterStaking_isExactToTheWei_withNoYieldAtAll() (gas: 571230)\n[PASS] test_withdraw_fromTheBuffer_isExactAndNeverAsksTheVault() (gas: 263959)\n[PASS] test_withdraw_inAStakeBlock_revertsHoldActive_andWorksOneBlockLater() (gas: 562555)\n[PASS] test_withdraw_inAStakeBlock_stillPaysWhatTheBufferCovers() (gas: 653201)\n[PASS] test_withdraw_oddAmountsAndManyPieces_areEachExact() (gas: 910827)\n[PASS] test_withdraw_principalInOneEndowmentCannotBeTakenFromAnother() (gas: 268366)\n[PASS] test_withdraw_revertsAboveTheCallersOwnPrincipal() (gas: 319586)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItPreviewed() (gas: 539389)\n[PASS] test_withdraw_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 638727)\n[PASS] test_withdraw_revertsIfTheVaultPaysShort() (gas: 540515)\n[PASS] test_withdraw_revertsIfTheVaultReportsMoreBurnedThanItPreviewed() (gas: 540124)\n[PASS] test_withdraw_revertsIfTheVaultSaysImdLeavesForNoShares() (gas: 465552)\n[PASS] test_withdraw_revertsOnUnknownEndowment() (gas: 35509)\n[PASS] test_withdraw_revertsOnZero() (gas: 145094)\n[PASS] test_withdraw_usesTheBufferFirst_thenTheVault() (gas: 879140)\n[PASS] test_withdraw_whenSomeoneDepositsIntoTheVaultInOurName_waitsOneBlock() (gas: 909712)\n[PASS] test_withdraw_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 775431)\nSuite result: ok. 51 passed; 0 failed; 0 skipped; finished in 121.68ms (14.33ms CPU time)\n\nRan 24 tests for test/endowments/Endowments.loss.t.sol:EndowmentsLossTest\n[PASS] test_loss_aDonationMakesAShortEndowmentWholeAgain() (gas: 934277)\n[PASS] test_loss_bufferedImdIsSharedInTheSameProportion() (gas: 907146)\n[PASS] test_loss_exitRespectsTheCallersMinimum() (gas: 779050)\n[PASS] test_loss_harvestTakesNothingFromAShortEndowment() (gas: 634889)\n[PASS] test_loss_inKindExitHandsOverTheSameSliceInShares() (gas: 711841)\n[PASS] test_loss_inKindExitRespectsTheCallersMinimum() (gas: 642777)\n[PASS] test_loss_isSharedProRata_theFirstToLeaveCannotTakeEverything() (gas: 844734)\n[PASS] test_loss_makesTheEndowmentShort() (gas: 612829)\n[PASS] test_loss_noNewDepositsWhileShort() (gas: 916568)\n[PASS] test_loss_partialExitsLeaveTheRestNoWorseOff() (gas: 709956)\n[PASS] test_loss_totalLossPaysNothingButStillLetsDepositorsClose() (gas: 663792)\n[PASS] test_loss_whileTheVaultHoldsTheContract_theImdExitWaitsButTheInKindExitDoesNot() (gas: 1065119)\n[PASS] test_loss_withdrawRefusesToPayLessThanWasAsked() (gas: 649773)\n[PASS] test_loss_yieldMakesAShortEndowmentWholeAgain() (gas: 885318)\n[PASS] test_priceFall_aNewDepositWaitsInTheBufferAndComesBackToTheWei() (gas: 886026)\n[PASS] test_priceFall_bothResumeOnceThePriceIsBack() (gas: 1186793)\n[PASS] test_priceFall_stakeAndHarvestStop_andTheYieldKeptCoversASecondFall() (gas: 1599634)\n[PASS] test_priceFall_thatNoStakeOrHarvestSaw_eatsYieldFirstAndNeverPrincipal() (gas: 943544)\n[PASS] test_priceFall_thePriceAtTheMarkIsNotAFall() (gas: 910259)\n[PASS] test_spare_aDepositTheGateAccepts_isStakedAndComesBackToTheWei() (gas: 1723094)\n[PASS] test_spare_none_isCoveredButNotWhole_andTakesNoDeposit() (gas: 1179073)\n[PASS] test_spare_none_noWithdrawalLeavesTheOthersAShareWeiShort() (gas: 8558702)\n[PASS] test_spare_theLineIsExactlyAtSpare() (gas: 2525702)\n[PASS] test_spare_whileWhole_anyPartOfOnesPrincipalIsPaid() (gas: 4005527)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 204.05ms (21.71ms CPU time)\n\nRan 47 tests for test/rules/RulesCreate.t.sol:RulesCreateTest\n[PASS] test_constants() (gas: 47575)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9115)\n[PASS] test_constructor_recordsItsTwoAddresses() (gas: 26011)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 6532)\n[PASS] test_createRule_acceptsAZeroDeposit() (gas: 272964)\n[PASS] test_createRule_acceptsShortestAndLongestConditionData() (gas: 1300868)\n[PASS] test_createRule_feedPay_storesEverything() (gas: 327613)\n[PASS] test_createRule_hire_aDeskThatPublishesNoMaximumIsNotAnObstacle() (gas: 682066)\n[PASS] test_createRule_hire_acceptsEveryAllowedByte() (gas: 392588)\n[PASS] test_createRule_hire_acceptsSpecsOfEveryLengthAroundTheWordSize() (gas: 34211548)\n[PASS] test_createRule_hire_acceptsTheLongestSpec() (gas: 4955351)\nLogs:\n  gas: createRule with a 7,900 byte spec: 607044\n\n[PASS] test_createRule_hire_everyFlagValueItAcceptsCanFire() (gas: 3031012)\n[PASS] test_createRule_hire_findsARefusedByteAtEveryPosition() (gas: 45515625)\n[PASS] test_createRule_hire_ignoresBytesBeyondTheSpec() (gas: 1377010)\n[PASS] test_createRule_hire_readsTheCapByTheDesksOwnSelector() (gas: 570)\n[PASS] test_createRule_hire_refusesADeliveryTimeAboveTheDesksMaximum() (gas: 981445)\n[PASS] test_createRule_hire_refusesASpecThatIsTooLong() (gas: 1155515)\n[PASS] test_createRule_hire_refusesAnEmptySpec() (gas: 52401)\n[PASS] test_createRule_hire_refusesBadPrices() (gas: 112617)\n[PASS] test_createRule_hire_refusesFlagsTheDeskRefuses() (gas: 10901621)\n[PASS] test_createRule_hire_refusesLeadingAndTrailingSpaces() (gas: 161310)\n[PASS] test_createRule_hire_refusesQuoteBackslashAndNonPrintableBytes() (gas: 324024)\n[PASS] test_createRule_hire_refusesTermsBelowTheDesksMinimums() (gas: 463301)\n[PASS] test_createRule_hire_refusesZeroOrderLifetime() (gas: 58370)\n[PASS] test_createRule_hire_reportsTheLowestPositionAtFault() (gas: 293866)\n[PASS] test_createRule_hire_revertsWhenTheDeskHasNoCode_butPayStillWorks() (gas: 528569)\n[PASS] test_createRule_idsCountFromOne() (gas: 809929)\n[PASS] test_createRule_pay_refusesASpec() (gas: 59946)\n[PASS] test_createRule_pay_refusesBadRecipients() (gas: 107999)\n[PASS] test_createRule_pay_refusesZeroAmount() (gas: 57433)\n[PASS] test_createRule_publishesParamsAndSpec() (gas: 389218)\n[PASS] test_createRule_pullsExactlyTheDeposit() (gas: 300399)\n[PASS] test_createRule_refusesACostNoEscrowCanHold() (gas: 347945)\n[PASS] test_createRule_refusesAFeedConditionWithoutAMaximumAge() (gas: 57731)\n[PASS] test_createRule_refusesCalldataOnAFeedCondition() (gas: 57355)\n[PASS] test_createRule_refusesConditionDataLongerThanTheLimit() (gas: 113186)\n[PASS] test_createRule_refusesFeedFieldsOnAViewCondition() (gas: 108083)\n[PASS] test_createRule_refusesUnknownAction() (gas: 108828)\n[PASS] test_createRule_refusesUnknownComparison() (gas: 106231)\n[PASS] test_createRule_refusesUnknownConditionKind() (gas: 107268)\n[PASS] test_createRule_refusesZeroFires() (gas: 56414)\n[PASS] test_createRule_refusesZeroTarget() (gas: 56656)\n[PASS] test_createRule_revertsWithoutAllowance() (gas: 248981)\n[PASS] test_createRule_viewHire_storesEverything() (gas: 460452)\n[PASS] test_getRule_unknownIdIsAllZeros() (gas: 69586)\n[PASS] test_mockDesk_refusesAnOrderForEachReasonTheRealDeskDoes() (gas: 2543664)\n[PASS] test_mockDesk_refusesTheFlagsTheRealDeskRefuses() (gas: 767559)\nSuite result: ok. 47 passed; 0 failed; 0 skipped; finished in 240.01ms (97.54ms CPU time)\n\nRan 57 tests for test/endowments/Endowments.harvest.t.sol:EndowmentsHarvestTest\n[PASS] testFuzz_runway_neverLiftsTheMeterAboveThirtyRequests(uint256,uint256,uint256,uint256) (runs: 256, μ: 937337, ~: 837575)\n[PASS] test_harvest_aDonationIsPaidOutAsYield() (gas: 514990)\n[PASS] test_harvest_anyoneMayCall_andTheCallerGetsNothing() (gas: 640628)\n[PASS] test_harvest_leavesBufferedPrincipalAlone() (gas: 1090737)\n[PASS] test_harvest_meter_aCallBackIntoEndowmentsIsRefused() (gas: 920829)\n[PASS] test_harvest_meter_fundsTheFeedsMeter() (gas: 827925)\n[PASS] test_harvest_meter_ifFundRevertsTheYieldStaysStaked() (gas: 1292606)\n[PASS] test_harvest_meter_ifTheFeedWereEverUnknownTheYieldStaysStaked() (gas: 761568)\n[PASS] test_harvest_meter_revertsIfTheMeterPullsLessThanItWasSent() (gas: 822066)\n[PASS] test_harvest_paysARecipientContractThatCannotMoveIMD_becauseItsCreatorChoseIt() (gas: 1793861)\n[PASS] test_harvest_pot_aCallBackIntoEndowmentsIsRefused() (gas: 908403)\n[PASS] test_harvest_pot_aFullPotSendsEverythingToTheFallback() (gas: 730784)\n[PASS] test_harvest_pot_aPotThatAsksAndThenTakesNothingMovesOnlyWhatItAskedFor() (gas: 868579)\n[PASS] test_harvest_pot_aPotThatBurnsItsGasCannotStopTheHarvest() (gas: 1201689)\n[PASS] test_harvest_pot_aPotThatNeedsAtLeastTheYieldGetsAllOfIt() (gas: 869178)\n[PASS] test_harvest_pot_aPotThatNeedsOneWeiIsSentOneWei() (gas: 857440)\n[PASS] test_harvest_pot_aPotThatReturnsHugeDataCannotStopTheHarvest() (gas: 1046372)\n[PASS] test_harvest_pot_aRevertingPotSendsEverythingToTheFallback() (gas: 713522)\n[PASS] test_harvest_pot_aSeriesIsFundedRoundAfterRound() (gas: 1831679)\n[PASS] test_harvest_pot_atTheLeastGasAllowed_aPotThatBurnsEverythingStillLeavesTheFallbackPaid() (gas: 9534882)\n[PASS] test_harvest_pot_chipsInForTheFallbackBeneficiary() (gas: 793413)\n[PASS] test_harvest_pot_ifThePotCannotBeAskedItIsOfferedEverything() (gas: 3030553)\n[PASS] test_harvest_pot_lowGasIsRefusedBeforeThePotIsAsked() (gas: 530046)\n[PASS] test_harvest_pot_noCodeAtThePotsAddressSendsEverythingToTheFallback() (gas: 712068)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback() (gas: 63143865)\n[PASS] test_harvest_pot_noGasAmountPushesTheHarvestToTheFallback_howeverMuchGasTheVaultUses() (gas: 167837680)\n[PASS] test_harvest_pot_revertsIfThePotTakesMoreThanItWasOffered() (gas: 945518)\n[PASS] test_harvest_pot_revertsWhenThePotCallCouldNotGetItsGas() (gas: 522885)\n[PASS] test_harvest_pot_takesOutOnlyWhatThePotStillNeeds_andTheRestStaysStaked() (gas: 1427737)\n[PASS] test_harvest_pot_whenAShareWeiIsWorthThousandsOfImdWei_theAmountsAreStillExact() (gas: 4302912)\n[PASS] test_harvest_pot_withEnoughGasThePotGetsItsChip() (gas: 710303)\n[PASS] test_harvest_recipientAndMeterNeedNoGasReserve() (gas: 622994)\n[PASS] test_harvest_recordsTheHighestPriceSeen() (gas: 643042)\n[PASS] test_harvest_revertsBelowTheMinimum() (gas: 520910)\n[PASS] test_harvest_revertsIfTheVaultBurnsMoreThanItSaid() (gas: 661861)\n[PASS] test_harvest_revertsIfTheVaultPaysShort() (gas: 660027)\n[PASS] test_harvest_revertsIfTheVaultReportsLessThanItPreviewed() (gas: 658717)\n[PASS] test_harvest_revertsInAStakeBlock() (gas: 1022046)\n[PASS] test_harvest_revertsOnUnknownEndowment() (gas: 36156)\n[PASS] test_harvest_revertsWhenNothingWasEarned() (gas: 467083)\n[PASS] test_harvest_sendsOnlyTheYieldToTheRecipient() (gas: 863754)\n[PASS] test_harvest_thenThePrincipalStillComesBackToTheWei() (gas: 745771)\n[PASS] test_harvest_twiceInARow_theSecondFindsNothing() (gas: 696052)\n[PASS] test_harvest_twoEndowmentsWithTheSamePrincipalEarnTheSame() (gas: 650704)\n[PASS] test_harvest_whenSomeoneElseCausesAHold_failsWithTheVaultsError_forThatBlockOnly() (gas: 891704)\n[PASS] test_runway_aFullMeterWaitsUntilARequestIsBought() (gas: 1383815)\n[PASS] test_runway_aFundAndDefundAroundAHarvestOnlyDelaysTheYield() (gas: 1294584)\n[PASS] test_runway_aHarvestFillsTheMeterToThirtyRequestsAndNoFurther() (gas: 1088840)\n[PASS] test_runway_aMeterSomeoneElseFilledTakesNothing() (gas: 1030688)\n[PASS] test_runway_afterAPartialHarvestThePrincipalComesBackToTheWei() (gas: 1410060)\n[PASS] test_runway_anAbsurdCostDoesNotOverflow() (gas: 827654)\n[PASS] test_runway_atTheLine_roomForAllOfItAndRoomForOneWeiLess() (gas: 1422493)\n[PASS] test_runway_doesNotApplyToOtherKinds() (gas: 633394)\n[PASS] test_runway_followsTheFeedsCost() (gas: 1560519)\n[PASS] test_runway_ifQuestionsCannotBeReadTheYieldStaysStaked() (gas: 1391194)\n[PASS] test_runway_isThirtyRequests() (gas: 18565)\n[PASS] test_runway_roomBelowTheSmallestHarvestIsNotTaken() (gas: 1185477)\nSuite result: ok. 57 passed; 0 failed; 0 skipped; finished in 240.01ms (415.17ms CPU time)\n\nRan 56 tests for test/rules/RulesFire.t.sol:RulesFireTest\n[PASS] test_canFire_followsEveryGate() (gas: 1043741)\n[PASS] test_cancel_racesAFireOnceTheConditionHolds_andWhicheverLandsFirstDecides() (gas: 593588)\n[PASS] test_check_isOnlyAsGoodAsTheGasItIsGiven() (gas: 371773)\n[PASS] test_feed_theMockAnswersTheFrozenSelector() (gas: 1460)\n[PASS] test_fire_aCopiedFireTakesTheTip_andTheFireItCopiedRevertsHavingMovedNothing() (gas: 495125)\n[PASS] test_fire_aRuleCannotSpendAnotherRulesEscrow() (gas: 651085)\n[PASS] test_fire_aZeroCooldownAllowsFiresBackToBack() (gas: 614712)\n[PASS] test_fire_everyComparison() (gas: 4936246)\n[PASS] test_fire_feed_aNewRoundBelowTheLineDoesNotFire_andDoesNotUseTheRoundUp() (gas: 451305)\n[PASS] test_fire_feed_aRoundThatDoesNotFit64BitsOnlyStopsTheRule() (gas: 1110723)\n[PASS] test_fire_feed_aShortAnswerOnlyStopsTheRule() (gas: 1066402)\n[PASS] test_fire_feed_aSourceThatBurnsItsGasOnlyStopsTheRule() (gas: 863533)\n[PASS] test_fire_feed_aSourceThatRevertsOnlyStopsTheRule() (gas: 454112)\n[PASS] test_fire_feed_aSourceWithoutCodeOnlyStopsTheRule() (gas: 388490)\n[PASS] test_fire_feed_aTimestampWiderThan64BitsOnlyStopsTheRule() (gas: 531871)\n[PASS] test_fire_feed_anAnswerStampedInTheFutureIsNotAnAnswer() (gas: 591923)\n[PASS] test_fire_feed_cooldownAndRoundBothApply() (gas: 675007)\n[PASS] test_fire_feed_doesNotFireBeforeAnyAnswer() (gas: 341364)\n[PASS] test_fire_feed_firesOnAFreshAnswer() (gas: 553445)\n[PASS] test_fire_feed_firesOncePerRound() (gas: 752129)\n[PASS] test_fire_feed_hire() (gas: 879968)\n[PASS] test_fire_feed_respectsTheMaximumAge() (gas: 592662)\n[PASS] test_fire_feed_theCallerCannotStarveTheSourceOfGas() (gas: 549631347)\n[PASS] test_fire_gas() (gas: 1126530)\nLogs:\n  gas: fire, VIEW then PAY: 111553\n  gas: fire, VIEW then HIRE (mock desk): 391443\n\n[PASS] test_fire_gasShort_isACleanRefusal_andAnOrdinaryLimitIsEnough() (gas: 560609)\n[PASS] test_fire_hire_announcesTheFireWithItsOrder() (gas: 819000)\n[PASS] test_fire_hire_eachFireOpensItsOwnOrder() (gas: 1238129)\n[PASS] test_fire_hire_opensTheOrderWithThePinnedTerms() (gas: 982507)\n[PASS] test_fire_hire_refusesADeskThatTakesLessThanTheOrderCosts() (gas: 867330)\n[PASS] test_fire_hire_refusesAnOrderIdItAlreadyKnows() (gas: 1394564)\n[PASS] test_fire_hire_refusesAnyOtherSpec() (gas: 610667)\n[PASS] test_fire_hire_whenTheDeskRefusesNothingChanges() (gas: 720537)\n[PASS] test_fire_pay_announcesTheFire() (gas: 443014)\n[PASS] test_fire_pay_ignoresWhateverSpecBytesTheCallerSends() (gas: 442090)\n[PASS] test_fire_pay_paysTheRecipientAndTipsTheCaller() (gas: 547469)\n[PASS] test_fire_refusesACancelledRule() (gas: 393407)\n[PASS] test_fire_refusesAnUnknownRule() (gas: 59483)\n[PASS] test_fire_refusesWhenTheConditionIsFalse() (gas: 398342)\n[PASS] test_fire_refusesWhenTheEscrowIsShort() (gas: 565383)\n[PASS] test_fire_respectsTheCooldown() (gas: 656494)\n[PASS] test_fire_stopsAtTheMaximumNumberOfFires() (gas: 652427)\n[PASS] test_fire_theCreatorMayFireItsOwnRule() (gas: 438631)\n[PASS] test_fire_theFirstFireNeedsNoCooldown() (gas: 476318)\n[PASS] test_fire_view_aTargetThatAnswersWithTooFewBytesOnlyStopsTheRule() (gas: 622956)\n[PASS] test_fire_view_aTargetThatBurnsItsGasOnlyStopsTheRule() (gas: 857371)\nLogs:\n  gas: check() against a target that spins: 113336\n\n[PASS] test_fire_view_aTargetThatRevertsOnlyStopsTheRule() (gas: 447888)\n[PASS] test_fire_view_aTargetThatTriesToWriteOnlyStopsTheRule() (gas: 782935)\n[PASS] test_fire_view_aTargetWithoutCodeOnlyStopsTheRule() (gas: 360895)\n[PASS] test_fire_view_aVeryLongAnswerIsReadByItsFirstWordOnly() (gas: 525441)\n[PASS] test_fire_view_exactly32BytesIsEnough() (gas: 502092)\n[PASS] test_fire_view_readsAFourArgumentView() (gas: 544048)\n[PASS] test_fire_view_readsAOneArgumentView() (gas: 573168)\n[PASS] test_fire_view_readsATargetThatAnswersPlainCalls() (gas: 559487)\n[PASS] test_fire_view_theCallerCannotStarveTheConditionOfGas() (gas: 553870395)\n[PASS] test_fire_view_theLongestCalldataLeavesTheAllowanceWhole() (gas: 691184220)\n[PASS] test_fire_withoutATipPaysTheCallerNothing() (gas: 456918)\nSuite result: ok. 56 passed; 0 failed; 0 skipped; finished in 337.48ms (723.35ms CPU time)\n\nRan 18 tests for test/launch/LaunchC.t.sol:LaunchCTest\n[PASS] test_launch_aMissingAddressIsRefused() (gas: 2417285)\n[PASS] test_launch_beforeTheDependenciesExistEveryUseReverts() (gas: 7098752)\n[PASS] test_launch_constructorCodeHoldsNoCallAndNoCodeCheck() (gas: 11075257)\n[PASS] test_launch_constructorsAreNonpayable() (gas: 759331)\n[PASS] test_launch_constructorsTouchNothingOutsideTheirOwnContract() (gas: 7043090)\n[PASS] test_launch_deploysInManifestOrderOnAnEmptyChain() (gas: 7006356)\n[PASS] test_launch_noForbiddenInstructionInAnyDeployedRuntime() (gas: 66671111)\n[PASS] test_launch_noFunctionNamesAnOwnerOrAPowerToChange() (gas: 4208422)\n[PASS] test_launch_onceTheDependenciesExistEachContractWorks() (gas: 16271964)\n[PASS] test_launch_sizeAndGasGates() (gas: 6902563)\nLogs:\n  contract: Rules\n    runtime bytes: 13762\n    initcode bytes, with arguments: 14217\n  contract: Endowments\n    runtime bytes: 13161\n    initcode bytes, with arguments: 13874\n  contract: Zap\n    runtime bytes: 3834\n    initcode bytes, with arguments: 4586\n  initcode bytes, whole launch: 32677\n  gas, three CREATE2 in one call (measured here): 6835468\n  gas, at 241 per initcode byte (a real launch's rate): 7875157\n\n[PASS] test_launch_stateChangingFunctionsAreExactlyTheDocumentedOnes() (gas: 10654155)\n[PASS] test_manifest_everyArgumentInTheDocumentIsWhatTheCodeExpects() (gas: 396246)\n[PASS] test_manifest_literals() (gas: 21340)\n[PASS] test_manifest_namesAndArgumentsFitTheLaunchRules() (gas: 75432)\n[PASS] test_manifest_theDocumentNamesTheThreeContractsInOrder() (gas: 988200)\n[PASS] test_manifest_theEarlierLaunchesAreWrittenWithTheirLiveAddresses() (gas: 2576058)\n[PASS] test_scan_findsADelegatecallInCompiledCodeAndNotInAConstant() (gas: 515957)\n[PASS] test_scan_seesInstructionsAndStepsOverPushData() (gas: 24153)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 473.36ms (304.06ms CPU time)\n\nRan 18 tests for test/rules/RulesFuzz.t.sol:RulesFuzzTest\n[PASS] testFuzz_conditionDataLength(uint16) (runs: 256, μ: 186594, ~: 257725)\n[PASS] testFuzz_cooldown(uint32,uint32) (runs: 256, μ: 535328, ~: 483362)\n[PASS] testFuzz_costMustFitAnEscrow(uint96,uint96) (runs: 256, μ: 163153, ~: 229238)\n[PASS] testFuzz_feed_answerLength(uint16) (runs: 256, μ: 408153, ~: 353980)\n[PASS] testFuzz_feed_anyAnswer(uint256,uint256,uint256,uint8,uint256,uint32,bool) (runs: 256, μ: 420015, ~: 422152)\n[PASS] testFuzz_feed_freshnessAndRound(uint32,uint32,uint64,uint64) (runs: 256, μ: 679524, ~: 640666)\n[PASS] testFuzz_hire_changeComesBackExactly(uint96,uint96,uint96,uint96) (runs: 256, μ: 1155884, ~: 1158977)\n[PASS] testFuzz_hire_deliveryTimeAgreesWithTheDesk(uint32,bool) (runs: 256, μ: 368701, ~: 110742)\n[PASS] testFuzz_hire_flagsAgreeWithTheDesk(uint8) (runs: 256, μ: 322296, ~: 103367)\n[PASS] testFuzz_pay_sumsAreExact(uint96,uint96,uint96,uint8) (runs: 256, μ: 719151, ~: 456039)\n[PASS] testFuzz_spec_arbitraryBytesAgreeWithTheDesk(bytes) (runs: 256, μ: 86001, ~: 68820)\n[PASS] testFuzz_spec_lengthLimit(uint16) (runs: 256, μ: 3155607, ~: 4366471)\n[PASS] testFuzz_spec_nearlyValidTextAgreesWithTheDesk(uint256,uint16,uint16,uint8) (runs: 256, μ: 685497, ~: 653762)\n[PASS] testFuzz_spec_oneRefusedByteIsFoundWhereItIs(uint16,uint16,uint8) (runs: 256, μ: 2513975, ~: 1020248)\n[PASS] testFuzz_twoRulesNeverShareMoney(uint96,uint96,uint96,uint8) (runs: 256, μ: 1077335, ~: 903079)\n[PASS] testFuzz_view_anyAnswer(bytes,uint8,uint256) (runs: 256, μ: 329740, ~: 321351)\n[PASS] testFuzz_view_comparisonAtTheLine(uint8,uint256,uint8) (runs: 256, μ: 336857, ~: 337121)\n[PASS] testFuzz_view_comparisonMatchesTheReference(uint8,uint256,uint256) (runs: 256, μ: 358832, ~: 359411)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 473.60ms (2.60s CPU time)\n\nRan 35 tests for test/rules/RulesMoney.t.sol:RulesMoneyTest\n[PASS] test_cancel_anEmptyRule() (gas: 260619)\n[PASS] test_cancel_leavesOtherRulesAlone() (gas: 597887)\n[PASS] test_cancel_onlyOnce() (gas: 346094)\n[PASS] test_cancel_onlyTheCreator() (gas: 356624)\n[PASS] test_cancel_returnsTheUnspentEscrowToTheCreator() (gas: 605819)\n[PASS] test_onWorkDelivered_afterCancel_paysTheCreator() (gas: 1021363)\n[PASS] test_onWorkDelivered_gasFitsTheDesksAllowance() (gas: 1013567)\nLogs:\n  gas: onWorkDelivered with change to credit: 62365\n\n[PASS] test_onWorkDelivered_ignoresAnOrderItDidNotOpen() (gas: 37435)\n[PASS] test_onWorkDelivered_onlyTheDesk() (gas: 874161)\n[PASS] test_onWorkDelivered_returnsTheChangeInTheSameTransaction() (gas: 1055364)\n[PASS] test_recall_afterCancel_sendsTheOrdersEscrowToTheCreator() (gas: 994931)\n[PASS] test_recall_onlyTheCreator() (gas: 896467)\n[PASS] test_recall_refusesAnotherRulesOrder() (gas: 1508032)\n[PASS] test_recall_revertsWhenTheDeskWillNotCancel() (gas: 1012409)\n[PASS] test_recall_withdrawsAnUntakenOrderIntoTheRule() (gas: 987718)\n[PASS] test_reconcile_afterCancel_paysTheCreatorDirectly() (gas: 1169983)\n[PASS] test_reconcile_creditsARefundedOrder() (gas: 1074807)\n[PASS] test_reconcile_creditsAnOrderRefundedAtTheSecondItExpires() (gas: 1022131)\n[PASS] test_reconcile_creditsEachNewAmountOnce() (gas: 1288455)\n[PASS] test_reconcile_creditsOnlyTheRuleThatPaid() (gas: 1986388)\n[PASS] test_reconcile_creditsTheChangeFromADeliveredOrder() (gas: 1025607)\n[PASS] test_reconcile_isSafeToRepeat() (gas: 1106998)\n[PASS] test_reconcile_nothingComesBackFromAnOrderDeliveredAtFullPrice() (gas: 977049)\n[PASS] test_reconcile_nothingToCreditWhileTheOrderIsOpen() (gas: 891896)\n[PASS] test_reconcile_refusesADeskThatNamesAnotherEmployer() (gas: 1000018)\n[PASS] test_reconcile_refusesADeskThatReportsMoreThanItSent() (gas: 1521331)\n[PASS] test_reconcile_refusesAnOrderOfAnotherRule() (gas: 1700580)\n[PASS] test_reconcile_refusesOrdersItDidNotOpen() (gas: 1309708)\n[PASS] test_reconcile_theBalanceCheckProtectsBookedEscrows_notUnreconciledReturns() (gas: 2015301)\n[PASS] test_reconcile_theReturnedMoneyCanBeSpentAgain() (gas: 1458912)\n[PASS] test_reentrancy_everyMoneyFunctionIsLockedWhileARuleFires() (gas: 2965442)\n[PASS] test_reentrancy_lockedWhileAnOrderIsRecalled() (gas: 975563)\n[PASS] test_topUp_anExhaustedRuleStillTakesMoney_whichItsCreatorCanWithdraw() (gas: 585093)\n[PASS] test_topUp_anyoneAddsToARulesEscrow() (gas: 418696)\n[PASS] test_topUp_refusesUnknownCancelledAndZero() (gas: 402103)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 473.59ms (20.22ms CPU time)\n\nRan 11 tests for test/endowments/Endowments.fuzz.t.sol:EndowmentsFuzzTest\n[PASS] testFuzz_batchSplitNeverExceedsWhatWasMinted(uint256,uint256,uint256) (runs: 256, μ: 868986, ~: 868982)\n[PASS] testFuzz_everyDepositorGetsExactlyTheirOwn(uint256,uint256,uint256,uint256) (runs: 256, μ: 1487461, ~: 1487425)\n[PASS] testFuzz_harvestNeverTakesPrincipal(uint256,uint256) (runs: 256, μ: 791742, ~: 822142)\n[PASS] testFuzz_inKindExitIsWorthThePrincipal(uint256,uint256,uint256) (runs: 256, μ: 824530, ~: 824661)\n[PASS] testFuzz_lossIsSharedInProportion(uint256,uint256,uint256,bool) (runs: 256, μ: 820274, ~: 820353)\n[PASS] testFuzz_potHarvestTakesOutNoMoreThanThePotNeeds(uint256,uint256,uint256) (runs: 256, μ: 1064431, ~: 1064838)\n[PASS] testFuzz_principalComesBackToTheWei(uint256,uint256,uint256) (runs: 256, μ: 772951, ~: 777616)\n[PASS] testFuzz_quoteMatchesExit(uint256,uint256,uint256,bool) (runs: 256, μ: 758376, ~: 757055)\n[PASS] testFuzz_roundingWearIsBounded(uint256,uint8) (runs: 256, μ: 2759314, ~: 2071712)\n[PASS] testFuzz_theGateOpensExactlyAtSpare_andWholeMeansPaidInFull(uint256,uint256) (runs: 256, μ: 997886, ~: 939481)\n[PASS] testFuzz_unstakedEndowmentIsUntouchedByTheVault(uint256,uint256) (runs: 256, μ: 742920, ~: 743309)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 473.59ms (1.90s CPU time)\n\nRan 9 tests for test/endowments/MockStakedIMD.t.sol:MockStakedIMDTest\n[PASS] testFuzz_priceNeverFallsFromDepositsAndExits(uint256,uint256) (runs: 256, μ: 334503, ~: 334645)\n[PASS] test_depositMintsWhatThePreviewSaid_andWithdrawBurnsWhatThePreviewSaid() (gas: 227648)\n[PASS] test_fixture_depositAndWithdrawPreviewsMatchTheRealVault() (gas: 481198)\n[PASS] test_fixture_mintAndRedeemPreviewsMatchTheRealVault() (gas: 586282)\n[PASS] test_fixture_totalAssetsIsTheVaultsImdBalance() (gas: 300741)\n[PASS] test_hold_aMintBlocksThatHoldersExitInTheSameBlockOnly() (gas: 262077)\n[PASS] test_hold_travelsWithATransfer_butNeverBackwards() (gas: 420930)\n[PASS] test_hold_zeroAmountsStampNothing() (gas: 205206)\n[PASS] test_plainTransferIsYield_andLoseIsALoss() (gas: 152558)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 473.65ms (40.60ms CPU time)\n\nRan 42 tests for test/rules/Zap.t.sol:ZapTest\n[PASS] testFuzz_buy_minimumOut(uint256,uint256,uint256) (runs: 256, μ: 230535, ~: 230544)\n[PASS] testFuzz_chipIn_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 452612, ~: 456677)\n[PASS] testFuzz_deadline_runsExactlyWhenNotLate(uint256,uint256,uint8) (runs: 256, μ: 251756, ~: 260183)\n[PASS] testFuzz_fundMeter_conservesEverything(uint256,uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 706246, ~: 710998)\n[PASS] test_buy_minimumOutAndNoEth() (gas: 193935)\n[PASS] test_buy_refundsTheEthThePoolCouldNotUse() (gas: 234154)\n[PASS] test_buy_sendsTheImdToTheCaller() (gas: 199726)\n[PASS] test_chipIn_minimumOut_passesAtTheExactAmountAndFailsOneAbove() (gas: 444556)\n[PASS] test_chipIn_minimumOut_protectsAgainstAWorsePrice() (gas: 271681)\n[PASS] test_chipIn_refundsTheEthThePoolCouldNotUse() (gas: 346704)\n[PASS] test_chipIn_revertsWhenTheCallerCannotTakeItsEthBack() (gas: 855551)\n[PASS] test_chipIn_revertsWhenThePoolGivesNothing_evenWithAZeroMinimum() (gas: 186549)\n[PASS] test_chipIn_revertsWhenThePotTakesNothing() (gas: 952239)\n[PASS] test_chipIn_revertsWithoutEth() (gas: 104386)\n[PASS] test_chipIn_sendsBackTheImdThePotDidNotNeed() (gas: 351471)\n[PASS] test_chipIn_swapsAndChipsInTheCallersName() (gas: 344805)\n[PASS] test_constructor_makesNoCallToItsArguments() (gas: 9083)\n[PASS] test_constructor_recordsItsArguments() (gas: 30582)\n[PASS] test_constructor_refusesZeroAddresses() (gas: 4591)\n[PASS] test_deadline_isCheckedBeforeEverythingElse() (gas: 175381)\n[PASS] test_deadline_runsInItsLastSecondAndRevertsOneSecondLater() (gas: 820970)\n[PASS] test_deadline_zeroIsNotNoDeadline() (gas: 40894)\n[PASS] test_fundMeter_creditsSharesAtTheMetersWorth() (gas: 563760)\n[PASS] test_fundMeter_minimumOutAndNoEth() (gas: 464181)\n[PASS] test_fundMeter_refundsTheEthThePoolCouldNotUse() (gas: 317294)\n[PASS] test_fundMeter_revertsWhenNoSharesAreCredited() (gas: 342388)\n[PASS] test_fundMeter_revertsWhenQuestionsRefuses() (gas: 231534)\n[PASS] test_fundMeter_sendsBackTheImdTheMeterDidNotTake() (gas: 346680)\n[PASS] test_fundMeter_swapsAndFundsInTheCallersName() (gas: 329138)\n[PASS] test_gas() (gas: 681658)\nLogs:\n  gas: chipIn (mock pool, mock pots): 252710\n  gas: fundMeter (mock pool, mock questions): 300939\n  gas: buy (mock pool): 186187\n\n[PASS] test_poolId_matchesTheMainnetFixture() (gas: 20125)\n[PASS] test_poolKey_isTheHooklessEthImdPool() (gas: 24508)\n[PASS] test_reentrancy_aCallerCannotStartASecondZapFromItsRefund() (gas: 523899)\n[PASS] test_strayEth_aCallerOwedARefundItCannotTakeStillReverts() (gas: 455693)\n[PASS] test_strayEth_doesNotStopACallerThatIsOwedNoRefund() (gas: 1367160)\n[PASS] test_strayImdAndEthLeaveWithTheNextCall() (gas: 241861)\n[PASS] test_swap_revertsOnAResultOfTheWrongSign() (gas: 174517)\n[PASS] test_swap_revertsWhenTheManagerDoesNotCountTheEthItWasPaid() (gas: 182458)\n[PASS] test_swap_revertsWhenTheManagerUsesMoreEthThanItWasOffered() (gas: 173285)\n[PASS] test_swap_usesItsOwnPoolKey() (gas: 573339)\n[PASS] test_unlockCallback_onlyThePoolManager() (gas: 36050)\n[PASS] test_zapCannotBeSentEth() (gas: 68234)\nSuite result: ok. 42 passed; 0 failed; 0 skipped; finished in 473.72ms (293.46ms CPU time)\n\nRan 2 tests for test/rules/ZapInvariant.t.sol:ZapInvariantTest\n[PASS]\nZapInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_everyWeiIsAccountedFor\n[PASS] invariant_zapKeepsNothingOfACallers\n ZapInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭------------+-----------+-------+---------+----------╮\n| Contract   | Selector  | Calls | Reverts | Discards |\n+=====================================================+\n| ZapHandler | buy       | 856   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | chipIn    | 820   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | fundMeter | 839   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | openPot   | 882   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | passTime  | 878   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushEth   | 836   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | pushImd   | 919   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setDepth  | 840   | 0       | 0        |\n|------------+-----------+-------+---------+----------|\n| ZapHandler | setPrice  | 810   | 0       | 0        |\n╰------------+-----------+-------+---------+----------╯\n\nLogs:\n  chipIn: 8\n  chipIn reverted: 8\n  fundMeter: 3\n  fundMeter reverted: 12\n  buy: 3\n  buy reverted: 10\n  served through the relay: 1\n    of which with stray ETH waiting in Zap: 1\n  calls that carried a deadline already passed: 6\n  calls that carried this very second: 7\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 5316609)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.35s (1.35s CPU time)\n\nRan 2 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsLossInvariantTest\n[PASS]\nEndowmentsLossInvariantTest invariants:\n[PASS] invariant_loss_bookedSharesWithinSimdHeld\n[PASS] invariant_loss_bufferIsExactlyTheImdHeld\n[PASS] invariant_loss_principalBooksAgree\n[PASS] invariant_loss_sharedFairlyAndHarvestStops\n EndowmentsLossInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 581   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 520   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 557   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 562   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 561   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 529   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 564   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 617   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | lose                | 569   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 573   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 606   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 570   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 588   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 586   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 552   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 524   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 541   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 2\n    to the meter: 2\n    to the meter, cut to the room under the runway: 2\n  meter harvests that had to wait for room: 6\n\n[PASS] test_handler_reachesLossBehaviour() (gas: 3315397)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.44s (6.44s CPU time)\n\nRan 2 tests for test/rules/RulesInvariant.t.sol:RulesInvariantTest\n[PASS]\nRulesInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_cancelledRulesAndOrderLinks\n[PASS] invariant_eachRulesEscrowIsConserved\n[PASS] invariant_escrowsPlusMoneyOnOrdersEqualsHeldPlusOwed\n[PASS] invariant_firesRespectCooldownAndMaximum\n[PASS] invariant_holdingsCoverEveryEscrow\n[PASS] invariant_nothingIsCreatedOrLost\n RulesInvariantTest invariants (runs: 64, calls: 7680, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| RulesHandler | cancel        | 363   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | createRule    | 665   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskAwardBond | 332   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskDeliver   | 673   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | deskRefund    | 355   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | fire          | 2199  | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | pushFeed      | 339   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | recall        | 291   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | reconcile     | 702   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | setGauge      | 348   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | stray         | 353   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | topUp         | 354   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| RulesHandler | warp          | 706   | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  rules: 10\n  orders: 3\n  fires: 8\n  fires refused: 26\n    rule cancelled: 24\n    rule exhausted: 0\n    escrow short: 0\n    condition false or cooling down: 2\n  reconciles: 13\n  recalls: 2\n  deliveries: 0\n  refunds: 1\n  bond awards: 0\n  cancels: 5\n\n[PASS] test_scriptedWalk_everyPathThenEveryInvariant() (gas: 11439536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.62s (6.63s CPU time)\n\nRan 3 tests for test/endowments/invariant/Endowments.invariant.t.sol:EndowmentsInvariantTest\n[PASS]\nEndowmentsInvariantTest invariants:\n[PASS] invariant_E1_holdingsCoverPrincipal\n[PASS] invariant_E2_bookedSharesWithinSimdHeld\n[PASS] invariant_E3_exactWithdrawalsOnlyWaitForAHold\n[PASS] invariant_bufferIsExactlyTheImdHeld\n[PASS] invariant_priceMarkFollowsThePrice\n[PASS] invariant_principalBooksAgree\n EndowmentsInvariantTest invariants (runs: 64, calls: 9600, reverts: 0)\n\n╭-------------------+---------------------+-------+---------+----------╮\n| Contract          | Selector            | Calls | Reverts | Discards |\n+======================================================================+\n| EndowmentsHandler | create              | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | deposit             | 622   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | depositToMeter      | 572   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | donate              | 546   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | earn                | 587   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | exitInKind          | 631   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvest             | 626   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | harvestMeter        | 623   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | meterSpends         | 618   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | repriceFeed         | 580   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | roll                | 584   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | setPot              | 597   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | stake               | 614   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerFundsMeter  | 612   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | strangerSendsShares | 591   | 0       | 0        |\n|-------------------+---------------------+-------+---------+----------|\n| EndowmentsHandler | withdraw            | 583   | 0       | 0        |\n╰-------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  harvests in the last run: 1\n    to the meter: 1\n    to the meter, cut to the room under the runway: 1\n  meter harvests that had to wait for room: 4\n\n[PASS] test_handler_reachesEveryBehaviour() (gas: 4633194)\n[PASS] test_handler_reachesTheMeterRunway() (gas: 3366239)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.08s (7.08s CPU time)\n\nRan 20 test suites in 7.08s (25.52s CPU time): 417 tests passed, 0 failed, 0 skipped (417 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Endowments.createForMeter(bytes32)\",\"Endowments.createForPot(uint256,address)\",\"Endowments.createForRecipient(address)\",\"Endowments.deposit(uint256,uint256)\",\"Endowments.donate(uint256,uint256)\",\"Endowments.exit(uint256,uint256,uint256,bool)\",\"Endowments.harvest(uint256)\",\"Endowments.stake()\",\"Endowments.withdraw(uint256,uint256)\",\"Rules.cancel(uint256)\",\"Rules.fire(uint256,bytes)\",\"Rules.onWorkDelivered(uint256,bytes16,bytes32)\",\"Rules.recall(uint256,uint256)\",\"Rules.reconcile(uint256,uint256)\",\"Rules.topUp(uint256,uint96)\",\"Zap.buy(uint256,uint256)\",\"Zap.chipIn(uint256,uint256,uint256)\",\"Zap.fundMeter(bytes32,uint256,uint256)\",\"Zap.unlockCallback(bytes)\"],\"files\":{\".gitignore\":12,\"ADAPTATION.md\":119,\"LICENSE\":21,\"README.md\":307,\"docs/DEVIATIONS.md\":207,\"docs/LAUNCH.md\":714,\"docs/THREATS.md\":752,\"foundry.toml\":45,\"integration/foundry.toml\":54,\"integration/test/DeploymentsBook.t.sol\":75,\"integration/test/DocumentedCommands.t.sol\":132,\"integration/test/EndowmentsWithRealSiblings.t.sol\":308,\"integration/test/RulesWithRealDesk.t.sol\":393,\"integration/test/RulesWithRealQuestions.t.sol\":199,\"integration/test/Siblings.sol\":143,\"integration/test/StandInsAgree.t.sol\":429,\"integration/test/ZapWithRealSiblings.t.sol\":169,\"remappings.txt\":2,\"src/endowments/Endowments.sol\":951,\"src/interfaces/ICrowdPots.sol\":21,\"src/interfaces/IQuestions.sol\":57,\"src/interfaces/IWorkOrders.sol\":113,\"src/interfaces/external/Mainnet.sol\":55,\"src/rules/Rules.sol\":855,\"src/rules/Zap.sol\":287,\"src/rules/v4/IPoolManagerLike.sol\":68,\"test/endowments/Endowments.audit.t.sol\":124,\"test/endowments/Endowments.create.t.sol\":362,\"test/endowments/Endowments.flow.t.sol\":702,\"test/endowments/Endowments.fuzz.t.sol\":319,\"test/endowments/Endowments.harvest.t.sol\":1055,\"test/endowments/Endowments.loss.t.sol\":513,\"test/endowments/EndowmentsBase.sol\":200,\"test/endowments/MockStakedIMD.t.sol\":158,\"test/endowments/fork/Endowments.fork.t.sol\":442,\"test/endowments/invariant/Endowments.invariant.t.sol\":442,\"test/endowments/invariant/EndowmentsHandler.sol\":487,\"test/endowments/mocks/MockCrowdPots.sol\":207,\"test/endowments/mocks/MockIMD.sol\":35,\"test/endowments/mocks/MockQuestions.sol\":202,\"test/endowments/mocks/MockStakedIMD.sol\":196,\"test/fixtures/endowments/simd-block-26164296.json\":76,\"test/fixtures/rules/eth-imd-pool.json\":22,\"test/fixtures/rules/records/e9efec16-skill-research-report-3db99325.hex\":1,\"test/kit/EarlierLaunches.sol\":33,\"test/kit/LiveSiblings.sol\":254,\"test/kit/RecordKit.sol\":250,\"test/kit/RecordMaker.sol\":103,\"test/launch/Bytecode.sol\":53,\"test/launch/LaunchBench.sol\":83,\"test/launch/LaunchC.t.sol\":685,\"test/launch/LaunchDoc.sol\":201,\"test/launch/LaunchManifest.sol\":112,\"test/launch/LaunchRunbook.t.sol\":651,\"test/launch/fork/LaunchC.fork.t.sol\":505,\"test/launch/fork/LiveSiblings.fork.t.sol\":469,\"test/rules/RulesBase.sol\":148,\"test/rules/RulesCreate.t.sol\":685,\"test/rules/RulesDeskScenario.sol\":131,\"test/rules/RulesDeskScenario.t.sol\":39,\"test/rules/RulesFire.t.sol\":902,\"test/rules/RulesFuzz.t.sol\":433,\"test/rules/RulesInvariant.t.sol\":566,\"test/rules/RulesMoney.t.sol\":579,\"test/rules/Zap.t.sol\":777,\"test/rules/ZapInvariant.t.sol\":454,\"test/rules/fork/RulesAndZapFork.t.sol\":395,\"test/rules/fork/RulesDeskFork.t.sol\":70,\"test/rules/mocks/BareDesk.sol\":13,\"test/rules/mocks/MockDesk.sol\":245,\"test/rules/mocks/MockFeed.sol\":43,\"test/rules/mocks/MockIMD.sol\":13,\"test/rules/mocks/MockPoolManager.sol\":101,\"test/rules/mocks/MockPots.sol\":97,\"test/rules/mocks/MockQuestions.sol\":102,\"test/rules/mocks/Targets.sol\":86,\"test/scaffold/Interfaces.t.sol\":74},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"af671a367377b38c1bed15111de812938beff85017b3ee59c0405c42503767a0","verifiedTreeHash":"7639e174ff0ce22efd9107bf1536faa3ba371b59","verifierVersion":"0.1.0+8fbf00a5"}]}