{"assessments":[],"deployments":[{"attestationHash":"be2e2437a1113dd6c8c11a8f41caec740a4cc9ae4308c900dc39fc33aa32ac83","chainId":1,"contracts":[{"address":"0x1a5c7459a9023ae55a56941a433704bc8e154120","blockNumber":26161596,"name":"MerkleDistributor","role":"distributor","txHash":"0xf86dec684c6d4e1bfbf6a2eed9926ca624b1ce9af973adcc7c8c8492c4a24f0b"},{"address":"0xd852098e83e6a8a35eb3eb6976567b0660c86494","blockNumber":26161596,"name":"PrismRiot","role":"token","txHash":"0xf86dec684c6d4e1bfbf6a2eed9926ca624b1ce9af973adcc7c8c8492c4a24f0b"},{"address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","blockNumber":26161596,"name":"PoolInitializationGuard","role":"hook","txHash":"0xf86dec684c6d4e1bfbf6a2eed9926ca624b1ce9af973adcc7c8c8492c4a24f0b"}],"id":"c792b3eb-7f6d-495d-89f2-0bdf03c67edd","manifestHash":"0001a254eb1f811f91630dca5c3710189999b5751c0698f4b4eddb7880e140e7","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":"7c6eaa46-9818-430d-990d-026466aa92cb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"35e52291b7d3eda59229206ecce228c22d13ca1d9ea9c29b4469276aff753be5","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8726afd95175c5a16d9e6f98ad588240e48d4383cf458b219985ac70e5f9ff92","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"91dfc30fed0f8f36641a9a674bd2be27ef4f053d20f2c0acf0a9bdc4cbef7df7","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"3c27357f016d10e02139c172d82fe5d47b0f87a83911c331e587c0560633b3c8","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"be5be81846d171f27e349ef3e137c4711a646ad7d43b108c7637afe888ec1571","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"c71e2af2eeed163c346e3404bbebc602326ebcc34d51d9b9f1b27ad00634a99d","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"2bf2a9531f779717a185786649e2df89769ee71d0cb329c5c759f32a482a0dd2","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"5b0f9867994cea1f6fa09d4483e655f84fccd65f9b7fbbd46e3f3337acaea960","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Prism Riot (PRIO).\nToken name: Prism Riot\nToken symbol: PRIO\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"4515324b1566d9a056647e18b24271fc080a097aeec76528dbca48da4cfde870","previousHash":"5a556521afcbbd6775fe98c1ed09af39259398e173765967a62227b71e618b9e","projectId":"7c6eaa46-9818-430d-990d-026466aa92cb","publication":{"commit":"c9e53135ca4302ab1670786024abde14cb29c441","deliveredAt":"2026-10-10T10:59:53.971Z","repoUrl":"https://github.com/identity-md-launches/launch-1232-prism-riot"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"7b92113f7fcade2a9f9701365256eaae88b3830a78537b5580464486985ce1af","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"ce10a0634fdeff7549ce92e7fb57a76d74b9129e6198009039764b56d5559398","device":"84a29c6575331b77","findings":[],"hash":"2bf2a9531f779717a185786649e2df89769ee71d0cb329c5c759f32a482a0dd2","nodeId":"9a7e2dd7-e6aa-43b8-a8fb-4b10409e2f15","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/7c6eaa46-9818-430d-990d-026466aa92cb/9a7e2dd7-e6aa-43b8-a8fb-4b10409e2f15/launch.json) with the exact supply, pool settings and economics. Constructor arguments match the compiled ABI.\n\n`forge build` succeeded; all 32 tests passed. Only `launch.json` is changed for submission.","treeHash":"9a25e045e298242ef86d0b4ad76015e6ca133009","usage":{"cachedInputTokens":225152,"inputTokens":34691,"model":"gpt-6-astra","outputTokens":1995,"runtime":"codex","turns":3,"wallClockMs":62647}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"af9a875696459139","findings":[],"hash":"35e52291b7d3eda59229206ecce228c22d13ca1d9ea9c29b4469276aff753be5","nodeId":"c56b13e2-8c23-4637-b2b6-00c7e68efe80","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root with an empty findings list and a 16-row coverage record. No tracked file was changed, and the scratch test directory was removed after use.\n\n**Outcome: no defects found in the Economic Security, Invariant or Flow Gap areas.** Prism Riot is a 16-line wrapper over an unmodified OpenZeppelin v5.0.2 ERC-20 that mints exactly 1e27 units to `msg.sender` once in the constructor, with no constructor arguments, no owner, and no mint, burn, pause, blacklist, fallback or receive paths. Every failure mode in the three assigned guides was checked against the code and none was reachable.\n\nWhat I verified, by reading and by executing scratch tests that have since been deleted:\n\n- **Supply and mint.** The constant equals the brief's 1,000,000,000 tokens at 18 decimals. Under CREATE2 from a factory stub, the factory holds the whole supply and the transaction origin holds nothing.\n- **Conservation.** Sum of balances stayed equal to total supply under the repository's stateful invariant suite and a 512-run fuzz of my own. Total supply can neither grow nor shrink, because minting is constructor-only and both transfer paths reject the zero address.\n- **Launch flow with this launch's own economics.** The 10% swarm leg, the 88% pool leg and the 2% remainder leg each arrive whole, with no dust since 1e27 divides evenly by 10,000 basis points. A claim empties the distributor exactly. A mirrored Uniswap v4 sync, transfer, settle sequence credits exactly the transferred amount on both the buy and sell legs.\n- **No privileged hand.** The factory cannot pull from a holder without allowance, and the holder can still transfer afterwards. The ABI contains only the three state-changing entry points the verifier listed.\n- **Dependency integrity.** All five vendored OpenZeppelin files and the license are byte-identical to upstream commit dbb6104, which the v5.0.2 tag resolves to. Runtime is 1,752 bytes with no DELEGATECALL, CALLCODE, SELFDESTRUCT or unlinked libraries.\n- **Static analysis leads.** Slither reported nothing. Aderyn's large-literal note points at the correct supply constant and is not a defect.\n\nTwo items are recorded as `unreached` rather than claimed: the real Uniswap v4 PoolManager seed and swap under the protected harness, whose v4-core and launch-library dependencies are not in this tree, and confirmation that the target chain supports the Cancun opcodes the runtime uses, since no network file or chain table was supplied. The approve race is noted in coverage as the standard ERC-20 property the README already documents, not as a finding.","treeHash":null,"usage":{"cachedInputTokens":968074,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":30523,"runtime":"claude","turns":42,"wallClockMs":430186}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9df7d5d52e83c572","findings":[{"citation":"resolved","description":"PrismRiot inherits OpenZeppelin v5.0.2 ERC20 without overriding transferFrom or _update. For every value > 0 the allowance gate in _spendAllowance (lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:308, `if (currentAllowance < value)`) guarantees that only a spender the holder approved can produce a Transfer event whose `from` is that holder. At the value == 0 boundary the comparison 0 < 0 is false, the unchecked `_approve(owner, spender, 0 - 0, false)` (line 312) rewrites the allowance to its existing value with no event, and _update (line 215, `emit Transfer(from, to, value)`) emits Transfer(from, to, 0). So any caller can publish a Transfer log naming any holder as sender and any address as receiver, with no allowance and no balance movement. This is the standard address-poisoning primitive: an attacker can spam Transfer(launchDistributor, lookalikeOfRealRecipient, 0) or Transfer(remainderTo, lookalike, 0) so wallets and explorers show the lookalike in the holder's history. No on-chain balance or allowance changes and no funds move. This behaviour is mandated by ERC-20 (zero-value transfers MUST fire the Transfer event), is OpenZeppelin's deliberate design, is documented in README.md lines 33-35 and 41-42, and is asserted as intended by test/PrismRiot.t.sol test_ZeroTransferFromNeedsNoAllowance. It is therefore recorded as an accepted-risk note rather than a code error. If the author prefers to remove the primitive, an override of transferFrom that reverts when value == 0 and allowance(from, msg.sender) == 0 (or one that requires value > 0) closes it at the cost of deviating from the ERC-20 zero-value rule; the launch flows (factory, distributor, pool manager) never need a zero-value transferFrom, so the launch would not be affected.","line":9,"path":"src/PrismRiot.sol","reproduction":"State: fresh PrismRiot deployed by D (D holds 1e27). D calls transfer(alice, 100e18). allowance(alice, attacker) == 0, attacker never approved by anyone. Call: vm.prank(attacker); token.transferFrom(alice, bob, 0). Expected under the allowance-gate invariant: revert ERC20InsufficientAllowance(attacker, 0, 0) or at least no Transfer log with from == alice. Actual: returns true and emits exactly one log Transfer(alice, bob, 0) from the token; balanceOf(alice) stays 100e18, balanceOf(bob) stays 0, allowance(alice, attacker) stays 0. Verified with a scratch Foundry test (test/scratch/MathBoundary.t.sol, test_ZeroValueTransferFromSpoofsEventWithoutAllowance) that records logs and asserts topics[1] == alice, topics[2] == bob, data == 0. By contrast transferFrom(alice, bob, 1) from the same attacker reverts with ERC20InsufficientAllowance(attacker, 0, 1).","severity":"info","snippet":"contract PrismRiot is ERC20 {","title":"Zero-value transferFrom emits Transfer(from, to, 0) for any `from` without allowance (boundary x invariant seam, ERC-20-conformant)"}],"hash":"3c27357f016d10e02139c172d82fe5d47b0f87a83911c331e587c0560633b3c8","nodeId":"eb5a2b72-bb63-4079-9f58-faf4cb244562","outcome":"completed","summary":"Review complete. The findings file is valid JSON with one informational entry and nine coverage rows, and no tracked file was changed.\n\n**Outcome:** the math in Prism Riot holds. The token is a 16-line wrapper over unmodified OpenZeppelin v5.0.2 ERC20, and nothing in the Math Precision, Boundary or Numerical Gap checklists produces a loss or a broken guarantee.\n\n**What I verified**\n- **Supply constant.** The constant evaluates to 1e27, checked independently against three other spellings, and the whole-token count derived from `decimals()` is exactly one billion with no remainder. The 10% / 88% / 2% launch splits divide with zero modulus and no intermediate overflow.\n- **Inherited arithmetic.** The only subtractions are guarded by explicit less-than reverts, and the unchecked additions are bounded by the fixed supply. Mint and burn branches are unreachable after construction, so the sum of balances stays equal to the total supply.\n- **Boundaries.** Zero, full-balance, max, and max-minus-one amounts, self-transfers at full balance, zero addresses on every side of every entry point, ETH sent to the contract, and unknown selectors all behave as the README states. All five vendored OpenZeppelin files hash identically to upstream v5.0.2.\n- **Test runs.** The project's existing suite passed in full (32 tests, including the fuzz and invariant runs), and my scratch test under `test/scratch/` confirmed each boundary claim above.\n\n**One informational note, not a code error.** A zero-value `transferFrom` from any caller emits a `Transfer(from, to, 0)` log for an arbitrary holder with no allowance. This is the standard address-poisoning primitive, but it is mandated by ERC-20, is OpenZeppelin's design, and the README and the project's own tests already treat it as intended. I recorded it at info severity with an exact reproduction so the author can consciously accept or override it.\n\n**Coverage.** All three listed entry points have rows: approve and transfer hold, transferFrom carries the info note. One row is marked unreached: the Uniswap v4 seed and swap path, which needs platform contracts absent from this repository. The token has no transfer hooks, so no token-side math participates in it.","treeHash":null,"usage":{"cachedInputTokens":812016,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":25804,"runtime":"claude","turns":27,"wallClockMs":378048}},{"artifacts":[],"attempt":1,"bundleHash":"89e81ccf90f53d2b74bb4a90ed34cee2ac7c208f3473234512c0d4ef77c8f3f7","device":"f5dec78d5893d9dc","findings":[],"hash":"5b0f9867994cea1f6fa09d4483e655f84fccd65f9b7fbbd46e3f3337acaea960","nodeId":"37f92525-6c30-46fc-893f-8ede86b018b6","outcome":"completed","summary":"Added 19 edge-case and fuzz tests, and expanded stateful invariants for failure rollback, allowance isolation, supply conservation, and transfer liveness.\n\nOffline `forge build` and `forge test` passed: **51 tests**, including **32,768 randomized handler calls**.\n\nOnly `test/` changed. No implementation defects found.","treeHash":"81ba7e6cfaf0021bf02431d0c536053fac52c333","usage":{"cachedInputTokens":1154560,"inputTokens":88630,"model":"gpt-6-astra","outputTokens":13812,"runtime":"codex","turns":6,"wallClockMs":376684}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02f22d6f13810ca8","findings":[],"hash":"8726afd95175c5a16d9e6f98ad588240e48d4383cf458b219985ac70e5f9ff92","nodeId":"5ac4d87f-1c16-4ebc-8659-f1a89df46c4c","outcome":"completed","summary":"The review is complete. The findings file is written and parses, and no tracked file was changed.\n\n**Outcome: no defects found.** The token is a plain, unmodified OpenZeppelin v5.0.2 ERC-20 with no constructor arguments, a single mint of exactly 10^27 minor units to the deployer, and no privileged entry points.\n\nWhat I verified in my area (Execution Trace, Periphery, First Principles):\n\n- **Execution trace of all three entry points.** Each of approve, transfer and transferFrom reverts atomically on zero addresses, insufficient balance or insufficient allowance, with no partial state writes, no external calls and no callbacks. The max allowance sentinel skips the decrement, which is standard and documented in the README.\n- **Periphery.** The five vendored OpenZeppelin files are byte-identical to the pinned upstream commit, so the base contract hides nothing. There are no git submodules.\n- **First principles on the constructor.** The supply literal that aderyn flagged computes to exactly 10^27, which matches 1,000,000,000 tokens at 18 decimals. Because the token has no transfer rules, every launch flow in the protected harness moves exactly what it says.\n- **Floor requirements.** The compiled ABI contains only the three state-changing functions plus views. An independent opcode scan of the 1752-byte runtime found no DELEGATECALL, CALLCODE or SELFDESTRUCT. The contract name is 9 characters. Build, 32 tests and formatting all pass.\n\nThe coverage record has six rows: one `holds` row for each listed entry point, plus rows for the constructor, the fixed-supply and no-privileged-control invariant, and the opcode and size invariant. Nothing was left unreached.\n\nOne note for the manifest step rather than the author: the README states the launch chain as Ethereum chain ID 1, which I could not check against this launch's network configuration since no network.json is in the tree. That is documentation only and does not affect the code.","treeHash":null,"usage":{"cachedInputTokens":496121,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":8159,"runtime":"claude","turns":20,"wallClockMs":151324}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3987a51ff810f3b9","findings":[{"citation":"resolved","description":"PrismRiot inherits the unmodified OpenZeppelin v5.0.2 ERC20 (vendored files verified byte-identical to upstream commit dbb6104) and overrides nothing. In _spendAllowance the gate is `if (currentAllowance < value)`; for value == 0 the comparison 0 < 0 is false, so no revert occurs, the allowance is rewritten to its existing value with no event, and _update emits Transfer(from, to, 0). Any caller can therefore publish a Transfer log naming any holder as sender and any address as receiver, with no allowance and no balance change. This is the standard address-poisoning primitive (spamming Transfer(distributor, lookalike, 0) so wallets show the lookalike in a holder's history). No funds, balances, allowances or supply are affected. ERC-20 requires zero-value transfers to fire Transfer, OpenZeppelin implements this deliberately, README.md documents it, and test/PrismRiot.t.sol asserts it as intended. Merged from audit_math (the only specialist finding; economics, permissions, flow and the test writer reported nothing). Recorded as an accepted-risk note, not a code error. If the author wants to remove the primitive, override transferFrom to revert when value == 0 and allowance(from, msg.sender) == 0; the launch flows never use a zero-value transferFrom so the floor would be unaffected.","line":9,"path":"src/PrismRiot.sol","reproduction":"State: PrismRiot deployed by D (D holds 1e27); D calls transfer(alice, 100e18); allowance(alice, attacker) == 0 and attacker was never approved by anyone. Call: vm.prank(attacker); token.transferFrom(alice, bob, 0). Expected under a strict allowance-gate invariant: revert ERC20InsufficientAllowance or no Transfer log with from == alice. Actual (verified with test/scratch/Repro.t.sol, test_zeroValueTransferFromEmitsWithoutAllowance, PASS): returns true and emits exactly one log Transfer(alice, bob, 0); balanceOf(alice) == 100e18, balanceOf(bob) == 0, allowance(alice, attacker) == 0 afterwards. Control: the same attacker calling transferFrom(alice, bob, 1) reverts (test_oneWeiTransferFromRevertsWithoutAllowance, PASS).","severity":"info","snippet":"contract PrismRiot is ERC20 {","title":"Zero-value transferFrom emits Transfer(from, to, 0) for any holder without allowance (ERC-20-conformant, accepted risk)"}],"hash":"91dfc30fed0f8f36641a9a674bd2be27ef4f053d20f2c0acf0a9bdc4cbef7df7","nodeId":"0a94001f-dccf-4856-9af9-961a86ceb989","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` and the working tree is otherwise unchanged.\n\n**Outcome:** the token is a plain, unmodified OpenZeppelin v5.0.2 ERC-20 with a single constructor mint, and no defect that would block the launch reproduces. One specialist note survived as an info-level accepted risk.\n\nWhat I verified against the code:\n\n- **Vendored dependencies are genuine.** All five OpenZeppelin files hash byte-identical to upstream commit dbb6104 (v5.0.2). No git submodules exist in the tree.\n- **Full suite passes.** The project's own tests pass, including fuzz and the stateful invariant run.\n- **Supply and deployment.** The constructor mints exactly 10^27 units to msg.sender. The manifest's totalSupply, empty constructorArgs, decimals and contract name all match. Creation and runtime bytecode are well under the size limits, with no DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **The compiled ABI** exposes only approve, transfer and transferFrom as state-changing entry points. There is no owner, mint, burn, pause or freeze surface.\n- **Static-analysis lead.** The aderyn \"large numeric literal\" line is the supply constant, which evaluates to exactly 10^27. Style only.\n\nSpecialist findings settled:\n\n- **audit_math, zero-value transferFrom emits a Transfer log without allowance.** Reproduced with a scratch Foundry test: an unapproved caller running transferFrom(alice, bob, 0) returns true and emits one Transfer(alice, bob, 0) while balances and allowance are unchanged, and the same call with value 1 reverts. This is ERC-20-mandated and documented in the README, so I kept it as info. No revision needed.\n- **Economics, permissions, flow and the test writer** reported nothing, and my own pass found nothing beyond the above.\n\nCoverage: all three entry points answered, with approve and transfer holding and transferFrom tied to the info finding. Three extra rows record the fixed-supply, deployability and static-analysis checks.","treeHash":null,"usage":{"cachedInputTokens":358530,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":7611,"runtime":"claude","turns":10,"wallClockMs":178407}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"824e6de6196c686f","findings":[],"hash":"be5be81846d171f27e349ef3e137c4711a646ad7d43b108c7637afe888ec1571","nodeId":"96d1149a-34b8-4307-9814-1e64ff6d378f","outcome":"completed","summary":"The findings file is in place and excluded by the repository's own git exclude rule, the scratch test is removed, and the working tree has no stray files.\n\n**Result: no defects in the Access Control, Trust Gap or Asymmetry area.** The findings file holds an empty list and a coverage record answering all three listed entry points plus the constructor and four invariants.\n\n**What was checked**\n\n- `src/PrismRiot.sol` is sixteen lines: an unmodified OpenZeppelin v5.0.2 ERC-20 whose constructor mints the whole supply once to the caller. The ABI exposes exactly three state-changing selectors and seven views, nothing else.\n- All five vendored OpenZeppelin files hash identically to the upstream v5.0.2 commit, so no local edit to the transfer, approve or allowance paths exists.\n- Permission model: the only guard anywhere is the identity of the caller. No owner, initializer, minter, pauser, blacklist, seize, upgrade, forwarder, delegatecall or selfdestruct exists, so there is no privileged actor to form a trust gap and no weaker-guarded writer of any storage slot.\n- Asymmetry: the transfer and transferFrom paths share the same internal function and the same zero-address and balance checks. Approve and allowance spending differ only in the Approval event, which is upstream v5 behaviour the README documents.\n- The existing suite of 32 tests, including the 256-sequence invariant run, passes. A scratch probe I ran and removed confirmed that a stranger and the factory cannot spend a holder's balance, an appended ERC-2771 style sender suffix is ignored, ETH sent to the token reverts, and no mint or initialize selector grows supply.\n\n**Trust notes, not defects.** The standard ERC-20 approve race and the absence of an Approval event during allowance spending are design properties of the chosen base contract. Tokens sent to the token address are unrecoverable by design since there is no admin.\n\n**Not covered.** No launch manifest exists in the tree yet, so manifest review was not possible and is not required at this stage. Pool seeding and swaps belong to the network's protected harness and were not simulated here.","treeHash":null,"usage":{"cachedInputTokens":636533,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10566,"runtime":"claude","turns":23,"wallClockMs":158201}},{"artifacts":[],"attempt":1,"bundleHash":"75332203eb5841c525224cc26da156ece553c575c20a04d8ae673698c2c942bf","device":"3592a9be44170f18","findings":[],"hash":"c71e2af2eeed163c346e3404bbebc602326ebcc34d51d9b9f1b27ad00634a99d","nodeId":"418eddec-9a3c-4bb5-8325-cfcb0aca166c","outcome":"completed","summary":"Implemented Prism Riot (PRIO): 1 billion tokens, 18 decimals, minted once to the deployer. Dependencies are vendored, with deployment and operational documentation included.\n\nValidation passed:\n\n- `forge build`\n- `forge test`: 32 tests\n- `forge fmt --check`\n- Fresh offline tests with an empty environment and four threads\n\nThe platform’s protected launch integration remains for its separate harness.","treeHash":"9a9d703129f83dc5eb4a2eece459b41e2f25b270","usage":{"cachedInputTokens":561024,"inputTokens":50216,"model":"gpt-6-astra","outputTokens":14518,"runtime":"codex","turns":6,"wallClockMs":316501}}],"verification":[{"checks":[{"durationMs":1149,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.05s\nCompiler run successful!\n","passed":true},{"durationMs":4425,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/PrismRiot.t.sol:PrismRiotTest\n[PASS] testFuzz_RevertExcessiveAllowanceSpend(uint256) (runs: 512, μ: 119415, ~: 119472)\nLogs:\n  Bound result 399179219382854916103473278\n\n[PASS] testFuzz_RevertExcessiveTransfers(uint256) (runs: 512, μ: 69052, ~: 69383)\nLogs:\n  Bound result 1000000000000000000000000002\n\n[PASS] testFuzz_TransferFromAccounting(uint256,uint256) (runs: 512, μ: 164775, ~: 165611)\nLogs:\n  Bound result 99164784151043649634649750\n  Bound result 115792089237316195423570985008687907853269984665640464874674194740079707919863\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 512, μ: 163981, ~: 166148)\nLogs:\n  Bound result 853039101723302538945027254\n  Bound result 226247055386\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78635)\n[PASS] test_ApproveReplacesAndRevokesAllowanceWithEvents() (gas: 160409)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9741)\n[PASS] test_ConstructorMintsToEOADeployer() (gas: 28203)\n[PASS] test_DeployerCannotSpendHolderBalanceWithoutApproval() (gas: 158001)\n[PASS] test_FactoryReceivesSupplyAndLaunchTransfersArriveWhole() (gas: 669606)\n[PASS] test_MetadataAndInitialSupply() (gas: 107649)\n[PASS] test_NoMintBurnFreezeOrUpgradeEntryPoints() (gas: 1191240)\n[PASS] test_RevertApproveZeroSpender() (gas: 37551)\n[PASS] test_RevertSpendingRevokedAllowance() (gas: 110518)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 37930)\n[PASS] test_RevertTransferFromOverAllowanceIsAtomic() (gas: 115766)\n[PASS] test_RevertTransferFromOverBalanceRollsBackAllowance() (gas: 126242)\n[PASS] test_RevertTransferFromToZeroRollsBackAllowance() (gas: 114176)\n[PASS] test_RevertTransferFromWithoutAllowance() (gas: 57779)\n[PASS] test_RevertTransferFromZeroSender() (gas: 35343)\n[PASS] test_RevertTransferOverBalanceIsAtomic() (gas: 65247)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71882)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1038900)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54012)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 91550)\n[PASS] test_TransferEntireSupply() (gas: 161710)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242011)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139333)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107644)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73331)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81445)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 18.72ms (74.72ms CPU time)\n\nRan 1 test for test/PrismRiot.invariant.t.sol:PrismRiotInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+---------------------+-------+---------+----------╮\n| Contract         | Selector            | Calls | Reverts | Discards |\n+=====================================================================+\n| PrismRiotHandler | approve             | 2710  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | revoke              | 2827  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | spendOverAllowance  | 2834  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transfer            | 2595  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transferFrom        | 2660  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transferOverBalance | 2758  | 0       | 0        |\n╰------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 567328128098292660813916529\n  Bound result 0\n  Bound result 5356\n  Bound result 71064509109208875847443068\n  Bound result 7637\n  Bound result 24576\n  Bound result 0\n  Bound result 0\n  Bound result 53539891558680\n  Bound result 209\n  Bound result 0\n  Bound result 0\n  Bound result 542\n  Bound result 32170\n  Bound result 762\n  Bound result 2905\n  Bound result 1631\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.35s (4.35s CPU time)\n\nRan 2 test suites in 4.35s (4.37s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PrismRiot.approve(address,uint256)\",\"PrismRiot.transfer(address,uint256)\",\"PrismRiot.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.json\":18,\"README.md\":128,\"foundry.toml\":19,\"launch.json\":24,\"remappings.txt\":2,\"src/PrismRiot.sol\":16,\"test/PrismRiot.invariant.t.sol\":129,\"test/PrismRiot.t.sol\":403},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2bf2a9531f779717a185786649e2df89769ee71d0cb329c5c759f32a482a0dd2","verifiedTreeHash":"9a25e045e298242ef86d0b4ad76015e6ca133009","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":1422,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.33s\nCompiler run successful!\n","passed":true},{"durationMs":9592,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/PrismRiot.t.sol:PrismRiotTest\n[PASS] testFuzz_RevertExcessiveAllowanceSpend(uint256) (runs: 512, μ: 119229, ~: 119472)\nLogs:\n  Bound result 564635770162863719558129852\n\n[PASS] testFuzz_RevertExcessiveTransfers(uint256) (runs: 512, μ: 69062, ~: 69383)\nLogs:\n  Bound result 617885161149843498092972060729112564635770162863719558129852\n\n[PASS] testFuzz_TransferFromAccounting(uint256,uint256) (runs: 512, μ: 164570, ~: 165645)\nLogs:\n  Bound result 1324275603141863\n  Bound result 222296664616458084943226786761560275228845977912143306605460079633181510604\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 512, μ: 163884, ~: 166148)\nLogs:\n  Bound result 672740125050431603749423993\n  Bound result 317605525697612979063070025\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78635)\n[PASS] test_ApproveReplacesAndRevokesAllowanceWithEvents() (gas: 160409)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9741)\n[PASS] test_ConstructorMintsToEOADeployer() (gas: 28203)\n[PASS] test_DeployerCannotSpendHolderBalanceWithoutApproval() (gas: 158001)\n[PASS] test_FactoryReceivesSupplyAndLaunchTransfersArriveWhole() (gas: 669606)\n[PASS] test_MetadataAndInitialSupply() (gas: 107649)\n[PASS] test_NoMintBurnFreezeOrUpgradeEntryPoints() (gas: 1191240)\n[PASS] test_RevertApproveZeroSpender() (gas: 37551)\n[PASS] test_RevertSpendingRevokedAllowance() (gas: 110518)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 37930)\n[PASS] test_RevertTransferFromOverAllowanceIsAtomic() (gas: 115766)\n[PASS] test_RevertTransferFromOverBalanceRollsBackAllowance() (gas: 126242)\n[PASS] test_RevertTransferFromToZeroRollsBackAllowance() (gas: 114176)\n[PASS] test_RevertTransferFromWithoutAllowance() (gas: 57779)\n[PASS] test_RevertTransferFromZeroSender() (gas: 35343)\n[PASS] test_RevertTransferOverBalanceIsAtomic() (gas: 65247)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71882)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1038900)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54012)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 91550)\n[PASS] test_TransferEntireSupply() (gas: 161710)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242011)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139333)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107644)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73331)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81445)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 91.59ms (305.92ms CPU time)\n\nRan 19 tests for test/PrismRiot.edge.t.sol:PrismRiotEdgeTest\n[PASS] testFuzz_AllowanceIsScopedToOwnerAndSpender(uint256,uint256) (runs: 1000, μ: 405238, ~: 405404)\nLogs:\n  Bound result 411462729316973844887094169\n\n[PASS] testFuzz_DelegatedSelfTransferSpendsOnlyAllowance(uint256,uint256,uint256) (runs: 1000, μ: 211238, ~: 211348)\nLogs:\n  Bound result 364360640678007483294575014\n  Bound result 364360640678007483294575013\n  Bound result 39383881170334131742783505678874186494136425443974165353861939\n\n[PASS] testFuzz_FailedSpendRemainsUsableAfterFunding(uint256,uint256,bool) (runs: 1000, μ: 355029, ~: 355362)\nLogs:\n  Bound result 307517708883069288597860401\n  Bound result 692654026625956433781841966\n\n[PASS] testFuzz_InvalidRecipientPreservesUsableAllowance(uint256,uint256,bool) (runs: 1000, μ: 235536, ~: 236007)\nLogs:\n  Bound result 999999999999999999999999999\n  Bound result 1137\n\n[PASS] testFuzz_ReducedApprovalCannotSpendTheOldRemainder(uint256,uint256) (runs: 1000, μ: 237931, ~: 238143)\nLogs:\n  Bound result 8502\n  Bound result 7574\n\n[PASS] testFuzz_RoundTripRestoresBalancesAndPreservesApproval(uint256,uint256) (runs: 1000, μ: 253804, ~: 253643)\nLogs:\n  Bound result 7836\n\n[PASS] testFuzz_SplitTransfersMatchOneTransfer(uint256,uint256) (runs: 1000, μ: 227464, ~: 228934)\nLogs:\n  Bound result 5844\n  Bound result 3087\n\n[PASS] test_ContractHolderCanReceiveAndReturnEntireSupplyWithoutCallbacks() (gas: 332216)\n[PASS] test_ExhaustedAllowanceCannotBeSpentTwice() (gas: 195602)\n[PASS] test_HolderNeedsItsOwnApprovalForTransferFrom() (gas: 263180)\n[PASS] test_InfiniteApprovalCanBeReducedAndRevoked() (gas: 366635)\n[PASS] test_MaximumAllowanceDoesNotAuthorizeMoreThanTheBalance() (gas: 129469)\n[PASS] test_MaximumMinusOneAllowanceIsFinite() (gas: 158244)\n[PASS] test_MaximumTransferRevertsWithBalanceError() (gas: 65421)\n[PASS] test_OneWeiCanMakeADirectAndDelegatedRoundTrip() (gas: 185803)\n[PASS] test_SelfTransferStillRequiresSufficientBalance() (gas: 50623)\n[PASS] test_SpenderIsImmediateCallerRegardlessOfTransactionOrigin() (gas: 521550)\n[PASS] test_ZeroDelegatedTransferStillRejectsZeroRecipient() (gas: 79060)\n[PASS] test_ZeroValueApprovalStillRejectsZeroSpender() (gas: 58383)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 91.65ms (630.89ms CPU time)\n\nRan 1 test for test/PrismRiot.invariant.t.sol:PrismRiotInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+-------------------------+-------+---------+----------╮\n| Contract         | Selector                | Calls | Reverts | Discards |\n+=========================================================================+\n| PrismRiotHandler | approve                 | 2620  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | approveAndSpend         | 2479  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | approveInfinite         | 2578  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | approveZeroSpender      | 2444  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | revoke                  | 2556  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | spendOverAllowance      | 2410  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transfer                | 2584  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferFrom            | 2528  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferFromOverBalance | 2538  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferFromToZero      | 2534  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferFullBalance     | 2538  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferOverBalance     | 2470  | 0       | 0        |\n|------------------+-------------------------+-------+---------+----------|\n| PrismRiotHandler | transferToZero          | 2489  | 0       | 0        |\n╰------------------+-------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 8205\n  Bound result 2652612621\n  Bound result 0\n  Bound result 0\n  Bound result 2794\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 409857537716846599229812597\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 646\n  Bound result 0\n  Bound result 490\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1239446557\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 7063\n  Bound result 13\n  Bound result 40000000000000000000\n  Bound result 255\n  Bound result 0\n  Bound result 11786\n  Bound result 0\n  Bound result 0\n  Bound result 9\n  Bound result 0\n  Bound result 935730579488919843559964236\n  Bound result 9\n  Bound result 0\n  Bound result 2012\n  Bound result 0\n  Bound result 26\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.51s (9.51s CPU time)\n\nRan 3 test suites in 9.52s (9.70s CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":35,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PrismRiot.approve(address,uint256)\",\"PrismRiot.transfer(address,uint256)\",\"PrismRiot.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.json\":18,\"README.md\":128,\"foundry.toml\":19,\"remappings.txt\":2,\"src/PrismRiot.sol\":16,\"test/PrismRiot.edge.t.sol\":354,\"test/PrismRiot.invariant.t.sol\":254,\"test/PrismRiot.t.sol\":403},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5b0f9867994cea1f6fa09d4483e655f84fccd65f9b7fbbd46e3f3337acaea960","verifiedTreeHash":"81ba7e6cfaf0021bf02431d0c536053fac52c333","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":1059,"exitCode":0,"name":"build","output":"Compiling 27 files with Solc 0.8.26\nSolc 0.8.26 finished in 967.08ms\nCompiler run successful!\n","passed":true},{"durationMs":4610,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/PrismRiot.t.sol:PrismRiotTest\n[PASS] testFuzz_RevertExcessiveAllowanceSpend(uint256) (runs: 512, μ: 119160, ~: 119484)\nLogs:\n  Bound result 34391154199928954\n\n[PASS] testFuzz_RevertExcessiveTransfers(uint256) (runs: 512, μ: 69045, ~: 69383)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665639564039457584007913129640618\n\n[PASS] testFuzz_TransferFromAccounting(uint256,uint256) (runs: 512, μ: 164838, ~: 165609)\nLogs:\n  Bound result 729546882164236504451115390\n  Bound result 115792089237316195423570985008687907853269984665639834492575419771408678569477\n\n[PASS] testFuzz_TransfersConserveSupply(uint256,uint256) (runs: 512, μ: 164553, ~: 166148)\nLogs:\n  Bound result 435272335121002570942109320\n  Bound result 280984965621807305543851963\n\n[PASS] test_ApprovalDoesNotRequireBalance() (gas: 78635)\n[PASS] test_ApproveReplacesAndRevokesAllowanceWithEvents() (gas: 160409)\n[PASS] test_ConstructorEmitsExactlyOneMint() (gas: 9741)\n[PASS] test_ConstructorMintsToEOADeployer() (gas: 28203)\n[PASS] test_DeployerCannotSpendHolderBalanceWithoutApproval() (gas: 158001)\n[PASS] test_FactoryReceivesSupplyAndLaunchTransfersArriveWhole() (gas: 669606)\n[PASS] test_MetadataAndInitialSupply() (gas: 107649)\n[PASS] test_NoMintBurnFreezeOrUpgradeEntryPoints() (gas: 1191240)\n[PASS] test_RevertApproveZeroSpender() (gas: 37551)\n[PASS] test_RevertSpendingRevokedAllowance() (gas: 110518)\n[PASS] test_RevertTransferFromEmptyAccount() (gas: 37930)\n[PASS] test_RevertTransferFromOverAllowanceIsAtomic() (gas: 115766)\n[PASS] test_RevertTransferFromOverBalanceRollsBackAllowance() (gas: 126242)\n[PASS] test_RevertTransferFromToZeroRollsBackAllowance() (gas: 114176)\n[PASS] test_RevertTransferFromWithoutAllowance() (gas: 57779)\n[PASS] test_RevertTransferFromZeroSender() (gas: 35343)\n[PASS] test_RevertTransferOverBalanceIsAtomic() (gas: 65247)\n[PASS] test_RevertTransferToZeroAddressIncludingZeroAmount() (gas: 71882)\n[PASS] test_RuntimeHasNoForbiddenOpcodesAndFitsDeploymentLimit() (gas: 1038900)\n[PASS] test_SelfTransferPreservesBalance() (gas: 54012)\n[PASS] test_TransferEmitsEventAndMovesExactAmount() (gas: 91550)\n[PASS] test_TransferEntireSupply() (gas: 161710)\n[PASS] test_TransferFromConsumesFiniteAllowanceAndEmitsTransfer() (gas: 242011)\n[PASS] test_TransferFromPreservesInfiniteAllowance() (gas: 139333)\n[PASS] test_TransferFromToSelfConsumesAllowanceWithoutChangingBalance() (gas: 107644)\n[PASS] test_ZeroTransferFromEmptyAccountEmitsEvent() (gas: 73331)\n[PASS] test_ZeroTransferFromNeedsNoAllowance() (gas: 81445)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 17.29ms (67.24ms CPU time)\n\nRan 1 test for test/PrismRiot.invariant.t.sol:PrismRiotInvariantTest\n[PASS] invariant_SupplyBalancesAndAllowancesMatchModel() (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+---------------------+-------+---------+----------╮\n| Contract         | Selector            | Calls | Reverts | Discards |\n+=====================================================================+\n| PrismRiotHandler | approve             | 2671  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | revoke              | 2772  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | spendOverAllowance  | 2702  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transfer            | 2809  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transferFrom        | 2647  | 0       | 0        |\n|------------------+---------------------+-------+---------+----------|\n| PrismRiotHandler | transferOverBalance | 2783  | 0       | 0        |\n╰------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 615032376068380957599676994\n  Bound result 0\n  Bound result 8\n  Bound result 2\n  Bound result 52475831085750596928965930\n  Bound result 6\n  Bound result 704\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 178182492472382616349007865\n  Bound result 0\n  Bound result 0\n  Bound result 23596847774926725166116985\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.52s (4.52s CPU time)\n\nRan 2 test suites in 4.53s (4.54s CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PrismRiot.approve(address,uint256)\",\"PrismRiot.transfer(address,uint256)\",\"PrismRiot.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.json\":18,\"README.md\":128,\"foundry.toml\":19,\"remappings.txt\":2,\"src/PrismRiot.sol\":16,\"test/PrismRiot.invariant.t.sol\":129,\"test/PrismRiot.t.sol\":403},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":362,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":211,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/PrismRiot.sol:11: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c71e2af2eeed163c346e3404bbebc602326ebcc34d51d9b9f1b27ad00634a99d","verifiedTreeHash":"9a9d703129f83dc5eb4a2eece459b41e2f25b270","verifierVersion":"0.1.0+fdeb4d4a"}]}