{"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":"677e1498-4b02-485d-8a81-1131b138112d","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"300403165099c739de73af2d4b71d84f53e0517acf523f79137e6559fd5c79b7","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"accepted"}],"objective":"Update the Pawn site: add an owner Setup page, add a keeper, and restyle the site to match the project's X account. Keep all existing functions.\n\nTHEME: pixel-art pawn shop at night. Deep green background (#173b32 to #0d2619), gold accents (#e0b14c, #f6d27a), cream text (#f2e8d0). Mascot: an original pixel frog pawnbroker in a green eyeshade with a gold jeweler's loupe over one eye, wearing a green jacket with a gold bow tie, and the pawnbroker's three gold balls above him. Draw him as inline SVG pixel art and use him in the header and as the favicon. Pixel-style display font for headings, clean body text. Buttons gold on green. Mobile-first.\n\nSETUP PAGE (visible to the owner wallet; each step shows done or pending from chain state)\n- Top: every deployed contract by name, address and Etherscan link.\n- Floor, one button flow: \"Request floor\" submits the oracle request from the browser through api.imd.fun with the x402 flow (Permit2 signature, 0.5 IMD from the connected wallet), using this exact question, public sources, within 5%, uint256, consumer = PawnShop on chain 1: \"What is the current floor price, in wei, of the identity.md NFT collection at 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D on Ethereum mainnet, defined as the lowest active listing on OpenSea or Blur at the time of answering? Answer as a uint256 in wei.\" The page polls until answered, verifies consumer and attester, then: if PawnShop has no questionHash for identity.md, prompts one transaction to set it from the attestation; then prompts one transaction to post the floor. Also accept a pasted request id instead of paying here, with the same checks, so a request bought elsewhere works.\n- Burn: one button sends 10,000,000 PAWN from the connected wallet to MilestoneBurn, showing the vault's balance. \"Request market cap\" runs the same request flow with consumer = MilestoneBurn and this question, public sources, within 5%, uint256: \"What is the fully diluted market cap of the PAWN token (0x4f2bacee5f2e7ce3f48dfbd635d96e9a8fcbe478, Ethereum mainnet), computed as total supply times the spot price from its Uniswap v4 ETH pool, converted to USD at the current ETH price? Answer as a uint256 in USD with 18 decimals.\" If MilestoneBurn has no questionHash, prompt one transaction to set it from the attestation. Show the latest attested market cap against the $1M target, and a Burn button that enables when an attestation qualifies. Pasted request ids accepted here too.\n- Open: Unpause button; deposit-cap field with Raise; Deposit ETH field for seeding the pool.\n- Claims: trading fees, bounty credits and protocol fees, one button each with the pending amount shown.\n- A \"Refresh floor\" button on the public Borrow page runs the same request-and-post flow for any wallet, since borrowers pay for their own refresh.\n\nKEEPER (keeper/ in the repo: Node, viem, MIT, hourly GitHub Actions workflow and cron example; config for RPC, addresses, oracle request ids; private key from env only). Hourly: fetch the latest attestations, post a floor when newer than stored, startAuction on overdue loans, call MilestoneBurn.burn() when an attestation qualifies. Skip actions whose bounty won't cover gas unless ALWAYS_RUN=true. Optional webhook or Telegram alerts: stale floor, oracle failed, auction started or stuck 3 days, queued owner change, low reserves, burn fired. README: run it in five minutes.\n\nRepublish the site under the same name.","parentJobId":"8267708e-cdea-4a6b-9767-c37a4e87fbf6","planHash":"390545aa434d867de197029ce8af09fe628ed98f42e81e161ff51cfce7d225f3","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":"51221","feedbackHash":"b050d4b66c22368d7ce95ae75402628fed68f750956bfd294fdef880037ed987","nodeKey":"build_contract_project","submissionHash":"300403165099c739de73af2d4b71d84f53e0517acf523f79137e6559fd5c79b7","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3e0f5d778ed2cdb6f57a05233732232fa97c27ab551e89992131a3083204a63d","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"eb0f308988124bd25487ddacb8bffa1467e3e8f133439ec0fadf6ebda8cb106e","device":"9d2479a5270b8df1","findings":[],"hash":"300403165099c739de73af2d4b71d84f53e0517acf523f79137e6559fd5c79b7","nodeId":"73dc8d66-ef4c-473e-89b3-e82a41d604e6","outcome":"completed","summary":"Implemented the owner Setup page, public floor refresh, keeper, and pixel-frog night theme while preserving existing functions.\n\nValidation passed: `forge build`, all 94 Foundry tests, `forge fmt --check`, frontend and keeper tests, and mobile browser checks.\n\nThe site export is ready for `pawn.site.identitymd.eth`, but publication still requires the hosting service. Paid browser requests also require api.imd.fun to enable the site’s CORS origin; pasted request IDs work. These handoff requirements are documented in [SETUP-AND-KEEPER.md](docs/SETUP-AND-KEEPER.md).","treeHash":"c1026d0ab6a41e41c4e58c5713fd2bd7bbd72e2d","usage":{"cachedInputTokens":12975670,"inputTokens":247367,"model":"gpt-6.1-sol","outputTokens":56808,"runtime":"codex","turns":8,"wallClockMs":1402826}}],"verification":[{"checks":[{"durationMs":64494,"exitCode":0,"name":"build","output":"Compiling 86 files with Solc 0.8.26\nSolc 0.8.26 finished in 64.31s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/MilestoneBurn.sol:32:67\n   │\n32 │     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:53:46\n   │\n53 │                 || a.agreed > a.panelSize || a.issuedAt > block.timestamp || block.timestamp - a.issuedAt > 26 hours\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/CollateralVault.sol:105:45\n    │\n105 │                 || 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:110:9\n    │\n110 │         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/MilestoneBurn.sol:53:78\n   │\n53 │                 || a.agreed > a.panelSize || a.issuedAt > block.timestamp || block.timestamp - a.issuedAt > 26 hours\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:67:9\n   │\n67 │         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:122:20\n    │\n122 │                 || block.timestamp > workerExpiresAt || !IPawnShop(pawnShop).loanActive(loanId)\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/CollateralVault.sol:131:9\n    │\n131 │         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:128:22\n    │\n128 │     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:143:9\n    │\n143 │         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:143:29\n    │\n143 │         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:147:64\n    │\n147 │     function withdrawETH(uint256 amount) external onlyBorrower 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/PawnShop.sol:132:17\n    │\n132 │     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:152:81\n    │\n152 │     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:168:9\n    │\n168 │         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:175:34\n    │\n175 │         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:175:68\n    │\n175 │         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/LendingPool.sol:92:17\n   │\n92 │             if (uint256(donationCheckpoints[mid].start) + VESTING <= block.timestamp) low = mid + 1;\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:259:34\n    │\n259 │     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:270:36\n    │\n270 │     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:292:46\n    │\n292 │                 || 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:293:20\n    │\n293 │                 || 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:306:36\n    │\n306 │         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:310:9\n    │\n310 │         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:307:30\n    │\n307 │             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:315:32\n    │\n315 │         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:315:65\n    │\n315 │         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:316:16\n    │\n316 │             && block.timestamp <= f.expiresAt;\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:354:9\n    │\n354 │         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:365:9\n    │\n365 │         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:378:9\n    │\n378 │         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:393:13\n    │\n393 │         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:399:9\n    │\n399 │         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/PawnShop.sol:409:13\n    │\n409 │         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:412:13\n    │\n412 │         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:431:13\n    │\n431 │             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:438:9\n    │\n438 │         emit AuctionWrittenOff(id, loan.principal);\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:459:9\n    │\n459 │         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:168:9\n    │\n168 │         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:196:9\n    │\n196 │         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:319:26\n    │\n319 │         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:199:9\n    │\n199 │         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:202:55\n    │\n202 │     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:208:9\n    │\n208 │         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:212:66\n    │\n212 │     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:223:9\n    │\n223 │         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:226:85\n    │\n226 │     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:241:9\n    │\n241 │         emit Settled(principal, msg.value, covered, gap - covered);\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:244:53\n    │\n244 │     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:247:9\n    │\n247 │         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:251:58\n    │\n251 │     function receiveRecovery() 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:254:9\n    │\n254 │         emit RecoveryReceived(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:262:13\n    │\n262 │             emit ReserveAdded(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:268:53\n    │\n268 │     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:271:9\n    │\n271 │         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:279:9\n    │\n279 │         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:283:42\n    │\n283 │         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:293:17\n    │\n293 │             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:297:61\n    │\n297 │                 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:300:57\n    │\n300 │             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:330:34\n    │\n330 │         if (pendingCapAt == 0 || block.timestamp < pendingCapAt) revert TimelockPending();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":19600,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/MilestoneBurn.t.sol:MilestoneBurnTest\n[PASS] test_deploymentRejectsUnrelatedSignerSource() (gas: 12999)\n[PASS] test_rejectsStaleExpiredWrongDomainAndInsufficientPanel() (gas: 354292)\n[PASS] test_rotationFollowsShopTimelockWithoutOwnerOrWithdrawalPower() (gas: 638093)\n[PASS] test_unsetOneTimeSetupAndThreshold() (gas: 650004)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.50ms (1.97ms CPU time)\n\nRan 2 tests for test/SetupFlows.t.sol:SetupFlowsTest\n[PASS] test_burnSetupRejectsLowCapAndForeignConsumerThenBurnsOnce() (gas: 478014)\n[PASS] test_ownerPinsFloorThenPublicWalletPostsAndClaimsBounty() (gas: 502970)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.52ms (2.28ms CPU time)\n\nRan 6 tests for test/Governance.t.sol:GovernanceTest\n[PASS] test_allChangesWait48HoursAndCancel() (gas: 637434)\n[PASS] test_collectionLimitsDisableAndHashInitialization() (gas: 1496859)\n[PASS] test_explicitOwnershipTwoStepAndNoRenounce() (gas: 173359)\n[PASS] test_hardBoundsAndNonzeroAddresses() (gas: 221481)\n[PASS] test_hashRotationInvalidatesFloorButKeepsAuctionPrice() (gas: 2511696)\n[PASS] test_nonSeatLoanAndInsufficientIdleRollBackCustody() (gas: 7739554)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.85ms (3.26ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsFreshUintSignatureFromVectorKey() (gas: 202125)\n[PASS] test_acceptsTheProtocolSignature() (gas: 19508)\n[PASS] test_burnConsumerDigestMatchesTheProtocol() (gas: 9407531)\n[PASS] test_digestMatchesTheProtocol() (gas: 13167)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.70ms (1.82ms CPU time)\n\nRan 5 tests for test/Oracle.t.sol:OracleTest\n[PASS] test_floorCannotShortenStoredExpiry() (gas: 155528)\n[PASS] test_freshUpdatesAndOneBountyPer24Hours() (gas: 462892)\n[PASS] test_rejectsWrongQuestionChainPanelTypeAndTime() (gas: 616599)\n[PASS] test_replayTamperingWrongSignerAndWrongDomain() (gas: 343515)\n[PASS] test_signedRequestCannotBeReusedWithNewTimestamp() (gas: 178838)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.73ms (4.70ms CPU time)\n\nRan 6 tests for test/CollateralVault.t.sol:CollateralVaultTest\n[PASS] test_auctionStopsCallsButBorrowerRetainsRewardWithdrawals() (gas: 2701441)\n[PASS] test_authorizationCannotNameBorrowerOtherTokenOrNonSeat() (gas: 2487376)\n[PASS] test_callForRewardsWithdrawalsAndBlockedTargets() (gas: 3044310)\n[PASS] test_indirectCollateralRemovalRollsBackAndNFTOnlyLeavesViaShop() (gas: 3554660)\n[PASS] test_onlyRegisteredTypedWorkerDigestValidAndExpires() (gas: 2371429)\n[PASS] test_revokeAndCloseDisableAuthorization() (gas: 2628247)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 12.05ms (4.15ms CPU time)\n\nRan 2 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_exactTransfers(uint256) (runs: 256, μ: 89551, ~: 89614)\nLogs:\n  Bound result 95\n\n[PASS] test_supplyMetadataAndTransfer() (gas: 171792)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 12.52ms (12.79ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_allRuntimeTypesMeetSizeAndForbiddenOpcodeFloor() (gas: 33277867)\n[PASS] test_factoryDeploymentPreservesSupplyAndExplicitOwner() (gas: 342104)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 51.55ms (50.52ms CPU time)\n\nRan 5 tests for test/ReviewScope.t.sol:ReviewScopeTest\n[PASS] test_bountyCopied() (gas: 271647)\n[PASS] test_fixedMaximumPrincipal() (gas: 200110)\n[PASS] test_newWindowHashRejected() (gas: 75954)\n[PASS] test_ownerValuationCanBorrowAllIdle() (gas: 2455658)\n[PASS] test_underwaterExtensions() (gas: 20676906)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 56.15ms (13.43ms CPU time)\n\nRan 11 tests for test/PawnShop.t.sol:PawnShopTest\n[PASS] testFuzz_principalFeeAndFundConservation(uint256,uint8) (runs: 256, μ: 2541185, ~: 2541304)\nLogs:\n  Bound result 9976619165914291048\n  Bound result 0\n\n[PASS] test_auctionCurveSurplusOverpaymentAndDuplicate() (gas: 2894781)\n[PASS] test_auctionUsesStoredStaleFloorAndSocializesGap() (gas: 2735068)\n[PASS] test_claimFailureAndReentrancyPreserveLiabilities() (gas: 2665047)\n[PASS] test_discountAndModuleChangeKeepOldCommitment() (gas: 5274220)\n[PASS] test_failedNFTSettlementIsAtomic() (gas: 2950218)\n[PASS] test_feeWaterfallFillsBountyReserveThenShortfallThenRecipient() (gas: 44819048)\n[PASS] test_limitsIdleLiquidityAndDuplicateNFT() (gas: 4358596)\n[PASS] test_pauseStalenessAndInvalidActions() (gas: 2725121)\n[PASS] test_pawnRepayAndConservation() (gas: 2626833)\n[PASS] test_termSnapshotAndLateExtension() (gas: 5119362)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 101.88ms (138.10ms CPU time)\n\nRan 4 tests for test/LockDiscount.t.sol:LockDiscountTest\n[PASS] testFuzz_discountRoundsUpAndNeverExceedsBase(uint256,uint8) (runs: 256, μ: 152771, ~: 182799)\nLogs:\n  Bound result 644872439406080727672408778640\n  Bound result 2\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 109.64ms (112.79ms CPU time)\n\nRan 19 tests for test/ReviewRegression.t.sol:ReviewRegressionTest\n[PASS] testFuzz_maxRedeemNeverExceedsIdle(uint256,uint256) (runs: 256, μ: 662849, ~: 663707)\nLogs:\n  Bound result 139333957038420622\n  Bound result 20796916420271880\n\n[PASS] test_certainLossBeforeExitAndLaterSettlement() (gas: 3104777)\n[PASS] test_disablingCollectionCancelsQueuedReenable() (gas: 156029)\n[PASS] test_emptyPoolDonationRejectedAndFeeGoesToReserve() (gas: 479971)\n[PASS] test_feeSandwichHasNoImmediateGainAndFeeVests() (gas: 2577333)\n[PASS] test_lastShareExitRetiresVestingAndNewStreamStillWorks() (gas: 700856)\n[PASS] test_longSignedExpiryCannotVetoDailyUpdates() (gas: 238947)\n[PASS] test_lossMarksNetReserveAndReconcileMultipleAuctions() (gas: 5325281)\n[PASS] test_missingCollateralCanBeWrittenOffImmediately() (gas: 2573149)\n[PASS] test_missingNFTRepaysAndClearsCommitment() (gas: 2589496)\n[PASS] test_newQueueSupersedesAndExpires() (gas: 381532)\n[PASS] test_oneWeiEntitlementAfterPartialRedemptionRemainsWithdrawable() (gas: 669493)\n[PASS] test_onlyShopCanMarkOrSettleDebt() (gas: 119881)\n[PASS] test_roundingAllowsAllBackedAssetsToExit() (gas: 576860)\n[PASS] test_seizedNFTZeroPriceBooksGapWithoutPayingIssuer() (gas: 2862325)\n[PASS] test_shortExpiryCannotReplaceValidFloor() (gas: 2474975)\n[PASS] test_stuckAuctionLossSharedAfterWriteOff() (gas: 2721070)\n[PASS] test_transferRestrictionDoesNotBlockFinancialWriteOff() (gas: 3258199)\n[PASS] test_writeOffUnsoldAuctionUnlocksAndLateRecoveryVests() (gas: 3307600)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 136.21ms (120.89ms CPU time)\n\nRan 8 tests for test/LendingPool.t.sol:LendingPoolTest\n[PASS] testFuzz_roundTripNeverCreatesAssets(uint256) (runs: 256, μ: 285899, ~: 285814)\nLogs:\n  Bound result 360392139165588917\n\n[PASS] test_accessCapAndFailedClaim() (gas: 564585)\n[PASS] test_directDonationInflationCannotStealVictimDeposit() (gas: 475055)\n[PASS] test_donationVestsExactlyAndDoesNotResetOnNewDonation() (gas: 743015)\n[PASS] test_dustDonationsCannotBlockDonationsOrWithdrawals() (gas: 9730308)\n[PASS] test_erc4626DepositMintWithdrawRedeemAndNativeClaim() (gas: 773407)\n[PASS] test_nativeWithdrawRequiresShareAllowance() (gas: 406240)\n[PASS] test_shortfallReserveExcludedAndConsumedBeforeShares() (gas: 959512)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 135.59ms (133.47ms CPU time)\n\nRan 9 tests for test/AdversarialBoundaries.t.sol:AdversarialBoundariesTest\n[PASS] testFuzz_auctionPriceIsMonotoneAndUnderbidRollsBack(uint256,uint256) (runs: 1000, μ: 3150185, ~: 3150406)\nLogs:\n  Bound result 1799913\n  Bound result 3388098\n\n[PASS] testFuzz_inexactRepaymentLeavesDebtCollateralAndCommitmentIntact(uint256) (runs: 1000, μ: 2892808, ~: 2892678)\nLogs:\n  Bound result 25000000000000000\n\n[PASS] testFuzz_malformedSignedAnswersNeverConsumeRequests(uint256) (runs: 1000, μ: 301268, ~: 301442)\nLogs:\n  Bound result 18\n\n[PASS] test_claimZeroRecipientAndSecondClaimCannotSpendOtherCredits() (gas: 2285606)\n[PASS] test_discountThresholdOneWeiAndMaximumFeeDoNotOverflow() (gas: 775914)\n[PASS] test_failedExtensionRollsBackTheNewDiscountTier() (gas: 3374582)\n[PASS] test_floorChangesDoNotRepriceAnAuctionAlreadyStarted() (gas: 2626640)\n[PASS] test_minimumPrincipalAndOneWeiBelowIt() (gas: 2454387)\n[PASS] test_nativeZeroOperationsAndInvalidSettlementAreAtomic() (gas: 2470206)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 135.75ms (384.62ms 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 | 981   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | claim             | 1007  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | deposit           | 986   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | donate            | 1050  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | lockOrUnlock      | 1087  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | pawn              | 1006  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | repayOrAuction    | 1009  | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| PawnHandler | withdraw          | 1066  | 0       | 0        |\n╰-------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 379646445416256\n  Bound result 3456000\n  Bound result 4975000000000000061\n  Bound result 100000000000000000\n  Bound result 2393\n  Bound result 3544\n  Bound result 2900000000000000000\n  Bound result 323\n  Bound result 4975000000000000128\n  Bound result 3100000000000000000\n  Bound result 790166\n  Bound result 4975000000000172801\n  Bound result 2564\n  Bound result 4000000000000000000000000\n  Bound result 500\n  Bound result 4975000001690522294\n  Bound result 3455997\n  Bound result 4550533975190168641\n  Bound result 715559332497474619\n  Bound result 100000000000000000\n  Bound result 137194\n  Bound result 995\n  Bound result 107477464\n  Bound result 572162445421928710\n  Bound result 1401702968\n  Bound result 2038\n  Bound result 4975000000000000005\n  Bound result 1844861\n  Bound result 4975000000000000257\n  Bound result 5909\n  Bound result 60\n  Bound result 3600\n  Bound result 95\n  Bound result 2000000000000000\n  Bound result 2560000\n  Bound result 2808711004040200249\n  Bound result 3844601569\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.44s (3.44s 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     | 2630  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | authorize   | 2590  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | claim       | 2567  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | close       | 2561  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | fund        | 2527  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | rejectTheft | 2555  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | revoke      | 2522  | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| VaultCustodyHandler | withdraw    | 2528  | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 416000\n  Bound result 1235\n  Bound result 0\n  Bound result 0\n  Bound result 472341\n  Bound result 2346\n  Bound result 355677336919581142\n  Bound result 58742992734075750\n  Bound result 7110\n  Bound result 97200\n  Bound result 59\n  Bound result 928000\n  Bound result 1\n  Bound result 2950172\n  Bound result 3000\n  Bound result 256\n  Bound result 1\n  Bound result 322552\n  Bound result 201127\n  Bound result 928000\n  Bound result 4147351885783441\n  Bound result 5585\n  Bound result 9327\n  Bound result 3086\n  Bound result 472259\n  Bound result 22003\n  Bound result 200\n  Bound result 0\n  Bound result 16899\n  Bound result 154428405244755968\n  Bound result 1411183\n  Bound result 10000000000000000\n  Bound result 2479\n  Bound result 0\n  Bound result 827148\n  Bound result 703999\n  Bound result 1\n  Bound result 73728669905302253297119255\n  Bound result 2987\n  Bound result 0\n  Bound result 1\n  Bound result 8796\n  Bound result 11941\n  Bound result 1\n  Bound result 144428405244755968\n  Bound result 73728669909449605182902698\n  Bound result 296934344185507994\n  Bound result 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.95s (6.95s 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               | 1827  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | borrow                | 1825  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | claim                 | 1786  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | deposit               | 1801  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | donate                | 1811  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | feeOrReserve          | 1782  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | redeem                | 1902  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | settle                | 1982  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | transferShares        | 2009  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | unauthorizedShopCalls | 1842  | 0       | 0        |\n|-----------------------+-----------------------+-------+---------+----------|\n| PoolAccountingHandler | withdraw              | 1913  | 0       | 0        |\n╰-----------------------+-----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 300000000000000000\n  Bound result 3614\n  Bound result 12589\n  Bound result 9529\n  Bound result 530609353619803506\n  Bound result 0\n  Bound result 1493\n  Bound result 9000000000000000000\n  Bound result 8424\n  Bound result 185999999999999999980\n  Bound result 25\n  Bound result 3456000\n  Bound result 999609400003452386\n  Bound result 2034\n  Bound result 199005603546422619\n  Bound result 1999609400003448772\n  Bound result 299022728855629194\n  Bound result 723133817209149\n  Bound result 999999999999999985\n  Bound result 349163907\n  Bound result 313958762\n  Bound result 60\n  Bound result 3910\n  Bound result 3972\n  Bound result 63968770086\n  Bound result 75\n  Bound result 1815711196289167758\n  Bound result 2\n  Bound result 559651147183509519756156\n  Bound result 6405\n  Bound result 6155\n  Bound result 194995270573233136523\n  Bound result 8754700968443462679\n  Bound result 7875\n  Bound result 3\n  Bound result 658896\n  Bound result 10251\n  Bound result 604800\n  Bound result 198673069729224310\n  Bound result 9767\n  Bound result 262875584129854041272\n  Bound result 91883323606323454\n  Bound result 8138\n  Bound result 3000000000000000000\n  Bound result 3420\n  Bound result 2544915871976175\n  Bound result 474475944442473\n  Bound result 7587497104615784359086412\n  Bound result 18446744073709551615\n  Bound result 102310233410\n  Bound result 12776\n  Bound result 999999999999999998\n  Bound result 4338\n  Bound result 550000000000000000\n  Bound result 6817\n  Bound result 34920464865730\n  Bound result 1000000000000000000\n  Bound result 488295031720\n  Bound result 488295031718\n  Bound result 27415553632141422\n  Bound result 24\n  Bound result 69271372458382576\n  Bound result 1800003600\n  Bound result 1000000000000000000000\n  Bound result 3745270961200898147106165\n  Bound result 999999999700000001\n  Bound result 496000000000000000\n  Bound result 46179359759834520\n  Bound result 15455749754448254\n  Bound result 3753839803595600267\n  Bound result 64\n  Bound result 6019\n  Bound result 1381\n  Bound result 4294967295\n  Bound result 1000000000000000000\n  Bound result 1850\n  Bound result 4926\n  Bound result 991494\n  Bound result 4075\n  Bound result 1200\n  Bound result 7\n  Bound result 129035837012967424\n  Bound result 406843\n  Bound result 38486513347749372\n  Bound result 38486513347749372\n  Bound result 691200\n  Bound result 393904728130359211108\n  Bound result 438604059409076096088390\n  Bound result 15431354721139014357952877\n\n[PASS] test_feesAndDonationsVestAsIndependentTranches() (gas: 2938276)\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: 3489337)\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: 1911521)\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 9.19s (9.19s 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            | 2059  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | commit             | 2026  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | donate             | 2133  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | lock               | 2006  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | rejectOverUnlock   | 1951  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | rejectUnauthorized | 2084  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | release            | 2028  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | transfer           | 2126  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | tryBurn            | 1994  | 0       | 0        |\n|---------------------+--------------------+-------+---------+----------|\n| TokenCustodyHandler | unlock             | 2073  | 0       | 0        |\n╰---------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000000000\n  Bound result 300\n  Bound result 20000000000000000000000000\n  Bound result 300\n  Bound result 259200\n  Bound result 2347749\n  Bound result 114999876999999999999999997\n  Bound result 123000000000000000000\n  Bound result 218463463374607431768211455\n  Bound result 64292\n  Bound result 6837\n  Bound result 3333\n  Bound result 900\n  Bound result 6949\n  Bound result 4000000000000000000\n  Bound result 6660\n  Bound result 12086\n  Bound result 588140019665980944000415401387\n  Bound result 2392\n  Bound result 1931\n  Bound result 909617\n  Bound result 2501\n  Bound result 253\n  Bound result 172545493829736847130179050\n  Bound result 7521\n  Bound result 10000\n  Bound result 735\n  Bound result 1845\n  Bound result 32\n  Bound result 2284125395\n  Bound result 331\n  Bound result 2246\n  Bound result 8000\n  Bound result 78761264249402803423501300\n  Bound result 47\n  Bound result 94212102480183014597508738\n  Bound result 3852400060\n  Bound result 8000\n  Bound result 35402061871030894887748747\n  Bound result 503886680730293464630392056229\n  Bound result 144\n  Bound result 4000000000000000\n  Bound result 1106\n  Bound result 251960230208881380\n  Bound result 787107\n  Bound result 296748947526040360548992011\n  Bound result 1770061162\n  Bound result 5000000255960230208883978\n  Bound result 20000000000000000000001701\n  Bound result 296748947526040360548992011\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 19.49s (19.49s CPU time)\n\nRan 18 test suites in 19.50s (39.85s CPU time): 94 tests passed, 0 failed, 0 skipped (94 total tests)\n","passed":true},{"durationMs":108,"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.claim(address)\",\"LendingPool.deposit(uint256,address)\",\"LendingPool.depositETH(address)\",\"LendingPool.donate()\",\"LendingPool.executeDepositCap()\",\"LendingPool.markAuctionLoss(uint256,uint256,uint256)\",\"LendingPool.mint(uint256,address)\",\"LendingPool.queueDepositCap(uint256)\",\"LendingPool.receive()\",\"LendingPool.receiveFee()\",\"LendingPool.receiveRecovery()\",\"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.pawn(address,uint256,uint8)\",\"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.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)\"],\"files\":{\".gitignore\":4,\"README.md\":153,\"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-CnyicEpp.js\":1,\"dist/assets/index-BE5mvMs3.css\":1,\"dist/assets/index-s1v7TP9S.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/DESIGN.md\":71,\"docs/SETUP-AND-KEEPER.md\":122,\"docs/abi/CollateralVault.json\":739,\"docs/abi/LaunchToken.json\":315,\"docs/abi/LendingPool.json\":1716,\"docs/abi/LockDiscount.json\":367,\"docs/abi/MilestoneBurn.json\":609,\"docs/abi/PawnShop.json\":2083,\"docs/abi/README.md\":15,\"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/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/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\":89,\"keeper/THIRD_PARTY_LICENSES.md\":254,\"keeper/config.json\":15,\"keeper/core.mjs\":65,\"keeper/cron.example\":3,\"keeper/hourly-workflow.yml\":35,\"keeper/run.mjs\":290,\"keeper/runtime-entry.ts\":11,\"keeper/runtime.mjs\":58,\"keeper/tests/core.test.mjs\":139,\"keeper/tests/oracle.test.mjs\":267,\"launch.json\":36,\"src/CollateralVault.sol\":193,\"src/LaunchToken.sol\":11,\"src/LendingPool.sol\":340,\"src/LockDiscount.sol\":105,\"src/MilestoneBurn.sol\":75,\"src/OracleAttestation.sol\":221,\"src/PawnShop.sol\":490,\"src/PullPayments.sol\":35,\"src/interfaces/IPawn.sol\":21,\"test/AdversarialBoundaries.t.sol\":240,\"test/CONTRIBUTOR_TESTS.md\":20,\"test/CollateralVault.t.sol\":149,\"test/Deployment.t.sol\":64,\"test/Governance.t.sol\":181,\"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\":105,\"test/PawnInvariant.t.sol\":227,\"test/PawnShop.t.sol\":244,\"test/PoolAccountingInvariant.t.sol\":365,\"test/ReviewRegression.t.sol\":349,\"test/ReviewScope.t.sol\":66,\"test/SetupFlows.t.sol\":58,\"test/TokenCustodyInvariant.t.sol\":278,\"test/VaultCustodyInvariant.t.sol\":266,\"test/helpers/Mocks.sol\":104,\"test/helpers/PawnTestBase.sol\":99,\"tools/export_abis.py\":16,\"web/.gitignore\":8,\"web/README.md\":61,\"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\":739,\"web/public/abi/LaunchToken.json\":315,\"web/public/abi/LendingPool.json\":1716,\"web/public/abi/LockDiscount.json\":367,\"web/public/abi/MilestoneBurn.json\":609,\"web/public/abi/PawnShop.json\":2083,\"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\":357,\"web/src/components.tsx\":330,\"web/src/config.ts\":197,\"web/src/engine.tsx\":522,\"web/src/finance.tsx\":591,\"web/src/forms.tsx\":85,\"web/src/loans.tsx\":571,\"web/src/logic.ts\":195,\"web/src/main.tsx\":10,\"web/src/mascot.tsx\":37,\"web/src/operations.tsx\":452,\"web/src/oracle-flow.tsx\":485,\"web/src/oracle.ts\":400,\"web/src/setup.tsx\":236,\"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\":353,\"web/tests/render-live.mjs\":140,\"web/tests/setup-browser.ts\":332,\"web/tests/trading-fees.test.ts\":77,\"web/tsconfig.json\":1,\"web/vite.config.ts\":8},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"300403165099c739de73af2d4b71d84f53e0517acf523f79137e6559fd5c79b7","verifiedTreeHash":"c1026d0ab6a41e41c4e58c5713fd2bd7bbd72e2d","verifierVersion":"0.1.0+ad90ce4c"}]}