Release Checkin (ERC-20 symbol CHKN) on Sepolia as an evm_project: the fixed-supply launch token plus one application contract. Token: Checkin (CHKN), total supply 1,000,000,000 CHKN with 18 decimals, minted once to the deployer. Application contract: EventCheckin, which records soulbound event attendance authorised by EIP-712 signatures and pays optional CHKN attendance rewards. EventCheckin's constructor takes one argument, the CHKN address (constructorArgs ["$token"]); it stores it immutable, exposes it as token() and holds no CHKN at deploy. CHKN comes in only through fundEvent (approve + SafeERC20.safeTransferFrom) and leaves only through withdraw() to the caller (pull, checks-effects-interactions, nonReentrant). No payable function, no receive/fallback, no owner, admin, pause or upgrade path. A Sepolia test toy: attendance records are not tickets or credentials, and the README and the page say so. The EIP-712 domain name "EventCheckin" and version "1" are string literals passed to OpenZeppelin's EIP712 base constructor in source, not constructor arguments. createEvent(bytes32 title, uint64 endsAt, uint256 rewardPerCheckIn): endsAt after block.timestamp and at most 365 days ahead; rewardPerCheckIn is in CHKN base units (18 decimals) and may be 0; the caller becomes that event's organiser; ids from 1. fundEvent(eventId, amount): anyone, amount > 0, while the event is open, adds CHKN to that event's reward pool. closeEvent(eventId): organiser only, irreversible. checkIn(eventId, attendee, deadline, signature): callable by anyone (so a friend or relayer can submit), requires the event open (not closed and block.timestamp <= endsAt), block.timestamp <= deadline, attendee not yet checked in to that event, and a valid signature by the event's organiser over the EIP-712 struct CheckIn(uint256 eventId,address attendee,uint256 deadline) in domain {name "EventCheckin", version "1", chainId, verifyingContract}. It records the attendance and, if the pool holds at least rewardPerCheckIn, moves rewardPerCheckIn from the pool to the attendee's withdrawable balance; with a smaller pool the check-in is still recorded, unrewarded. reclaim(eventId): organiser only, once the event is closed or past endsAt; moves the unspent pool to the organiser's withdrawable balance. Verify signatures with OpenZeppelin SignatureChecker so both EOA organisers (ECDSA, high-s rejected) and ERC-1271 contract-wallet organisers work. Attendance is a non-transferable record, not a token; the attendee, not msg.sender, is credited and rewarded. A signature is single-use per (event, attendee); an organiser cannot revoke a signed pass except by closing the event or letting deadline/endsAt pass. Funders trust the organiser, who decides whom to sign for (README says so). Views: eventCount(), eventInfo(id) (organiser, title, endsAt, closed, rewardPerCheckIn, pool, attendeeCount), attended(eventId, attendee), attendanceCount(attendee), withdrawable(account), CHECKIN_TYPEHASH, domainSeparator(), token(). Events: EventCreated, EventFunded, EventClosed, CheckedIn(eventId, attendee, submitter, reward), Reclaimed, Withdrawn. Tests (Foundry) must show: valid EOA signature; wrong signer; signature for another event, attendee or chain id; expired deadline; after close and after endsAt; double check-in; a relayed submission credits and rewards the attendee; a check-in with a short pool recorded without reward; reclaim before close or endsAt refused and reclaim twice paying once; a mock ERC-1271 organiser accepted and a rejecting one refused; and the invariant that CHKN held == sum of event pools + withdrawable balances. The independent adversarial review must attack: typehash/domain mismatch with the website's typed data, signature malleability and replay, ERC-1271 griefing, organiser impersonation, and pool accounting across events (paying one event's reward from another's pool, reclaim racing a check-in). Deploy through the project factory, then publish a one-page website with an organiser view (create, fund, close and reclaim events; enter an attendee address and sign a pass with eth_signTypedData_v4 from the connected wallet, shown as copyable text and a link carrying eventId, attendee, deadline and signature) and an attendee view (open the link or paste the pass, submit check-in, withdraw rewards), plus each event's attendee list from CheckedIn events. ERC-1271 organisers are covered by the Foundry tests; the page signs with the connected EOA. The page reads the CHKN address from EventCheckin.token(), shows the connected wallet's CHKN balance, allowance and withdrawable balance, has an Approve step before funding, and says CHKN comes from swapping Sepolia ETH in the launch pool (no in-page swap). Lists come from contract views and events only (no backend, no indexer; log queries are chunked from the deployment block). Keep it to one small page; the static export has index.html in dist/.