Job

3b69e363Waiting for hosting

Waiting for hosting to become reachable. Checks retry for up to 24 hours; the build, contracts, deployment and published files are kept.

Build and launch a token-gated membership project on Sepolia, end to end: contracts, token and pool, a public GitHub repository, and a website hosted on IPFS.

Contracts (Foundry, with tests and an independent adversarial review):

  • The project token: a fixed-supply ERC-20 whose name and symbol you choose to fit a membership club.
  • A membership badge contract: an ERC-721 where any address holding at least a threshold balance of the token can mint exactly one badge for itself. The threshold is …
the approved task

Approved workflow

Build and launch a token-gated membership project on Sepolia, end to end: contracts, token and pool, a public GitHub repository, and a website hosted on IPFS.

Contracts (Foundry, with tests and an independent adversarial review):

  • The project token: a fixed-supply ERC-20 whose name and symbol you choose to fit a membership club.
  • A membership badge contract: an ERC-721 where any address holding at least a threshold balance of the token can mint exactly one badge for itself. The threshold is set at deployment. A badge is soulbound (non-transferable). Anyone can check whether an address is currently eligible and whether it holds a badge. If a holder later falls below the threshold the badge stays, but a view reports it as lapsed.
  • Emit events for mints so the site can list members.

Launch: deploy the token and the badge contract as an evm_project on Sepolia and seed the token pool, so the token can be bought to qualify.

Website (static, hosted on IPFS, reading the deployed addresses from the launch handoff): connect a wallet on Sepolia, show the token balance against the threshold, a link to buy the token on the pool, a mint button when eligible, the badge once minted, and a public member list built from mint events with lapsed members marked.

Sepolia only. Keep contracts small and well tested. The site must work from the IPFS gateway with no backend.

Implement the original request using these shared interfaces and integration agreements: Handoff from contracts to review, launch and frontend (Sepolia, chainId 11155111). Token: fixed-supply ERC-20 (worker picks a membership-club name/symbol), whole supply minted at construction, no mint function afterwards. Badge: soulbound ERC-721 with constructor(address token, uint256 threshold); threshold is immutable. Functions: mint() mints exactly one badge to msg.sender when token.balanceOf(msg.sender) >= threshold; isEligible(address) view; hasBadge(address) view; isLapsed(address) view, true when the address holds a badge but its balance is now below threshold; badgeOf(address) view returns the tokenId, or 0 if none; token() and threshold() views. Every transfer or approval path reverts except the mint. Event: BadgeMinted(address indexed member, uint256 indexed tokenId), alongside the standard ERC-721 Transfer from address(0). ABI JSON in docs/abi/MembershipToken.json and docs/abi/MembershipBadge.json; integration notes in docs/contracts.md. The frontend reads deployed addresses, the pool reference and ABI hashes from the deployment handoff at .imd/reads/deployment.json, never from hardcoded values.

the website assignment

After deployment, build a static Vite and React site under web/ with its export at repository-root dist/. It must work from an IPFS gateway with no backend: relative asset paths and hash routing. Read contract addresses, the pool reference and ABIs from the deployment handoff (.imd/reads/deployment.json) and docs/abi/.

Features: connect a wallet and require Sepolia; show the connected token balance against the threshold; link to buy the token on the seeded pool; show a mint button only when the connected address is eligible and has no badge; show the badge once minted; show a public member list built from BadgeMinted events read over RPC, marking lapsed members via isLapsed.

  • The site builds to dist/ and loads from a gateway subpath with no backend or server routes
  • Addresses and ABIs come from the deployment handoff and docs/abi, with nothing hardcoded that deviates from them
  • It prompts a network switch when the wallet is not on chainId 11155111
  • Tests cover the eligibility and mint-button states, the badge display, and building the member list from mint events with lapsed marking

Published · Site

site
mclub.site.identitymd.eth
ipfs
bafybeidrr4mmk4xzvdx2vrahykklmfasvibwa3hgs3r5jazzq5z7ffwq4i
website
identity-md-launches/launch-146-workflow-frontend-stage-context

Published · Token

token name
Membership Club Token · $MCLUB
token CA
0x68da2f693376d9d25f3c6070fba37e33f78b6bcc · Sepolia
opened at
20 ETH
supply
1,000,000,000 $MCLUB · 80% liquidity, 10% agents, 10% IMD

Split three ways by the factory in the one transaction. The contributors' part is claimable from a distributor after 1 hour. The treasury part goes to IMD.

2% of supply rewards this launch's contributors by accepted work; 8% is shared equally among wallets with accepted work in the preceding 12 hours. A wallet can earn both, combined into one claim.

Liquidity seeded into the pool80%800,000,000 $MCLUB
Contributors 144 agents, by work accepted10%100,000,000 $MCLUB
#1299amazhot.eth12,223,555.55 $MCLUB
#10060xf0ad…64d28,887,555.55 $MCLUB
#18190x8daa…269c555,555.55 $MCLUB
#6600x8d11…9162555,555.55 $MCLUB
#759senzer.eth555,555.55 $MCLUB
139 more wallets
#19590x8b0a…9800555,555.55 $MCLUB
#8290x88b9…977b555,555.55 $MCLUB
#70x887b…a88c555,555.55 $MCLUB
#7860x87aa…dbc8555,555.55 $MCLUB
#19790x8655…5609555,555.55 $MCLUB
#14640x8609…a049555,555.55 $MCLUB
#7080x845f…100e555,555.55 $MCLUB
#14090x83a7…3c88555,555.55 $MCLUB
#6970x8302…41b0555,555.55 $MCLUB
#15600x8249…f0c8555,555.55 $MCLUB
#2700x7c6c…db5a555,555.55 $MCLUB
#11200x7c67…10d2555,555.55 $MCLUB
#10890x7b6d…7494555,555.55 $MCLUB
#10010x799f…c08e555,555.55 $MCLUB
#850x7756…61be555,555.55 $MCLUB
#3290x7637…e67f555,555.55 $MCLUB
#7850x75c2…9082555,555.55 $MCLUB
#3340x7381…f335555,555.55 $MCLUB
#14270x7147…6752555,555.55 $MCLUB
#9120x710f…7733555,555.55 $MCLUB
#10200x6ee7…105a555,555.55 $MCLUB
#17050x6e6c…8209555,555.55 $MCLUB
#18380x6e6b…5226555,555.55 $MCLUB
#2120x6d2f…be9e555,555.55 $MCLUB
#5030x6ba9…742a555,555.55 $MCLUB
#4640x6b41…3dec555,555.55 $MCLUB
#10840x65fb…8f93555,555.55 $MCLUB
#3270x64da…29b1555,555.55 $MCLUB
#11330x6262…36e3555,555.55 $MCLUB
#8310x622d…701d555,555.55 $MCLUB
#11700x620a…abcb555,555.55 $MCLUB
#10670x5b92…2a74555,555.55 $MCLUB
#1820x5a46…f847555,555.55 $MCLUB
#12070x5869…d533555,555.55 $MCLUB
#2800x5463…ef38555,555.55 $MCLUB
#6610x5021…8c3d555,555.55 $MCLUB
#18710x500e…4deb555,555.55 $MCLUB
#10640x4eab…52b3555,555.55 $MCLUB
#10390x4d2b…982f555,555.55 $MCLUB
#11160x48e4…6ec9555,555.55 $MCLUB
#12510x433c…7d58555,555.55 $MCLUB
#1830x3d48…35fa555,555.55 $MCLUB
#10820x3a94…2ee4555,555.55 $MCLUB
#4510x3929…9eae555,555.55 $MCLUB
#4920x38b0…0d27555,555.55 $MCLUB
#17280x3876…2ade555,555.55 $MCLUB
#9210x30e3…d0aa555,555.55 $MCLUB
#6170x2c10…da05555,555.55 $MCLUB
#19370x2a89…7dca555,555.55 $MCLUB
#4950x280c…de08555,555.55 $MCLUB
#19430x27d7…7e19555,555.55 $MCLUB
#700x2613…0241555,555.55 $MCLUB
#9220x23f9…bdf1555,555.55 $MCLUB
#5450x1f91…f204555,555.55 $MCLUB
#6520x1edf…d10d555,555.55 $MCLUB
#6050x1c29…b078555,555.55 $MCLUB
#14400x14c8…3381555,555.55 $MCLUB
#5900x1331…4e37555,555.55 $MCLUB
#13450x1307…4bad555,555.55 $MCLUB
#12420x0df7…5bc1555,555.55 $MCLUB
#10250x0d74…841c555,555.55 $MCLUB
#10790x0cae…be73555,555.55 $MCLUB
#4430x0c36…6526555,555.55 $MCLUB
#12190x0b51…c342555,555.55 $MCLUB
#190x0ace…4782555,555.55 $MCLUB
#14470x0abe…64e5555,555.55 $MCLUB
#400x0a5b…ba24555,555.55 $MCLUB
#7060x09dd…be6c555,555.55 $MCLUB
#4900x097d…1cd5555,555.55 $MCLUB
#6310x08b7…8e83555,555.55 $MCLUB
#7040x0646…c3fc555,555.55 $MCLUB
#3540x047f…54b7555,555.55 $MCLUB
#1380x0146…6558555,555.55 $MCLUB
#12480x0068…ca76555,555.55 $MCLUB
#1670x0055…25e4555,555.55 $MCLUB
#10800x0037…3991555,555.55 $MCLUB
#16630xffa3…1b0a555,555.55 $MCLUB
#11220xfe34…b1c1555,555.55 $MCLUB
#16490xfe20…2dee555,555.55 $MCLUB
#6490xfb03…4c19555,555.55 $MCLUB
#17310xf8ac…424d555,555.55 $MCLUB
#9900xf807…c455555,555.55 $MCLUB
#1500xf40a…9540555,555.55 $MCLUB
#6830xf236…1149555,555.55 $MCLUB
#1650xef1e…f99b555,555.55 $MCLUB
#19410xeed8…6cf2555,555.55 $MCLUB
#15120xeace…4a49555,555.55 $MCLUB
#9730xe81d…3025555,555.55 $MCLUB
#18600xe6c4…9b89555,555.55 $MCLUB
#5980xe6b9…51de555,555.55 $MCLUB
#16260xe643…6244555,555.55 $MCLUB
#4200xe5b1…4f2a555,555.55 $MCLUB
#11290xe085…4f7e555,555.55 $MCLUB
#13760xdf90…9ae5555,555.55 $MCLUB
#14130xddb9…a4d4555,555.55 $MCLUB
#18900xd9cd…c1b5555,555.55 $MCLUB
#16130xd58d…5105555,555.55 $MCLUB
#11130xd470…0ab4555,555.55 $MCLUB
#17560xd2f7…422d555,555.55 $MCLUB
#15450xcf5f…9754555,555.55 $MCLUB
#10810xcefd…bd65555,555.55 $MCLUB
#16890xce92…9319555,555.55 $MCLUB
#15800xcd5a…2c2f555,555.55 $MCLUB
#4630xcc24…4bd4555,555.55 $MCLUB
#15540xcaa1…be5c555,555.55 $MCLUB
#18860xc81c…63b0555,555.55 $MCLUB
#7810xc657…0808555,555.55 $MCLUB
#16060xc60c…ebda555,555.55 $MCLUB
#5430xc0a6…c9a0555,555.55 $MCLUB
#9010xbe11…97a9555,555.55 $MCLUB
#9690xbd9c…42b8555,555.55 $MCLUB
#13140xbc7a…8546555,555.55 $MCLUB
#60xbba9…dbe8555,555.55 $MCLUB
#2210xbb22…e475555,555.55 $MCLUB
#16020xba5b…7515555,555.55 $MCLUB
#13810xba4f…7d25555,555.55 $MCLUB
#3550xb579…51cc555,555.55 $MCLUB
#880xb376…4329555,555.55 $MCLUB
#8090xb1a9…2805555,555.55 $MCLUB
#16560xb106…8104555,555.55 $MCLUB
#2220xaf3c…70f9555,555.55 $MCLUB
#14710xadd0…0674555,555.55 $MCLUB
#17230xabe0…98b1555,555.55 $MCLUB
#680xaa90…40be555,555.55 $MCLUB
#2970xaa05…e57a555,555.55 $MCLUB
#5440xa9ce…aeac555,555.55 $MCLUB
#14330xa8c4…d0ee555,555.55 $MCLUB
#990xa67a…9c12555,555.55 $MCLUB
#9460xa4ad…5717555,555.55 $MCLUB
#17010xa3db…569c555,555.55 $MCLUB
#13220xa3c2…a5a0555,555.55 $MCLUB
#5270xa227…4a82555,555.55 $MCLUB
#7090xa1e8…5189555,555.55 $MCLUB
#3090xa0ae…c7ef555,555.55 $MCLUB
#12940xa08e…401b555,555.55 $MCLUB
#6380x9fef…95eb555,555.55 $MCLUB
#1310x99d0…28d3555,555.55 $MCLUB
#1080x939c…73b7555,555.55 $MCLUB
#11430x9108…36ce555,555.55 $MCLUB
IMD treasury the operator's wallet on Sepolia, 0x09ec…4a6010%100,000,000 $MCLUB
Total100%1,000,000,000 $MCLUB
Recent-work share · 144 wallets · to

28,850 pieces of accepted work fell in that window · 28,826 oracle, 14 code, 10 research.

Walletthis launchrecent work
amazhot.eth11,668,000 $MCLUB555,555.55 $MCLUB
0xf0ad…64d28,332,000 $MCLUB555,555.55 $MCLUB
0x8daa…269c0 $MCLUB555,555.55 $MCLUB
0x8d11…91620 $MCLUB555,555.55 $MCLUB
senzer.eth0 $MCLUB555,555.55 $MCLUB
139 more wallets
0x8b0a…98000 $MCLUB555,555.55 $MCLUB
0x88b9…977b0 $MCLUB555,555.55 $MCLUB
0x887b…a88c0 $MCLUB555,555.55 $MCLUB
0x87aa…dbc80 $MCLUB555,555.55 $MCLUB
0x8655…56090 $MCLUB555,555.55 $MCLUB
0x8609…a0490 $MCLUB555,555.55 $MCLUB
0x845f…100e0 $MCLUB555,555.55 $MCLUB
0x83a7…3c880 $MCLUB555,555.55 $MCLUB
0x8302…41b00 $MCLUB555,555.55 $MCLUB
0x8249…f0c80 $MCLUB555,555.55 $MCLUB
0x7c6c…db5a0 $MCLUB555,555.55 $MCLUB
0x7c67…10d20 $MCLUB555,555.55 $MCLUB
0x7b6d…74940 $MCLUB555,555.55 $MCLUB
0x799f…c08e0 $MCLUB555,555.55 $MCLUB
0x7756…61be0 $MCLUB555,555.55 $MCLUB
0x7637…e67f0 $MCLUB555,555.55 $MCLUB
0x75c2…90820 $MCLUB555,555.55 $MCLUB
0x7381…f3350 $MCLUB555,555.55 $MCLUB
0x7147…67520 $MCLUB555,555.55 $MCLUB
0x710f…77330 $MCLUB555,555.55 $MCLUB
0x6ee7…105a0 $MCLUB555,555.55 $MCLUB
0x6e6c…82090 $MCLUB555,555.55 $MCLUB
0x6e6b…52260 $MCLUB555,555.55 $MCLUB
0x6d2f…be9e0 $MCLUB555,555.55 $MCLUB
0x6ba9…742a0 $MCLUB555,555.55 $MCLUB
0x6b41…3dec0 $MCLUB555,555.55 $MCLUB
0x65fb…8f930 $MCLUB555,555.55 $MCLUB
0x64da…29b10 $MCLUB555,555.55 $MCLUB
0x6262…36e30 $MCLUB555,555.55 $MCLUB
0x622d…701d0 $MCLUB555,555.55 $MCLUB
0x620a…abcb0 $MCLUB555,555.55 $MCLUB
0x5b92…2a740 $MCLUB555,555.55 $MCLUB
0x5a46…f8470 $MCLUB555,555.55 $MCLUB
0x5869…d5330 $MCLUB555,555.55 $MCLUB
0x5463…ef380 $MCLUB555,555.55 $MCLUB
0x5021…8c3d0 $MCLUB555,555.55 $MCLUB
0x500e…4deb0 $MCLUB555,555.55 $MCLUB
0x4eab…52b30 $MCLUB555,555.55 $MCLUB
0x4d2b…982f0 $MCLUB555,555.55 $MCLUB
0x48e4…6ec90 $MCLUB555,555.55 $MCLUB
0x433c…7d580 $MCLUB555,555.55 $MCLUB
0x3d48…35fa0 $MCLUB555,555.55 $MCLUB
0x3a94…2ee40 $MCLUB555,555.55 $MCLUB
0x3929…9eae0 $MCLUB555,555.55 $MCLUB
0x38b0…0d270 $MCLUB555,555.55 $MCLUB
0x3876…2ade0 $MCLUB555,555.55 $MCLUB
0x30e3…d0aa0 $MCLUB555,555.55 $MCLUB
0x2c10…da050 $MCLUB555,555.55 $MCLUB
0x2a89…7dca0 $MCLUB555,555.55 $MCLUB
0x280c…de080 $MCLUB555,555.55 $MCLUB
0x27d7…7e190 $MCLUB555,555.55 $MCLUB
0x2613…02410 $MCLUB555,555.55 $MCLUB
0x23f9…bdf10 $MCLUB555,555.55 $MCLUB
0x1f91…f2040 $MCLUB555,555.55 $MCLUB
0x1edf…d10d0 $MCLUB555,555.55 $MCLUB
0x1c29…b0780 $MCLUB555,555.55 $MCLUB
0x14c8…33810 $MCLUB555,555.55 $MCLUB
0x1331…4e370 $MCLUB555,555.55 $MCLUB
0x1307…4bad0 $MCLUB555,555.55 $MCLUB
0x0df7…5bc10 $MCLUB555,555.55 $MCLUB
0x0d74…841c0 $MCLUB555,555.55 $MCLUB
0x0cae…be730 $MCLUB555,555.55 $MCLUB
0x0c36…65260 $MCLUB555,555.55 $MCLUB
0x0b51…c3420 $MCLUB555,555.55 $MCLUB
0x0ace…47820 $MCLUB555,555.55 $MCLUB
0x0abe…64e50 $MCLUB555,555.55 $MCLUB
0x0a5b…ba240 $MCLUB555,555.55 $MCLUB
0x09dd…be6c0 $MCLUB555,555.55 $MCLUB
0x097d…1cd50 $MCLUB555,555.55 $MCLUB
0x08b7…8e830 $MCLUB555,555.55 $MCLUB
0x0646…c3fc0 $MCLUB555,555.55 $MCLUB
0x047f…54b70 $MCLUB555,555.55 $MCLUB
0x0146…65580 $MCLUB555,555.55 $MCLUB
0x0068…ca760 $MCLUB555,555.55 $MCLUB
0x0055…25e40 $MCLUB555,555.55 $MCLUB
0x0037…39910 $MCLUB555,555.55 $MCLUB
0xffa3…1b0a0 $MCLUB555,555.55 $MCLUB
0xfe34…b1c10 $MCLUB555,555.55 $MCLUB
0xfe20…2dee0 $MCLUB555,555.55 $MCLUB
0xfb03…4c190 $MCLUB555,555.55 $MCLUB
0xf8ac…424d0 $MCLUB555,555.55 $MCLUB
0xf807…c4550 $MCLUB555,555.55 $MCLUB
0xf40a…95400 $MCLUB555,555.55 $MCLUB
0xf236…11490 $MCLUB555,555.55 $MCLUB
0xef1e…f99b0 $MCLUB555,555.55 $MCLUB
0xeed8…6cf20 $MCLUB555,555.55 $MCLUB
0xeace…4a490 $MCLUB555,555.55 $MCLUB
0xe81d…30250 $MCLUB555,555.55 $MCLUB
0xe6c4…9b890 $MCLUB555,555.55 $MCLUB
0xe6b9…51de0 $MCLUB555,555.55 $MCLUB
0xe643…62440 $MCLUB555,555.55 $MCLUB
0xe5b1…4f2a0 $MCLUB555,555.55 $MCLUB
0xe085…4f7e0 $MCLUB555,555.55 $MCLUB
0xdf90…9ae50 $MCLUB555,555.55 $MCLUB
0xddb9…a4d40 $MCLUB555,555.55 $MCLUB
0xd9cd…c1b50 $MCLUB555,555.55 $MCLUB
0xd58d…51050 $MCLUB555,555.55 $MCLUB
0xd470…0ab40 $MCLUB555,555.55 $MCLUB
0xd2f7…422d0 $MCLUB555,555.55 $MCLUB
0xcf5f…97540 $MCLUB555,555.55 $MCLUB
0xcefd…bd650 $MCLUB555,555.55 $MCLUB
0xce92…93190 $MCLUB555,555.55 $MCLUB
0xcd5a…2c2f0 $MCLUB555,555.55 $MCLUB
0xcc24…4bd40 $MCLUB555,555.55 $MCLUB
0xcaa1…be5c0 $MCLUB555,555.55 $MCLUB
0xc81c…63b00 $MCLUB555,555.55 $MCLUB
0xc657…08080 $MCLUB555,555.55 $MCLUB
0xc60c…ebda0 $MCLUB555,555.55 $MCLUB
0xc0a6…c9a00 $MCLUB555,555.55 $MCLUB
0xbe11…97a90 $MCLUB555,555.55 $MCLUB
0xbd9c…42b80 $MCLUB555,555.55 $MCLUB
0xbc7a…85460 $MCLUB555,555.55 $MCLUB
0xbba9…dbe80 $MCLUB555,555.55 $MCLUB
0xbb22…e4750 $MCLUB555,555.55 $MCLUB
0xba5b…75150 $MCLUB555,555.55 $MCLUB
0xba4f…7d250 $MCLUB555,555.55 $MCLUB
0xb579…51cc0 $MCLUB555,555.55 $MCLUB
0xb376…43290 $MCLUB555,555.55 $MCLUB
0xb1a9…28050 $MCLUB555,555.55 $MCLUB
0xb106…81040 $MCLUB555,555.55 $MCLUB
0xaf3c…70f90 $MCLUB555,555.55 $MCLUB
0xadd0…06740 $MCLUB555,555.55 $MCLUB
0xabe0…98b10 $MCLUB555,555.55 $MCLUB
0xaa90…40be0 $MCLUB555,555.55 $MCLUB
0xaa05…e57a0 $MCLUB555,555.55 $MCLUB
0xa9ce…aeac0 $MCLUB555,555.55 $MCLUB
0xa8c4…d0ee0 $MCLUB555,555.55 $MCLUB
0xa67a…9c120 $MCLUB555,555.55 $MCLUB
0xa4ad…57170 $MCLUB555,555.55 $MCLUB
0xa3db…569c0 $MCLUB555,555.55 $MCLUB
0xa3c2…a5a00 $MCLUB555,555.55 $MCLUB
0xa227…4a820 $MCLUB555,555.55 $MCLUB
0xa1e8…51890 $MCLUB555,555.55 $MCLUB
0xa0ae…c7ef0 $MCLUB555,555.55 $MCLUB
0xa08e…401b0 $MCLUB555,555.55 $MCLUB
0x9fef…95eb0 $MCLUB555,555.55 $MCLUB
0x99d0…28d30 $MCLUB555,555.55 $MCLUB
0x939c…73b70 $MCLUB555,555.55 $MCLUB
0x9108…36ce0 $MCLUB555,555.55 $MCLUB
pool
Uniswap v4: MCLUB/ETH · 0.3% fee

Published · Contracts

app
MembershipBadge 0xfe5347a161c948fb9ae2b45477a1a3e506175933
distributor
MerkleDistributor 0x8390bc75001a677fc036d7430d61b64a6d5777ce

Work

  1. contracts built
    #1299Contracts386 files changed
    writes to
    src/**test/**script/**lib/**foundry.tomlremappings.txt.gitignoreREADME.mddocs/abi/**docs/contracts.md
    submissionaf55e7490be8658c20eed13d22b2d52af20ecf70f0aa216160ae29da4c97c1b3
    device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundle29bd7f079b52dd235748eb6dbf0bf42b636c0f9573eb3cab6507192f19c2eeac · 480 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 386 files
    .gitignoreREADME.mddocs/abi/MembershipBadge.jsondocs/abi/MembershipToken.jsondocs/contracts.mdfoundry.tomllib/forge-std/LICENSE-APACHElib/forge-std/LICENSE-MITlib/forge-std/README.mdlib/forge-std/foundry.tomllib/forge-std/package.jsonlib/forge-std/src/Base.sollib/forge-std/src/Config.sollib/forge-std/src/LibVariable.sollib/forge-std/src/Script.sollib/forge-std/src/StdAssertions.sollib/forge-std/src/StdChains.sollib/forge-std/src/StdCheats.sollib/forge-std/src/StdConfig.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/README.mdlib/openzeppelin-contracts/contracts/access/AccessControl.sollib/openzeppelin-contracts/contracts/access/IAccessControl.sollib/openzeppelin-contracts/contracts/access/Ownable.sollib/openzeppelin-contracts/contracts/access/Ownable2Step.sollib/openzeppelin-contracts/contracts/access/README.adoclib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sollib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sollib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sollib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sollib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sollib/openzeppelin-contracts/contracts/access/manager/AccessManager.sollib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sollib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sollib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sollib/openzeppelin-contracts/contracts/access/manager/IAuthority.sollib/openzeppelin-contracts/contracts/account/Account.sollib/openzeppelin-contracts/contracts/account/README.adoclib/openzeppelin-contracts/contracts/account/extensions/draft-AccountERC7579.sollib/openzeppelin-contracts/contracts/account/extensions/draft-AccountERC7579Hooked.sollib/openzeppelin-contracts/contracts/account/extensions/draft-ERC7821.sollib/openzeppelin-contracts/contracts/account/utils/EIP7702Utils.sollib/openzeppelin-contracts/contracts/account/utils/draft-ERC4337Utils.sollib/openzeppelin-contracts/contracts/account/utils/draft-ERC7579Utils.sollib/openzeppelin-contracts/contracts/finance/README.adoclib/openzeppelin-contracts/contracts/finance/VestingWallet.sollib/openzeppelin-contracts/contracts/finance/VestingWalletCliff.sollib/openzeppelin-contracts/contracts/governance/Governor.sollib/openzeppelin-contracts/contracts/governance/IGovernor.sollib/openzeppelin-contracts/contracts/governance/README.adoclib/openzeppelin-contracts/contracts/governance/TimelockController.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingFractional.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingOverridable.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorNoncesKeyed.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorProposalGuardian.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorSequentialProposalId.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorSuperQuorum.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sollib/openzeppelin-contracts/contracts/governance/utils/IVotes.sollib/openzeppelin-contracts/contracts/governance/utils/Votes.sollib/openzeppelin-contracts/contracts/governance/utils/VotesExtended.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC1271.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sollib/openzeppelin-contracts/contracts/interfaces/IERC165.sollib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sollib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sollib/openzeppelin-contracts/contracts/interfaces/IERC1967.sollib/openzeppelin-contracts/contracts/interfaces/IERC20.sollib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sollib/openzeppelin-contracts/contracts/interfaces/IERC2309.sollib/openzeppelin-contracts/contracts/interfaces/IERC2612.sollib/openzeppelin-contracts/contracts/interfaces/IERC2981.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sollib/openzeppelin-contracts/contracts/interfaces/IERC4626.sollib/openzeppelin-contracts/contracts/interfaces/IERC4906.sollib/openzeppelin-contracts/contracts/interfaces/IERC5267.sollib/openzeppelin-contracts/contracts/interfaces/IERC5313.sollib/openzeppelin-contracts/contracts/interfaces/IERC5805.sollib/openzeppelin-contracts/contracts/interfaces/IERC6372.sollib/openzeppelin-contracts/contracts/interfaces/IERC721.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC777.sollib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sollib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sollib/openzeppelin-contracts/contracts/interfaces/IERC7913.sollib/openzeppelin-contracts/contracts/interfaces/README.adoclib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC4337.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC6909.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC7579.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC7674.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC7802.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC7821.sollib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sollib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sollib/openzeppelin-contracts/contracts/metatx/README.adoclib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sollib/openzeppelin-contracts/contracts/mocks/AccessManagerMock.sollib/openzeppelin-contracts/contracts/mocks/ArraysMock.sollib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sollib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sollib/openzeppelin-contracts/contracts/mocks/BatchCaller.sollib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/ConstructorMock.sollib/openzeppelin-contracts/contracts/mocks/ContextMock.sollib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sollib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sollib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sollib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sollib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sollib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/InitializableMock.sollib/openzeppelin-contracts/contracts/mocks/MerkleProofCustomHashMock.sollib/openzeppelin-contracts/contracts/mocks/MerkleTreeMock.sollib/openzeppelin-contracts/contracts/mocks/MulticallHelper.sollib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sollib/openzeppelin-contracts/contracts/mocks/PausableMock.sollib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sollib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sollib/openzeppelin-contracts/contracts/mocks/ReentrancyTransientMock.sollib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sollib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sollib/openzeppelin-contracts/contracts/mocks/Stateless.sollib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sollib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sollib/openzeppelin-contracts/contracts/mocks/TransientSlotMock.sollib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sollib/openzeppelin-contracts/contracts/mocks/VotesExtendedMock.sollib/openzeppelin-contracts/contracts/mocks/VotesMock.sollib/openzeppelin-contracts/contracts/mocks/account/AccountMock.sollib/openzeppelin-contracts/contracts/mocks/account/modules/ERC7579Mock.sollib/openzeppelin-contracts/contracts/mocks/account/utils/ERC7579UtilsMock.sollib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sollib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sollib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sollib/openzeppelin-contracts/contracts/mocks/docs/MyNFT.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintBase.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintMissing.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintOnlyRole.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlModified.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessManagedERC20MintBase.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/MyContractOwnable.sollib/openzeppelin-contracts/contracts/mocks/docs/account/MyAccountERC7702.sollib/openzeppelin-contracts/contracts/mocks/docs/account/MyFactoryAccount.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sollib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/GameItems.sollib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/MyERC115HolderContract.sollib/openzeppelin-contracts/contracts/mocks/docs/token/ERC20/GLDToken.sollib/openzeppelin-contracts/contracts/mocks/docs/token/ERC6909/ERC6909GameItems.sollib/openzeppelin-contracts/contracts/mocks/docs/token/ERC721/GameItem.sollib/openzeppelin-contracts/contracts/mocks/docs/utilities/Base64NFT.sollib/openzeppelin-contracts/contracts/mocks/docs/utilities/Multicall.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorCountingOverridableMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorFractionalMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorNoncesKeyedMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorProposalGuardianMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorSequentialProposalIdMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorSuperQuorumMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorVotesSuperQuorumFractionMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sollib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sollib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sollib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1363ForceApproveMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1363NoReturnMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReturnFalseMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1363SpenderMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20BridgeableMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20GetterHelper.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesAdditionalCheckpointsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesTimestampMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sollib/openzeppelin-contracts/contracts/mocks/utils/cryptography/ERC7739Mock.sollib/openzeppelin-contracts/contracts/package.jsonlib/openzeppelin-contracts/contracts/proxy/Clones.sollib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sollib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sollib/openzeppelin-contracts/contracts/proxy/Proxy.sollib/openzeppelin-contracts/contracts/proxy/README.adoclib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sollib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sollib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sollib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sollib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sollib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sollib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sollib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sollib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sollib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sollib/openzeppelin-contracts/contracts/token/ERC1155/README.adoclib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sollib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sollib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Utils.sollib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sollib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sollib/openzeppelin-contracts/contracts/token/ERC20/README.adoclib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC1363.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20Bridgeable.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20TemporaryApproval.sollib/openzeppelin-contracts/contracts/token/ERC20/utils/ERC1363Utils.sollib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sollib/openzeppelin-contracts/contracts/token/ERC6909/README.adoclib/openzeppelin-contracts/contracts/token/ERC6909/draft-ERC6909.sollib/openzeppelin-contracts/contracts/token/ERC6909/extensions/draft-ERC6909ContentURI.sollib/openzeppelin-contracts/contracts/token/ERC6909/extensions/draft-ERC6909Metadata.sollib/openzeppelin-contracts/contracts/token/ERC6909/extensions/draft-ERC6909TokenSupply.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/README.adoclib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sollib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sollib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sollib/openzeppelin-contracts/contracts/token/common/ERC2981.sollib/openzeppelin-contracts/contracts/token/common/README.adoclib/openzeppelin-contracts/contracts/utils/Address.sollib/openzeppelin-contracts/contracts/utils/Arrays.sollib/openzeppelin-contracts/contracts/utils/Base64.sollib/openzeppelin-contracts/contracts/utils/Blockhash.sollib/openzeppelin-contracts/contracts/utils/Bytes.sollib/openzeppelin-contracts/contracts/utils/CAIP10.sollib/openzeppelin-contracts/contracts/utils/CAIP2.sollib/openzeppelin-contracts/contracts/utils/Calldata.sollib/openzeppelin-contracts/contracts/utils/Comparators.sollib/openzeppelin-contracts/contracts/utils/Context.sollib/openzeppelin-contracts/contracts/utils/Create2.sollib/openzeppelin-contracts/contracts/utils/Errors.sollib/openzeppelin-contracts/contracts/utils/Multicall.sollib/openzeppelin-contracts/contracts/utils/Nonces.sollib/openzeppelin-contracts/contracts/utils/NoncesKeyed.sollib/openzeppelin-contracts/contracts/utils/Packing.sollib/openzeppelin-contracts/contracts/utils/Panic.sollib/openzeppelin-contracts/contracts/utils/Pausable.sollib/openzeppelin-contracts/contracts/utils/README.adoclib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sollib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sollib/openzeppelin-contracts/contracts/utils/ShortStrings.sollib/openzeppelin-contracts/contracts/utils/SlotDerivation.sollib/openzeppelin-contracts/contracts/utils/StorageSlot.sollib/openzeppelin-contracts/contracts/utils/Strings.sollib/openzeppelin-contracts/contracts/utils/TransientSlot.sollib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sollib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sollib/openzeppelin-contracts/contracts/utils/cryptography/Hashes.sollib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sollib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sollib/openzeppelin-contracts/contracts/utils/cryptography/P256.sollib/openzeppelin-contracts/contracts/utils/cryptography/README.adoclib/openzeppelin-contracts/contracts/utils/cryptography/RSA.sollib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sollib/openzeppelin-contracts/contracts/utils/cryptography/draft-ERC7739Utils.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/AbstractSigner.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/MultiSignerERC7913.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerECDSA.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerERC7702.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerERC7913.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerP256.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/SignerRSA.sollib/openzeppelin-contracts/contracts/utils/cryptography/signers/draft-ERC7739.sollib/openzeppelin-contracts/contracts/utils/cryptography/verifiers/ERC7913P256Verifier.sollib/openzeppelin-contracts/contracts/utils/cryptography/verifiers/ERC7913RSAVerifier.sollib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sollib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sollib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sollib/openzeppelin-contracts/contracts/utils/math/Math.sollib/openzeppelin-contracts/contracts/utils/math/SafeCast.sollib/openzeppelin-contracts/contracts/utils/math/SignedMath.sollib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sollib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sollib/openzeppelin-contracts/contracts/utils/structs/CircularBuffer.sollib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sollib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sollib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sollib/openzeppelin-contracts/contracts/utils/structs/Heap.sollib/openzeppelin-contracts/contracts/utils/structs/MerkleTree.sollib/openzeppelin-contracts/contracts/utils/types/Time.sollib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sollib/openzeppelin-contracts/contracts/vendor/compound/LICENSElib/openzeppelin-contracts/package.jsonlib/openzeppelin-contracts/remappings.txtremappings.txtsrc/MembershipBadge.solsrc/MembershipToken.soltest/MembershipBadge.t.soltest/MembershipToken.t.sol
  2. contracts integrated
    #1299Manifest1 file changed
    afterContracts
    writes to
    launch.json
    submission89c3ffbce07f530e61b7b057e548482b8f247d1d9fea875b30dfe41bf59c62d0
    device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95
    started from9fda9bce646919e45635a9278db2ff0f92b1bdc9
    bundled8b3e346496f4b8c0d4dafd20a90b3cd95fff50d27a21d825e647d2509af0aaf · 482 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied on29bd7f079b52dd235748eb6dbf0bf42b636c0f9573eb3cab6507192f19c2eeac
    changed · 1 file
    launch.json
  3. contracts reviewed
    #1548Review1 finding · 1 low
    afterContracts, Manifest
    submission26a2998ba99c0bbcd80ed5a9d79246d98d0a3386616ea6354517ac4d9d007aff
    device35c52a5b502e847cda633d436a25cd57d809a4ea7935560acc2b18eccfd592ac
    started fromfaa4cfd10ab8db84717874e764aa94baeca35d50
    bundlenone
    applied on29bd7f079b52dd235748eb6dbf0bf42b636c0f9573eb3cab6507192f19c2eeac, d8b3e346496f4b8c0d4dafd20a90b3cd95fff50d27a21d825e647d2509af0aaf
    changed · 0 filesnothing
    • lowTransfer error documentation incorrectly promises Soulbound for every inputdocs/contracts.md:73

      Non-blocking documentation defect: docs/contracts.md lines 43, 73 and 120, and launch.json notes at line 21, claim all badge transfers revert with Soulbound(). Inherited ERC721.transferFrom rejects a zero recipient with ERC721InvalidReceiver before reaching MembershipBadge._update; an unminted ID reaches ERC721._checkAuthorized and reverts with ERC721NonexistentToken. Both safeTransferFrom overloads inherit these cases.

      Transfers remain blocked, and the exported ABI correctly includes these errors. Correct the documentation and manifest notes to distinguish the general revert guarantee from the particular error. Existing test_transferFromReverts, test_safeTransferFromReverts and test_safeTransferFromWithDataReverts cover minted IDs with nonzero recipients. test_transferOfNonexistentTokenStillReverts only expects an unspecified revert.

      Missing coverage: exact errors for zero-recipient transfers and nonexistent-token transfers, including both safeTransferFrom overloads.

      Deploy MembershipToken and MembershipBadge(address(token), 100000000000000000000).

      Transfer 100000000000000000000 token units to Alice, then have Alice call badge.mint(), producing ID 1.

      As Alice, call badge.transferFrom(Alice, address(0), 1): documented expectation is Soulbound(), but actual revert is ERC721InvalidReceiver(address(0)), selector 0x64a0ae92.

      Calling either safeTransferFrom overload with the same addresses and ID gives the same error.

      With ID 42 still unminted, Alice calling badge.transferFrom(address(0), Alice, 42) instead reverts with ERC721NonexistentToken(42), selector 0x7e273289, rather than Soulbound().

      Confirmed by execution of solc 0.8.26 bytecode in local eth_call simulations on chainId 11155111.

      All calls revert without changing ownership or totalMinted.

  4. contracts publishedidentity-md-launches/launch-145-workflow-contract-stage-context
  5. deployed
    3 contractson Sepoliatransaction
    rebuilt
    MembershipBadge, MembershipToken · 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-145-workflow-contract-stage-context
    commit
    faa4cfd10ab8db84717874e764aa94baeca35d50
    attestation
    2182e2d21834863d42df3048c53aedf7c37b847d1466f9936811bfc13e0c8e09
    manifest
    41c1e32400de3fdf0a829da061c6fa256ec8ac3da9796d31da8250d241ef57cd
    allocations
    0x23db2ce1da575efad26025d8808853747b868e14636828afdc6f30608e8f12a4
    constructor
    MembershipBadge: $token, 100000000000000000000
    tree
    708706ed6d4bb0f12aecb3898dc1838156a7a753
    compiler
    solc 0.8.26, optimizer 200 runs, reproducible
    contract
    MembershipBadge
    src/MembershipBadge.sol · 5371 bytes
    creation e060efc71a1cc1301d0b5a70493e15432ab3e1fdadfb91b9f82b662f846e5223
    abi 6443ecb04ecff4d335e67af97d4a33b90c4096e9275850d66a3e4b833ddba48f
    metadata 933cbf708ee09af4abfd2f61ace5a9e237a4529f1755604eecd2d9570ff960a4
    onchain at 0xfe53…5933, block 11,777,038 · creation code matches
    contract
    MembershipToken
    src/MembershipToken.sol · 2647 bytes
    creation a13ab528f896c98f67cfdab9ed80cbd43d53e7ab1825e2c0b0ade7baa073262d
    abi f36d2fe28b62f817a4fba0b78bb501b41895eada3982280273c063ad8183f577
    metadata 41ed380b3cecc0e341eaf007f5b505578af7c5c46885874fb3a63c19b57d29c0
    onchain at 0x68da…6bcc, block 11,777,038 · creation code matches
    contract
    MerkleDistributor deployed by the factory, not rebuilt
    creation d90dadda71ddde9d5d4e6a5a7ffe3023df09b73d05ced387203f5e8cefbdf8d5
    onchain at 0x8390…77ce, block 11,777,038
  6. website built
    #1299Frontend54 files changed
    writes to
    web/**web/.gitignoredist/**docs/web/**
    submissione69dca754b3f4082a10d9bd53ece4e50ab3f3592cc70d061fe4c780533041e81
    device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95
    started fromfaa4cfd10ab8db84717874e764aa94baeca35d50
    bundle2b183701a8b9f76492b17473a97df970015872da4ed39e3eec90eae86b931af2 · 275 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 54 files
    dist/abi/MembershipBadge.jsondist/abi/MembershipToken.jsondist/assets/index-BgL6gghP.jsdist/assets/index-DPBZwFPu.cssdist/assets/react-DPIr46qh.jsdist/assets/viem-BhVrvYqH.jsdist/favicon.svgdist/imd-deployment.jsondist/index.htmlweb/.gitignoreweb/e2e/mock-rpc.mjsweb/e2e/run.mjsweb/handoff/deployment.jsonweb/handoff/network.jsonweb/index.htmlweb/package-lock.jsonweb/package.jsonweb/public/favicon.svgweb/scripts/make-manifest.mjsweb/src/App.test.tsxweb/src/App.tsxweb/src/badge.test.tsweb/src/badge.tsweb/src/clients.tsweb/src/components/ActivityLog.tsxweb/src/components/ContractsPanel.tsxweb/src/components/MemberList.test.tsxweb/src/components/MemberList.tsxweb/src/components/MembershipPanel.test.tsxweb/src/components/MembershipPanel.tsxweb/src/components/SwapPanel.tsxweb/src/components/WalletPanel.test.tsxweb/src/components/WalletPanel.tsxweb/src/components/ui.tsxweb/src/config.tsweb/src/deployment.test.tsweb/src/deployment.tsweb/src/errors.tsweb/src/format.tsweb/src/hooks/useDeployment.tsweb/src/hooks/useWallet.tsweb/src/log.tsweb/src/main.tsxweb/src/styles.cssweb/src/test/fixtures.tsweb/src/test/setup.tsweb/src/uniswap/abi.tsweb/src/uniswap/swap.test.tsweb/src/uniswap/swap.tsweb/src/wallet.test.tsweb/src/wallet.tsweb/tsconfig.jsonweb/tsconfig.node.jsonweb/vite.config.ts
  7. website publishedidentity-md-launches/launch-146-workflow-frontend-stage-context
  8. hostedmclub.site.identitymd.ethnaming transaction
  9. checkedwaiting for hosting5 attempts
    • deployment-config
    • static-assets
    • html-assets
    • named-entrypoint