{"assessments":[],"deployments":[],"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":"39b1dac8-e311-4ea2-8b03-b5322c6b5671","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"79045348a65f7ef48612740a335887d76d0fcbad7625106fcfd90d639ba0de7f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"5b568a5d9dcb87d3a575906fd2a57a765e2afbdf6ff0870ca20158eaa69999c7","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"5b568a5d9dcb87d3a575906fd2a57a765e2afbdf6ff0870ca20158eaa69999c7","skillId":"build-contract-project","state":"accepted"}],"objective":"Redeploy PawnShop (with its LendingPool), LockDiscount and MilestoneBurn with the fixes below, from audit job e4a761c2-59b8-4c34-84fc-54fade5f665a (commit 5086b57). Keep the token and FloorRelay as deployed. Every other rule, number and interface stays as is.\n\nCONSTRUCTOR PRESETS: attester = the deployed FloorRelay; identity.md questionHash = 0x71ed43868c5c61fe21b72bbbdcc09913d4952a113a393c526e49f3289edf4be1; newLoansPaused = true; same owner.\n\nPAWNSHOP\n- F1: startAuction requires floorFresh(collection) (revert StaleFloor); buyAuction reverts in the same block the auction started.\n- F2: restartAuction(id), anyone, allowed after writeOffAuction or once an auction has sat at the terminal price for 7 days; requires a fresh floor, resets auctionStarted and auctionFloor, re-runs the curve; proceeds still flow through receiveRecovery and borrower surplus.\n- F3: buyAuction reverts when the vault does not hold the collateral (no zero-price sale); writeOffAuction stays the settlement path for missing collateral.\n- F5: markOverdue(id), anyone, from loan.due onward, books principal minus min(principal, storedFloor/2) through markAuctionLoss (non-decreasing, keyed by id).\n- F6: pawn(collection, tokenId, termId, minPrincipal, maxFee); revert if principal < minPrincipal or fee > maxFee. The site passes the displayed values with 1% tolerance.\n- F7: no auction bounty when msg.sender == loan.borrower; cap it at min(AUCTION_BOUNTY, principal / 100).\n- F8: submitFloor also rejects a.fromBlock > a.toBlock or a.toBlock + 7800 < block.number.\n- F9: record reserveUsed[id] at settlement; receiveRecovery(id) restores min(value, reserveUsed[id]) to the shortfall reserve before vesting the rest.\n- F14: buyAuction rejects receiver == loan.vault or == loan.collection.\n- F15: after any questionHash write to a collection, including a queued rotation, that collection's new loans are disabled for 48 hours. The constructor preset is exempt.\n- F16: wrap IDiscountModule.release in try/catch on repay, buyAuction and writeOffAuction.\n- Protocol share: while either reserve is below target, 50% of each protocol fee goes to the reserves and 50% to the fee recipient; once both are at target, 100% to the fee recipient. The lenders' 85% is unchanged.\n\nLENDINGPOOL\n- F4: in settleAuction, when the released loss allowance exceeds the realised loss, vest the difference over 7 days instead of releasing it at once; markAuctionLoss may lower the allowance while holdsCollateral() is true.\n- F12: executeDepositCap gets the same 7-day execution window as PawnShop changes, plus onlyOwner cancelDepositCap().\n\nCOLLATERALVAULT (implementation redeployed with the shop): F13: isValidSignature uses holdsCollateral() and returns 0xffffffff instead of reverting.\n\nMILESTONEBURN: F11: accepted attestation age at most 1 hour; questionHash settable once as before; README notes the question must use a 24-hour time-weighted price.\n\nTESTS: F10 fix the invariant formula (additions first); add the audit's proof tests for F1, F3, F4 to the suite; a test per fix above, including the protocol-share split.\n\nSITE: update all addresses to the new contracts; pawn passes minPrincipal and maxFee; Setup shows the preset hash and attester as done and drops the attester-switch step; Borrow and Setup use the FloorRelay request-id flow; Stats shows protocol fees paid to the recipient and reserve levels. Build and publish under the same name.\n\nDOCS: README and docs/SETUP-AND-KEEPER.md updated; list the audit findings and which fix addresses each.","parentJobId":"dec04d23-9b4c-454c-9593-cc0a6df6eac7","planHash":"b53a1f926823eb8e95fa9e84709bfeec62dcc918c94ed6dce0118afa52cfd0ba","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"699b8539-76a2-4c37-b11e-ba4d269487ad","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1031-workflow-frontend-stage-context"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52216","feedbackHash":"0e0a358fd20a3e2404412a0a91f845a6c3b7ea85374e6195bb613d2135005816","nodeKey":"build_contract_project","submissionHash":"79045348a65f7ef48612740a335887d76d0fcbad7625106fcfd90d639ba0de7f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"47a4b7728f846ad1c5227bfa77dd2665a0384aa77822272f43cc72b9d7edd45b","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"6b11cad3e7cae554a556e2475ae2b44d7b7b3ae7e999a629d8a19ec86cbee347","device":"47f3603854a893a3","findings":[],"hash":"79045348a65f7ef48612740a335887d76d0fcbad7625106fcfd90d639ba0de7f","nodeId":"b94c31b2-3d02-437b-a9bc-08aa8125f7b1","outcome":"completed","summary":"","treeHash":"a6dc7dd2c3d4fcf8ced1e572e04584c2051523e2","usage":{"cachedInputTokens":8004868,"inputTokens":120,"model":"claude-opus-5-5","outputTokens":66791,"runtime":"claude","turns":61,"wallClockMs":1289878}}],"verification":[{"checks":[{"durationMs":103012,"exitCode":0,"name":"build","output":"Compiling 92 files with Solc 0.8.26\nSolc 0.8.26 finished in 102.79s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/FloorRelay.t.sol:226:5:\n    |\n226 |     function _packSigned(OracleAttestation.Attestation memory a) internal view returns (bytes memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/MilestoneBurn.sol:34:67\n   │\n34 │     constructor(address token_, address setter_, address signer_, address shop_) OracleAttestationConsumer(signer_) {\n   │                                                                   ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MilestoneBurn.sol:55:46\n   │\n55 │                 || a.agreed > a.panelSize || a.issuedAt > block.timestamp\n   │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MilestoneBurn.sol:56:20\n   │\n56 │                 || block.timestamp - a.issuedAt > MAX_ATTESTATION_AGE || a.answer.length != 32\n   │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MilestoneBurn.sol:69:9\n   │\n69 │         emit Burned(amount, cap, a.requestId);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/CollateralVault.sol:107:45\n    │\n107 │                 || m.nonce == bytes32(0) || m.expiresAt <= block.timestamp || bytes(m.relayOrigin).length == 0\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/CollateralVault.sol:112:9\n    │\n112 │         emit WorkerAuthorized(workerDigest, m.expiresAt);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/CollateralVault.sol:125:20\n    │\n125 │                 || block.timestamp > workerExpiresAt || !IPawnShop(pawnShop).loanActive(loanId) || !holdsCollateral()\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/PawnShop.sol:158:17\n    │\n158 │     constructor(address owner_, address token_, address weth_, address attester_)\n    │                 ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/CollateralVault.sol:133:9\n    │\n133 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/CollateralVault.sol:130:22\n    │\n130 │     function callFor(address target, bytes calldata data)\n    │                      ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/CollateralVault.sol:145:9\n    │\n145 │         emit Called(target, bytes4(data));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/CollateralVault.sol:145:29\n    │\n145 │         emit Called(target, bytes4(data));\n    │                             ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes4' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/CollateralVault.sol:149:64\n    │\n149 │     function withdrawETH(uint256 amount) external onlyBorrower nonReentrant {\n    │                                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/CollateralVault.sol:154:81\n    │\n154 │     function withdrawToken(address token, uint256 amount) external onlyBorrower nonReentrant {\n    │                                                                                 ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/CollateralVault.sol:170:9\n    │\n170 │         emit Released(receiver);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n   ╭▸ src/PullPayments.sol:31:22\n   │\n31 │         (bool ok,) = receiver.call{value: amount}(\"\");\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/PullPayments.sol:33:9\n   │\n33 │         emit Claimed(msg.sender, receiver, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:202:34\n    │\n202 │         if (queuedAt[op] == 0 || block.timestamp < queuedAt[op] || block.timestamp > queuedAt[op] + EXECUTION_WINDOW) {\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:202:68\n    │\n202 │         if (queuedAt[op] == 0 || block.timestamp < queuedAt[op] || block.timestamp > queuedAt[op] + EXECUTION_WINDOW) {\n    │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/PawnShop.sol:288:34\n    │\n288 │     function executeFeeRecipient(address recipient) external {\n    │                                  ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/PawnShop.sol:299:36\n    │\n299 │     function executeDiscountModule(address module) external {\n    │                                    ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:321:46\n    │\n321 │                 || a.agreed > a.panelSize || a.issuedAt > block.timestamp\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:322:20\n    │\n322 │                 || block.timestamp - a.issuedAt > FLOOR_MAX_AGE || a.issuedAt <= floors[collection].issuedAt\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:336:36\n    │\n336 │         if (f.lastBountyAt == 0 || block.timestamp >= uint256(f.lastBountyAt) + FLOOR_BOUNTY_INTERVAL) {\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/PullPayments.sol:21:9\n   │\n21 │         emit Credited(account, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:340:9\n    │\n340 │         emit FloorSubmitted(collection, price, a.issuedAt, a.expiresAt);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PawnShop.sol:337:30\n    │\n337 │             f.lastBountyAt = uint64(block.timestamp);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:345:32\n    │\n345 │         return f.price != 0 && f.issuedAt <= block.timestamp && block.timestamp - f.issuedAt <= FLOOR_MAX_AGE\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:345:65\n    │\n345 │         return f.price != 0 && f.issuedAt <= block.timestamp && block.timestamp - f.issuedAt <= FLOOR_MAX_AGE\n    │                                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:346:16\n    │\n346 │             && block.timestamp <= f.expiresAt;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `collectionDebt` is updated\n    ╭▸ src/PawnShop.sol:371:57\n    │\n371 │         CollateralVault vault = CollateralVault(payable(vaultFactory.create()));\n    │                                                         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:357:13\n    │\n357 │         if (block.timestamp < loansDisabledUntil[collection]) revert QuestionCooldown();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:565:9\n    │\n565 │         emit ProtocolFeeSplit(toRecipient, forBounty, forReserve);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:393:9\n    │\n393 │         emit Pawned(id, msg.sender, collection, tokenId, address(vault), principal, fee, loan.due);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:436:13\n    │\n436 │             emit DiscountReleaseFailed(id, module);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:406:9\n    │\n406 │         emit Repaid(id);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:419:9\n    │\n419 │         emit Extended(id, termId, fee, loan.due);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:443:13\n    │\n443 │         if (block.timestamp < loan.due) revert NotOverdue();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:446:9\n    │\n446 │         emit LoanMarkedOverdue(id, lendingPool.auctionLoss(id));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:451:13\n    │\n451 │         if (block.timestamp <= loan.due + GRACE) revert GracePeriod();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:461:9\n    │\n461 │         emit AuctionStarted(id, loan.auctionFloor, block.timestamp);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:102:17\n    │\n102 │             if (uint256(donationCheckpoints[mid].start) + VESTING <= block.timestamp) low = mid + 1;\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:468:32\n    │\n468 │         if (!writtenOff[id] && block.timestamp < loan.auctionStarted + RESTART_AFTER) revert NotRestartable();\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:122:13\n    │\n122 │         if (elapsed >= VESTING) return 0;\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:477:9\n    │\n477 │         emit AuctionRestarted(id, loan.auctionFloor, block.timestamp);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:487:13\n    │\n487 │         if (elapsed <= 3 days) {\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:490:13\n    │\n490 │         if (elapsed < 10 days) {\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:510:13\n    │\n510 │             block.timestamp < loan.auctionStarted + WRITE_OFF_DELAY\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:517:9\n    │\n517 │         emit AuctionWrittenOff(id, loan.principal);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PawnShop.sol:528:13\n    │\n528 │         if (block.timestamp == loan.auctionStarted) revert SameBlock();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PawnShop.sol:544:9\n    │\n544 │         emit AuctionBought(id, msg.sender, receiver, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:187:9\n    │\n187 │         emit Deposit(msg.sender, receiver, msg.value, shares);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `shortfallReserve` is updated\n    ╭▸ src/LendingPool.sol:215:9\n    │\n215 │         IWETH(asset()).withdraw(assets);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:364:26\n    │\n364 │         if (amount != 0) emit EmptyPoolReserve(amount);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:218:9\n    │\n218 │         emit Withdraw(msg.sender, receiver, account, assets, shares);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:221:55\n    │\n221 │     function borrow(uint256 amount) external onlyShop nonReentrant {\n    │                                                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:227:9\n    │\n227 │         emit Borrowed(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:231:66\n    │\n231 │     function settle(uint256 principal) external payable onlyShop nonReentrant {\n    │                                                                  ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:244:9\n    │\n244 │         emit AuctionLossMarked(id, loss);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:247:85\n    │\n247 │     function settleAuction(uint256 id, uint256 principal) external payable onlyShop nonReentrant {\n    │                                                                                     ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:271:9\n    │\n271 │         emit Settled(principal, msg.value, covered, gap - covered);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:258:13\n    │\n258 │             emit AllowanceReleaseVesting(id, afterSettle - before, releaseVestingAmount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:274:53\n    │\n274 │     function receiveFee() external payable onlyShop nonReentrant {\n    │                                                     ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:277:9\n    │\n277 │         emit FeeReceived(msg.value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:282:68\n    │\n282 │     function receiveRecovery(uint256 id) external payable onlyShop nonReentrant {\n    │                                                                    ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:288:13\n    │\n288 │             emit ReserveRestored(id, restore);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:305:13\n    │\n305 │             emit ReserveAdded(income);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:291:9\n    │\n291 │         emit RecoveryReceived(msg.value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/LendingPool.sol:311:53\n    │\n311 │     function addReserve() external payable onlyShop nonReentrant {\n    │                                                     ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:314:9\n    │\n314 │         emit ReserveAdded(msg.value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/LendingPool.sol:322:9\n    │\n322 │         emit Donated(msg.sender, msg.value, donationCheckpoints.length - 1);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:326:42\n    │\n326 │         if (value > type(uint128).max || block.timestamp > type(uint64).max) {\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:336:17\n    │\n336 │             if (last.start == block.timestamp && count > vestingStartIndex) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/LendingPool.sol:340:61\n    │\n340 │                 donationCheckpoints.push(DonationCheckpoint(uint64(block.timestamp), amount, weight));\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/LendingPool.sol:343:57\n    │\n343 │             donationCheckpoints.push(DonationCheckpoint(uint64(block.timestamp), amount, weight));\n    │                                                         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:375:34\n    │\n375 │         if (pendingCapAt == 0 || block.timestamp < pendingCapAt) revert TimelockPending();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/LendingPool.sol:376:13\n    │\n376 │         if (block.timestamp > pendingCapAt + EXECUTION_WINDOW) revert WindowExpired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":23010,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/SetupFlows.t.sol:SetupFlowsTest\n[PASS] test_burnSetupRejectsLowCapAndForeignConsumerThenBurnsOnce() (gas: 478093)\n[PASS] test_ownerPinsFloorThenPublicWalletPostsAndClaimsBounty() (gas: 484203)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.79ms (1.69ms CPU time)\n\nRan 6 tests for test/Governance.t.sol:GovernanceTest\n[PASS] test_allChangesWait48HoursAndCancel() (gas: 638807)\n[PASS] test_collectionLimitsDisableAndHashInitialization() (gas: 1666169)\n[PASS] test_explicitOwnershipTwoStepAndNoRenounce() (gas: 174129)\n[PASS] test_hardBoundsAndNonzeroAddresses() (gas: 221987)\n[PASS] test_hashRotationInvalidatesFloorButKeepsAuctionPrice() (gas: 2706114)\n[PASS] test_nonSeatLoanAndInsufficientIdleRollBackCustody() (gas: 7801719)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.67ms (2.60ms CPU time)\n\nRan 5 tests for test/Oracle.t.sol:OracleTest\n[PASS] test_floorCannotShortenStoredExpiry() (gas: 158977)\n[PASS] test_freshUpdatesAndOneBountyPer24Hours() (gas: 464763)\n[PASS] test_rejectsWrongQuestionChainPanelTypeAndTime() (gas: 618752)\n[PASS] test_replayTamperingWrongSignerAndWrongDomain() (gas: 345373)\n[PASS] test_signedRequestCannotBeReusedWithNewTimestamp() (gas: 179748)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.82ms (2.87ms CPU time)\n\nRan 4 tests for test/MilestoneBurn.t.sol:MilestoneBurnTest\n[PASS] test_deploymentRejectsUnrelatedSignerSource() (gas: 12999)\n[PASS] test_rejectsStaleExpiredWrongDomainAndInsufficientPanel() (gas: 354358)\n[PASS] test_rotationFollowsShopTimelockWithoutOwnerOrWithdrawalPower() (gas: 638401)\n[PASS] test_unsetOneTimeSetupAndThreshold() (gas: 650092)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 14.96ms (2.54ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsFreshUintSignatureFromVectorKey() (gas: 325797)\n[PASS] test_acceptsTheProtocolSignature() (gas: 19508)\n[PASS] test_burnConsumerDigestMatchesTheProtocol() (gas: 10237809)\n[PASS] test_digestMatchesTheProtocol() (gas: 13189)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 20.19ms (1.71ms CPU time)\n\nRan 2 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_exactTransfers(uint256) (runs: 256, μ: 89488, ~: 89620)\nLogs:\n  Bound result 622933786399225382808033743\n\n[PASS] test_supplyMetadataAndTransfer() (gas: 171792)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 106.04ms (106.37ms CPU time)\n\nRan 5 tests for test/ReviewScope.t.sol:ReviewScopeTest\n[PASS] test_bountyCopied() (gas: 272450)\n[PASS] test_fixedMaximumPrincipal() (gas: 207742)\n[PASS] test_newWindowHashRejected() (gas: 76082)\n[PASS] test_ownerValuationCanBorrowAllIdle() (gas: 2522739)\n[PASS] test_underwaterExtensions() (gas: 21779908)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 130.71ms (18.40ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_allRuntimeTypesMeetSizeAndForbiddenOpcodeFloor() (gas: 35836985)\n[PASS] test_factoryDeploymentPreservesSupplyAndExplicitOwner() (gas: 342610)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 136.96ms (134.94ms CPU time)\n\nRan 11 tests for test/PawnShop.t.sol:PawnShopTest\n[PASS] testFuzz_principalFeeAndFundConservation(uint256,uint8) (runs: 256, μ: 2607978, ~: 2608114)\nLogs:\n  Bound result 9975000000000000301\n  Bound result 1\n\n[PASS] test_auctionCurveSurplusOverpaymentAndDuplicate() (gas: 3137738)\n[PASS] test_auctionNeedsFreshFloorAndSocializesGap() (gas: 3060318)\n[PASS] test_claimFailureAndReentrancyPreserveLiabilities() (gas: 2729709)\n[PASS] test_discountAndModuleChangeKeepOldCommitment() (gas: 5342695)\n[PASS] test_failedNFTSettlementIsAtomic() (gas: 3226786)\n[PASS] test_limitsIdleLiquidityAndDuplicateNFT() (gas: 4424122)\n[PASS] test_pauseStalenessAndInvalidActions() (gas: 2821968)\n[PASS] test_pawnRepayAndConservation() (gas: 2717835)\n[PASS] test_protocolShareSplitsHalfToReservesUntilBothAtTarget() (gas: 57017033)\n[PASS] test_termSnapshotAndLateExtension() (gas: 5228824)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 155.91ms (183.96ms CPU time)\n\nRan 8 tests for test/LendingPool.t.sol:LendingPoolTest\n[PASS] testFuzz_roundTripNeverCreatesAssets(uint256) (runs: 256, μ: 295486, ~: 295466)\nLogs:\n  Bound result 255\n\n[PASS] test_accessCapAndFailedClaim() (gas: 574095)\n[PASS] test_directDonationInflationCannotStealVictimDeposit() (gas: 484780)\n[PASS] test_donationVestsExactlyAndDoesNotResetOnNewDonation() (gas: 759417)\n[PASS] test_dustDonationsCannotBlockDonationsOrWithdrawals() (gas: 9744056)\n[PASS] test_erc4626DepositMintWithdrawRedeemAndNativeClaim() (gas: 793360)\n[PASS] test_nativeWithdrawRequiresShareAllowance() (gas: 413640)\n[PASS] test_shortfallReserveExcludedAndConsumedBeforeShares() (gas: 974105)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 158.64ms (163.46ms CPU time)\n\nRan 20 tests for test/AuditFixes.t.sol:AuditFixesTest\n[PASS] test_F11_burnAcceptsAtMostOneHourOldAnswers() (gas: 348640)\n[PASS] test_F12_depositCapWindowAndCancel() (gas: 353722)\n[PASS] test_F13_isValidSignatureReturnsFailureWhenTokenBurned() (gas: 2438711)\n[PASS] test_F14_receiverCannotBeVaultOrCollection() (gas: 2833475)\n[PASS] test_F15_queuedRotationDisablesNewLoansFor48Hours() (gas: 2661693)\n[PASS] test_F16_brokenModuleReleaseDoesNotBlockSettlement() (gas: 7431896)\n[PASS] test_F1_proof_staleFloorSameBlockSnipeIsBlocked() (gas: 2925739)\n[PASS] test_F2_restartAfterTerminalPeriod() (gas: 3389529)\n[PASS] test_F2_restartAfterWriteOffRoutesProceedsThroughRecovery() (gas: 3151058)\n[PASS] test_F2_restartRequiresFreshFloorAndAuction() (gas: 2685197)\n[PASS] test_F3_proof_missingCollateralCannotBeBoughtAtZero() (gas: 2827892)\n[PASS] test_F4_lowerAllowanceOnlyWhileCollateralHeld() (gas: 2887599)\n[PASS] test_F4_proof_excessAllowanceVestsOverSevenDays() (gas: 2777371)\n[PASS] test_F5_markOverdueFromDueOnward() (gas: 2834192)\n[PASS] test_F6_pawnSlippageBounds() (gas: 3849921)\n[PASS] test_F7_fullBountyForThirdPartyOnLargeLoan() (gas: 2613773)\n[PASS] test_F7_noBountyForBorrowerAndCappedForSmallLoans() (gas: 5080043)\n[PASS] test_F8_blockWindowChecks() (gas: 222839)\n[PASS] test_F9_recoveryRestoresConsumedReserveFirst() (gas: 3277875)\n[PASS] test_constructorPresets() (gas: 79778)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 159.90ms (17.78ms CPU time)\n\nRan 6 tests for test/CollateralVault.t.sol:CollateralVaultTest\n[PASS] test_auctionStopsCallsButBorrowerRetainsRewardWithdrawals() (gas: 2889187)\n[PASS] test_authorizationCannotNameBorrowerOtherTokenOrNonSeat() (gas: 2548940)\n[PASS] test_callForRewardsWithdrawalsAndBlockedTargets() (gas: 3105839)\n[PASS] test_indirectCollateralRemovalRollsBackAndNFTOnlyLeavesViaShop() (gas: 3615749)\n[PASS] test_onlyRegisteredTypedWorkerDigestValidAndExpires() (gas: 2432634)\n[PASS] test_revokeAndCloseDisableAuthorization() (gas: 2691999)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 160.33ms (5.13ms CPU time)\n\nRan 9 tests for test/AdversarialBoundaries.t.sol:AdversarialBoundariesTest\n[PASS] testFuzz_auctionPriceIsMonotoneAndUnderbidRollsBack(uint256,uint256) (runs: 1000, μ: 3369933, ~: 3370153)\nLogs:\n  Bound result 2\n  Bound result 3314439\n\n[PASS] testFuzz_inexactRepaymentLeavesDebtCollateralAndCommitmentIntact(uint256) (runs: 1000, μ: 2962365, ~: 2962670)\nLogs:\n  Bound result 440\n\n[PASS] testFuzz_malformedSignedAnswersNeverConsumeRequests(uint256) (runs: 1000, μ: 301985, ~: 302173)\nLogs:\n  Bound result 46\n\n[PASS] test_claimZeroRecipientAndSecondClaimCannotSpendOtherCredits() (gas: 2362454)\n[PASS] test_discountThresholdOneWeiAndMaximumFeeDoNotOverflow() (gas: 775878)\n[PASS] test_failedExtensionRollsBackTheNewDiscountTier() (gas: 3469923)\n[PASS] test_floorChangesDoNotRepriceAnAuctionAlreadyStarted() (gas: 2846257)\n[PASS] test_minimumPrincipalAndOneWeiBelowIt() (gas: 2519240)\n[PASS] test_nativeZeroOperationsAndInvalidSettlementAreAtomic() (gas: 2536501)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 176.40ms (465.78ms CPU time)\n\nRan 4 tests for test/LockDiscount.t.sol:LockDiscountTest\n[PASS] testFuzz_discountRoundsUpAndNeverExceedsBase(uint256,uint8) (runs: 256, μ: 145539, ~: 182805)\nLogs:\n  Bound result 1090287250175469640646\n  Bound result 3\n\n[PASS] test_manySameTierLoansDoNotMultiplyCommitment() (gas: 4430904)\n[PASS] test_tiersLargestCommitmentAndRelease() (gas: 717951)\n[PASS] test_unauthorizedAndInsufficientLockedActions() (gas: 122483)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 176.19ms (180.24ms CPU time)\n\nRan 19 tests for test/ReviewRegression.t.sol:ReviewRegressionTest\n[PASS] testFuzz_maxRedeemNeverExceedsIdle(uint256,uint256) (runs: 256, μ: 676667, ~: 678543)\nLogs:\n  Bound result 300\n  Bound result 14\n\n[PASS] test_certainLossBeforeExitAndLaterSettlement() (gas: 3343552)\n[PASS] test_disablingCollectionCancelsQueuedReenable() (gas: 156205)\n[PASS] test_emptyPoolDonationRejectedAndFeeGoesToReserve() (gas: 492081)\n[PASS] test_feeSandwichHasNoImmediateGainAndFeeVests() (gas: 2648221)\n[PASS] test_lastShareExitRetiresVestingAndNewStreamStillWorks() (gas: 713221)\n[PASS] test_longSignedExpiryCannotVetoDailyUpdates() (gas: 240021)\n[PASS] test_lossMarksNetReserveAndReconcileMultipleAuctions() (gas: 5653036)\n[PASS] test_missingCollateralCanBeWrittenOffImmediately() (gas: 2753913)\n[PASS] test_missingNFTRepaysAndClearsCommitment() (gas: 2653608)\n[PASS] test_newQueueSupersedesAndExpires() (gas: 382368)\n[PASS] test_oneWeiEntitlementAfterPartialRedemptionRemainsWithdrawable() (gas: 684489)\n[PASS] test_onlyShopCanMarkOrSettleDebt() (gas: 121401)\n[PASS] test_roundingAllowsAllBackedAssetsToExit() (gas: 598271)\n[PASS] test_seizedNFTZeroPriceBooksGapWithoutPayingIssuer() (gas: 3096667)\n[PASS] test_shortExpiryCannotReplaceValidFloor() (gas: 2562654)\n[PASS] test_stuckAuctionLossSharedAfterWriteOff() (gas: 2938689)\n[PASS] test_transferRestrictionDoesNotBlockFinancialWriteOff() (gas: 3481944)\n[PASS] test_writeOffUnsoldAuctionUnlocksAndLateRecoveryVests() (gas: 3533025)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 176.27ms (123.34ms CPU time)\n\nRan 11 tests for test/FloorRelay.t.sol:FloorRelayTest\n[PASS] testFuzz_malformedOffsetsLengthsAndNarrowFields(uint256,uint8) (runs: 256, μ: 19923, ~: 19394)\n[PASS] testFuzz_neverRevertsForArbitraryPayload(bytes32,bytes) (runs: 256, μ: 9795, ~: 9759)\n[PASS] test_anotherSignerAndStructMismatchFailBothConsumers() (gas: 102898)\n[PASS] test_everyTruncationAndBadSignatureReturnsFailure() (gas: 74358153)\n[PASS] test_fullFloorSubmissionAndOlderIssuedAtRejection() (gas: 11218348)\n[PASS] test_governedSwitchAndAutomaticBurnSync() (gas: 11764560)\n[PASS] test_hashMustBelongToCallerAndChainOne() (gas: 56476)\n[PASS] test_realFloorStillNeeds26HourLifetime() (gas: 228424)\n[PASS] test_realSignatureCompletesBurnWithExplicitTestQuestion() (gas: 293594)\n[PASS] test_realZeroConsumerSignatureAcceptedByBothConsumerVerifiers() (gas: 78485)\n[PASS] test_sitePackingMatchesSolidityAndVerifies() (gas: 53653)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 176.24ms (335.36ms CPU time)\n\nRan 1 test for test/PawnInvariant.t.sol:PawnInvariantTest\n[PASS]\nPawnInvariantTest invariants:\n[PASS] invariant_ETHCreditsAreFullyBacked\n[PASS] invariant_debtAndCollateralFollowLoanState\n[PASS] invariant_poolBookMatchesCashAndDebt\n PawnInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+-------------------+-------+---------+----------╮\n| Contract    | Selector          | Calls | Reverts | Discards |\n+==============================================================+\n| PawnHandler | advanceAndPublish | 941   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | claim             | 1047  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | deposit           | 1024  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | donate            | 1048  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | lockOrUnlock      | 1031  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | pawn              | 1054  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | repayOrAuction    | 1023  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | withdraw          | 1024  | 0       | 0        |\n╰-------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000000000\n  Bound result 10992\n  Bound result 100000000000000000\n  Bound result 18183\n  Bound result 1468800\n  Bound result 9408\n  Bound result 2760\n  Bound result 3\n  Bound result 7776\n  Bound result 1213518064\n  Bound result 4571\n  Bound result 12000000000000000\n  Bound result 230321547279\n  Bound result 81517981732\n  Bound result 10501\n  Bound result 100000000000000000000000\n  Bound result 3888000\n  Bound result 150022425303\n  Bound result 767999\n  Bound result 4975000000000010452\n  Bound result 5\n  Bound result 106817357\n  Bound result 5633\n  Bound result 2217945083\n  Bound result 1\n  Bound result 12516\n  Bound result 4975000000000007842\n  Bound result 4155775590753740935253032\n  Bound result 5000000000000000000000000\n  Bound result 2560000\n  Bound result 4975000000000005017\n  Bound result 1009017\n  Bound result 4975000000000007641\n  Bound result 76227\n  Bound result 18789\n  Bound result 2\n  Bound result 1500000000000000000\n  Bound result 1371432523843334772\n  Bound result 1963\n  Bound result 7200\n  Bound result 4975000000000001272\n  Bound result 86400\n  Bound result 100000000000000000\n  Bound result 1920000\n  Bound result 4975000000000000354\n  Bound result 1344000\n  Bound result 4975000000000000283\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.10s (4.09s CPU time)\n\nRan 1 test for test/VaultCustodyInvariant.t.sol:VaultCustodyInvariantTest\n[PASS]\nVaultCustodyInvariantTest invariants:\n[PASS] invariant_custodyAndWorkerAuthorizationFollowTerminalState\n[PASS] invariant_vaultRewardsAndCreditsRemainBorrowerProperty\n VaultCustodyInvariantTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| VaultCustodyHandler | advance     | 2522  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | authorize   | 2618  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | claim       | 2598  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | close       | 2610  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | fund        | 2490  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | rejectTheft | 2588  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | revoke      | 2498  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | withdraw    | 2556  | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6\n  Bound result 3419\n  Bound result 1335\n  Bound result 14280\n  Bound result 31\n  Bound result 11845\n  Bound result 2474481\n  Bound result 9382\n  Bound result 0\n  Bound result 0\n  Bound result 18419\n  Bound result 800\n  Bound result 0\n  Bound result 1887877\n  Bound result 214504929565402540\n  Bound result 2074703\n  Bound result 6150\n  Bound result 9343\n  Bound result 0\n  Bound result 17205\n  Bound result 19000000000000000000000000\n  Bound result 12500000000000000000\n  Bound result 3000\n  Bound result 0\n  Bound result 17623\n  Bound result 0\n  Bound result 17586\n  Bound result 16\n  Bound result 102000000000000000\n  Bound result 64\n  Bound result 13388\n  Bound result 0\n  Bound result 0\n  Bound result 2531320580\n  Bound result 3\n  Bound result 992000\n  Bound result 3022\n  Bound result 2921\n  Bound result 12185\n  Bound result 200\n  Bound result 0\n  Bound result 5905\n  Bound result 13\n  Bound result 19000012500000000000003817\n  Bound result 316504929565413546\n  Bound result 2531320580\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.16s (8.16s CPU time)\n\nRan 4 tests for test/PoolAccountingInvariant.t.sol:PoolAccountingInvariantTest\n[PASS]\nPoolAccountingInvariantTest invariants:\n[PASS] invariant_allShareBalancesAndPullCreditsAreAccountedFor\n[PASS] invariant_cashDebtReservesAndVestingMatchIndependentLedger\n PoolAccountingInvariantTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-----------------------+-------+---------+----------╮\n| Contract              | Selector              | Calls | Reverts | Discards |\n+============================================================================+\n| PoolAccountingHandler | advance               | 1857  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | borrow                | 1891  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | claim                 | 1864  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | deposit               | 1831  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | donate                | 1838  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | feeOrReserve          | 1959  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | redeem                | 1844  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | settle                | 1852  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | transferShares        | 1833  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | unauthorizedShopCalls | 1820  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | withdraw              | 1891  | 0       | 0        |\n╰-----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 10449\n  Bound result 160467\n  Bound result 9454792\n  Bound result 1001\n  Bound result 1699\n  Bound result 200000000000000000\n  Bound result 97200\n  Bound result 17393\n  Bound result 63523773954249005\n  Bound result 686586\n  Bound result 484698870389963842353126\n  Bound result 1522\n  Bound result 393\n  Bound result 282\n  Bound result 539373334752580848\n  Bound result 4000\n  Bound result 154428405244755968\n  Bound result 5741\n  Bound result 184007913129639904\n  Bound result 4\n  Bound result 350000000000000000\n  Bound result 2592000000\n  Bound result 461765386587337883515039\n  Bound result 140\n  Bound result 13944\n  Bound result 1791551679\n  Bound result 13661\n  Bound result 2000000000000000000\n  Bound result 300000000000000000\n  Bound result 4015\n  Bound result 6766\n  Bound result 100\n  Bound result 22047185556308804310800\n  Bound result 1000000000000000000\n  Bound result 550561\n  Bound result 15\n  Bound result 0\n  Bound result 484135198911238896\n  Bound result 2665145552\n  Bound result 302400\n  Bound result 850000000000000000\n  Bound result 4230\n  Bound result 1394342591594792513320228\n  Bound result 10732\n  Bound result 246173710183163662\n  Bound result 900000000000000\n  Bound result 8892\n  Bound result 4771\n  Bound result 259200\n  Bound result 75000000000000000\n  Bound result 4017000000000000000\n  Bound result 11\n  Bound result 8599\n  Bound result 1\n  Bound result 3404\n  Bound result 1076434164\n  Bound result 296358090\n  Bound result 7862400\n  Bound result 7633\n  Bound result 768303435752470188\n  Bound result 311114905611997628\n  Bound result 999999999999999999999999\n  Bound result 7620\n  Bound result 3490\n  Bound result 6345\n  Bound result 379962834986040525\n  Bound result 7156271133901351\n  Bound result 41225\n  Bound result 549999999999999997\n  Bound result 182040082693894683364474\n  Bound result 8138\n  Bound result 9938\n  Bound result 550000000000000000\n  Bound result 4017000000000000000\n  Bound result 952\n  Bound result 100000000000000000\n  Bound result 40000000000000000\n  Bound result 12000000000000000\n  Bound result 262361367961224595\n  Bound result 262361367961224595\n  Bound result 691200\n  Bound result 3904665496025687797774999\n  Bound result 213524624060299419946186\n  Bound result 294025192310371913726679\n\n[PASS] test_feesAndDonationsVestAsIndependentTranches() (gas: 3000902)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 200000000000000000\n  Bound result 302400\n  Bound result 700000000000000000\n  Bound result 302400\n  Bound result 691200\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_lastShareExitRetiresIncomeAndSameTimestampReentryStartsNewVesting() (gas: 3557807)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 200000000000000000\n  Bound result 500000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 3000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 691200\n  Bound result 1000000000000000000000000\n\n[PASS] test_partialLossAndFinalSettlementReconcileLedger() (gas: 1966432)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 3000000000000000000\n  Bound result 1000000000000000000\n  Bound result 900000000000000000\n  Bound result 2000000000000000000\n  Bound result 2000000000000000000\n  Bound result 691200\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 10.65s (10.65s CPU time)\n\nRan 1 test for test/TokenCustodyInvariant.t.sol:TokenCustodyInvariantTest\n[PASS]\nTokenCustodyInvariantTest invariants:\n[PASS] invariant_fixedSupplyAndAllCustodyMatchTheLedger\n[PASS] invariant_largestCommitmentAndEveryTierCountMatchOpenLoans\n TokenCustodyInvariantTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭---------------------+--------------------+-------+---------+----------╮\n| Contract            | Selector           | Calls | Reverts | Discards |\n+=======================================================================+\n| TokenCustodyHandler | advance            | 2095  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | commit             | 2012  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | donate             | 2091  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | lock               | 1969  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | rejectOverUnlock   | 2070  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | rejectUnauthorized | 2120  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | release            | 2032  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | transfer           | 2069  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | tryBurn            | 2042  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | unlock             | 1980  | 0       | 0        |\n╰---------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000000000\n  Bound result 300\n  Bound result 20000000000000000000000000\n  Bound result 300\n  Bound result 30007979370\n  Bound result 20139\n  Bound result 3456000\n  Bound result 64\n  Bound result 11155111\n  Bound result 999999999999999999999999999998\n  Bound result 777600\n  Bound result 500000000000000000\n  Bound result 9830\n  Bound result 8316\n  Bound result 2055\n  Bound result 1468800\n  Bound result 2064\n  Bound result 1360131692\n  Bound result 4017000000000000000\n  Bound result 42701128153\n  Bound result 4594637\n  Bound result 36937672955881729639579896\n  Bound result 4788\n  Bound result 8612\n  Bound result 1711110\n  Bound result 7802\n  Bound result 12653\n  Bound result 56937664921881701544144477\n  Bound result 185788669167184192827308093\n  Bound result 691616310345456776616474300081\n  Bound result 2416\n  Bound result 566575\n  Bound result 8635\n  Bound result 2197\n  Bound result 550\n  Bound result 50\n  Bound result 700000000000000000\n  Bound result 1932249\n  Bound result 9408\n  Bound result 10584\n  Bound result 5\n  Bound result 172800\n  Bound result 506916617559713792836246026927\n  Bound result 8032\n  Bound result 1000000000000000001\n  Bound result 9916\n  Bound result 449\n  Bound result 7\n  Bound result 1127722\n  Bound result 56937664921881701544144476\n  Bound result 1083727\n  Bound result 886057569\n  Bound result 252418\n  Bound result 2827\n  Bound result 8633\n  Bound result 5000000000000000000032307\n  Bound result 76937664921881701555276350\n  Bound result 14248\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 22.87s (22.87s CPU time)\n\nRan 20 test suites in 22.87s (47.54s CPU time): 125 tests passed, 0 failed, 0 skipped (125 total tests)\n","passed":true},{"durationMs":147,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CollateralVault.authorizeWorker((bytes32,address,uint256,bytes32,uint64,string))\",\"CollateralVault.callFor(address,bytes)\",\"CollateralVault.claim(address)\",\"CollateralVault.initialize(address,address,uint256,uint256,address,bool)\",\"CollateralVault.receive()\",\"CollateralVault.release(address)\",\"CollateralVault.revokeWorker()\",\"CollateralVault.withdrawETH(uint256)\",\"CollateralVault.withdrawToken(address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"LendingPool.acceptOwnership()\",\"LendingPool.addReserve()\",\"LendingPool.approve(address,uint256)\",\"LendingPool.borrow(uint256)\",\"LendingPool.cancelDepositCap()\",\"LendingPool.claim(address)\",\"LendingPool.deposit(uint256,address)\",\"LendingPool.depositETH(address)\",\"LendingPool.donate()\",\"LendingPool.executeDepositCap()\",\"LendingPool.markAuctionLoss(uint256,uint256,uint256,bool)\",\"LendingPool.mint(uint256,address)\",\"LendingPool.queueDepositCap(uint256)\",\"LendingPool.receive()\",\"LendingPool.receiveFee()\",\"LendingPool.receiveRecovery(uint256)\",\"LendingPool.redeem(uint256,address,address)\",\"LendingPool.redeemETH(uint256,address,address)\",\"LendingPool.settle(uint256)\",\"LendingPool.settleAuction(uint256,uint256)\",\"LendingPool.transfer(address,uint256)\",\"LendingPool.transferFrom(address,address,uint256)\",\"LendingPool.transferOwnership(address)\",\"LendingPool.withdraw(uint256,address,address)\",\"LendingPool.withdrawETH(uint256,address,address)\",\"LockDiscount.commit(uint256,address,uint256)\",\"LockDiscount.lock(uint256)\",\"LockDiscount.release(uint256)\",\"LockDiscount.unlock(uint256)\",\"MilestoneBurn.burn((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MilestoneBurn.setQuestionHashOnce(bytes32)\",\"MilestoneBurn.syncSigner()\",\"PawnShop.acceptOwnership()\",\"PawnShop.buyAuction(uint256,address)\",\"PawnShop.cancelChange(bytes32)\",\"PawnShop.claim(address)\",\"PawnShop.disableCollection(address)\",\"PawnShop.executeAttester(address)\",\"PawnShop.executeCollection(address,(uint16,uint16,uint16,bool,bool,bytes32))\",\"PawnShop.executeDiscountModule(address)\",\"PawnShop.executeFeeRecipient(address)\",\"PawnShop.executeTerm(uint8,uint32,uint16)\",\"PawnShop.extend(uint256,uint8)\",\"PawnShop.fundBounties()\",\"PawnShop.markAuctionLoss(uint256)\",\"PawnShop.markOverdue(uint256)\",\"PawnShop.pawn(address,uint256,uint8,uint256,uint256)\",\"PawnShop.queueAttester(address)\",\"PawnShop.queueCollection(address,(uint16,uint16,uint16,bool,bool,bytes32))\",\"PawnShop.queueDiscountModule(address)\",\"PawnShop.queueFeeRecipient(address)\",\"PawnShop.queueTerm(uint8,uint32,uint16)\",\"PawnShop.receive()\",\"PawnShop.repay(uint256)\",\"PawnShop.restartAuction(uint256)\",\"PawnShop.setNewLoansPaused(bool)\",\"PawnShop.setQuestionHashOnce(address,bytes32)\",\"PawnShop.startAuction(uint256)\",\"PawnShop.submitFloor(address,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"PawnShop.transferOwnership(address)\",\"PawnShop.writeOffAuction(uint256)\",\"VaultFactory.create()\"],\"files\":{\".gitignore\":4,\"DESIGN.md\":71,\"README.md\":217,\"dist/abi/CollateralVault.json\":739,\"dist/abi/LaunchToken.json\":315,\"dist/abi/LendingPool.json\":1716,\"dist/abi/LockDiscount.json\":367,\"dist/abi/MilestoneBurn.json\":609,\"dist/abi/PawnShop.json\":2083,\"dist/assets/VT323-Regular-DICElq-Y.ttf\":1068,\"dist/assets/ccip-DAHrphgT.js\":1,\"dist/assets/index-BE5mvMs3.css\":1,\"dist/assets/index-Dwd2G1uw.js\":93,\"dist/fonts/OFL.txt\":93,\"dist/fonts/VT323-Regular.ttf\":1068,\"dist/imd-deployment.json\":147,\"dist/index.html\":3,\"dist/pawn.svg\":13,\"docs/AUDIT-FIXES.md\":74,\"docs/DESIGN.md\":3,\"docs/SETUP-AND-KEEPER.md\":133,\"docs/abi/CollateralVault.json\":745,\"docs/abi/FloorRelay.json\":26,\"docs/abi/LaunchToken.json\":315,\"docs/abi/LendingPool.json\":1867,\"docs/abi/LockDiscount.json\":367,\"docs/abi/MilestoneBurn.json\":622,\"docs/abi/PawnShop.json\":2347,\"docs/abi/README.md\":15,\"docs/abi/VaultFactory.json\":38,\"docs/floor-relay-validation.md\":63,\"docs/frontend/browser-results.json\":239,\"docs/frontend/browser-targeted-results.json\":19,\"docs/frontend/build.txt\":21,\"docs/frontend/delivery-check.json\":18,\"docs/frontend/desktop.png\":839,\"docs/frontend/export-check.txt\":5,\"docs/frontend/floor-relay/export-check.txt\":4,\"docs/frontend/floor-relay/forge-build.txt\":545,\"docs/frontend/floor-relay/forge-fmt.txt\":0,\"docs/frontend/floor-relay/forge-test.txt\":276,\"docs/frontend/floor-relay/keeper-tests.txt\":17,\"docs/frontend/floor-relay/owner-browser-results.json\":45,\"docs/frontend/floor-relay/owner-browser.txt\":7,\"docs/frontend/floor-relay/publication.json\":28,\"docs/frontend/floor-relay/publication.txt\":2,\"docs/frontend/floor-relay/setup-browser-results.json\":11,\"docs/frontend/floor-relay/setup-browser.txt\":11,\"docs/frontend/floor-relay/typecheck.txt\":9,\"docs/frontend/floor-relay/web-tests.txt\":34,\"docs/frontend/keeper-dry-run.txt\":4,\"docs/frontend/keeper-tests.txt\":76,\"docs/frontend/keyboard-focus.png\":890,\"docs/frontend/live-browser.json\":99,\"docs/frontend/live-desktop.png\":804,\"docs/frontend/live-read.json\":83,\"docs/frontend/mobile.png\":728,\"docs/frontend/night-desktop.png\":836,\"docs/frontend/night-mobile.png\":703,\"docs/frontend/owner-controls/build.txt\":27,\"docs/frontend/owner-controls/delivery-check.json\":13,\"docs/frontend/owner-controls/design-guidance-LICENSE.txt\":220,\"docs/frontend/owner-controls/export-check.txt\":5,\"docs/frontend/owner-controls/keyboard-focus.png\":1089,\"docs/frontend/owner-controls/live-browser.json\":106,\"docs/frontend/owner-controls/live-read.json\":83,\"docs/frontend/owner-controls/owner-browser-results.json\":45,\"docs/frontend/owner-controls/owner-browser.txt\":7,\"docs/frontend/owner-controls/owner-state-desktop.png\":905,\"docs/frontend/owner-controls/owner-state-mobile.png\":643,\"docs/frontend/owner-controls/publication.json\":38,\"docs/frontend/owner-controls/regression-browser-results.json\":244,\"docs/frontend/owner-controls/setup-browser-results.json\":11,\"docs/frontend/owner-controls/typecheck.txt\":4,\"docs/frontend/owner-controls/unit-tests.txt\":24,\"docs/frontend/owner-controls/validation.md\":68,\"docs/frontend/publish.json\":8,\"docs/frontend/setup-browser-results.json\":11,\"docs/frontend/setup-mobile.png\":777,\"docs/frontend/transaction-review.png\":650,\"docs/frontend/typecheck.txt\":4,\"docs/frontend/unit-tests.txt\":22,\"docs/frontend/update-build.txt\":27,\"docs/frontend/update-foundry-tests.txt\":262,\"docs/frontend/update-unit-tests.txt\":86,\"docs/frontend/update-validation.md\":28,\"docs/frontend/validation.md\":90,\"docs/review-notes.md\":34,\"docs/validation.md\":34,\"foundry.toml\":21,\"keeper/LICENSE\":21,\"keeper/README.md\":97,\"keeper/THIRD_PARTY_LICENSES.md\":254,\"keeper/config.json\":13,\"keeper/core.mjs\":65,\"keeper/cron.example\":3,\"keeper/hourly-workflow.yml\":35,\"keeper/run.mjs\":280,\"keeper/runtime-entry.ts\":16,\"keeper/runtime.mjs\":58,\"keeper/tests/core.test.mjs\":139,\"keeper/tests/oracle.test.mjs\":181,\"launch.json\":36,\"src/CollateralVault.sol\":195,\"src/FloorRelay.sol\":62,\"src/LaunchToken.sol\":11,\"src/LendingPool.sol\":393,\"src/LockDiscount.sol\":105,\"src/MilestoneBurn.sol\":77,\"src/OracleAttestation.sol\":221,\"src/PawnShop.sol\":583,\"src/PullPayments.sol\":35,\"src/VaultFactory.sol\":21,\"src/interfaces/IPawn.sol\":21,\"test/AdversarialBoundaries.t.sol\":244,\"test/AuditFixes.t.sol\":453,\"test/CONTRIBUTOR_TESTS.md\":20,\"test/CollateralVault.t.sol\":150,\"test/Deployment.t.sol\":65,\"test/FloorRelay.t.sol\":251,\"test/Governance.t.sol\":191,\"test/LaunchToken.t.sol\":35,\"test/LendingPool.t.sol\":162,\"test/LockDiscount.t.sol\":93,\"test/MilestoneBurn.t.sol\":112,\"test/Oracle.t.sol\":116,\"test/OracleConsumerConformance.t.sol\":106,\"test/PawnInvariant.t.sol\":230,\"test/PawnShop.t.sol\":265,\"test/PoolAccountingInvariant.t.sol\":363,\"test/ReviewRegression.t.sol\":359,\"test/ReviewScope.t.sol\":66,\"test/SetupFlows.t.sol\":62,\"test/TokenCustodyInvariant.t.sol\":278,\"test/VaultCustodyInvariant.t.sol\":270,\"test/fixtures/README.md\":31,\"test/fixtures/floor-zero-consumer.json\":94,\"test/fixtures/large-uint-zero-consumer.json\":94,\"test/fixtures/site-packed-floor.json\":3,\"test/helpers/LiveRelayVectors.sol\":50,\"test/helpers/Mocks.sol\":104,\"test/helpers/PawnTestBase.sol\":104,\"test/helpers/QuestionRotation.sol\":23,\"tools/export-relay.mjs\":13,\"tools/export_abis.py\":16,\"web/.gitignore\":8,\"web/README.md\":75,\"web/deployment.json\":78,\"web/index.html\":1,\"web/network.json\":57,\"web/package-lock.json\":2266,\"web/package.json\":33,\"web/public/abi/CollateralVault.json\":745,\"web/public/abi/LaunchToken.json\":315,\"web/public/abi/LendingPool.json\":1867,\"web/public/abi/LockDiscount.json\":367,\"web/public/abi/MilestoneBurn.json\":622,\"web/public/abi/PawnShop.json\":2347,\"web/public/fonts/OFL.txt\":93,\"web/public/fonts/VT323-Regular.ttf\":1068,\"web/public/imd-deployment.json\":127,\"web/public/pawn.svg\":13,\"web/scripts/check-live.mjs\":123,\"web/scripts/common.mjs\":51,\"web/scripts/manifest.mjs\":11,\"web/scripts/prepare.mjs\":49,\"web/scripts/validate-export.mjs\":32,\"web/src/App.tsx\":363,\"web/src/components.tsx\":330,\"web/src/config.ts\":197,\"web/src/engine.tsx\":526,\"web/src/finance.tsx\":611,\"web/src/floor-relay.json\":7,\"web/src/forms.tsx\":85,\"web/src/governance-state.tsx\":125,\"web/src/loans.tsx\":571,\"web/src/logic.ts\":195,\"web/src/main.tsx\":10,\"web/src/mascot.tsx\":37,\"web/src/operations.tsx\":454,\"web/src/oracle-flow.tsx\":248,\"web/src/oracle.ts\":214,\"web/src/relay-setup.tsx\":77,\"web/src/setup.tsx\":264,\"web/src/style.css\":1161,\"web/src/trade.tsx\":408,\"web/src/trading-fees.ts\":97,\"web/tests/browser.ts\":621,\"web/tests/logic.test.ts\":147,\"web/tests/mock-rpc.ts\":354,\"web/tests/oracle.test.ts\":62,\"web/tests/owner-browser.ts\":421,\"web/tests/render-live.mjs\":140,\"web/tests/setup-browser.ts\":325,\"web/tests/trading-fees.test.ts\":77,\"web/tsconfig.json\":1,\"web/vite.config.ts\":8},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":12712,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-eth at src/LendingPool.sol:247: Reentrancy in LendingPool.settleAuction(uint256,uint256) (src/LendingPool.sol#247-260):\n[high/medium] reentrancy-eth at src/LendingPool.sol:262: Reentrancy in LendingPool._settle(uint256) (src/LendingPool.sol#262-272):\n[medium/high] incorrect-equality at src/PawnShop.sol:201: PawnShop._execute(bytes32) (src/PawnShop.sol#201-206) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:299: LendingPool._receiveIncome(uint256) (src/LendingPool.sol#299-309) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:317: LendingPool.donate() (src/LendingPool.sol#317-323) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:157: LendingPool.deposit(uint256,address) (src/LendingPool.sol#157-160) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:210: LendingPool._withdrawNative(uint256,uint256,address,address) (src/LendingPool.sol#210-219) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:325: LendingPool._vest(uint256) (src/LendingPool.sol#325-345) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:374: LendingPool.executeDepositCap() (src/LendingPool.sol#374-381) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:95: LendingPool.unvestedDonations() (src/LendingPool.sol#95-115) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MilestoneBurn.sol:50: MilestoneBurn.burn(OracleAttestation.Attestation,bytes) (src/MilestoneBurn.sol#50-70) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PullPayments.sol:17: PullPayments._credit(address,uint256) (src/PullPayments.sol#17-22) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PawnShop.sol:521: PawnShop.buyAuction(uint256,address) (src/PawnShop.sol#521-545) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:95: LendingPool.unvestedDonations() (src/LendingPool.sol#95-115) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:180: LendingPool.depositETH(address) (src/LendingPool.sol#180-188) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/LendingPool.sol:118: LendingPool.unvestedRelease() (src/LendingPool.sol#118-124) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PawnShop.sol:181: PawnShop.loanActive(uint256) (src/PawnShop.sol#181-183) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PawnShop.sol:351: Reentrancy in PawnShop.pawn(address,uint256,uint8,uint256,uint256) (src/PawnShop.sol#351-394):\n[medium/medium] unused-return at src/FloorRelay.sol:20: FloorRelay.isValidSignature(bytes32,bytes) (src/FloorRelay.sol#20-61) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,sig) (src/FloorRelay.sol#58-59)\n[low/medium] missing-zero-check at src/PawnShop.sol:299: PawnShop.executeDiscountModule(address).module (src/PawnShop.sol#299) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PawnShop.sol:158: PawnShop.constructor(address,address,address,address).owner_ (src/PawnShop.sol#158) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PawnShop.sol:288: PawnShop.executeFeeRecipient(address).recipient (src/PawnShop.sol#288) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/PawnShop.sol:549: Reentrancy in PawnShop._distributeFee(uint256) (src/PawnShop.sol#549-566):\n[low/medium] reentrancy-benign at src/PawnShop.sol:351: Reentrancy in PawnShop.pawn(address,uint256,uint8,uint256,uint256) (src/PawnShop.sol#351-394):\n[low/medium] reentrancy-benign at src/LendingPool.sol:262: Reentrancy in LendingPool._settle(uint256) (src/LendingPool.sol#262-272):\n[low/medium] reentrancy-benign at src/PawnShop.sol:521: Reentrancy in PawnShop.buyAuction(uint256,address) (src/PawnShop.sol#521-545):\n[low/medium] reentrancy-benign at src/LendingPool.sol:299: Reentrancy in LendingPool._receiveIncome(uint256) (src/LendingPool.sol#299-309):\n[low/medium] reentrancy-benign at src/LendingPool.sol:210: Reentrancy in LendingPool._withdrawNative(uint256,uint256,address,address) (src/LendingPool.sol#210-219):\n[low/medium] reentrancy-benign at src/PawnShop.sol:351: Reentrancy in PawnShop.pawn(address,uint256,uint8,uint256,uint256) (src/PawnShop.sol#351-394):\n[low/medium] reentrancy-benign at src/PawnShop.sol:549: Reentrancy in PawnShop._distributeFee(uint256) (src/PawnShop.sol#549-566):\n[low/medium] reentrancy-benign at src/PawnShop.sol:449: Reentrancy in PawnShop.startAuction(uint256) (src/PawnShop.sol#449-462):\n[low/medium] timestamp at src/LendingPool.sol:149: LendingPool.maxRedeem(address) (src/LendingPool.sol#149-155) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:568: PawnShop._payBounty(address,uint256) (src/PawnShop.sol#568-573) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:180: LendingPool.depositETH(address) (src/LendingPool.sol#180-188) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:201: PawnShop._execute(bytes32) (src/PawnShop.sol#201-206) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:247: LendingPool.settleAuction(uint256,uint256) (src/LendingPool.sol#247-260) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:95: LendingPool.unvestedDonations() (src/LendingPool.sol#95-115) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:351: PawnShop.pawn(address,uint256,uint8,uint256,uint256) (src/PawnShop.sol#351-394) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:157: LendingPool.deposit(uint256,address) (src/LendingPool.sol#157-160) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:190: LendingPool.withdrawETH(uint256,address,address) (src/LendingPool.sol#190-198) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:317: LendingPool.donate() (src/LendingPool.sol#317-323) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:313: PawnShop.submitFloor(address,OracleAttestation.Attestation,bytes) (src/PawnShop.sol#313-341) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:449: PawnShop.startAuction(uint256) (src/PawnShop.sol#449-462) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:190: PawnShop._queue(bytes32,bytes32) (src/PawnShop.sol#190-199) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:506: PawnShop.writeOffAuction(uint256) (src/PawnShop.sol#506-518) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:181: PawnShop.loanActive(uint256) (src/PawnShop.sol#181-183) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:521: PawnShop.buyAuction(uint256,address) (src/PawnShop.sol#521-545) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:210: LendingPool._withdrawNative(uint256,uint256,address,address) (src/LendingPool.sol#210-219) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:299: LendingPool._receiveIncome(uint256) (src/LendingPool.sol#299-309) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:118: LendingPool.unvestedRelease() (src/LendingPool.sol#118-124) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:480: PawnShop.auctionPrice(uint256) (src/PawnShop.sol#480-494) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:221: LendingPool.borrow(uint256) (src/LendingPool.sol#221-228) uses timestamp for comparisons\n[low/medium] timestamp at src/CollateralVault.sol:103: CollateralVault.authorizeWorker(CollateralVault.WorkerAuthorization) (src/CollateralVault.sol#103-113) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:383: LendingPool.cancelDepositCap() (src/LendingPool.sol#383-388) uses timestamp for comparisons\n[low/medium] timestamp at src/CollateralVault.sol:122: CollateralVault.isValidSignature(bytes32,bytes) (src/CollateralVault.sol#122-128) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:325: LendingPool._vest(uint256) (src/LendingPool.sol#325-345) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:356: LendingPool._reserveEmptyPool() (src/LendingPool.sol#356-365) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:343: PawnShop.floorFresh(address) (src/PawnShop.sol#343-347) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:136: LendingPool.maxDeposit(address) (src/LendingPool.sol#136-139) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:465: PawnShop.restartAuction(uint256) (src/PawnShop.sol#465-478) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:374: LendingPool.executeDepositCap() (src/LendingPool.sol#374-381) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:157: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#157-165) uses timestamp for comparisons\n[low/medium] timestamp at src/LendingPool.sol:200: LendingPool.redeemETH(uint256,address,address) (src/LendingPool.sol#200-208) uses timestamp for comparisons\n[low/medium] timestamp at src/MilestoneBurn.sol:50: MilestoneBurn.burn(OracleAttestation.Attestation,bytes) (src/MilestoneBurn.sol#50-70) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:441: PawnShop.markOverdue(uint256) (src/PawnShop.sol#441-447) uses timestamp for comparisons\n[low/medium] timestamp at src/PawnShop.sol:549: PawnShop._distributeFee(uint256) (src/PawnShop.sol#549-566) uses timestamp for comparisons","passed":true},{"durationMs":619,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/MilestoneBurn.sol:36: Reentrancy: State change after external call (6 places)\n[low] centralization-risk at src/LendingPool.sol:14: Centralization Risk (15 places)\n[low] large-numeric-literal at src/LaunchToken.sol:9: Large Numeric Literal (18 places)\n[low] literal-instead-of-constant at src/FloorRelay.sol:22: Literal Instead of Constant (45 places)\n[low] local-variable-shadowing at src/CollateralVault.sol:45: Local Variable Shadows State Variable\n[low] missing-inheritance at src/FloorRelay.sol:10: Missing Inheritance\n[low] non-reentrant-not-first at src/CollateralVault.sol:133: `nonReentrant` is Not the First Modifier (9 places)\n[low] state-no-address-check at src/PawnShop.sol:164: Address State Variable Set Without Checks (3 places)\n[low] unchecked-return at src/LendingPool.sol:232: Unchecked Return","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"79045348a65f7ef48612740a335887d76d0fcbad7625106fcfd90d639ba0de7f","verifiedTreeHash":"a6dc7dd2c3d4fcf8ced1e572e04584c2051523e2","verifierVersion":"0.1.0+8af37dff"}]}