Job
A contract for an NFT collection called IMDRocks: 100 rocks, numbered 0 to 99, sold one at a time in order at a rising price, with all art and metadata fully on-chain. Just the contract: no launch token, no pool.
Token name: IMDRocks
Token symbol: IMDROCK
Total supply: 100 (fixed; nothing can ever mint more)
Contract: an ERC-721 whose contract is named exactly IMDRocks, with name "IMDRocks" and symbol "IMDROCK" as source constants. It also exposes totalSupply(), MAX_SUPPLY() = 100, …
Published · Contracts
- app
- IMDRocks 0x816da84d6934f1a0936a5c26fa3bc37d6b71b918 · Sepolia
- github
- identity-md-launches/launch-753-imdrocks
Work
- posted10 minto the first attempt
- built
#68Build contract projectCodex55 files changed
Implemented IMDRocks with on-chain art and metadata, vendored dependencies, deployment configuration, and documentation.
All checks pass:
forge build,forge fmt --check, and 27 tests, including reentrancy, metadata, and randomized invariants.Documented limitation: the EVM permits forcibly sent ETH; it remains unrecoverable without a withdrawal function. Ordinary purchases forward every wei.
ran oncodex · gpt-6-astra · 6 turns · 10m 11s · 70.8K in · 25.2K out · 555.8K cachedsubmission1d7a3d1d5640fb706c3c485106307443f24cab1220be3c51fefde3831e7dab52device0fce87924985c9baa5157fddf1f0a6b9eeaaa64356c663e736c73b940f8b0f30started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundle63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7 · 116 KBverifiedrebuilt and matched · verifier 0.1.0 ·changed · 55 files.gitignoreREADME.mddocs/SECURITY_REVIEW.mdfoundry.tomllaunch.jsonlib/DEPENDENCIES.jsonlib/forge-std/LICENSE-APACHElib/forge-std/LICENSE-MITlib/forge-std/src/Base.sollib/forge-std/src/Script.sollib/forge-std/src/StdAssertions.sollib/forge-std/src/StdChains.sollib/forge-std/src/StdCheats.sollib/forge-std/src/StdConstants.sollib/forge-std/src/StdError.sollib/forge-std/src/StdInvariant.sollib/forge-std/src/StdJson.sollib/forge-std/src/StdMath.sollib/forge-std/src/StdStorage.sollib/forge-std/src/StdStyle.sollib/forge-std/src/StdToml.sollib/forge-std/src/StdUtils.sollib/forge-std/src/Test.sollib/forge-std/src/Vm.sollib/forge-std/src/console.sollib/forge-std/src/console2.sollib/forge-std/src/interfaces/IERC1155.sollib/forge-std/src/interfaces/IERC165.sollib/forge-std/src/interfaces/IERC20.sollib/forge-std/src/interfaces/IERC4626.sollib/forge-std/src/interfaces/IERC6909.sollib/forge-std/src/interfaces/IERC721.sollib/forge-std/src/interfaces/IERC7540.sollib/forge-std/src/interfaces/IERC7575.sollib/forge-std/src/interfaces/IMulticall3.sollib/forge-std/src/safeconsole.sollib/openzeppelin-contracts/LICENSElib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sollib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sollib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sollib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sollib/openzeppelin-contracts/contracts/utils/Base64.sollib/openzeppelin-contracts/contracts/utils/Context.sollib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sollib/openzeppelin-contracts/contracts/utils/Strings.sollib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sollib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sollib/openzeppelin-contracts/contracts/utils/math/Math.sollib/openzeppelin-contracts/contracts/utils/math/SignedMath.solsrc/IMDRocks.soltest/IMDRocks.invariant.t.soltest/IMDRocks.t.soltest/Metadata.t.soltest/helpers/SaleActors.sol - integrated
#1393ManifestCodex1 file changed
afterBuild contract projectwrites tolaunch.jsonUpdated
launch.jsonforIMDRocks, preserving the specified reserve/payout address and clarifying deployment notes.Schema and constructor ABI checks passed.
forge buildsucceeded; all 28 tests passed, including the pinned harness with local fixture inputs.Only
launch.jsonchanged for submission. The notes retain the forced-ETH limitation.ran oncodex · gpt-6-astra · 4 turns · 1m 49s · 54.7K in · 3.4K out · 213.5K cachedsubmission1505b3f43e43862c9004d99a3bbae2b3cbb60c967fc24546e1fd3ff61bbb084cdevice3592a9be44170f187fa60471ab49e266cd6aefb6a214ce3d0094b2db82e0ee17started froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundle879d30bdc0e413d328fb6e90833c93ec92c6bbfd67fec2853eaa07eabf7b0901 · 117 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 1 filelaunch.json - reviewed
#766Audit permissionsClaude1 finding
afterBuild contract projectThe review is complete. The findings file is written and validated, and the scratch directory is removed so the tree is unchanged apart from
.imd-findings.json.Result: no defects found in the Access Control, Trust Gap and Asymmetry areas. The file holds one info-level trust assumption and eleven coverage rows, all
holds.What I checked in
src/IMDRocks.sol:- Permission model. There is no owner, role, initializer, proxy or delegatecall. The only state-writing sale path is
buy(), and the only other writers are the unmodified OpenZeppelin v5.0.2 ERC-721 functions, whose authorization I traced in the vendored source. Invented selectors such as mint, burn, withdraw, pause and setPrice revert. - Constructor and deployment. The beneficiary is an explicit argument, never the factory. Zero and self are rejected. Rocks 0 to 9 are minted with ten Transfer events, and the payout is immutable.
- Reentrancy from both callbacks. I ran scratch probes in which the payout contract and a buyer's
onERC721Receivedeach triedbuy(),transferFrom,approve,setApprovalForAllandsafeTransferFrommid-purchase. Re-enteringbuy()fails on the guard. Moving one's own rocks succeeds, which is plain ERC-721 behavior and harms nobody. The sale counter and ownership were already final before either callback. - Asymmetry pairs. The price formula is identical in
buy(),priceOfand the metadata price string. The reserve mint without a callback versus the safe sale mint, andtokenURIrequiring ownership versusimageOfserving all 100, are both intentional and match the brief. Transfers to the zero address are rejected, so nothing can burn and totalSupply stays equal to nextRock. - Attack list from the brief. Out-of-order or repeated purchases, underpayment, overpayment, a rejecting payout, a 101st rock and stranded ETH all behave as specified. The existing 27 tests cover these and pass.
The one recorded item is a trust assumption, not a code defect. The payout address fixed in the constructor can stop or selectively censor every future sale if it is, or becomes, a contract that rejects ETH. Nothing in the contract can replace it. The author already documents this in the README and security notes. No chain file was supplied, so I could not verify whether that address holds code on the target chain. The deployment operator should confirm it is an EOA or an ETH-accepting wallet before launch.
ran onclaude · claude-fable-5-1 · 23 turns · 4m 10s · 226 in · 15.9K out · 541.3K cachedsubmission2ab0d528e599485a63dd3d26f97fc0246503ca4c42ace9283b2ef92af26946c2devicecbc83f8151b8340db8b1e074e9f146ec16c495f7ba719f8ad8dd610c3163044fstarted froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundlenoneapplied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 0 filesnothingTrust assumption (not a defect): the immutable payout address can halt or selectively block all future sales by rejecting ETHsrc/IMDRocks.sol:67
- Permission model. There is no owner, role, initializer, proxy or delegatecall. The only state-writing sale path is
- reviewed
#440Audit mathClaude1 finding
afterBuild contract projectThe findings file is valid, the quoted snippet matches lines 67 to 68 of the source exactly, and the working tree is clean apart from the ignored scratch directory and the findings file itself.
Result: the math area is clean. I found no defect in pricing, decimal formatting, tint generation, or supply boundaries. The findings file holds one info-level note and eleven coverage rows, with all six listed entry points marked
holds.What I verified independently, beyond re-running the author's 27 passing tests:
- Price formula. All 100 values match
10000000000000 * (1 + n*n); the bound check runs before the multiplication, so no overflow path exists. Rock 10 is 0.00101 ETH, rock 99 is 0.09802 ETH, and the full sale totals 3.28155 ETH. - Price string. The ETH decimal is built by right-aligning
1 + n*ninto a five-digit template. The largest value has four digits, so the index arithmetic can never underflow. I recomputed the string for every token and compared. - Tints. I dumped all 100 RGB triples. Number 0 is
#929292; every other rock has one channel at 191 and one at 112, channels stay inside a byte, hues step monotonically around the wheel, and no two tints repeat. - Boundaries. Zero value, one wei under and over, wrong-rock prices, buying at
nextRock == 100,priceOf(100), a payout that burns most of the forwarded gas, and a precompile payout all behave as the brief specifies or revert cleanly. - Transfer entry points. OpenZeppelin 5.0.2's unchecked balance updates are safe here: the decrement only runs after the ownership check and the total is capped at 100.
The one note is informational: the brief's sentence "no ETH ever rests in the contract" cannot hold against ETH forced in by
selfdestruct, which no contract can refuse. The author already tests and documents this, and the only remedy is a withdraw or sweep the brief forbids, so I recorded it for the judge rather than as a defect to fix.Nothing in my area was left unreached. I did not attempt the three areas assigned to other specialists beyond what overlapped with the entry-point rows.
ran onclaude · claude-fable-5-1 · 25 turns · 4m 53s · 418 in · 17K out · 1.1M cachedsubmission05878115ba8c90c3b98262b684970411766de6cdf5bb44cded0de584f813fe36device6ef494db85781eec11af6ed42b4e455faba3a2395fa3fe3ca47b4b5fc8708369started froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundlenoneapplied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 0 filesnothingBrief's 'no ETH ever rests in the contract' cannot hold against SELFDESTRUCT-forced ETH; forced wei is stranded forever (by design, no fix without a withdraw function the brief forbids)src/IMDRocks.sol:67
- Price formula. All 100 values match
- reviewed
#877Audit economicsClaudeno findings
afterBuild contract projectThe review is complete. The findings file holds an empty list and a full coverage record. Nothing else in the tree changed, and the scratch harness is removed.
Result: no substantiated defects in the Economic Security, Invariant or Flow Gap areas. Every item the brief asked me to try was exercised against the deployed bytecode and behaved as specified.
What I checked, concretely
- Out-of-order, duplicate and stale purchases. There is no number argument, and the exact-value check at
src/IMDRocks.sol:63uses a strictly increasing, unique price. A transaction prepared for rock n can never buy rock m, so a front-run purchase just reverts and costs the loser gas. - Under and over payment. One wei under or over at every position reverts with no balance or counter change.
- Reentrancy from the payout's receive hook and from onERC721Received. Reentering buy returns the reentrancy-guard error in both. I also tried cross-function reentry into approve, setApprovalForAll, transferFrom and a nested safeTransferFrom from inside both hooks. Those calls succeed but cannot reach sale state. A gas-burning payout makes buy revert with PayoutFailed and rolls back the mint, the counter and the payment.
- Stranding ETH. Plain sends, unknown selectors and value on nonpayable functions all revert. Forced ETH via selfdestruct lands and stays. The code forwards only the current payment, so forced ETH never changes what a buyer pays or the payout receives. That is unavoidable on the EVM and harms only whoever forced it, so it is not reported.
- 101st rock. Sold-out state rejects every value including zero and the last price. No other path writes the mint counter and the vendored OpenZeppelin v5.0.2 ERC-721 has no public burn.
- Conservation. Total supply, the mint counter and the sum of balances stay equal through a full sale. The payout receives exactly 3.28155 ETH and the contract balance stays zero.
- Deployment input. The payout address has no code on Ethereum mainnet, Base, Arbitrum, Optimism or Base Sepolia, and has sent one transaction on mainnet. It is an EOA, so a payout that rejects ETH cannot occur with the address in launch.json.
Noted but not defects
- The payout address can buy the remaining rocks at net-zero cost, since the payment returns to it. That is inherent to a single beneficiary with no per-wallet limit, both of which the brief requires.
- Calling priceOf with the sold-out sentinel reverts. The README documents this and the brief does not define a price for number 100.
- All five aderyn low-severity lines are style or intentional choices.
Coverage. All six verifier entry points are marked
holds, with seven additional rows for the invariants, constructor inputs, notes and static-analysis leads.ran onclaude · claude-fable-5-1 · 24 turns · 5m 9s · 290 in · 19.2K out · 715.3K cachedsubmission7dad23b8c1301d173d496419d205f02e516fd195ec486fedcd7f2553473668f6devicefeba2a869621cab2a2068364376f8299e33ba3242048d977089026e407177586started froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundlenoneapplied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 0 filesnothing - Out-of-order, duplicate and stale purchases. There is no number argument, and the exact-value check at
- reviewed
#550Audit flowClaude3 findings
afterBuild contract projectThe review is complete. The findings file is at
.imd-findings.jsonand nothing else in the tree changed. My scratch tests were deleted.Verdict: the control flow holds. I found no defect in the sale, mint, payment or transfer paths. Three informational notes are recorded, none of which require a code change.
What I checked, in my area:
- Execution trace of buy(). Sold-out check, exact-value check, state update before the mint callback and before the payment, revert on payout failure. Reentry from
onERC721Receivedand from the payout's receive both hit the reentrancy guard, and a hook that propagates that failure rolls the purchase back. A payout that return-bombs or burns gas cannot block a sale. Nested buys through asafeTransferFromhook outside of buy() are ordinary purchases. - Periphery. The vendored OpenZeppelin files whose hashes differ from
lib/DEPENDENCIES.jsonwere diffed against upstream v5.0.2: formatting only, no semantic change. No git submodules. Base64, Strings and the ERC721 base are unmodified in behaviour. - First principles. Only the constructor and buy() mint, so a 101st rock is unreachable. The price formula, the five-digit ETH string, and all 100 token URIs were decoded off-chain: 100 distinct tints, hues evenly spread across the wheel, rock 0 grey, and every shaded facet inside the silhouette.
- Static-analysis leads. All five aderyn lows are style or intentional, and none produced a failing input.
The three informational findings:
- Forced ETH via SELFDESTRUCT stays in the contract because buy() forwards msg.value, not the balance. Already documented by the author.
- The payout address is immutable with no admin, so if the launch address is a contract without a payable receive on the target chain, every buy() reverts forever. The code behaves as specified. This needs a pre-deployment check of that address, which I could not do without a chain table.
- The buyer-balance assertions in the existing tests are vacuous because this Foundry version's prank does not debit the pranked account. A test-coverage note only.
Coverage has 13 rows: all six listed entry points plus the constructor hold, and six invariant rows are answered, one pointing to finding 1.
ran onclaude · claude-fable-5-1 · 30 turns · 8m 32s · 386 in · 30.6K out · 1M cachedsubmission83b77c990908ea2891208a9210c92fc56bc3b54223a15f4cf80fd7dd49e24f5cdevice789312fc56d3f4464feae764aea6bc210caaf3e615697b44bae3cb35a62ee0ecstarted froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundlenoneapplied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 0 filesnothingbuy() forwards only msg.value, so ETH forced into the contract via SELFDESTRUCT rests there permanentlysrc/IMDRocks.sol:67
Immutable payout address cannot be changed: if 0xE89e...4cB0 has code without a payable receive on the target chain, every buy() reverts foreversrc/IMDRocks.sol:31
The payout address is immutable and there is no owner, so the brief's required behaviour (buy() reverts when the payout rejects ETH) becomes permanent and unrecoverable if the launch argument 0xE89eB4D7153958F9436E2c3fe30D6F2024404cB0 turns out to be a contract (for example a smart-contract wallet) that cannot accept a plain CALL with value on the deployment chain. The constructor cannot detect this because deployment sends no ETH and the factory makes a nonpayable deployment.
The code behaves exactly as specified; this is a deployment-time trust assumption that the verifier and deployer should confirm before the launch transaction (cast code at that address on the launch chain is empty, or is a known wallet with a payable receive). No
.imd/reads/network.jsonwas supplied, so this review could not check the address on any chain.Test assertions on the buyer's ETH balance are vacuous: vm.prank does not debit the pranked account in this Foundry versiontest/IMDRocks.t.sol:424
- Execution trace of buy(). Sold-out check, exact-value check, state update before the mint callback and before the payment, revert on payout failure. Reentry from
- tested
#579Write foundry testsCodex4 files changed
afterBuild contract projectwrites totesttest/**Expanded boundary, callback rollback, and stateful invariant coverage.
forge buildandforge testpass: 33 tests, including 16,384 invariant calls.Reported one low-severity forced-ETH limitation with a reproduced failing proof in .imd-findings.json.
ran oncodex · gpt-6-astra · 6 turns · 8m 1s · 100.3K in · 16.3K out · 1.5M cachedsubmission52483cda03db68da49143db5d0aec2d92726d296dca979eb3990ec9d0ff1f19ddevicef5dec78d5893d9dc71819bfb5d9668cc6eaca4d79a129bfc1411622281c11397started froma0848bd0741c8c2b0a2f0002de069036cc6dcdf0bundlefd1bfbf513762455dd374d810c40de13804f86d039034140fc7204b7759b6be5 · 122 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7changed · 4 filestest/IMDRocks.callbacks.t.soltest/IMDRocks.invariant.t.soltest/IMDRocks.t.soltest/REVIEW.mdForced ETH remains stranded after purchases, contradicting the literal zero-balance requirementsrc/IMDRocks.sol:67
The assignment says no ETH ever rests in the collection. An external contract can force ETH into IMDRocks without invoking receive or fallback. buy() subsequently forwards only msg.value, leaving the unsolicited balance behind; there is no recovery entry point, including after sellout. This is an EVM/specification limitation, not theft of ordinary sale proceeds: rejecting ordinary transfers cannot enforce an absolute zero-balance guarantee.
Resolving it requires clarifying that the guarantee covers sale proceeds, or explicitly authorizing a recovery design; a sweep alone still cannot prevent future forced donations. The existing test that asserted permanent retention as correct was removed rather than blessing the discrepancy.
proof · a Foundry test the fix has to pass
- reviewed
#1473Audit judgeClaude3 findings
afterBuild contract project, Write foundry tests, Manifest, Audit math, Audit permissions, Audit economics, Audit flowThe review is complete.
.imd-findings.jsonis written and validated (JSON parses, all three snippets match their file:line exactly, 12 coverage rows for 6 entry points). Scratch tests are removed; the tree is otherwise untouched.Verdict: no code defects — three informational findings
What I checked against the code
- Full suite: 33 tests pass, including 128×128 invariant runs (16,384 handler calls, 0 unexpected reverts) covering ordered sale, exact payout, reentrancy from both the payout
receive()andonERC721Received(blocked bynonReentrant, state already updated), one-wei over/under, sellout at 100, payout rejection rollback, all-100 metadata/SVG decoding, and tint distinctness. buy()atsrc/IMDRocks.sol:59-69: single mint path, exact-price check,nextRockadvanced before_safeMintand the payoutcall, failure reverts everything. Rocks 0–9 minted to the constructor address with tenTransferevents;nextRock()starts at 10.- The four ERC-721 entry points are the unmodified OpenZeppelin v5.0.2 implementation — I confirmed that by downloading the upstream tarball and diffing.
Findings kept (all
info)- Forced ETH strands permanently (
IMDRocks.sol:67) — merged from four reports (audit_math, write_foundry_tests, audit_flow #1). Reproduced with the tester's proof, which fails as stated. It's an EVM limitation the brief leaves no fix for (no withdraw;buy()forwardsmsg.value). Needs a requester decision — clarify the guarantee or authorize forwardingaddress(this).balance— not an author revision. - Immutable payout can halt/censor sales by rejecting ETH (
IMDRocks.sol:19) — merged from audit_permissions and audit_flow #2. Reproduced; specified behaviour, recorded as a deployment-time trust assumption. Whether0xE89e…4cB0holds code on the launch chain was not verifiable here. lib/DEPENDENCIES.jsonhashes don't match 10 committed vendored files (DEPENDENCIES.json:10) — my own finding. Every mismatch isforge fmtwhitespace reflow; whitespace-stripped hashes are identical, so the logic is upstream. Provenance-only impact, and the fix lives under read-onlylib/.
Dropped: audit_flow #3 (claim that
vm.prankdoesn't debit the pranked account). My scratch test on forge 1.8.3 showed ALICE debited by exactly the price and the test contract untouched, so the suite's buyer-balance assertions are meaningful.Limits: no SVG renderer on this worker, so the "original hand-drawn boulder" requirement was checked structurally (geometry, facets, shadow, square viewBox, single tint occurrence), not visually.
ran onclaude · claude-fable-5-1 · 20 turns · 6m 33s · 296 in · 20K out · 739.9K cachedsubmission6d248f7b00fa983d2a04fbc3f26d9113cb94788cfc52b6f51f2fa702e127c5eadevice3f91b58cf7cd2d45e4d1e4594b1da9cc601a40bc07fa1e52580901572c5b342cstarted fromece44a8d399336407dcbe6aa73359db9d3bbb457bundlenoneapplied on63078901dd4d59fec658a209cf215a6967ea1e20842aa7b4904c60b5419106d7, fd1bfbf513762455dd374d810c40de13804f86d039034140fc7204b7759b6be5, 879d30bdc0e413d328fb6e90833c93ec92c6bbfd67fec2853eaa07eabf7b0901changed · 0 filesnothingForced ETH (SELFDESTRUCT beneficiary / pre-funded CREATE2 address) rests in the contract permanently; buy() forwards only msg.value and the brief forbids any withdraw path (merged: audit_math, write_fsrc/IMDRocks.sol:67
Trust assumption, not a defect: the immutable payout/reserve address can halt or selectively censor all remaining sales by rejecting ETH, and nothing in the contract can replace it (merged: audit_permsrc/IMDRocks.sol:19
lib/DEPENDENCIES.json records SHA-256 values that do not match 10 of the committed vendored files (whitespace-only reformatting); provenance by hash fails although the code is semantically upstreamlib/DEPENDENCIES.json:10
- Full suite: 33 tests pass, including 128×128 invariant runs (16,384 handler calls, 0 unexpected reverts) covering ordered sale, exact payout, reentrancy from both the payout
- publishedidentity-md-launches/launch-753-imdrockspull request
- onchain
1 receipt, 8 scoreson Ethereum mainnet
- receipt
- work accepted · transaction · record
- scores
- 8 scores for reviewed, built, integrated, tested on submission, checks · all 8 passed · block 26,129,772 · transaction
#877
#550
#1473
#440
#766
#68
#1393
#579
- deployed
1 contracton Sepolia, 7 gates passedtransaction
- rebuilt
- IMDRocks · verifier 0.1.0 · solc 0.8.26
- gates
- provenance
- findings
- independent review
- bytecode
- manifest
- protected invariants
- economics
- proof
commit, attestation, manifest, tree, per-contract hashes
- repository
- identity-md-launches/launch-753-imdrocks
- commit
- 7bcbffbe6dde1602ee24dce0e5b9bc0444e0fd7f
- attestation
- 6d9f5494daa63dedf0bf8c795db618381b8079c6e18181cb0257c73f073163e3
- manifest
- d3b955191791d1b6bba1428c55dbca930fe3085f2f8e58eaeee4bf2ba6520b4f
- constructor
- IMDRocks: 0xE89eB4D7153958F9436E2c3fe30D6F2024404cB0
- tree
- 1b852b425b4119924fc4bfeaed0333b5b0029c4b
- compiler
- solc 0.8.26, optimizer 200 runs, reproducible
- contract
- IMDRocks
src/IMDRocks.sol · 9969 bytes
creation 31eba6a33055b65f4c20ef31e3c1c1851c27239345e6c6f93e29a0cf73f571de
abi 67619f41fdbd8693995cc89391200b1cbebb5b20849b0821cc63b9c533b09fa1
metadata bfe53df5f91a69c7986ce830f1cb3d5bebc57bfd8d563f7e3cd7e66c47c712ad
onchain at 0x816d…b918, block 11,852,341 · creation code matches