{"id":"0fff1998-fbcc-4169-90a6-5a7d854b0715","objective":"Build Pacts, a social guild strategy game on Sepolia played with its own token, Pact ($PACT), launch it, publish the source on GitHub and host its website on IPFS. Guilds hold tiles on a shared 12x12 map, attack each other in the open, vote on moves, and sign pacts backed by token bonds that are slashed to the victim if a guild betrays a partner. Seasons pay the top guilds and mint trophy NFTs.","status":"completed","waitingForHosting":false,"failure":null,"chainId":11155111,"createdAt":"2026-09-29T02:13:19.324Z","updatedAt":"2026-09-29T19:47:47.763Z","contracts":{"id":"3fa23364-90be-48d5-896c-31045d0c35bd","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-444-workflow-contract-stage-context","commit":"eeee3c75fa33e038c1605d0b1a79ad1272434c78"},"frontend":{"id":"06dfbcec-4a2a-4dea-87e3-d15ab594fb9c","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-447-workflow-frontend-stage-context","commit":"5d49240174bb20a0aff40689790b808f3017214c"},"frontendPlan":{"skill":"frontend-for-contract","objective":"Build Pacts, a social guild strategy game on Sepolia played with its own token, Pact ($PACT), launch it, publish the source on GitHub and host its website on IPFS. Guilds hold tiles on a shared 12x12 map, attack each other in the open, vote on moves, and sign pacts backed by token bonds that are slashed to the victim if a guild betrays a partner. Seasons pay the top guilds and mint trophy NFTs.","acceptanceCriteria":[]},"launch":{"id":"964a1cdf-8b2b-46b7-a327-6e5ef3e7625b","status":"live"},"validation":{"status":"passed","attempts":59,"startedAt":"2026-09-29T05:52:05.165Z","deadlineAt":"2026-09-30T05:52:05.165Z","nextAttemptAt":null,"report":{"scope":"Read-only HTTP checks of the named and immutable entrypoints, declared static asset hashes and HTML references, published deployment configuration and ABI hashes, and operator-RPC chain/code existence. Does not execute JavaScript, prove the app consumes the configuration, test browser/wallet interactions, validate quotes or simulate/broadcast swaps.","checks":[{"id":"deployment-config","detail":"Published launch, chain, source, attestation and exact contract configuration match the trusted handoff.","status":"passed"},{"id":"static-assets","detail":"All 12 declared assets are reachable and match their SHA-256 digests.","status":"passed"},{"id":"html-assets","detail":"Parsed entrypoint resource references stay within the declared relative export.","status":"passed"},{"id":"named-entrypoint","detail":"The named site's index is reachable and matches the immutable IPFS index byte for byte.","status":"passed"},{"id":"named-assets","detail":"The named site's HTML resources, deployment configuration and ABIs are reachable and match the immutable export.","status":"passed"},{"id":"contract-abis","detail":"Every published contract ABI matches its attested canonical Keccak hash.","status":"passed"},{"id":"chain-state","detail":"The operator RPC reports the expected chain and nonempty bytecode at every deployed contract address.","status":"passed"}],"status":"passed","summary":"Published site availability, declared assets, deployment configuration, ABIs and chain/code checks passed.","version":1,"checkedAt":"2026-09-29T19:47:42.702Z","retryable":false}},"brief":"# Approved workflow\n\nBuild Pacts, a social guild strategy game on Sepolia played with its own token, Pact ($PACT), launch it, publish the source on GitHub and host its website on IPFS. Guilds hold tiles on a shared 12x12 map, attack each other in the open, vote on moves, and sign pacts backed by token bonds that are slashed to the victim if a guild betrays a partner. Seasons pay the top guilds and mint trophy NFTs.\n\nThis is a test of the full contract-to-website workflow with a game complex enough to give the audit panel real work. No randomness and no hidden moves: every action is public and outcomes are deterministic. The game must have no admin powers: the $owner reference resolves to the network's deployer wallet, so nothing may depend on an owner acting after deployment. The launch token is named Pact with symbol PACT (not a generic launch name). The contracts receive no token allocation at launch, so every token the game pays out must come from what players paid in. GitHub publication, IPFS hosting and the Sepolia evm_project launch are authorized. A first run of this game (workflow 0c56259b) was audited; the rules below spell out what its audits found ambiguous.\n\nBuild Pacts, a public, deterministic guild strategy game played with the launch token ($token), which src/LaunchToken.sol names \"Pact\" with symbol \"PACT\", as five contracts with no admin functions. Realm: a 12x12 tile map; epoch length and season length are constructor arguments (1 hour and 7 days). Players buy troops with the token; a guild holding a tile earns a share of the epoch's income pool per tile, and income comes only from troop purchases and fees, never minted. Attacks are declared openly during an epoch with committed troops and all attacks on a tile resolve together at the epoch's end: the larger committed force takes the tile, ties keep the holder, and troops are lost in proportion. Anyone can settle an ended epoch. Guilds: anyone can found or join a guild; guild troops are pooled; attacks and pacts need a majority vote of members, votes are weighted one per member, and a majority can expel a member. Diplomacy: two guilds can sign a pact that each backs with a token bond for a set number of epochs; if a guild attacks a pact partner its bond is paid to the victim automatically; bonds return when the pact expires unbroken. Season: a fee on troop purchases fills a prize pool; after the season ends anyone can close it and the top three guilds by tiles held claim 50/30/20, split equally among their members. Banners: an ERC-721 that only Season mints, one banner to each member of a winning guild and one to any guild that finished a season without breaking a pact. Rules that must hold: spending a guild's pooled treasury (buying troops with it or paying it out) needs the same majority vote as attacks and pacts, never a single member; a vote counts only members who had joined before the proposal was created; proposals expire at the end of the epoch after the one they were created in, and an approved attack names the tile's holder when proposed and fails if the holder has changed; a pact needs a non-zero bond from each side and cannot be signed while an attack between the two guilds from an unsettled epoch is pending; season prizes and banners go only to members who had joined before the season ended, fixed at season end, so joining later earns nothing from that season. Wire contracts with $token and $contract:Name references and constructor arguments only; no post-deployment calls, no constructor ETH. Emit events for every action so a frontend can rebuild the map, guilds, pacts, betrayals and standings from logs. Test settlement with several attackers on one tile, votes, expulsion, pact bonds and betrayal slashing, season close and claims, and that no function can move player funds except the rules above. Then build a website: a live map coloured by guild, guild pages with members and pending votes, a diplomacy board with pacts, bonds and betrayals, an event feed, buy-troops and attack controls, season standings and banners.\n","handoff":{"chainId":11155111,"repoUrl":"https://github.com/identity-md-launches/launch-444-workflow-contract-stage-context","version":1,"launchId":"964a1cdf-8b2b-46b7-a327-6e5ef3e7625b","manifest":{"kind":"evm_project","pool":{"fee":3000,"tickSpacing":60,"initialPrice":"79228162514264337593543950336","pairedCurrency":"0x0000000000000000000000000000000000000000"},"notes":"Pacts on Sepolia uses Pact (PACT), a fixed-supply ERC-20 with no owner, mint, pause or fee switch. Deploy Guilds before Realm. Guilds(address token, uint256 epochLength) takes $token and 3600. Realm(address token, address guilds, uint256 epochLength, uint256 seasonLength, uint256 troopPrice, uint256 feeBps) takes $token, $contract:Guilds, 3600, 604800, 1000000000000000000 and 500; its constructor reverts unless Guilds was built with the same token and epoch length and unless seasonLength is a multiple of epochLength. Realm creates Diplomacy and Season in its constructor and Season creates Banners, whose sole minter is Season; each child records its creator as an immutable and trusts only that address. Discover the children through Realm.diplomacy(), Realm.season() and Season.banners(); they are not separate factory deployments and take no manifest entry. Epochs are 3600 seconds and seasons 604800 seconds (168 epochs); a troop costs 1000000000000000000 token units (1 PACT) and 500 basis points (5%) of each troop purchase funds the season prize pool. Troop price and fee are deployment choices matching the accepted defaults in script/Deploy.s.sol; the brief fixes only the epoch and season lengths. No contract has an owner argument, so $owner is unused; no initialization call or constructor ETH is required and the game contracts receive no token allocation. Every payout is funded by player payments: troop purchases, fees and pact bonds. The accepted revision added two constructor-independent rules the manifest does not configure: Guilds reads Realm.tile() when an Attack proposal is created and rejects it unless the named holder currently holds the tile, and a Pact proposal carries a minimum counter-bond in data3 that Diplomacy.sign enforces on the partner's bond. Permissionless maintenance calls: Realm.settle(), Realm.settleStep(maxAttacks) and Realm.settlePending(max) settle ended epochs, Season.close(season) fixes standings and prize shares at season end, Season.claim(season, guildId) and Season.mintPeaceBanner(season, guildId) pay prizes and mint banners to members who joined before the season ended, and Diplomacy.expire(pactId) returns bonds of an unbroken pact once its last epoch has passed. Membership is open by design, so a majority of newly joined wallets can direct a guild treasury and last-second joiners share season prizes; the README documents this as an accepted consequence of the approved rules. The pool pairs with native ETH and has no hook; initialPrice is decimal sqrtPriceX96 for a 1:1 opening price. A pinned policy specifying an opening market cap determines the effective opening price in the deployer. Policy and signed artifact linkage are supplied by services.","token":{"name":"Pact","symbol":"PACT","contract":"LaunchToken","decimals":18},"contracts":[{"contract":"Guilds","constructorArgs":["$token","3600"]},{"contract":"Realm","constructorArgs":["$token","$contract:Guilds","3600","604800","1000000000000000000","500"]}]},"contracts":[{"name":"LaunchToken","txHash":"0xc2e0715b963f566f9d21cf819c6505d567a93056a42e54449fd07d67a20f1512","abiHash":"369bae8794697d4536e43b3fc6e24a41f541fe8fec3505674c580bf67eb7010c","address":"0x7f88ad727adeb8fc70fd198f2d2319349846818c","blockNumber":11805514,"creationCodeHash":"dbe83e269c26504ba956b795b1efffc3859f84a1b7eb21801eb782d019f7aaa2"},{"name":"Guilds","txHash":"0xc2e0715b963f566f9d21cf819c6505d567a93056a42e54449fd07d67a20f1512","abiHash":"55e99357920c3633a3996f9072ed03e80037f8c40f7c905b2e711fdd43c845f7","address":"0x8cf40aadb31bad7b441f018d74c61191b96a2e42","blockNumber":11805514,"creationCodeHash":"dd1b9a8e032cc415a159c62ce3f7d980bafa7e8ffc73eed5f13e76da449866d4"},{"name":"Realm","txHash":"0xc2e0715b963f566f9d21cf819c6505d567a93056a42e54449fd07d67a20f1512","abiHash":"c9286d6c9356dc490d8677bad57830f54db3b2d4c58d2d5374947e379602d24b","address":"0x206bbcb9b91793decd1819e366334ab6dbbdc990","blockNumber":11805514,"creationCodeHash":"59676a12e0c9f2c7fc8d2e7822715bc41e5072c4a66b4d95c051776f515b253b"}],"sourceCommit":"eeee3c75fa33e038c1605d0b1a79ad1272434c78","abiInstructions":"Build ABIs from this exact source commit; compare canonicalKeccak(abi) with abiHash. Verify deployed code on the stated chain before enabling transactions.","attestationHash":"2e57e11276564d5e4704de3b7dee3b8ef3028905d669d2a7e8ef0da214a85991"},"site":{"status":"named","cid":"bafybeif7tmbyk4cnn57ueynnig2tzvto66b3svdqrbfvcxqz2wmdwj5htq","ensName":"pacts.site.identitymd.eth","failure":null}}