{"assessments":[],"deployments":[{"attestationHash":"483e424c312910626fde4a4a634694e1793acf02234067c33f120a10738b83a2","chainId":4663,"contracts":[{"address":"0xb8574e24b1821c22a82f297266c328d1cfee7efc","blockNumber":108514529,"name":"ConditionalsToken","role":"token","txHash":"0x17f9757b41bd748aa751369c82d03b732aabf0eacddeb944969491bf64875c29"},{"address":"0xe65c878231f3daa29e7f96eed1e106296888d1ac","blockNumber":108514529,"name":"MerkleDistributor","role":"distributor","txHash":"0x17f9757b41bd748aa751369c82d03b732aabf0eacddeb944969491bf64875c29"},{"address":"0x19bec7c2e1b2aadaf67b259744751a9960d66000","blockNumber":108514529,"name":"PoolInitializationGuard","role":"hook","txHash":"0x17f9757b41bd748aa751369c82d03b732aabf0eacddeb944969491bf64875c29"}],"id":"56a6cbc9-ef70-452d-9934-1041304c8b7c","manifestHash":"d7fb6db67a67241d2ad703e3de997627d9d0a9c781cefbd417549edb507964db","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":"7d72a1f3-1f74-4799-bd9a-0fa3c5979d49","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2d11685091b1722ce6d575f56e35571195fc9e18a2adac7d4dae31a39ae0af47","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":"75971dea586df86e63f9fde45223802467e7867c497fbd21d96a1e76054ac853","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":"327d08b5501e9ef937171a53d7e09a3c888ffac322a84329cc7e372758412cf3","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":"c92bd71b364132d2327b6486a115a6ce7a8451ef58a3fa724cc68d4492ef4b8f","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":"e364a56bc80f260ca8996a7a0e5408b4f25130e57189d71092f314e491a451f1","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":"37260563f2bef8ad435ef87232c70e17ecc483088671fe40595e293d1cb46c1b","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":"e88d9ac7a5af337a6596e231ecec99a19dec482258a2dd00d52ef1a285c32f39","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"4928521f183f15d8e6b55ea2c5ab33498e429d8d903f08be512412980a8a401b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"68506fdcd4ed07ed9dcf40cddecfe9a7d7282e399586d1d75a902eca2f5d692b","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"68506fdcd4ed07ed9dcf40cddecfe9a7d7282e399586d1d75a902eca2f5d692b","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Conditionals (COND).\nToken name: Conditionals\nToken symbol: COND\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"7708b16e873e449d0d8dc8c027fd5557aa99a5ce0184c29c77e487a488c0fa32","previousHash":"f7490e3ada02f4c49c9ab3b985699116abc0112baab78d4500c5c73824dca863","projectId":"7d72a1f3-1f74-4799-bd9a-0fa3c5979d49","publication":{"commit":"63eead44a4ddd789d6908bffa90b2a12c803ad78","deliveredAt":"2026-11-07T15:34:49.975Z","repoUrl":"https://github.com/identity-md-launches/launch-3113-conditionals"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"3a9244db52554d1467eb0001e639d815869ef4faea7883d91770ab24fd8bd8c8","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fd5402086dce252e","findings":[],"hash":"2d11685091b1722ce6d575f56e35571195fc9e18a2adac7d4dae31a39ae0af47","nodeId":"2ff2dec1-2f6a-42e0-9254-5151d544f418","outcome":"completed","summary":"The economics review of the Conditionals (COND) token found no defects. The findings file is written with an empty list and seven coverage rows, and nothing else in the tree was changed.\n\n**What the code is.** `src/ConditionalsToken.sol` is 41 lines: three constants, a constructor that mints the whole supply to msg.sender, and a decimals override. Everything else is OpenZeppelin ERC20 v5.4.0, and I confirmed the five vendored files are byte-identical to upstream by hash comparison.\n\n**What I checked against the three guides, all holding:**\n- **Economic Security.** No external dependency, oracle, callback, or ether path. No fee, tax, rebasing, pause, or blacklist, so no \"assumed versus received\" gap exists. Sentinel inputs revert: transfer to the zero address and approve of a zero spender. The ERC-20 approve race is present and reproduced, but it is the standard v5 semantics the README documents, not a defect.\n- **Invariant.** Sum of balances equals totalSupply equals 1e27 after fuzzed 40-step random transfer chains. Supply can neither grow nor shrink: the only mint is the constructor, there is no burn, and burn-to-zero reverts. Self-transfer is a no-op. Constants match the manifest: 18 decimals, supply 1000000000000000000000000000, no constructor arguments, contract name 17 characters.\n- **Flow Gap.** The 10/80/10 launch split leaves the factory at zero and arrives whole at each destination. A PoolManager stand-in doing a low-level take and a sync/settle-style balance delta both move exactly the stated amount, so the seed, a buy, a sell, and a distributor claim all deliver in full.\n\n**Leads from static analysis.** Slither reported nothing. Aderyn's large-numeric-literal line is the readable supply constant and is not a defect.\n\n**Coverage.** All three entry points (approve, transfer, transferFrom) are marked holds, with four additional invariant rows. Nothing was left unreached. The project's 31 tests pass, and my 5 scratch tests passed before I removed the scratch directory.\n\n**One open item outside my area, not a finding.** The build uses solc 0.8.26 with its default cancun target, so the bytecode contains PUSH0. That is fine on any current Arbitrum Orbit chain, and I had no chain evidence suggesting otherwise, so I did not report it.","treeHash":null,"usage":{"cachedInputTokens":428092,"cost":{"source":"runtime","usdMicros":2254318},"inputTokens":226,"model":"claude-fable-5-1","outputTokens":13600,"runtime":"claude","turns":21,"wallClockMs":196929}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a0f92fec784312b7","findings":[{"citation":"resolved","description":"Merged from audit_flow (its only finding; math, permissions, economics and the independent tester reported none). The token inherits OpenZeppelin v5.4.0 ERC20 unmodified: all five vendored files hash byte-identical to upstream v5.4.0 (ERC20.sol sha256 9f906af4...96bd). approve() overwrites the allowance absolutely, so a holder who lowers an existing allowance can be front-run by the spender, who spends the old allowance and then the new one. OpenZeppelin v5 removed increaseAllowance/decreaseAllowance and the token adds no ERC20Permit, so the holder's only mitigation is approve(spender, 0) first. This is the behaviour of the ERC-20 standard and of every OZ v5 token; the README states v5 semantics are intended and the brief asks for no transfer rules, so it is recorded as a holder trust note. No change is required for launch. Optional: document approve-to-zero-first in the README's holder responsibilities, or add ERC20Permit (does not change supply or transfer rules).","line":120,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"Reproduced with test/scratch/Review.t.sol:test_approveRaceSpends150 against this tree (passes, i.e. the race occurs). State: OWNER deploys and holds 1e27. 1) OWNER: approve(SPENDER, 100). 2) SPENDER: transferFrom(OWNER, SINK, 100). 3) OWNER: approve(SPENDER, 50), intending to reduce 100 -> 50. 4) SPENDER: transferFrom(OWNER, SINK, 50). Expected by the owner: at most 100 ever spendable. Actual: balanceOf(SINK) == 150. Lines: ERC20.sol:120-123 (approve calls _approve(owner, spender, value) which sets _allowances[owner][spender] = value) and ERC20.sol:142-146 (transferFrom calls _spendAllowance then _transfer).","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {","title":"approve() carries the standard ERC-20 allowance race; no increaseAllowance/permit path is offered (trust note, not a defect)"}],"hash":"327d08b5501e9ef937171a53d7e09a3c888ffac322a84329cc7e372758412cf3","nodeId":"5609676f-245c-40ff-9840-320af61cc7cf","outcome":"completed","summary":"Review complete. The Conditionals token has no defects; the findings file holds one info-level trust note and a full coverage record.\n\n**What I checked**\n\n- The token is a 41-line wrapper over OpenZeppelin ERC20 with a no-argument constructor that mints 1e27 to msg.sender and a `decimals()` override returning 18. It adds no other code.\n- All five vendored OpenZeppelin files hash byte-identical to upstream v5.4.0, fetched from GitHub for comparison. The specialists' claim of an unmodified base is confirmed.\n- The build succeeds and all 55 project tests pass. My scratch tests confirmed supply, metadata, ether rejection, allowance scoping and code sizes, then were removed.\n- Deployability holds: no constructor arguments, no external calls in the constructor, creation code and runtime far under the protocol limits, and the manifest uses only schema keys with the exact supply.\n\n**Specialist findings**\n\n- Four specialists and the tester reported nothing. The flow specialist reported the standard ERC-20 approve overwrite race as info. I reproduced it: approve 100, spend 100, approve 50, spend 50 leaves the sink with 150. It is the behaviour of the ERC-20 standard itself and of every OpenZeppelin v5 token, so I kept it as an info trust note, not a defect, with the reproduction and the exact line in the vendored ERC20.sol. No merge was needed since it was the only finding.\n- The aderyn large-numeric-literal lead is the supply constant written with underscores and a power of ten. It equals the manifest value exactly and is not a defect.\n\n**Coverage**\n\nAll three entry points are answered: approve points to the info note, transfer and transferFrom hold. Three invariant rows cover fixed supply, factory deployability and exact launch flows.\n\nThe working tree is unchanged apart from the required .imd-findings.json.","treeHash":null,"usage":{"cachedInputTokens":405146,"cost":{"source":"runtime","usdMicros":1626238},"inputTokens":258,"model":"claude-fable-5-1","outputTokens":8440,"runtime":"claude","turns":22,"wallClockMs":327482}},{"artifacts":[],"attempt":1,"bundleHash":"f1cf7d2e855199fc4e7ca9cacd7a75c59924e9171a2c57320fe59813abba11a8","device":"74a99f640688d37b","findings":[],"hash":"37260563f2bef8ad435ef87232c70e17ecc483088671fe40595e293d1cb46c1b","nodeId":"4d75d56e-ee4d-4871-8e90-309d6b145855","outcome":"completed","summary":"The Conditionals (COND) token is built, tested, documented and committed on `main` as commit 589fc8c.\n\n**What was delivered**\n\n- `src/ConditionalsToken.sol`: a fixed-supply ERC-20 on unmodified OpenZeppelin ERC20 v5.4.0. Name Conditionals, symbol COND, 18 decimals, 10^27 minor units minted once to `msg.sender` in the constructor. No constructor arguments, no owner, no mint, pause, blacklist, fee, upgrade, delegatecall or selfdestruct, so it meets every item in the pinned protected floor.\n- `foundry.toml`: solc pinned to 0.8.26, `bytecode_hash = \"none\"`, optimizer on, ffi off, no fs permissions, remappings inline.\n- `lib/`: forge-std v1.11.0 and the five OpenZeppelin files ERC20 needs, committed as plain files with licences. No submodules, no nested git metadata.\n- `script/DeployConditionals.s.sol`: a reference script whose `deploy()` holds the whole logic and is called directly by a test. It reads no environment.\n- `test/ConditionalsToken.t.sol`: 31 tests covering metadata, exact supply, minting to an EOA and through CREATE2 from a factory stub, transfer and transferFrom success and failure paths with exact error selectors, the launch flows arriving whole, the full admin-selector sweep from a stranger and the deployer, bytecode opcode scan, EIP-170 size, and four fuzz tests for supply conservation and allowance handling.\n- `README.md`: behaviour, deployment parameters for the Robinhood Chain launch, an empty \"After launch\" section since nothing is configurable, assumptions, operational responsibilities and security notes.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| forge build (clean, offline) | passes |\n| forge test with the verifier's fuzz seed | 31 passed, 0 failed |\n| forge fmt --check | passes |\n\n**Not run**: Slither is not on this machine. The contract adds only three constants and a `decimals()` override on top of OpenZeppelin's ERC20, so none of the six rejecting detectors have code to match. The README states this.\n\n**Nothing is left open for the requester.** The brief fixed every value, and the token has no owner-settable settings.","treeHash":"ea6d9671607101f8daaf5cc1ffdd5855e20c4a42","usage":{"cachedInputTokens":698281,"cost":{"source":"runtime","usdMicros":2225387},"inputTokens":482,"model":"claude-fable-5-1","outputTokens":20707,"runtime":"claude","turns":18,"wallClockMs":257495}},{"artifacts":[],"attempt":1,"bundleHash":"1855afa1fd3cbda3c762a2ed66358dbadaed8610222bb48924ac6bef1e29ae92","device":"234a4a00ca903cb9","findings":[],"hash":"4928521f183f15d8e6b55ea2c5ab33498e429d8d903f08be512412980a8a401b","nodeId":"dd588f52-9975-4433-ac27-1f3a7a4729c3","outcome":"completed","summary":"I tested the Conditionals (COND) token and found no defects, so there is no `.imd-findings.json`. `forge build` succeeds and `forge test` passes all 55 tests (the 31 already there plus 24 new ones) using the verifier's fuzz seed.\n\n**What the contract is:** `src/ConditionalsToken.sol` is plain OpenZeppelin ERC20 v5.4.0. The vendored copy's transfer, allowance and approval code is the standard library, and the token only adds three constants, a constructor that mints 10²⁷ (one billion with 18 decimals) to the deployer, and a fixed `decimals()` of 18. It has no owner, mint, burn, fee, pause or way to receive ether. The edge cases I tried all behaved the way the standard library should.\n\n**New: `test/ConditionalsToken.invariant.t.sol`**\n- A test contract makes random sequences of calls across six accounts: the deployer, a distributor stand-in, the `remainderTo` address and three others. Alongside the token it keeps its own record of every balance and allowance.\n- It also makes calls that must fail: sending more than the balance, sending to the zero address, spending beyond or above an allowance, approving the zero address, and sending ether. For each it checks that the call reverts with the exact expected error and changes nothing.\n- After every call it checks seven rules:\n  - the total supply never changes;\n  - the six accounts' balances add up to the whole supply;\n  - every balance matches the independent record;\n  - every allowance matches the independent record;\n  - no call that should fail succeeded or failed with the wrong error;\n  - the token never holds ether;\n  - the name, symbol and decimals never change.\n- It ran 256 sequences of 64 calls each (16,384 calls), with no unexpected reverts. Each of the nine call types ran about 1,800 times, so every rule was checked against real activity.\n\n**New: `test/ConditionalsToken.edges.t.sol`** (20 unit tests and 3 fuzz tests at 1,000 runs) covers inputs the existing suite didn't:\n- **Zero address:** the zero address as sender or approver; pulling from the zero address, including with an amount of 0, which reverts with `ERC20InvalidApprover`.\n- **Error order:** when a pull has both no allowance and a zero-address receiver, the allowance error is the one reported.\n- **Self pulls:** a holder needs an allowance to pull from their own account, and pulling to the same account spends allowance but keeps the balance.\n- **Approvals:**\n  - approve replaces the old allowance rather than adding to it, and approving 0 revokes it;\n  - an allowance only works in the direction it was given;\n  - an allowance can exceed the balance, but a pull is still capped by the balance;\n  - an allowance of `max − 1` still goes down, and an exact allowance is fully used up.\n- **Logs and deployments:**\n  - a pull emits only a `Transfer` log;\n  - separate deployments don't share balances;\n  - unknown functions revert.\n\nThe two files are staged but **not committed**: `git commit` failed because no git author name or email is configured on this machine. I didn't set one, since that is the machine's configuration. Whatever uploads this run needs to commit them, or set an identity and run the commit.","treeHash":"f0376f320bc5d05e72c1e8db09adabadc983179a","usage":{"cachedInputTokens":425711,"cost":{"source":"runtime","usdMicros":724988},"inputTokens":19,"model":"claude-opus-5-5","outputTokens":13467,"runtime":"claude","turns":12,"wallClockMs":158766}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30bcdea6dcb9ee40","findings":[{"citation":"resolved","description":"This is the behaviour of the ERC-20 standard itself and of the unmodified OpenZeppelin v5.4.0 base (verified byte-identical to upstream), and the README states v5 semantics are intended, so it is recorded as a trust note for holders rather than a defect. approve() overwrites the allowance absolutely. An owner who lowers an existing allowance can be front-run by the spender, who spends the old allowance and then the new one. OpenZeppelin v5 removed increaseAllowance/decreaseAllowance and this token adds no ERC20Permit, so a holder's only mitigation is to approve(spender, 0) first and confirm it mined. No change is required for the launch; if the author wants to narrow the window they could add ERC20Permit (does not change supply or transfer rules) or document the approve-to-zero-first practice in the README's holder responsibilities.","line":120,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: OWNER holds supply. 1) OWNER: approve(SPENDER, 100). 2) SPENDER (front-running the next tx): transferFrom(OWNER, SINK, 100). 3) OWNER: approve(SPENDER, 50) intending to reduce 100 -> 50. 4) SPENDER: transferFrom(OWNER, SINK, 50). Expected by the owner: at most 100 ever spendable. Actual: balanceOf(SINK) == 150. Confirmed with a Foundry test (test_approveRaceSpends150) against this tree.","severity":"info","snippet":"    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }","title":"approve() carries the standard ERC-20 allowance race; no increaseAllowance/permit path is offered"}],"hash":"75971dea586df86e63f9fde45223802467e7867c497fbd21d96a1e76054ac853","nodeId":"e4bdb7fd-2c67-4e34-b053-f2f51880aea4","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome: no defect found in the control-flow area.** The token is a 41-line wrapper over an unmodified OpenZeppelin v5.4.0 ERC20, and every entry point behaves as the README and manifest state. `.imd-findings.json` holds one informational note and nine coverage rows.\n\n**What I checked, by guide:**\n- **Execution Trace.** Traced `approve`, `transfer` and `transferFrom` through `_approve`, `_transfer`, `_spendAllowance` and `_update`. Allowance is spent before the balance check and both revert atomically. The max-uint allowance sentinel is never decremented and max-1 decrements normally. There are no external calls, hooks or partial writes, so a hostile receiver cannot reenter or block a transfer.\n- **Periphery.** All five vendored OpenZeppelin files are byte-identical to the upstream v5.4.0 tag. An opcode scan of creation and runtime bytecode found no CALL-family, DELEGATECALL, CALLCODE or SELFDESTRUCT. The runtime does use PUSH0 and MCOPY, so I ran a PUSH0+MCOPY init-code eth_call against a public Robinhood Chain RPC (chain id 4663). It executed, and ArbSys reports a Cancun-capable ArbOS.\n- **First Principles.** The constructor mints exactly 1e27 to `msg.sender`, not `tx.origin`, under both CREATE and CREATE2. That equals the manifest's totalSupply string. No mint, burn, owner, pause or rescue path exists in the ABI. The aderyn large-literal lead evaluates to the correct value and is style only.\n\n**The one finding (info).** `approve` carries the standard ERC-20 allowance race: approve 100, spender front-runs 100, owner approves 50, spender spends 50 more, 150 total. This is inherent to the standard and the author's declared v5 semantics, so it is recorded as a holder trust note, not a defect. No change is needed for launch.\n\n**Verification.** The project's 31 tests pass. I confirmed each traced claim with seven scratch tests, all passing, then deleted `test/scratch/` so the tree is as I found it.\n\n**Not reached.** The protected floor test could not be run locally because it needs v4-core and the launch harness, which are not vendored. The project's own launch-flow test covers the same transfers.\n\nSources:\n- [Chainstack: What is Robinhood Chain](https://chainstack.com/what-is-robinhood-chain/)\n- [NodeFlare Robinhood Chain RPC endpoint](https://nodeflare.app/docs/endpoints/robinhood)\n- [Chainstack Robinhood tooling](https://docs.chainstack.com/docs/robinhood-tooling)","treeHash":null,"usage":{"cachedInputTokens":1016717,"cost":{"source":"runtime","usdMicros":2900506},"inputTokens":418,"model":"claude-fable-5-1","outputTokens":18542,"runtime":"claude","turns":30,"wallClockMs":264343}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"93c37f17670e4d98","findings":[],"hash":"c92bd71b364132d2327b6486a115a6ce7a8451ef58a3fa724cc68d4492ef4b8f","nodeId":"7654a010-6356-446e-a8e7-14e31772e1d6","outcome":"completed","summary":"The review is complete. The math, boundary and numerical-gap passes found no defects in the Conditionals token, and `.imd-findings.json` holds an empty findings list with nine coverage rows.\n\n**What was checked**\n\n- **Source and dependency integrity.** The token is 41 lines over OpenZeppelin ERC20. All five vendored library files are byte-identical to the upstream v5.4.0 tag, so the arithmetic under review is the audited OpenZeppelin path, not a modified copy.\n- **Math Precision.** The only arithmetic in the project's own code is the compile-time supply constant, which evaluates to exactly 10^27. There is no division, fee, scale conversion or narrowing cast anywhere, so none of the rounding, truncation or downcast failure modes apply. The library's unchecked subtractions are guarded by the balance compare, and the unchecked additions are bounded by the one-time mint.\n- **Boundary.** The contract makes no external calls, has no payable function, no receive or fallback, and decodes no bytes. The only sentinel branches are the library's zero-address checks, which revert on both sides as intended. Scratch tests probed amount zero, the whole supply, supply plus one, max uint, allowance of max minus one, allowance exactly equal to the amount, allowance above balance, self-transfer and transferFrom with from equal to to.\n- **Numerical Gap.** The supply conservation invariant is exact because no precision is ever lost. The launch's ten, eighty and ten percent split of the supply divides with zero remainder, so no dust is stranded at the factory.\n- **Static-analysis lead.** The aderyn large-literal note at line 30 is style only; the literal is correct and matches the brief.\n\n**Coverage.** All three listed entry points are recorded as holds, with six additional rows for the supply, conservation, decimals, boundary, dependency and static-analysis checks. The existing 31-test suite passes. The scratch tests I wrote were removed, and no repository file was changed.","treeHash":null,"usage":{"cachedInputTokens":489142,"cost":{"source":"runtime","usdMicros":2229192},"inputTokens":226,"model":"claude-fable-5-1","outputTokens":11561,"runtime":"claude","turns":21,"wallClockMs":191021}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f494611affb5524c","findings":[],"hash":"e364a56bc80f260ca8996a7a0e5408b4f25130e57189d71092f314e491a451f1","nodeId":"4b15da16-23e5-45ac-810a-f4627cba93b1","outcome":"completed","summary":"The review is complete. The permissions audit of the Conditionals (COND) token found no defects, and the findings file holds an empty list with a nine-row coverage record.\n\n**What was reviewed**\n\n- `src/ConditionalsToken.sol` is a 41-line wrapper over OpenZeppelin ERC20 with a constructor mint and a `decimals()` override. The compiled ABI has exactly three state-changing selectors: approve, transfer and transferFrom.\n- The five vendored OpenZeppelin files hash identically to upstream v5.4.0, so every entry point runs unmodified library code.\n- The project builds on solc 0.8.26 and its 31 tests pass. Formatting is clean.\n\n**Access Control pass.** There is no role, modifier, initializer, proxy, delegatecall, selfdestruct, receive or fallback. Every storage slot has exactly one writer path per entry point, and each is keyed on the caller: balances move only from msg.sender or from an account that approved msg.sender, and allowances are written only in the caller's own row. The deployer keeps no power after the constructor returns.\n\n**Asymmetry pass.** The paired writers of the allowance mapping, approve and the internal spend path, validate the same zero-address conditions and differ only in event emission, which is OpenZeppelin's documented v5 behavior. Transfer and transferFrom share one internal path, so neither branch skips a check the other runs. The mint and burn branches of the balance update are unreachable from the public surface because both zero-address sides are rejected first, keeping total supply constant.\n\n**Trust Gap pass.** The token has no settable parameter, fee, price or recipient, so no seam between authorization and value flow exists. The only trust assumption is the launch design itself: the factory holds the full supply at deployment and distributes it.\n\n**Verification run.** Beyond reading, I executed a scratch Foundry probe of seven tests covering third-party allowance spending, factory residual power, zero-address actors on all three entry points, self-transferFrom, event asymmetry and a fuzz over supply constancy. All passed, and the scratch directory was removed afterwards.\n\n**Static analysis leads.** Slither reported nothing. Aderyn's low-severity large-numeric-literal note on line 30 is a compile-time constant equal to the manifest supply and is style only.\n\n**Not reached.** Nothing in the assigned area was left unexamined. The x-ray deployment-phase and Trail of Bits inventory items were also checked. The deploy script's `run()` broadcasts from whatever signer forge is given, which the README documents as a local reference only and is outside the launch path.","treeHash":null,"usage":{"cachedInputTokens":454125,"cost":{"source":"runtime","usdMicros":2234210},"inputTokens":226,"model":"claude-fable-5-1","outputTokens":14511,"runtime":"claude","turns":31,"wallClockMs":212678}},{"artifacts":[],"attempt":1,"bundleHash":"77e7bcb3849fca0768a7180f0116b64affa567879e646e33da21dbe74af9b181","device":"9812c5faf226f7c7","findings":[],"hash":"e88d9ac7a5af337a6596e231ecec99a19dec482258a2dd00d52ef1a285c32f39","nodeId":"1d1bae3f-3367-484e-a748-19167951bf98","outcome":"completed","summary":"Done. I wrote launch.json for the Conditionals (COND) custom token launch, and it is the only changed file.\n\nWhat the manifest describes, matching the accepted tree:\n\n- **Token** is the Solidity contract ConditionalsToken, name Conditionals, symbol COND, 18 decimals. Its constructor takes no arguments, so constructorArgs is empty.\n- **totalSupply** is the contract's TOTAL_SUPPLY constant, one billion tokens in minor units, minted once to msg.sender.\n- **Application contracts** list is empty. The accepted tree contains only the token and its deploy script, so nothing else is named.\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 verbatim economics object.\n- **Notes** describe the token's fixed supply, lack of any privileged or fee logic, and the absence of application contracts and initialization calls.\n\nVerification results:\n\n- A script check confirmed the JSON parses, uses only the schema's six top-level keys, and that the supply string equals the contract constant. Notes are well under the character limit.\n- The build compiled cleanly with solc 0.8.26.\n- All 31 existing tests passed with the verifier's fuzz seed.\n- Git status shows launch.json as the only new file. No configuration, library or workflow files were touched.","treeHash":"be1560440db8f9176246723021d1d8c79839646a","usage":{"cachedInputTokens":167887,"cost":{"source":"runtime","usdMicros":881010},"inputTokens":162,"model":"claude-fable-5-1","outputTokens":3141,"runtime":"claude","turns":11,"wallClockMs":44566}}],"verification":[{"checks":[{"durationMs":1323,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.23s\nCompiler run successful!\n","passed":true},{"durationMs":135,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 235245, ~: 239439)\nLogs:\n  Bound result 7000000000000000000\n  Bound result 1000000000000000000\n  Bound result 2827\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92896, ~: 93281)\nLogs:\n  Bound result 22031\n  Bound result 938463463382104192593825975\n\n[PASS] testFuzz_transferConservesSupplyAndDeliversExactly(address,uint256) (runs: 256, μ: 99565, ~: 99945)\nLogs:\n  Bound result 803277823021400131599398819\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 124747, ~: 108314)\nLogs:\n  Bound result 1\n  Bound result 747362820501410070595866810\n\n[PASS] test_approveRevertsForZeroSpender() (gas: 30759)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60005)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 14132)\n[PASS] test_create2DeploymentFromAContractMintsToThatContract() (gas: 885854)\n[PASS] test_deployScriptMintsToTheScriptCaller() (gas: 1527962)\n[PASS] test_deployerCannotPullWithoutAllowance() (gas: 89847)\n[PASS] test_launchFlowsArriveWhole() (gas: 259338)\n[PASS] test_metadata() (gas: 53111)\n[PASS] test_noCallIncreasesSupply() (gas: 641116)\n[PASS] test_noEtherAccepted() (gas: 36537)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 415798)\n[PASS] test_runtimeFitsEip170() (gas: 5148)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1265165)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19170)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 80818)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 138790)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33566)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 138852)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrement() (gas: 113071)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 80331)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33199)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 85787)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30901)\n[PASS] test_transferToSelfKeepsBalance() (gas: 38161)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 65672)\n[PASS] test_transferZeroAmountSucceeds() (gas: 40058)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 15575)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 15.17ms (58.14ms CPU time)\n\nRan 1 test suite in 16.10ms (15.17ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":74,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":26,\"script/DeployConditionals.s.sol\":24,\"src/ConditionalsToken.sol\":41,\"test/ConditionalsToken.t.sol\":448},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":601,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":307,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/ConditionalsToken.sol:30: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"37260563f2bef8ad435ef87232c70e17ecc483088671fe40595e293d1cb46c1b","verifiedTreeHash":"ea6d9671607101f8daaf5cc1ffdd5855e20c4a42","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":1744,"exitCode":0,"name":"build","output":"Compiling 30 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.62s\nCompiler run successful!\n","passed":true},{"durationMs":8912,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 234125, ~: 239439)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 10000000000000000000\n  Bound result 0\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92667, ~: 93281)\nLogs:\n  Bound result 17317\n  Bound result 999999999999999999999999999\n\n[PASS] testFuzz_transferConservesSupplyAndDeliversExactly(address,uint256) (runs: 256, μ: 99481, ~: 99945)\nLogs:\n  Bound result 214138950\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 125249, ~: 108314)\nLogs:\n  Bound result 22031\n  Bound result 10000\n\n[PASS] test_approveRevertsForZeroSpender() (gas: 30759)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60005)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 14132)\n[PASS] test_create2DeploymentFromAContractMintsToThatContract() (gas: 885854)\n[PASS] test_deployScriptMintsToTheScriptCaller() (gas: 1527962)\n[PASS] test_deployerCannotPullWithoutAllowance() (gas: 89847)\n[PASS] test_launchFlowsArriveWhole() (gas: 259338)\n[PASS] test_metadata() (gas: 53111)\n[PASS] test_noCallIncreasesSupply() (gas: 641116)\n[PASS] test_noEtherAccepted() (gas: 36537)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 415798)\n[PASS] test_runtimeFitsEip170() (gas: 5148)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1265165)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19170)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 80818)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 138790)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33566)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 138852)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrement() (gas: 113071)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 80331)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33199)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 85787)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30901)\n[PASS] test_transferToSelfKeepsBalance() (gas: 38161)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 65672)\n[PASS] test_transferZeroAmountSucceeds() (gas: 40058)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 15575)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 23.13ms (84.36ms CPU time)\n\nRan 23 tests for test/ConditionalsToken.edges.t.sol:ConditionalsTokenEdgesTest\n[PASS] testFuzz_approveSetsExactValue(address,address,uint256,uint256) (runs: 1000, μ: 105522, ~: 105747)\nLogs:\n  Bound result 84255361433933084581505439603412042015478785585\n  Bound result 1220539702374463203958507102380962397543474572096\n\n[PASS] testFuzz_failedTransferChangesNothing(uint256) (runs: 1000, μ: 54952, ~: 54687)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039357584007913256330900\n\n[PASS] testFuzz_infiniteAllowanceSurvivesAnyPull(uint256) (runs: 1000, μ: 123795, ~: 124172)\nLogs:\n  Bound result 53281203799657005924\n\n[PASS] test_allowanceJustBelowInfiniteIsDecremented() (gas: 116416)\n[PASS] test_approveAboveBalanceIsAllowedButPullIsCappedByBalance() (gas: 157923)\n[PASS] test_approveFromZeroAddressReverts() (gas: 30737)\n[PASS] test_approveIsDirectional() (gas: 91154)\n[PASS] test_approveOverwritesRatherThanAdds() (gas: 87775)\n[PASS] test_approveZeroRevokes() (gas: 105814)\n[PASS] test_exactAllowanceIsFullyConsumed() (gas: 144571)\n[PASS] test_holderNeedsAllowanceToPullFromSelf() (gas: 33511)\n[PASS] test_independentDeploymentsDoNotShareState() (gas: 27259)\n[PASS] test_selfApprovalThenSelfPull() (gas: 131368)\n[PASS] test_transferFromEmitsOnlyTransfer() (gas: 115461)\n[PASS] test_transferFromErrorPrecedenceAllowanceBeforeReceiver() (gas: 33529)\n[PASS] test_transferFromToSameAccountSpendsAllowanceKeepsBalance() (gas: 99046)\n[PASS] test_transferFromToZeroAddressReverts() (gas: 95934)\n[PASS] test_transferFromZeroAddressOwnerRevertsWithoutAllowance() (gas: 33596)\n[PASS] test_transferFromZeroAddressOwnerZeroAmountReverts() (gas: 37243)\n[PASS] test_transferFromZeroAddressSenderReverts() (gas: 30806)\n[PASS] test_transferFromZeroAmountNeedsNoAllowance() (gas: 51059)\n[PASS] test_transferToSelfAboveBalanceReverts() (gas: 33282)\n[PASS] test_unknownSelectorReverts() (gas: 51504)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 24.00ms (72.84ms CPU time)\n\nRan 1 test for test/ConditionalsToken.invariant.t.sol:ConditionalsTokenInvariantTest\n[PASS]\nConditionalsTokenInvariantTest invariants:\n[PASS] invariant_actorBalancesSumToSupply\n[PASS] invariant_allowancesMatchModel\n[PASS] invariant_balancesMatchModel\n[PASS] invariant_failurePathsFailCleanly\n[PASS] invariant_metadataNeverChanges\n[PASS] invariant_tokenNeverHoldsEther\n[PASS] invariant_totalSupplyIsFixed\n ConditionalsTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------------------+-------+---------+----------╮\n| Contract            | Selector                   | Calls | Reverts | Discards |\n+===============================================================================+\n| ConditionalsHandler | approve                    | 1833  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | approveZeroSpender         | 1821  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | sendEther                  | 1814  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transfer                   | 1852  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transferAboveBalance       | 1758  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transferFrom               | 1782  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transferFromAboveAllowance | 1853  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transferFromAboveBalance   | 1836  | 0       | 0        |\n|---------------------+----------------------------+-------+---------+----------|\n| ConditionalsHandler | transferToZero             | 1835  | 0       | 0        |\n╰---------------------+----------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 69\n  Bound result 0\n  Bound result 49569\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 48683702327965680141262906\n  Bound result 511\n  Bound result 0\n  Bound result 255\n  Bound result 0\n  Bound result 63732870799486376883\n  Bound result 10000\n  Bound result 7007\n  Bound result 3200\n  Bound result 0\n  Bound result 0\n  Bound result 254\n  Bound result 506\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1234000000000000000000\n  Bound result 0\n  Bound result 470\n  Bound result 0\n  Bound result 53591\n  Bound result 8259\n  Bound result 3853\n  Bound result 0\n  Bound result 3169\n  Bound result 0\n  Bound result 40000000000000000000\n  Bound result 35286017841436997171\n  Bound result 5000000000000000000\n  Bound result 0\n  Bound result 1366\n  Bound result 100000000000000000000\n  Bound result 86\n  Bound result 48208837189365161813816962\n  Bound result 0\n  Bound result 2\n  Bound result 11000000000000000000\n  Bound result 2679310167161422852412\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.79s (8.78s CPU time)\n\nRan 3 test suites in 8.79s (8.84s CPU time): 55 tests passed, 0 failed, 0 skipped (55 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":26,\"script/DeployConditionals.s.sol\":24,\"src/ConditionalsToken.sol\":41,\"test/ConditionalsToken.edges.t.sol\":241,\"test/ConditionalsToken.invariant.t.sol\":291,\"test/ConditionalsToken.t.sol\":448},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4928521f183f15d8e6b55ea2c5ab33498e429d8d903f08be512412980a8a401b","verifiedTreeHash":"f0376f320bc5d05e72c1e8db09adabadc983179a","verifierVersion":"0.1.0+18543036"},{"checks":[{"durationMs":1100,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 990.98ms\nCompiler run successful!\n","passed":true},{"durationMs":139,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 31 tests for test/ConditionalsToken.t.sol:ConditionalsTokenTest\n[PASS] testFuzz_chainedTransfersConserveSupply(uint256,uint256,uint256) (runs: 256, μ: 235245, ~: 239439)\nLogs:\n  Bound result 7000000000000000000\n  Bound result 1000000000000000000\n  Bound result 2827\n\n[PASS] testFuzz_transferAboveBalanceReverts(uint256,uint256) (runs: 256, μ: 92896, ~: 93281)\nLogs:\n  Bound result 17317\n  Bound result 17319\n\n[PASS] testFuzz_transferConservesSupplyAndDeliversExactly(address,uint256) (runs: 256, μ: 99565, ~: 99945)\nLogs:\n  Bound result 1857123999\n\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 124747, ~: 108314)\nLogs:\n  Bound result 17317\n  Bound result 1\n\n[PASS] test_approveRevertsForZeroSpender() (gas: 30759)\n[PASS] test_approveSetsAllowanceAndEmits() (gas: 60005)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 14132)\n[PASS] test_create2DeploymentFromAContractMintsToThatContract() (gas: 885854)\n[PASS] test_deployScriptMintsToTheScriptCaller() (gas: 1527962)\n[PASS] test_deployerCannotPullWithoutAllowance() (gas: 89847)\n[PASS] test_launchFlowsArriveWhole() (gas: 259338)\n[PASS] test_metadata() (gas: 53111)\n[PASS] test_noCallIncreasesSupply() (gas: 641116)\n[PASS] test_noEtherAccepted() (gas: 36537)\n[PASS] test_noPrivilegedCallMovesOrFreezesAHolder() (gas: 415798)\n[PASS] test_runtimeFitsEip170() (gas: 5148)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 1265165)\n[PASS] test_supplyIsOneBillionWithEighteenDecimals() (gas: 19170)\n[PASS] test_transferFromRevertsAboveAllowance() (gas: 80818)\n[PASS] test_transferFromRevertsAboveBalanceEvenWithAllowance() (gas: 138790)\n[PASS] test_transferFromRevertsWithoutAllowance() (gas: 33566)\n[PASS] test_transferFromSpendsAllowanceExactly() (gas: 138852)\n[PASS] test_transferFromWithInfiniteAllowanceDoesNotDecrement() (gas: 113071)\n[PASS] test_transferMovesExactAmountAndEmits() (gas: 80331)\n[PASS] test_transferRevertsFromEmptyAccount() (gas: 33199)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 85787)\n[PASS] test_transferRevertsToZeroAddress() (gas: 30901)\n[PASS] test_transferToSelfKeepsBalance() (gas: 38161)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 65672)\n[PASS] test_transferZeroAmountSucceeds() (gas: 40058)\n[PASS] test_wholeSupplyMintedToDeployer() (gas: 15575)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 19.83ms (69.24ms CPU time)\n\nRan 1 test suite in 20.52ms (19.83ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":45,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ConditionalsToken.approve(address,uint256)\",\"ConditionalsToken.transfer(address,uint256)\",\"ConditionalsToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":96,\"foundry.toml\":26,\"launch.json\":24,\"script/DeployConditionals.s.sol\":24,\"src/ConditionalsToken.sol\":41,\"test/ConditionalsToken.t.sol\":448},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e88d9ac7a5af337a6596e231ecec99a19dec482258a2dd00d52ef1a285c32f39","verifiedTreeHash":"be1560440db8f9176246723021d1d8c79839646a","verifierVersion":"0.1.0+18543036"}]}