{"assessments":[],"deployments":[{"attestationHash":"8606284d0b4f5f503461d13448af12485461048b40ae38a3a6bf774109afee97","chainId":1,"contracts":[{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26392443,"name":"PoolInitializationGuard","role":"hook","txHash":"0x5d978caf5494c9fa1c77522815e6075dfff42ebe6939524bbd268c8af40eb045"},{"address":"0x55e629dc88f181ca13d54cdf757ef6c94ec20d1e","blockNumber":26392443,"name":"QuietPayToken","role":"token","txHash":"0x5d978caf5494c9fa1c77522815e6075dfff42ebe6939524bbd268c8af40eb045"},{"address":"0xac23f1ef1091c65cc2793122b39f71343374196d","blockNumber":26392443,"name":"MerkleDistributor","role":"distributor","txHash":"0x5d978caf5494c9fa1c77522815e6075dfff42ebe6939524bbd268c8af40eb045"}],"id":"ff53aac7-b184-4a60-ac12-cb777e7971c7","manifestHash":"bcc2e7ba49fa6ab81fe75f8ec566c1722ea50794beb1fe8a96654fa90101d7f8","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"bf4bea17-8066-494e-a874-fcde54f96e43","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c0a59551b8a859ca7803b1e5137217d19a76884997706e827b5c999f95d13226","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"11d9490cdceefa777e0344c7305c5d94d439b0661d59615aeec041f5bf923493","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"f35afe2e39e1dc74afd38c44d1a63249e3dc083cdd141240674a61d6ca09f079","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"675489ff3e38d9d2477f3516db9194c6f7eec6eab74901357b26ec69a49bfdb7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"afdec21967456462f0da8313805710485d3b1b498f8160ffd348e9139804f9d7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"545c50284dd4ddb9a5087267cfa6873578744285ed18a267fd3c72980cffd28c","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"5344e25b27569da4baf6cbea8b4dcd937ce524a4e21676a4130ab50c792b0322","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"c71b041fdac9e11ebe256701df5877e255c624009109d9200640fa5477d116fd","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"1ddb4d02eb75e52d5f38cfd5c9bb54f332687b81929c68880cf1e8a6ab27254d","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: QuietPay (QUIETPAY).\nToken name: QuietPay\nToken symbol: QUIETPAY\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"a2ac44a59bad317a0d8607b9f22a76e6c878c539f816f488a3a0d6a807c33916","previousHash":"4424a164a989984ed768b8d29cf298375b856261391a9a41ffb05d95d568a579","projectId":"bf4bea17-8066-494e-a874-fcde54f96e43","publication":{"commit":"3e9c3d368fd9991dc7a45a496cf1956f77f6ab97","deliveredAt":"2026-11-11T15:00:43.497Z","repoUrl":"https://github.com/identity-md-launches/launch-3208-quietpay"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"87e402091f60add685e3edaad7078468c85ca9aa4db868d20103ad693c4097f7","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"63458a1bd2b2d376","findings":[{"citation":"resolved","description":"The comment on DECIMALS says it is 'the number of decimals, as decimals() returns it', and TOTAL_SUPPLY is scaled by it. But QuietPayToken never overrides ERC20.decimals(); decimals() returns OpenZeppelin's hardcoded 18 (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol, function decimals). The two values coincide today, so there is no failing input on the current build and the launch floor (test_decimalsMatchTheManifest, IMD_TOKEN_DECIMALS=18) passes. The hazard is maintenance: editing DECIMALS alone rescales TOTAL_SUPPLY while decimals() stays 18, so token.totalSupply in the manifest, the supply and decimals() would silently disagree. Minimal fix that preserves behaviour: add `function decimals() public pure override returns (uint8) { return DECIMALS; }`. No bytecode behaviour changes for the current constants.","line":21,"path":"src/QuietPayToken.sol","reproduction":"Current state (no failure): deploy QuietPayToken; decimals() == 18 and DECIMALS() == 18, TOTAL_SUPPLY() == 1e27. Demonstration of the decoupling: change line 21 to `uint8 public constant DECIMALS = 6;` and rebuild; TOTAL_SUPPLY() becomes 1e15 while decimals() still returns 18, so test_metadata's assertEq(token.DECIMALS(), 18) fails but assertEq(token.decimals(), 18) passes, and a manifest written from the constants (decimals 6, totalSupply 1e15) would be refused by the floor's decimals check. Expected: decimals() tracks DECIMALS. Actual: decimals() is the library default.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant is not what decimals() reads; they agree only by OpenZeppelin's default"}],"hash":"11d9490cdceefa777e0344c7305c5d94d439b0661d59615aeec041f5bf923493","nodeId":"86341671-1cb2-4746-93c4-76308f54c032","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome:** no exploitable defect in the control-flow area. The token is an unmodified OpenZeppelin v5.2.0 ERC20 whose constructor mints the fixed supply to the deployer. All three state-changing entry points hold.\n\n**What I checked, per guide:**\n- **Execution Trace.** Traced approve, transfer and transferFrom through the vendored library: zero-address sentinels revert, balances and allowances use checked math, the infinite-allowance path is the documented OpenZeppelin behavior, and there are no external calls, hooks or callbacks. Launch flows move exactly the amount requested.\n- **Periphery.** Diffed every vendored OpenZeppelin file against the pinned upstream commit and four key forge-std files against theirs. All are byte-identical. Remappings point at them.\n- **First Principles.** Verified the constructor's only assumption, that the creator is the factory, matches the floor's CREATE2 deployment. Walked the full deployed bytecode and found no DELEGATECALL, CALLCODE, SELFDESTRUCT or any CALL. Confirmed the supply literal equals the manifest string in the README. Build and all 28 project tests pass.\n\n**One informational finding recorded.** The `DECIMALS` constant is documented as what `decimals()` returns, but `decimals()` is never overridden, so both read 18 only because that is OpenZeppelin's default. There is no failing input on the current build. The reproduction shows that editing the constant alone would rescale the supply while `decimals()` stays at 18. The one-line fix is to override `decimals()` to return the constant.\n\n**Coverage.** Nine rows written: the three listed entry points, the constructor, the fixed-supply and banned-opcode invariants, dependency integrity, the decimals consistency row that carries the finding, and the deploy script. Nothing was left unreached. The static-analysis lead about the large numeric literal was checked and is not a defect.","treeHash":null,"usage":{"cachedInputTokens":303748,"cost":{"source":"runtime","usdMicros":1697941},"inputTokens":194,"model":"claude-fable-5-1","outputTokens":9767,"runtime":"claude","turns":11,"wallClockMs":199299}},{"artifacts":[],"attempt":1,"bundleHash":"880ae7424fb6198bdfcfd1f319a0fc15bdcd47faa142adef6426cb407551f02b","device":"6b0a28df3d585600","findings":[],"hash":"5344e25b27569da4baf6cbea8b4dcd937ce524a4e21676a4130ab50c792b0322","nodeId":"09c0e6ed-c99f-449b-8f52-c2944ca7004f","outcome":"completed","summary":"I wrote launch.json for the QuietPay launch and verified it against the accepted tree.\n\n**What the manifest says**\n- Kind is custom_token. The token contract is QuietPayToken, named QuietPay with symbol QUIETPAY and 18 decimals.\n- constructorArgs is empty, matching the accepted contract's no-argument constructor.\n- totalSupply is the exact amount the constructor mints to msg.sender, one billion tokens in minor units.\n- contracts is empty, because the accepted tree has no application contracts.\n- pool and economics are copied exactly as the launch gives them: IMD as the paired currency, fee 12500, tick spacing 60, the one-to-one provenance price, and the requester's economics object verbatim.\n- notes describe only QuietPayToken and the launch flows, well under the limit.\n\n**Verification**\n- The JSON parses and contains only the schema's six top-level keys.\n- forge build compiles cleanly.\n- forge test with the verifier's fuzz seed passes all 28 tests across both suites.\n- git status shows launch.json as the only change. No configuration, library or workflow file was touched.","treeHash":"b77b281e8b6520242a732190bb15f3f60ed64869","usage":{"cachedInputTokens":107357,"cost":{"source":"runtime","usdMicros":491848},"inputTokens":130,"model":"claude-fable-5-1","outputTokens":2099,"runtime":"claude","turns":5,"wallClockMs":35979}},{"artifacts":[],"attempt":1,"bundleHash":"dc87d4e82245844d2f50dbb4636299b8f5e760104aefd7d184d32188da685714","device":"a0f4c3f900dedd4a","findings":[],"hash":"545c50284dd4ddb9a5087267cfa6873578744285ed18a267fd3c72980cffd28c","nodeId":"7bf90b33-ef43-4b52-8866-7808584b5147","outcome":"completed","summary":"The QuietPay token is built, tested, documented and committed on main as commit 3355bf7.\n\n**What was delivered**\n\n- `src/QuietPayToken.sol`: a fixed-supply ERC-20 on OpenZeppelin v5. Name QuietPay, symbol QUIETPAY, 18 decimals, 1,000,000,000 tokens minted once to the deployer in a no-argument constructor. It has no owner, mint, pause, blocklist, fee or upgrade path, so nothing privileged exists to trip the launch floor.\n- `test/QuietPayToken.t.sol` and `test/DeployQuietPayToken.t.sol`: 28 tests covering metadata, exact supply, mint-to-deployer (fuzzed over deployers), transfer and transferFrom success and failure paths with exact OpenZeppelin errors, supply conservation under fuzzing, the launch flows arriving whole, the floor's admin-call and holder-freeze probes, no owner, ether refusal, and an opcode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT.\n- `script/DeployQuietPayToken.s.sol`: a reviewable script whose deploy function the tests call directly. It reads no environment.\n- `README.md`: assumptions, manifest-ready deployment parameters, an empty \"After launch\" section, operational responsibilities, trust assumptions and security notes against the eth-security checklist.\n- `foundry.toml` pins solc 0.8.26, cancun, optimizer 200 runs, bytecode_hash none, ffi off, no fs permissions.\n- `lib/`: forge-std v1.9.7 and the five OpenZeppelin v5.2.0 files the ERC-20 needs, vendored as plain files with no git metadata or submodule entries.\n\n**Verification**\n\nThe build, format check and test suite all pass with the verifier's fuzz seed, after a clean rebuild:\n\n```\nforge build         -> Compiler run successful!\nforge fmt --check   -> clean\nforge test          -> 28 passed, 0 failed (FOUNDRY_FUZZ_SEED=0x1272b5...06c8)\n```\n\n**Notes**\n\nThe protected floor tests pin a harness with Uniswap v4 and LaunchLiquidity that the verifier supplies, so they are not reproduced here. My own test file mirrors their supply, admin-call, holder-freeze and opcode-scan checks against the token directly. No launch.json was written. The pre-existing dotfiles at the repository root are character devices owned by another user and were left untracked.","treeHash":"ba0102d654710b9d7d1d25b170518ad9b2dd9081","usage":{"cachedInputTokens":649781,"cost":{"source":"runtime","usdMicros":2162524},"inputTokens":482,"model":"claude-fable-5-1","outputTokens":21591,"runtime":"claude","turns":16,"wallClockMs":372334}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2d0460994f47014","findings":[{"citation":"resolved","description":"The doc comment on DECIMALS says it is 'the number of decimals, as decimals() returns it', and TOTAL_SUPPLY on line 24 is scaled by 10 ** uint256(DECIMALS). But decimals() is never overridden: the value the token reports is OpenZeppelin ERC20's hardcoded 18, and the constant is not read by it. As shipped both are 18, so no on-chain input or state fails; the manifest's decimals (18) and totalSupply (1e27) match what the contract returns. The gap is latent: a maintainer who changes DECIMALS to adjust the supply scale would get a supply scaled by the new value while decimals() still returns 18, and the launch floor's decimals/manifest check (Token.protected.t.sol test_decimalsMatchTheManifest) or the supply check would then refuse the build. Reported for the author's information only; it is not a defect in the deployed code.","line":21,"path":"src/QuietPayToken.sol","reproduction":"As shipped: deploy QuietPayToken; decimals() == 18, DECIMALS() == 18, TOTAL_SUPPLY() == totalSupply() == 1_000_000_000e18. Nothing fails. Latent case: edit line 21 to `uint8 public constant DECIMALS = 6;` and rebuild. TOTAL_SUPPLY becomes 1e15 while decimals() still returns 18, so a manifest written from the constants (decimals 6, totalSupply 1e15) disagrees with decimals() == 18. Minimal fix that preserves behaviour: add `function decimals() public pure override returns (uint8) { return DECIMALS; }` so the constant is the single source of truth.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant is not wired to decimals(); the two agree only by coincidence of value"}],"hash":"675489ff3e38d9d2477f3516db9194c6f7eec6eab74901357b26ec69a49bfdb7","nodeId":"7f1e8d7b-d5cb-4ce7-8699-45b8ae9e2bbe","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Outcome: no exploitable math defect.** QuietPayToken is OpenZeppelin 5.2.0 ERC20 plus three constants and a single constructor mint. Every failure mode in the Math Precision, Boundary and Numerical Gap guides was checked against the source and the inherited paths, and none applies. There is no division, ratio multiplication, narrowing cast, shift, scale conversion, external call, payable path or bytes decoding anywhere in the token.\n\n**What I verified with tests** (project suite 27 passing, plus a scratch suite of 10 I wrote under test/scratch/):\n- Supply constant evaluates to exactly 1e27 at compile time and fits uint128, so the aderyn large-literal lead is not a defect.\n- Transfers of max uint or balance plus one revert with the OpenZeppelin insufficient-balance error. Zero and self transfers are exact.\n- Allowance of max minus one is finite and decrements by exactly the value spent. Only exactly max is the infinite sentinel. Self transferFrom keeps balance and spends allowance.\n- transferFrom from the zero address reverts for both zero and non-zero values.\n- Sum of balances equals totalSupply after random transfer sequences, 2000 fuzz runs.\n- The launch split of 10, 80 and 10 percent of 1e27 divides with no dust.\n\n**One info-level note recorded.** The DECIMALS constant is documented as what decimals() returns, but decimals() is never overridden and returns OpenZeppelin's hardcoded 18. The values agree as shipped, so nothing fails on chain. The note describes the latent state in which editing the constant would desynchronise supply scaling from decimals() and offers a one-line override as the fix.\n\n**Coverage record.** All three listed entry points are marked holds with reasons, plus rows for the constructor, the sum-of-balances invariant, the launch-split invariant, and the Boundary and Math Precision guide passes. No row is unreached.\n\nNo repository files were changed. The scratch test under test/scratch/ is disposable and the findings live in .imd-findings.json at the repository root.","treeHash":null,"usage":{"cachedInputTokens":464859,"cost":{"source":"runtime","usdMicros":1952258},"inputTokens":290,"model":"claude-fable-5-1","outputTokens":11909,"runtime":"claude","turns":15,"wallClockMs":291827}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ee8bab8367ea6e91","findings":[],"hash":"afdec21967456462f0da8313805710485d3b1b498f8160ffd348e9139804f9d7","nodeId":"d24113d8-7861-40f8-8af1-ad6436ea4a51","outcome":"completed","summary":"The permissions review of QuietPay found no defects, so `.imd-findings.json` holds an empty findings list plus coverage rows for all three entry points and four invariants.\n\nThe token is OpenZeppelin v5.2.0 `ERC20` plus four constants and a constructor that mints the whole supply to `msg.sender`. It has no owner, role, initializer, fee or exemption logic, so there is very little surface for the three guides to bite on.\n\n**Access Control**\n- **`approve`** writes only the caller's own allowance row; a fuzzed stranger could never change another owner's row.\n- **`transfer`** debits only the caller and reverts on the zero address, so there is no burn path.\n- **`transferFrom`** checks the allowance before moving anything. Calling it with `from == address(0)` reverts for values 0, 1 and max, so there is no mint path.\n- **Supply** is written once, in the constructor. A 128,000-call invariant run, including arbitrary calldata from five actors, left the supply and the balance sum unchanged.\n- **Bytecode**: the runtime dispatch table holds exactly the 13 ABI selectors. There is no fallback or receive, and no `CALL`, `DELEGATECALL`, `CALLCODE`, `SELFDESTRUCT`, `CREATE` or `ORIGIN` opcode.\n- **Vendored library**: the five OpenZeppelin files are byte-identical to upstream at the pinned commit.\n\n**Trust Gap**\n- No privileged actor and no economic formula exist, so none of the four seams applies.\n- The one trust point is whoever creates the contract. A CREATE2 factory received the full supply and `tx.origin` received nothing; the deploy script's `run()` gives it to the broadcaster, as the README says.\n\n**Asymmetry**\n- `transfer` and `transferFrom` share one `_transfer`, with no caller-dependent branch.\n- The mint has no burn counterpart, which is the stated design.\n\nThree behaviours I looked at and did not report, because they are standard or documented rather than defects:\n- `approve` overwrites, so the classic allowance-change race exists; the README states this.\n- A holder calling `transferFrom` on their own balance still needs an allowance.\n- The `DECIMALS` constant is not wired to `decimals()`; both are 18 today, so there is no failing input.\n\nNot reached: the protected launch test could not be run here because it imports Uniswap v4 and floor files that are not in the tree. I substituted a CREATE2 factory deployment for the mint-to-factory check; the pool seed and swap flows against a real PoolManager were not executed. The existing 28 tests pass with the verifier's seed, and my scratch tests were removed, so no repository file is changed.","treeHash":null,"usage":{"cachedInputTokens":645144,"cost":{"source":"runtime","usdMicros":2138947},"inputTokens":22,"model":"claude-fable-5-2","outputTokens":16317,"runtime":"claude","turns":13,"wallClockMs":333022}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0ef0dfae5a05e4be","findings":[],"hash":"c0a59551b8a859ca7803b1e5137217d19a76884997706e827b5c999f95d13226","nodeId":"c7980c06-12a9-4d20-8d95-e4c9ec430246","outcome":"completed","summary":"The background invariant run with the default budget was stopped at its time limit and produced no output. It is not needed: the same scratch suite was re-run in the foreground with a reduced invariant budget and passed all five tests, and the findings file already reflects that run.\n\n**Final state, unchanged from my last message:**\n\n- `.imd-findings.json` holds an empty findings list and eight coverage rows, all `holds`, covering the three verifier-listed entry points plus the supply, conservation, launch-flow and privileged-surface invariants.\n- QuietPayToken is an unmodified OpenZeppelin v5.2.0 ERC-20 with constants and a constructor. The vendored library is byte-identical to upstream. No fee, burn, exemption, mint, owner or upgrade path exists, so no economic, invariant or flow-gap defect was found.\n- The project's 28 tests pass, and my scratch suite under test/scratch passes with 5 tests. Nothing in test/scratch is kept.","treeHash":null,"usage":{"cachedInputTokens":85879,"cost":{"source":"runtime","usdMicros":2549357},"inputTokens":4,"model":"claude-fable-5-1","outputTokens":324,"runtime":"claude","turns":1,"wallClockMs":1103542}},{"artifacts":[],"attempt":1,"bundleHash":"65266570addf343b13cb53124e3b692038deed890ad469a546c6bf29cebbf3e7","device":"42a6bb6aa496cd6b","findings":[],"hash":"c71b041fdac9e11ebe256701df5877e255c624009109d9200640fa5477d116fd","nodeId":"0c115c6b-76d6-4d0c-a13c-349cbcc23e49","outcome":"completed","summary":"I added two test files for QuietPay. The token has no defects to report, and `forge build` and `forge test` pass with the verifier's fuzz seed: 54 tests across 4 suites, 0 failures.\n\n**What I found:** The token is plain OpenZeppelin v5 ERC-20 with nothing added except constants and a constructor that mints all 1,000,000,000 tokens (18 decimals) to the deployer. It has no owner, no fee, no extra mint and no external calls. Nothing in the tests or the random-call runs failed, so I did not write `.imd-findings.json`.\n\n**`test/QuietPayToken.invariant.t.sol`** (new): random call sequences, 256 runs of 64 calls each, set in the test file.\n- **Handler:** five actors who make valid transfers, approvals (including unlimited ones) and `transferFrom` calls. They also make calls that must fail:\n  - sending more than the balance;\n  - sending to the zero address;\n  - spending more than the allowance;\n  - spending more than the balance despite an unlimited allowance;\n  - approving the zero address;\n  - a stranger with no allowance trying to move someone's tokens.\n  \n  Each of those must revert with the exact OpenZeppelin error and arguments.\n- **Invariants checked after every call:**\n  - total supply never changes;\n  - balances add up to the supply;\n  - every balance and allowance matches an independent record kept by the test;\n  - the zero address, the token contract and the handler never hold tokens, and the token never holds ETH;\n  - no balance exceeds the supply;\n  - every call turned out the way the record predicted.\n\n  That last check matters because forge ignores reverts inside a handler by default. So the handler counts wrong outcomes instead of asserting, and an invariant requires the count to be zero. I confirmed in a throwaway test that the count catches a call that unexpectedly succeeds, a revert with the wrong error, and a revert on a valid call. That throwaway test is not submitted.\n\n**`test/QuietPayToken.edge.t.sol`** (new): 25 unit and fuzz tests for cases the earlier suite didn't pin.\n- **Amounts:** the whole supply, the supply plus 1 wei, the maximum `uint256`, a 1-wei round trip, zero from an empty account, and repeating a transfer after the balance is spent.\n- **Zero address:** `transferFrom` to it, `transferFrom` from it, sending from it and approving from it.\n- **Allowances:**\n  - an owner still needs an allowance to call `transferFrom` on their own tokens;\n  - a new approval replaces the old one rather than adding to it, and approving zero revokes;\n  - an allowance spent exactly to zero then blocks further spending;\n  - allowances are separate per spender and per owner;\n  - spending an allowance emits no `Approval` event;\n  - an unlimited allowance is not reduced, but one just below the maximum is.\n- **Fuzzed, 1,000 runs each:** a failed transfer changes nothing; two transfers equal one combined transfer; `transferFrom` to yourself keeps the balance and spends the allowance; a stranger can never move tokens.\n\nI changed nothing outside `test/` and committed nothing; the two new files are untracked in the working tree. The other untracked dotfiles that `git status` shows were already on this machine and aren't mine.","treeHash":"cce17e4868aaaf1a58cede37b5550ec9176df4ac","usage":{"cachedInputTokens":509178,"cost":{"source":"runtime","usdMicros":850926},"inputTokens":26,"model":"claude-opus-5-5","outputTokens":17954,"runtime":"claude","turns":18,"wallClockMs":245209}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bd7adba3a8045853","findings":[{"citation":"resolved","description":"Merged from audit_flow and audit_math, which report the same root cause. The comment on DECIMALS says it is 'the number of decimals, as decimals() returns it', and TOTAL_SUPPLY on line 24 is scaled by 10 ** uint256(DECIMALS). QuietPayToken never overrides ERC20.decimals(), so decimals() returns OpenZeppelin 5.2.0's hardcoded 18 (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol line 78: `function decimals() public view virtual returns (uint8) { return 18; }`). Reproduced: both values are 18 as shipped, the manifest's decimals (18) and totalSupply (1e27) match what the contract returns, and no on-chain input fails. The gap is latent maintenance only: editing DECIMALS alone rescales TOTAL_SUPPLY while decimals() stays 18, and a manifest written from the constants would then be refused by the floor's decimals check. Not a defect in the deployed code; no revision is needed. Minimal fix that preserves behaviour: add `function decimals() public pure override returns (uint8) { return DECIMALS; }`.","line":21,"path":"src/QuietPayToken.sol","reproduction":"As shipped: vm.prank(factory); new QuietPayToken(); decimals() == 18, DECIMALS() == 18, TOTAL_SUPPLY() == totalSupply() == 1_000_000_000e18. Nothing fails. Latent case: change line 21 to `uint8 public constant DECIMALS = 6;` and rebuild; TOTAL_SUPPLY() == 1e15 while decimals() still returns 18. Expected: decimals() tracks DECIMALS. Actual: decimals() is the library default.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant is not what decimals() returns; they agree only because OpenZeppelin's default is also 18"}],"hash":"f35afe2e39e1dc74afd38c44d1a63249e3dc083cdd141240674a61d6ca09f079","nodeId":"2b0f8df9-676c-4a6f-b2ad-466bc9627ca6","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Outcome:** no defects. The token is an unmodified OpenZeppelin 5.2.0 ERC20 with no overrides, no owner, and no privileged functions. One informational note is kept.\n\n**What I checked**\n\n- All three entry points (approve, transfer, transferFrom) traced through OpenZeppelin's code and exercised in a scratch test. They move exactly the stated amount, so the factory, distributor, pool seed and swap flows arrive whole.\n- The constructor mints the full supply once to the deployer with no arguments and no external calls. Supply, decimals, name and symbol match launch.json.\n- Runtime bytecode scanned for DELEGATECALL, CALLCODE and SELFDESTRUCT. None present. Size is well under the deploy limit.\n- The project's own 54 tests and invariants pass. The protected floor tests cannot run locally because they import the verifier's v4-core tree, so I traced their checks by hand instead.\n\n**Specialist findings**\n\n- The audit_flow and audit_math reports describe the same root cause and are merged into one info finding. It reproduces as stated: the DECIMALS constant is not read by decimals(), which returns OpenZeppelin's default. Both are 18 today, so nothing fails on chain and no revision is needed. The suggested one-line override is recorded as an optional cleanup.\n- The tester, economics and permissions areas reported nothing, and my own pass with the Pashov and entry-point checklists found nothing more.\n\n**Output:** `.imd-findings.json` holds the one info finding and five coverage rows, all marked holds. The scratch directory was removed and no repository file was changed.","treeHash":null,"usage":{"cachedInputTokens":170854,"cost":{"source":"runtime","usdMicros":956803},"inputTokens":130,"model":"claude-fable-5-1","outputTokens":5077,"runtime":"claude","turns":5,"wallClockMs":86861}}],"verification":[{"checks":[{"durationMs":986,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 904.13ms\nCompiler run successful!\n","passed":true},{"durationMs":113,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployQuietPayToken.t.sol:DeployQuietPayTokenTest\n[PASS] test_deployMintsTheSupplyToTheScriptCaller() (gas: 1549182)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 437.24µs (226.07µs CPU time)\n\nRan 27 tests for test/QuietPayToken.t.sol:QuietPayTokenTest\n[PASS] testFuzz_supplyGoesToWhoeverDeploys(address) (runs: 256, μ: 709992, ~: 709992)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 95090, ~: 95576)\nLogs:\n  Bound result 5000000000000000000\n  Bound result 18073\n\n[PASS] testFuzz_transferFromIsExactWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 211192, ~: 216475)\nLogs:\n  Bound result 25891\n  Bound result 18396\n  Bound result 4327\n\n[PASS] testFuzz_transferIsExactAndConservesSupply(address,uint256) (runs: 256, μ: 119781, ~: 120289)\nLogs:\n  Bound result 999999999999999999999999999\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 103984)\n[PASS] test_approveToZeroAddressReverts() (gas: 30825)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 687423)\n[PASS] test_hasNoOwner() (gas: 29698)\n[PASS] test_launchFlowsArriveWhole() (gas: 282285)\n[PASS] test_metadata() (gas: 58608)\n[PASS] test_noCallIncreasesSupply() (gas: 708383)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 454908)\n[PASS] test_rejectsEther() (gas: 37505)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 3148176)\n[PASS] test_totalSupplyIsOneBillionWithEighteenDecimals() (gas: 27741)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 135317)\n[PASS] test_transferFromRevertsWhenAllowanceExceedsBalance() (gas: 140851)\n[PASS] test_transferFromSpendsAllowance() (gas: 217855)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 176167)\n[PASS] test_transferFromWithoutAnyAllowanceReverts() (gas: 94950)\n[PASS] test_transferMovesBalanceAndEmits() (gas: 143671)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 87901)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33251)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95461)\n[PASS] test_transferToZeroAddressReverts() (gas: 32942)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 44397)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 13.42ms (56.18ms CPU time)\n\nRan 2 test suites in 14.44ms (13.86ms CPU time): 28 tests passed, 0 failed, 0 skipped (28 total tests)\n","passed":true},{"durationMs":32,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"QuietPayToken.approve(address,uint256)\",\"QuietPayToken.transfer(address,uint256)\",\"QuietPayToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":164,\"foundry.toml\":25,\"launch.json\":24,\"remappings.txt\":2,\"script/DeployQuietPayToken.s.sol\":25,\"src/QuietPayToken.sol\":32,\"test/DeployQuietPayToken.t.sol\":21,\"test/QuietPayToken.t.sol\":390},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5344e25b27569da4baf6cbea8b4dcd937ce524a4e21676a4130ab50c792b0322","verifiedTreeHash":"b77b281e8b6520242a732190bb15f3f60ed64869","verifierVersion":"0.1.0+f03a8d70"},{"checks":[{"durationMs":988,"exitCode":0,"name":"build","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 914.40ms\nCompiler run successful!\n","passed":true},{"durationMs":103,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployQuietPayToken.t.sol:DeployQuietPayTokenTest\n[PASS] test_deployMintsTheSupplyToTheScriptCaller() (gas: 1549182)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 400.82µs (201.84µs CPU time)\n\nRan 27 tests for test/QuietPayToken.t.sol:QuietPayTokenTest\n[PASS] testFuzz_supplyGoesToWhoeverDeploys(address) (runs: 256, μ: 709992, ~: 709992)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 95090, ~: 95576)\nLogs:\n  Bound result 2044\n  Bound result 53591\n\n[PASS] testFuzz_transferFromIsExactWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 211192, ~: 216475)\nLogs:\n  Bound result 25891\n  Bound result 18396\n  Bound result 4327\n\n[PASS] testFuzz_transferIsExactAndConservesSupply(address,uint256) (runs: 256, μ: 119781, ~: 120289)\nLogs:\n  Bound result 351768069264910509222356046\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 103984)\n[PASS] test_approveToZeroAddressReverts() (gas: 30825)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 687423)\n[PASS] test_hasNoOwner() (gas: 29698)\n[PASS] test_launchFlowsArriveWhole() (gas: 282285)\n[PASS] test_metadata() (gas: 58608)\n[PASS] test_noCallIncreasesSupply() (gas: 708383)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 454908)\n[PASS] test_rejectsEther() (gas: 37505)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 3148176)\n[PASS] test_totalSupplyIsOneBillionWithEighteenDecimals() (gas: 27741)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 135317)\n[PASS] test_transferFromRevertsWhenAllowanceExceedsBalance() (gas: 140851)\n[PASS] test_transferFromSpendsAllowance() (gas: 217855)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 176167)\n[PASS] test_transferFromWithoutAnyAllowanceReverts() (gas: 94950)\n[PASS] test_transferMovesBalanceAndEmits() (gas: 143671)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 87901)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33251)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95461)\n[PASS] test_transferToZeroAddressReverts() (gas: 32942)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 44397)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 12.52ms (53.54ms CPU time)\n\nRan 2 test suites in 13.17ms (12.92ms CPU time): 28 tests passed, 0 failed, 0 skipped (28 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"QuietPayToken.approve(address,uint256)\",\"QuietPayToken.transfer(address,uint256)\",\"QuietPayToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":164,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployQuietPayToken.s.sol\":25,\"src/QuietPayToken.sol\":32,\"test/DeployQuietPayToken.t.sol\":21,\"test/QuietPayToken.t.sol\":390},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":425,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":213,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/QuietPayToken.sol:24: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"545c50284dd4ddb9a5087267cfa6873578744285ed18a267fd3c72980cffd28c","verifiedTreeHash":"ba0102d654710b9d7d1d25b170518ad9b2dd9081","verifierVersion":"0.1.0+f03a8d70"},{"checks":[{"durationMs":1608,"exitCode":0,"name":"build","output":"Compiling 31 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.52s\nCompiler run successful!\n","passed":true},{"durationMs":8440,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/DeployQuietPayToken.t.sol:DeployQuietPayTokenTest\n[PASS] test_deployMintsTheSupplyToTheScriptCaller() (gas: 1549182)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 317.38µs (156.36µs CPU time)\n\nRan 25 tests for test/QuietPayToken.edge.t.sol:QuietPayTokenEdgeTest\n[PASS] testFuzz_failedTransferChangesNothing(uint256) (runs: 1000, μ: 125218, ~: 124997)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039456584007913129640867\n\n[PASS] testFuzz_splitTransfersEqualOneTransfer(uint256,uint256) (runs: 1000, μ: 125461, ~: 126042)\nLogs:\n  Bound result 501526018854161615860864484\n  Bound result 487943354537027084671132100\n\n[PASS] testFuzz_strangerCannotMoveAnything(address,uint256) (runs: 1000, μ: 51778, ~: 51780)\nLogs:\n  Bound result 4813\n\n[PASS] testFuzz_transferFromSelfToSelfKeepsBalanceAndSpendsAllowance(uint256,uint256) (runs: 1000, μ: 120832, ~: 121585)\nLogs:\n  Bound result 1021318642100385331876826574695820168119239493492687438158\n  Bound result 449640865144392815403128701\n\n[PASS] test_allowanceIsPerOwner() (gas: 140888)\n[PASS] test_allowanceIsPerSpender() (gas: 88010)\n[PASS] test_allowanceSpentExactlyToZeroThenBlocks() (gas: 203532)\n[PASS] test_approveOverwritesRatherThanAdds() (gas: 133252)\n[PASS] test_approveZeroRevokes() (gas: 113480)\n[PASS] test_emptyAccountCanSendZero() (gas: 47777)\n[PASS] test_emptyAccountCannotSendOneWei() (gas: 37865)\n[PASS] test_maxMinusOneAllowanceIsDecremented() (gas: 126682)\n[PASS] test_oneWeiRoundTrip() (gas: 113612)\n[PASS] test_ownerNeedsAllowanceToUseTransferFromOnThemself() (gas: 38464)\n[PASS] test_sameTransferTwiceFailsOnceBalanceIsSpent() (gas: 147704)\n[PASS] test_transferFromDoesNotEmitApprovalOnSpend() (gas: 123479)\n[PASS] test_transferFromTheZeroAddressReverts() (gas: 38087)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 109032)\n[PASS] test_transferOfMaxUintReverts() (gas: 38170)\n[PASS] test_transferOfWholeSupply() (gas: 88360)\n[PASS] test_transferOfWholeSupplyPlusOneWeiReverts() (gas: 38141)\n[PASS] test_unlimitedAllowanceSurvivesWholeSupplyMove() (gas: 131193)\n[PASS] test_zeroAddressCannotApprove() (gas: 33075)\n[PASS] test_zeroAddressCannotSend() (gas: 33143)\n[PASS] test_zeroAmountTransferToZeroAddressStillReverts() (gas: 32909)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 29.54ms (116.49ms CPU time)\n\nRan 27 tests for test/QuietPayToken.t.sol:QuietPayTokenTest\n[PASS] testFuzz_supplyGoesToWhoeverDeploys(address) (runs: 256, μ: 709992, ~: 709992)\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 95108, ~: 95576)\nLogs:\n  Bound result 883042625822174254957654504\n  Bound result 3868291581166529633071\n\n[PASS] testFuzz_transferFromIsExactWithinAllowance(uint256,uint256,uint256) (runs: 256, μ: 212392, ~: 216475)\nLogs:\n  Bound result 25891\n  Bound result 18396\n  Bound result 4327\n\n[PASS] testFuzz_transferIsExactAndConservesSupply(address,uint256) (runs: 256, μ: 119951, ~: 120283)\nLogs:\n  Bound result 282158137444374347189314876\n\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 103984)\n[PASS] test_approveToZeroAddressReverts() (gas: 30825)\n[PASS] test_constructorEmitsASingleMintTransfer() (gas: 687423)\n[PASS] test_hasNoOwner() (gas: 29698)\n[PASS] test_launchFlowsArriveWhole() (gas: 282285)\n[PASS] test_metadata() (gas: 58608)\n[PASS] test_noCallIncreasesSupply() (gas: 708383)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 454908)\n[PASS] test_rejectsEther() (gas: 37505)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 3148176)\n[PASS] test_totalSupplyIsOneBillionWithEighteenDecimals() (gas: 27741)\n[PASS] test_transferFromRevertsOnInsufficientAllowance() (gas: 135317)\n[PASS] test_transferFromRevertsWhenAllowanceExceedsBalance() (gas: 140851)\n[PASS] test_transferFromSpendsAllowance() (gas: 217855)\n[PASS] test_transferFromWithMaxAllowanceDoesNotDecrement() (gas: 176167)\n[PASS] test_transferFromWithoutAnyAllowanceReverts() (gas: 94950)\n[PASS] test_transferMovesBalanceAndEmits() (gas: 143671)\n[PASS] test_transferOfZeroSucceeds() (gas: 43247)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 87901)\n[PASS] test_transferRevertsWhenSenderHoldsNothing() (gas: 33251)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95461)\n[PASS] test_transferToZeroAddressReverts() (gas: 32942)\n[PASS] test_wholeSupplyIsMintedToTheDeployer() (gas: 44397)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 29.59ms (119.82ms CPU time)\n\nRan 1 test for test/QuietPayToken.invariant.t.sol:QuietPayTokenInvariantTest\n[PASS]\nQuietPayTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_balancesSumToSupply\n[PASS] invariant_everyCallMatchedTheModel\n[PASS] invariant_noBalanceExceedsSupply\n[PASS] invariant_nothingLeaksToZeroOrTheToken\n[PASS] invariant_totalSupplyIsFixed\n QuietPayTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+----------------------------+-------+---------+----------╮\n| Contract        | Selector                   | Calls | Reverts | Discards |\n+===========================================================================+\n| QuietPayHandler | approve                    | 1774  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | approveZeroSpender         | 1938  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | strangerTransferFrom       | 1856  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transfer                   | 1780  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transferAboveBalance       | 1848  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transferFrom               | 1801  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transferFromAboveAllowance | 1804  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transferFromAboveBalance   | 1745  | 0       | 0        |\n|-----------------+----------------------------+-------+---------+----------|\n| QuietPayHandler | transferToZero             | 1838  | 0       | 0        |\n╰-----------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4079\n  Bound result 2835717306\n  Bound result 362288988810484947458470713940944907256268358713025772\n  Bound result 1\n  Bound result 827905\n  Bound result 0\n  Bound result 7387\n  Bound result 5611\n  Bound result 1\n  Bound result 0\n  Bound result 100000000000000000000000000\n  Bound result 839689906572889390\n  Bound result 8200922167194073867886297\n  Bound result 0\n  Bound result 2033\n  Bound result 243\n  Bound result 411177985\n  Bound result 12\n  Bound result 0\n  Bound result 2444\n  Bound result 4699\n  Bound result 163\n  Bound result 516\n  Bound result 253\n  Bound result 9015\n  Bound result 36865\n  Bound result 3026851657608845966\n  Bound result 6496\n  Bound result 0\n  Bound result 115792089237316195423570985008687907853269984665640455838535416813839261751191\n  Bound result 10000000000000000000\n  Bound result 4\n  Bound result 0\n  Bound result 0\n  Bound result 1000\n  Bound result 3947\n  Bound result 1\n  Bound result 9627\n  Bound result 0\n  Bound result 7051\n  Bound result 3681\n  Bound result 59765753914188444949389565092684005333508779723167772499080259451260649381227\n  Bound result 0\n  Bound result 0\n  Bound result 3438694127473883950981695023\n  Bound result 12519524\n  Bound result 42129667563772565248422437531882912146265886673178932344\n  Bound result 1859098529147585896287467\n  Bound result 2657585762\n  Bound result 2019\n  Bound result 1029\n  Bound result 0\n  Bound result 60000000000000000000\n  Bound result 314133477935159488312734878\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.34s (8.34s CPU time)\n\nRan 4 test suites in 8.34s (8.40s CPU time): 54 tests passed, 0 failed, 0 skipped (54 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"QuietPayToken.approve(address,uint256)\",\"QuietPayToken.transfer(address,uint256)\",\"QuietPayToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":164,\"foundry.toml\":25,\"remappings.txt\":2,\"script/DeployQuietPayToken.s.sol\":25,\"src/QuietPayToken.sol\":32,\"test/DeployQuietPayToken.t.sol\":21,\"test/QuietPayToken.edge.t.sol\":258,\"test/QuietPayToken.invariant.t.sol\":330,\"test/QuietPayToken.t.sol\":390},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c71b041fdac9e11ebe256701df5877e255c624009109d9200640fa5477d116fd","verifiedTreeHash":"cce17e4868aaaf1a58cede37b5550ec9176df4ac","verifierVersion":"0.1.0+f03a8d70"}]}